xref: /petsc/src/sys/classes/viewer/tests/ex6.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
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   PetscErrorCode ierr;
1174a82d2eSLisandro Dalcin 
1274a82d2eSLisandro Dalcin   PetscFunctionBegin;
1374a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"binary.dat",mode,viewer);CHKERRQ(ierr);
1474a82d2eSLisandro Dalcin   ierr = PetscViewerBinarySkipInfo(*viewer);CHKERRQ(ierr);
1574a82d2eSLisandro Dalcin   ierr = PetscViewerBinarySetSkipInfo(*viewer,PETSC_FALSE);CHKERRQ(ierr);
1674a82d2eSLisandro Dalcin   ierr = PetscViewerBinarySetSkipHeader(*viewer,PETSC_FALSE);CHKERRQ(ierr);
1774a82d2eSLisandro Dalcin   ierr = PetscViewerBinarySetSkipOptions(*viewer,PETSC_FALSE);CHKERRQ(ierr);
1874a82d2eSLisandro Dalcin   ierr = PetscViewerSetUp(*viewer);CHKERRQ(ierr);
1974a82d2eSLisandro Dalcin   ierr = PetscViewerFileGetName(*viewer,&name);CHKERRQ(ierr);
2074a82d2eSLisandro Dalcin   ierr = PetscViewerFileGetMode(*viewer,&mode);CHKERRQ(ierr);
2174a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryGetSkipInfo(*viewer,&skipinfo);CHKERRQ(ierr);
2274a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryGetSkipHeader(*viewer,&skipheader);CHKERRQ(ierr);
2374a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryGetSkipOptions(*viewer,&skipoptions);CHKERRQ(ierr);
2474a82d2eSLisandro Dalcin   PetscFunctionReturn(0);
2574a82d2eSLisandro Dalcin }
2674a82d2eSLisandro Dalcin 
2774a82d2eSLisandro Dalcin static PetscErrorCode TestWrite(PetscViewer viewer)
2874a82d2eSLisandro Dalcin {
2974a82d2eSLisandro Dalcin   PetscInt       idata = 42;
3074a82d2eSLisandro Dalcin   PetscReal      rdata = 42;
3174a82d2eSLisandro Dalcin   PetscInt       s = PETSC_DETERMINE, t = PETSC_DETERMINE;
3274a82d2eSLisandro Dalcin   PetscViewer    subviewer;
3374a82d2eSLisandro Dalcin   PetscErrorCode ierr;
3474a82d2eSLisandro Dalcin 
3574a82d2eSLisandro Dalcin   PetscFunctionBegin;
3674a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWrite(viewer,&idata,1,PETSC_INT);CHKERRQ(ierr);
3774a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWrite(viewer,&rdata,1,PETSC_REAL);CHKERRQ(ierr);
3874a82d2eSLisandro Dalcin 
3974a82d2eSLisandro Dalcin   ierr = PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
4074a82d2eSLisandro Dalcin   if (subviewer) {
4174a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryWrite(subviewer,&idata,1,PETSC_INT);CHKERRQ(ierr);
4274a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryWrite(subviewer,&rdata,1,PETSC_REAL);CHKERRQ(ierr);
4374a82d2eSLisandro Dalcin   }
4474a82d2eSLisandro Dalcin   ierr = PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
4574a82d2eSLisandro Dalcin 
4674a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWriteAll(viewer,&idata,1,s,t,PETSC_INT);CHKERRQ(ierr);
4774a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWriteAll(viewer,&rdata,1,s,t,PETSC_REAL);CHKERRQ(ierr);
4874a82d2eSLisandro Dalcin 
4974a82d2eSLisandro Dalcin   ierr = PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
5074a82d2eSLisandro Dalcin   if (subviewer) {
5174a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryWrite(subviewer,&idata,1,PETSC_INT);CHKERRQ(ierr);
5274a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryWrite(subviewer,&rdata,1,PETSC_REAL);CHKERRQ(ierr);
5374a82d2eSLisandro Dalcin   }
5474a82d2eSLisandro Dalcin   ierr = PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
5574a82d2eSLisandro Dalcin 
5674a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWrite(viewer,&idata,1,PETSC_INT);CHKERRQ(ierr);
5774a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryWrite(viewer,&rdata,1,PETSC_REAL);CHKERRQ(ierr);
5874a82d2eSLisandro Dalcin   PetscFunctionReturn(0);
5974a82d2eSLisandro Dalcin }
6074a82d2eSLisandro Dalcin 
6174a82d2eSLisandro Dalcin static PetscErrorCode TestRead(PetscViewer viewer)
6274a82d2eSLisandro Dalcin {
6374a82d2eSLisandro Dalcin   PetscInt       idata = 0;
6474a82d2eSLisandro Dalcin   PetscReal      rdata = 0;
6574a82d2eSLisandro Dalcin   PetscInt       s = PETSC_DETERMINE, t = PETSC_DETERMINE;
6674a82d2eSLisandro Dalcin   PetscViewer    subviewer;
6774a82d2eSLisandro Dalcin   MPI_Comm       comm = PetscObjectComm((PetscObject)viewer);
6874a82d2eSLisandro Dalcin   PetscErrorCode ierr;
6974a82d2eSLisandro Dalcin 
7074a82d2eSLisandro Dalcin   PetscFunctionBegin;
7174a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryRead(viewer,&idata,1,NULL,PETSC_INT);CHKERRQ(ierr);
7274a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryRead(viewer,&rdata,1,NULL,PETSC_REAL);CHKERRQ(ierr);
73*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(idata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata);
74*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(rdata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata);
7574a82d2eSLisandro Dalcin 
7674a82d2eSLisandro Dalcin   ierr = PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
7774a82d2eSLisandro Dalcin   if (subviewer) {
7874a82d2eSLisandro Dalcin     MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer);
7974a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryRead(subviewer,&idata,1,NULL,PETSC_INT);CHKERRQ(ierr);
8074a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryRead(subviewer,&rdata,1,NULL,PETSC_REAL);CHKERRQ(ierr);
81*2c71b3e2SJacob Faibussowitsch     PetscCheckFalse(idata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata);
82*2c71b3e2SJacob Faibussowitsch     PetscCheckFalse(rdata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata);
8374a82d2eSLisandro Dalcin   }
8474a82d2eSLisandro Dalcin   ierr = PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
8574a82d2eSLisandro Dalcin 
8674a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryReadAll(viewer,&idata,1,s,t,PETSC_INT);CHKERRQ(ierr);
8774a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryReadAll(viewer,&rdata,1,s,t,PETSC_REAL);CHKERRQ(ierr);
88*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(idata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata);
89*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(rdata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata);
9074a82d2eSLisandro Dalcin 
9174a82d2eSLisandro Dalcin   ierr = PetscViewerGetSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
9274a82d2eSLisandro Dalcin   if (subviewer) {
9374a82d2eSLisandro Dalcin     MPI_Comm subcomm = PetscObjectComm((PetscObject)subviewer);
9474a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryRead(subviewer,&idata,1,NULL,PETSC_INT);CHKERRQ(ierr);
9574a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryRead(subviewer,&rdata,1,NULL,PETSC_REAL);CHKERRQ(ierr);
96*2c71b3e2SJacob Faibussowitsch     PetscCheckFalse(idata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata);
97*2c71b3e2SJacob Faibussowitsch     PetscCheckFalse(rdata != 42,subcomm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata);
9874a82d2eSLisandro Dalcin   }
9974a82d2eSLisandro Dalcin   ierr = PetscViewerRestoreSubViewer(viewer,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr);
10074a82d2eSLisandro Dalcin 
10174a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryRead(viewer,&idata,1,NULL,PETSC_INT);CHKERRQ(ierr);
10274a82d2eSLisandro Dalcin   ierr = PetscViewerBinaryRead(viewer,&rdata,1,NULL,PETSC_REAL);CHKERRQ(ierr);
103*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(idata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected idata=%" PetscInt_FMT,idata);
104*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(rdata != 42,comm,PETSC_ERR_FILE_UNEXPECTED,"Unexpected rdata=%g",(double)rdata);
10574a82d2eSLisandro Dalcin   PetscFunctionReturn(0);
10674a82d2eSLisandro Dalcin }
10774a82d2eSLisandro Dalcin 
10874a82d2eSLisandro Dalcin static PetscErrorCode TestEOF(PetscViewer viewer)
10974a82d2eSLisandro Dalcin {
11074a82d2eSLisandro Dalcin   char           data;
11174a82d2eSLisandro Dalcin   PetscInt       count = PETSC_MAX_INT;
11274a82d2eSLisandro Dalcin   MPI_Comm       comm = PetscObjectComm((PetscObject)viewer);
11374a82d2eSLisandro Dalcin   PetscErrorCode ierr;
11474a82d2eSLisandro Dalcin 
11574a82d2eSLisandro Dalcin   PetscFunctionBegin;
11674a82d2eSLisandro Dalcin   ierr = PetscViewerRead(viewer,&data,1,&count,PETSC_CHAR);CHKERRQ(ierr);
117*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(count,comm,PETSC_ERR_FILE_UNEXPECTED,"Expected EOF");
11874a82d2eSLisandro Dalcin   PetscFunctionReturn(0);
11974a82d2eSLisandro Dalcin }
12074a82d2eSLisandro Dalcin 
12174a82d2eSLisandro Dalcin static PetscErrorCode TestClose(PetscViewer *viewer)
12274a82d2eSLisandro Dalcin {
12374a82d2eSLisandro Dalcin   PetscFileMode  mode;
12474a82d2eSLisandro Dalcin   PetscErrorCode ierr;
12574a82d2eSLisandro Dalcin 
12674a82d2eSLisandro Dalcin   PetscFunctionBegin;
12774a82d2eSLisandro Dalcin   ierr = PetscViewerFileGetMode(*viewer,&mode);CHKERRQ(ierr);
12874a82d2eSLisandro Dalcin   if (mode == FILE_MODE_READ) {ierr = TestEOF(*viewer);CHKERRQ(ierr);}
12974a82d2eSLisandro Dalcin   ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr);
13074a82d2eSLisandro Dalcin   PetscFunctionReturn(0);
13174a82d2eSLisandro Dalcin }
13274a82d2eSLisandro Dalcin 
13374a82d2eSLisandro Dalcin int main(int argc,char **args)
13474a82d2eSLisandro Dalcin {
13574a82d2eSLisandro Dalcin   PetscViewer    viewer;
13674a82d2eSLisandro Dalcin   PetscErrorCode ierr;
13774a82d2eSLisandro Dalcin 
13874a82d2eSLisandro Dalcin   ierr = PetscInitialize(&argc,&args,NULL,help);if (ierr) return ierr;
13974a82d2eSLisandro Dalcin 
14074a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
14174a82d2eSLisandro Dalcin   ierr = TestWrite(viewer);CHKERRQ(ierr);
14274a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
14374a82d2eSLisandro Dalcin 
14474a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
14574a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
14674a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
14774a82d2eSLisandro Dalcin 
14874a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_APPEND,&viewer);CHKERRQ(ierr);
14974a82d2eSLisandro Dalcin   ierr = TestWrite(viewer);CHKERRQ(ierr);
15074a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
15174a82d2eSLisandro Dalcin 
15274a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
15374a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
15474a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
15574a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
15674a82d2eSLisandro Dalcin 
15774a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_APPEND,&viewer);CHKERRQ(ierr);
15874a82d2eSLisandro Dalcin   ierr = TestWrite(viewer);CHKERRQ(ierr);
15974a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
16074a82d2eSLisandro Dalcin 
16174a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
16274a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
16374a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
16474a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
16574a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
16674a82d2eSLisandro Dalcin 
16774a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
16874a82d2eSLisandro Dalcin   ierr = TestWrite(viewer);CHKERRQ(ierr);
16974a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
17074a82d2eSLisandro Dalcin 
17174a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
17274a82d2eSLisandro Dalcin   ierr = TestRead(viewer);CHKERRQ(ierr);
17374a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
17474a82d2eSLisandro Dalcin 
17574a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
17674a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
17774a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
17874a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
17974a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_APPEND,&viewer);CHKERRQ(ierr);
18074a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
18174a82d2eSLisandro Dalcin   ierr = TestOpen(FILE_MODE_READ,&viewer);CHKERRQ(ierr);
18274a82d2eSLisandro Dalcin   ierr = TestClose(&viewer);CHKERRQ(ierr);
18374a82d2eSLisandro Dalcin 
18474a82d2eSLisandro Dalcin   {
18574a82d2eSLisandro Dalcin     FILE        *info;
18674a82d2eSLisandro Dalcin     PetscMPIInt rank;
18774a82d2eSLisandro Dalcin 
18874a82d2eSLisandro Dalcin     ierr = TestOpen(FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
18974a82d2eSLisandro Dalcin     ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_BINARY_MATLAB);CHKERRQ(ierr);
19074a82d2eSLisandro Dalcin     ierr = PetscViewerBinaryGetInfoPointer(viewer,&info);CHKERRQ(ierr);
191ffc4695bSBarry Smith     ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRMPI(ierr);
192*2c71b3e2SJacob Faibussowitsch     PetscCheckFalse(rank == 0 && !info,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing info pointer");
19374a82d2eSLisandro Dalcin     ierr = TestClose(&viewer);CHKERRQ(ierr);
19474a82d2eSLisandro Dalcin   }
19574a82d2eSLisandro Dalcin 
19674a82d2eSLisandro Dalcin   ierr = PetscFinalize();
19774a82d2eSLisandro Dalcin   return ierr;
19874a82d2eSLisandro Dalcin }
19974a82d2eSLisandro Dalcin 
20074a82d2eSLisandro Dalcin /*TEST
20174a82d2eSLisandro Dalcin 
20274a82d2eSLisandro Dalcin    testset:
20374a82d2eSLisandro Dalcin      nsize: {{1 2 3}separate_output}
20474a82d2eSLisandro Dalcin      args: -viewer_view
20574a82d2eSLisandro Dalcin      test:
20674a82d2eSLisandro Dalcin        suffix: stdio
20774a82d2eSLisandro Dalcin        args: -viewer_binary_mpiio 0
20874a82d2eSLisandro Dalcin      test:
20974a82d2eSLisandro Dalcin        requires: mpiio
21074a82d2eSLisandro Dalcin        suffix: mpiio
21174a82d2eSLisandro Dalcin        args: -viewer_binary_mpiio 1
21274a82d2eSLisandro Dalcin 
21374a82d2eSLisandro Dalcin TEST*/
214