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