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;
 12:   PetscInt       i,j,m = 3,n;
 13:   PetscMPIInt    size;
 14:   PetscBool      mat_nonsymmetric = PETSC_FALSE,flg;
 15:   MatInfo        info;

 17:   PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
 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; i = Ii/n; j = Ii - i*n;
 34:     if (i>0)   {J = Ii - n; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
 35:     if (i<m-1) {J = Ii + n; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
 36:     if (j>0)   {J = Ii - 1; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
 37:     if (j<n-1) {J = Ii + 1; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
 38:     v = 4.0; MatSetValues(C,1,&Ii,1,&Ii,&v,ADD_VALUES);
 39:   }

 41:   /* Make the matrix nonsymmetric if desired */
 42:   if (mat_nonsymmetric) {
 43:     for (Ii=Istart; Ii<Iend; Ii++) {
 44:       v = -1.5; i = Ii/n;
 45:       if (i>1) {J = Ii-n-1; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
 46:     }
 47:   } else {
 48:     MatSetOption(C,MAT_SYMMETRIC,PETSC_TRUE);
 49:     MatSetOption(C,MAT_SYMMETRY_ETERNAL,PETSC_TRUE);
 50:   }
 51:   MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);
 52:   MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);
 53:   PetscObjectSetName((PetscObject)C,"C");
 54:   MatViewFromOptions(C,NULL,"-view");

 56:   /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */
 57:   MatCreate(PETSC_COMM_WORLD,&C1);
 58:   MatSetSizes(C1,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);
 59:   MatSetFromOptions(C1);
 60:   MatSeqAIJSetPreallocation(C1,1,NULL);
 61:   MatMPIAIJSetPreallocation(C1,1,NULL,1,NULL);
 62:   for (Ii=Istart; Ii<Iend; Ii++) {
 63:     v = 1.0;
 64:     i = m*n - Ii -1;
 65:     j = Ii;
 66:     MatSetValues(C1,1,&i,1,&j,&v,ADD_VALUES);
 67:   }
 68:   MatAssemblyBegin(C1,MAT_FINAL_ASSEMBLY);
 69:   MatAssemblyEnd(C1,MAT_FINAL_ASSEMBLY);
 70:   PetscObjectSetName((PetscObject)C1,"C1");
 71:   MatViewFromOptions(C1,NULL,"-view");
 72:   MatDuplicate(C1,MAT_COPY_VALUES,&CU);

 74:   PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n");
 75:   MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN);
 76:   MatAXPY(CU,2.0,C,UNKNOWN_NONZERO_PATTERN);
 77:   MatGetInfo(C1,MAT_GLOBAL_SUM,&info);
 78:   PetscPrintf(PETSC_COMM_WORLD," C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);
 79:   MatViewFromOptions(C1,NULL,"-view");
 80:   MatMultEqual(CU,C1,10,&flg);
 81:   if (!flg) {
 82:     PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly DIFFERENT_NONZERO_PATTERN)\n");
 83:     MatViewFromOptions(CU,NULL,"-view");
 84:   }
 85:   MatDestroy(&CU);

 87:   /* Secondly, compute C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */
 88:   MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&C2);
 89:   MatDuplicate(C1,MAT_COPY_VALUES,&CU);

 91:   for (Ii=Istart; Ii<Iend; Ii++) {
 92:     v    = 1.0;
 93:     MatSetValues(C2,1,&Ii,1,&Ii,&v,ADD_VALUES);
 94:   }
 95:   MatAssemblyBegin(C2,MAT_FINAL_ASSEMBLY);
 96:   MatAssemblyEnd(C2,MAT_FINAL_ASSEMBLY);
 97:   PetscObjectSetName((PetscObject)C2,"C2");
 98:   MatViewFromOptions(C2,NULL,"-view");
 99:   PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n");
