1039c6fbaSStefano Zampini static char help[] = "Test MatAXPY()\n\n";
2c4762a1bSJed Brown
3c4762a1bSJed Brown #include <petscmat.h>
4c4762a1bSJed Brown
main(int argc,char ** args)5d71ae5a4SJacob Faibussowitsch int main(int argc, char **args)
6d71ae5a4SJacob Faibussowitsch {
7b84f494bSStefano Zampini Mat C, C1, C2, CU;
8c4762a1bSJed Brown PetscScalar v;
9c4762a1bSJed Brown PetscInt Ii, J, Istart, Iend;
10039c6fbaSStefano Zampini PetscInt i, j, m = 3, n;
11039c6fbaSStefano Zampini PetscMPIInt size;
12b84f494bSStefano Zampini PetscBool mat_nonsymmetric = PETSC_FALSE, flg;
13c4762a1bSJed Brown MatInfo info;
14c4762a1bSJed Brown
15327415f7SBarry Smith PetscFunctionBeginUser;
16*c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &args, NULL, help));
179566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
189566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
19c4762a1bSJed Brown n = 2 * size;
20c4762a1bSJed Brown
21c4762a1bSJed Brown /* Set flag if we are doing a nonsymmetric problem; the default is symmetric. */
229566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-mat_nonsym", &mat_nonsymmetric, NULL));
23c4762a1bSJed Brown
249566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &C));
259566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n));
269566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(C));
279566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(C, 5, NULL));
289566063dSJacob Faibussowitsch PetscCall(MatMPIAIJSetPreallocation(C, 5, NULL, 5, NULL));
29c4762a1bSJed Brown
309566063dSJacob Faibussowitsch PetscCall(MatGetOwnershipRange(C, &Istart, &Iend));
31c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) {
329371c9d4SSatish Balay v = -1.0;
339371c9d4SSatish Balay i = Ii / n;
349371c9d4SSatish Balay j = Ii - i * n;
359371c9d4SSatish Balay if (i > 0) {
369371c9d4SSatish Balay J = Ii - n;
379371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
389371c9d4SSatish Balay }
399371c9d4SSatish Balay if (i < m - 1) {
409371c9d4SSatish Balay J = Ii + n;
419371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
429371c9d4SSatish Balay }
439371c9d4SSatish Balay if (j > 0) {
449371c9d4SSatish Balay J = Ii - 1;
459371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
469371c9d4SSatish Balay }
479371c9d4SSatish Balay if (j < n - 1) {
489371c9d4SSatish Balay J = Ii + 1;
499371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
509371c9d4SSatish Balay }
519371c9d4SSatish Balay v = 4.0;
529371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, ADD_VALUES));
53c4762a1bSJed Brown }
54c4762a1bSJed Brown
55c4762a1bSJed Brown /* Make the matrix nonsymmetric if desired */
56c4762a1bSJed Brown if (mat_nonsymmetric) {
57c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) {
589371c9d4SSatish Balay v = -1.5;
599371c9d4SSatish Balay i = Ii / n;
609371c9d4SSatish Balay if (i > 1) {
619371c9d4SSatish Balay J = Ii - n - 1;
629371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
639371c9d4SSatish Balay }
64c4762a1bSJed Brown }
65c4762a1bSJed Brown } else {
669566063dSJacob Faibussowitsch PetscCall(MatSetOption(C, MAT_SYMMETRIC, PETSC_TRUE));
679566063dSJacob Faibussowitsch PetscCall(MatSetOption(C, MAT_SYMMETRY_ETERNAL, PETSC_TRUE));
68c4762a1bSJed Brown }
699566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY));
709566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY));
719566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C, "C"));
729566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C, NULL, "-view"));
73c4762a1bSJed Brown
74b84f494bSStefano Zampini /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */
759566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &C1));
769566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C1, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n));
779566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(C1));
789566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(C1, 1, NULL));
799566063dSJacob Faibussowitsch PetscCall(MatMPIAIJSetPreallocation(C1, 1, NULL, 1, NULL));
80c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) {
81039c6fbaSStefano Zampini v = 1.0;
82039c6fbaSStefano Zampini i = m * n - Ii - 1;
83039c6fbaSStefano Zampini j = Ii;
849566063dSJacob Faibussowitsch PetscCall(MatSetValues(C1, 1, &i, 1, &j, &v, ADD_VALUES));
85c4762a1bSJed Brown }
869566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C1, MAT_FINAL_ASSEMBLY));
879566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C1, MAT_FINAL_ASSEMBLY));
889566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C1, "C1"));
899566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1, NULL, "-view"));
909566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C1, MAT_COPY_VALUES, &CU));
91b84f494bSStefano Zampini
929566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n"));
939566063dSJacob Faibussowitsch PetscCall(MatAXPY(C1, 2.0, C, DIFFERENT_NONZERO_PATTERN));
949566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU, 2.0, C, UNKNOWN_NONZERO_PATTERN));
959566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C1, MAT_GLOBAL_SUM, &info));
969566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n", info.nz_allocated, info.nz_used, info.nz_unneeded));
979566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1, NULL, "-view"));
989566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU, C1, 10, &flg));
99b84f494bSStefano Zampini if (!flg) {
1009566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly DIFFERENT_NONZERO_PATTERN)\n"));
1019566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU, NULL, "-view"));
102b84f494bSStefano Zampini }
1039566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU));
104c4762a1bSJed Brown
105b84f494bSStefano Zampini /* Secondly, compute C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */
1069566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C, MAT_DO_NOT_COPY_VALUES, &C2));
1079566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C1, MAT_COPY_VALUES, &CU));
108c4762a1bSJed Brown
109c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) {
110c4762a1bSJed Brown v = 1.0;
1119566063dSJacob Faibussowitsch PetscCall(MatSetValues(C2, 1, &Ii, 1, &Ii, &v, ADD_VALUES));
112c4762a1bSJed Brown }
1139566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C2, MAT_FINAL_ASSEMBLY));
1149566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C2, MAT_FINAL_ASSEMBLY));
1159566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C2, "C2"));
1169566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C2, NULL, "-view"));
1179566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n"));
1189566063dSJacob Faibussowitsch PetscCall(MatAXPY(C1, 2.0, C2, SUBSET_NONZERO_PATTERN));
1199566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU, 2.0, C2, UNKNOWN_NONZERO_PATTERN));
1209566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C1, MAT_GLOBAL_SUM, &info));
1219566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n", info.nz_allocated, info.nz_used, info.nz_unneeded));
1229566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C1, NULL, "-view"));
1239566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU, C1, 10, &flg));
124b84f494bSStefano Zampini if (!flg) {
1259566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n"));
1269566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU, NULL, "-view"));
127b84f494bSStefano Zampini }
1289566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU));
129039c6fbaSStefano Zampini
130b84f494bSStefano Zampini /* Test SAME_NONZERO_PATTERN computing C2 = C2 + 2.0 * C */
1319566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C2, MAT_COPY_VALUES, &CU));
1329566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n"));
1339566063dSJacob Faibussowitsch PetscCall(MatAXPY(C2, 2.0, C, SAME_NONZERO_PATTERN));
1349566063dSJacob Faibussowitsch PetscCall(MatAXPY(CU, 2.0, C, UNKNOWN_NONZERO_PATTERN));
1359566063dSJacob Faibussowitsch PetscCall(MatGetInfo(C2, MAT_GLOBAL_SUM, &info));
1369566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " C2: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n", info.nz_allocated, info.nz_used, info.nz_unneeded));
1379566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C2, NULL, "-view"));
1389566063dSJacob Faibussowitsch PetscCall(MatMultEqual(CU, C2, 10, &flg));
139b84f494bSStefano Zampini if (!flg) {
1409566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n"));
1419566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(CU, NULL, "-view"));
142b84f494bSStefano Zampini }
1439566063dSJacob Faibussowitsch PetscCall(MatDestroy(&CU));
144c4762a1bSJed Brown
1459566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C1));
1469566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C2));
1479566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C));
148c4762a1bSJed Brown
1499566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
150b122ec5aSJacob Faibussowitsch return 0;
151c4762a1bSJed Brown }
152c4762a1bSJed Brown
153c4762a1bSJed Brown /*TEST
154c4762a1bSJed Brown
155c4762a1bSJed Brown test:
156039c6fbaSStefano Zampini suffix: 1
157039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
158039c6fbaSStefano Zampini args: -view
159039c6fbaSStefano Zampini diff_args: -j
160039c6fbaSStefano Zampini
161039c6fbaSStefano Zampini test:
162039c6fbaSStefano Zampini output_file: output/ex132_1.out
163039c6fbaSStefano Zampini requires: cuda
164039c6fbaSStefano Zampini suffix: 1_cuda
165039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
166039c6fbaSStefano Zampini args: -view -mat_type aijcusparse
167039c6fbaSStefano Zampini diff_args: -j
168039c6fbaSStefano Zampini
169039c6fbaSStefano Zampini test:
170039c6fbaSStefano Zampini output_file: output/ex132_1.out
171039c6fbaSStefano Zampini requires: kokkos_kernels
172039c6fbaSStefano Zampini suffix: 1_kokkos
173039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
174039c6fbaSStefano Zampini args: -view -mat_type aijkokkos
175039c6fbaSStefano Zampini diff_args: -j
176039c6fbaSStefano Zampini
177039c6fbaSStefano Zampini test:
178039c6fbaSStefano Zampini suffix: 2
179039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
180039c6fbaSStefano Zampini args: -view -mat_nonsym
181039c6fbaSStefano Zampini diff_args: -j
182039c6fbaSStefano Zampini
183039c6fbaSStefano Zampini test:
184039c6fbaSStefano Zampini output_file: output/ex132_2.out
185039c6fbaSStefano Zampini requires: cuda
186039c6fbaSStefano Zampini suffix: 2_cuda
187039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
188039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym
189039c6fbaSStefano Zampini diff_args: -j
190039c6fbaSStefano Zampini
191039c6fbaSStefano Zampini test:
192039c6fbaSStefano Zampini output_file: output/ex132_2.out
193039c6fbaSStefano Zampini requires: kokkos_kernels
194039c6fbaSStefano Zampini suffix: 2_kokkos
195039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
196039c6fbaSStefano Zampini args: -view -mat_type aijkokkos -mat_nonsym
197039c6fbaSStefano Zampini diff_args: -j
198039c6fbaSStefano Zampini
199039c6fbaSStefano Zampini test:
200039c6fbaSStefano Zampini nsize: 2
201039c6fbaSStefano Zampini suffix: 1_par
202039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
203039c6fbaSStefano Zampini args: -view
204039c6fbaSStefano Zampini diff_args: -j
205039c6fbaSStefano Zampini
206039c6fbaSStefano Zampini test:
207039c6fbaSStefano Zampini nsize: 2
208039c6fbaSStefano Zampini output_file: output/ex132_1_par.out
209039c6fbaSStefano Zampini requires: cuda
210039c6fbaSStefano Zampini suffix: 1_par_cuda
211039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
212039c6fbaSStefano Zampini args: -view -mat_type aijcusparse
213039c6fbaSStefano Zampini diff_args: -j
214039c6fbaSStefano Zampini
215039c6fbaSStefano Zampini test:
216039c6fbaSStefano Zampini nsize: 2
217039c6fbaSStefano Zampini output_file: output/ex132_1_par.out
218dcfd994dSJunchao Zhang requires: kokkos_kernels
219039c6fbaSStefano Zampini suffix: 1_par_kokkos
220039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
221039c6fbaSStefano Zampini args: -view -mat_type aijkokkos
222039c6fbaSStefano Zampini diff_args: -j
223039c6fbaSStefano Zampini
224039c6fbaSStefano Zampini test:
225039c6fbaSStefano Zampini nsize: 2
226039c6fbaSStefano Zampini suffix: 2_par
227039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
228039c6fbaSStefano Zampini args: -view -mat_nonsym
229039c6fbaSStefano Zampini diff_args: -j
230039c6fbaSStefano Zampini
231039c6fbaSStefano Zampini test:
232039c6fbaSStefano Zampini nsize: 2
233039c6fbaSStefano Zampini output_file: output/ex132_2_par.out
234039c6fbaSStefano Zampini requires: cuda
235039c6fbaSStefano Zampini suffix: 2_par_cuda
236039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
237039c6fbaSStefano Zampini args: -view -mat_type aijcusparse -mat_nonsym
238039c6fbaSStefano Zampini diff_args: -j
239039c6fbaSStefano Zampini
240f3482364SScott Kruger testset:
241039c6fbaSStefano Zampini nsize: 2
242039c6fbaSStefano Zampini output_file: output/ex132_2_par.out
243dcfd994dSJunchao Zhang requires: kokkos_kernels
244039c6fbaSStefano Zampini filter: grep -v " type:" | grep -v "Mat Object"
245f3482364SScott Kruger args: -view -mat_type aijkokkos -mat_nonsym
246039c6fbaSStefano Zampini diff_args: -j
247f3482364SScott Kruger test:
248f3482364SScott Kruger suffix: 2_par_kokkos_no_gpu_aware
249f3482364SScott Kruger args: -use_gpu_aware_mpi 0
250f3482364SScott Kruger test:
251f3482364SScott Kruger requires: defined(HAVE_MPI_GPU_AWARE)
252f3482364SScott Kruger suffix: 2_par_kokkos_gpu_aware
253f3482364SScott Kruger args: -use_gpu_aware_mpi 1
254c4762a1bSJed Brown
255c4762a1bSJed Brown TEST*/
256