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;
17: PetscInitialize(&argc, &args, (char *)0, help);
18: PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL);
19: MPI_Comm_size(PETSC_COMM_WORLD, &size);
20: n = 2 * size;
22: /* Set flag if we are doing a nonsymmetric problem; the default is symmetric. */
23: PetscOptionsGetBool(NULL, NULL, "-mat_nonsym", &mat_nonsymmetric, NULL);
25: MatCreate(PETSC_COMM_WORLD, &C);
26: MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n);
27: MatSetFromOptions(C);
28: MatSeqAIJSetPreallocation(C, 5, NULL);
29: MatMPIAIJSetPreallocation(C, 5, NULL, 5, NULL);
31: MatGetOwnershipRange(C, &Istart, &Iend);
32: for (Ii = Istart; Ii < Iend; Ii++) {
33: v = -1.0;
34: i = Ii / n;
35: j = Ii - i * n;
36: if (i > 0) {
37: J = Ii - n;
38: MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES);
39: }
40: if (i < m - 1) {
41: J = Ii + n;
42: MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES);
43: }
44: if (j > 0) {
45: J = Ii - 1;
46: MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES);
47: }
48: if (j < n - 1) {
49: J = Ii + 1;
50: MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES);
51: }
52: v = 4.0;
53: MatSetValues(C, 1, &Ii, 1, &Ii, &v, ADD_VALUES);
54: }
56: /* Make the matrix nonsymmetric if desired */
57: if (mat_nonsymmetric) {
58: for (Ii = Istart; Ii < Iend; Ii++) {
59: v = -1.5;
60: i = Ii / n;
61: if (i > 1) {
62: J = Ii - n - 1;
63: MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES);
64: }
65: }
66: } else {
67: MatSetOption(C, MAT_SYMMETRIC, PETSC_TRUE);
68: MatSetOption(C, MAT_SYMMETRY_ETERNAL, PETSC_TRUE);
69: }
70: MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY);
71: MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY);
72: PetscObjectSetName((PetscObject)C, "C");
73: MatViewFromOptions(C, NULL, "-view");
75: /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */
76: MatCreate(PETSC_COMM_WORLD, &C1);
77: MatSetSizes(C1, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n);
78: MatSetFromOptions(C1);
79: MatSeqAIJSetPreallocation(C1, 1, NULL);
80: MatMPIAIJSetPreallocation(C1, 1, NULL, 1, NULL);
81: for (Ii = Istart; Ii < Iend; Ii++) {
82: v = 1.0;
83: i = m * n - Ii - 1;
84: j = Ii;
85: MatSetValues(C1, 1, &i, 1, &j, &v, ADD_VALUES);
86: }
87: MatAssemblyBegin(C1, MAT_FINAL_ASSEMBLY);
88: MatAssemblyEnd(C1, MAT_FINAL_ASSEMBLY);
89: PetscObjectSetName((PetscObject)C1, "C1");
90: MatViewFromOptions(C1, NULL, "-view");
91: MatDuplicate(C1, MAT_COPY_VALUES, &CU);
93: PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n");
94: MatAXPY(C1, 2.0, C, DIFFERENT_NONZERO_PATTERN);
95: MatAXPY(CU, 2.0, C, UNKNOWN_NONZERO_PATTERN);
96: MatGetInfo(C1, MAT_GLOBAL_SUM, &info);
97: PetscPrintf(PETSC_COMM_WORLD, " C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n", info.nz_allocated, info.nz_used, info.nz_unneeded);
98: MatViewFromOptions(C1, NULL, "-view");
99: MatMultEqual(CU, C1, 10, &flg);
100: if (!flg) {
101: PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly DIFFERENT_NONZERO_PATTERN)\n");
102: MatViewFromOptions(CU, NULL, "-view");
103: }
104: MatDestroy(&CU);
106: /* Secondly, compute C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */
107: MatDuplicate(C, MAT_DO_NOT_COPY_VALUES, &C2);
108: MatDuplicate(C1, MAT_COPY_VALUES, &CU);
110: for (Ii = Istart; Ii < Iend; Ii++) {
111: v = 1.0;
112: MatSetValues(C2, 1, &Ii, 1, &Ii, &v, ADD_VALUES);
113: }
114: MatAssemblyBegin(C2, MAT_FINAL_ASSEMBLY);
115: MatAssemblyEnd(C2, MAT_FINAL_ASSEMBLY);
116: PetscObjectSetName((PetscObject)C2, "C2");
117: MatViewFromOptions(C2, NULL, "-view");
118: PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n");
119: MatAXPY(C1, 2.0, C2, SUBSET_NONZERO_PATTERN);
120: MatAXPY(CU, 2.0, C2, UNKNOWN_NONZERO_PATTERN);
121: MatGetInfo(C1, MAT_GLOBAL_SUM, &info);
122: PetscPrintf(PETSC_COMM_WORLD, " C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n", info.nz_allocated, info.nz_used, info.nz_unneeded);
123: MatViewFromOptions(C1, NULL, "-view");
124: MatMultEqual(CU, C1, 10, &flg);
125: if (!flg) {
126: PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n");
127: MatViewFromOptions(CU, NULL, "-view");
128: }
129: MatDestroy(&CU);
131: /* Test SAME_NONZERO_PATTERN computing C2 = C2 + 2.0 * C */
132: MatDuplicate(C2, MAT_COPY_VALUES, &CU);
133: PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n");
134: MatAXPY(C2, 2.0, C, SAME_NONZERO_PATTERN);
135: MatAXPY(CU, 2.0, C, UNKNOWN_NONZERO_PATTERN);
136: MatGetInfo(C2, MAT_GLOBAL_SUM, &info);
137: PetscPrintf(PETSC_COMM_WORLD, " C2: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n", info.nz_allocated, info.nz_used, info.nz_unneeded);
138: MatViewFromOptions(C2, NULL, "-view");
139: MatMultEqual(CU, C2, 10, &flg);
140: if (!flg) {
141: PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n");
142: MatViewFromOptions(CU, NULL, "-view");
143: }
144: MatDestroy(&CU);
146: MatDestroy(&C1);
147: MatDestroy(&C2);
148: MatDestroy(&C);
150: PetscFinalize();
151: return 0;
152: }
154: /*TEST
156: test:
157: suffix: 1
158: filter: grep -v " type:" | grep -v "Mat Object"
159: args: -view
160: diff_args: -j
162: test:
163: output_file: output/ex132_1.out
164: requires: cuda
165: suffix: 1_cuda
166: filter: grep -v " type:" | grep -v "Mat Object"
167: args: -view -mat_type aijcusparse
168: diff_args: -j
170: test:
171: output_file: output/ex132_1.out
172: requires: kokkos_kernels
173: suffix: 1_kokkos
174: filter: grep -v " type:" | grep -v "Mat Object"
175: args: -view -mat_type aijkokkos
176: diff_args: -j
178: test:
179: suffix: 2
180: filter: grep -v " type:" | grep -v "Mat Object"
181: args: -view -mat_nonsym
182: diff_args: -j
184: test:
185: output_file: output/ex132_2.out
186: requires: cuda
187: suffix: 2_cuda
188: filter: grep -v " type:" | grep -v "Mat Object"
189: args: -view -mat_type aijcusparse -mat_nonsym
190: diff_args: -j
192: test:
193: output_file: output/ex132_2.out
194: requires: kokkos_kernels
195: suffix: 2_kokkos
196: filter: grep -v " type:" | grep -v "Mat Object"
197: args: -view -mat_type aijkokkos -mat_nonsym
198: diff_args: -j
200: test:
201: nsize: 2
202: suffix: 1_par
203: filter: grep -v " type:" | grep -v "Mat Object"
204: args: -view
205: diff_args: -j
207: test:
208: nsize: 2
209: output_file: output/ex132_1_par.out
210: requires: cuda
211: suffix: 1_par_cuda
212: filter: grep -v " type:" | grep -v "Mat Object"
213: args: -view -mat_type aijcusparse
214: diff_args: -j
216: test:
217: nsize: 2
218: output_file: output/ex132_1_par.out
219: requires: kokkos_kernels
220: suffix: 1_par_kokkos
221: filter: grep -v " type:" | grep -v "Mat Object"
222: args: -view -mat_type aijkokkos
223: diff_args: -j
225: test:
226: nsize: 2
227: suffix: 2_par
228: filter: grep -v " type:" | grep -v "Mat Object"
229: args: -view -mat_nonsym
230: diff_args: -j
232: test:
233: nsize: 2
234: output_file: output/ex132_2_par.out
235: requires: cuda
236: suffix: 2_par_cuda
237: filter: grep -v " type:" | grep -v "Mat Object"
238: args: -view -mat_type aijcusparse -mat_nonsym
239: diff_args: -j
241: testset:
242: nsize: 2
243: output_file: output/ex132_2_par.out
244: requires: kokkos_kernels
245: filter: grep -v " type:" | grep -v "Mat Object"
246: args: -view -mat_type aijkokkos -mat_nonsym
247: diff_args: -j
248: test:
249: suffix: 2_par_kokkos_no_gpu_aware
250: args: -use_gpu_aware_mpi 0
251: test:
252: requires: defined(HAVE_MPI_GPU_AWARE)
253: suffix: 2_par_kokkos_gpu_aware
254: args: -use_gpu_aware_mpi 1
256: TEST*/