100:   MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN);
101:   MatAXPY(CU,2.0,C2,UNKNOWN_NONZERO_PATTERN);
102:   MatGetInfo(C1,MAT_GLOBAL_SUM,&info);
103:   PetscPrintf(PETSC_COMM_WORLD," C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);
104:   MatViewFromOptions(C1,NULL,"-view");
105:   MatMultEqual(CU,C1,10,&flg);
106:   if (!flg) {
107:     PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n");
108:     MatViewFromOptions(CU,NULL,"-view");
109:   }
110:   MatDestroy(&CU);

112:   /* Test SAME_NONZERO_PATTERN computing C2 = C2 + 2.0 * C */
113:   MatDuplicate(C2,MAT_COPY_VALUES,&CU);
114:   PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n");
115:   MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN);
116:   MatAXPY(CU,2.0,C,UNKNOWN_NONZERO_PATTERN);
117:   MatGetInfo(C2,MAT_GLOBAL_SUM,&info);
118:   PetscPrintf(PETSC_COMM_WORLD," C2: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);
119:   MatViewFromOptions(C2,NULL,"-view");
120:   MatMultEqual(CU,C2,10,&flg);
121:   if (!flg) {
122:     PetscPrintf(PETSC_COMM_WORLD,"Error UNKNOWN_NONZERO_PATTERN (supposedly SUBSET_NONZERO_PATTERN)\n");
123:     MatViewFromOptions(CU,NULL,"-view");
124:   }
125:   MatDestroy(&CU);

127:   MatDestroy(&C1);
128:   MatDestroy(&C2);
129:   MatDestroy(&C);

131:   PetscFinalize();
132:   return ierr;
133: }

135: /*TEST

137:    test:
138:      suffix: 1
139:      filter: grep -v " type:" | grep -v "Mat Object"
140:      args: -view
141:      diff_args: -j

143:    test:
144:      output_file: output/ex132_1.out
145:      requires: cuda
146:      suffix: 1_cuda
147:      filter: grep -v " type:" | grep -v "Mat Object"
148:      args: -view -mat_type aijcusparse
149:      diff_args: -j

151:    test:
152:      output_file: output/ex132_1.out
153:      requires: kokkos_kernels
154:      suffix: 1_kokkos
155:      filter: grep -v " type:" | grep -v "Mat Object"
156:      args: -view -mat_type aijkokkos
157:      diff_args: -j

159:    test:
160:      suffix: 2
161:      filter: grep -v " type:" | grep -v "Mat Object"
162:      args: -view -mat_nonsym
163:      diff_args: -j

165:    test:
166:      output_file: output/ex132_2.out
167:      requires: cuda
168:      suffix: 2_cuda
169:      filter: grep -v " type:" | grep -v "Mat Object"
170:      args: -view -mat_type aijcusparse -mat_nonsym
171:      diff_args: -j

173:    test:
174:      output_file: output/ex132_2.out
175:      requires: kokkos_kernels
176:      suffix: 2_kokkos
177:      filter: grep -v " type:" | grep -v "Mat Object"
178:      args: -view -mat_type aijkokkos -mat_nonsym
179:      diff_args: -j

181:    test:
182:      nsize: 2
183:      suffix: 1_par
184:      filter: grep -v " type:" | grep -v "Mat Object"
185:      args: -view
186:      diff_args: -j

188:    test:
189:      nsize: 2
190:      output_file: output/ex132_1_par.out
191:      requires: cuda
192:      suffix: 1_par_cuda
193:      filter: grep -v " type:" | grep -v "Mat Object"
194:      args: -view -mat_type aijcusparse
195:      diff_args: -j

197:    test:
198:      nsize: 2
199:      output_file: output/ex132_1_par.out
200:      requires: kokkos_kernels
201:      suffix: 1_par_kokkos
202:      filter: grep -v " type:" | grep -v "Mat Object"
203:      args: -view -mat_type aijkokkos
204:      diff_args: -j

206:    test:
207:      nsize: 2
208:      suffix: 2_par
209:      filter: grep -v " type:" | grep -v "Mat Object"
210:      args: -view -mat_nonsym
211:      diff_args: -j

213:    test:
214:      nsize: 2
215:      output_file: output/ex132_2_par.out
216:      requires: cuda
217:      suffix: 2_par_cuda
218:      filter: grep -v " type:" | grep -v "Mat Object"
219:      args: -view -mat_type aijcusparse -mat_nonsym
220:      diff_args: -j

222:    test:
223:      nsize: 2
224:      output_file: output/ex132_2_par.out
225:      requires: kokkos_kernels
226:      suffix: 2_par_kokkos
227:      filter: grep -v " type:" | grep -v "Mat Object"
228:      args: -view -mat_type aijkokkos -mat_nonsym
229:      diff_args: -j

231: TEST*/