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