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