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 PetscBool flg,testptap = PETSC_TRUE,testmatmatmult = PETSC_TRUE; 14c4762a1bSJed Brown PetscReal norm; 15c4762a1bSJed Brown char file[256]; 16c4762a1bSJed Brown 17*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc,&args,(char*)0,help)); 185f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetString(NULL,NULL,"-f",file,sizeof(file),&flg)); 19c4762a1bSJed Brown #if defined(PETSC_USE_COMPLEX) 20c4762a1bSJed Brown testptap = PETSC_FALSE; 21c4762a1bSJed Brown testmatmatmult = PETSC_FALSE; 225f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsInsertString(NULL,"-options_left 0")); 23c4762a1bSJed Brown #endif 245f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-ptap",&testptap,NULL)); 255f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-matmatmult",&testmatmatmult,NULL)); 265f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_WORLD,&A)); 27c4762a1bSJed Brown if (!flg) { /* Create a matrix and test MatSetValues */ 28c4762a1bSJed Brown PetscMPIInt size; 29c4762a1bSJed Brown 305f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 315f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL)); 325f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL)); 335f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,M,N)); 345f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetType(A,MATAIJ)); 355f80ce2aSJacob Faibussowitsch CHKERRQ(MatSeqAIJSetPreallocation(A,9,NULL)); 365f80ce2aSJacob Faibussowitsch CHKERRQ(MatMPIAIJSetPreallocation(A,9,NULL,9,NULL)); 375f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_WORLD,&B)); 385f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,M,N)); 395f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetType(B,MATHYPRE)); 40c4762a1bSJed Brown if (M == N) { 415f80ce2aSJacob Faibussowitsch CHKERRQ(MatHYPRESetPreallocation(B,9,NULL,9,NULL)); 42c4762a1bSJed Brown } else { 435f80ce2aSJacob Faibussowitsch CHKERRQ(MatHYPRESetPreallocation(B,6,NULL,6,NULL)); 44c4762a1bSJed Brown } 45c4762a1bSJed Brown if (M == N) { 46c4762a1bSJed Brown for (i=0; i<M; i++) { 47c4762a1bSJed Brown PetscInt cols[] = {0,1,2,3,4,5}; 48c4762a1bSJed Brown PetscScalar vals[] = {0,1./size,2./size,3./size,4./size,5./size}; 49c4762a1bSJed Brown for (j=i-2; j<i+1; j++) { 50c4762a1bSJed Brown if (j >= N) { 515f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValue(A,i,N-1,(1.*j*N+i)/(3.*N*size),ADD_VALUES)); 525f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValue(B,i,N-1,(1.*j*N+i)/(3.*N*size),ADD_VALUES)); 53c4762a1bSJed Brown } else if (i > j) { 545f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValue(A,i,PetscMin(j,N-1),(1.*j*N+i)/(2.*N*size),ADD_VALUES)); 555f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValue(B,i,PetscMin(j,N-1),(1.*j*N+i)/(2.*N*size),ADD_VALUES)); 56c4762a1bSJed Brown } else { 575f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValue(A,i,PetscMin(j,N-1),-1.-(1.*j*N+i)/(4.*N*size),ADD_VALUES)); 585f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValue(B,i,PetscMin(j,N-1),-1.-(1.*j*N+i)/(4.*N*size),ADD_VALUES)); 59c4762a1bSJed Brown } 60c4762a1bSJed Brown } 615f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValues(A,1,&i,PetscMin(6,N),cols,vals,ADD_VALUES)); 625f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValues(B,1,&i,PetscMin(6,N),cols,vals,ADD_VALUES)); 63c4762a1bSJed Brown } 64c4762a1bSJed Brown } else { 65c4762a1bSJed Brown PetscInt rows[2]; 66c4762a1bSJed Brown PetscBool test_offproc = PETSC_FALSE; 67c4762a1bSJed Brown 685f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-test_offproc",&test_offproc,NULL)); 69c4762a1bSJed Brown if (test_offproc) { 70c4762a1bSJed Brown const PetscInt *ranges; 71c4762a1bSJed Brown PetscMPIInt rank; 72c4762a1bSJed Brown 735f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 745f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetOwnershipRanges(A,&ranges)); 75c4762a1bSJed Brown rows[0] = ranges[(rank+1)%size]; 76c4762a1bSJed Brown rows[1] = ranges[(rank+1)%size + 1]; 77c4762a1bSJed Brown } else { 785f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetOwnershipRange(A,&rows[0],&rows[1])); 79c4762a1bSJed Brown } 80c4762a1bSJed Brown for (i=rows[0];i<rows[1];i++) { 81c4762a1bSJed Brown PetscInt cols[] = {0,1,2,3,4,5}; 82c4762a1bSJed Brown PetscScalar vals[] = {-1,1,-2,2,-3,3}; 83c4762a1bSJed Brown 845f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValues(A,1,&i,PetscMin(6,N),cols,vals,INSERT_VALUES)); 855f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValues(B,1,&i,PetscMin(6,N),cols,vals,INSERT_VALUES)); 86c4762a1bSJed Brown } 87c4762a1bSJed Brown } 88c4762a1bSJed Brown /* MAT_FLUSH_ASSEMBLY currently not supported */ 895f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY)); 905f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY)); 915f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY)); 925f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY)); 93c4762a1bSJed Brown 94c4762a1bSJed Brown #if defined(PETSC_USE_COMPLEX) 95c4762a1bSJed Brown /* make the matrix imaginary */ 965f80ce2aSJacob Faibussowitsch CHKERRQ(MatScale(A,PETSC_i)); 975f80ce2aSJacob Faibussowitsch CHKERRQ(MatScale(B,PETSC_i)); 98c4762a1bSJed Brown #endif 99c4762a1bSJed Brown 100c4762a1bSJed Brown /* MatAXPY further exercises MatSetValues_HYPRE */ 1015f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(B,-1.,A,DIFFERENT_NONZERO_PATTERN)); 1025f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(B,MATMPIAIJ,MAT_INITIAL_MATRIX,&C)); 1035f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(C,NORM_INFINITY,&err)); 10454c59aa7SJacob Faibussowitsch PetscCheck(err <= PETSC_SMALL,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatSetValues %g",err); 1055f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&B)); 1065f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 107c4762a1bSJed Brown } else { 108c4762a1bSJed Brown PetscViewer viewer; 109c4762a1bSJed Brown 1105f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&viewer)); 1115f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetFromOptions(A)); 1125f80ce2aSJacob Faibussowitsch CHKERRQ(MatLoad(A,viewer)); 1135f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&viewer)); 1145f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetSize(A,&M,&N)); 115c4762a1bSJed Brown } 116c4762a1bSJed Brown 117c4762a1bSJed Brown /* check conversion routines */ 1185f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&B)); 1195f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(A,MATHYPRE,MAT_REUSE_MATRIX,&B)); 1205f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(B,A,4,&flg)); 12154c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error Mat HYPRE"); 1225f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(B,MATIS,MAT_INITIAL_MATRIX,&D)); 1235f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(B,MATIS,MAT_REUSE_MATRIX,&D)); 1245f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(D,A,4,&flg)); 12554c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error Mat IS"); 1265f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(B,MATAIJ,MAT_INITIAL_MATRIX,&C)); 1275f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(B,MATAIJ,MAT_REUSE_MATRIX,&C)); 1285f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(C,A,4,&flg)); 12954c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error Mat AIJ"); 1305f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(C,-1.,A,SAME_NONZERO_PATTERN)); 1315f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(C,NORM_INFINITY,&err)); 13254c59aa7SJacob Faibussowitsch PetscCheck(err <= PETSC_SMALL,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error Mat AIJ %g",err); 1335f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 1345f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(D,MATAIJ,MAT_INITIAL_MATRIX,&C)); 1355f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(C,-1.,A,SAME_NONZERO_PATTERN)); 1365f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(C,NORM_INFINITY,&err)); 13754c59aa7SJacob Faibussowitsch PetscCheck(err <= PETSC_SMALL,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error Mat IS %g",err); 1385f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 1395f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 140c4762a1bSJed Brown 141c4762a1bSJed Brown /* check MatCreateFromParCSR */ 1425f80ce2aSJacob Faibussowitsch CHKERRQ(MatHYPREGetParCSR(B,&parcsr)); 1435f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateFromParCSR(parcsr,MATAIJ,PETSC_COPY_VALUES,&D)); 1445f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 1455f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateFromParCSR(parcsr,MATHYPRE,PETSC_USE_POINTER,&C)); 146c4762a1bSJed Brown 147c4762a1bSJed Brown /* check MatMult operations */ 1485f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(A,B,4,&flg)); 14954c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMult B"); 1505f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(A,C,4,&flg)); 15154c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMult C"); 1525f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultAddEqual(A,B,4,&flg)); 15354c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultAdd B"); 1545f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultAddEqual(A,C,4,&flg)); 15554c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultAdd C"); 1565f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultTransposeEqual(A,B,4,&flg)); 15754c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultTranspose B"); 1585f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultTransposeEqual(A,C,4,&flg)); 15954c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultTranspose C"); 1605f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultTransposeAddEqual(A,B,4,&flg)); 16154c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultTransposeAdd B"); 1625f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultTransposeAddEqual(A,C,4,&flg)); 16354c59aa7SJacob Faibussowitsch PetscCheck(flg,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMultTransposeAdd C"); 164c4762a1bSJed Brown 165c4762a1bSJed Brown /* check PtAP */ 166c4762a1bSJed Brown if (testptap && M == N) { 167c4762a1bSJed Brown Mat pP,hP; 168c4762a1bSJed Brown 169c4762a1bSJed Brown /* PETSc MatPtAP -> output is a MatAIJ 170c4762a1bSJed Brown It uses HYPRE functions when -matptap_via hypre is specified at command line */ 1715f80ce2aSJacob Faibussowitsch CHKERRQ(MatPtAP(A,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&pP)); 1725f80ce2aSJacob Faibussowitsch CHKERRQ(MatPtAP(A,A,MAT_REUSE_MATRIX,PETSC_DEFAULT,&pP)); 1735f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(pP,NORM_INFINITY,&norm)); 1745f80ce2aSJacob Faibussowitsch CHKERRQ(MatPtAPMultEqual(A,A,pP,10,&flg)); 17554c59aa7SJacob Faibussowitsch PetscCheck(flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatPtAP_MatAIJ"); 176c4762a1bSJed Brown 177c4762a1bSJed Brown /* MatPtAP_HYPRE_HYPRE -> output is a MatHYPRE */ 1785f80ce2aSJacob Faibussowitsch CHKERRQ(MatPtAP(C,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&hP)); 1795f80ce2aSJacob Faibussowitsch CHKERRQ(MatPtAP(C,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&hP)); 1805f80ce2aSJacob Faibussowitsch CHKERRQ(MatPtAPMultEqual(C,B,hP,10,&flg)); 18154c59aa7SJacob Faibussowitsch PetscCheck(flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatPtAP_HYPRE_HYPRE"); 182c20d7725SJed Brown 183c20d7725SJed Brown /* Test MatAXPY_Basic() */ 1845f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(hP,-1.,pP,DIFFERENT_NONZERO_PATTERN)); 1855f80ce2aSJacob Faibussowitsch CHKERRQ(MatHasOperation(hP,MATOP_NORM,&flg)); 186c4762a1bSJed Brown if (!flg) { /* TODO add MatNorm_HYPRE */ 1875f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(hP,MATAIJ,MAT_INPLACE_MATRIX,&hP)); 188c4762a1bSJed Brown } 1895f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(hP,NORM_INFINITY,&err)); 1902c71b3e2SJacob Faibussowitsch PetscCheckFalse(err/norm > PETSC_SMALL,PetscObjectComm((PetscObject)hP),PETSC_ERR_PLIB,"Error MatPtAP %g %g",err,norm); 1915f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&pP)); 1925f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&hP)); 193c4762a1bSJed Brown 194c4762a1bSJed Brown /* MatPtAP_AIJ_HYPRE -> output can be decided at runtime with -matptap_hypre_outtype */ 1955f80ce2aSJacob Faibussowitsch CHKERRQ(MatPtAP(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&hP)); 1965f80ce2aSJacob Faibussowitsch CHKERRQ(MatPtAP(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&hP)); 1975f80ce2aSJacob Faibussowitsch CHKERRQ(MatPtAPMultEqual(A,B,hP,10,&flg)); 19854c59aa7SJacob Faibussowitsch PetscCheck(flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatPtAP_AIJ_HYPRE"); 1995f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&hP)); 200c4762a1bSJed Brown } 2015f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 2025f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&B)); 203c4762a1bSJed Brown 204c4762a1bSJed Brown /* check MatMatMult */ 205c4762a1bSJed Brown if (testmatmatmult) { 2065f80ce2aSJacob Faibussowitsch CHKERRQ(MatTranspose(A,MAT_INITIAL_MATRIX,&B)); 2075f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&C)); 2085f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(B,MATHYPRE,MAT_INITIAL_MATRIX,&D)); 209c4762a1bSJed Brown 210c4762a1bSJed Brown /* PETSc MatMatMult -> output is a MatAIJ 211c4762a1bSJed Brown It uses HYPRE functions when -matmatmult_via hypre is specified at command line */ 2125f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMult(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&pAB)); 2135f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMult(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&pAB)); 2145f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(pAB,NORM_INFINITY,&norm)); 2155f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMultEqual(A,B,pAB,10,&flg)); 21654c59aa7SJacob Faibussowitsch PetscCheck(flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatMatMult_AIJ_AIJ"); 217c4762a1bSJed Brown 218c4762a1bSJed Brown /* MatMatMult_HYPRE_HYPRE -> output is a MatHYPRE */ 2195f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMult(C,D,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&CD)); 2205f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMult(C,D,MAT_REUSE_MATRIX,PETSC_DEFAULT,&CD)); 2215f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMultEqual(C,D,CD,10,&flg)); 22254c59aa7SJacob Faibussowitsch PetscCheck(flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatMatMult_HYPRE_HYPRE"); 223c20d7725SJed Brown 224c20d7725SJed Brown /* Test MatAXPY_Basic() */ 2255f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(CD,-1.,pAB,DIFFERENT_NONZERO_PATTERN)); 226c20d7725SJed Brown 2275f80ce2aSJacob Faibussowitsch CHKERRQ(MatHasOperation(CD,MATOP_NORM,&flg)); 228c4762a1bSJed Brown if (!flg) { /* TODO add MatNorm_HYPRE */ 2295f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(CD,MATAIJ,MAT_INPLACE_MATRIX,&CD)); 230c4762a1bSJed Brown } 2315f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(CD,NORM_INFINITY,&err)); 23254c59aa7SJacob Faibussowitsch PetscCheck((err/norm) <= PETSC_SMALL,PetscObjectComm((PetscObject)CD),PETSC_ERR_PLIB,"Error MatMatMult %g %g",err,norm); 233c20d7725SJed Brown 2345f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 2355f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 2365f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&pAB)); 2375f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&CD)); 238c4762a1bSJed Brown 239c4762a1bSJed Brown /* When configured with HYPRE, MatMatMatMult is available for the triplet transpose(aij)-aij-aij */ 2405f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateTranspose(A,&C)); 2415f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMatMult(C,A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&CAB)); 2425f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 2435f80ce2aSJacob Faibussowitsch CHKERRQ(MatTranspose(A,MAT_INITIAL_MATRIX,&C)); 2445f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMult(C,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&D)); 2455f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 2465f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMult(D,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C)); 2475f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(C,NORM_INFINITY,&norm)); 2485f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(C,-1.,CAB,DIFFERENT_NONZERO_PATTERN)); 2495f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(C,NORM_INFINITY,&err)); 25054c59aa7SJacob Faibussowitsch PetscCheck((err/norm) <= PETSC_SMALL,PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatMatMatMult %g %g",err,norm); 2515f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 2525f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 2535f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&CAB)); 2545f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&B)); 255c4762a1bSJed Brown } 256c4762a1bSJed Brown 257c4762a1bSJed Brown /* Check MatView */ 2585f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(A,NULL,"-view_A")); 2595f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&B)); 2605f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(B,NULL,"-view_B")); 261c4762a1bSJed Brown 262c4762a1bSJed Brown /* Check MatDuplicate/MatCopy */ 263c4762a1bSJed Brown for (j=0;j<3;j++) { 264c4762a1bSJed Brown MatDuplicateOption dop; 265c4762a1bSJed Brown 266c4762a1bSJed Brown dop = MAT_COPY_VALUES; 267c4762a1bSJed Brown if (j==1) dop = MAT_DO_NOT_COPY_VALUES; 268c4762a1bSJed Brown if (j==2) dop = MAT_SHARE_NONZERO_PATTERN; 269c4762a1bSJed Brown 270c4762a1bSJed Brown for (i=0;i<3;i++) { 271c4762a1bSJed Brown MatStructure str; 272c4762a1bSJed Brown 2735f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Dup/Copy tests: %" PetscInt_FMT " %" PetscInt_FMT "\n",j,i)); 274c4762a1bSJed Brown 275c4762a1bSJed Brown str = DIFFERENT_NONZERO_PATTERN; 276c4762a1bSJed Brown if (i==1) str = SAME_NONZERO_PATTERN; 277c4762a1bSJed Brown if (i==2) str = SUBSET_NONZERO_PATTERN; 278c4762a1bSJed Brown 2795f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(A,dop,&C)); 2805f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(B,dop,&D)); 281c4762a1bSJed Brown if (dop != MAT_COPY_VALUES) { 2825f80ce2aSJacob Faibussowitsch CHKERRQ(MatCopy(A,C,str)); 2835f80ce2aSJacob Faibussowitsch CHKERRQ(MatCopy(B,D,str)); 284c4762a1bSJed Brown } 285c4762a1bSJed Brown /* AXPY with AIJ and HYPRE */ 2865f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(C,-1.0,D,str)); 2875f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(C,NORM_INFINITY,&err)); 288c4762a1bSJed Brown if (err > PETSC_SMALL) { 2895f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(A,NULL,"-view_duplicate_diff")); 2905f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(B,NULL,"-view_duplicate_diff")); 2915f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(C,NULL,"-view_duplicate_diff")); 29298921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error test 1 MatDuplicate/MatCopy %g (%" PetscInt_FMT ",%" PetscInt_FMT ")",err,j,i); 293c4762a1bSJed Brown } 294c4762a1bSJed Brown /* AXPY with HYPRE and HYPRE */ 2955f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(D,-1.0,B,str)); 296c4762a1bSJed Brown if (err > PETSC_SMALL) { 2975f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(A,NULL,"-view_duplicate_diff")); 2985f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(B,NULL,"-view_duplicate_diff")); 2995f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(D,NULL,"-view_duplicate_diff")); 30098921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error test 2 MatDuplicate/MatCopy %g (%" PetscInt_FMT ",%" PetscInt_FMT ")",err,j,i); 301c4762a1bSJed Brown } 302c4762a1bSJed Brown /* Copy from HYPRE to AIJ */ 3035f80ce2aSJacob Faibussowitsch CHKERRQ(MatCopy(B,C,str)); 304c4762a1bSJed Brown /* Copy from AIJ to HYPRE */ 3055f80ce2aSJacob Faibussowitsch CHKERRQ(MatCopy(A,D,str)); 306c4762a1bSJed Brown /* AXPY with HYPRE and AIJ */ 3075f80ce2aSJacob Faibussowitsch CHKERRQ(MatAXPY(D,-1.0,C,str)); 3085f80ce2aSJacob Faibussowitsch CHKERRQ(MatHasOperation(D,MATOP_NORM,&flg)); 309c4762a1bSJed Brown if (!flg) { /* TODO add MatNorm_HYPRE */ 3105f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(D,MATAIJ,MAT_INPLACE_MATRIX,&D)); 311c4762a1bSJed Brown } 3125f80ce2aSJacob Faibussowitsch CHKERRQ(MatNorm(D,NORM_INFINITY,&err)); 313c4762a1bSJed Brown if (err > PETSC_SMALL) { 3145f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(A,NULL,"-view_duplicate_diff")); 3155f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(C,NULL,"-view_duplicate_diff")); 3165f80ce2aSJacob Faibussowitsch CHKERRQ(MatViewFromOptions(D,NULL,"-view_duplicate_diff")); 31798921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error test 3 MatDuplicate/MatCopy %g (%" PetscInt_FMT ",%" PetscInt_FMT ")",err,j,i); 318c4762a1bSJed Brown } 3195f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 3205f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&D)); 321c4762a1bSJed Brown } 322c4762a1bSJed Brown } 3235f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&B)); 324c4762a1bSJed Brown 3255f80ce2aSJacob Faibussowitsch CHKERRQ(MatHasCongruentLayouts(A,&flg)); 326c4762a1bSJed Brown if (flg) { 327c4762a1bSJed Brown Vec y,y2; 328c4762a1bSJed Brown 3295f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&B)); 3305f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateVecs(A,NULL,&y)); 3315f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateVecs(B,NULL,&y2)); 3325f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetDiagonal(A,y)); 3335f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetDiagonal(B,y2)); 3345f80ce2aSJacob Faibussowitsch CHKERRQ(VecAXPY(y2,-1.0,y)); 3355f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(y2,NORM_INFINITY,&err)); 336c4762a1bSJed Brown if (err > PETSC_SMALL) { 3375f80ce2aSJacob Faibussowitsch CHKERRQ(VecViewFromOptions(y,NULL,"-view_diagonal_diff")); 3385f80ce2aSJacob Faibussowitsch CHKERRQ(VecViewFromOptions(y2,NULL,"-view_diagonal_diff")); 33998921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_PLIB,"Error MatGetDiagonal %g",err); 340c4762a1bSJed Brown } 3415f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&B)); 3425f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&y)); 3435f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&y2)); 344c4762a1bSJed Brown } 345c4762a1bSJed Brown 3465f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&A)); 347c4762a1bSJed Brown 348*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 349*b122ec5aSJacob Faibussowitsch return 0; 350c4762a1bSJed Brown } 351c4762a1bSJed Brown 352c4762a1bSJed Brown /*TEST 353c4762a1bSJed Brown 354c4762a1bSJed Brown build: 355c4762a1bSJed Brown requires: hypre 356c4762a1bSJed Brown 357c4762a1bSJed Brown test: 358263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 359c4762a1bSJed Brown suffix: 1 360c4762a1bSJed Brown args: -N 11 -M 11 361c4762a1bSJed Brown output_file: output/ex115_1.out 362c4762a1bSJed Brown 363c4762a1bSJed Brown test: 364263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 365c4762a1bSJed Brown suffix: 2 366c4762a1bSJed Brown nsize: 3 367c4762a1bSJed Brown args: -N 13 -M 13 -matmatmult_via hypre 368c4762a1bSJed Brown output_file: output/ex115_1.out 369c4762a1bSJed Brown 370c4762a1bSJed Brown test: 371263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 372c4762a1bSJed Brown suffix: 3 373c4762a1bSJed Brown nsize: 4 374c4762a1bSJed Brown args: -M 13 -N 7 -matmatmult_via hypre 375c4762a1bSJed Brown output_file: output/ex115_1.out 376c4762a1bSJed Brown 377c4762a1bSJed Brown test: 378263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 379c4762a1bSJed Brown suffix: 4 380c4762a1bSJed Brown nsize: 2 381c4762a1bSJed Brown args: -M 12 -N 19 382c4762a1bSJed Brown output_file: output/ex115_1.out 383c4762a1bSJed Brown 384c4762a1bSJed Brown test: 385263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 386c4762a1bSJed Brown suffix: 5 387c4762a1bSJed Brown nsize: 3 388c4762a1bSJed Brown args: -M 13 -N 13 -matptap_via hypre -matptap_hypre_outtype hypre 389c4762a1bSJed Brown output_file: output/ex115_1.out 390c4762a1bSJed Brown 391c4762a1bSJed Brown test: 392263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 393c4762a1bSJed Brown suffix: 6 394c4762a1bSJed Brown nsize: 3 395c4762a1bSJed Brown args: -M 12 -N 19 -test_offproc 396c4762a1bSJed Brown output_file: output/ex115_1.out 397c4762a1bSJed Brown 398c4762a1bSJed Brown test: 399263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 400c4762a1bSJed Brown suffix: 7 401c4762a1bSJed Brown nsize: 3 402c4762a1bSJed Brown args: -M 19 -N 12 -test_offproc -view_B ::ascii_info_detail 403c4762a1bSJed Brown output_file: output/ex115_7.out 404c4762a1bSJed Brown 405c4762a1bSJed Brown test: 406263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 407c4762a1bSJed Brown suffix: 8 408c4762a1bSJed Brown nsize: 3 409c4762a1bSJed Brown args: -M 1 -N 12 -test_offproc 410c4762a1bSJed Brown output_file: output/ex115_1.out 411c4762a1bSJed Brown 412c4762a1bSJed Brown test: 413263f2b91SStefano Zampini requires: !defined(PETSC_HAVE_HYPRE_DEVICE) 414c4762a1bSJed Brown suffix: 9 415c4762a1bSJed Brown nsize: 3 416c4762a1bSJed Brown args: -M 1 -N 2 -test_offproc 417c4762a1bSJed Brown output_file: output/ex115_1.out 418c4762a1bSJed Brown 419c4762a1bSJed Brown TEST*/ 420