174a82d2eSLisandro Dalcin static char help[] = "Tests binary viewers.\n\n"; 274a82d2eSLisandro Dalcin 374a82d2eSLisandro Dalcin #include <petscsys.h> 474a82d2eSLisandro Dalcin #include <petscviewer.h> 574a82d2eSLisandro Dalcin 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 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 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 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 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 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