1c20d7725SJed Brown 2c20d7725SJed Brown static char help[] = "Test Matrix products for AIJ matrices\n\ 3c20d7725SJed Brown Input arguments are:\n\ 4c20d7725SJed Brown -fA <input_file> -fB <input_file> -fC <input_file>: file to load\n\n"; 5c20d7725SJed Brown /* Example of usage: 6c20d7725SJed Brown ./ex62 -fA <A_binary> -fB <B_binary> 7c20d7725SJed Brown mpiexec -n 3 ./ex62 -fA medium -fB medium 8c20d7725SJed Brown */ 9c20d7725SJed Brown 10c20d7725SJed Brown #include <petscmat.h> 11c20d7725SJed Brown 12c20d7725SJed Brown /* 13c20d7725SJed Brown B = A - B 14c20d7725SJed Brown norm = norm(B) 15c20d7725SJed Brown */ 16c20d7725SJed Brown PetscErrorCode MatNormDifference(Mat A,Mat B,PetscReal *norm) 17c20d7725SJed Brown { 18c20d7725SJed Brown PetscErrorCode ierr; 19c20d7725SJed Brown 20c20d7725SJed Brown PetscFunctionBegin; 21c20d7725SJed Brown ierr = MatAXPY(B,-1.0,A,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); 22c20d7725SJed Brown ierr = MatNorm(B,NORM_FROBENIUS,norm);CHKERRQ(ierr); 23c20d7725SJed Brown PetscFunctionReturn(0); 24c20d7725SJed Brown } 25c20d7725SJed Brown 26c20d7725SJed Brown int main(int argc,char **args) 27c20d7725SJed Brown { 28c20d7725SJed Brown Mat A,A_save,B,C,P,C1,R; 29c20d7725SJed Brown PetscViewer viewer; 30c20d7725SJed Brown PetscErrorCode ierr; 31c20d7725SJed Brown PetscMPIInt size,rank; 3220b3374bSStefano Zampini PetscInt i,j,*idxn,PM,PN = PETSC_DECIDE,rstart,rend; 33c20d7725SJed Brown PetscReal norm; 34c20d7725SJed Brown PetscRandom rdm; 3520b3374bSStefano Zampini char file[2][PETSC_MAX_PATH_LEN] = { "", ""}; 36c20d7725SJed Brown PetscScalar *a,rval,alpha; 37c20d7725SJed Brown PetscBool Test_MatMatMult=PETSC_TRUE,Test_MatTrMat=PETSC_TRUE,Test_MatMatTr=PETSC_TRUE; 3820b3374bSStefano Zampini PetscBool Test_MatPtAP=PETSC_TRUE,Test_MatRARt=PETSC_TRUE,flg,seqaij,flgA,flgB; 39c20d7725SJed Brown MatInfo info; 4020b3374bSStefano Zampini PetscInt nzp = 5; /* num of nonzeros in each row of P */ 41c20d7725SJed Brown MatType mattype; 4220b3374bSStefano Zampini const char *deft = MATAIJ; 4320b3374bSStefano Zampini char A_mattype[256], B_mattype[256]; 4420b3374bSStefano Zampini PetscInt mcheck = 10; 45c20d7725SJed Brown 46c20d7725SJed Brown ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 47ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 48ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 49c20d7725SJed Brown 50c20d7725SJed Brown /* Load the matrices A_save and B */ 5120b3374bSStefano Zampini ierr = PetscOptionsBegin(PETSC_COMM_WORLD,"","","");CHKERRQ(ierr); 52263f2b91SStefano Zampini ierr = PetscOptionsBool("-test_rart","Test MatRARt","",Test_MatRARt,&Test_MatRARt,NULL);CHKERRQ(ierr); 5320b3374bSStefano Zampini ierr = PetscOptionsInt("-PN","Number of columns of P","",PN,&PN,NULL);CHKERRQ(ierr); 5420b3374bSStefano Zampini ierr = PetscOptionsInt("-mcheck","Number of matmult checks","",mcheck,&mcheck,NULL);CHKERRQ(ierr); 5520b3374bSStefano Zampini ierr = PetscOptionsString("-fA","Path for matrix A","",file[0],file[0],sizeof(file[0]),&flg);CHKERRQ(ierr); 56*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(!flg,PETSC_COMM_WORLD,PETSC_ERR_USER_INPUT,"Must indicate a file name for matrix A with the -fA option."); 5720b3374bSStefano Zampini ierr = PetscOptionsString("-fB","Path for matrix B","",file[1],file[1],sizeof(file[1]),&flg);CHKERRQ(ierr); 5820b3374bSStefano Zampini ierr = PetscOptionsFList("-A_mat_type","Matrix type","MatSetType",MatList,deft,A_mattype,256,&flgA);CHKERRQ(ierr); 5920b3374bSStefano Zampini ierr = PetscOptionsFList("-B_mat_type","Matrix type","MatSetType",MatList,deft,B_mattype,256,&flgB);CHKERRQ(ierr); 6020b3374bSStefano Zampini ierr = PetscOptionsEnd();CHKERRQ(ierr); 61c20d7725SJed Brown 62c20d7725SJed Brown ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[0],FILE_MODE_READ,&viewer);CHKERRQ(ierr); 63c20d7725SJed Brown ierr = MatCreate(PETSC_COMM_WORLD,&A_save);CHKERRQ(ierr); 64c20d7725SJed Brown ierr = MatLoad(A_save,viewer);CHKERRQ(ierr); 65c20d7725SJed Brown ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 66c20d7725SJed Brown 6720b3374bSStefano Zampini if (flg) { 68c20d7725SJed Brown ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[1],FILE_MODE_READ,&viewer);CHKERRQ(ierr); 69c20d7725SJed Brown ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr); 70c20d7725SJed Brown ierr = MatLoad(B,viewer);CHKERRQ(ierr); 71c20d7725SJed Brown ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 7220b3374bSStefano Zampini } else { 7320b3374bSStefano Zampini ierr = PetscObjectReference((PetscObject)A_save);CHKERRQ(ierr); 7420b3374bSStefano Zampini B = A_save; 7520b3374bSStefano Zampini } 7620b3374bSStefano Zampini 7720b3374bSStefano Zampini if (flgA) { 7820b3374bSStefano Zampini ierr = MatConvert(A_save,A_mattype,MAT_INPLACE_MATRIX,&A_save);CHKERRQ(ierr); 7920b3374bSStefano Zampini } 8020b3374bSStefano Zampini if (flgB) { 8120b3374bSStefano Zampini ierr = MatConvert(B,B_mattype,MAT_INPLACE_MATRIX,&B);CHKERRQ(ierr); 8220b3374bSStefano Zampini } 8320b3374bSStefano Zampini ierr = MatSetFromOptions(A_save);CHKERRQ(ierr); 8420b3374bSStefano Zampini ierr = MatSetFromOptions(B);CHKERRQ(ierr); 85c20d7725SJed Brown 86c20d7725SJed Brown ierr = MatGetType(B,&mattype);CHKERRQ(ierr); 87c20d7725SJed Brown 8820b3374bSStefano Zampini ierr = PetscMalloc(nzp*(sizeof(PetscInt)+sizeof(PetscScalar)),&idxn);CHKERRQ(ierr); 89c20d7725SJed Brown a = (PetscScalar*)(idxn + nzp); 90c20d7725SJed Brown 91c20d7725SJed Brown ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rdm);CHKERRQ(ierr); 92c20d7725SJed Brown ierr = PetscRandomSetFromOptions(rdm);CHKERRQ(ierr); 93c20d7725SJed Brown 94c20d7725SJed Brown /* 1) MatMatMult() */ 95c20d7725SJed Brown /* ----------------*/ 96c20d7725SJed Brown if (Test_MatMatMult) { 97c20d7725SJed Brown ierr = MatDuplicate(A_save,MAT_COPY_VALUES,&A);CHKERRQ(ierr); 98c20d7725SJed Brown 99c20d7725SJed Brown /* (1.1) Test developer API */ 100c20d7725SJed Brown ierr = MatProductCreate(A,B,NULL,&C);CHKERRQ(ierr); 10167b3012eSStefano Zampini ierr = MatSetOptionsPrefix(C,"AB_");CHKERRQ(ierr); 102c20d7725SJed Brown ierr = MatProductSetType(C,MATPRODUCT_AB);CHKERRQ(ierr); 1033e662e0bSHong Zhang ierr = MatProductSetAlgorithm(C,MATPRODUCTALGORITHMDEFAULT);CHKERRQ(ierr); 104c20d7725SJed Brown ierr = MatProductSetFill(C,PETSC_DEFAULT);CHKERRQ(ierr); 105c20d7725SJed Brown ierr = MatProductSetFromOptions(C);CHKERRQ(ierr); 106910fa13fSStefano Zampini /* we can inquire about MATOP_PRODUCTSYMBOLIC even if the destination matrix type has not been set yet */ 107910fa13fSStefano Zampini ierr = MatHasOperation(C,MATOP_PRODUCTSYMBOLIC,&flg);CHKERRQ(ierr); 108c20d7725SJed Brown ierr = MatProductSymbolic(C);CHKERRQ(ierr); 109c20d7725SJed Brown ierr = MatProductNumeric(C);CHKERRQ(ierr); 11020b3374bSStefano Zampini ierr = MatMatMultEqual(A,B,C,mcheck,&flg);CHKERRQ(ierr); 111*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(!flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Error in C=A*B"); 112c20d7725SJed Brown 113c20d7725SJed Brown /* Test reuse symbolic C */ 114c20d7725SJed Brown alpha = 0.9; 115c20d7725SJed Brown ierr = MatScale(A,alpha);CHKERRQ(ierr); 116c20d7725SJed Brown ierr = MatProductNumeric(C);CHKERRQ(ierr); 117c20d7725SJed Brown 11820b3374bSStefano Zampini ierr = MatMatMultEqual(A,B,C,mcheck,&flg);CHKERRQ(ierr); 119*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(!flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Error in C=A*B"); 120c20d7725SJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 121c20d7725SJed Brown 122c20d7725SJed Brown /* (1.2) Test user driver */ 123c20d7725SJed Brown ierr = MatMatMult(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 124c20d7725SJed Brown 125c20d7725SJed Brown /* Test MAT_REUSE_MATRIX - reuse symbolic C */ 126c20d7725SJed Brown alpha = 1.0; 127c20d7725SJed Brown for (i=0; i<2; i++) { 128c20d7725SJed Brown alpha -= 0.1; 129c20d7725SJed Brown ierr = MatScale(A,alpha);CHKERRQ(ierr); 130c20d7725SJed Brown ierr = MatMatMult(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 131c20d7725SJed Brown } 13220b3374bSStefano Zampini ierr = MatMatMultEqual(A,B,C,mcheck,&flg);CHKERRQ(ierr); 133*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(!flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Error: MatMatMult()"); 134c20d7725SJed Brown ierr = MatDestroy(&A);CHKERRQ(ierr); 1354417c5e8SHong Zhang 1364417c5e8SHong Zhang /* Test MatProductClear() */ 1374417c5e8SHong Zhang ierr = MatProductClear(C);CHKERRQ(ierr); 138c20d7725SJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 139544a5e07SHong Zhang 140544a5e07SHong Zhang /* Test MatMatMult() for dense and aij matrices */ 14120b3374bSStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)A,&flg,MATSEQAIJ,MATMPIAIJ,"");CHKERRQ(ierr); 14220b3374bSStefano Zampini if (flg) { 143544a5e07SHong Zhang ierr = MatConvert(A_save,MATDENSE,MAT_INITIAL_MATRIX,&A);CHKERRQ(ierr); 144544a5e07SHong Zhang ierr = MatMatMult(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 145544a5e07SHong Zhang ierr = MatDestroy(&C);CHKERRQ(ierr); 146544a5e07SHong Zhang ierr = MatDestroy(&A);CHKERRQ(ierr); 14720b3374bSStefano Zampini } 148c20d7725SJed Brown } 149c20d7725SJed Brown 150c20d7725SJed Brown /* Create P and R = P^T */ 151c20d7725SJed Brown /* --------------------- */ 15220b3374bSStefano Zampini ierr = MatGetSize(B,&PM,NULL);CHKERRQ(ierr); 15320b3374bSStefano Zampini if (PN < 0) PN = PM/2; 154c20d7725SJed Brown ierr = MatCreate(PETSC_COMM_WORLD,&P);CHKERRQ(ierr); 15520b3374bSStefano Zampini ierr = MatSetSizes(P,PETSC_DECIDE,PETSC_DECIDE,PM,PN);CHKERRQ(ierr); 156263f2b91SStefano Zampini ierr = MatSetType(P,MATAIJ);CHKERRQ(ierr); 157c20d7725SJed Brown ierr = MatSeqAIJSetPreallocation(P,nzp,NULL);CHKERRQ(ierr); 158c20d7725SJed Brown ierr = MatMPIAIJSetPreallocation(P,nzp,NULL,nzp,NULL);CHKERRQ(ierr); 159c20d7725SJed Brown ierr = MatGetOwnershipRange(P,&rstart,&rend);CHKERRQ(ierr); 160c20d7725SJed Brown for (i=0; i<nzp; i++) { 161c20d7725SJed Brown ierr = PetscRandomGetValue(rdm,&a[i]);CHKERRQ(ierr); 162c20d7725SJed Brown } 163c20d7725SJed Brown for (i=rstart; i<rend; i++) { 164c20d7725SJed Brown for (j=0; j<nzp; j++) { 165c20d7725SJed Brown ierr = PetscRandomGetValue(rdm,&rval);CHKERRQ(ierr); 166c20d7725SJed Brown idxn[j] = (PetscInt)(PetscRealPart(rval)*PN); 167c20d7725SJed Brown } 168c20d7725SJed Brown ierr = MatSetValues(P,1,&i,nzp,idxn,a,ADD_VALUES);CHKERRQ(ierr); 169c20d7725SJed Brown } 170c20d7725SJed Brown ierr = MatAssemblyBegin(P,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 171c20d7725SJed Brown ierr = MatAssemblyEnd(P,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 172c20d7725SJed Brown 173c20d7725SJed Brown ierr = MatTranspose(P,MAT_INITIAL_MATRIX,&R);CHKERRQ(ierr); 174263f2b91SStefano Zampini ierr = MatConvert(P,mattype,MAT_INPLACE_MATRIX,&P);CHKERRQ(ierr); 175263f2b91SStefano Zampini ierr = MatConvert(R,mattype,MAT_INPLACE_MATRIX,&R);CHKERRQ(ierr); 176263f2b91SStefano Zampini ierr = MatSetFromOptions(P);CHKERRQ(ierr); 17720b3374bSStefano Zampini ierr = MatSetFromOptions(R);CHKERRQ(ierr); 178c20d7725SJed Brown 179c20d7725SJed Brown /* 2) MatTransposeMatMult() */ 180c20d7725SJed Brown /* ------------------------ */ 181c20d7725SJed Brown if (Test_MatTrMat) { 182c20d7725SJed Brown /* (2.1) Test developer driver C = P^T*B */ 183c20d7725SJed Brown ierr = MatProductCreate(P,B,NULL,&C);CHKERRQ(ierr); 18467b3012eSStefano Zampini ierr = MatSetOptionsPrefix(C,"AtB_");CHKERRQ(ierr); 185c20d7725SJed Brown ierr = MatProductSetType(C,MATPRODUCT_AtB);CHKERRQ(ierr); 1863e662e0bSHong Zhang ierr = MatProductSetAlgorithm(C,MATPRODUCTALGORITHMDEFAULT);CHKERRQ(ierr); 187c20d7725SJed Brown ierr = MatProductSetFill(C,PETSC_DEFAULT);CHKERRQ(ierr); 188c20d7725SJed Brown ierr = MatProductSetFromOptions(C);CHKERRQ(ierr); 189263f2b91SStefano Zampini ierr = MatHasOperation(C,MATOP_PRODUCTSYMBOLIC,&flg);CHKERRQ(ierr); 190263f2b91SStefano Zampini if (flg) { /* run tests if supported */ 1910e1ed72eSHong Zhang ierr = MatProductSymbolic(C);CHKERRQ(ierr); /* equivalent to MatSetUp() */ 1920ad02fcaSStefano Zampini ierr = MatSetOption(C,MAT_USE_INODES,PETSC_FALSE);CHKERRQ(ierr); /* illustrate how to call MatSetOption() */ 193c20d7725SJed Brown ierr = MatProductNumeric(C);CHKERRQ(ierr); 19467b3012eSStefano Zampini ierr = MatProductNumeric(C);CHKERRQ(ierr); /* test reuse symbolic C */ 19567b3012eSStefano Zampini 19620b3374bSStefano Zampini ierr = MatTransposeMatMultEqual(P,B,C,mcheck,&flg);CHKERRQ(ierr); 197*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(!flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error: developer driver C = P^T*B"); 198c20d7725SJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 199c20d7725SJed Brown 200c20d7725SJed Brown /* (2.2) Test user driver C = P^T*B */ 201c20d7725SJed Brown ierr = MatTransposeMatMult(P,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 202c20d7725SJed Brown ierr = MatTransposeMatMult(P,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 203c20d7725SJed Brown ierr = MatGetInfo(C,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr); 2046718818eSStefano Zampini ierr = MatProductClear(C);CHKERRQ(ierr); 205c20d7725SJed Brown 206c20d7725SJed Brown /* Compare P^T*B and R*B */ 207c20d7725SJed Brown ierr = MatMatMult(R,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C1);CHKERRQ(ierr); 208c20d7725SJed Brown ierr = MatNormDifference(C,C1,&norm);CHKERRQ(ierr); 209*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(norm > PETSC_SMALL,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatTransposeMatMult(): %g",(double)norm); 210c20d7725SJed Brown ierr = MatDestroy(&C1);CHKERRQ(ierr); 211c20d7725SJed Brown 212c20d7725SJed Brown /* Test MatDuplicate() of C=P^T*B */ 213c20d7725SJed Brown ierr = MatDuplicate(C,MAT_COPY_VALUES,&C1);CHKERRQ(ierr); 214c20d7725SJed Brown ierr = MatDestroy(&C1);CHKERRQ(ierr); 215263f2b91SStefano Zampini } else { 216263f2b91SStefano Zampini ierr = PetscPrintf(PETSC_COMM_WORLD,"MatTransposeMatMult not supported\n");CHKERRQ(ierr); 217263f2b91SStefano Zampini } 218c20d7725SJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 219c20d7725SJed Brown } 220c20d7725SJed Brown 22167b3012eSStefano Zampini /* 3) MatMatTransposeMult() */ 222c20d7725SJed Brown /* ------------------------ */ 223c20d7725SJed Brown if (Test_MatMatTr) { 224c20d7725SJed Brown /* C = B*R^T */ 22520b3374bSStefano Zampini ierr = PetscObjectBaseTypeCompare((PetscObject)B,MATSEQAIJ,&seqaij);CHKERRQ(ierr); 22620b3374bSStefano Zampini if (seqaij) { 227c20d7725SJed Brown ierr = MatMatTransposeMult(B,R,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 22867b3012eSStefano Zampini ierr = MatSetOptionsPrefix(C,"ABt_");CHKERRQ(ierr); /* enable '-ABt_' for matrix C */ 229c20d7725SJed Brown ierr = MatGetInfo(C,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr); 230c20d7725SJed Brown 231c20d7725SJed Brown /* Test MAT_REUSE_MATRIX - reuse symbolic C */ 232c20d7725SJed Brown ierr = MatMatTransposeMult(B,R,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 233c20d7725SJed Brown 234c20d7725SJed Brown /* Check */ 235c20d7725SJed Brown ierr = MatMatMult(B,P,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C1);CHKERRQ(ierr); 236c20d7725SJed Brown ierr = MatNormDifference(C,C1,&norm);CHKERRQ(ierr); 237*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(norm > PETSC_SMALL,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatMatTransposeMult() %g",(double)norm); 238c20d7725SJed Brown ierr = MatDestroy(&C1);CHKERRQ(ierr); 239c20d7725SJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 240c20d7725SJed Brown } 241c20d7725SJed Brown } 242c20d7725SJed Brown 243c20d7725SJed Brown /* 4) Test MatPtAP() */ 244c20d7725SJed Brown /*-------------------*/ 245c20d7725SJed Brown if (Test_MatPtAP) { 246c20d7725SJed Brown ierr = MatDuplicate(A_save,MAT_COPY_VALUES,&A);CHKERRQ(ierr); 247c20d7725SJed Brown 248c20d7725SJed Brown /* (4.1) Test developer API */ 249c20d7725SJed Brown ierr = MatProductCreate(A,P,NULL,&C);CHKERRQ(ierr); 25067b3012eSStefano Zampini ierr = MatSetOptionsPrefix(C,"PtAP_");CHKERRQ(ierr); 251c20d7725SJed Brown ierr = MatProductSetType(C,MATPRODUCT_PtAP);CHKERRQ(ierr); 2523e662e0bSHong Zhang ierr = MatProductSetAlgorithm(C,MATPRODUCTALGORITHMDEFAULT);CHKERRQ(ierr); 253c20d7725SJed Brown ierr = MatProductSetFill(C,PETSC_DEFAULT);CHKERRQ(ierr); 254c20d7725SJed Brown ierr = MatProductSetFromOptions(C);CHKERRQ(ierr); 255c20d7725SJed Brown ierr = MatProductSymbolic(C);CHKERRQ(ierr); 256c20d7725SJed Brown ierr = MatProductNumeric(C);CHKERRQ(ierr); 25720b3374bSStefano Zampini ierr = MatPtAPMultEqual(A,P,C,mcheck,&flg);CHKERRQ(ierr); 258*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(!flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatProduct_PtAP"); 259c20d7725SJed Brown ierr = MatProductNumeric(C);CHKERRQ(ierr); /* reuse symbolic C */ 260c20d7725SJed Brown 26120b3374bSStefano Zampini ierr = MatPtAPMultEqual(A,P,C,mcheck,&flg);CHKERRQ(ierr); 262*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(!flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatProduct_PtAP"); 263c20d7725SJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 264c20d7725SJed Brown 265c20d7725SJed Brown /* (4.2) Test user driver */ 266c20d7725SJed Brown ierr = MatPtAP(A,P,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 267c20d7725SJed Brown 268c20d7725SJed Brown /* Test MAT_REUSE_MATRIX - reuse symbolic C */ 269c20d7725SJed Brown alpha = 1.0; 270c20d7725SJed Brown for (i=0; i<2; i++) { 271c20d7725SJed Brown alpha -= 0.1; 272c20d7725SJed Brown ierr = MatScale(A,alpha);CHKERRQ(ierr); 273c20d7725SJed Brown ierr = MatPtAP(A,P,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 274c20d7725SJed Brown } 27520b3374bSStefano Zampini ierr = MatPtAPMultEqual(A,P,C,mcheck,&flg);CHKERRQ(ierr); 276*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(!flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatPtAP"); 277c20d7725SJed Brown 278c20d7725SJed Brown /* 5) Test MatRARt() */ 279c20d7725SJed Brown /* ----------------- */ 280c20d7725SJed Brown if (Test_MatRARt) { 281c20d7725SJed Brown Mat RARt; 28267b3012eSStefano Zampini 28367b3012eSStefano Zampini /* (5.1) Test developer driver RARt = R*A*Rt */ 28467b3012eSStefano Zampini ierr = MatProductCreate(A,R,NULL,&RARt);CHKERRQ(ierr); 28567b3012eSStefano Zampini ierr = MatSetOptionsPrefix(RARt,"RARt_");CHKERRQ(ierr); 28667b3012eSStefano Zampini ierr = MatProductSetType(RARt,MATPRODUCT_RARt);CHKERRQ(ierr); 2873e662e0bSHong Zhang ierr = MatProductSetAlgorithm(RARt,MATPRODUCTALGORITHMDEFAULT);CHKERRQ(ierr); 28867b3012eSStefano Zampini ierr = MatProductSetFill(RARt,PETSC_DEFAULT);CHKERRQ(ierr); 28967b3012eSStefano Zampini ierr = MatProductSetFromOptions(RARt);CHKERRQ(ierr); 290263f2b91SStefano Zampini ierr = MatHasOperation(RARt,MATOP_PRODUCTSYMBOLIC,&flg);CHKERRQ(ierr); 291263f2b91SStefano Zampini if (flg) { 29267b3012eSStefano Zampini ierr = MatProductSymbolic(RARt);CHKERRQ(ierr); /* equivalent to MatSetUp() */ 29367b3012eSStefano Zampini ierr = MatSetOption(RARt,MAT_USE_INODES,PETSC_FALSE);CHKERRQ(ierr); /* illustrate how to call MatSetOption() */ 29467b3012eSStefano Zampini ierr = MatProductNumeric(RARt);CHKERRQ(ierr); 29567b3012eSStefano Zampini ierr = MatProductNumeric(RARt);CHKERRQ(ierr); /* test reuse symbolic RARt */ 29667b3012eSStefano Zampini ierr = MatDestroy(&RARt);CHKERRQ(ierr); 29767b3012eSStefano Zampini 29867b3012eSStefano Zampini /* (2.2) Test user driver RARt = R*A*Rt */ 299c20d7725SJed Brown ierr = MatRARt(A,R,MAT_INITIAL_MATRIX,2.0,&RARt);CHKERRQ(ierr); 300c20d7725SJed Brown ierr = MatRARt(A,R,MAT_REUSE_MATRIX,2.0,&RARt);CHKERRQ(ierr); 30167b3012eSStefano Zampini 302c20d7725SJed Brown ierr = MatNormDifference(C,RARt,&norm);CHKERRQ(ierr); 303*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(norm > PETSC_SMALL,PETSC_COMM_SELF,PETSC_ERR_PLIB,"|PtAP - RARt| = %g",(double)norm); 304263f2b91SStefano Zampini } else { 305263f2b91SStefano Zampini ierr = PetscPrintf(PETSC_COMM_WORLD,"MatRARt not supported\n");CHKERRQ(ierr); 306263f2b91SStefano Zampini } 307c20d7725SJed Brown ierr = MatDestroy(&RARt);CHKERRQ(ierr); 308c20d7725SJed Brown } 309c20d7725SJed Brown 310c20d7725SJed Brown ierr = MatDestroy(&A);CHKERRQ(ierr); 311c20d7725SJed Brown ierr = MatDestroy(&C);CHKERRQ(ierr); 312c20d7725SJed Brown } 313c20d7725SJed Brown 314c20d7725SJed Brown /* Destroy objects */ 315c20d7725SJed Brown ierr = PetscRandomDestroy(&rdm);CHKERRQ(ierr); 316c20d7725SJed Brown ierr = PetscFree(idxn);CHKERRQ(ierr); 317c20d7725SJed Brown 318c20d7725SJed Brown ierr = MatDestroy(&A_save);CHKERRQ(ierr); 319c20d7725SJed Brown ierr = MatDestroy(&B);CHKERRQ(ierr); 320c20d7725SJed Brown ierr = MatDestroy(&P);CHKERRQ(ierr); 321c20d7725SJed Brown ierr = MatDestroy(&R);CHKERRQ(ierr); 322c20d7725SJed Brown 323263f2b91SStefano Zampini ierr = PetscFinalize(); 324c20d7725SJed Brown return ierr; 325c20d7725SJed Brown } 326c20d7725SJed Brown 327c20d7725SJed Brown /*TEST 328c20d7725SJed Brown test: 329c20d7725SJed Brown suffix: 1 330dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 331c20d7725SJed Brown args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium 332c20d7725SJed Brown output_file: output/ex62_1.out 333c20d7725SJed Brown 334c20d7725SJed Brown test: 335c20d7725SJed Brown suffix: 2_ab_scalable 336dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 3373e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm scalable -matmatmult_via scalable -AtB_mat_product_algorithm outerproduct -mattransposematmult_via outerproduct 338c20d7725SJed Brown output_file: output/ex62_1.out 339c20d7725SJed Brown 340c20d7725SJed Brown test: 341c20d7725SJed Brown suffix: 3_ab_scalable_fast 342dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 3433e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm scalable_fast -matmatmult_via scalable_fast -matmattransmult_via color 344c20d7725SJed Brown output_file: output/ex62_1.out 345c20d7725SJed Brown 346c20d7725SJed Brown test: 347c20d7725SJed Brown suffix: 4_ab_heap 348dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 3493e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm heap -matmatmult_via heap -PtAP_mat_product_algorithm rap -matptap_via rap 350c20d7725SJed Brown output_file: output/ex62_1.out 351c20d7725SJed Brown 352c20d7725SJed Brown test: 353c20d7725SJed Brown suffix: 5_ab_btheap 354dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 3553e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm btheap -matmatmult_via btheap -matrart_via r*art 356c20d7725SJed Brown output_file: output/ex62_1.out 357c20d7725SJed Brown 358c20d7725SJed Brown test: 359c20d7725SJed Brown suffix: 6_ab_llcondensed 360dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 3613e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm llcondensed -matmatmult_via llcondensed -matrart_via coloring_rart 362c20d7725SJed Brown output_file: output/ex62_1.out 363c20d7725SJed Brown 364c20d7725SJed Brown test: 365c20d7725SJed Brown suffix: 7_ab_rowmerge 366dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 3673e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm rowmerge -matmatmult_via rowmerge 368c20d7725SJed Brown output_file: output/ex62_1.out 369c20d7725SJed Brown 370c20d7725SJed Brown test: 371c20d7725SJed Brown suffix: 8_ab_hypre 372dfd57a17SPierre Jolivet requires: hypre datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 3733e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm hypre -matmatmult_via hypre -PtAP_mat_product_algorithm hypre -matptap_via hypre 374c20d7725SJed Brown output_file: output/ex62_1.out 375c20d7725SJed Brown 376c20d7725SJed Brown test: 377263f2b91SStefano Zampini suffix: hypre_medium 378263f2b91SStefano Zampini nsize: {{1 3}} 379263f2b91SStefano Zampini requires: hypre datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 380263f2b91SStefano Zampini args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -A_mat_type hypre -B_mat_type hypre -test_rart 0 381263f2b91SStefano Zampini output_file: output/ex62_hypre.out 382263f2b91SStefano Zampini 383263f2b91SStefano Zampini test: 384263f2b91SStefano Zampini suffix: hypre_tiny 385263f2b91SStefano Zampini nsize: {{1 3}} 386263f2b91SStefano Zampini requires: hypre !complex double !defined(PETSC_USE_64BIT_INDICES) 387263f2b91SStefano Zampini args: -fA ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -fB ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -A_mat_type hypre -B_mat_type hypre -test_rart 0 388263f2b91SStefano Zampini output_file: output/ex62_hypre.out 389263f2b91SStefano Zampini 390263f2b91SStefano Zampini test: 391cec0a6c6SStefano Zampini suffix: 9_mkl 39215df37b9SStefano Zampini TODO: broken MatScale? 393b88df2e7SBarry Smith requires: mkl_sparse datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 394cec0a6c6SStefano Zampini args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -A_mat_type aijmkl -B_mat_type aijmkl 395cec0a6c6SStefano Zampini output_file: output/ex62_1.out 396cec0a6c6SStefano Zampini 397cec0a6c6SStefano Zampini test: 398c20d7725SJed Brown suffix: 10 399dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 400c20d7725SJed Brown nsize: 3 401c20d7725SJed Brown args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium 402c20d7725SJed Brown output_file: output/ex62_1.out 403c20d7725SJed Brown 404c20d7725SJed Brown test: 4053cea4f0aSStefano Zampini suffix: 10_backend 406dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 4073cea4f0aSStefano Zampini nsize: 3 4083e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm backend -matmatmult_via backend -AtB_mat_product_algorithm backend -mattransposematmult_via backend -PtAP_mat_product_algorithm backend -matptap_via backend 4093cea4f0aSStefano Zampini output_file: output/ex62_1.out 4103cea4f0aSStefano Zampini 4113cea4f0aSStefano Zampini test: 412c20d7725SJed Brown suffix: 11_ab_scalable 413dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 414c20d7725SJed Brown nsize: 3 4153e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm scalable -matmatmult_via scalable -AtB_mat_product_algorithm scalable -mattransposematmult_via scalable 416c20d7725SJed Brown output_file: output/ex62_1.out 417c20d7725SJed Brown 418c20d7725SJed Brown test: 419c20d7725SJed Brown suffix: 12_ab_seqmpi 420dfd57a17SPierre Jolivet requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 421c20d7725SJed Brown nsize: 3 4223e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm seqmpi -matmatmult_via seqmpi -AtB_mat_product_algorithm at*b -mattransposematmult_via at*b 423c20d7725SJed Brown output_file: output/ex62_1.out 424c20d7725SJed Brown 425c20d7725SJed Brown test: 426c20d7725SJed Brown suffix: 13_ab_hypre 427dfd57a17SPierre Jolivet requires: hypre datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 428c20d7725SJed Brown nsize: 3 4293e662e0bSHong Zhang args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -AB_mat_product_algorithm hypre -matmatmult_via hypre -PtAP_mat_product_algorithm hypre -matptap_via hypre 430c20d7725SJed Brown output_file: output/ex62_1.out 431c20d7725SJed Brown 43220b3374bSStefano Zampini test: 43320b3374bSStefano Zampini suffix: 14_seqaij 434dfd57a17SPierre Jolivet requires: !complex double !defined(PETSC_USE_64BIT_INDICES) 43520b3374bSStefano Zampini args: -fA ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -fB ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system 43620b3374bSStefano Zampini output_file: output/ex62_1.out 43720b3374bSStefano Zampini 43820b3374bSStefano Zampini test: 43920b3374bSStefano Zampini suffix: 14_seqaijcusparse 440dfd57a17SPierre Jolivet requires: cuda !complex double !defined(PETSC_USE_64BIT_INDICES) 4411a2c6b5cSJunchao Zhang args: -A_mat_type aijcusparse -B_mat_type aijcusparse -mat_form_explicit_transpose -fA ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -fB ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system 44220b3374bSStefano Zampini output_file: output/ex62_1.out 44320b3374bSStefano Zampini 44420b3374bSStefano Zampini test: 44565e4b4d4SStefano Zampini suffix: 14_seqaijcusparse_cpu 446dfd57a17SPierre Jolivet requires: cuda !complex double !defined(PETSC_USE_64BIT_INDICES) 4473e662e0bSHong Zhang args: -A_mat_type aijcusparse -B_mat_type aijcusparse -mat_form_explicit_transpose -fA ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -fB ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -AB_mat_product_algorithm_backend_cpu -matmatmult_backend_cpu -PtAP_mat_product_algorithm_backend_cpu -matptap_backend_cpu -RARt_mat_product_algorithm_backend_cpu -matrart_backend_cpu 44865e4b4d4SStefano Zampini output_file: output/ex62_1.out 44965e4b4d4SStefano Zampini 45065e4b4d4SStefano Zampini test: 4515cb69cabSStefano Zampini suffix: 14_mpiaijcusparse_seq 4525cb69cabSStefano Zampini nsize: 1 453dfd57a17SPierre Jolivet requires: cuda !complex double !defined(PETSC_USE_64BIT_INDICES) 4541a2c6b5cSJunchao Zhang args: -A_mat_type mpiaijcusparse -B_mat_type mpiaijcusparse -mat_form_explicit_transpose -fA ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -fB ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system 4555cb69cabSStefano Zampini output_file: output/ex62_1.out 4565cb69cabSStefano Zampini 4575cb69cabSStefano Zampini test: 45865e4b4d4SStefano Zampini suffix: 14_mpiaijcusparse_seq_cpu 45965e4b4d4SStefano Zampini nsize: 1 460dfd57a17SPierre Jolivet requires: cuda !complex double !defined(PETSC_USE_64BIT_INDICES) 4613e662e0bSHong Zhang args: -A_mat_type mpiaijcusparse -B_mat_type mpiaijcusparse -mat_form_explicit_transpose -fA ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -fB ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -AB_mat_product_algorithm_backend_cpu -matmatmult_backend_cpu -PtAP_mat_product_algorithm_backend_cpu -matptap_backend_cpu 46265e4b4d4SStefano Zampini output_file: output/ex62_1.out 46365e4b4d4SStefano Zampini 46465e4b4d4SStefano Zampini test: 4655cb69cabSStefano Zampini suffix: 14_mpiaijcusparse 4665cb69cabSStefano Zampini nsize: 3 467dfd57a17SPierre Jolivet requires: cuda !complex double !defined(PETSC_USE_64BIT_INDICES) 4681a2c6b5cSJunchao Zhang args: -A_mat_type mpiaijcusparse -B_mat_type mpiaijcusparse -mat_form_explicit_transpose -fA ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -fB ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system 4695cb69cabSStefano Zampini output_file: output/ex62_1.out 4705cb69cabSStefano Zampini 4715cb69cabSStefano Zampini test: 47265e4b4d4SStefano Zampini suffix: 14_mpiaijcusparse_cpu 47365e4b4d4SStefano Zampini nsize: 3 474dfd57a17SPierre Jolivet requires: cuda !complex double !defined(PETSC_USE_64BIT_INDICES) 4753e662e0bSHong Zhang args: -A_mat_type mpiaijcusparse -B_mat_type mpiaijcusparse -mat_form_explicit_transpose -fA ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -fB ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -AB_mat_product_algorithm_backend_cpu -matmatmult_backend_cpu -PtAP_mat_product_algorithm_backend_cpu -matptap_backend_cpu 47665e4b4d4SStefano Zampini output_file: output/ex62_1.out 47765e4b4d4SStefano Zampini 47865e4b4d4SStefano Zampini test: 479076ba34aSJunchao Zhang nsize: {{1 3}} 480076ba34aSJunchao Zhang suffix: 14_aijkokkos 4813078479eSJunchao Zhang requires: !sycl kokkos_kernels !complex double !defined(PETSC_USE_64BIT_INDICES) 48220b3374bSStefano Zampini args: -A_mat_type aijkokkos -B_mat_type aijkokkos -fA ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system -fB ${wPETSC_DIR}/share/petsc/datafiles/matrices/tiny_system 48320b3374bSStefano Zampini output_file: output/ex62_1.out 48420b3374bSStefano Zampini 4855cb69cabSStefano Zampini # these tests use matrices with many zero rows 48620b3374bSStefano Zampini test: 48720b3374bSStefano Zampini suffix: 15_seqaijcusparse 488dfd57a17SPierre Jolivet requires: cuda !complex double !defined(PETSC_USE_64BIT_INDICES) datafilespath 4891a2c6b5cSJunchao Zhang args: -A_mat_type aijcusparse -mat_form_explicit_transpose -fA ${DATAFILESPATH}/matrices/matmatmult/A4.BGriffith 49020b3374bSStefano Zampini output_file: output/ex62_1.out 4915cb69cabSStefano Zampini 4925cb69cabSStefano Zampini test: 4935cb69cabSStefano Zampini suffix: 15_mpiaijcusparse_seq 4945cb69cabSStefano Zampini nsize: 1 495dfd57a17SPierre Jolivet requires: cuda !complex double !defined(PETSC_USE_64BIT_INDICES) datafilespath 4961a2c6b5cSJunchao Zhang args: -A_mat_type mpiaijcusparse -mat_form_explicit_transpose -fA ${DATAFILESPATH}/matrices/matmatmult/A4.BGriffith 4975cb69cabSStefano Zampini output_file: output/ex62_1.out 4985cb69cabSStefano Zampini 4995cb69cabSStefano Zampini test: 5005cb69cabSStefano Zampini nsize: 3 5015cb69cabSStefano Zampini suffix: 15_mpiaijcusparse 502dfd57a17SPierre Jolivet requires: cuda !complex double !defined(PETSC_USE_64BIT_INDICES) datafilespath 5031a2c6b5cSJunchao Zhang args: -A_mat_type mpiaijcusparse -mat_form_explicit_transpose -fA ${DATAFILESPATH}/matrices/matmatmult/A4.BGriffith 5045cb69cabSStefano Zampini output_file: output/ex62_1.out 5055cb69cabSStefano Zampini 506c20d7725SJed Brown TEST*/ 507