xref: /petsc/src/mat/tests/ex123.c (revision 4e47ed040c120ffed79fa7586dd21ce722480aea)
1*4e47ed04SStefano Zampini static char help[] = "Test MatSetPreallocationCOO and MatSetValuesCOO\n\n";
2*4e47ed04SStefano Zampini 
3*4e47ed04SStefano Zampini #include <petscmat.h>
4*4e47ed04SStefano Zampini #define MyMatView(a,b) PetscPrintf(PetscObjectComm((PetscObject)(a)),"LINE %d\n",__LINE__),MatView(a,b);
5*4e47ed04SStefano Zampini #define MyVecView(a,b) PetscPrintf(PetscObjectComm((PetscObject)(a)),"LINE %d\n",__LINE__),VecView(a,b);
6*4e47ed04SStefano Zampini int main(int argc,char **args)
7*4e47ed04SStefano Zampini {
8*4e47ed04SStefano Zampini   Mat            A,At,AAt;
9*4e47ed04SStefano Zampini   Vec            x,y,z;
10*4e47ed04SStefano Zampini   PetscLayout    rmap,cmap;
11*4e47ed04SStefano Zampini   PetscInt       n1 = 11, n2 = 9;
12*4e47ed04SStefano Zampini   PetscInt       i1[] = {   7,  6,  2,  0,  4,  1,  1,  0,  2,  2,  1 };
13*4e47ed04SStefano Zampini   PetscInt       j1[] = {   1,  4,  3,  5,  3,  3,  4,  5,  0,  3,  1 };
14*4e47ed04SStefano Zampini   PetscInt       i2[] = {   7,  6,  2,  0,  4,  1,  1,  2, 1 };
15*4e47ed04SStefano Zampini   PetscInt       j2[] = {   1,  4,  3,  5,  3,  3,  4,  0, 1 };
16*4e47ed04SStefano Zampini   PetscScalar    v1[] = { -1., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.};
17*4e47ed04SStefano Zampini   PetscScalar    v2[] = {  1.,-1.,-2.,-3.,-4.,-5.,-6.,-7.,-8.,-9.,-10.};
18*4e47ed04SStefano Zampini   PetscInt       N = 6, m = 8, rstart, cstart, i;
19*4e47ed04SStefano Zampini   PetscMPIInt    size;
20*4e47ed04SStefano Zampini   PetscBool      loc = PETSC_FALSE;
21*4e47ed04SStefano Zampini   PetscBool      locdiag = PETSC_TRUE, ismpiaij;
22*4e47ed04SStefano Zampini   PetscErrorCode ierr;
23*4e47ed04SStefano Zampini 
24*4e47ed04SStefano Zampini   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
25*4e47ed04SStefano Zampini   ierr = PetscOptionsGetBool(NULL,NULL,"-loc",&loc,NULL);CHKERRQ(ierr);
26*4e47ed04SStefano Zampini   ierr = PetscOptionsGetBool(NULL,NULL,"-locdiag",&locdiag,NULL);CHKERRQ(ierr);
27*4e47ed04SStefano Zampini 
28*4e47ed04SStefano Zampini   ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
29*4e47ed04SStefano Zampini   if (loc) {
30*4e47ed04SStefano Zampini     if (locdiag) {
31*4e47ed04SStefano Zampini       ierr = MatSetSizes(A,m,N,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr);
32*4e47ed04SStefano Zampini     } else {
33*4e47ed04SStefano Zampini       ierr = MatSetSizes(A,m,m+N,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr);
34*4e47ed04SStefano Zampini     }
35*4e47ed04SStefano Zampini   } else {
36*4e47ed04SStefano Zampini     ierr = MatSetSizes(A,m,PETSC_DECIDE,PETSC_DECIDE,N);CHKERRQ(ierr);
37*4e47ed04SStefano Zampini   }
38*4e47ed04SStefano Zampini   ierr = MatSetFromOptions(A);CHKERRQ(ierr);
39*4e47ed04SStefano Zampini   ierr = MatGetLayouts(A,&rmap,&cmap);CHKERRQ(ierr);
40*4e47ed04SStefano Zampini   ierr = PetscLayoutSetUp(rmap);CHKERRQ(ierr);
41*4e47ed04SStefano Zampini   ierr = PetscLayoutSetUp(cmap);CHKERRQ(ierr);
42*4e47ed04SStefano Zampini   ierr = MatCreateVecs(A,&x,&y);CHKERRQ(ierr);
43*4e47ed04SStefano Zampini   ierr = MatCreateVecs(A,NULL,&z);CHKERRQ(ierr);
44*4e47ed04SStefano Zampini   ierr = VecSet(x,1.);CHKERRQ(ierr);
45*4e47ed04SStefano Zampini   ierr = VecSet(z,2.);CHKERRQ(ierr);
46*4e47ed04SStefano Zampini   ierr = PetscLayoutGetRange(rmap,&rstart,NULL);CHKERRQ(ierr);
47*4e47ed04SStefano Zampini   ierr = PetscLayoutGetRange(cmap,&cstart,NULL);CHKERRQ(ierr);
48*4e47ed04SStefano Zampini   for (i = 0; i < n1; i++) i1[i] += rstart;
49*4e47ed04SStefano Zampini   for (i = 0; i < n2; i++) i2[i] += rstart;
50*4e47ed04SStefano Zampini   if (loc) {
51*4e47ed04SStefano Zampini     if (locdiag) {
52*4e47ed04SStefano Zampini       for (i = 0; i < n1; i++) j1[i] += cstart;
53*4e47ed04SStefano Zampini       for (i = 0; i < n2; i++) j2[i] += cstart;
54*4e47ed04SStefano Zampini     } else {
55*4e47ed04SStefano Zampini       for (i = 0; i < n1; i++) j1[i] += cstart + m;
56*4e47ed04SStefano Zampini       for (i = 0; i < n2; i++) j2[i] += cstart + m;
57*4e47ed04SStefano Zampini     }
58*4e47ed04SStefano Zampini   }
59*4e47ed04SStefano Zampini 
60*4e47ed04SStefano Zampini   /* test with repeated entries */
61*4e47ed04SStefano Zampini   ierr = MatSetPreallocationCOO(A,n1,i1,j1);CHKERRQ(ierr);
62*4e47ed04SStefano Zampini   ierr = MatSetValuesCOO(A,v1,ADD_VALUES);CHKERRQ(ierr);
63*4e47ed04SStefano Zampini   ierr = MyMatView(A,NULL);CHKERRQ(ierr);
64*4e47ed04SStefano Zampini   ierr = MatMult(A,x,y);CHKERRQ(ierr);
65*4e47ed04SStefano Zampini   ierr = MyVecView(y,NULL);CHKERRQ(ierr);
66*4e47ed04SStefano Zampini   ierr = MatSetValuesCOO(A,v2,ADD_VALUES);CHKERRQ(ierr);
67*4e47ed04SStefano Zampini   ierr = MyMatView(A,NULL);CHKERRQ(ierr);
68*4e47ed04SStefano Zampini   ierr = MatMultAdd(A,x,y,y);CHKERRQ(ierr);
69*4e47ed04SStefano Zampini   ierr = MyVecView(y,NULL);CHKERRQ(ierr);
70*4e47ed04SStefano Zampini   ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&At);CHKERRQ(ierr);
71*4e47ed04SStefano Zampini   ierr = MatMatMult(A,At,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr);
72*4e47ed04SStefano Zampini   ierr = MyMatView(AAt,NULL);CHKERRQ(ierr);
73*4e47ed04SStefano Zampini   ierr = MatDestroy(&AAt);CHKERRQ(ierr);
74*4e47ed04SStefano Zampini   ierr = MatMatMult(At,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr);
75*4e47ed04SStefano Zampini   ierr = MyMatView(AAt,NULL);CHKERRQ(ierr);
76*4e47ed04SStefano Zampini   ierr = MatDestroy(&AAt);CHKERRQ(ierr);
77*4e47ed04SStefano Zampini   ierr = MatDestroy(&At);CHKERRQ(ierr);
78*4e47ed04SStefano Zampini 
79*4e47ed04SStefano Zampini   /* test with unique entries */
80*4e47ed04SStefano Zampini   ierr = MatSetPreallocationCOO(A,n2,i2,j2);CHKERRQ(ierr);
81*4e47ed04SStefano Zampini   ierr = MatSetValuesCOO(A,v1,ADD_VALUES);CHKERRQ(ierr);
82*4e47ed04SStefano Zampini   ierr = MyMatView(A,NULL);CHKERRQ(ierr);
83*4e47ed04SStefano Zampini   ierr = MatMult(A,x,y);CHKERRQ(ierr);
84*4e47ed04SStefano Zampini   ierr = MyVecView(y,NULL);CHKERRQ(ierr);
85*4e47ed04SStefano Zampini   ierr = MatSetValuesCOO(A,v2,ADD_VALUES);CHKERRQ(ierr);
86*4e47ed04SStefano Zampini   ierr = MyMatView(A,NULL);CHKERRQ(ierr);
87*4e47ed04SStefano Zampini   ierr = MatMultAdd(A,x,y,z);CHKERRQ(ierr);
88*4e47ed04SStefano Zampini   ierr = MyVecView(z,NULL);CHKERRQ(ierr);
89*4e47ed04SStefano Zampini   ierr = MatSetPreallocationCOO(A,n2,i2,j2);CHKERRQ(ierr);
90*4e47ed04SStefano Zampini   ierr = MatSetValuesCOO(A,v1,INSERT_VALUES);CHKERRQ(ierr);
91*4e47ed04SStefano Zampini   ierr = MyMatView(A,NULL);CHKERRQ(ierr);
92*4e47ed04SStefano Zampini   ierr = MatMult(A,x,y);CHKERRQ(ierr);
93*4e47ed04SStefano Zampini   ierr = MyVecView(y,NULL);CHKERRQ(ierr);
94*4e47ed04SStefano Zampini   ierr = MatSetValuesCOO(A,v2,INSERT_VALUES);CHKERRQ(ierr);
95*4e47ed04SStefano Zampini   ierr = MyMatView(A,NULL);CHKERRQ(ierr);
96*4e47ed04SStefano Zampini   ierr = MatMultAdd(A,x,y,z);CHKERRQ(ierr);
97*4e47ed04SStefano Zampini   ierr = MyVecView(z,NULL);CHKERRQ(ierr);
98*4e47ed04SStefano Zampini   ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&At);CHKERRQ(ierr);
99*4e47ed04SStefano Zampini   ierr = MatMatMult(A,At,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr);
100*4e47ed04SStefano Zampini   ierr = MyMatView(AAt,NULL);CHKERRQ(ierr);
101*4e47ed04SStefano Zampini   ierr = MatDestroy(&AAt);CHKERRQ(ierr);
102*4e47ed04SStefano Zampini   ierr = MatMatMult(At,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr);
103*4e47ed04SStefano Zampini   ierr = MyMatView(AAt,NULL);CHKERRQ(ierr);
104*4e47ed04SStefano Zampini   ierr = MatDestroy(&AAt);CHKERRQ(ierr);
105*4e47ed04SStefano Zampini   ierr = MatDestroy(&At);CHKERRQ(ierr);
106*4e47ed04SStefano Zampini 
107*4e47ed04SStefano Zampini   /* test providing diagonal first, the offdiagonal */
108*4e47ed04SStefano Zampini   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)A),&size);CHKERRQ(ierr);
109*4e47ed04SStefano Zampini   ierr = PetscObjectBaseTypeCompare((PetscObject)A,MATMPIAIJ,&ismpiaij);CHKERRQ(ierr);
110*4e47ed04SStefano Zampini   if (ismpiaij && size > 1) {
111*4e47ed04SStefano Zampini     Mat               lA,lB;
112*4e47ed04SStefano Zampini     const PetscInt    *garray,*iA,*jA,*iB,*jB;
113*4e47ed04SStefano Zampini     const PetscScalar *vA,*vB;
114*4e47ed04SStefano Zampini     PetscScalar       *coo_v;
115*4e47ed04SStefano Zampini     PetscInt          *coo_i,*coo_j;
116*4e47ed04SStefano Zampini     PetscInt          i,j,nA,nB,nnz;
117*4e47ed04SStefano Zampini     PetscBool         flg;
118*4e47ed04SStefano Zampini 
119*4e47ed04SStefano Zampini     ierr = MatMPIAIJGetSeqAIJ(A,&lA,&lB,&garray);CHKERRQ(ierr);
120*4e47ed04SStefano Zampini     ierr = MatSeqAIJGetArrayRead(lA,&vA);CHKERRQ(ierr);
121*4e47ed04SStefano Zampini     ierr = MatSeqAIJGetArrayRead(lB,&vB);CHKERRQ(ierr);
122*4e47ed04SStefano Zampini     ierr = MatGetRowIJ(lA,0,PETSC_FALSE,PETSC_FALSE,&nA,&iA,&jA,&flg);CHKERRQ(ierr);
123*4e47ed04SStefano Zampini     ierr = MatGetRowIJ(lB,0,PETSC_FALSE,PETSC_FALSE,&nB,&iB,&jB,&flg);CHKERRQ(ierr);
124*4e47ed04SStefano Zampini     nnz  = iA[nA] + iB[nB];
125*4e47ed04SStefano Zampini     ierr = PetscMalloc3(nnz,&coo_i,nnz,&coo_j,nnz,&coo_v);CHKERRQ(ierr);
126*4e47ed04SStefano Zampini     nnz  = 0;
127*4e47ed04SStefano Zampini     for (i=0;i<nA;i++) {
128*4e47ed04SStefano Zampini       for (j=iA[i];j<iA[i+1];j++,nnz++) {
129*4e47ed04SStefano Zampini         coo_i[nnz] = i+rstart;
130*4e47ed04SStefano Zampini         coo_j[nnz] = jA[j]+cstart;
131*4e47ed04SStefano Zampini         coo_v[nnz] = vA[j];
132*4e47ed04SStefano Zampini       }
133*4e47ed04SStefano Zampini     }
134*4e47ed04SStefano Zampini     for (i=0;i<nB;i++) {
135*4e47ed04SStefano Zampini       for (j=iB[i];j<iB[i+1];j++,nnz++) {
136*4e47ed04SStefano Zampini         coo_i[nnz] = i+rstart;
137*4e47ed04SStefano Zampini         coo_j[nnz] = garray[jB[j]];
138*4e47ed04SStefano Zampini         coo_v[nnz] = vB[j];
139*4e47ed04SStefano Zampini       }
140*4e47ed04SStefano Zampini     }
141*4e47ed04SStefano Zampini     ierr = MatRestoreRowIJ(lA,0,PETSC_FALSE,PETSC_FALSE,&nA,&iA,&jA,&flg);CHKERRQ(ierr);
142*4e47ed04SStefano Zampini     ierr = MatRestoreRowIJ(lB,0,PETSC_FALSE,PETSC_FALSE,&nB,&iB,&jB,&flg);CHKERRQ(ierr);
143*4e47ed04SStefano Zampini     ierr = MatSeqAIJRestoreArrayRead(lA,&vA);CHKERRQ(ierr);
144*4e47ed04SStefano Zampini     ierr = MatSeqAIJRestoreArrayRead(lB,&vB);CHKERRQ(ierr);
145*4e47ed04SStefano Zampini 
146*4e47ed04SStefano Zampini     ierr = MatSetPreallocationCOO(A,nnz,coo_i,coo_j);CHKERRQ(ierr);
147*4e47ed04SStefano Zampini     ierr = MatSetValuesCOO(A,coo_v,ADD_VALUES);CHKERRQ(ierr);
148*4e47ed04SStefano Zampini     ierr = MyMatView(A,NULL);CHKERRQ(ierr);
149*4e47ed04SStefano Zampini     ierr = MatMult(A,x,y);CHKERRQ(ierr);
150*4e47ed04SStefano Zampini     ierr = MyVecView(y,NULL);CHKERRQ(ierr);
151*4e47ed04SStefano Zampini     ierr = MatSetValuesCOO(A,coo_v,INSERT_VALUES);CHKERRQ(ierr);
152*4e47ed04SStefano Zampini     ierr = MyMatView(A,NULL);CHKERRQ(ierr);
153*4e47ed04SStefano Zampini     ierr = MatMult(A,x,y);CHKERRQ(ierr);
154*4e47ed04SStefano Zampini     ierr = MyVecView(y,NULL);CHKERRQ(ierr);
155*4e47ed04SStefano Zampini     ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&At);CHKERRQ(ierr);
156*4e47ed04SStefano Zampini     ierr = MatMatMult(A,At,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr);
157*4e47ed04SStefano Zampini     ierr = MyMatView(AAt,NULL);CHKERRQ(ierr);
158*4e47ed04SStefano Zampini     ierr = MatDestroy(&AAt);CHKERRQ(ierr);
159*4e47ed04SStefano Zampini     ierr = MatMatMult(At,A,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&AAt);CHKERRQ(ierr);
160*4e47ed04SStefano Zampini     ierr = MyMatView(AAt,NULL);CHKERRQ(ierr);
161*4e47ed04SStefano Zampini     ierr = MatDestroy(&AAt);CHKERRQ(ierr);
162*4e47ed04SStefano Zampini     ierr = MatDestroy(&At);CHKERRQ(ierr);
163*4e47ed04SStefano Zampini 
164*4e47ed04SStefano Zampini     ierr = PetscFree3(coo_i,coo_j,coo_v);CHKERRQ(ierr);
165*4e47ed04SStefano Zampini   }
166*4e47ed04SStefano Zampini   ierr = VecDestroy(&z);CHKERRQ(ierr);
167*4e47ed04SStefano Zampini   ierr = VecDestroy(&x);CHKERRQ(ierr);
168*4e47ed04SStefano Zampini   ierr = VecDestroy(&y);CHKERRQ(ierr);
169*4e47ed04SStefano Zampini   ierr = MatDestroy(&A);CHKERRQ(ierr);
170*4e47ed04SStefano Zampini   ierr = PetscFinalize();
171*4e47ed04SStefano Zampini   return ierr;
172*4e47ed04SStefano Zampini }
173*4e47ed04SStefano Zampini 
174*4e47ed04SStefano Zampini 
175*4e47ed04SStefano Zampini /*TEST
176*4e47ed04SStefano Zampini 
177*4e47ed04SStefano Zampini    test:
178*4e47ed04SStefano Zampini      suffix: 1
179*4e47ed04SStefano Zampini      filter: grep -v type
180*4e47ed04SStefano Zampini      diff_args: -j
181*4e47ed04SStefano Zampini      args: -mat_type {{seqaij mpiaij}}
182*4e47ed04SStefano Zampini 
183*4e47ed04SStefano Zampini    test:
184*4e47ed04SStefano Zampini      requires: cuda
185*4e47ed04SStefano Zampini      suffix: 1_cuda
186*4e47ed04SStefano Zampini      filter: grep -v type
187*4e47ed04SStefano Zampini      diff_args: -j
188*4e47ed04SStefano Zampini      args: -mat_type {{seqaijcusparse mpiaijcusparse}}
189*4e47ed04SStefano Zampini      output_file: output/ex123_1.out
190*4e47ed04SStefano Zampini 
191*4e47ed04SStefano Zampini    test:
192*4e47ed04SStefano Zampini      suffix: 2
193*4e47ed04SStefano Zampini      nsize: 7
194*4e47ed04SStefano Zampini      filter: grep -v type
195*4e47ed04SStefano Zampini      diff_args: -j
196*4e47ed04SStefano Zampini      args: -mat_type mpiaij
197*4e47ed04SStefano Zampini 
198*4e47ed04SStefano Zampini    test:
199*4e47ed04SStefano Zampini      requires: cuda
200*4e47ed04SStefano Zampini      suffix: 2_cuda
201*4e47ed04SStefano Zampini      nsize: 7
202*4e47ed04SStefano Zampini      filter: grep -v type
203*4e47ed04SStefano Zampini      diff_args: -j
204*4e47ed04SStefano Zampini      args: -mat_type mpiaijcusparse
205*4e47ed04SStefano Zampini      output_file: output/ex123_2.out
206*4e47ed04SStefano Zampini 
207*4e47ed04SStefano Zampini    test:
208*4e47ed04SStefano Zampini      suffix: 3
209*4e47ed04SStefano Zampini      nsize: 3
210*4e47ed04SStefano Zampini      filter: grep -v type
211*4e47ed04SStefano Zampini      diff_args: -j
212*4e47ed04SStefano Zampini      args: -mat_type mpiaij -loc
213*4e47ed04SStefano Zampini 
214*4e47ed04SStefano Zampini    test:
215*4e47ed04SStefano Zampini      requires: cuda
216*4e47ed04SStefano Zampini      suffix: 3_cuda
217*4e47ed04SStefano Zampini      nsize: 3
218*4e47ed04SStefano Zampini      filter: grep -v type
219*4e47ed04SStefano Zampini      diff_args: -j
220*4e47ed04SStefano Zampini      args: -mat_type mpiaijcusparse -loc
221*4e47ed04SStefano Zampini      output_file: output/ex123_3.out
222*4e47ed04SStefano Zampini 
223*4e47ed04SStefano Zampini    test:
224*4e47ed04SStefano Zampini      suffix: 4
225*4e47ed04SStefano Zampini      nsize: 4
226*4e47ed04SStefano Zampini      filter: grep -v type
227*4e47ed04SStefano Zampini      diff_args: -j
228*4e47ed04SStefano Zampini      args: -mat_type mpiaij -loc -locdiag 0
229*4e47ed04SStefano Zampini 
230*4e47ed04SStefano Zampini    test:
231*4e47ed04SStefano Zampini      requires: cuda
232*4e47ed04SStefano Zampini      suffix: 4_cuda
233*4e47ed04SStefano Zampini      nsize: 4
234*4e47ed04SStefano Zampini      filter: grep -v type
235*4e47ed04SStefano Zampini      diff_args: -j
236*4e47ed04SStefano Zampini      args: -mat_type mpiaijcusparse -loc -locdiag 0
237*4e47ed04SStefano Zampini      output_file: output/ex123_4.out
238*4e47ed04SStefano Zampini 
239*4e47ed04SStefano Zampini TEST*/
240