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