174a82d2eSLisandro Dalcin static char help[] = "Tests binary viewers.\n\n"; 274a82d2eSLisandro Dalcin 374a82d2eSLisandro Dalcin #include <petscsys.h> 474a82d2eSLisandro Dalcin #include <petscviewer.h> 574a82d2eSLisandro Dalcin 674a82d2eSLisandro Dalcin static PetscErrorCode TestOpen(PetscFileMode mode,PetscViewer *viewer) 774a82d2eSLisandro Dalcin { 874a82d2eSLisandro Dalcin const char *name; 974a82d2eSLisandro Dalcin PetscBool skipinfo,skipheader,skipoptions; 1074a82d2eSLisandro Dalcin 1174a82d2eSLisandro Dalcin PetscFunctionBegin; 12*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,"binary.dat",mode,viewer)); 13*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySkipInfo(*viewer)); 14*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(*viewer,PETSC_FALSE)); 15*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(*viewer,PETSC_FALSE)); 16*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipOptions(*viewer,PETSC_FALSE)); 17*9566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(*viewer)); 18*9566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(*viewer,&name)); 19*9566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetMode(*viewer,&mode)); 20*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetSkipInfo(*viewer,&skipinfo)); 21*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetSkipHeader(*viewer,&skipheader)); 22*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetSkipOptions(*viewer,&skipoptions)); 2374a82d2eSLisandro Dalcin PetscFunctionReturn(0); 2474a82d2eSLisandro Dalcin } 2574a82d2eSLisandro Dalcin 2674a82d2eSLisandro Dalcin static PetscErrorCode TestWrite(PetscViewer viewer) 2774a82d2eSLisandro Dalcin { 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; 34*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer,&idata,1,PETSC_INT)); 35*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer,&rdata,1,PETSC_REAL)); 3674a82d2eSLisandro Dalcin 37*9566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 3874a82d2eSLisandro Dalcin if (subviewer) { 39*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(subviewer,&idata,1,PETSC_INT)); 40*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(subviewer,&rdata,1,PETSC_REAL)); 4174a82d2eSLisandro Dalcin } 42*9566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 4374a82d2eSLisandro Dalcin 44*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteAll(viewer,&idata,1,s,t,PETSC_INT)); 45*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteAll(viewer,&rdata,1,s,t,PETSC_REAL)); 4674a82d2eSLisandro Dalcin 47*9566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 4874a82d2eSLisandro Dalcin if (subviewer) { 49*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(subviewer,&idata,1,PETSC_INT)); 50*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(subviewer,&rdata,1,PETSC_REAL)); 5174a82d2eSLisandro Dalcin } 52*9566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 5374a82d2eSLisandro Dalcin 54*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer,&idata,1,PETSC_INT)); 55*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer,&rdata,1,PETSC_REAL)); 5674a82d2eSLisandro Dalcin PetscFunctionReturn(0); 5774a82d2eSLisandro Dalcin } 5874a82d2eSLisandro Dalcin 5974a82d2eSLisandro Dalcin static PetscErrorCode TestRead(PetscViewer viewer) 6074a82d2eSLisandro Dalcin { 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; 68*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer,&idata,1,NULL,PETSC_INT)); 69*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer,&rdata,1,NULL,PETSC_REAL)); 702c71b3e2SJacob Faibussowitsch PetscCheckFalse(idata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata); 712c71b3e2SJacob Faibussowitsch PetscCheckFalse(rdata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata); 7274a82d2eSLisandro Dalcin 73*9566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 7474a82d2eSLisandro Dalcin if (subviewer) { 7574a82d2eSLisandro Dalcin MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer); 76*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(subviewer,&idata,1,NULL,PETSC_INT)); 77*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(subviewer,&rdata,1,NULL,PETSC_REAL)); 782c71b3e2SJacob Faibussowitsch PetscCheckFalse(idata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata); 792c71b3e2SJacob Faibussowitsch PetscCheckFalse(rdata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata); 8074a82d2eSLisandro Dalcin } 81*9566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 8274a82d2eSLisandro Dalcin 83*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadAll(viewer,&idata,1,s,t,PETSC_INT)); 84*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadAll(viewer,&rdata,1,s,t,PETSC_REAL)); 852c71b3e2SJacob Faibussowitsch PetscCheckFalse(idata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata); 862c71b3e2SJacob Faibussowitsch PetscCheckFalse(rdata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata); 8774a82d2eSLisandro Dalcin 88*9566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 8974a82d2eSLisandro Dalcin if (subviewer) { 9074a82d2eSLisandro Dalcin MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer); 91*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(subviewer,&idata,1,NULL,PETSC_INT)); 92*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(subviewer,&rdata,1,NULL,PETSC_REAL)); 932c71b3e2SJacob Faibussowitsch PetscCheckFalse(idata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata); 942c71b3e2SJacob Faibussowitsch PetscCheckFalse(rdata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata); 9574a82d2eSLisandro Dalcin } 96*9566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer)); 9774a82d2eSLisandro Dalcin 98*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer,&idata,1,NULL,PETSC_INT)); 99*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer,&rdata,1,NULL,PETSC_REAL)); 1002c71b3e2SJacob Faibussowitsch PetscCheckFalse(idata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata); 1012c71b3e2SJacob Faibussowitsch PetscCheckFalse(rdata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata); 10274a82d2eSLisandro Dalcin PetscFunctionReturn(0); 10374a82d2eSLisandro Dalcin } 10474a82d2eSLisandro Dalcin 10574a82d2eSLisandro Dalcin static PetscErrorCode TestEOF(PetscViewer viewer) 10674a82d2eSLisandro Dalcin { 10774a82d2eSLisandro Dalcin char data; 10874a82d2eSLisandro Dalcin PetscInt count = PETSC_MAX_INT; 10974a82d2eSLisandro Dalcin MPI_Comm comm = PetscObjectComm((PetscObject)viewer); 11074a82d2eSLisandro Dalcin 11174a82d2eSLisandro Dalcin PetscFunctionBegin; 112*9566063dSJacob Faibussowitsch PetscCall(PetscViewerRead(viewer,&data,1,&count,PETSC_CHAR)); 11328b400f6SJacob Faibussowitsch PetscCheck(!count,comm,PETSC_ERR_FILE_UNEXPECTED,"Expected EOF"); 11474a82d2eSLisandro Dalcin PetscFunctionReturn(0); 11574a82d2eSLisandro Dalcin } 11674a82d2eSLisandro Dalcin 11774a82d2eSLisandro Dalcin static PetscErrorCode TestClose(PetscViewer *viewer) 11874a82d2eSLisandro Dalcin { 11974a82d2eSLisandro Dalcin PetscFileMode mode; 12074a82d2eSLisandro Dalcin 12174a82d2eSLisandro Dalcin PetscFunctionBegin; 122*9566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetMode(*viewer,&mode)); 123*9566063dSJacob Faibussowitsch if (mode == FILE_MODE_READ) PetscCall(TestEOF(*viewer)); 124*9566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(viewer)); 12574a82d2eSLisandro Dalcin PetscFunctionReturn(0); 12674a82d2eSLisandro Dalcin } 12774a82d2eSLisandro Dalcin 12874a82d2eSLisandro Dalcin int main(int argc,char **args) 12974a82d2eSLisandro Dalcin { 13074a82d2eSLisandro Dalcin PetscViewer viewer; 13174a82d2eSLisandro Dalcin 132*9566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc,&args,NULL,help)); 13374a82d2eSLisandro Dalcin 134*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_WRITE,&viewer)); 135*9566063dSJacob Faibussowitsch PetscCall(TestWrite(viewer)); 136*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 13774a82d2eSLisandro Dalcin 138*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ,&viewer)); 139*9566063dSJacob Faibussowitsch PetscCall(TestRead(viewer)); 140*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 14174a82d2eSLisandro Dalcin 142*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_APPEND,&viewer)); 143*9566063dSJacob Faibussowitsch PetscCall(TestWrite(viewer)); 144*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 14574a82d2eSLisandro Dalcin 146*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ,&viewer)); 147*9566063dSJacob Faibussowitsch PetscCall(TestRead(viewer)); 148*9566063dSJacob Faibussowitsch PetscCall(TestRead(viewer)); 149*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 15074a82d2eSLisandro Dalcin 151*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_APPEND,&viewer)); 152*9566063dSJacob Faibussowitsch PetscCall(TestWrite(viewer)); 153*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 15474a82d2eSLisandro Dalcin 155*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ,&viewer)); 156*9566063dSJacob Faibussowitsch PetscCall(TestRead(viewer)); 157*9566063dSJacob Faibussowitsch PetscCall(TestRead(viewer)); 158*9566063dSJacob Faibussowitsch PetscCall(TestRead(viewer)); 159*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 16074a82d2eSLisandro Dalcin 161*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_WRITE,&viewer)); 162*9566063dSJacob Faibussowitsch PetscCall(TestWrite(viewer)); 163*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 16474a82d2eSLisandro Dalcin 165*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ,&viewer)); 166*9566063dSJacob Faibussowitsch PetscCall(TestRead(viewer)); 167*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 16874a82d2eSLisandro Dalcin 169*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_WRITE,&viewer)); 170*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 171*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ,&viewer)); 172*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 173*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_APPEND,&viewer)); 174*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 175*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_READ,&viewer)); 176*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 17774a82d2eSLisandro Dalcin 17874a82d2eSLisandro Dalcin { 17974a82d2eSLisandro Dalcin FILE *info; 18074a82d2eSLisandro Dalcin PetscMPIInt rank; 18174a82d2eSLisandro Dalcin 182*9566063dSJacob Faibussowitsch PetscCall(TestOpen(FILE_MODE_WRITE,&viewer)); 183*9566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer,PETSC_VIEWER_BINARY_MATLAB)); 184*9566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetInfoPointer(viewer,&info)); 185*9566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank)); 1862c71b3e2SJacob Faibussowitsch PetscCheckFalse(rank == 0 && !info,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing info pointer"); 187*9566063dSJacob Faibussowitsch PetscCall(TestClose(&viewer)); 18874a82d2eSLisandro Dalcin } 18974a82d2eSLisandro Dalcin 190*9566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 191b122ec5aSJacob Faibussowitsch return 0; 19274a82d2eSLisandro Dalcin } 19374a82d2eSLisandro Dalcin 19474a82d2eSLisandro Dalcin /*TEST 19574a82d2eSLisandro Dalcin 19674a82d2eSLisandro Dalcin testset: 19774a82d2eSLisandro Dalcin nsize: {{1 2 3}separate_output} 19874a82d2eSLisandro Dalcin args: -viewer_view 19974a82d2eSLisandro Dalcin test: 20074a82d2eSLisandro Dalcin suffix: stdio 20174a82d2eSLisandro Dalcin args: -viewer_binary_mpiio 0 20274a82d2eSLisandro Dalcin test: 20374a82d2eSLisandro Dalcin requires: mpiio 20474a82d2eSLisandro Dalcin suffix: mpiio 20574a82d2eSLisandro Dalcin args: -viewer_binary_mpiio 1 20674a82d2eSLisandro Dalcin 20774a82d2eSLisandro Dalcin TEST*/ 208