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*/