1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Tests MatHYPRE\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscmathypre.h> 5c4762a1bSJed Brown 6c4762a1bSJed Brown int main(int argc,char **args) 7c4762a1bSJed Brown { 8c4762a1bSJed Brown Mat A,B,C,D; 9c4762a1bSJed Brown Mat pAB,CD,CAB; 10c4762a1bSJed Brown hypre_ParCSRMatrix *parcsr; 11c4762a1bSJed Brown PetscReal err; 12c4762a1bSJed Brown PetscInt i,j,N = 6, M = 6; 13c4762a1bSJed Brown PetscErrorCode ierr; 14c4762a1bSJed Brown PetscBool flg,testptap = PETSC_TRUE,testmatmatmult = PETSC_TRUE; 15c4762a1bSJed Brown PetscReal norm; 16c4762a1bSJed Brown char file[256]; 17c4762a1bSJed Brown 18c4762a1bSJed Brown ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 19589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-f",file,sizeof(file),&flg);CHKERRQ(ierr); 20c4762a1bSJed Brown #if defined(PETSC_USE_COMPLEX) 21c4762a1bSJed Brown testptap = PETSC_FALSE; 22c4762a1bSJed Brown testmatmatmult = PETSC_FALSE; 23c4762a1bSJed Brown ierr = PetscOptionsInsertString(NULL,"-options_left 0");CHKERRQ(ierr); 24c4762a1bSJed Brown #endif 25c4762a1bSJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-ptap",&testptap,NULL);CHKERRQ(ierr); 26c4762a1bSJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-matmatmult",&testmatmatmult,NULL);CHKERRQ(ierr); 27c4762a1bSJed Brown ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 28c4762a1bSJed Brown if (!flg) { /* Create a matrix and test MatSetValues */ 29c4762a1bSJed Brown PetscMPIInt size; 30c4762a1bSJed Brown 31ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 32c4762a1bSJed Brown ierr = PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL);CHKERRQ(ierr); 33c4762a1bSJed Brown ierr = PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL);CHKERRQ(ierr); 34c4762a1bSJed Brown ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 35c4762a1bSJed Brown ierr = MatSetType(A,MATAIJ);CHKERRQ(ierr); 36c4762a1bSJed Brown ierr = MatSeqAIJSetPreallocation(A,9,NULL);CHKERRQ(ierr); 37c4762a1bSJed Brown ierr = MatMPIAIJSetPreallocation(A,9,NULL,9,NULL);CHKERRQ(ierr); 38c4762a1bSJed Brown ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr); 39c4762a1bSJed Brown ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 40c4762a1bSJed Brown ierr = MatSetType(B,MATHYPRE);CHKERRQ(ierr); 41c4762a1bSJed Brown if (M == N) { 42c4762a1bSJed Brown ierr = MatHYPRESetPreallocation(B,9,NULL,9,NULL);CHKERRQ(ierr); 43c4762a1bSJed Brown } else { 44c4762a1bSJed Brown ierr = MatHYPRESetPreallocation(B,6,NULL,6,NULL);CHKERRQ(ierr); 45c4762a1bSJed Brown } 46c4762a1bSJed Brown if (M == N) { 47c4762a1bSJed Brown for (i=0; i<M; i++) { 48c4762a1bSJed Brown PetscInt cols[] = {0,1,2,3,4,5}; 49c4762a1bSJed Brown PetscScalar vals[] = {0,1./size,2./size,3./size,4./size,5./size}; 50c4762a1bSJed Brown for (j=i-2; j<i+1; j++) { 51c4762a1bSJed Brown if (j >= N) { 52c4762a1bSJed Brown ierr = MatSetValue(A,i,N-1,(1.*j*N+i)/(3.*N*size),ADD_VALUES);CHKERRQ(ierr); 53c4762a1bSJed Brown ierr = MatSetValue(B,i,N-1,(1.*j*N+i)/(3.*N*size),ADD_VALUES);CHKERRQ(ierr); 54c4762a1bSJed Brown } else if (i > j) { 55c4762a1bSJed Brown ierr = MatSetValue(A,i,PetscMin(j,N-1),(1.*j*N+i)/(2.*N*size),ADD_VALUES);CHKERRQ(ierr); 56c4762a1bSJed Brown ierr = MatSetValue(B,i,PetscMin(j,N-1),(1.*j*N+i)/(2.*N*size),ADD_VALUES);CHKERRQ(ierr); 57c4762a1bSJed Brown } else { 58c4762a1bSJed Brown ierr = MatSetValue(A,i,PetscMin(j,N-1),-1.-(1.*j*N+i)/(4.*N*size),ADD_VALUES);CHKERRQ(ierr); 59c4762a1bSJed Brown ierr = MatSetValue(B,i,PetscMin(j,N-1),-1.-(1.*j*N+i)/(4.*N*size),ADD_VALUES);CHKERRQ(ierr); 60c4762a1bSJed Brown } 61c4762a1bSJed Brown } 62c4762a1bSJed Brown ierr = MatSetValues(A,1,&i,PetscMin(6,N),cols,vals,ADD_VALUES);CHKERRQ(ierr); 63c4762a1bSJed Brown ierr = MatSetValues(B,1,&i,PetscMin(6,N),cols,vals,ADD_VALUES);CHKERRQ(ierr); 64c4762a1bSJed Brown } 65c4762a1bSJed Brown } else { 66c4762a1bSJed Brown PetscInt rows[2]; 67c4762a1bSJed Brown PetscBool test_offproc = PETSC_FALSE; 68c4762a1bSJed Brown 691e1ea65dSPierre Jolivet ierr = PetscOptionsGetBool(NULL,NULL,"-test_offproc",&test_offproc,NULL);CHKERRQ(ierr); 70c4762a1bSJed Brown if (test_offproc) { 71c4762a1bSJed Brown const PetscInt *ranges; 72c4762a1bSJed Brown PetscMPIInt rank; 73c4762a1bSJed Brown 74ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 75c4762a1bSJed Brown ierr = MatGetOwnershipRanges(A,&ranges);CHKERRQ(ierr); 76c4762a1bSJed Brown rows[0] = ranges[(rank+1)%size]; 77c4762a1bSJed Brown rows[1] = ranges[(rank+1)%size + 1]; 78c4762a1bSJed Brown } else { 79c4762a1bSJed Brown ierr = MatGetOwnershipRange(A,&rows[0],&rows[1]);CHKERRQ(ierr); 80c4762a1bSJed Brown } 81c4762a1bSJed Brown for (i=rows[0];i<rows[1];i++) { 82c4762a1bSJed Brown PetscInt cols[] = {0,1,2,3,4,5}; 83c4762a1bSJed Brown PetscScalar vals[] = {-1,1,-2,2,-3,3}; 84c4762a1bSJed Brown 85c4762a1bSJed Brown ierr = MatSetValues(A,1,&i,PetscMin(6,N),cols,vals,INSERT_VALUES);CHKERRQ(ierr); 86c4762a1bSJed Brown ierr = MatSetValues(B,1,&i,PetscMin(6,N),cols,vals,INSERT_VALUES);CHKERRQ(ierr); 87c4762a1bSJed Brown } 88c4762a1bSJed Brown } 89c4762a1bSJed Brown /* MAT_FLUSH_ASSEMBLY currently not supported */ 90c4762a1bSJed Brown ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 91c4762a1bSJed Brown ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 92c4762a1bSJed Brown ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 93c4762a1bSJed Brown ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 94c4762a1bSJed Brown 95c4762a1bSJed Brown #if defined(PETSC_USE_COMPLEX) 96c4762a1bSJed Brown /* make the matrix imaginary */ 97c4762a1bSJed Brown ierr = MatScale(A,PETSC_i);CHKERRQ(ierr); 98c4762a1bSJed Brown ierr = MatScale(B,PETSC_i);CHKERRQ(ierr); 99c4762a1bSJed Brown #endif 100c4762a1bSJed Brown 101c4762a1bSJed Brown /* MatAXPY further exercises MatSetValues_HYPRE */ 102c4762a1bSJed Brown ierr = MatAXPY(B,-1.,A,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); 103c4762a1bSJed Brown ierr = MatConvert(B,MATMPIAIJ,MAT_INITIAL_MATRIX,&C);CHKERRQ(ierr); 104c4762a1bSJed Brown ierr = MatNorm(C,NORM_INFINITY,&err);CHKERRQ(ierr); 105c4762a1bSJed Brown if (err > PETSC_SMALL) SETERRQ1(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatSetValues %g",err); 106c4762a1bSJed Brown ierr = MatDestroy(&B);CHKERRQ(ierr); 107c4762a1bSJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 108c4762a1bSJed Brown } else { 109c4762a1bSJed Brown PetscViewer viewer; 110c4762a1bSJed Brown 111c4762a1bSJed Brown ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&viewer);CHKERRQ(ierr); 112c4762a1bSJed Brown ierr = MatSetFromOptions(A);CHKERRQ(ierr); 113c4762a1bSJed Brown ierr = MatLoad(A,viewer);CHKERRQ(ierr); 114c4762a1bSJed Brown ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 115c4762a1bSJed Brown ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 116c4762a1bSJed Brown } 117c4762a1bSJed Brown 118c4762a1bSJed Brown /* check conversion routines */ 119c4762a1bSJed Brown ierr = MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr); 120c4762a1bSJed Brown ierr = MatConvert(A,MATHYPRE,MAT_REUSE_MATRIX,&B);CHKERRQ(ierr); 121*a16187a7SStefano Zampini ierr = MatMultEqual(B,A,4,&flg);CHKERRQ(ierr); 122*a16187a7SStefano Zampini if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error Mat HYPRE"); 123c4762a1bSJed Brown ierr = MatConvert(B,MATIS,MAT_INITIAL_MATRIX,&D);CHKERRQ(ierr); 124c4762a1bSJed Brown ierr = MatConvert(B,MATIS,MAT_REUSE_MATRIX,&D);CHKERRQ(ierr); 125*a16187a7SStefano Zampini ierr = MatMultEqual(D,A,4,&flg);CHKERRQ(ierr); 126*a16187a7SStefano Zampini if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error Mat IS"); 127c4762a1bSJed Brown ierr = MatConvert(B,MATAIJ,MAT_INITIAL_MATRIX,&C);CHKERRQ(ierr); 128c4762a1bSJed Brown ierr = MatConvert(B,MATAIJ,MAT_REUSE_MATRIX,&C);CHKERRQ(ierr); 129*a16187a7SStefano Zampini ierr = MatMultEqual(C,A,4,&flg);CHKERRQ(ierr); 130*a16187a7SStefano Zampini if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error Mat AIJ"); 131c4762a1bSJed Brown ierr = MatAXPY(C,-1.,A,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 132c4762a1bSJed Brown ierr = MatNorm(C,NORM_INFINITY,&err);CHKERRQ(ierr); 133c4762a1bSJed Brown if (err > PETSC_SMALL) SETERRQ1(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error Mat AIJ %g",err); 134c4762a1bSJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 135c4762a1bSJed Brown ierr = MatConvert(D,MATAIJ,MAT_INITIAL_MATRIX,&C);CHKERRQ(ierr); 136c4762a1bSJed Brown ierr = MatAXPY(C,-1.,A,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 137c4762a1bSJed Brown ierr = MatNorm(C,NORM_INFINITY,&err);CHKERRQ(ierr); 138c4762a1bSJed Brown if (err > PETSC_SMALL) SETERRQ1(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error Mat IS %g",err); 139c4762a1bSJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 140c4762a1bSJed Brown ierr = MatDestroy(&D);CHKERRQ(ierr); 141c4762a1bSJed Brown 142c4762a1bSJed Brown /* check MatCreateFromParCSR */ 143c4762a1bSJed Brown ierr = MatHYPREGetParCSR(B,&parcsr);CHKERRQ(ierr); 144c4762a1bSJed Brown ierr = MatCreateFromParCSR(parcsr,MATAIJ,PETSC_COPY_VALUES,&D);CHKERRQ(ierr); 145c4762a1bSJed Brown ierr = MatDestroy(&D);CHKERRQ(ierr); 146c4762a1bSJed Brown ierr = MatCreateFromParCSR(parcsr,MATHYPRE,PETSC_USE_POINTER,&C);CHKERRQ(ierr); 147c4762a1bSJed Brown 148c4762a1bSJed Brown /* check MatMult operations */ 149c4762a1bSJed Brown ierr = MatMultEqual(A,B,4,&flg);CHKERRQ(ierr); 150c4762a1bSJed Brown if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMult B"); 151c4762a1bSJed Brown ierr = MatMultEqual(A,C,4,&flg);CHKERRQ(ierr); 152c4762a1bSJed Brown if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMult C"); 153c4762a1bSJed Brown ierr = MatMultAddEqual(A,B,4,&flg);CHKERRQ(ierr); 154c4762a1bSJed Brown if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultAdd B"); 155c4762a1bSJed Brown ierr = MatMultAddEqual(A,C,4,&flg);CHKERRQ(ierr); 156c4762a1bSJed Brown if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultAdd C"); 157c4762a1bSJed Brown ierr = MatMultTransposeEqual(A,B,4,&flg);CHKERRQ(ierr); 158c4762a1bSJed Brown if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultTranspose B"); 159c4762a1bSJed Brown ierr = MatMultTransposeEqual(A,C,4,&flg);CHKERRQ(ierr); 160c4762a1bSJed Brown if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultTranspose C"); 161c4762a1bSJed Brown ierr = MatMultTransposeAddEqual(A,B,4,&flg);CHKERRQ(ierr); 162c4762a1bSJed Brown if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultTransposeAdd B"); 163c4762a1bSJed Brown ierr = MatMultTransposeAddEqual(A,C,4,&flg);CHKERRQ(ierr); 164c4762a1bSJed Brown if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultTransposeAdd C"); 165c4762a1bSJed Brown 166c4762a1bSJed Brown /* check PtAP */ 167c4762a1bSJed Brown if (testptap && M == N) { 168c4762a1bSJed Brown Mat pP,hP; 169c4762a1bSJed Brown 170c4762a1bSJed Brown /* PETSc MatPtAP -> output is a MatAIJ 171c4762a1bSJed Brown It uses HYPRE functions when -matptap_via hypre is specified at command line */ 172c4762a1bSJed Brown ierr = MatPtAP(A,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&pP);CHKERRQ(ierr); 173c4762a1bSJed Brown ierr = MatPtAP(A,A,MAT_REUSE_MATRIX,PETSC_DEFAULT,&pP);CHKERRQ(ierr); 174c4762a1bSJed Brown ierr = MatNorm(pP,NORM_INFINITY,&norm);CHKERRQ(ierr); 175c20d7725SJed Brown ierr = MatPtAPMultEqual(A,A,pP,10,&flg);CHKERRQ(ierr); 176c20d7725SJed Brown if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatPtAP_MatAIJ"); 177c4762a1bSJed Brown 178c4762a1bSJed Brown /* MatPtAP_HYPRE_HYPRE -> output is a MatHYPRE */ 179c4762a1bSJed Brown ierr = MatPtAP(C,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&hP);CHKERRQ(ierr); 180c4762a1bSJed Brown ierr = MatPtAP(C,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&hP);CHKERRQ(ierr); 181c20d7725SJed Brown ierr = MatPtAPMultEqual(C,B,hP,10,&flg);CHKERRQ(ierr); 182c20d7725SJed Brown if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatPtAP_HYPRE_HYPRE"); 183c20d7725SJed Brown 184c20d7725SJed Brown /* Test MatAXPY_Basic() */ 185c4762a1bSJed Brown ierr = MatAXPY(hP,-1.,pP,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); 186c4762a1bSJed Brown ierr = MatHasOperation(hP,MATOP_NORM,&flg);CHKERRQ(ierr); 187c4762a1bSJed Brown if (!flg) { /* TODO add MatNorm_HYPRE */ 188c4762a1bSJed Brown ierr = MatConvert(hP,MATAIJ,MAT_INPLACE_MATRIX,&hP);CHKERRQ(ierr); 189c4762a1bSJed Brown } 190c4762a1bSJed Brown ierr = MatNorm(hP,NORM_INFINITY,&err);CHKERRQ(ierr); 191c20d7725SJed Brown if (err/norm > PETSC_SMALL) SETERRQ2(PetscObjectComm((PetscObject)hP),PETSC_ERR_PLIB,"Error MatPtAP %g %g",err,norm); 192c20d7725SJed Brown ierr = MatDestroy(&pP);CHKERRQ(ierr); 193c4762a1bSJed Brown ierr = MatDestroy(&hP);CHKERRQ(ierr); 194c4762a1bSJed Brown 195c4762a1bSJed Brown /* MatPtAP_AIJ_HYPRE -> output can be decided at runtime with -matptap_hypre_outtype */ 196c4762a1bSJed Brown ierr = MatPtAP(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&hP);CHKERRQ(ierr); 197c4762a1bSJed Brown ierr = MatPtAP(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&hP);CHKERRQ(ierr); 198c20d7725SJed Brown ierr = MatPtAPMultEqual(A,B,hP,10,&flg);CHKERRQ(ierr); 199c20d7725SJed Brown if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatPtAP_AIJ_HYPRE"); 200c4762a1bSJed Brown ierr = MatDestroy(&hP);CHKERRQ(ierr); 201c4762a1bSJed Brown } 202c4762a1bSJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 203c4762a1bSJed Brown ierr = MatDestroy(&B);CHKERRQ(ierr); 204c4762a1bSJed Brown 205c4762a1bSJed Brown /* check MatMatMult */ 206c4762a1bSJed Brown if (testmatmatmult) { 207c4762a1bSJed Brown ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr); 208c4762a1bSJed Brown ierr = MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&C);CHKERRQ(ierr); 209c4762a1bSJed Brown ierr = MatConvert(B,MATHYPRE,MAT_INITIAL_MATRIX,&D);CHKERRQ(ierr); 210c4762a1bSJed Brown 211c4762a1bSJed Brown /* PETSc MatMatMult -> output is a MatAIJ 212c4762a1bSJed Brown It uses HYPRE functions when -matmatmult_via hypre is specified at command line */ 213c4762a1bSJed Brown ierr = MatMatMult(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&pAB);CHKERRQ(ierr); 214c4762a1bSJed Brown ierr = MatMatMult(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&pAB);CHKERRQ(ierr); 215c4762a1bSJed Brown ierr = MatNorm(pAB,NORM_INFINITY,&norm);CHKERRQ(ierr); 216c20d7725SJed Brown ierr = MatMatMultEqual(A,B,pAB,10,&flg);CHKERRQ(ierr); 217c20d7725SJed Brown if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatMatMult_AIJ_AIJ"); 218c4762a1bSJed Brown 219c4762a1bSJed Brown /* MatMatMult_HYPRE_HYPRE -> output is a MatHYPRE */ 220c4762a1bSJed Brown ierr = MatMatMult(C,D,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&CD);CHKERRQ(ierr); 221c4762a1bSJed Brown ierr = MatMatMult(C,D,MAT_REUSE_MATRIX,PETSC_DEFAULT,&CD);CHKERRQ(ierr); 222c20d7725SJed Brown ierr = MatMatMultEqual(C,D,CD,10,&flg);CHKERRQ(ierr); 223c20d7725SJed Brown if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatMatMult_HYPRE_HYPRE"); 224c20d7725SJed Brown 225c20d7725SJed Brown /* Test MatAXPY_Basic() */ 226c4762a1bSJed Brown ierr = MatAXPY(CD,-1.,pAB,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); 227c20d7725SJed Brown 228c4762a1bSJed Brown ierr = MatHasOperation(CD,MATOP_NORM,&flg);CHKERRQ(ierr); 229c4762a1bSJed Brown if (!flg) { /* TODO add MatNorm_HYPRE */ 230c4762a1bSJed Brown ierr = MatConvert(CD,MATAIJ,MAT_INPLACE_MATRIX,&CD);CHKERRQ(ierr); 231c4762a1bSJed Brown } 232c4762a1bSJed Brown ierr = MatNorm(CD,NORM_INFINITY,&err);CHKERRQ(ierr); 233c20d7725SJed Brown if (err/norm > PETSC_SMALL) SETERRQ2(PetscObjectComm((PetscObject)CD),PETSC_ERR_PLIB,"Error MatMatMult %g %g",err,norm); 234c20d7725SJed Brown 235c4762a1bSJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 236c4762a1bSJed Brown ierr = MatDestroy(&D);CHKERRQ(ierr); 237c4762a1bSJed Brown ierr = MatDestroy(&pAB);CHKERRQ(ierr); 238c20d7725SJed Brown ierr = MatDestroy(&CD);CHKERRQ(ierr); 239c4762a1bSJed Brown 240c4762a1bSJed Brown /* When configured with HYPRE, MatMatMatMult is available for the triplet transpose(aij)-aij-aij */ 241c4762a1bSJed Brown ierr = MatCreateTranspose(A,&C);CHKERRQ(ierr); 242c4762a1bSJed Brown ierr = MatMatMatMult(C,A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&CAB);CHKERRQ(ierr); 243c4762a1bSJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 244c4762a1bSJed Brown ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&C);CHKERRQ(ierr); 245c4762a1bSJed Brown ierr = MatMatMult(C,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&D);CHKERRQ(ierr); 246c4762a1bSJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 247c4762a1bSJed Brown ierr = MatMatMult(D,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 248c4762a1bSJed Brown ierr = MatNorm(C,NORM_INFINITY,&norm);CHKERRQ(ierr); 249c4762a1bSJed Brown ierr = MatAXPY(C,-1.,CAB,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); 250c4762a1bSJed Brown ierr = MatNorm(C,NORM_INFINITY,&err);CHKERRQ(ierr); 251c4762a1bSJed Brown if (err/norm > PETSC_SMALL) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMatMatMult %g %g",err,norm); 252c4762a1bSJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 253c4762a1bSJed Brown ierr = MatDestroy(&D);CHKERRQ(ierr); 254c4762a1bSJed Brown ierr = MatDestroy(&CAB);CHKERRQ(ierr); 255c4762a1bSJed Brown ierr = MatDestroy(&B);CHKERRQ(ierr); 256c4762a1bSJed Brown } 257c4762a1bSJed Brown 258c4762a1bSJed Brown /* Check MatView */ 259c4762a1bSJed Brown ierr = MatViewFromOptions(A,NULL,"-view_A");CHKERRQ(ierr); 260c4762a1bSJed Brown ierr = MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr); 261c4762a1bSJed Brown ierr = MatViewFromOptions(B,NULL,"-view_B");CHKERRQ(ierr); 262c4762a1bSJed Brown 263c4762a1bSJed Brown /* Check MatDuplicate/MatCopy */ 264c4762a1bSJed Brown for (j=0;j<3;j++) { 265c4762a1bSJed Brown MatDuplicateOption dop; 266c4762a1bSJed Brown 267c4762a1bSJed Brown dop = MAT_COPY_VALUES; 268c4762a1bSJed Brown if (j==1) dop = MAT_DO_NOT_COPY_VALUES; 269c4762a1bSJed Brown if (j==2) dop = MAT_SHARE_NONZERO_PATTERN; 270c4762a1bSJed Brown 271c4762a1bSJed Brown for (i=0;i<3;i++) { 272c4762a1bSJed Brown MatStructure str; 273c4762a1bSJed Brown 274c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD,"Dup/Copy tests: %D %D\n",j,i);CHKERRQ(ierr); 275c4762a1bSJed Brown 276c4762a1bSJed Brown str = DIFFERENT_NONZERO_PATTERN; 277c4762a1bSJed Brown if (i==1) str = SAME_NONZERO_PATTERN; 278c4762a1bSJed Brown if (i==2) str = SUBSET_NONZERO_PATTERN; 279c4762a1bSJed Brown 280c4762a1bSJed Brown ierr = MatDuplicate(A,dop,&C);CHKERRQ(ierr); 281c4762a1bSJed Brown ierr = MatDuplicate(B,dop,&D);CHKERRQ(ierr); 282c4762a1bSJed Brown if (dop != MAT_COPY_VALUES) { 283c4762a1bSJed Brown ierr = MatCopy(A,C,str);CHKERRQ(ierr); 284c4762a1bSJed Brown ierr = MatCopy(B,D,str);CHKERRQ(ierr); 285c4762a1bSJed Brown } 286c4762a1bSJed Brown /* AXPY with AIJ and HYPRE */ 287c4762a1bSJed Brown ierr = MatAXPY(C,-1.0,D,str);CHKERRQ(ierr); 288c4762a1bSJed Brown ierr = MatNorm(C,NORM_INFINITY,&err);CHKERRQ(ierr); 289c4762a1bSJed Brown if (err > PETSC_SMALL) { 290c4762a1bSJed Brown ierr = MatViewFromOptions(A,NULL,"-view_duplicate_diff");CHKERRQ(ierr); 291c4762a1bSJed Brown ierr = MatViewFromOptions(B,NULL,"-view_duplicate_diff");CHKERRQ(ierr); 292c4762a1bSJed Brown ierr = MatViewFromOptions(C,NULL,"-view_duplicate_diff");CHKERRQ(ierr); 293c4762a1bSJed Brown SETERRQ3(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error test 1 MatDuplicate/MatCopy %g (%D,%D)",err,j,i); 294c4762a1bSJed Brown } 295c4762a1bSJed Brown /* AXPY with HYPRE and HYPRE */ 296c4762a1bSJed Brown ierr = MatAXPY(D,-1.0,B,str);CHKERRQ(ierr); 297c4762a1bSJed Brown if (err > PETSC_SMALL) { 298c4762a1bSJed Brown ierr = MatViewFromOptions(A,NULL,"-view_duplicate_diff");CHKERRQ(ierr); 299c4762a1bSJed Brown ierr = MatViewFromOptions(B,NULL,"-view_duplicate_diff");CHKERRQ(ierr); 300c4762a1bSJed Brown ierr = MatViewFromOptions(D,NULL,"-view_duplicate_diff");CHKERRQ(ierr); 301c4762a1bSJed Brown SETERRQ3(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error test 2 MatDuplicate/MatCopy %g (%D,%D)",err,j,i); 302c4762a1bSJed Brown } 303c4762a1bSJed Brown /* Copy from HYPRE to AIJ */ 304c4762a1bSJed Brown ierr = MatCopy(B,C,str);CHKERRQ(ierr); 305c4762a1bSJed Brown /* Copy from AIJ to HYPRE */ 306c4762a1bSJed Brown ierr = MatCopy(A,D,str);CHKERRQ(ierr); 307c4762a1bSJed Brown /* AXPY with HYPRE and AIJ */ 308c4762a1bSJed Brown ierr = MatAXPY(D,-1.0,C,str);CHKERRQ(ierr); 309c4762a1bSJed Brown ierr = MatHasOperation(D,MATOP_NORM,&flg);CHKERRQ(ierr); 310c4762a1bSJed Brown if (!flg) { /* TODO add MatNorm_HYPRE */ 311c4762a1bSJed Brown ierr = MatConvert(D,MATAIJ,MAT_INPLACE_MATRIX,&D);CHKERRQ(ierr); 312c4762a1bSJed Brown } 313c4762a1bSJed Brown ierr = MatNorm(D,NORM_INFINITY,&err);CHKERRQ(ierr); 314c4762a1bSJed Brown if (err > PETSC_SMALL) { 315c4762a1bSJed Brown ierr = MatViewFromOptions(A,NULL,"-view_duplicate_diff");CHKERRQ(ierr); 316c4762a1bSJed Brown ierr = MatViewFromOptions(C,NULL,"-view_duplicate_diff");CHKERRQ(ierr); 317c4762a1bSJed Brown ierr = MatViewFromOptions(D,NULL,"-view_duplicate_diff");CHKERRQ(ierr); 318c4762a1bSJed Brown SETERRQ3(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error test 3 MatDuplicate/MatCopy %g (%D,%D)",err,j,i); 319c4762a1bSJed Brown } 320c4762a1bSJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 321c4762a1bSJed Brown ierr = MatDestroy(&D);CHKERRQ(ierr); 322c4762a1bSJed Brown } 323c4762a1bSJed Brown } 324c4762a1bSJed Brown ierr = MatDestroy(&B);CHKERRQ(ierr); 325c4762a1bSJed Brown 326c4762a1bSJed Brown ierr = MatHasCongruentLayouts(A,&flg);CHKERRQ(ierr); 327c4762a1bSJed Brown if (flg) { 328c4762a1bSJed Brown Vec y,y2; 329c4762a1bSJed Brown 330c4762a1bSJed Brown ierr = MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&B);CHKERRQ(ierr); 331c4762a1bSJed Brown ierr = MatCreateVecs(A,NULL,&y);CHKERRQ(ierr); 332c4762a1bSJed Brown ierr = MatCreateVecs(B,NULL,&y2);CHKERRQ(ierr); 333c4762a1bSJed Brown ierr = MatGetDiagonal(A,y);CHKERRQ(ierr); 334c4762a1bSJed Brown ierr = MatGetDiagonal(B,y2);CHKERRQ(ierr); 335c4762a1bSJed Brown ierr = VecAXPY(y2,-1.0,y);CHKERRQ(ierr); 336c4762a1bSJed Brown ierr = VecNorm(y2,NORM_INFINITY,&err);CHKERRQ(ierr); 337c4762a1bSJed Brown if (err > PETSC_SMALL) { 338c4762a1bSJed Brown ierr = VecViewFromOptions(y,NULL,"-view_diagonal_diff");CHKERRQ(ierr); 339c4762a1bSJed Brown ierr = VecViewFromOptions(y2,NULL,"-view_diagonal_diff");CHKERRQ(ierr); 340c4762a1bSJed Brown SETERRQ1(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatGetDiagonal %g",err); 341c4762a1bSJed Brown } 342c4762a1bSJed Brown ierr = MatDestroy(&B);CHKERRQ(ierr); 343c4762a1bSJed Brown ierr = VecDestroy(&y);CHKERRQ(ierr); 344c4762a1bSJed Brown ierr = VecDestroy(&y2);CHKERRQ(ierr); 345c4762a1bSJed Brown } 346c4762a1bSJed Brown 347c4762a1bSJed Brown ierr = MatDestroy(&A);CHKERRQ(ierr); 348c4762a1bSJed Brown 349c4762a1bSJed Brown ierr = PetscFinalize(); 350c4762a1bSJed Brown return ierr; 351c4762a1bSJed Brown } 352c4762a1bSJed Brown 353c4762a1bSJed Brown /*TEST 354c4762a1bSJed Brown 355c4762a1bSJed Brown build: 356c4762a1bSJed Brown requires: hypre 357c4762a1bSJed Brown 358c4762a1bSJed Brown test: 359263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 360c4762a1bSJed Brown suffix: 1 361c4762a1bSJed Brown args: -N 11 -M 11 362c4762a1bSJed Brown output_file: output/ex115_1.out 363c4762a1bSJed Brown 364c4762a1bSJed Brown test: 365263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 366c4762a1bSJed Brown suffix: 2 367c4762a1bSJed Brown nsize: 3 368c4762a1bSJed Brown args: -N 13 -M 13 -matmatmult_via hypre 369c4762a1bSJed Brown output_file: output/ex115_1.out 370c4762a1bSJed Brown 371c4762a1bSJed Brown test: 372263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 373c4762a1bSJed Brown suffix: 3 374c4762a1bSJed Brown nsize: 4 375c4762a1bSJed Brown args: -M 13 -N 7 -matmatmult_via hypre 376c4762a1bSJed Brown output_file: output/ex115_1.out 377c4762a1bSJed Brown 378c4762a1bSJed Brown test: 379263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 380c4762a1bSJed Brown suffix: 4 381c4762a1bSJed Brown nsize: 2 382c4762a1bSJed Brown args: -M 12 -N 19 383c4762a1bSJed Brown output_file: output/ex115_1.out 384c4762a1bSJed Brown 385c4762a1bSJed Brown test: 386263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 387c4762a1bSJed Brown suffix: 5 388c4762a1bSJed Brown nsize: 3 389c4762a1bSJed Brown args: -M 13 -N 13 -matptap_via hypre -matptap_hypre_outtype hypre 390c4762a1bSJed Brown output_file: output/ex115_1.out 391c4762a1bSJed Brown 392c4762a1bSJed Brown test: 393263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 394c4762a1bSJed Brown suffix: 6 395c4762a1bSJed Brown nsize: 3 396c4762a1bSJed Brown args: -M 12 -N 19 -test_offproc 397c4762a1bSJed Brown output_file: output/ex115_1.out 398c4762a1bSJed Brown 399c4762a1bSJed Brown test: 400263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 401c4762a1bSJed Brown suffix: 7 402c4762a1bSJed Brown nsize: 3 403c4762a1bSJed Brown args: -M 19 -N 12 -test_offproc -view_B ::ascii_info_detail 404c4762a1bSJed Brown output_file: output/ex115_7.out 405c4762a1bSJed Brown 406c4762a1bSJed Brown test: 407263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 408c4762a1bSJed Brown suffix: 8 409c4762a1bSJed Brown nsize: 3 410c4762a1bSJed Brown args: -M 1 -N 12 -test_offproc 411c4762a1bSJed Brown output_file: output/ex115_1.out 412c4762a1bSJed Brown 413c4762a1bSJed Brown test: 414263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 415c4762a1bSJed Brown suffix: 9 416c4762a1bSJed Brown nsize: 3 417c4762a1bSJed Brown args: -M 1 -N 2 -test_offproc 418c4762a1bSJed Brown output_file: output/ex115_1.out 419c4762a1bSJed Brown 420c4762a1bSJed Brown TEST*/ 421