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