xref: /petsc/src/mat/tests/ex132.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
1c4762a1bSJed Brown 
2039c6fbaSStefano Zampini static char help[] = "Test MatAXPY()\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown #include <petscmat.h>
5c4762a1bSJed Brown 
6*d71ae5a4SJacob Faibussowitsch int main(int argc, char **args)
7*d71ae5a4SJacob Faibussowitsch {
8b84f494bSStefano Zampini   Mat         C, C1, C2, CU;
9c4762a1bSJed Brown   PetscScalar v;
10c4762a1bSJed Brown   PetscInt    Ii, J, Istart, Iend;
11039c6fbaSStefano Zampini   PetscInt    i, j, m = 3, n;
12039c6fbaSStefano Zampini   PetscMPIInt size;
13b84f494bSStefano Zampini   PetscBool   mat_nonsymmetric = PETSC_FALSE, flg;
14c4762a1bSJed Brown   MatInfo     info;
15c4762a1bSJed Brown 
16327415f7SBarry Smith   PetscFunctionBeginUser;
179566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
189566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
199566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
20c4762a1bSJed Brown   n = 2 * size;
21c4762a1bSJed Brown 
22c4762a1bSJed Brown   /* Set flag if we are doing a nonsymmetric problem; the default is symmetric. */
239566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, NULL, "-mat_nonsym", &mat_nonsymmetric, NULL));
24c4762a1bSJed Brown 
259566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD, &C));
269566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n));
279566063dSJacob Faibussowitsch   PetscCall(MatSetFromOptions(C));
289566063dSJacob Faibussowitsch   PetscCall(MatSeqAIJSetPreallocation(C, 5, NULL));
299566063dSJacob Faibussowitsch   PetscCall(MatMPIAIJSetPreallocation(C, 5, NULL, 5, NULL));
30c4762a1bSJed Brown 
319566063dSJacob Faibussowitsch   PetscCall(MatGetOwnershipRange(C, &Istart, &Iend));
32c4762a1bSJed Brown   for (Ii = Istart; Ii < Iend; Ii++) {
339371c9d4SSatish Balay     v = -1.0;
349371c9d4SSatish Balay     i = Ii / n;
359371c9d4SSatish Balay     j = Ii - i * n;
369371c9d4SSatish Balay     if (i > 0) {
379371c9d4SSatish Balay       J = Ii - n;
389371c9d4SSatish Balay       PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
399371c9d4SSatish Balay     }
409371c9d4SSatish Balay     if (i < m - 1) {
419371c9d4SSatish Balay       J = Ii + n;
429371c9d4SSatish Balay       PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
439371c9d4SSatish Balay     }
449371c9d4SSatish Balay     if (j > 0) {
459371c9d4SSatish Balay       J = Ii - 1;
469371c9d4SSatish Balay       PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
479371c9d4SSatish Balay     }
489371c9d4SSatish Balay     if (j < n - 1) {
499371c9d4SSatish Balay       J = Ii + 1;
509371c9d4SSatish Balay       PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
519371c9d4SSatish Balay     }
529371c9d4SSatish Balay     v = 4.0;
539371c9d4SSatish Balay     PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, ADD_VALUES));
54c4762a1bSJed Brown   }
55c4762a1bSJed Brown 
56c4762a1bSJed Brown   /* Make the matrix nonsymmetric if desired */
57c4762a1bSJed Brown   if (mat_nonsymmetric) {
58c4762a1bSJed Brown     for (Ii = Istart; Ii < Iend; Ii++) {
599371c9d4SSatish Balay       v = -1.5;
609371c9d4SSatish Balay       i = Ii / n;
619371c9d4SSatish Balay       if (i > 1) {
629371c9d4SSatish Balay         J = Ii - n - 1;
639371c9d4SSatish Balay         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
649371c9d4SSatish Balay       }
65c4762a1bSJed Brown     }
66c4762a1bSJed Brown   } else {
679566063dSJacob Faibussowitsch     PetscCall(MatSetOption(C, MAT_SYMMETRIC, PETSC_TRUE));
689566063dSJacob Faibussowitsch     PetscCall(MatSetOption(C, MAT_SYMMETRY_ETERNAL, PETSC_TRUE));
69c4762a1bSJed Brown   }
709566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY));
719566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY));
729566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)C, "C"));
739566063dSJacob Faibussowitsch   PetscCall(MatViewFromOptions(C, NULL, "-view"));
74c4762a1bSJed Brown 
75b84f494bSStefano Zampini   /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */
769566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD, &C1));
779566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(C1, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n));
789566063dSJacob Faibussowitsch   PetscCall(MatSetFromOptions(C1));
799566063dSJacob Faibussowitsch   PetscCall(MatSeqAIJSetPreallocation(C1, 1, NULL));
809566063dSJacob Faibussowitsch   PetscCall(MatMPIAIJSetPreallocation(C1, 1, NULL, 1, NULL));
81c4762a1bSJed Brown   for (Ii = Istart; Ii < Iend; Ii++) {
82039c6fbaSStefano Zampini     v = 1.0;
83039c6fbaSStefano Zampini     i = m * n - Ii - 1;
84039c6fbaSStefano Zampini     j = Ii;
859566063dSJacob Faibussowitsch     PetscCall(MatSetValues(C1, 1, &i, 1, &j, &v, ADD_VALUES));
86c4762a1bSJed Brown   }
879566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(C1, MAT_FINAL_ASSEMBLY));
889566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(C1, MAT_FINAL_ASSEMBLY));
899566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)C1, "C1"));
909566063dSJacob Faibussowitsch   PetscCall(MatViewFromOptions(C1, NULL, "-view"));
919566063dSJacob Faibussowitsch   PetscCall(MatDuplicate(C1, MAT_COPY_VALUES, &CU));
92b84f494bSStefano Zampini 
939566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n"));
949566063dSJacob Faibussowitsch   PetscCall(MatAXPY(C1, 2.0, C, DIFFERENT_NONZERO_PATTERN));
959566063dSJacob Faibussowitsch   PetscCall(MatAXPY(CU, 2.0, C, UNKNOWN_NONZERO_PATTERN));
969566063dSJacob Faibussowitsch   PetscCall(MatGetInfo(C1, MAT_GLOBAL_SUM, &info));
979566063dSJacob 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));
989566063dSJacob Faibussowitsch   PetscCall(MatViewFromOptions(C1, NULL, "-view"));
999566063dSJacob Faibussowitsch   PetscCall(MatMultEqual(CU, C1, 10, &flg));
100b84f494bSStefano Zampini   if (!flg) {
1019566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly DIFFERENT_NONZERO_PATTERN)\n"));
1029566063dSJacob Faibussowitsch     PetscCall(MatViewFromOptions(CU, NULL, "-view"));
103b84f494bSStefano Zampini   }
1049566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&CU));
105c4762a1bSJed Brown 
106b84f494bSStefano Zampini   /* Secondly, compute C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */
1079566063dSJacob Faibussowitsch   PetscCall(MatDuplicate(C, MAT_DO_NOT_COPY_VALUES, &C2));
1089566063dSJacob Faibussowitsch   PetscCall(MatDuplicate(C1, MAT_COPY_VALUES, &CU));
109c4762a1bSJed Brown 
110c4762a1bSJed Brown   for (Ii = Istart; Ii < Iend; Ii++) {
111c4762a1bSJed Brown     v = 1.0;
1129566063dSJacob Faibussowitsch     PetscCall(MatSetValues(C2, 1, &Ii, 1, &Ii, &v, ADD_VALUES));
113c4762a1bSJed Brown   }
1149566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(C2, MAT_FINAL_ASSEMBLY));
1159566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(C2, MAT_FINAL_ASSEMBLY));
1169566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)C2, "C2"));
1179566063dSJacob Faibussowitsch   PetscCall(MatViewFromOptions(C2, NULL, "-view"));
1189566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n"));
1199566063dSJacob Faibussowitsch   PetscCall(MatAXPY(C1, 2.0, C2, SUBSET_NONZERO_PATTERN));
1209566063dSJacob Faibussowitsch   PetscCall(MatAXPY(CU, 2.0, C2, UNKNOWN_NONZERO_PATTERN));
1219566063dSJacob Faibussowitsch   PetscCall(MatGetInfo(C1, MAT_GLOBAL_SUM, &info));
1229566063dSJacob 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));
1239566063dSJacob Faibussowitsch   PetscCall(MatViewFromOptions(C1, NULL, "-view"));
1249566063dSJacob Faibussowitsch   PetscCall(MatMultEqual(CU, C1, 10, &flg));
125b84f494bSStefano Zampini   if (!flg) {
1269566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n"));
1279566063dSJacob Faibussowitsch     PetscCall(MatViewFromOptions(CU, NULL, "-view"));
128b84f494bSStefano Zampini   }
1299566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&CU));
130039c6fbaSStefano Zampini 
131b84f494bSStefano Zampini   /* Test SAME_NONZERO_PATTERN computing C2 = C2 + 2.0 * C */
1329566063dSJacob Faibussowitsch   PetscCall(MatDuplicate(C2, MAT_COPY_VALUES, &CU));
1339566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n"));
1349566063dSJacob Faibussowitsch   PetscCall(MatAXPY(C2, 2.0, C, SAME_NONZERO_PATTERN));
1359566063dSJacob Faibussowitsch   PetscCall(MatAXPY(CU, 2.0, C, UNKNOWN_NONZERO_PATTERN));
1369566063dSJacob Faibussowitsch   PetscCall(MatGetInfo(C2, MAT_GLOBAL_SUM, &info));
1379566063dSJacob 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));
1389566063dSJacob Faibussowitsch   PetscCall(MatViewFromOptions(C2, NULL, "-view"));
1399566063dSJacob Faibussowitsch   PetscCall(MatMultEqual(CU, C2, 10, &flg));
140b84f494bSStefano Zampini   if (!flg) {
1419566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n"));
1429566063dSJacob Faibussowitsch     PetscCall(MatViewFromOptions(CU, NULL, "-view"));
143b84f494bSStefano Zampini   }
1449566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&CU));
145c4762a1bSJed Brown 
1469566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&C1));
1479566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&C2));
1489566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&C));
149c4762a1bSJed Brown 
1509566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
151b122ec5aSJacob Faibussowitsch   return 0;
152c4762a1bSJed Brown }
153c4762a1bSJed Brown 
154c4762a1bSJed Brown /*TEST
155c4762a1bSJed Brown 
156c4762a1bSJed Brown    test:
157039c6fbaSStefano Zampini      suffix: 1
158039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
159039c6fbaSStefano Zampini      args: -view
160039c6fbaSStefano Zampini      diff_args: -j
161039c6fbaSStefano Zampini 
162039c6fbaSStefano Zampini    test:
163039c6fbaSStefano Zampini      output_file: output/ex132_1.out
164039c6fbaSStefano Zampini      requires: cuda
165039c6fbaSStefano Zampini      suffix: 1_cuda
166039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
167039c6fbaSStefano Zampini      args: -view -mat_type aijcusparse
168039c6fbaSStefano Zampini      diff_args: -j
169039c6fbaSStefano Zampini 
170039c6fbaSStefano Zampini    test:
171039c6fbaSStefano Zampini      output_file: output/ex132_1.out
172039c6fbaSStefano Zampini      requires: kokkos_kernels
173039c6fbaSStefano Zampini      suffix: 1_kokkos
174039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
175039c6fbaSStefano Zampini      args: -view -mat_type aijkokkos
176039c6fbaSStefano Zampini      diff_args: -j
177039c6fbaSStefano Zampini 
178039c6fbaSStefano Zampini    test:
179039c6fbaSStefano Zampini      suffix: 2
180039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
181039c6fbaSStefano Zampini      args: -view -mat_nonsym
182039c6fbaSStefano Zampini      diff_args: -j
183039c6fbaSStefano Zampini 
184039c6fbaSStefano Zampini    test:
185039c6fbaSStefano Zampini      output_file: output/ex132_2.out
186039c6fbaSStefano Zampini      requires: cuda
187039c6fbaSStefano Zampini      suffix: 2_cuda
188039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
189039c6fbaSStefano Zampini      args: -view -mat_type aijcusparse -mat_nonsym
190039c6fbaSStefano Zampini      diff_args: -j
191039c6fbaSStefano Zampini 
192039c6fbaSStefano Zampini    test:
193039c6fbaSStefano Zampini      output_file: output/ex132_2.out
194039c6fbaSStefano Zampini      requires: kokkos_kernels
195039c6fbaSStefano Zampini      suffix: 2_kokkos
196039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
197039c6fbaSStefano Zampini      args: -view -mat_type aijkokkos -mat_nonsym
198039c6fbaSStefano Zampini      diff_args: -j
199039c6fbaSStefano Zampini 
200039c6fbaSStefano Zampini    test:
201039c6fbaSStefano Zampini      nsize: 2
202039c6fbaSStefano Zampini      suffix: 1_par
203039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
204039c6fbaSStefano Zampini      args: -view
205039c6fbaSStefano Zampini      diff_args: -j
206039c6fbaSStefano Zampini 
207039c6fbaSStefano Zampini    test:
208039c6fbaSStefano Zampini      nsize: 2
209039c6fbaSStefano Zampini      output_file: output/ex132_1_par.out
210039c6fbaSStefano Zampini      requires: cuda
211039c6fbaSStefano Zampini      suffix: 1_par_cuda
212039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
213039c6fbaSStefano Zampini      args: -view -mat_type aijcusparse
214039c6fbaSStefano Zampini      diff_args: -j
215039c6fbaSStefano Zampini 
216039c6fbaSStefano Zampini    test:
217039c6fbaSStefano Zampini      nsize: 2
218039c6fbaSStefano Zampini      output_file: output/ex132_1_par.out
219dcfd994dSJunchao Zhang      requires: kokkos_kernels
220039c6fbaSStefano Zampini      suffix: 1_par_kokkos
221039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
222039c6fbaSStefano Zampini      args: -view -mat_type aijkokkos
223039c6fbaSStefano Zampini      diff_args: -j
224039c6fbaSStefano Zampini 
225039c6fbaSStefano Zampini    test:
226039c6fbaSStefano Zampini      nsize: 2
227039c6fbaSStefano Zampini      suffix: 2_par
228039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
229039c6fbaSStefano Zampini      args: -view -mat_nonsym
230039c6fbaSStefano Zampini      diff_args: -j
231039c6fbaSStefano Zampini 
232039c6fbaSStefano Zampini    test:
233039c6fbaSStefano Zampini      nsize: 2
234039c6fbaSStefano Zampini      output_file: output/ex132_2_par.out
235039c6fbaSStefano Zampini      requires: cuda
236039c6fbaSStefano Zampini      suffix: 2_par_cuda
237039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
238039c6fbaSStefano Zampini      args: -view -mat_type aijcusparse -mat_nonsym
239039c6fbaSStefano Zampini      diff_args: -j
240039c6fbaSStefano Zampini 
241f3482364SScott Kruger    testset:
242039c6fbaSStefano Zampini      nsize: 2
243039c6fbaSStefano Zampini      output_file: output/ex132_2_par.out
244dcfd994dSJunchao Zhang      requires: kokkos_kernels
245039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
246f3482364SScott Kruger      args: -view -mat_type aijkokkos -mat_nonsym
247039c6fbaSStefano Zampini      diff_args: -j
248f3482364SScott Kruger      test:
249f3482364SScott Kruger        suffix: 2_par_kokkos_no_gpu_aware
250f3482364SScott Kruger        args: -use_gpu_aware_mpi 0
251f3482364SScott Kruger      test:
252f3482364SScott Kruger        requires: defined(HAVE_MPI_GPU_AWARE)
253f3482364SScott Kruger        suffix: 2_par_kokkos_gpu_aware
254f3482364SScott Kruger        args: -use_gpu_aware_mpi 1
255c4762a1bSJed Brown 
256c4762a1bSJed Brown TEST*/
257