xref: /petsc/src/mat/tests/ex62.c (revision c20d77252dee0f9c80fc6f8b1a6f948e11175edb)
1*c20d7725SJed Brown 
2*c20d7725SJed Brown static char help[] = "Test Matrix products for AIJ matrices\n\
3*c20d7725SJed Brown Input arguments are:\n\
4*c20d7725SJed Brown   -fA <input_file> -fB <input_file> -fC <input_file>: file to load\n\n";
5*c20d7725SJed Brown /* Example of usage:
6*c20d7725SJed Brown    ./ex62 -fA <A_binary> -fB <B_binary>
7*c20d7725SJed Brown    mpiexec -n 3 ./ex62 -fA medium -fB medium
8*c20d7725SJed Brown */
9*c20d7725SJed Brown 
10*c20d7725SJed Brown #include <petscmat.h>
11*c20d7725SJed Brown 
12*c20d7725SJed Brown /*
13*c20d7725SJed Brown      B = A - B
14*c20d7725SJed Brown      norm = norm(B)
15*c20d7725SJed Brown */
16*c20d7725SJed Brown PetscErrorCode MatNormDifference(Mat A,Mat B,PetscReal *norm)
17*c20d7725SJed Brown {
18*c20d7725SJed Brown   PetscErrorCode ierr;
19*c20d7725SJed Brown 
20*c20d7725SJed Brown   PetscFunctionBegin;
21*c20d7725SJed Brown   ierr = MatAXPY(B,-1.0,A,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
22*c20d7725SJed Brown   ierr = MatNorm(B,NORM_FROBENIUS,norm);CHKERRQ(ierr);
23*c20d7725SJed Brown   PetscFunctionReturn(0);
24*c20d7725SJed Brown }
25*c20d7725SJed Brown 
26*c20d7725SJed Brown int main(int argc,char **args)
27*c20d7725SJed Brown {
28*c20d7725SJed Brown   Mat            A,A_save,B,C,P,C1,R;
29*c20d7725SJed Brown   PetscViewer    viewer;
30*c20d7725SJed Brown   PetscErrorCode ierr;
31*c20d7725SJed Brown   PetscMPIInt    size,rank;
32*c20d7725SJed Brown   PetscInt       i,j,*idxn,M,N,nzp,PN,rstart,rend;
33*c20d7725SJed Brown   PetscReal      norm;
34*c20d7725SJed Brown   PetscRandom    rdm;
35*c20d7725SJed Brown   char           file[2][128];
36*c20d7725SJed Brown   PetscScalar    *a,rval,alpha;
37*c20d7725SJed Brown   PetscBool      Test_MatMatMult=PETSC_TRUE,Test_MatTrMat=PETSC_TRUE,Test_MatMatTr=PETSC_TRUE;
38*c20d7725SJed Brown   PetscBool      Test_MatPtAP=PETSC_TRUE,Test_MatRARt=PETSC_TRUE,flg,seqaij;
39*c20d7725SJed Brown   MatInfo        info;
40*c20d7725SJed Brown   MatType        mattype;
41*c20d7725SJed Brown 
42*c20d7725SJed Brown   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
43*c20d7725SJed Brown   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
44*c20d7725SJed Brown   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
45*c20d7725SJed Brown 
46*c20d7725SJed Brown   /*  Load the matrices A_save and B */
47*c20d7725SJed Brown   ierr = PetscOptionsGetString(NULL,NULL,"-fA",file[0],sizeof(file[0]),&flg);CHKERRQ(ierr);
48*c20d7725SJed Brown   if (!flg) SETERRQ(PETSC_COMM_WORLD,1,"Must indicate a file name for small matrix A with the -fA option.");
49*c20d7725SJed Brown   ierr = PetscOptionsGetString(NULL,NULL,"-fB",file[1],sizeof(file[1]),&flg);CHKERRQ(ierr);
50*c20d7725SJed Brown   if (!flg) SETERRQ(PETSC_COMM_WORLD,1,"Must indicate a file name for small matrix B with the -fB option.");
51*c20d7725SJed Brown 
52*c20d7725SJed Brown   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[0],FILE_MODE_READ,&viewer);CHKERRQ(ierr);
53*c20d7725SJed Brown   ierr = MatCreate(PETSC_COMM_WORLD,&A_save);CHKERRQ(ierr);
54*c20d7725SJed Brown   ierr = MatSetFromOptions(A_save);CHKERRQ(ierr);
55*c20d7725SJed Brown   ierr = MatLoad(A_save,viewer);CHKERRQ(ierr);
56*c20d7725SJed Brown   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
57*c20d7725SJed Brown 
58*c20d7725SJed Brown   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[1],FILE_MODE_READ,&viewer);CHKERRQ(ierr);
59*c20d7725SJed Brown   ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr);
60*c20d7725SJed Brown   ierr = MatSetFromOptions(B);CHKERRQ(ierr);
61*c20d7725SJed Brown   ierr = MatLoad(B,viewer);CHKERRQ(ierr);
62*c20d7725SJed Brown   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
63*c20d7725SJed Brown 
64*c20d7725SJed Brown   ierr = MatGetType(B,&mattype);CHKERRQ(ierr);
65*c20d7725SJed Brown 
66*c20d7725SJed Brown   ierr = MatGetSize(B,&M,&N);CHKERRQ(ierr);
67*c20d7725SJed Brown   nzp  = PetscMax((PetscInt)(0.1*M),5);
68*c20d7725SJed Brown   ierr = PetscMalloc((nzp+1)*(sizeof(PetscInt)+sizeof(PetscScalar)),&idxn);CHKERRQ(ierr);
69*c20d7725SJed Brown   a    = (PetscScalar*)(idxn + nzp);
70*c20d7725SJed Brown 
71*c20d7725SJed Brown   ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rdm);CHKERRQ(ierr);
72*c20d7725SJed Brown   ierr = PetscRandomSetFromOptions(rdm);CHKERRQ(ierr);
73*c20d7725SJed Brown 
74*c20d7725SJed Brown   /* 1) MatMatMult() */
75*c20d7725SJed Brown   /* ----------------*/
76*c20d7725SJed Brown   if (Test_MatMatMult) {
77*c20d7725SJed Brown     ierr = MatDuplicate(A_save,MAT_COPY_VALUES,&A);CHKERRQ(ierr);
78*c20d7725SJed Brown 
79*c20d7725SJed Brown     /* (1.1) Test developer API */
80*c20d7725SJed Brown     ierr = MatProductCreate(A,B,NULL,&C);CHKERRQ(ierr);
81*c20d7725SJed Brown     ierr = MatProductSetType(C,MATPRODUCT_AB);CHKERRQ(ierr);
82*c20d7725SJed Brown     ierr = MatProductSetAlgorithm(C,"default");CHKERRQ(ierr);
83*c20d7725SJed Brown     ierr = MatProductSetFill(C,PETSC_DEFAULT);CHKERRQ(ierr);
84*c20d7725SJed Brown     ierr = MatProductSetFromOptions(C);CHKERRQ(ierr);
85*c20d7725SJed Brown     ierr = MatProductSymbolic(C);CHKERRQ(ierr);
86*c20d7725SJed Brown     ierr = MatProductNumeric(C);CHKERRQ(ierr);
87*c20d7725SJed Brown 
88*c20d7725SJed Brown     /* Test reuse symbolic C */
89*c20d7725SJed Brown     alpha = 0.9;
90*c20d7725SJed Brown     ierr = MatScale(A,alpha);CHKERRQ(ierr);
91*c20d7725SJed Brown     ierr = MatProductNumeric(C);CHKERRQ(ierr);
92*c20d7725SJed Brown 
93*c20d7725SJed Brown     ierr = MatMatMultEqual(A,B,C,10,&flg);CHKERRQ(ierr);
94*c20d7725SJed Brown     if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Error in C=A*B");
95*c20d7725SJed Brown     ierr = MatDestroy(&C);CHKERRQ(ierr);
96*c20d7725SJed Brown 
97*c20d7725SJed Brown     /* (1.2) Test user driver */
98*c20d7725SJed Brown     ierr = MatMatMult(A,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr);
99*c20d7725SJed Brown 
100*c20d7725SJed Brown     /* Test MAT_REUSE_MATRIX - reuse symbolic C */
101*c20d7725SJed Brown     alpha = 1.0;
102*c20d7725SJed Brown     for (i=0; i<2; i++) {
103*c20d7725SJed Brown       alpha -= 0.1;
104*c20d7725SJed Brown       ierr   = MatScale(A,alpha);CHKERRQ(ierr);
105*c20d7725SJed Brown       ierr   = MatMatMult(A,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr);
106*c20d7725SJed Brown     }
107*c20d7725SJed Brown     ierr = MatMatMultEqual(A,B,C,10,&flg);CHKERRQ(ierr);
108*c20d7725SJed Brown     if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Error: MatMatMult()");
109*c20d7725SJed Brown     ierr = MatDestroy(&A);CHKERRQ(ierr);
110*c20d7725SJed Brown     ierr = MatDestroy(&C);CHKERRQ(ierr);
111*c20d7725SJed Brown   }
112*c20d7725SJed Brown 
113*c20d7725SJed Brown   /* Create P and R = P^T  */
114*c20d7725SJed Brown   /* --------------------- */
115*c20d7725SJed Brown   PN   = M/2;
116*c20d7725SJed Brown   nzp  = 5; /* num of nonzeros in each row of P */
117*c20d7725SJed Brown   ierr = MatCreate(PETSC_COMM_WORLD,&P);CHKERRQ(ierr);
118*c20d7725SJed Brown   ierr = MatSetSizes(P,PETSC_DECIDE,PETSC_DECIDE,M,PN);CHKERRQ(ierr);
119*c20d7725SJed Brown   ierr = MatSetType(P,mattype);CHKERRQ(ierr);
120*c20d7725SJed Brown   ierr = MatSeqAIJSetPreallocation(P,nzp,NULL);CHKERRQ(ierr);
121*c20d7725SJed Brown   ierr = MatMPIAIJSetPreallocation(P,nzp,NULL,nzp,NULL);CHKERRQ(ierr);
122*c20d7725SJed Brown   ierr = MatGetOwnershipRange(P,&rstart,&rend);CHKERRQ(ierr);
123*c20d7725SJed Brown   for (i=0; i<nzp; i++) {
124*c20d7725SJed Brown     ierr = PetscRandomGetValue(rdm,&a[i]);CHKERRQ(ierr);
125*c20d7725SJed Brown   }
126*c20d7725SJed Brown   for (i=rstart; i<rend; i++) {
127*c20d7725SJed Brown     for (j=0; j<nzp; j++) {
128*c20d7725SJed Brown       ierr    = PetscRandomGetValue(rdm,&rval);CHKERRQ(ierr);
129*c20d7725SJed Brown       idxn[j] = (PetscInt)(PetscRealPart(rval)*PN);
130*c20d7725SJed Brown     }
131*c20d7725SJed Brown     ierr = MatSetValues(P,1,&i,nzp,idxn,a,ADD_VALUES);CHKERRQ(ierr);
132*c20d7725SJed Brown   }
133*c20d7725SJed Brown   ierr = MatAssemblyBegin(P,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
134*c20d7725SJed Brown   ierr = MatAssemblyEnd(P,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
135*c20d7725SJed Brown 
136*c20d7725SJed Brown   ierr = MatTranspose(P,MAT_INITIAL_MATRIX,&R);CHKERRQ(ierr);
137*c20d7725SJed Brown 
138*c20d7725SJed Brown   /* 2) MatTransposeMatMult() */
139*c20d7725SJed Brown   /* ------------------------ */
140*c20d7725SJed Brown   if (Test_MatTrMat) {
141*c20d7725SJed Brown     /* (2.1) Test developer driver C = P^T*B */
142*c20d7725SJed Brown     ierr = MatProductCreate(P,B,NULL,&C);CHKERRQ(ierr);
143*c20d7725SJed Brown     ierr = MatProductSetType(C,MATPRODUCT_AtB);CHKERRQ(ierr);
144*c20d7725SJed Brown     ierr = MatProductSetAlgorithm(C,"default");CHKERRQ(ierr);
145*c20d7725SJed Brown     ierr = MatProductSetFill(C,PETSC_DEFAULT);CHKERRQ(ierr);
146*c20d7725SJed Brown     ierr = MatProductSetFromOptions(C);CHKERRQ(ierr);
147*c20d7725SJed Brown     ierr = MatProductSymbolic(C);CHKERRQ(ierr);
148*c20d7725SJed Brown     ierr = MatProductNumeric(C);CHKERRQ(ierr);
149*c20d7725SJed Brown     ierr = MatProductNumeric(C);CHKERRQ(ierr);
150*c20d7725SJed Brown     ierr = MatTransposeMatMultEqual(P,B,C,10,&flg);CHKERRQ(ierr);
151*c20d7725SJed Brown     if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error: developer driver C = P^T*B");
152*c20d7725SJed Brown     ierr = MatDestroy(&C);CHKERRQ(ierr);
153*c20d7725SJed Brown 
154*c20d7725SJed Brown     /* (2.2) Test user driver C = P^T*B */
155*c20d7725SJed Brown     ierr = MatTransposeMatMult(P,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr);
156*c20d7725SJed Brown     ierr = MatTransposeMatMult(P,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr);
157*c20d7725SJed Brown     ierr = MatGetInfo(C,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr);
158*c20d7725SJed Brown     ierr = MatFreeIntermediateDataStructures(C);CHKERRQ(ierr);
159*c20d7725SJed Brown 
160*c20d7725SJed Brown     /* Compare P^T*B and R*B */
161*c20d7725SJed Brown     ierr = MatMatMult(R,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C1);CHKERRQ(ierr);
162*c20d7725SJed Brown     ierr = MatNormDifference(C,C1,&norm);CHKERRQ(ierr);
163*c20d7725SJed Brown     if (norm > PETSC_SMALL) SETERRQ1(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatTransposeMatMult(): %g",(double)norm);
164*c20d7725SJed Brown     ierr = MatDestroy(&C1);CHKERRQ(ierr);
165*c20d7725SJed Brown 
166*c20d7725SJed Brown     /* Test MatDuplicate() of C=P^T*B */
167*c20d7725SJed Brown     ierr = MatDuplicate(C,MAT_COPY_VALUES,&C1);CHKERRQ(ierr);
168*c20d7725SJed Brown     ierr = MatDestroy(&C1);CHKERRQ(ierr);
169*c20d7725SJed Brown     ierr = MatDestroy(&C);CHKERRQ(ierr);
170*c20d7725SJed Brown   }
171*c20d7725SJed Brown 
172*c20d7725SJed Brown   /* 3) MatTransposeMatMult() */
173*c20d7725SJed Brown   /* ------------------------ */
174*c20d7725SJed Brown   if (Test_MatMatTr) {
175*c20d7725SJed Brown     /* C = B*R^T */
176*c20d7725SJed Brown     ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQAIJ,&seqaij);CHKERRQ(ierr);
177*c20d7725SJed Brown     if (size == 1 && seqaij) {
178*c20d7725SJed Brown       ierr = MatMatTransposeMult(B,R,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr);
179*c20d7725SJed Brown       ierr = MatSetOptionsPrefix(C,"matmatmulttr_");CHKERRQ(ierr); /* enable '-matmatmulttr_' for matrix C */
180*c20d7725SJed Brown       ierr = MatGetInfo(C,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr);
181*c20d7725SJed Brown 
182*c20d7725SJed Brown       /* Test MAT_REUSE_MATRIX - reuse symbolic C */
183*c20d7725SJed Brown       ierr = MatMatTransposeMult(B,R,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr);
184*c20d7725SJed Brown 
185*c20d7725SJed Brown       /* Check */
186*c20d7725SJed Brown       ierr = MatMatMult(B,P,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C1);CHKERRQ(ierr);
187*c20d7725SJed Brown       ierr = MatNormDifference(C,C1,&norm);CHKERRQ(ierr);
188*c20d7725SJed Brown       if (norm > PETSC_SMALL) SETERRQ1(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatMatTransposeMult() %g",(double)norm);
189*c20d7725SJed Brown       ierr = MatDestroy(&C1);CHKERRQ(ierr);
190*c20d7725SJed Brown       ierr = MatDestroy(&C);CHKERRQ(ierr);
191*c20d7725SJed Brown     }
192*c20d7725SJed Brown   }
193*c20d7725SJed Brown 
194*c20d7725SJed Brown   /* 4) Test MatPtAP() */
195*c20d7725SJed Brown   /*-------------------*/
196*c20d7725SJed Brown   if (Test_MatPtAP) {
197*c20d7725SJed Brown     ierr = MatDuplicate(A_save,MAT_COPY_VALUES,&A);CHKERRQ(ierr);
198*c20d7725SJed Brown 
199*c20d7725SJed Brown     /* (4.1) Test developer API */
200*c20d7725SJed Brown     ierr = MatProductCreate(A,P,NULL,&C);CHKERRQ(ierr);
201*c20d7725SJed Brown     ierr = MatProductSetType(C,MATPRODUCT_PtAP);CHKERRQ(ierr);
202*c20d7725SJed Brown     ierr = MatProductSetAlgorithm(C,"default");CHKERRQ(ierr);
203*c20d7725SJed Brown     ierr = MatProductSetFill(C,PETSC_DEFAULT);CHKERRQ(ierr);
204*c20d7725SJed Brown     ierr = MatProductSetFromOptions(C);CHKERRQ(ierr);
205*c20d7725SJed Brown     ierr = MatProductSymbolic(C);CHKERRQ(ierr);
206*c20d7725SJed Brown     ierr = MatProductNumeric(C);CHKERRQ(ierr);
207*c20d7725SJed Brown     ierr = MatProductNumeric(C);CHKERRQ(ierr); /* reuse symbolic C */
208*c20d7725SJed Brown 
209*c20d7725SJed Brown     ierr = MatPtAPMultEqual(A,P,C,10,&flg);CHKERRQ(ierr);
210*c20d7725SJed Brown     if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatProduct_PtAP");
211*c20d7725SJed Brown     ierr = MatDestroy(&C);CHKERRQ(ierr);
212*c20d7725SJed Brown 
213*c20d7725SJed Brown     /* (4.2) Test user driver */
214*c20d7725SJed Brown     ierr = MatPtAP(A,P,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr);
215*c20d7725SJed Brown 
216*c20d7725SJed Brown     /* Test MAT_REUSE_MATRIX - reuse symbolic C */
217*c20d7725SJed Brown     alpha=1.0;
218*c20d7725SJed Brown     for (i=0; i<2; i++) {
219*c20d7725SJed Brown       alpha -= 0.1;
220*c20d7725SJed Brown       ierr   = MatScale(A,alpha);CHKERRQ(ierr);
221*c20d7725SJed Brown       ierr   = MatPtAP(A,P,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr);
222*c20d7725SJed Brown     }
223*c20d7725SJed Brown 
224*c20d7725SJed Brown     ierr = MatPtAPMultEqual(A,P,C,10,&flg);CHKERRQ(ierr);
225*c20d7725SJed Brown     if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Error in MatPtAP");
226*c20d7725SJed Brown 
227*c20d7725SJed Brown     /* 5) Test MatRARt() */
228*c20d7725SJed Brown     /* ----------------- */
229*c20d7725SJed Brown     if (Test_MatRARt) {
230*c20d7725SJed Brown       Mat RARt;
231*c20d7725SJed Brown       ierr = MatTranspose(P,MAT_REUSE_MATRIX,&R);CHKERRQ(ierr);
232*c20d7725SJed Brown       ierr = MatRARt(A,R,MAT_INITIAL_MATRIX,2.0,&RARt);CHKERRQ(ierr);
233*c20d7725SJed Brown       ierr = MatRARt(A,R,MAT_REUSE_MATRIX,2.0,&RARt);CHKERRQ(ierr);
234*c20d7725SJed Brown       ierr = MatNormDifference(C,RARt,&norm);CHKERRQ(ierr);
235*c20d7725SJed Brown       if (norm > PETSC_SMALL) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"|PtAP - RARt| = %g",(double)norm);
236*c20d7725SJed Brown       ierr = MatDestroy(&RARt);CHKERRQ(ierr);
237*c20d7725SJed Brown     }
238*c20d7725SJed Brown 
239*c20d7725SJed Brown     ierr = MatDestroy(&A);CHKERRQ(ierr);
240*c20d7725SJed Brown     ierr = MatDestroy(&C);CHKERRQ(ierr);
241*c20d7725SJed Brown   }
242*c20d7725SJed Brown 
243*c20d7725SJed Brown   /* Destroy objects */
244*c20d7725SJed Brown   ierr = PetscRandomDestroy(&rdm);CHKERRQ(ierr);
245*c20d7725SJed Brown   ierr = PetscFree(idxn);CHKERRQ(ierr);
246*c20d7725SJed Brown 
247*c20d7725SJed Brown   ierr = MatDestroy(&A_save);CHKERRQ(ierr);
248*c20d7725SJed Brown   ierr = MatDestroy(&B);CHKERRQ(ierr);
249*c20d7725SJed Brown   ierr = MatDestroy(&P);CHKERRQ(ierr);
250*c20d7725SJed Brown   ierr = MatDestroy(&R);CHKERRQ(ierr);
251*c20d7725SJed Brown 
252*c20d7725SJed Brown   PetscFinalize();
253*c20d7725SJed Brown   return ierr;
254*c20d7725SJed Brown }
255*c20d7725SJed Brown 
256*c20d7725SJed Brown /*TEST
257*c20d7725SJed Brown    test:
258*c20d7725SJed Brown      suffix: 1
259*c20d7725SJed Brown      requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
260*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium
261*c20d7725SJed Brown      output_file: output/ex62_1.out
262*c20d7725SJed Brown 
263*c20d7725SJed Brown    test:
264*c20d7725SJed Brown      suffix: 2_ab_scalable
265*c20d7725SJed Brown      requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
266*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -matproduct_ab_via scalable -matmatmult_via scalable -matproduct_atb_via outerproduct -mattransposematmult_via outerproduct
267*c20d7725SJed Brown      output_file: output/ex62_1.out
268*c20d7725SJed Brown 
269*c20d7725SJed Brown    test:
270*c20d7725SJed Brown      suffix: 3_ab_scalable_fast
271*c20d7725SJed Brown      requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
272*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -matproduct_ab_via scalable_fast -matmatmult_via scalable_fast -matmattransmult_via color
273*c20d7725SJed Brown      output_file: output/ex62_1.out
274*c20d7725SJed Brown 
275*c20d7725SJed Brown    test:
276*c20d7725SJed Brown      suffix: 4_ab_heap
277*c20d7725SJed Brown      requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
278*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -matproduct_ab_via heap -matmatmult_via heap -matproduct_ptap_via rap -matptap_via rap
279*c20d7725SJed Brown      output_file: output/ex62_1.out
280*c20d7725SJed Brown 
281*c20d7725SJed Brown    test:
282*c20d7725SJed Brown      suffix: 5_ab_btheap
283*c20d7725SJed Brown      requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
284*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -matproduct_ab_via btheap -matmatmult_via btheap -matrart_via r*art
285*c20d7725SJed Brown      output_file: output/ex62_1.out
286*c20d7725SJed Brown 
287*c20d7725SJed Brown    test:
288*c20d7725SJed Brown      suffix: 6_ab_llcondensed
289*c20d7725SJed Brown      requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
290*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -matproduct_ab_via llcondensed -matmatmult_via llcondensed -matrart_via coloring_rart
291*c20d7725SJed Brown      output_file: output/ex62_1.out
292*c20d7725SJed Brown 
293*c20d7725SJed Brown    test:
294*c20d7725SJed Brown      suffix: 7_ab_rowmerge
295*c20d7725SJed Brown      requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
296*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -matproduct_ab_via rowmerge -matmatmult_via rowmerge
297*c20d7725SJed Brown      output_file: output/ex62_1.out
298*c20d7725SJed Brown 
299*c20d7725SJed Brown    test:
300*c20d7725SJed Brown      suffix: 8_ab_hypre
301*c20d7725SJed Brown      requires: hypre datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
302*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -matproduct_ab_via hypre -matmatmult_via hypre -matproduct_ptap_via hypre -matptap_via hypre
303*c20d7725SJed Brown      output_file: output/ex62_1.out
304*c20d7725SJed Brown 
305*c20d7725SJed Brown    test:
306*c20d7725SJed Brown      suffix: 10
307*c20d7725SJed Brown      requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
308*c20d7725SJed Brown      nsize: 3
309*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium
310*c20d7725SJed Brown      output_file: output/ex62_1.out
311*c20d7725SJed Brown 
312*c20d7725SJed Brown    test:
313*c20d7725SJed Brown      suffix: 11_ab_scalable
314*c20d7725SJed Brown      requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
315*c20d7725SJed Brown      nsize: 3
316*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -matproduct_ab_via scalable -matmatmult_via scalable -matproduct_atb_via scalable -mattransposematmult_via scalable
317*c20d7725SJed Brown      output_file: output/ex62_1.out
318*c20d7725SJed Brown 
319*c20d7725SJed Brown    test:
320*c20d7725SJed Brown      suffix: 12_ab_seqmpi
321*c20d7725SJed Brown      requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
322*c20d7725SJed Brown      nsize: 3
323*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -matproduct_ab_via seqmpi -matmatmult_via seqmpi -matproduct_atb_via at*b -mattransposematmult_via at*b
324*c20d7725SJed Brown      output_file: output/ex62_1.out
325*c20d7725SJed Brown 
326*c20d7725SJed Brown    test:
327*c20d7725SJed Brown      suffix: 13_ab_hypre
328*c20d7725SJed Brown      requires: hypre datafilespath !complex double !define(PETSC_USE_64BIT_INDICES)
329*c20d7725SJed Brown      nsize: 3
330*c20d7725SJed Brown      args: -fA ${DATAFILESPATH}/matrices/medium -fB ${DATAFILESPATH}/matrices/medium -matproduct_ab_via hypre -matmatmult_via hypre -matproduct_ptap_via hypre -matptap_via hypre
331*c20d7725SJed Brown      output_file: output/ex62_1.out
332*c20d7725SJed Brown 
333*c20d7725SJed Brown TEST*/
334