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*/