Actual source code: ex132.c
2: static char help[] = "Test MatAXPY()\n\n";
4: #include <petscmat.h>
6: int main(int argc,char **args)
7: {
8: Mat C,C1,C2,CU;
9: PetscScalar v;
10: PetscInt Ii,J,Istart,Iend;
11: PetscInt i,j,m = 3,n;
12: PetscMPIInt size;
13: PetscBool mat_nonsymmetric = PETSC_FALSE,flg;
14: MatInfo info;
16: PetscInitialize(&argc,&args,(char*)0,help);
17: PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);
18: MPI_Comm_size(PETSC_COMM_WORLD,&size);
19: n = 2*size;
21: /* Set flag if we are doing a nonsymmetric problem; the default is symmetric. */
22: PetscOptionsGetBool(NULL,NULL,"-mat_nonsym",&mat_nonsymmetric,NULL);
24: MatCreate(PETSC_COMM_WORLD,&C);
25: MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);
26: MatSetFromOptions(C);
27: MatSeqAIJSetPreallocation(C,5,NULL);
28: MatMPIAIJSetPreallocation(C,5,NULL,5,NULL);
30: MatGetOwnershipRange(C,&Istart,&Iend);
31: for (Ii=Istart; Ii<Iend; Ii++) {
32: v = -1.0; i = Ii/n; j = Ii - i*n;
33: if (i>0) {J = Ii - n; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
34: if (i<m-1) {J = Ii + n; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
35: if (j>0) {J = Ii - 1; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
36: if (j<n-1) {J = Ii + 1; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
37: v = 4.0; MatSetValues(C,1,&Ii,1,&Ii,&v,ADD_VALUES);
38: }
40: /* Make the matrix nonsymmetric if desired */
41: if (mat_nonsymmetric) {
42: for (Ii=Istart; Ii<Iend; Ii++) {
43: v = -1.5; i = Ii/n;
44: if (i>1) {J = Ii-n-1; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
45: }
46: } else {
47: MatSetOption(C,MAT_SYMMETRIC,PETSC_TRUE);
48: MatSetOption(C,MAT_SYMMETRY_ETERNAL,PETSC_TRUE);
49: }
50: MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);
51: MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);
52: PetscObjectSetName((PetscObject)C,"C");
53: MatViewFromOptions(C,NULL,"-view");
55: /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */
56: MatCreate(PETSC_COMM_WORLD,&C1);
57: MatSetSizes(C1,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);
58: MatSetFromOptions(C1);
59: MatSeqAIJSetPreallocation(C1,1,NULL);
60: MatMPIAIJSetPreallocation(C1,1,NULL,1,NULL);
61: for (Ii=Istart; Ii<Iend; Ii++) {
62: v = 1.0;
63: i = m*n - Ii -1;
64: j = Ii;
65: MatSetValues(C1,1,&i,1,&j,&v,ADD_VALUES);
66: }
67: MatAssemblyBegin(C1,MAT_FINAL_ASSEMBLY);
68: MatAssemblyEnd(C1,MAT_FINAL_ASSEMBLY);
69: PetscObjectSetName((PetscObject)C1,"C1");
70: MatViewFromOptions(C1,NULL,"-view");
71: MatDuplicate(C1,MAT_COPY_VALUES,&CU);
73: PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n");
74: MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN);
75: MatAXPY(CU,2.0,C,UNKNOWN_NONZERO_PATTERN);
76: MatGetInfo(C1,MAT_GLOBAL_SUM,&info);
77: PetscPrintf(PETSC_COMM_WORLD," C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);
78: MatViewFromOptions(C1,NULL,"-view");
79: MatMultEqual(CU,C1,10,&flg);
80: if (!flg) {
81: PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly DIFFERENT_NONZERO_PATTERN)\n");
82: MatViewFromOptions(CU,NULL,"-view");
83: }
84: MatDestroy(&CU);
86: /* Secondly, compute C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */
87: MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&C2);
88: MatDuplicate(C1,MAT_COPY_VALUES,&CU);
90: for (Ii=Istart; Ii<Iend; Ii++) {
91: v = 1.0;
92: MatSetValues(C2,1,&Ii,1,&Ii,&v,ADD_VALUES);
93: }
94: MatAssemblyBegin(C2,MAT_FINAL_ASSEMBLY);
95: MatAssemblyEnd(C2,MAT_FINAL_ASSEMBLY);
96: PetscObjectSetName((PetscObject)C2,"C2");
97: MatViewFromOptions(C2,NULL,"-view");
98: PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n");
99: MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN);
100: MatAXPY(CU,2.0,C2,UNKNOWN_NONZERO_PATTERN);
101: MatGetInfo(C1,MAT_GLOBAL_SUM,&info);
102: PetscPrintf(PETSC_COMM_WORLD," C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);
103: MatViewFromOptions(C1,NULL,"-view");
104: MatMultEqual(CU,C1,10,&flg);
105: if (!flg) {
106: PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n");
107: MatViewFromOptions(CU,NULL,"-view");
108: }
109: MatDestroy(&CU);
111: /* Test SAME_NONZERO_PATTERN computing C2 = C2 + 2.0 * C */
112: MatDuplicate(C2,MAT_COPY_VALUES,&CU);
113: PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n");
114: MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN);
115: MatAXPY(CU,2.0,C,UNKNOWN_NONZERO_PATTERN);
116: MatGetInfo(C2,MAT_GLOBAL_SUM,&info);
117: PetscPrintf(PETSC_COMM_WORLD," C2: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);
118: MatViewFromOptions(C2,NULL,"-view");
119: MatMultEqual(CU,C2,10,&flg);
120: if (!flg) {
121: PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n");
122: MatViewFromOptions(CU,NULL,"-view");
123: }
124: MatDestroy(&CU);
126: MatDestroy(&C1);
127: MatDestroy(&C2);
128: MatDestroy(&C);
130: PetscFinalize();
131: return 0;
132: }
134: /*TEST
136: test:
137: suffix: 1
138: filter: grep -v " type:" | grep -v "Mat Object"
139: args: -view
140: diff_args: -j
142: test:
143: output_file: output/ex132_1.out
144: requires: cuda
145: suffix: 1_cuda
146: filter: grep -v " type:" | grep -v "Mat Object"
147: args: -view -mat_type aijcusparse
148: diff_args: -j
150: test:
151: output_file: output/ex132_1.out
152: requires: kokkos_kernels
153: suffix: 1_kokkos
154: filter: grep -v " type:" | grep -v "Mat Object"
155: args: -view -mat_type aijkokkos
156: diff_args: -j
158: test:
159: suffix: 2
160: filter: grep -v " type:" | grep -v "Mat Object"
161: args: -view -mat_nonsym
162: diff_args: -j
164: test:
165: output_file: output/ex132_2.out
166: requires: cuda
167: suffix: 2_cuda
168: filter: grep -v " type:" | grep -v "Mat Object"
169: args: -view -mat_type aijcusparse -mat_nonsym
170: diff_args: -j
172: test:
173: output_file: output/ex132_2.out
174: requires: kokkos_kernels
175: suffix: 2_kokkos
176: filter: grep -v " type:" | grep -v "Mat Object"
177: args: -view -mat_type aijkokkos -mat_nonsym
178: diff_args: -j
180: test:
181: nsize: 2
182: suffix: 1_par
183: filter: grep -v " type:" | grep -v "Mat Object"
184: args: -view
185: diff_args: -j
187: test:
188: nsize: 2
189: output_file: output/ex132_1_par.out
190: requires: cuda
191: suffix: 1_par_cuda
192: filter: grep -v " type:" | grep -v "Mat Object"
193: args: -view -mat_type aijcusparse
194: diff_args: -j
196: test:
197: nsize: 2
198: output_file: output/ex132_1_par.out
199: requires: !sycl kokkos_kernels
200: suffix: 1_par_kokkos
201: filter: grep -v " type:" | grep -v "Mat Object"
202: args: -view -mat_type aijkokkos
203: diff_args: -j
205: test:
206: nsize: 2
207: suffix: 2_par
208: filter: grep -v " type:" | grep -v "Mat Object"
209: args: -view -mat_nonsym
210: diff_args: -j
212: test:
213: nsize: 2
214: output_file: output/ex132_2_par.out
215: requires: cuda
216: suffix: 2_par_cuda
217: filter: grep -v " type:" | grep -v "Mat Object"
218: args: -view -mat_type aijcusparse -mat_nonsym
219: diff_args: -j
221: testset:
222: nsize: 2
223: output_file: output/ex132_2_par.out
224: requires: !sycl kokkos_kernels
225: filter: grep -v " type:" | grep -v "Mat Object"
226: args: -view -mat_type aijkokkos -mat_nonsym
227: diff_args: -j
228: test:
229: suffix: 2_par_kokkos_no_gpu_aware
230: args: -use_gpu_aware_mpi 0
231: test:
232: requires: defined(HAVE_MPI_GPU_AWARE)
233: suffix: 2_par_kokkos_gpu_aware
234: args: -use_gpu_aware_mpi 1
236: TEST*/