174a82d2eSLisandro Dalcin static char help[] = "Tests binary viewers.\n\n";
274a82d2eSLisandro Dalcin
374a82d2eSLisandro Dalcin #include <petscsys.h>
474a82d2eSLisandro Dalcin #include <petscviewer.h>
574a82d2eSLisandro Dalcin
TestOpen(PetscFileMode mode,PetscViewer * viewer)6d71ae5a4SJacob Faibussowitsch static PetscErrorCode TestOpen(PetscFileMode mode, PetscViewer *viewer)
7d71ae5a4SJacob Faibussowitsch {
874a82d2eSLisandro Dalcin const char *name;
974a82d2eSLisandro Dalcin PetscBool skipinfo, skipheader, skipoptions;
1074a82d2eSLisandro Dalcin
1174a82d2eSLisandro Dalcin PetscFunctionBegin;
129566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "binary.dat", mode, viewer));
139566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySkipInfo(*viewer));
149566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(*viewer, PETSC_FALSE));
159566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(*viewer, PETSC_FALSE));
169566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipOptions(*viewer, PETSC_FALSE));
179566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(*viewer));
189566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(*viewer, &name));
199566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetMode(*viewer, &mode));
209566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetSkipInfo(*viewer, &skipinfo));
219566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetSkipHeader(*viewer, &skipheader));
229566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetSkipOptions(*viewer, &skipoptions));
233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2474a82d2eSLisandro Dalcin }
2574a82d2eSLisandro Dalcin
TestWrite(PetscViewer viewer)26d71ae5a4SJacob Faibussowitsch static PetscErrorCode TestWrite(PetscViewer viewer)
27d71ae5a4SJacob Faibussowitsch {
2874a82d2eSLisandro Dalcin PetscInt idata = 42;
2974a82d2eSLisandro Dalcin PetscReal rdata = 42;
3074a82d2eSLisandro Dalcin PetscInt s = PETSC_DETERMINE, t = PETSC_DETERMINE;
3174a82d2eSLisandro Dalcin PetscViewer subviewer;
3274a82d2eSLisandro Dalcin
3374a82d2eSLisandro Dalcin PetscFunctionBegin;
349566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, &idata, 1, PETSC_INT));
359566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, &rdata, 1, PETSC_REAL));
3674a82d2eSLisandro Dalcin
379566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
3874a82d2eSLisandro Dalcin if (subviewer) {
399566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(subviewer, &idata, 1, PETSC_INT));
409566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(subviewer, &rdata, 1, PETSC_REAL));
4174a82d2eSLisandro Dalcin }
429566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
4374a82d2eSLisandro Dalcin
449566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteAll(viewer, &idata, 1, s, t, PETSC_INT));
459566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteAll(viewer, &rdata, 1, s, t, PETSC_REAL));
4674a82d2eSLisandro Dalcin
479566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
4874a82d2eSLisandro Dalcin if (subviewer) {
499566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(subviewer, &idata, 1, PETSC_INT));
509566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(subviewer, &rdata, 1, PETSC_REAL));
5174a82d2eSLisandro Dalcin }
529566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
5374a82d2eSLisandro Dalcin
549566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, &idata, 1, PETSC_INT));
559566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, &rdata, 1, PETSC_REAL));
563ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
5774a82d2eSLisandro Dalcin }
5874a82d2eSLisandro Dalcin
TestRead(PetscViewer viewer)59d71ae5a4SJacob Faibussowitsch static PetscErrorCode TestRead(PetscViewer viewer)
60d71ae5a4SJacob Faibussowitsch {
6174a82d2eSLisandro Dalcin PetscInt idata = 0;
6274a82d2eSLisandro Dalcin PetscReal rdata = 0;
6374a82d2eSLisandro Dalcin PetscInt s = PETSC_DETERMINE, t = PETSC_DETERMINE;
6474a82d2eSLisandro Dalcin PetscViewer subviewer;
6574a82d2eSLisandro Dalcin MPI_Comm comm = PetscObjectComm((PetscObject)viewer);
6674a82d2eSLisandro Dalcin
6774a82d2eSLisandro Dalcin PetscFunctionBegin;
689566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &idata, 1, NULL, PETSC_INT));
699566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &rdata, 1, NULL, PETSC_REAL));
7008401ef6SPierre Jolivet PetscCheck(idata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
7108401ef6SPierre Jolivet PetscCheck(rdata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
7274a82d2eSLisandro Dalcin
739566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
7474a82d2eSLisandro Dalcin if (subviewer) {
7574a82d2eSLisandro Dalcin MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer);
769566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(subviewer, &idata, 1, NULL, PETSC_INT));
779566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(subviewer, &rdata, 1, NULL, PETSC_REAL));
7808401ef6SPierre Jolivet PetscCheck(idata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
7908401ef6SPierre Jolivet PetscCheck(rdata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
8074a82d2eSLisandro Dalcin }
819566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
8274a82d2eSLisandro Dalcin
839566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadAll(viewer, &idata, 1, s, t, PETSC_INT));
849566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadAll(viewer, &rdata, 1, s, t, PETSC_REAL));
8508401ef6SPierre Jolivet PetscCheck(idata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
8608401ef6SPierre Jolivet PetscCheck(rdata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
8774a82d2eSLisandro Dalcin
889566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
8974a82d2eSLisandro Dalcin if (subviewer) {
9074a82d2eSLisandro Dalcin MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer);
919566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(subviewer, &idata, 1, NULL, PETSC_INT));
929566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(subviewer, &rdata, 1, NULL, PETSC_REAL));
9308401ef6SPierre Jolivet PetscCheck(idata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
9408401ef6SPierre Jolivet PetscCheck(rdata == 42, subcomm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
9574a82d2eSLisandro Dalcin }
969566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(viewer, PETSC_COMM_SELF, &subviewer));
9774a82d2eSLisandro Dalcin
989566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &idata, 1, NULL, PETSC_INT));
999566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &rdata, 1, NULL, PETSC_REAL));
10008401ef6SPierre Jolivet PetscCheck(idata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected idata=%" PetscInt_FMT, idata);
10108401ef6SPierre Jolivet PetscCheck(rdata == 42, comm, PETSC_ERR_FILE_UNEXPECTED, "Unexpected rdata=%g", (double)rdata);
1023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
10374a82d2eSLisandro Dalcin }
10474a82d2eSLisandro Dalcin
TestEOF(PetscViewer viewer)105d71ae5a4SJacob Faibussowitsch static PetscErrorCode TestEOF(PetscViewer viewer)
106d71ae5a4SJacob Faibussowitsch {
10774a82d2eSLisandro Dalcin char data;
108*1690c2aeSBarry Smith PetscInt count = PETSC_INT_MAX;
10974a82d2eSLisandro Dalcin MPI_Comm comm = PetscObjectComm((PetscObject)viewer);
11074a82d2eSLisandro Dalcin
11174a82d2eSLisandro Dalcin PetscFunctionBegin;
1129566063dSJacob Faibussowitsch PetscCall(PetscViewerRead(viewer, &data, 1, &count, PETSC_CHAR));
11328b400f6SJacob Faibussowitsch PetscCheck(!count, comm, PETSC_ERR_FILE_UNEXPECTED, "Expected EOF");
1143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
11574a82d2eSLisandro Dalcin }
11674a82d2eSLisandro Dalcin
TestClose(PetscViewer * viewer)117d71ae5a4SJacob Faibussowitsch static PetscErrorCode TestClose(PetscViewer *viewer)
118d71ae5a4SJacob Faibussowitsch {
11974a82d2eSLisandro Dalcin PetscFileMode mode;
12074a82d2eSLisandro Dalcin
12174a82d2eSLisandro Dalcin PetscFunctionBegin;
1229566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetMode(*viewer, &mode));
1239566063dSJacob Faibussowitsch if (mode == FILE_MODE_READ) PetscCall(TestEOF(*viewer));
1249566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(viewer));
1253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
12674a82d2eSLisandro Dalcin }
12774a82d2eSLisandro Dalcin
main(int argc,char ** args)128d71ae5a4SJacob Faibussowitsch int main(int argc, char **args)
129d71ae5a4SJacob Faibussowitsch {
13074a82d2eSLisandro Dalcin PetscViewer viewer;
13174a82d2eSLisandro Dalcin
132327415f7SBarry Smith PetscFunctionBeginUser;
1339566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &args, NULL, help));
13474a82d2eSLisandro Dalcin
1359566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
1369566063dSJacob Faibussowitsch PetscCall(TestWrite(viewer));
1379566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
13874a82d2eSLisandro Dalcin
1399566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ, &viewer));
1409566063dSJacob Faibussowitsch PetscCall(TestRead(viewer));
1419566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
14274a82d2eSLisandro Dalcin
1439566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_APPEND, &viewer));
1449566063dSJacob Faibussowitsch PetscCall(TestWrite(viewer));
1459566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
14674a82d2eSLisandro Dalcin
1479566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ, &viewer));
1489566063dSJacob Faibussowitsch PetscCall(TestRead(viewer));
1499566063dSJacob Faibussowitsch PetscCall(TestRead(viewer));
1509566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
15174a82d2eSLisandro Dalcin
1529566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_APPEND, &viewer));
1539566063dSJacob Faibussowitsch PetscCall(TestWrite(viewer));
1549566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
15574a82d2eSLisandro Dalcin
1569566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ, &viewer));
1579566063dSJacob Faibussowitsch PetscCall(TestRead(viewer));
1589566063dSJacob Faibussowitsch PetscCall(TestRead(viewer));
1599566063dSJacob Faibussowitsch PetscCall(TestRead(viewer));
1609566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
16174a82d2eSLisandro Dalcin
1629566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
1639566063dSJacob Faibussowitsch PetscCall(TestWrite(viewer));
1649566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
16574a82d2eSLisandro Dalcin
1669566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ, &viewer));
1679566063dSJacob Faibussowitsch PetscCall(TestRead(viewer));
1689566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
16974a82d2eSLisandro Dalcin
1709566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
1719566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
1729566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ, &viewer));
1739566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
1749566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_APPEND, &viewer));
1759566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
1769566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ, &viewer));
1779566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
17874a82d2eSLisandro Dalcin
17974a82d2eSLisandro Dalcin {
18074a82d2eSLisandro Dalcin FILE *info;
18174a82d2eSLisandro Dalcin PetscMPIInt rank;
18274a82d2eSLisandro Dalcin
1839566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_WRITE, &viewer));
1849566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_BINARY_MATLAB));
1859566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetInfoPointer(viewer, &info));
1869566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
187cc73adaaSBarry Smith PetscCheck(rank != 0 || info, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Missing info pointer");
1889566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer));
18974a82d2eSLisandro Dalcin }
19074a82d2eSLisandro Dalcin
1919566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
192b122ec5aSJacob Faibussowitsch return 0;
19374a82d2eSLisandro Dalcin }
19474a82d2eSLisandro Dalcin
19574a82d2eSLisandro Dalcin /*TEST
19674a82d2eSLisandro Dalcin
19774a82d2eSLisandro Dalcin testset:
19874a82d2eSLisandro Dalcin nsize: {{1 2 3}separate_output}
19974a82d2eSLisandro Dalcin args: -viewer_view
20074a82d2eSLisandro Dalcin test:
20174a82d2eSLisandro Dalcin suffix: stdio
20274a82d2eSLisandro Dalcin args: -viewer_binary_mpiio 0
20374a82d2eSLisandro Dalcin test:
20474a82d2eSLisandro Dalcin requires: mpiio
20574a82d2eSLisandro Dalcin suffix: mpiio
20674a82d2eSLisandro Dalcin args: -viewer_binary_mpiio 1
20774a82d2eSLisandro Dalcin
20874a82d2eSLisandro Dalcin TEST*/
209