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