1*1cdffd5eSHong Zhang static char help[] = "Test MatProductReplaceMats() \n\ 2*1cdffd5eSHong Zhang Modified from the code contributed by Pierre Jolivet \n\n"; 3*1cdffd5eSHong Zhang 4*1cdffd5eSHong Zhang #include <petscmat.h> 5*1cdffd5eSHong Zhang 6*1cdffd5eSHong Zhang int main(int argc,char **args) 7*1cdffd5eSHong Zhang { 8*1cdffd5eSHong Zhang PetscInt n = 2,convert; 9*1cdffd5eSHong Zhang Mat A,B,Bdense,Conjugate; 10*1cdffd5eSHong Zhang PetscBool conjugate = PETSC_FALSE,equal,flg; 11*1cdffd5eSHong Zhang 12*1cdffd5eSHong Zhang PetscFunctionBeginUser; 13*1cdffd5eSHong Zhang PetscCall(PetscInitialize(&argc,&args,NULL,help)); 14*1cdffd5eSHong Zhang 15*1cdffd5eSHong Zhang PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); 16*1cdffd5eSHong Zhang PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n)); 17*1cdffd5eSHong Zhang PetscCall(MatSetType(A,MATDENSE)); 18*1cdffd5eSHong Zhang PetscCall(MatSetFromOptions(A)); 19*1cdffd5eSHong Zhang PetscCall(MatSeqDenseSetPreallocation(A,NULL)); 20*1cdffd5eSHong Zhang PetscCall(MatMPIDenseSetPreallocation(A,NULL)); 21*1cdffd5eSHong Zhang PetscCall(MatSetRandom(A,NULL)); 22*1cdffd5eSHong Zhang PetscCall(MatViewFromOptions(A,NULL,"-A_view")); 23*1cdffd5eSHong Zhang PetscCall(PetscOptionsGetBool(NULL,NULL,"-conjugate",&conjugate,NULL)); 24*1cdffd5eSHong Zhang 25*1cdffd5eSHong Zhang for (convert = 0; convert<2; convert++) { 26*1cdffd5eSHong Zhang /* convert dense matrix A to aij format */ 27*1cdffd5eSHong Zhang if (convert) PetscCall(MatConvert(A,MATAIJ,MAT_INPLACE_MATRIX,&A)); 28*1cdffd5eSHong Zhang 29*1cdffd5eSHong Zhang /* compute B = A^T * A or B = A^H * A */ 30*1cdffd5eSHong Zhang PetscCall(MatProductCreate(A,A,NULL,&B)); 31*1cdffd5eSHong Zhang 32*1cdffd5eSHong Zhang flg = PETSC_FALSE; 33*1cdffd5eSHong Zhang PetscCall(PetscOptionsGetBool(NULL,NULL,"-atb",&flg,NULL)); 34*1cdffd5eSHong Zhang if (flg) { 35*1cdffd5eSHong Zhang PetscCall(MatProductSetType(B,MATPRODUCT_AtB)); 36*1cdffd5eSHong Zhang } else { 37*1cdffd5eSHong Zhang PetscCall(PetscOptionsGetBool(NULL,NULL,"-ptap",&flg,NULL)); 38*1cdffd5eSHong Zhang if (flg) { 39*1cdffd5eSHong Zhang PetscCall(MatProductSetType(B,MATPRODUCT_PtAP)); 40*1cdffd5eSHong Zhang } else { 41*1cdffd5eSHong Zhang PetscCall(PetscOptionsGetBool(NULL,NULL,"-abt",&flg,NULL)); 42*1cdffd5eSHong Zhang if (flg) { 43*1cdffd5eSHong Zhang PetscCall(MatProductSetType(B,MATPRODUCT_ABt)); 44*1cdffd5eSHong Zhang } else { 45*1cdffd5eSHong Zhang PetscCall(MatProductSetType(B,MATPRODUCT_AB)); 46*1cdffd5eSHong Zhang } 47*1cdffd5eSHong Zhang } 48*1cdffd5eSHong Zhang } 49*1cdffd5eSHong Zhang PetscCall(MatProductSetFromOptions(B)); 50*1cdffd5eSHong Zhang PetscCall(MatProductSymbolic(B)); 51*1cdffd5eSHong Zhang 52*1cdffd5eSHong Zhang PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &Conjugate)); 53*1cdffd5eSHong Zhang if (conjugate) PetscCall(MatConjugate(Conjugate)); 54*1cdffd5eSHong Zhang 55*1cdffd5eSHong Zhang /* replace input A by Conjugate */ 56*1cdffd5eSHong Zhang PetscCall(MatProductReplaceMats(Conjugate,NULL,NULL,B)); 57*1cdffd5eSHong Zhang 58*1cdffd5eSHong Zhang PetscCall(MatProductNumeric(B)); 59*1cdffd5eSHong Zhang PetscCall(MatViewFromOptions(B,NULL,"-product_view")); 60*1cdffd5eSHong Zhang 61*1cdffd5eSHong Zhang PetscCall(MatDestroy(&Conjugate)); 62*1cdffd5eSHong Zhang if (!convert) { 63*1cdffd5eSHong Zhang Bdense = B; B = NULL; 64*1cdffd5eSHong Zhang } 65*1cdffd5eSHong Zhang } 66*1cdffd5eSHong Zhang 67*1cdffd5eSHong Zhang /* Compare Bdense and B */ 68*1cdffd5eSHong Zhang PetscCall(MatMultEqual(Bdense,B,10,&equal)); 69*1cdffd5eSHong Zhang PetscCheck(equal,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Bdense != B"); 70*1cdffd5eSHong Zhang 71*1cdffd5eSHong Zhang PetscCall(MatDestroy(&Bdense)); 72*1cdffd5eSHong Zhang PetscCall(MatDestroy(&B)); 73*1cdffd5eSHong Zhang PetscCall(MatDestroy(&A)); 74*1cdffd5eSHong Zhang PetscCall(PetscFinalize()); 75*1cdffd5eSHong Zhang return 0; 76*1cdffd5eSHong Zhang } 77*1cdffd5eSHong Zhang 78*1cdffd5eSHong Zhang /*TEST 79*1cdffd5eSHong Zhang 80*1cdffd5eSHong Zhang test: 81*1cdffd5eSHong Zhang suffix: 1 82*1cdffd5eSHong Zhang args: -conjugate false -atb 83*1cdffd5eSHong Zhang output_file: output/ex258_1.out 84*1cdffd5eSHong Zhang 85*1cdffd5eSHong Zhang test: 86*1cdffd5eSHong Zhang suffix: 2 87*1cdffd5eSHong Zhang args: -conjugate true -atb 88*1cdffd5eSHong Zhang output_file: output/ex258_1.out 89*1cdffd5eSHong Zhang 90*1cdffd5eSHong Zhang test: 91*1cdffd5eSHong Zhang suffix: 3 92*1cdffd5eSHong Zhang args: -conjugate false 93*1cdffd5eSHong Zhang output_file: output/ex258_1.out 94*1cdffd5eSHong Zhang 95*1cdffd5eSHong Zhang test: 96*1cdffd5eSHong Zhang suffix: 4 97*1cdffd5eSHong Zhang args: -ptap 98*1cdffd5eSHong Zhang output_file: output/ex258_1.out 99*1cdffd5eSHong Zhang 100*1cdffd5eSHong Zhang test: 101*1cdffd5eSHong Zhang suffix: 5 102*1cdffd5eSHong Zhang args: -abt 103*1cdffd5eSHong Zhang output_file: output/ex258_1.out 104*1cdffd5eSHong Zhang 105*1cdffd5eSHong Zhang test: 106*1cdffd5eSHong Zhang suffix: 6 107*1cdffd5eSHong Zhang nsize: 2 108*1cdffd5eSHong Zhang args: -conjugate false -atb 109*1cdffd5eSHong Zhang output_file: output/ex258_1.out 110*1cdffd5eSHong Zhang 111*1cdffd5eSHong Zhang test: 112*1cdffd5eSHong Zhang suffix: 7 113*1cdffd5eSHong Zhang nsize: 2 114*1cdffd5eSHong Zhang args: -conjugate true -atb 115*1cdffd5eSHong Zhang output_file: output/ex258_1.out 116*1cdffd5eSHong Zhang 117*1cdffd5eSHong Zhang test: 118*1cdffd5eSHong Zhang suffix: 8 119*1cdffd5eSHong Zhang nsize: 2 120*1cdffd5eSHong Zhang args: -conjugate false 121*1cdffd5eSHong Zhang output_file: output/ex258_1.out 122*1cdffd5eSHong Zhang 123*1cdffd5eSHong Zhang test: 124*1cdffd5eSHong Zhang suffix: 9 125*1cdffd5eSHong Zhang nsize: 2 126*1cdffd5eSHong Zhang args: -ptap 127*1cdffd5eSHong Zhang output_file: output/ex258_1.out 128*1cdffd5eSHong Zhang 129*1cdffd5eSHong Zhang test: 130*1cdffd5eSHong Zhang suffix: 10 131*1cdffd5eSHong Zhang nsize: 2 132*1cdffd5eSHong Zhang args: -abt 133*1cdffd5eSHong Zhang output_file: output/ex258_1.out 134*1cdffd5eSHong Zhang 135*1cdffd5eSHong Zhang test: 136*1cdffd5eSHong Zhang suffix: 11 137*1cdffd5eSHong Zhang nsize: 2 138*1cdffd5eSHong Zhang args: -conjugate true -atb -mat_product_algorithm backend 139*1cdffd5eSHong Zhang TODO: bug: MatProductReplaceMats() does not change the product for this test 140*1cdffd5eSHong Zhang 141*1cdffd5eSHong Zhang TEST*/ 142