xref: /petsc/src/mat/tests/ex62.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
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