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 -use_gpu_aware_mpi {{0 1}}
229: diff_args: -j
231: TEST*/