Actual source code: ex6.c
1: static char help[] = "Tests binary viewers.\n\n";
3: #include <petscsys.h>
5: static PetscErrorCode TestOpen(PetscFileMode mode, PetscViewer *viewer)
6: {
7: const char *name;
8: PetscBool skipinfo, skipheader, skipoptions;
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(PETSC_SUCCESS);
23: }
25: static PetscErrorCode TestWrite(PetscViewer viewer)
26: {
27: PetscInt idata = 42;
28: PetscReal rdata = 42;
29: PetscInt s = PETSC_DETERMINE, t = PETSC_DETERMINE;
30: PetscViewer subviewer;
32: PetscFunctionBegin;
33: PetscCall(PetscViewerBinaryWrite(viewer, &idata, 1, PETSC_INT));
34: PetscCall(PetscViewerBinaryWrite(viewer, &rdata, 1, PETSC_REAL));
36: PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
37: if (subviewer) {
38: PetscCall(PetscViewerBinaryWrite(subviewer, &idata, 1, PETSC_INT));
39: PetscCall(PetscViewerBinaryWrite(subviewer, &rdata, 1, PETSC_REAL));
40: }
41: PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
43: PetscCall(PetscViewerBinaryWriteAll(viewer, &idata, 1, s, t, PETSC_INT));
44: PetscCall(PetscViewerBinaryWriteAll(viewer, &rdata, 1, s, t, PETSC_REAL));
46: PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
47: if (subviewer) {
48: PetscCall(PetscViewerBinaryWrite(subviewer, &idata, 1, PETSC_INT));
49: PetscCall(PetscViewerBinaryWrite(subviewer, &rdata, 1, PETSC_REAL));
50: }
51: PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
53: PetscCall(PetscViewerBinaryWrite(viewer, &idata, 1, PETSC_INT));
54: PetscCall(PetscViewerBinaryWrite(viewer, &rdata, 1, PETSC_REAL));
55: PetscFunctionReturn(PETSC_SUCCESS);
56: }
58: static PetscErrorCode TestRead(PetscViewer viewer)
59: {
60: PetscInt idata = 0;
61: PetscReal rdata = 0;
62: PetscInt s = PETSC_DETERMINE, t = PETSC_DETERMINE;
63: PetscViewer subviewer;
64: MPI_Comm comm = PetscObjectComm((PetscObject)viewer);
66: PetscFunctionBegin;
67: PetscCall(PetscViewerBinaryRead(viewer, &idata, 1, NULL, PETSC_INT));
68: PetscCall(PetscViewerBinaryRead(viewer, &rdata, 1, NULL, PETSC_REAL));
69: PetscCheck(idata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
70: PetscCheck(rdata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
72: PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
73: if (subviewer) {
74: MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer);
75: PetscCall(PetscViewerBinaryRead(subviewer, &idata, 1, NULL, PETSC_INT));
76: PetscCall(PetscViewerBinaryRead(subviewer, &rdata, 1, NULL, PETSC_REAL));
77: PetscCheck(idata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
78: PetscCheck(rdata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
79: }
80: PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
82: PetscCall(PetscViewerBinaryReadAll(viewer, &idata, 1, s, t, PETSC_INT));
83: PetscCall(PetscViewerBinaryReadAll(viewer, &rdata, 1, s, t, PETSC_REAL));
84: PetscCheck(idata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
85: PetscCheck(rdata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
87: PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
88: if (subviewer) {
89: MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer);
90: PetscCall(PetscViewerBinaryRead(subviewer, &idata, 1, NULL, PETSC_INT));
91: PetscCall(PetscViewerBinaryRead(subviewer, &rdata, 1, NULL, PETSC_REAL));
92: PetscCheck(idata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
93: PetscCheck(rdata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
94: }
95: PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
97: PetscCall(PetscViewerBinaryRead(viewer, &idata, 1, NULL, PETSC_INT));
98: PetscCall(PetscViewerBinaryRead(viewer, &rdata, 1, NULL, PETSC_REAL));
99: PetscCheck(idata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
100: PetscCheck(rdata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
101: PetscFunctionReturn(PETSC_SUCCESS);
102: }
104: static PetscErrorCode TestEOF(PetscViewer viewer)
105: {
106: char data;
107: PetscInt count = PETSC_INT_MAX;
108: MPI_Comm comm = PetscObjectComm((PetscObject)viewer);
110: PetscFunctionBegin;
111: PetscCall(PetscViewerRead(viewer, &data, 1, &count, PETSC_CHAR));
112: PetscCheck(!count, comm, PETSC_ERR_FILE_UNEXPECTED, "Expected EOF");
113: PetscFunctionReturn(PETSC_SUCCESS);
114: }
116: static PetscErrorCode TestClose(PetscViewer *viewer)
117: {
118: PetscFileMode mode;
120: PetscFunctionBegin;
121: PetscCall(PetscViewerFileGetMode(*viewer, &mode));
122: if (mode == FILE_MODE_READ) PetscCall(TestEOF(*viewer));
123: PetscCall(PetscViewerDestroy(viewer));
124: PetscFunctionReturn(PETSC_SUCCESS);
125: }
127: int main(int argc, char **args)
128: {
129: PetscViewer viewer;
131: PetscFunctionBeginUser;
132: PetscCall(PetscInitialize(&argc, &args, NULL, help));
134: PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
135: PetscCall(TestWrite(viewer));
136: PetscCall(TestClose(&viewer));
138: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
139: PetscCall(TestRead(viewer));
140: PetscCall(TestClose(&viewer));
142: PetscCall(TestOpen(FILE_MODE_APPEND, &viewer));
143: PetscCall(TestWrite(viewer));
144: PetscCall(TestClose(&viewer));
146: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
147: PetscCall(TestRead(viewer));
148: PetscCall(TestRead(viewer));
149: PetscCall(TestClose(&viewer));
151: PetscCall(TestOpen(FILE_MODE_APPEND, &viewer));
152: PetscCall(TestWrite(viewer));
153: PetscCall(TestClose(&viewer));
155: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
156: PetscCall(TestRead(viewer));
157: PetscCall(TestRead(viewer));
158: PetscCall(TestRead(viewer));
159: PetscCall(TestClose(&viewer));
161: PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
162: PetscCall(TestWrite(viewer));
163: PetscCall(TestClose(&viewer));
165: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
166: PetscCall(TestRead(viewer));
167: PetscCall(TestClose(&viewer));
169: PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
170: PetscCall(TestClose(&viewer));
171: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
172: PetscCall(TestClose(&viewer));
173: PetscCall(TestOpen(FILE_MODE_APPEND, &viewer));
174: PetscCall(TestClose(&viewer));
175: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
176: PetscCall(TestClose(&viewer));
178: {
179: FILE *info;
180: PetscMPIInt rank;
182: PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
183: PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_BINARY_MATLAB));
184: PetscCall(PetscViewerBinaryGetInfoPointer(viewer, &info));
185: PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
186: PetscCheck(rank != 0 || info, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Missing info pointer");
187: PetscCall(TestClose(&viewer));
188: }
190: PetscCall(PetscFinalize());
191: return 0;
192: }
194: /*TEST
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
207: TEST*/