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