Actual source code: ex6.c
1: static char help[] = "Tests binary viewers.\n\n";
3: #include <petscsys.h>
4: #include <petscviewer.h>
6: static PetscErrorCode TestOpen(PetscFileMode mode, PetscViewer *viewer)
7: {
8: const char *name;
9: PetscBool skipinfo, skipheader, skipoptions;
11: PetscFunctionBegin;
12: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "binary.dat", mode, viewer));
13: PetscCall(PetscViewerBinarySkipInfo(*viewer));
14: PetscCall(PetscViewerBinarySetSkipInfo(*viewer, PETSC_FALSE));
15: PetscCall(PetscViewerBinarySetSkipHeader(*viewer, PETSC_FALSE));
16: PetscCall(PetscViewerBinarySetSkipOptions(*viewer, PETSC_FALSE));
17: PetscCall(PetscViewerSetUp(*viewer));
18: PetscCall(PetscViewerFileGetName(*viewer, &name));
19: PetscCall(PetscViewerFileGetMode(*viewer, &mode));
20: PetscCall(PetscViewerBinaryGetSkipInfo(*viewer, &skipinfo));
21: PetscCall(PetscViewerBinaryGetSkipHeader(*viewer, &skipheader));
22: PetscCall(PetscViewerBinaryGetSkipOptions(*viewer, &skipoptions));
23: PetscFunctionReturn(PETSC_SUCCESS);
24: }
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;
33: PetscFunctionBegin;
34: PetscCall(PetscViewerBinaryWrite(viewer, &idata, 1, PETSC_INT));
35: PetscCall(PetscViewerBinaryWrite(viewer, &rdata, 1, PETSC_REAL));
37: PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
38: if (subviewer) {
39: PetscCall(PetscViewerBinaryWrite(subviewer, &idata, 1, PETSC_INT));
40: PetscCall(PetscViewerBinaryWrite(subviewer, &rdata, 1, PETSC_REAL));
41: }
42: PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
44: PetscCall(PetscViewerBinaryWriteAll(viewer, &idata, 1, s, t, PETSC_INT));
45: PetscCall(PetscViewerBinaryWriteAll(viewer, &rdata, 1, s, t, PETSC_REAL));
47: PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
48: if (subviewer) {
49: PetscCall(PetscViewerBinaryWrite(subviewer, &idata, 1, PETSC_INT));
50: PetscCall(PetscViewerBinaryWrite(subviewer, &rdata, 1, PETSC_REAL));
51: }
52: PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
54: PetscCall(PetscViewerBinaryWrite(viewer, &idata, 1, PETSC_INT));
55: PetscCall(PetscViewerBinaryWrite(viewer, &rdata, 1, PETSC_REAL));
56: PetscFunctionReturn(PETSC_SUCCESS);
57: }
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);
67: PetscFunctionBegin;
68: PetscCall(PetscViewerBinaryRead(viewer, &idata, 1, NULL, PETSC_INT));
69: PetscCall(PetscViewerBinaryRead(viewer, &rdata, 1, NULL, PETSC_REAL));
70: PetscCheck(idata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
71: PetscCheck(rdata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
73: PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
74: if (subviewer) {
75: MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer);
76: PetscCall(PetscViewerBinaryRead(subviewer, &idata, 1, NULL, PETSC_INT));
77: PetscCall(PetscViewerBinaryRead(subviewer, &rdata, 1, NULL, PETSC_REAL));
78: PetscCheck(idata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
79: PetscCheck(rdata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
80: }
81: PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
83: PetscCall(PetscViewerBinaryReadAll(viewer, &idata, 1, s, t, PETSC_INT));
84: PetscCall(PetscViewerBinaryReadAll(viewer, &rdata, 1, s, t, PETSC_REAL));
85: PetscCheck(idata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
86: PetscCheck(rdata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
88: PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
89: if (subviewer) {
90: MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer);
91: PetscCall(PetscViewerBinaryRead(subviewer, &idata, 1, NULL, PETSC_INT));
92: PetscCall(PetscViewerBinaryRead(subviewer, &rdata, 1, NULL, PETSC_REAL));
93: PetscCheck(idata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
94: PetscCheck(rdata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
95: }
96: PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
98: PetscCall(PetscViewerBinaryRead(viewer, &idata, 1, NULL, PETSC_INT));
99: PetscCall(PetscViewerBinaryRead(viewer, &rdata, 1, NULL, PETSC_REAL));
100: PetscCheck(idata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
101: PetscCheck(rdata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
102: PetscFunctionReturn(PETSC_SUCCESS);
103: }
105: static PetscErrorCode TestEOF(PetscViewer viewer)
106: {
107: char data;
108: PetscInt count = PETSC_INT_MAX;
109: MPI_Comm comm = PetscObjectComm((PetscObject)viewer);
111: PetscFunctionBegin;
112: PetscCall(PetscViewerRead(viewer, &data, 1, &count, PETSC_CHAR));
113: PetscCheck(!count, comm, PETSC_ERR_FILE_UNEXPECTED, "Expected EOF");
114: PetscFunctionReturn(PETSC_SUCCESS);
115: }
117: static PetscErrorCode TestClose(PetscViewer *viewer)
118: {
119: PetscFileMode mode;
121: PetscFunctionBegin;
122: PetscCall(PetscViewerFileGetMode(*viewer, &mode));
123: if (mode == FILE_MODE_READ) PetscCall(TestEOF(*viewer));
124: PetscCall(PetscViewerDestroy(viewer));
125: PetscFunctionReturn(PETSC_SUCCESS);
126: }
128: int main(int argc, char **args)
129: {
130: PetscViewer viewer;
132: PetscFunctionBeginUser;
133: PetscCall(PetscInitialize(&argc, &args, NULL, help));
135: PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
136: PetscCall(TestWrite(viewer));
137: PetscCall(TestClose(&viewer));
139: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
140: PetscCall(TestRead(viewer));
141: PetscCall(TestClose(&viewer));
143: PetscCall(TestOpen(FILE_MODE_APPEND, &viewer));
144: PetscCall(TestWrite(viewer));
145: PetscCall(TestClose(&viewer));
147: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
148: PetscCall(TestRead(viewer));
149: PetscCall(TestRead(viewer));
150: PetscCall(TestClose(&viewer));
152: PetscCall(TestOpen(FILE_MODE_APPEND, &viewer));
153: PetscCall(TestWrite(viewer));
154: PetscCall(TestClose(&viewer));
156: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
157: PetscCall(TestRead(viewer));
158: PetscCall(TestRead(viewer));
159: PetscCall(TestRead(viewer));
160: PetscCall(TestClose(&viewer));
162: PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
163: PetscCall(TestWrite(viewer));
164: PetscCall(TestClose(&viewer));
166: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
167: PetscCall(TestRead(viewer));
168: PetscCall(TestClose(&viewer));
170: PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
171: PetscCall(TestClose(&viewer));
172: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
173: PetscCall(TestClose(&viewer));
174: PetscCall(TestOpen(FILE_MODE_APPEND, &viewer));
175: PetscCall(TestClose(&viewer));
176: PetscCall(TestOpen(FILE_MODE_READ, &viewer));
177: PetscCall(TestClose(&viewer));
179: {
180: FILE *info;
181: PetscMPIInt rank;
183: PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
184: PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_BINARY_MATLAB));
185: PetscCall(PetscViewerBinaryGetInfoPointer(viewer, &info));
186: PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
187: PetscCheck(rank != 0 || info, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Missing info pointer");
188: PetscCall(TestClose(&viewer));
189: }
191: PetscCall(PetscFinalize());
192: return 0;
193: }
195: /*TEST
197: testset:
198: nsize: {{1 2 3}separate_output}
199: args: -viewer_view
200: test:
201: suffix: stdio
202: args: -viewer_binary_mpiio 0
203: test:
204: requires: mpiio
205: suffix: mpiio
206: args: -viewer_binary_mpiio 1
208: TEST*/