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