xref: /petsc/src/sys/classes/viewer/tests/ex6.c (revision 74a82d2edf9b3aa51eef449cdc5a734d88535a9c)
1*74a82d2eSLisandro Dalcin static char help[] = "Tests binary viewers.\n\n";
2*74a82d2eSLisandro Dalcin 
3*74a82d2eSLisandro Dalcin #include <petscsys.h>
4*74a82d2eSLisandro Dalcin #include <petscviewer.h>
5*74a82d2eSLisandro Dalcin 
6*74a82d2eSLisandro Dalcin static PetscErrorCode TestOpen(PetscFileMode mode,PetscViewer *viewer)
7*74a82d2eSLisandro Dalcin {
8*74a82d2eSLisandro Dalcin   const char     *name;
9*74a82d2eSLisandro Dalcin   PetscBool      skipinfo,skipheader,skipoptions;
10*74a82d2eSLisandro Dalcin   PetscErrorCode ierr;
11*74a82d2eSLisandro Dalcin 
12*74a82d2eSLisandro Dalcin   PetscFunctionBegin;
13*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"binary.dat",mode,viewer);CHKERRQ(ierr);
14*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinarySkipInfo(*viewer);CHKERRQ(ierr);
15*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinarySetSkipInfo(*viewer,PETSC_FALSE);CHKERRQ(ierr);
16*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinarySetSkipHeader(*viewer,PETSC_FALSE);CHKERRQ(ierr);
17*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinarySetSkipOptions(*viewer,PETSC_FALSE);CHKERRQ(ierr);
18*74a82d2eSLisandro Dalcin   ierr = PetscViewerSetUp(*viewer);CHKERRQ(ierr);
19*74a82d2eSLisandro Dalcin   ierr = PetscViewerFileGetName(*viewer,&name);CHKERRQ(ierr);
20*74a82d2eSLisandro Dalcin   ierr = PetscViewerFileGetMode(*viewer,&mode);CHKERRQ(ierr);
21*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryGetSkipInfo(*viewer,&skipinfo);CHKERRQ(ierr);
22*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryGetSkipHeader(*viewer,&skipheader);CHKERRQ(ierr);
23*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryGetSkipOptions(*viewer,&skipoptions);CHKERRQ(ierr);
24*74a82d2eSLisandro Dalcin   PetscFunctionReturn(0);
25*74a82d2eSLisandro Dalcin }
26*74a82d2eSLisandro Dalcin 
27*74a82d2eSLisandro Dalcin static PetscErrorCode TestWrite(PetscViewer viewer)
28*74a82d2eSLisandro Dalcin {
29*74a82d2eSLisandro Dalcin   PetscInt       idata = 42;
30*74a82d2eSLisandro Dalcin   PetscReal      rdata = 42;
31*74a82d2eSLisandro Dalcin   PetscInt       s = PETSC_DETERMINE, t = PETSC_DETERMINE;
32*74a82d2eSLisandro Dalcin   PetscViewer    subviewer;
33*74a82d2eSLisandro Dalcin   PetscErrorCode ierr;
34*74a82d2eSLisandro Dalcin 
35*74a82d2eSLisandro Dalcin   PetscFunctionBegin;
36*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWrite(viewer,&idata,1,PETSC_INT);CHKERRQ(ierr);
37*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWrite(viewer,&rdata,1,PETSC_REAL);CHKERRQ(ierr);
38*74a82d2eSLisandro Dalcin 
39*74a82d2eSLisandro Dalcin   ierr = PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
40*74a82d2eSLisandro Dalcin   if (subviewer) {
41*74a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryWrite(subviewer,&idata,1,PETSC_INT);CHKERRQ(ierr);
42*74a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryWrite(subviewer,&rdata,1,PETSC_REAL);CHKERRQ(ierr);
43*74a82d2eSLisandro Dalcin   }
44*74a82d2eSLisandro Dalcin   ierr = PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
45*74a82d2eSLisandro Dalcin 
46*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWriteAll(viewer,&idata,1,s,t,PETSC_INT);CHKERRQ(ierr);
47*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWriteAll(viewer,&rdata,1,s,t,PETSC_REAL);CHKERRQ(ierr);
48*74a82d2eSLisandro Dalcin 
49*74a82d2eSLisandro Dalcin   ierr = PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
50*74a82d2eSLisandro Dalcin   if (subviewer) {
51*74a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryWrite(subviewer,&idata,1,PETSC_INT);CHKERRQ(ierr);
52*74a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryWrite(subviewer,&rdata,1,PETSC_REAL);CHKERRQ(ierr);
53*74a82d2eSLisandro Dalcin   }
54*74a82d2eSLisandro Dalcin   ierr = PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
55*74a82d2eSLisandro Dalcin 
56*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWrite(viewer,&idata,1,PETSC_INT);CHKERRQ(ierr);
57*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWrite(viewer,&rdata,1,PETSC_REAL);CHKERRQ(ierr);
58*74a82d2eSLisandro Dalcin   PetscFunctionReturn(0);
59*74a82d2eSLisandro Dalcin }
60*74a82d2eSLisandro Dalcin 
61*74a82d2eSLisandro Dalcin static PetscErrorCode TestRead(PetscViewer viewer)
62*74a82d2eSLisandro Dalcin {
63*74a82d2eSLisandro Dalcin   PetscInt       idata = 0;
64*74a82d2eSLisandro Dalcin   PetscReal      rdata = 0;
65*74a82d2eSLisandro Dalcin   PetscInt       s = PETSC_DETERMINE, t = PETSC_DETERMINE;
66*74a82d2eSLisandro Dalcin   PetscViewer    subviewer;
67*74a82d2eSLisandro Dalcin   MPI_Comm       comm = PetscObjectComm((PetscObject)viewer);
68*74a82d2eSLisandro Dalcin   PetscErrorCode ierr;
69*74a82d2eSLisandro Dalcin 
70*74a82d2eSLisandro Dalcin   PetscFunctionBegin;
71*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryRead(viewer,&idata,1,NULL,PETSC_INT);CHKERRQ(ierr);
72*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryRead(viewer,&rdata,1,NULL,PETSC_REAL);CHKERRQ(ierr);
73*74a82d2eSLisandro Dalcin   if (idata != 42) SETERRQ1(comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%D",idata);
74*74a82d2eSLisandro Dalcin   if (rdata != 42) SETERRQ1(comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata);
75*74a82d2eSLisandro Dalcin 
76*74a82d2eSLisandro Dalcin   ierr = PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
77*74a82d2eSLisandro Dalcin   if (subviewer) {
78*74a82d2eSLisandro Dalcin     MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer);
79*74a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryRead(subviewer,&idata,1,NULL,PETSC_INT);CHKERRQ(ierr);
80*74a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryRead(subviewer,&rdata,1,NULL,PETSC_REAL);CHKERRQ(ierr);
81*74a82d2eSLisandro Dalcin     if (idata != 42) SETERRQ1(subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%D",idata);
82*74a82d2eSLisandro Dalcin     if (rdata != 42) SETERRQ1(subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata);
83*74a82d2eSLisandro Dalcin   }
84*74a82d2eSLisandro Dalcin   ierr = PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
85*74a82d2eSLisandro Dalcin 
86*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryReadAll(viewer,&idata,1,s,t,PETSC_INT);CHKERRQ(ierr);
87*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryReadAll(viewer,&rdata,1,s,t,PETSC_REAL);CHKERRQ(ierr);
88*74a82d2eSLisandro Dalcin   if (idata != 42) SETERRQ1(comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%D",idata);
89*74a82d2eSLisandro Dalcin   if (rdata != 42) SETERRQ1(comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata);
90*74a82d2eSLisandro Dalcin 
91*74a82d2eSLisandro Dalcin   ierr = PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
92*74a82d2eSLisandro Dalcin   if (subviewer) {
93*74a82d2eSLisandro Dalcin     MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer);
94*74a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryRead(subviewer,&idata,1,NULL,PETSC_INT);CHKERRQ(ierr);
95*74a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryRead(subviewer,&rdata,1,NULL,PETSC_REAL);CHKERRQ(ierr);
96*74a82d2eSLisandro Dalcin     if (idata != 42) SETERRQ1(subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%D",idata);
97*74a82d2eSLisandro Dalcin     if (rdata != 42) SETERRQ1(subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata);
98*74a82d2eSLisandro Dalcin   }
99*74a82d2eSLisandro Dalcin   ierr = PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
100*74a82d2eSLisandro Dalcin 
101*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryRead(viewer,&idata,1,NULL,PETSC_INT);CHKERRQ(ierr);
102*74a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryRead(viewer,&rdata,1,NULL,PETSC_REAL);CHKERRQ(ierr);
103*74a82d2eSLisandro Dalcin   if (idata != 42) SETERRQ1(comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%D",idata);
104*74a82d2eSLisandro Dalcin   if (rdata != 42) SETERRQ1(comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata);
105*74a82d2eSLisandro Dalcin   PetscFunctionReturn(0);
106*74a82d2eSLisandro Dalcin }
107*74a82d2eSLisandro Dalcin 
108*74a82d2eSLisandro Dalcin static PetscErrorCode TestEOF(PetscViewer viewer)
109*74a82d2eSLisandro Dalcin {
110*74a82d2eSLisandro Dalcin   char           data;
111*74a82d2eSLisandro Dalcin   PetscInt       count = PETSC_MAX_INT;
112*74a82d2eSLisandro Dalcin   MPI_Comm       comm = PetscObjectComm((PetscObject)viewer);
113*74a82d2eSLisandro Dalcin   PetscErrorCode ierr;
114*74a82d2eSLisandro Dalcin 
115*74a82d2eSLisandro Dalcin   PetscFunctionBegin;
116*74a82d2eSLisandro Dalcin   ierr = PetscViewerRead(viewer,&data,1,&count,PETSC_CHAR);CHKERRQ(ierr);
117*74a82d2eSLisandro Dalcin   if (count) SETERRQ(comm,PETSC_ERR_FILE_UNEXPECTED,"Expected EOF");
118*74a82d2eSLisandro Dalcin   PetscFunctionReturn(0);
119*74a82d2eSLisandro Dalcin }
120*74a82d2eSLisandro Dalcin 
121*74a82d2eSLisandro Dalcin static PetscErrorCode TestClose(PetscViewer *viewer)
122*74a82d2eSLisandro Dalcin {
123*74a82d2eSLisandro Dalcin   PetscFileMode  mode;
124*74a82d2eSLisandro Dalcin   PetscErrorCode ierr;
125*74a82d2eSLisandro Dalcin 
126*74a82d2eSLisandro Dalcin   PetscFunctionBegin;
127*74a82d2eSLisandro Dalcin   ierr = PetscViewerFileGetMode(*viewer,&mode);CHKERRQ(ierr);
128*74a82d2eSLisandro Dalcin   if (mode == FILE_MODE_READ) {ierr = TestEOF(*viewer);CHKERRQ(ierr);}
129*74a82d2eSLisandro Dalcin   ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr);
130*74a82d2eSLisandro Dalcin   PetscFunctionReturn(0);
131*74a82d2eSLisandro Dalcin }
132*74a82d2eSLisandro Dalcin 
133*74a82d2eSLisandro Dalcin int main(int argc,char **args)
134*74a82d2eSLisandro Dalcin {
135*74a82d2eSLisandro Dalcin   PetscViewer    viewer;
136*74a82d2eSLisandro Dalcin   PetscErrorCode ierr;
137*74a82d2eSLisandro Dalcin 
138*74a82d2eSLisandro Dalcin   ierr = PetscInitialize(&argc,&args,NULL,help);if (ierr) return ierr;
139*74a82d2eSLisandro Dalcin 
140*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
141*74a82d2eSLisandro Dalcin   ierr = TestWrite(viewer);CHKERRQ(ierr);
142*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
143*74a82d2eSLisandro Dalcin 
144*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
145*74a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
146*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
147*74a82d2eSLisandro Dalcin 
148*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_APPEND,&viewer);CHKERRQ(ierr);
149*74a82d2eSLisandro Dalcin   ierr = TestWrite(viewer);CHKERRQ(ierr);
150*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
151*74a82d2eSLisandro Dalcin 
152*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
153*74a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
154*74a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
155*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
156*74a82d2eSLisandro Dalcin 
157*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_APPEND,&viewer);CHKERRQ(ierr);
158*74a82d2eSLisandro Dalcin   ierr = TestWrite(viewer);CHKERRQ(ierr);
159*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
160*74a82d2eSLisandro Dalcin 
161*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
162*74a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
163*74a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
164*74a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
165*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
166*74a82d2eSLisandro Dalcin 
167*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
168*74a82d2eSLisandro Dalcin   ierr = TestWrite(viewer);CHKERRQ(ierr);
169*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
170*74a82d2eSLisandro Dalcin 
171*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
172*74a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
173*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
174*74a82d2eSLisandro Dalcin 
175*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
176*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
177*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
178*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
179*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_APPEND,&viewer);CHKERRQ(ierr);
180*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
181*74a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
182*74a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
183*74a82d2eSLisandro Dalcin 
184*74a82d2eSLisandro Dalcin   {
185*74a82d2eSLisandro Dalcin     FILE        *info;
186*74a82d2eSLisandro Dalcin     PetscMPIInt rank;
187*74a82d2eSLisandro Dalcin 
188*74a82d2eSLisandro Dalcin     ierr = TestOpen(FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
189*74a82d2eSLisandro Dalcin     ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_BINARY_MATLAB);CHKERRQ(ierr);
190*74a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryGetInfoPointer(viewer,&info);CHKERRQ(ierr);
191*74a82d2eSLisandro Dalcin     ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
192*74a82d2eSLisandro Dalcin     if (!rank && !info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing info pointer");
193*74a82d2eSLisandro Dalcin     ierr = TestClose(&viewer);CHKERRQ(ierr);
194*74a82d2eSLisandro Dalcin   }
195*74a82d2eSLisandro Dalcin 
196*74a82d2eSLisandro Dalcin   ierr = PetscFinalize();
197*74a82d2eSLisandro Dalcin   return ierr;
198*74a82d2eSLisandro Dalcin }
199*74a82d2eSLisandro Dalcin 
200*74a82d2eSLisandro Dalcin 
201*74a82d2eSLisandro Dalcin /*TEST
202*74a82d2eSLisandro Dalcin 
203*74a82d2eSLisandro Dalcin 
204*74a82d2eSLisandro Dalcin    testset:
205*74a82d2eSLisandro Dalcin      nsize: {{1 2 3}separate_output}
206*74a82d2eSLisandro Dalcin      args: -viewer_view
207*74a82d2eSLisandro Dalcin      test:
208*74a82d2eSLisandro Dalcin        suffix: stdio
209*74a82d2eSLisandro Dalcin        args: -viewer_binary_mpiio 0
210*74a82d2eSLisandro Dalcin      test:
211*74a82d2eSLisandro Dalcin        requires: mpiio
212*74a82d2eSLisandro Dalcin        suffix: mpiio
213*74a82d2eSLisandro Dalcin        args: -viewer_binary_mpiio 1
214*74a82d2eSLisandro Dalcin 
215*74a82d2eSLisandro Dalcin 
216*74a82d2eSLisandro Dalcin TEST*/
217