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 { 8 const char *name; 9 PetscBool skipinfo,skipheader,skipoptions; 10 11 PetscFunctionBegin; 12 CHKERRQ(PetscViewerBinaryOpen(PETSC_COMM_WORLD,"binary.dat",mode,viewer)); 13 CHKERRQ(PetscViewerBinarySkipInfo(*viewer)); 14 CHKERRQ(PetscViewerBinarySetSkipInfo(*viewer,PETSC_FALSE)); 15 CHKERRQ(PetscViewerBinarySetSkipHeader(*viewer,PETSC_FALSE)); 16 CHKERRQ(PetscViewerBinarySetSkipOptions(*viewer,PETSC_FALSE)); 17 CHKERRQ(PetscViewerSetUp(*viewer)); 18 CHKERRQ(PetscViewerFileGetName(*viewer,&name)); 19 CHKERRQ(PetscViewerFileGetMode(*viewer,&mode)); 20 CHKERRQ(PetscViewerBinaryGetSkipInfo(*viewer,&skipinfo)); 21 CHKERRQ(PetscViewerBinaryGetSkipHeader(*viewer,&skipheader)); 22 CHKERRQ(PetscViewerBinaryGetSkipOptions(*viewer,&skipoptions)); 23 PetscFunctionReturn(0); 24 } 25 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; 32 33 PetscFunctionBegin; 34 CHKERRQ(PetscViewerBinaryWrite(viewer,&idata,1,PETSC_INT)); 35 CHKERRQ(PetscViewerBinaryWrite(viewer,&rdata,1,PETSC_REAL)); 36 37 CHKERRQ(PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 38 if (subviewer) { 39 CHKERRQ(PetscViewerBinaryWrite(subviewer,&idata,1,PETSC_INT)); 40 CHKERRQ(PetscViewerBinaryWrite(subviewer,&rdata,1,PETSC_REAL)); 41 } 42 CHKERRQ(PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 43 44 CHKERRQ(PetscViewerBinaryWriteAll(viewer,&idata,1,s,t,PETSC_INT)); 45 CHKERRQ(PetscViewerBinaryWriteAll(viewer,&rdata,1,s,t,PETSC_REAL)); 46 47 CHKERRQ(PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 48 if (subviewer) { 49 CHKERRQ(PetscViewerBinaryWrite(subviewer,&idata,1,PETSC_INT)); 50 CHKERRQ(PetscViewerBinaryWrite(subviewer,&rdata,1,PETSC_REAL)); 51 } 52 CHKERRQ(PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 53 54 CHKERRQ(PetscViewerBinaryWrite(viewer,&idata,1,PETSC_INT)); 55 CHKERRQ(PetscViewerBinaryWrite(viewer,&rdata,1,PETSC_REAL)); 56 PetscFunctionReturn(0); 57 } 58 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); 66 67 PetscFunctionBegin; 68 CHKERRQ(PetscViewerBinaryRead(viewer,&idata,1,NULL,PETSC_INT)); 69 CHKERRQ(PetscViewerBinaryRead(viewer,&rdata,1,NULL,PETSC_REAL)); 70 PetscCheckFalse(idata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata); 71 PetscCheckFalse(rdata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata); 72 73 CHKERRQ(PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 74 if (subviewer) { 75 MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer); 76 CHKERRQ(PetscViewerBinaryRead(subviewer,&idata,1,NULL,PETSC_INT)); 77 CHKERRQ(PetscViewerBinaryRead(subviewer,&rdata,1,NULL,PETSC_REAL)); 78 PetscCheckFalse(idata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata); 79 PetscCheckFalse(rdata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata); 80 } 81 CHKERRQ(PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 82 83 CHKERRQ(PetscViewerBinaryReadAll(viewer,&idata,1,s,t,PETSC_INT)); 84 CHKERRQ(PetscViewerBinaryReadAll(viewer,&rdata,1,s,t,PETSC_REAL)); 85 PetscCheckFalse(idata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata); 86 PetscCheckFalse(rdata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata); 87 88 CHKERRQ(PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 89 if (subviewer) { 90 MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer); 91 CHKERRQ(PetscViewerBinaryRead(subviewer,&idata,1,NULL,PETSC_INT)); 92 CHKERRQ(PetscViewerBinaryRead(subviewer,&rdata,1,NULL,PETSC_REAL)); 93 PetscCheckFalse(idata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata); 94 PetscCheckFalse(rdata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata); 95 } 96 CHKERRQ(PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 97 98 CHKERRQ(PetscViewerBinaryRead(viewer,&idata,1,NULL,PETSC_INT)); 99 CHKERRQ(PetscViewerBinaryRead(viewer,&rdata,1,NULL,PETSC_REAL)); 100 PetscCheckFalse(idata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata); 101 PetscCheckFalse(rdata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata); 102 PetscFunctionReturn(0); 103 } 104 105 static PetscErrorCode TestEOF(PetscViewer viewer) 106 { 107 char data; 108 PetscInt count = PETSC_MAX_INT; 109 MPI_Comm comm = PetscObjectComm((PetscObject)viewer); 110 111 PetscFunctionBegin; 112 CHKERRQ(PetscViewerRead(viewer,&data,1,&count,PETSC_CHAR)); 113 PetscCheckFalse(count,comm,PETSC_ERR_FILE_UNEXPECTED,"Expected EOF"); 114 PetscFunctionReturn(0); 115 } 116 117 static PetscErrorCode TestClose(PetscViewer *viewer) 118 { 119 PetscFileMode mode; 120 121 PetscFunctionBegin; 122 CHKERRQ(PetscViewerFileGetMode(*viewer,&mode)); 123 if (mode == FILE_MODE_READ) CHKERRQ(TestEOF(*viewer)); 124 CHKERRQ(PetscViewerDestroy(viewer)); 125 PetscFunctionReturn(0); 126 } 127 128 int main(int argc,char **args) 129 { 130 PetscViewer viewer; 131 PetscErrorCode ierr; 132 133 ierr = PetscInitialize(&argc,&args,NULL,help);if (ierr) return ierr; 134 135 CHKERRQ(TestOpen(FILE_MODE_WRITE,&viewer)); 136 CHKERRQ(TestWrite(viewer)); 137 CHKERRQ(TestClose(&viewer)); 138 139 CHKERRQ(TestOpen(FILE_MODE_READ,&viewer)); 140 CHKERRQ(TestRead(viewer)); 141 CHKERRQ(TestClose(&viewer)); 142 143 CHKERRQ(TestOpen(FILE_MODE_APPEND,&viewer)); 144 CHKERRQ(TestWrite(viewer)); 145 CHKERRQ(TestClose(&viewer)); 146 147 CHKERRQ(TestOpen(FILE_MODE_READ,&viewer)); 148 CHKERRQ(TestRead(viewer)); 149 CHKERRQ(TestRead(viewer)); 150 CHKERRQ(TestClose(&viewer)); 151 152 CHKERRQ(TestOpen(FILE_MODE_APPEND,&viewer)); 153 CHKERRQ(TestWrite(viewer)); 154 CHKERRQ(TestClose(&viewer)); 155 156 CHKERRQ(TestOpen(FILE_MODE_READ,&viewer)); 157 CHKERRQ(TestRead(viewer)); 158 CHKERRQ(TestRead(viewer)); 159 CHKERRQ(TestRead(viewer)); 160 CHKERRQ(TestClose(&viewer)); 161 162 CHKERRQ(TestOpen(FILE_MODE_WRITE,&viewer)); 163 CHKERRQ(TestWrite(viewer)); 164 CHKERRQ(TestClose(&viewer)); 165 166 CHKERRQ(TestOpen(FILE_MODE_READ,&viewer)); 167 CHKERRQ(TestRead(viewer)); 168 CHKERRQ(TestClose(&viewer)); 169 170 CHKERRQ(TestOpen(FILE_MODE_WRITE,&viewer)); 171 CHKERRQ(TestClose(&viewer)); 172 CHKERRQ(TestOpen(FILE_MODE_READ,&viewer)); 173 CHKERRQ(TestClose(&viewer)); 174 CHKERRQ(TestOpen(FILE_MODE_APPEND,&viewer)); 175 CHKERRQ(TestClose(&viewer)); 176 CHKERRQ(TestOpen(FILE_MODE_READ,&viewer)); 177 CHKERRQ(TestClose(&viewer)); 178 179 { 180 FILE *info; 181 PetscMPIInt rank; 182 183 CHKERRQ(TestOpen(FILE_MODE_WRITE,&viewer)); 184 CHKERRQ(PetscViewerPushFormat(viewer,PETSC_VIEWER_BINARY_MATLAB)); 185 CHKERRQ(PetscViewerBinaryGetInfoPointer(viewer,&info)); 186 CHKERRMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank)); 187 PetscCheckFalse(rank == 0 && !info,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing info pointer"); 188 CHKERRQ(TestClose(&viewer)); 189 } 190 191 ierr = PetscFinalize(); 192 return ierr; 193 } 194 195 /*TEST 196 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 207 208 TEST*/ 209