xref: /petsc/src/mat/tests/ex258.c (revision 1cdffd5ed30a93a4829337b80050321282b12767)
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