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