xref: /petsc/src/mat/tests/ex16.c (revision 9566063d113dddea24716c546802770db7481bc0)
1c4762a1bSJed Brown static char help[] = "Tests MatDenseGetArray() and MatView()/MatLoad() with binary viewers.\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscmat.h>
4c4762a1bSJed Brown #include <petscviewer.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown static PetscErrorCode CheckValues(Mat A,PetscBool one)
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   const PetscScalar *array;
9c4762a1bSJed Brown   PetscInt          M,N,rstart,rend,lda,i,j;
10c4762a1bSJed Brown 
11c4762a1bSJed Brown   PetscFunctionBegin;
12*9566063dSJacob Faibussowitsch   PetscCall(MatDenseGetArrayRead(A,&array));
13*9566063dSJacob Faibussowitsch   PetscCall(MatDenseGetLDA(A,&lda));
14*9566063dSJacob Faibussowitsch   PetscCall(MatGetSize(A,&M,&N));
15*9566063dSJacob Faibussowitsch   PetscCall(MatGetOwnershipRange(A,&rstart,&rend));
16c4762a1bSJed Brown   for (i=rstart; i<rend; i++) {
17c4762a1bSJed Brown     for (j=0; j<N; j++) {
18c4762a1bSJed Brown       PetscInt ii = i - rstart, jj = j;
19c4762a1bSJed Brown       PetscReal v = (PetscReal)(one ? 1 : (1 + i + j*M));
20c4762a1bSJed Brown       PetscReal w = PetscRealPart(array[ii + jj*lda]);
212c71b3e2SJacob Faibussowitsch       PetscCheckFalse(PetscAbsReal(v-w) > 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix entry (%" PetscInt_FMT ",%" PetscInt_FMT ") should be %g, got %g",i,j,(double)v,(double)w);
22c4762a1bSJed Brown     }
23c4762a1bSJed Brown   }
24*9566063dSJacob Faibussowitsch   PetscCall(MatDenseRestoreArrayRead(A,&array));
25c4762a1bSJed Brown   PetscFunctionReturn(0);
26c4762a1bSJed Brown }
27c4762a1bSJed Brown 
28c4762a1bSJed Brown #define CheckValuesIJ(A)  CheckValues(A,PETSC_FALSE)
29c4762a1bSJed Brown #define CheckValuesOne(A) CheckValues(A,PETSC_TRUE)
30c4762a1bSJed Brown 
31c4762a1bSJed Brown int main(int argc,char **args)
32c4762a1bSJed Brown {
33c4762a1bSJed Brown   Mat            A;
34c4762a1bSJed Brown   PetscInt       i,j,M = 4,N = 3,rstart,rend;
35c4762a1bSJed Brown   PetscScalar    *array;
36a5225ed3SStefano Zampini   char           mattype[256];
37c4762a1bSJed Brown   PetscViewer    view;
38c4762a1bSJed Brown 
39*9566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc,&args,NULL,help));
40*9566063dSJacob Faibussowitsch   PetscCall(PetscStrcpy(mattype,MATMPIDENSE));
41*9566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL,NULL,"-mat_type",mattype,sizeof(mattype),NULL));
42c4762a1bSJed Brown   /*
43c4762a1bSJed Brown       Create a parallel dense matrix shared by all processors
44c4762a1bSJed Brown   */
45*9566063dSJacob Faibussowitsch   PetscCall(MatCreateDense(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,M,N,NULL,&A));
46*9566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY));
47*9566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY));
48*9566063dSJacob Faibussowitsch   PetscCall(MatConvert(A,mattype,MAT_INPLACE_MATRIX,&A));
49c4762a1bSJed Brown   /*
50c4762a1bSJed Brown      Set values into the matrix
51c4762a1bSJed Brown   */
52c4762a1bSJed Brown   for (i=0; i<M; i++) {
53c4762a1bSJed Brown     for (j=0; j<N; j++) {
54c4762a1bSJed Brown       PetscScalar v = (PetscReal)(1 + i + j*M);
55*9566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A,1,&i,1,&j,&v,INSERT_VALUES));
56c4762a1bSJed Brown     }
57c4762a1bSJed Brown   }
58*9566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY));
59*9566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY));
60*9566063dSJacob Faibussowitsch   PetscCall(MatScale(A,2.0));
61*9566063dSJacob Faibussowitsch   PetscCall(MatScale(A,1.0/2.0));
62c4762a1bSJed Brown 
63c4762a1bSJed Brown   /*
64c4762a1bSJed Brown       Store the binary matrix to a file
65c4762a1bSJed Brown   */
66*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_WRITE, &view));
67c4762a1bSJed Brown   for (i=0; i<2; i++) {
68*9566063dSJacob Faibussowitsch     PetscCall(MatView(A,view));
69*9566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(view,PETSC_VIEWER_NATIVE));
70*9566063dSJacob Faibussowitsch     PetscCall(MatView(A,view));
71*9566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(view));
72c4762a1bSJed Brown   }
73*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&view));
74*9566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&A));
75c4762a1bSJed Brown 
76c4762a1bSJed Brown   /*
77c4762a1bSJed Brown       Now reload the matrix and check its values
78c4762a1bSJed Brown   */
79*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_READ,&view));
80*9566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD,&A));
81*9566063dSJacob Faibussowitsch   PetscCall(MatSetType(A,mattype));
82c4762a1bSJed Brown   for (i=0; i<4; i++) {
83*9566063dSJacob Faibussowitsch     if (i > 0) PetscCall(MatZeroEntries(A));
84*9566063dSJacob Faibussowitsch     PetscCall(MatLoad(A,view));
85*9566063dSJacob Faibussowitsch     PetscCall(CheckValuesIJ(A));
86c4762a1bSJed Brown   }
87*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&view));
88c4762a1bSJed Brown 
89*9566063dSJacob Faibussowitsch   PetscCall(MatGetOwnershipRange(A,&rstart,&rend));
90*9566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1((rend-rstart)*N,&array));
91c4762a1bSJed Brown   for (i=0; i<(rend-rstart)*N; i++) array[i] = (PetscReal)1;
92*9566063dSJacob Faibussowitsch   PetscCall(MatDensePlaceArray(A,array));
93*9566063dSJacob Faibussowitsch   PetscCall(MatScale(A,2.0));
94*9566063dSJacob Faibussowitsch   PetscCall(MatScale(A,1.0/2.0));
95*9566063dSJacob Faibussowitsch   PetscCall(CheckValuesOne(A));
96*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_WRITE,&view));
97*9566063dSJacob Faibussowitsch   PetscCall(MatView(A,view));
98*9566063dSJacob Faibussowitsch   PetscCall(MatDenseResetArray(A));
99*9566063dSJacob Faibussowitsch   PetscCall(PetscFree(array));
100*9566063dSJacob Faibussowitsch   PetscCall(CheckValuesIJ(A));
101*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipHeader(view,PETSC_TRUE));
102*9566063dSJacob Faibussowitsch   PetscCall(MatView(A,view));
103*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipHeader(view,PETSC_FALSE));
104*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&view));
105*9566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&A));
106c4762a1bSJed Brown 
107*9566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD,&A));
108*9566063dSJacob Faibussowitsch   PetscCall(MatSetType(A,mattype));
109*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_READ,&view));
110*9566063dSJacob Faibussowitsch   PetscCall(MatLoad(A,view));
111*9566063dSJacob Faibussowitsch   PetscCall(CheckValuesOne(A));
112*9566063dSJacob Faibussowitsch   PetscCall(MatZeroEntries(A));
113*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipHeader(view,PETSC_TRUE));
114*9566063dSJacob Faibussowitsch   PetscCall(MatLoad(A,view));
115*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipHeader(view,PETSC_FALSE));
116*9566063dSJacob Faibussowitsch   PetscCall(CheckValuesIJ(A));
117*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&view));
118*9566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&A));
119c4762a1bSJed Brown 
120c4762a1bSJed Brown   {
121c4762a1bSJed Brown     PetscInt m = PETSC_DECIDE, n = PETSC_DECIDE;
122*9566063dSJacob Faibussowitsch     PetscCall(PetscSplitOwnership(PETSC_COMM_WORLD,&m,&M));
123*9566063dSJacob Faibussowitsch     PetscCall(PetscSplitOwnership(PETSC_COMM_WORLD,&n,&N));
124c4762a1bSJed Brown     /* TODO: MatCreateDense requires data!=NULL at all processes! */
125*9566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(m*N+1,&array));
126c4762a1bSJed Brown 
127*9566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_READ,&view));
128*9566063dSJacob Faibussowitsch     PetscCall(MatCreateDense(PETSC_COMM_WORLD,m,n,M,N,array,&A));
129*9566063dSJacob Faibussowitsch     PetscCall(MatLoad(A,view));
130*9566063dSJacob Faibussowitsch     PetscCall(CheckValuesOne(A));
131*9566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinarySetSkipHeader(view,PETSC_TRUE));
132*9566063dSJacob Faibussowitsch     PetscCall(MatLoad(A,view));
133*9566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinarySetSkipHeader(view,PETSC_FALSE));
134*9566063dSJacob Faibussowitsch     PetscCall(CheckValuesIJ(A));
135*9566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&A));
136*9566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&view));
137c4762a1bSJed Brown 
138*9566063dSJacob Faibussowitsch     PetscCall(MatCreateDense(PETSC_COMM_WORLD,m,n,M,N,array,&A));
139*9566063dSJacob Faibussowitsch     PetscCall(CheckValuesIJ(A));
140*9566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&A));
141c4762a1bSJed Brown 
142*9566063dSJacob Faibussowitsch     PetscCall(PetscFree(array));
143c4762a1bSJed Brown   }
144c4762a1bSJed Brown 
145*9566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
146b122ec5aSJacob Faibussowitsch   return 0;
147c4762a1bSJed Brown }
148c4762a1bSJed Brown 
149c4762a1bSJed Brown /*TEST
150c4762a1bSJed Brown 
151c4762a1bSJed Brown    testset:
152c4762a1bSJed Brown       args: -viewer_binary_mpiio 0
153c4762a1bSJed Brown       output_file: output/ex16.out
154c4762a1bSJed Brown       test:
155c4762a1bSJed Brown         suffix: stdio_1
156c4762a1bSJed Brown         nsize: 1
157a5225ed3SStefano Zampini         args: -mat_type seqdense
158c4762a1bSJed Brown       test:
159c4762a1bSJed Brown         suffix: stdio_2
160c4762a1bSJed Brown         nsize: 2
161c4762a1bSJed Brown       test:
162c4762a1bSJed Brown         suffix: stdio_3
163c4762a1bSJed Brown         nsize: 3
164c4762a1bSJed Brown       test:
165c4762a1bSJed Brown         suffix: stdio_4
166c4762a1bSJed Brown         nsize: 4
167c4762a1bSJed Brown       test:
168c4762a1bSJed Brown         suffix: stdio_5
169c4762a1bSJed Brown         nsize: 5
170a5225ed3SStefano Zampini       test:
171a5225ed3SStefano Zampini         requires: cuda
172a5225ed3SStefano Zampini         args: -mat_type seqdensecuda
173a5225ed3SStefano Zampini         suffix: stdio_cuda_1
174a5225ed3SStefano Zampini         nsize: 1
175a5225ed3SStefano Zampini       test:
176a5225ed3SStefano Zampini         requires: cuda
177a5225ed3SStefano Zampini         args: -mat_type mpidensecuda
178a5225ed3SStefano Zampini         suffix: stdio_cuda_2
179a5225ed3SStefano Zampini         nsize: 2
180a5225ed3SStefano Zampini       test:
181a5225ed3SStefano Zampini         requires: cuda
182a5225ed3SStefano Zampini         args: -mat_type mpidensecuda
183a5225ed3SStefano Zampini         suffix: stdio_cuda_3
184a5225ed3SStefano Zampini         nsize: 3
185a5225ed3SStefano Zampini       test:
186a5225ed3SStefano Zampini         requires: cuda
187a5225ed3SStefano Zampini         args: -mat_type mpidensecuda
188a5225ed3SStefano Zampini         suffix: stdio_cuda_4
189a5225ed3SStefano Zampini         nsize: 4
190a5225ed3SStefano Zampini       test:
191a5225ed3SStefano Zampini         requires: cuda
192a5225ed3SStefano Zampini         args: -mat_type mpidensecuda
193a5225ed3SStefano Zampini         suffix: stdio_cuda_5
194a5225ed3SStefano Zampini         nsize: 5
195c4762a1bSJed Brown 
196c4762a1bSJed Brown    testset:
197c4762a1bSJed Brown       requires: mpiio
198c4762a1bSJed Brown       args: -viewer_binary_mpiio 1
199c4762a1bSJed Brown       output_file: output/ex16.out
200c4762a1bSJed Brown       test:
201c4762a1bSJed Brown         suffix: mpiio_1
202c4762a1bSJed Brown         nsize: 1
203c4762a1bSJed Brown       test:
204c4762a1bSJed Brown         suffix: mpiio_2
205c4762a1bSJed Brown         nsize: 2
206c4762a1bSJed Brown       test:
207c4762a1bSJed Brown         suffix: mpiio_3
208c4762a1bSJed Brown         nsize: 3
209c4762a1bSJed Brown       test:
210c4762a1bSJed Brown         suffix: mpiio_4
211c4762a1bSJed Brown         nsize: 4
212c4762a1bSJed Brown       test:
213c4762a1bSJed Brown         suffix: mpiio_5
214c4762a1bSJed Brown         nsize: 5
215a5225ed3SStefano Zampini       test:
216a5225ed3SStefano Zampini         requires: cuda
217a5225ed3SStefano Zampini         args: -mat_type mpidensecuda
218a5225ed3SStefano Zampini         suffix: mpiio_cuda_1
219a5225ed3SStefano Zampini         nsize: 1
220a5225ed3SStefano Zampini       test:
221a5225ed3SStefano Zampini         requires: cuda
222a5225ed3SStefano Zampini         args: -mat_type mpidensecuda
223a5225ed3SStefano Zampini         suffix: mpiio_cuda_2
224a5225ed3SStefano Zampini         nsize: 2
225a5225ed3SStefano Zampini       test:
226a5225ed3SStefano Zampini         requires: cuda
227a5225ed3SStefano Zampini         args: -mat_type mpidensecuda
228a5225ed3SStefano Zampini         suffix: mpiio_cuda_3
229a5225ed3SStefano Zampini         nsize: 3
230a5225ed3SStefano Zampini       test:
231a5225ed3SStefano Zampini         requires: cuda
232a5225ed3SStefano Zampini         args: -mat_type mpidensecuda
233a5225ed3SStefano Zampini         suffix: mpiio_cuda_4
234a5225ed3SStefano Zampini         nsize: 4
235a5225ed3SStefano Zampini       test:
236a5225ed3SStefano Zampini         requires: cuda
237a5225ed3SStefano Zampini         args: -mat_type mpidensecuda
238a5225ed3SStefano Zampini         suffix: mpiio_cuda_5
239a5225ed3SStefano Zampini         nsize: 5
240c4762a1bSJed Brown 
241c4762a1bSJed Brown TEST*/
242