xref: /petsc/src/mat/tests/ex258.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
11cdffd5eSHong Zhang static char help[] = "Test MatProductReplaceMats() \n\
21cdffd5eSHong Zhang Modified from the code contributed by Pierre Jolivet \n\n";
31cdffd5eSHong Zhang 
41cdffd5eSHong Zhang #include <petscmat.h>
51cdffd5eSHong Zhang 
6*9371c9d4SSatish Balay int main(int argc, char **args) {
71cdffd5eSHong Zhang   PetscInt  n = 2, convert;
81cdffd5eSHong Zhang   Mat       A, B, Bdense, Conjugate;
91cdffd5eSHong Zhang   PetscBool conjugate = PETSC_FALSE, equal, flg;
101cdffd5eSHong Zhang 
111cdffd5eSHong Zhang   PetscFunctionBeginUser;
121cdffd5eSHong Zhang   PetscCall(PetscInitialize(&argc, &args, NULL, help));
131cdffd5eSHong Zhang 
141cdffd5eSHong Zhang   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
151cdffd5eSHong Zhang   PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, n, n));
161cdffd5eSHong Zhang   PetscCall(MatSetType(A, MATDENSE));
171cdffd5eSHong Zhang   PetscCall(MatSetFromOptions(A));
181cdffd5eSHong Zhang   PetscCall(MatSeqDenseSetPreallocation(A, NULL));
191cdffd5eSHong Zhang   PetscCall(MatMPIDenseSetPreallocation(A, NULL));
201cdffd5eSHong Zhang   PetscCall(MatSetRandom(A, NULL));
211cdffd5eSHong Zhang   PetscCall(MatViewFromOptions(A, NULL, "-A_view"));
221cdffd5eSHong Zhang   PetscCall(PetscOptionsGetBool(NULL, NULL, "-conjugate", &conjugate, NULL));
231cdffd5eSHong Zhang 
241cdffd5eSHong Zhang   for (convert = 0; convert < 2; convert++) {
251cdffd5eSHong Zhang     /* convert dense matrix A to aij format */
261cdffd5eSHong Zhang     if (convert) PetscCall(MatConvert(A, MATAIJ, MAT_INPLACE_MATRIX, &A));
271cdffd5eSHong Zhang 
281cdffd5eSHong Zhang     /* compute B = A^T * A or  B = A^H * A */
291cdffd5eSHong Zhang     PetscCall(MatProductCreate(A, A, NULL, &B));
301cdffd5eSHong Zhang 
311cdffd5eSHong Zhang     flg = PETSC_FALSE;
321cdffd5eSHong Zhang     PetscCall(PetscOptionsGetBool(NULL, NULL, "-atb", &flg, NULL));
331cdffd5eSHong Zhang     if (flg) {
341cdffd5eSHong Zhang       PetscCall(MatProductSetType(B, MATPRODUCT_AtB));
351cdffd5eSHong Zhang     } else {
361cdffd5eSHong Zhang       PetscCall(PetscOptionsGetBool(NULL, NULL, "-ptap", &flg, NULL));
371cdffd5eSHong Zhang       if (flg) {
381cdffd5eSHong Zhang         PetscCall(MatProductSetType(B, MATPRODUCT_PtAP));
391cdffd5eSHong Zhang       } else {
401cdffd5eSHong Zhang         PetscCall(PetscOptionsGetBool(NULL, NULL, "-abt", &flg, NULL));
411cdffd5eSHong Zhang         if (flg) {
421cdffd5eSHong Zhang           PetscCall(MatProductSetType(B, MATPRODUCT_ABt));
431cdffd5eSHong Zhang         } else {
441cdffd5eSHong Zhang           PetscCall(MatProductSetType(B, MATPRODUCT_AB));
451cdffd5eSHong Zhang         }
461cdffd5eSHong Zhang       }
471cdffd5eSHong Zhang     }
481cdffd5eSHong Zhang     PetscCall(MatProductSetFromOptions(B));
491cdffd5eSHong Zhang     PetscCall(MatProductSymbolic(B));
501cdffd5eSHong Zhang 
511cdffd5eSHong Zhang     PetscCall(MatDuplicate(A, MAT_COPY_VALUES, &Conjugate));
521cdffd5eSHong Zhang     if (conjugate) PetscCall(MatConjugate(Conjugate));
531cdffd5eSHong Zhang 
541cdffd5eSHong Zhang     /* replace input A by Conjugate */
551cdffd5eSHong Zhang     PetscCall(MatProductReplaceMats(Conjugate, NULL, NULL, B));
561cdffd5eSHong Zhang 
571cdffd5eSHong Zhang     PetscCall(MatProductNumeric(B));
581cdffd5eSHong Zhang     PetscCall(MatViewFromOptions(B, NULL, "-product_view"));
591cdffd5eSHong Zhang 
601cdffd5eSHong Zhang     PetscCall(MatDestroy(&Conjugate));
611cdffd5eSHong Zhang     if (!convert) {
62*9371c9d4SSatish Balay       Bdense = B;
63*9371c9d4SSatish Balay       B      = NULL;
641cdffd5eSHong Zhang     }
651cdffd5eSHong Zhang   }
661cdffd5eSHong Zhang 
671cdffd5eSHong Zhang   /* Compare Bdense and B */
681cdffd5eSHong Zhang   PetscCall(MatMultEqual(Bdense, B, 10, &equal));
691cdffd5eSHong Zhang   PetscCheck(equal, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Bdense != B");
701cdffd5eSHong Zhang 
711cdffd5eSHong Zhang   PetscCall(MatDestroy(&Bdense));
721cdffd5eSHong Zhang   PetscCall(MatDestroy(&B));
731cdffd5eSHong Zhang   PetscCall(MatDestroy(&A));
741cdffd5eSHong Zhang   PetscCall(PetscFinalize());
751cdffd5eSHong Zhang   return 0;
761cdffd5eSHong Zhang }
771cdffd5eSHong Zhang 
781cdffd5eSHong Zhang /*TEST
791cdffd5eSHong Zhang 
801cdffd5eSHong Zhang    test:
811cdffd5eSHong Zhang       suffix: 1
821cdffd5eSHong Zhang       args: -conjugate false -atb
831cdffd5eSHong Zhang       output_file: output/ex258_1.out
841cdffd5eSHong Zhang 
851cdffd5eSHong Zhang    test:
861cdffd5eSHong Zhang       suffix: 2
871cdffd5eSHong Zhang       args: -conjugate true -atb
881cdffd5eSHong Zhang       output_file: output/ex258_1.out
891cdffd5eSHong Zhang 
901cdffd5eSHong Zhang    test:
911cdffd5eSHong Zhang       suffix: 3
921cdffd5eSHong Zhang       args: -conjugate false
931cdffd5eSHong Zhang       output_file: output/ex258_1.out
941cdffd5eSHong Zhang 
951cdffd5eSHong Zhang    test:
961cdffd5eSHong Zhang       suffix: 4
971cdffd5eSHong Zhang       args: -ptap
981cdffd5eSHong Zhang       output_file: output/ex258_1.out
991cdffd5eSHong Zhang 
1001cdffd5eSHong Zhang    test:
1011cdffd5eSHong Zhang       suffix: 5
1021cdffd5eSHong Zhang       args: -abt
1031cdffd5eSHong Zhang       output_file: output/ex258_1.out
1041cdffd5eSHong Zhang 
1051cdffd5eSHong Zhang    test:
1061cdffd5eSHong Zhang       suffix: 6
1071cdffd5eSHong Zhang       nsize: 2
1081cdffd5eSHong Zhang       args: -conjugate false -atb
1091cdffd5eSHong Zhang       output_file: output/ex258_1.out
1101cdffd5eSHong Zhang 
1111cdffd5eSHong Zhang    test:
1121cdffd5eSHong Zhang       suffix: 7
1131cdffd5eSHong Zhang       nsize: 2
1141cdffd5eSHong Zhang       args: -conjugate true -atb
1151cdffd5eSHong Zhang       output_file: output/ex258_1.out
1161cdffd5eSHong Zhang 
1171cdffd5eSHong Zhang    test:
1181cdffd5eSHong Zhang       suffix: 8
1191cdffd5eSHong Zhang       nsize: 2
1201cdffd5eSHong Zhang       args: -conjugate false
1211cdffd5eSHong Zhang       output_file: output/ex258_1.out
1221cdffd5eSHong Zhang 
1231cdffd5eSHong Zhang    test:
1241cdffd5eSHong Zhang       suffix: 9
1251cdffd5eSHong Zhang       nsize: 2
1261cdffd5eSHong Zhang       args: -ptap
1271cdffd5eSHong Zhang       output_file: output/ex258_1.out
1281cdffd5eSHong Zhang 
1291cdffd5eSHong Zhang    test:
1301cdffd5eSHong Zhang       suffix: 10
1311cdffd5eSHong Zhang       nsize: 2
1321cdffd5eSHong Zhang       args: -abt
1331cdffd5eSHong Zhang       output_file: output/ex258_1.out
1341cdffd5eSHong Zhang 
1351cdffd5eSHong Zhang    test:
1361cdffd5eSHong Zhang       suffix: 11
1371cdffd5eSHong Zhang       nsize: 2
1381cdffd5eSHong Zhang       args: -conjugate true -atb -mat_product_algorithm backend
1391cdffd5eSHong Zhang       TODO: bug: MatProductReplaceMats() does not change the product for this test
1401cdffd5eSHong Zhang 
1411cdffd5eSHong Zhang TEST*/
142