xref: /petsc/src/sys/classes/viewer/impls/binary/binv.c (revision 2e956fe4fc852fabc23b437482e1fb7b77fddb0d)
1af0996ceSBarry Smith #include <petsc/private/viewerimpl.h>    /*I   "petscviewer.h"   I*/
25c6c1daeSBarry Smith 
35c6c1daeSBarry Smith typedef struct  {
45c6c1daeSBarry Smith   int           fdes;                 /* file descriptor, ignored if using MPI IO */
55c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
6bc196f7cSDave May   PetscBool     usempiio;
75c6c1daeSBarry Smith   MPI_File      mfdes;                /* ignored unless using MPI IO */
8e8a65b7dSLisandro Dalcin   MPI_File      mfsub;                /* subviewer support */
95c6c1daeSBarry Smith   MPI_Offset    moff;
105c6c1daeSBarry Smith #endif
11cc843e7aSLisandro Dalcin   char          *filename;            /* file name */
12cc843e7aSLisandro Dalcin   PetscFileMode filemode;             /* read/write/append mode */
135c6c1daeSBarry Smith   FILE          *fdes_info;           /* optional file containing info on binary file*/
145c6c1daeSBarry Smith   PetscBool     storecompressed;      /* gzip the write binary file when closing it*/
15f90597f1SStefano Zampini   char          *ogzfilename;         /* gzip can be run after the filename has been updated */
165c6c1daeSBarry Smith   PetscBool     skipinfo;             /* Don't create info file for writing; don't use for reading */
175c6c1daeSBarry Smith   PetscBool     skipoptions;          /* don't use PETSc options database when loading */
185c6c1daeSBarry Smith   PetscInt      flowcontrol;          /* allow only <flowcontrol> messages outstanding at a time while doing IO */
195c6c1daeSBarry Smith   PetscBool     skipheader;           /* don't write header, only raw data */
20a261c58fSBarry Smith   PetscBool     matlabheaderwritten;  /* if format is PETSC_VIEWER_BINARY_MATLAB has the MATLAB .info header been written yet */
21c98fd787SBarry Smith   PetscBool     setfromoptionscalled;
225c6c1daeSBarry Smith } PetscViewer_Binary;
235c6c1daeSBarry Smith 
24*2e956fe4SStefano Zampini static PetscErrorCode PetscViewerBinaryClearFunctionList(PetscViewer v)
25*2e956fe4SStefano Zampini {
26*2e956fe4SStefano Zampini   PetscFunctionBegin;
27*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetFlowControl_C",NULL));
28*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetFlowControl_C",NULL));
29*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetSkipHeader_C",NULL));
30*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetSkipHeader_C",NULL));
31*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetSkipOptions_C",NULL));
32*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetSkipOptions_C",NULL));
33*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetSkipInfo_C",NULL));
34*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetSkipInfo_C",NULL));
35*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetInfoPointer_C",NULL));
36*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetName_C",NULL));
37*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetName_C",NULL));
38*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetMode_C",NULL));
39*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetMode_C",NULL));
40*2e956fe4SStefano Zampini #if defined(PETSC_HAVE_MPIIO)
41*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetUseMPIIO_C",NULL));
42*2e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetUseMPIIO_C",NULL));
43*2e956fe4SStefano Zampini #endif
44*2e956fe4SStefano Zampini   PetscFunctionReturn(0);
45*2e956fe4SStefano Zampini }
46*2e956fe4SStefano Zampini 
47cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
48cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinarySyncMPIIO(PetscViewer viewer)
49cc843e7aSLisandro Dalcin {
50cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
51cc843e7aSLisandro Dalcin 
52cc843e7aSLisandro Dalcin   PetscFunctionBegin;
53cc843e7aSLisandro Dalcin   if (vbinary->filemode == FILE_MODE_READ) PetscFunctionReturn(0);
54cc843e7aSLisandro Dalcin   if (vbinary->mfsub != MPI_FILE_NULL) {
559566063dSJacob Faibussowitsch     PetscCallMPI(MPI_File_sync(vbinary->mfsub));
56cc843e7aSLisandro Dalcin   }
57cc843e7aSLisandro Dalcin   if (vbinary->mfdes != MPI_FILE_NULL) {
589566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Barrier(PetscObjectComm((PetscObject)viewer)));
599566063dSJacob Faibussowitsch     PetscCallMPI(MPI_File_sync(vbinary->mfdes));
60cc843e7aSLisandro Dalcin   }
61cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
62cc843e7aSLisandro Dalcin }
63cc843e7aSLisandro Dalcin #endif
64cc843e7aSLisandro Dalcin 
6581f0254dSBarry Smith static PetscErrorCode PetscViewerGetSubViewer_Binary(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
665c6c1daeSBarry Smith {
67e8a65b7dSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
68cc843e7aSLisandro Dalcin   PetscMPIInt        rank;
695c6c1daeSBarry Smith 
705c6c1daeSBarry Smith   PetscFunctionBegin;
719566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
72e8a65b7dSLisandro Dalcin 
73e8a65b7dSLisandro Dalcin   /* Return subviewer in process zero */
749566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank));
75dd400576SPatrick Sanan   if (rank == 0) {
76e5afcf28SBarry Smith     PetscMPIInt flg;
77e5afcf28SBarry Smith 
789566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_compare(PETSC_COMM_SELF,comm,&flg));
79cc73adaaSBarry Smith     PetscCheck(flg == MPI_IDENT || flg == MPI_CONGRUENT,PETSC_COMM_SELF,PETSC_ERR_SUP,"PetscViewerGetSubViewer() for PETSCVIEWERBINARY requires a singleton MPI_Comm");
809566063dSJacob Faibussowitsch     PetscCall(PetscViewerCreate(comm,outviewer));
819566063dSJacob Faibussowitsch     PetscCall(PetscViewerSetType(*outviewer,PETSCVIEWERBINARY));
829566063dSJacob Faibussowitsch     PetscCall(PetscMemcpy((*outviewer)->data,vbinary,sizeof(PetscViewer_Binary)));
8312f4c3a9SLisandro Dalcin     (*outviewer)->setupcalled = PETSC_TRUE;
8496509d17SLisandro Dalcin   } else {
8596509d17SLisandro Dalcin     *outviewer = NULL;
8696509d17SLisandro Dalcin   }
87e8a65b7dSLisandro Dalcin 
88e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
89e8a65b7dSLisandro Dalcin   if (vbinary->usempiio && *outviewer) {
90e8a65b7dSLisandro Dalcin     PetscViewer_Binary *obinary = (PetscViewer_Binary*)(*outviewer)->data;
91e8a65b7dSLisandro Dalcin     /* Parent viewer opens a new MPI file handle on PETSC_COMM_SELF and keeps track of it for future reuse */
92e8a65b7dSLisandro Dalcin     if (vbinary->mfsub == MPI_FILE_NULL) {
93e8a65b7dSLisandro Dalcin       int amode;
94cc843e7aSLisandro Dalcin       switch (vbinary->filemode) {
95e8a65b7dSLisandro Dalcin       case FILE_MODE_READ:   amode = MPI_MODE_RDONLY; break;
96e8a65b7dSLisandro Dalcin       case FILE_MODE_WRITE:  amode = MPI_MODE_WRONLY; break;
9722a8f86cSLisandro Dalcin       case FILE_MODE_APPEND: amode = MPI_MODE_WRONLY; break;
9898921bdaSJacob Faibussowitsch       default: SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported file mode %s",PetscFileModes[vbinary->filemode]);
99e8a65b7dSLisandro Dalcin       }
1009566063dSJacob Faibussowitsch       PetscCallMPI(MPI_File_open(PETSC_COMM_SELF,vbinary->filename,amode,MPI_INFO_NULL,&vbinary->mfsub));
101e8a65b7dSLisandro Dalcin     }
102e8a65b7dSLisandro Dalcin     /* Subviewer gets the MPI file handle on PETSC_COMM_SELF */
103e8a65b7dSLisandro Dalcin     obinary->mfdes = vbinary->mfsub;
104e8a65b7dSLisandro Dalcin     obinary->mfsub = MPI_FILE_NULL;
105e8a65b7dSLisandro Dalcin     obinary->moff  = vbinary->moff;
106e8a65b7dSLisandro Dalcin   }
107e8a65b7dSLisandro Dalcin #endif
108cc843e7aSLisandro Dalcin 
109cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
1109566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySyncMPIIO(viewer));
111cc843e7aSLisandro Dalcin #endif
1125c6c1daeSBarry Smith   PetscFunctionReturn(0);
1135c6c1daeSBarry Smith }
1145c6c1daeSBarry Smith 
11581f0254dSBarry Smith static PetscErrorCode PetscViewerRestoreSubViewer_Binary(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
1165c6c1daeSBarry Smith {
117e8a65b7dSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
118cc843e7aSLisandro Dalcin   PetscMPIInt        rank;
119e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
120e8a65b7dSLisandro Dalcin   MPI_Offset         moff = 0;
121e8a65b7dSLisandro Dalcin #endif
1225c6c1daeSBarry Smith 
1235c6c1daeSBarry Smith   PetscFunctionBegin;
1249566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank));
125c5853193SPierre Jolivet   PetscCheck(rank == 0 || !*outviewer,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Subviewer not obtained from viewer");
126e8a65b7dSLisandro Dalcin 
127e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
128e8a65b7dSLisandro Dalcin   if (vbinary->usempiio && *outviewer) {
129e8a65b7dSLisandro Dalcin     PetscViewer_Binary *obinary = (PetscViewer_Binary*)(*outviewer)->data;
13008401ef6SPierre Jolivet     PetscCheck(obinary->mfdes == vbinary->mfsub,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Subviewer not obtained from viewer");
1319566063dSJacob Faibussowitsch     if (obinary->mfsub != MPI_FILE_NULL) PetscCallMPI(MPI_File_close(&obinary->mfsub));
132e8a65b7dSLisandro Dalcin     moff = obinary->moff;
133e8a65b7dSLisandro Dalcin   }
134e8a65b7dSLisandro Dalcin #endif
135e8a65b7dSLisandro Dalcin 
136e8a65b7dSLisandro Dalcin   if (*outviewer) {
137e8a65b7dSLisandro Dalcin     PetscViewer_Binary *obinary = (PetscViewer_Binary*)(*outviewer)->data;
13808401ef6SPierre Jolivet     PetscCheck(obinary->fdes == vbinary->fdes,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Subviewer not obtained from viewer");
1399566063dSJacob Faibussowitsch     PetscCall(PetscFree((*outviewer)->data));
140*2e956fe4SStefano Zampini     PetscCall(PetscViewerBinaryClearFunctionList(*outviewer));
1419566063dSJacob Faibussowitsch     PetscCall(PetscHeaderDestroy(outviewer));
1425c6c1daeSBarry Smith   }
143e8a65b7dSLisandro Dalcin 
144e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
145e8a65b7dSLisandro Dalcin   if (vbinary->usempiio) {
146e8a65b7dSLisandro Dalcin     PetscInt64 ioff = (PetscInt64)moff; /* We could use MPI_OFFSET datatype (requires MPI 2.2) */
1479566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Bcast(&ioff,1,MPIU_INT64,0,PetscObjectComm((PetscObject)viewer)));
148e8a65b7dSLisandro Dalcin     vbinary->moff = (MPI_Offset)ioff;
149e8a65b7dSLisandro Dalcin   }
150e8a65b7dSLisandro Dalcin #endif
151cc843e7aSLisandro Dalcin 
152cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
1539566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySyncMPIIO(viewer));
154cc843e7aSLisandro Dalcin #endif
1555c6c1daeSBarry Smith   PetscFunctionReturn(0);
1565c6c1daeSBarry Smith }
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
1595c6c1daeSBarry Smith /*@C
16085b8072bSPatrick Sanan     PetscViewerBinaryGetMPIIOOffset - Gets the current global offset that should be passed to `MPI_File_set_view()` or `MPI_File_{write|read}_at[_all]()`
1615c6c1daeSBarry Smith 
1625c6c1daeSBarry Smith     Not Collective
1635c6c1daeSBarry Smith 
1645c6c1daeSBarry Smith     Input Parameter:
16585b8072bSPatrick Sanan .   viewer - PetscViewer context, obtained from `PetscViewerBinaryOpen()`
1665c6c1daeSBarry Smith 
1675c6c1daeSBarry Smith     Output Parameter:
16822a8f86cSLisandro Dalcin .   off - the current global offset
1695c6c1daeSBarry Smith 
1705c6c1daeSBarry Smith     Level: advanced
1715c6c1daeSBarry Smith 
1725c6c1daeSBarry Smith     Fortran Note:
1735c6c1daeSBarry Smith     This routine is not supported in Fortran.
1745c6c1daeSBarry Smith 
17585b8072bSPatrick Sanan     Use `PetscViewerBinaryAddMPIIOOffset()` to increase this value after you have written a view.
1765c6c1daeSBarry Smith 
177db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinaryGetUseMPIIO()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryAddMPIIOOffset()`
1785c6c1daeSBarry Smith @*/
1795c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetMPIIOOffset(PetscViewer viewer,MPI_Offset *off)
1805c6c1daeSBarry Smith {
18122a8f86cSLisandro Dalcin   PetscViewer_Binary *vbinary;
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith   PetscFunctionBegin;
18422a8f86cSLisandro Dalcin   PetscValidHeaderSpecificType(viewer,PETSC_VIEWER_CLASSID,1,PETSCVIEWERBINARY);
18522a8f86cSLisandro Dalcin   PetscValidPointer(off,2);
18622a8f86cSLisandro Dalcin   vbinary = (PetscViewer_Binary*)viewer->data;
1875c6c1daeSBarry Smith   *off = vbinary->moff;
1885c6c1daeSBarry Smith   PetscFunctionReturn(0);
1895c6c1daeSBarry Smith }
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith /*@C
19222a8f86cSLisandro Dalcin     PetscViewerBinaryAddMPIIOOffset - Adds to the current global offset
1935c6c1daeSBarry Smith 
19422a8f86cSLisandro Dalcin     Logically Collective
1955c6c1daeSBarry Smith 
1965c6c1daeSBarry Smith     Input Parameters:
1975c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
19822a8f86cSLisandro Dalcin -   off - the addition to the global offset
1995c6c1daeSBarry Smith 
2005c6c1daeSBarry Smith     Level: advanced
2015c6c1daeSBarry Smith 
2025c6c1daeSBarry Smith     Fortran Note:
2035c6c1daeSBarry Smith     This routine is not supported in Fortran.
2045c6c1daeSBarry Smith 
20585b8072bSPatrick Sanan     Use `PetscViewerBinaryGetMPIIOOffset()` to get the value that you should pass to `MPI_File_set_view()` or `MPI_File_{write|read}_at[_all]()`
2065c6c1daeSBarry Smith 
207c2e3fba1SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinaryGetUseMPIIO()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryGetMPIIOOffset()`
2085c6c1daeSBarry Smith @*/
2095c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryAddMPIIOOffset(PetscViewer viewer,MPI_Offset off)
2105c6c1daeSBarry Smith {
21122a8f86cSLisandro Dalcin   PetscViewer_Binary *vbinary;
2125c6c1daeSBarry Smith 
2135c6c1daeSBarry Smith   PetscFunctionBegin;
21422a8f86cSLisandro Dalcin   PetscValidHeaderSpecificType(viewer,PETSC_VIEWER_CLASSID,1,PETSCVIEWERBINARY);
21522a8f86cSLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer,(PetscInt)off,2);
21622a8f86cSLisandro Dalcin   vbinary = (PetscViewer_Binary*)viewer->data;
2175c6c1daeSBarry Smith   vbinary->moff += off;
2185c6c1daeSBarry Smith   PetscFunctionReturn(0);
2195c6c1daeSBarry Smith }
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith /*@C
2225c6c1daeSBarry Smith     PetscViewerBinaryGetMPIIODescriptor - Extracts the MPI IO file descriptor from a PetscViewer.
2235c6c1daeSBarry Smith 
2245c6c1daeSBarry Smith     Not Collective
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith     Input Parameter:
2275c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
2285c6c1daeSBarry Smith 
2295c6c1daeSBarry Smith     Output Parameter:
2305c6c1daeSBarry Smith .   fdes - file descriptor
2315c6c1daeSBarry Smith 
2325c6c1daeSBarry Smith     Level: advanced
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith     Fortran Note:
2355c6c1daeSBarry Smith     This routine is not supported in Fortran.
2365c6c1daeSBarry Smith 
237c2e3fba1SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinaryGetUseMPIIO()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryGetMPIIOOffset()`
2385c6c1daeSBarry Smith @*/
2395c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetMPIIODescriptor(PetscViewer viewer,MPI_File *fdes)
2405c6c1daeSBarry Smith {
24122a8f86cSLisandro Dalcin   PetscViewer_Binary *vbinary;
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith   PetscFunctionBegin;
24422a8f86cSLisandro Dalcin   PetscValidHeaderSpecificType(viewer,PETSC_VIEWER_CLASSID,1,PETSCVIEWERBINARY);
24522a8f86cSLisandro Dalcin   PetscValidPointer(fdes,2);
2469566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
24722a8f86cSLisandro Dalcin   vbinary = (PetscViewer_Binary*)viewer->data;
2485c6c1daeSBarry Smith   *fdes = vbinary->mfdes;
2495c6c1daeSBarry Smith   PetscFunctionReturn(0);
2505c6c1daeSBarry Smith }
251cc843e7aSLisandro Dalcin #endif
2525c6c1daeSBarry Smith 
253cc843e7aSLisandro Dalcin /*@
254cc843e7aSLisandro Dalcin     PetscViewerBinarySetUseMPIIO - Sets a binary viewer to use MPI-IO for reading/writing. Must be called
255cc843e7aSLisandro Dalcin         before PetscViewerFileSetName()
256cc843e7aSLisandro Dalcin 
257cc843e7aSLisandro Dalcin     Logically Collective on PetscViewer
258cc843e7aSLisandro Dalcin 
259cc843e7aSLisandro Dalcin     Input Parameters:
260cc843e7aSLisandro Dalcin +   viewer - the PetscViewer; must be a binary
261cc843e7aSLisandro Dalcin -   use - PETSC_TRUE means MPI-IO will be used
262cc843e7aSLisandro Dalcin 
263cc843e7aSLisandro Dalcin     Options Database:
264cc843e7aSLisandro Dalcin     -viewer_binary_mpiio : Flag for using MPI-IO
265cc843e7aSLisandro Dalcin 
266cc843e7aSLisandro Dalcin     Level: advanced
267cc843e7aSLisandro Dalcin 
268db781477SPatrick Sanan .seealso: `PetscViewerFileSetMode()`, `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerBinaryOpen()`,
269db781477SPatrick Sanan           `PetscViewerBinaryGetUseMPIIO()`
270cc843e7aSLisandro Dalcin 
271cc843e7aSLisandro Dalcin @*/
272cc843e7aSLisandro Dalcin PetscErrorCode PetscViewerBinarySetUseMPIIO(PetscViewer viewer,PetscBool use)
273a8aae444SDave May {
274a8aae444SDave May   PetscFunctionBegin;
275cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
276cc843e7aSLisandro Dalcin   PetscValidLogicalCollectiveBool(viewer,use,2);
277cac4c232SBarry Smith   PetscTryMethod(viewer,"PetscViewerBinarySetUseMPIIO_C",(PetscViewer,PetscBool),(viewer,use));
278cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
279cc843e7aSLisandro Dalcin }
280cc843e7aSLisandro Dalcin 
281cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
282cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinarySetUseMPIIO_Binary(PetscViewer viewer,PetscBool use)
283cc843e7aSLisandro Dalcin {
284cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
285cc843e7aSLisandro Dalcin   PetscFunctionBegin;
286cc73adaaSBarry Smith   PetscCheck(!viewer->setupcalled || vbinary->usempiio == use,PetscObjectComm((PetscObject)viewer),PETSC_ERR_ORDER,"Cannot change MPIIO to %s after setup",PetscBools[use]);
287cc843e7aSLisandro Dalcin   vbinary->usempiio = use;
288a8aae444SDave May   PetscFunctionReturn(0);
289a8aae444SDave May }
290a8aae444SDave May #endif
291a8aae444SDave May 
292cc843e7aSLisandro Dalcin /*@
293bc196f7cSDave May     PetscViewerBinaryGetUseMPIIO - Returns PETSC_TRUE if the binary viewer uses MPI-IO.
2945c6c1daeSBarry Smith 
2955c6c1daeSBarry Smith     Not Collective
2965c6c1daeSBarry Smith 
2975c6c1daeSBarry Smith     Input Parameter:
2985c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith     Output Parameter:
301d8d19677SJose E. Roman .   use - PETSC_TRUE if MPI-IO is being used
3025c6c1daeSBarry Smith 
3035c6c1daeSBarry Smith     Options Database:
3045c6c1daeSBarry Smith     -viewer_binary_mpiio : Flag for using MPI-IO
3055c6c1daeSBarry Smith 
3065c6c1daeSBarry Smith     Level: advanced
3075c6c1daeSBarry Smith 
308bc196f7cSDave May     Note:
309bc196f7cSDave May     If MPI-IO is not available, this function will always return PETSC_FALSE
310bc196f7cSDave May 
3115c6c1daeSBarry Smith     Fortran Note:
3125c6c1daeSBarry Smith     This routine is not supported in Fortran.
3135c6c1daeSBarry Smith 
314db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryGetMPIIOOffset()`
3155c6c1daeSBarry Smith @*/
316cc843e7aSLisandro Dalcin PetscErrorCode PetscViewerBinaryGetUseMPIIO(PetscViewer viewer,PetscBool *use)
3175c6c1daeSBarry Smith {
3185c6c1daeSBarry Smith   PetscFunctionBegin;
319cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
320cc843e7aSLisandro Dalcin   PetscValidBoolPointer(use,2);
321cc843e7aSLisandro Dalcin   *use = PETSC_FALSE;
322cac4c232SBarry Smith   PetscTryMethod(viewer,"PetscViewerBinaryGetUseMPIIO_C",(PetscViewer,PetscBool*),(viewer,use));
3235c6c1daeSBarry Smith   PetscFunctionReturn(0);
3245c6c1daeSBarry Smith }
3255c6c1daeSBarry Smith 
326cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
327cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinaryGetUseMPIIO_Binary(PetscViewer viewer,PetscBool  *use)
3285c6c1daeSBarry Smith {
3295c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
3305c6c1daeSBarry Smith 
3315c6c1daeSBarry Smith   PetscFunctionBegin;
332cc843e7aSLisandro Dalcin   *use = vbinary->usempiio;
333cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
334cc843e7aSLisandro Dalcin }
335cc843e7aSLisandro Dalcin #endif
336cc843e7aSLisandro Dalcin 
337cc843e7aSLisandro Dalcin /*@
338cc843e7aSLisandro Dalcin     PetscViewerBinarySetFlowControl - Sets how many messages are allowed to outstanding at the same time during parallel IO reads/writes
339cc843e7aSLisandro Dalcin 
340cc843e7aSLisandro Dalcin     Not Collective
341cc843e7aSLisandro Dalcin 
342d8d19677SJose E. Roman     Input Parameters:
343cc843e7aSLisandro Dalcin +   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
344cc843e7aSLisandro Dalcin -   fc - the number of messages, defaults to 256 if this function was not called
345cc843e7aSLisandro Dalcin 
346cc843e7aSLisandro Dalcin     Level: advanced
347cc843e7aSLisandro Dalcin 
348c2e3fba1SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinaryGetFlowControl()`
349cc843e7aSLisandro Dalcin 
350cc843e7aSLisandro Dalcin @*/
351cc843e7aSLisandro Dalcin PetscErrorCode  PetscViewerBinarySetFlowControl(PetscViewer viewer,PetscInt fc)
352cc843e7aSLisandro Dalcin {
353cc843e7aSLisandro Dalcin   PetscFunctionBegin;
354cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
355cc843e7aSLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer,fc,2);
356cac4c232SBarry Smith   PetscTryMethod(viewer,"PetscViewerBinarySetFlowControl_C",(PetscViewer,PetscInt),(viewer,fc));
3575c6c1daeSBarry Smith   PetscFunctionReturn(0);
3585c6c1daeSBarry Smith }
3595c6c1daeSBarry Smith 
360cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinarySetFlowControl_Binary(PetscViewer viewer,PetscInt fc)
361cc843e7aSLisandro Dalcin {
362cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
363cc843e7aSLisandro Dalcin 
364cc843e7aSLisandro Dalcin   PetscFunctionBegin;
36508401ef6SPierre Jolivet   PetscCheck(fc > 1,PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_OUTOFRANGE,"Flow control count must be greater than 1, %" PetscInt_FMT " was set",fc);
366cc843e7aSLisandro Dalcin   vbinary->flowcontrol = fc;
367cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
368cc843e7aSLisandro Dalcin }
369cc843e7aSLisandro Dalcin 
370cc843e7aSLisandro Dalcin /*@
3715c6c1daeSBarry Smith     PetscViewerBinaryGetFlowControl - Returns how many messages are allowed to outstanding at the same time during parallel IO reads/writes
3725c6c1daeSBarry Smith 
3735c6c1daeSBarry Smith     Not Collective
3745c6c1daeSBarry Smith 
3755c6c1daeSBarry Smith     Input Parameter:
3765c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
3775c6c1daeSBarry Smith 
3785c6c1daeSBarry Smith     Output Parameter:
3795c6c1daeSBarry Smith .   fc - the number of messages
3805c6c1daeSBarry Smith 
3815c6c1daeSBarry Smith     Level: advanced
3825c6c1daeSBarry Smith 
383c2e3fba1SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinarySetFlowControl()`
3845c6c1daeSBarry Smith 
3855c6c1daeSBarry Smith @*/
3865c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetFlowControl(PetscViewer viewer,PetscInt *fc)
3875c6c1daeSBarry Smith {
3885c6c1daeSBarry Smith   PetscFunctionBegin;
389cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
390cc843e7aSLisandro Dalcin   PetscValidIntPointer(fc,2);
391cac4c232SBarry Smith   PetscUseMethod(viewer,"PetscViewerBinaryGetFlowControl_C",(PetscViewer,PetscInt*),(viewer,fc));
3925c6c1daeSBarry Smith   PetscFunctionReturn(0);
3935c6c1daeSBarry Smith }
3945c6c1daeSBarry Smith 
395cc843e7aSLisandro Dalcin static PetscErrorCode  PetscViewerBinaryGetFlowControl_Binary(PetscViewer viewer,PetscInt *fc)
3965c6c1daeSBarry Smith {
3975c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
3985c6c1daeSBarry Smith 
3995c6c1daeSBarry Smith   PetscFunctionBegin;
400cc843e7aSLisandro Dalcin   *fc = vbinary->flowcontrol;
4015c6c1daeSBarry Smith   PetscFunctionReturn(0);
4025c6c1daeSBarry Smith }
4035c6c1daeSBarry Smith 
4045c6c1daeSBarry Smith /*@C
4055c6c1daeSBarry Smith     PetscViewerBinaryGetDescriptor - Extracts the file descriptor from a PetscViewer.
4065c6c1daeSBarry Smith 
4075872f025SBarry Smith     Collective On PetscViewer
4085c6c1daeSBarry Smith 
4095c6c1daeSBarry Smith     Input Parameter:
4105c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
4115c6c1daeSBarry Smith 
4125c6c1daeSBarry Smith     Output Parameter:
4135c6c1daeSBarry Smith .   fdes - file descriptor
4145c6c1daeSBarry Smith 
4155c6c1daeSBarry Smith     Level: advanced
4165c6c1daeSBarry Smith 
4175c6c1daeSBarry Smith     Notes:
4185c6c1daeSBarry Smith       For writable binary PetscViewers, the descriptor will only be valid for the
4195c6c1daeSBarry Smith     first processor in the communicator that shares the PetscViewer. For readable
4205c6c1daeSBarry Smith     files it will only be valid on nodes that have the file. If node 0 does not
4215c6c1daeSBarry Smith     have the file it generates an error even if another node does have the file.
4225c6c1daeSBarry Smith 
4235c6c1daeSBarry Smith     Fortran Note:
4245c6c1daeSBarry Smith     This routine is not supported in Fortran.
4255c6c1daeSBarry Smith 
42695452b02SPatrick Sanan     Developer Notes:
42795452b02SPatrick Sanan     This must be called on all processes because Dave May changed
4285872f025SBarry Smith     the source code that this may be trigger a PetscViewerSetUp() call if it was not previously triggered.
4295872f025SBarry Smith 
430c2e3fba1SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`
4315c6c1daeSBarry Smith @*/
4325c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetDescriptor(PetscViewer viewer,int *fdes)
4335c6c1daeSBarry Smith {
43422a8f86cSLisandro Dalcin   PetscViewer_Binary *vbinary;
4355c6c1daeSBarry Smith 
4365c6c1daeSBarry Smith   PetscFunctionBegin;
43722a8f86cSLisandro Dalcin   PetscValidHeaderSpecificType(viewer,PETSC_VIEWER_CLASSID,1,PETSCVIEWERBINARY);
43822a8f86cSLisandro Dalcin   PetscValidPointer(fdes,2);
4399566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
44022a8f86cSLisandro Dalcin   vbinary = (PetscViewer_Binary*)viewer->data;
4415c6c1daeSBarry Smith   *fdes = vbinary->fdes;
4425c6c1daeSBarry Smith   PetscFunctionReturn(0);
4435c6c1daeSBarry Smith }
4445c6c1daeSBarry Smith 
4455c6c1daeSBarry Smith /*@
4465c6c1daeSBarry Smith     PetscViewerBinarySkipInfo - Binary file will not have .info file created with it
4475c6c1daeSBarry Smith 
4485c6c1daeSBarry Smith     Not Collective
4495c6c1daeSBarry Smith 
450fd292e60Sprj-     Input Parameter:
4515c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerCreate()
4525c6c1daeSBarry Smith 
4535c6c1daeSBarry Smith     Options Database Key:
45410699b91SBarry Smith .   -viewer_binary_skip_info - true indicates do not generate .info file
4555c6c1daeSBarry Smith 
4565c6c1daeSBarry Smith     Level: advanced
4575c6c1daeSBarry Smith 
45895452b02SPatrick Sanan     Notes:
45995452b02SPatrick Sanan     This must be called after PetscViewerSetType(). If you use PetscViewerBinaryOpen() then
4605c6c1daeSBarry Smith     you can only skip the info file with the -viewer_binary_skip_info flag. To use the function you must open the
461a2d7db39SDave May     viewer with PetscViewerCreate(), PetscViewerSetType(), PetscViewerBinarySkipInfo().
4625c6c1daeSBarry Smith 
4635c6c1daeSBarry Smith     The .info contains meta information about the data in the binary file, for example the block size if it was
4645c6c1daeSBarry Smith     set for a vector or matrix.
4655c6c1daeSBarry Smith 
466db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySetSkipOptions()`,
467db781477SPatrick Sanan           `PetscViewerBinaryGetSkipOptions()`, `PetscViewerBinaryGetSkipInfo()`
4685c6c1daeSBarry Smith @*/
4695c6c1daeSBarry Smith PetscErrorCode PetscViewerBinarySkipInfo(PetscViewer viewer)
4705c6c1daeSBarry Smith {
4715c6c1daeSBarry Smith   PetscFunctionBegin;
4729566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipInfo(viewer,PETSC_TRUE));
473807ea322SDave May   PetscFunctionReturn(0);
474807ea322SDave May }
475807ea322SDave May 
476807ea322SDave May /*@
477807ea322SDave May     PetscViewerBinarySetSkipInfo - Binary file will not have .info file created with it
478807ea322SDave May 
479807ea322SDave May     Not Collective
480807ea322SDave May 
481d8d19677SJose E. Roman     Input Parameters:
482cc843e7aSLisandro Dalcin +   viewer - PetscViewer context, obtained from PetscViewerCreate()
483cc843e7aSLisandro Dalcin -   skip - PETSC_TRUE implies the .info file will not be generated
484807ea322SDave May 
485807ea322SDave May     Options Database Key:
48610699b91SBarry Smith .   -viewer_binary_skip_info - true indicates do not generate .info file
487807ea322SDave May 
488807ea322SDave May     Level: advanced
489807ea322SDave May 
490db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySetSkipOptions()`,
491db781477SPatrick Sanan           `PetscViewerBinaryGetSkipOptions()`, `PetscViewerBinaryGetSkipInfo()`
492807ea322SDave May @*/
493807ea322SDave May PetscErrorCode PetscViewerBinarySetSkipInfo(PetscViewer viewer,PetscBool skip)
494807ea322SDave May {
495807ea322SDave May   PetscFunctionBegin;
496cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
497cc843e7aSLisandro Dalcin   PetscValidLogicalCollectiveBool(viewer,skip,2);
498cac4c232SBarry Smith   PetscTryMethod(viewer,"PetscViewerBinarySetSkipInfo_C",(PetscViewer,PetscBool),(viewer,skip));
499807ea322SDave May   PetscFunctionReturn(0);
500807ea322SDave May }
501807ea322SDave May 
502cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinarySetSkipInfo_Binary(PetscViewer viewer,PetscBool skip)
503807ea322SDave May {
504807ea322SDave May   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
505807ea322SDave May 
506807ea322SDave May   PetscFunctionBegin;
507cc843e7aSLisandro Dalcin   vbinary->skipinfo = skip;
508807ea322SDave May   PetscFunctionReturn(0);
509807ea322SDave May }
510807ea322SDave May 
511807ea322SDave May /*@
512807ea322SDave May     PetscViewerBinaryGetSkipInfo - check if viewer wrote a .info file
513807ea322SDave May 
514807ea322SDave May     Not Collective
515807ea322SDave May 
516807ea322SDave May     Input Parameter:
517807ea322SDave May .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
518807ea322SDave May 
519807ea322SDave May     Output Parameter:
520807ea322SDave May .   skip - PETSC_TRUE implies the .info file was not generated
521807ea322SDave May 
522807ea322SDave May     Level: advanced
523807ea322SDave May 
52495452b02SPatrick Sanan     Notes:
52595452b02SPatrick Sanan     This must be called after PetscViewerSetType()
526807ea322SDave May 
527db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySkipInfo()`,
528db781477SPatrick Sanan           `PetscViewerBinarySetSkipOptions()`, `PetscViewerBinarySetSkipInfo()`
529807ea322SDave May @*/
530807ea322SDave May PetscErrorCode PetscViewerBinaryGetSkipInfo(PetscViewer viewer,PetscBool *skip)
531807ea322SDave May {
532807ea322SDave May   PetscFunctionBegin;
533cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
534cc843e7aSLisandro Dalcin   PetscValidBoolPointer(skip,2);
535cac4c232SBarry Smith   PetscUseMethod(viewer,"PetscViewerBinaryGetSkipInfo_C",(PetscViewer,PetscBool*),(viewer,skip));
536807ea322SDave May   PetscFunctionReturn(0);
537807ea322SDave May }
538807ea322SDave May 
539cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinaryGetSkipInfo_Binary(PetscViewer viewer,PetscBool *skip)
540807ea322SDave May {
541807ea322SDave May   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
542807ea322SDave May 
543807ea322SDave May   PetscFunctionBegin;
544cc843e7aSLisandro Dalcin   *skip  = vbinary->skipinfo;
545807ea322SDave May   PetscFunctionReturn(0);
546807ea322SDave May }
547807ea322SDave May 
5485c6c1daeSBarry Smith /*@
5495c6c1daeSBarry Smith     PetscViewerBinarySetSkipOptions - do not use the PETSc options database when loading objects
5505c6c1daeSBarry Smith 
5515c6c1daeSBarry Smith     Not Collective
5525c6c1daeSBarry Smith 
5535c6c1daeSBarry Smith     Input Parameters:
5545c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
55510699b91SBarry Smith -   skip - PETSC_TRUE means do not use the options from the options database
5565c6c1daeSBarry Smith 
5575c6c1daeSBarry Smith     Options Database Key:
55810699b91SBarry Smith .   -viewer_binary_skip_options - true means do not use the options from the options database
5595c6c1daeSBarry Smith 
5605c6c1daeSBarry Smith     Level: advanced
5615c6c1daeSBarry Smith 
56295452b02SPatrick Sanan     Notes:
56395452b02SPatrick Sanan     This must be called after PetscViewerSetType()
5645c6c1daeSBarry Smith 
565db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySkipInfo()`,
566db781477SPatrick Sanan           `PetscViewerBinaryGetSkipOptions()`
5675c6c1daeSBarry Smith @*/
5685c6c1daeSBarry Smith PetscErrorCode PetscViewerBinarySetSkipOptions(PetscViewer viewer,PetscBool skip)
5695c6c1daeSBarry Smith {
5705c6c1daeSBarry Smith   PetscFunctionBegin;
571cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
572cc843e7aSLisandro Dalcin   PetscValidLogicalCollectiveBool(viewer,skip,2);
573cac4c232SBarry Smith   PetscTryMethod(viewer,"PetscViewerBinarySetSkipOptions_C",(PetscViewer,PetscBool),(viewer,skip));
574807ea322SDave May   PetscFunctionReturn(0);
575807ea322SDave May }
576807ea322SDave May 
577cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinarySetSkipOptions_Binary(PetscViewer viewer,PetscBool skip)
578807ea322SDave May {
579cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
580807ea322SDave May 
581807ea322SDave May   PetscFunctionBegin;
582cc843e7aSLisandro Dalcin   vbinary->skipoptions = skip;
5835c6c1daeSBarry Smith   PetscFunctionReturn(0);
5845c6c1daeSBarry Smith }
5855c6c1daeSBarry Smith 
5865c6c1daeSBarry Smith /*@
5875c6c1daeSBarry Smith     PetscViewerBinaryGetSkipOptions - checks if viewer uses the PETSc options database when loading objects
5885c6c1daeSBarry Smith 
5895c6c1daeSBarry Smith     Not Collective
5905c6c1daeSBarry Smith 
5915c6c1daeSBarry Smith     Input Parameter:
5925c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
5935c6c1daeSBarry Smith 
5945c6c1daeSBarry Smith     Output Parameter:
5955c6c1daeSBarry Smith .   skip - PETSC_TRUE means do not use
5965c6c1daeSBarry Smith 
5975c6c1daeSBarry Smith     Level: advanced
5985c6c1daeSBarry Smith 
59995452b02SPatrick Sanan     Notes:
60095452b02SPatrick Sanan     This must be called after PetscViewerSetType()
6015c6c1daeSBarry Smith 
602db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySkipInfo()`,
603db781477SPatrick Sanan           `PetscViewerBinarySetSkipOptions()`
6045c6c1daeSBarry Smith @*/
6055c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetSkipOptions(PetscViewer viewer,PetscBool *skip)
6065c6c1daeSBarry Smith {
6075c6c1daeSBarry Smith   PetscFunctionBegin;
608cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
609cc843e7aSLisandro Dalcin   PetscValidBoolPointer(skip,2);
610cac4c232SBarry Smith   PetscUseMethod(viewer,"PetscViewerBinaryGetSkipOptions_C",(PetscViewer,PetscBool*),(viewer,skip));
6115c6c1daeSBarry Smith   PetscFunctionReturn(0);
6125c6c1daeSBarry Smith }
6135c6c1daeSBarry Smith 
614cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinaryGetSkipOptions_Binary(PetscViewer viewer,PetscBool *skip)
6155c6c1daeSBarry Smith {
616d21b9a37SPierre Jolivet   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
6175c6c1daeSBarry Smith 
6185c6c1daeSBarry Smith   PetscFunctionBegin;
619cc843e7aSLisandro Dalcin   *skip = vbinary->skipoptions;
6205c6c1daeSBarry Smith   PetscFunctionReturn(0);
6215c6c1daeSBarry Smith }
6225c6c1daeSBarry Smith 
6235c6c1daeSBarry Smith /*@
6245c6c1daeSBarry Smith     PetscViewerBinarySetSkipHeader - do not write a header with size information on output, just raw data
6255c6c1daeSBarry Smith 
6265c6c1daeSBarry Smith     Not Collective
6275c6c1daeSBarry Smith 
6285c6c1daeSBarry Smith     Input Parameters:
6295c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
6305c6c1daeSBarry Smith -   skip - PETSC_TRUE means do not write header
6315c6c1daeSBarry Smith 
6325c6c1daeSBarry Smith     Options Database Key:
63310699b91SBarry Smith .   -viewer_binary_skip_header - PETSC_TRUE means do not write header
6345c6c1daeSBarry Smith 
6355c6c1daeSBarry Smith     Level: advanced
6365c6c1daeSBarry Smith 
63795452b02SPatrick Sanan     Notes:
63895452b02SPatrick Sanan       This must be called after PetscViewerSetType()
6395c6c1daeSBarry Smith 
64010699b91SBarry Smith       Is ignored on anything but a binary viewer
6415c6c1daeSBarry Smith 
642db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySkipInfo()`,
643db781477SPatrick Sanan           `PetscViewerBinaryGetSkipHeader()`
6445c6c1daeSBarry Smith @*/
6455c6c1daeSBarry Smith PetscErrorCode PetscViewerBinarySetSkipHeader(PetscViewer viewer,PetscBool skip)
6465c6c1daeSBarry Smith {
6475c6c1daeSBarry Smith   PetscFunctionBegin;
648cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
649cc843e7aSLisandro Dalcin   PetscValidLogicalCollectiveBool(viewer,skip,2);
650cac4c232SBarry Smith   PetscTryMethod(viewer,"PetscViewerBinarySetSkipHeader_C",(PetscViewer,PetscBool),(viewer,skip));
6515c6c1daeSBarry Smith   PetscFunctionReturn(0);
6525c6c1daeSBarry Smith }
6535c6c1daeSBarry Smith 
654cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinarySetSkipHeader_Binary(PetscViewer viewer,PetscBool skip)
6555c6c1daeSBarry Smith {
6565c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
6575c6c1daeSBarry Smith 
6585c6c1daeSBarry Smith   PetscFunctionBegin;
659cc843e7aSLisandro Dalcin   vbinary->skipheader = skip;
6605c6c1daeSBarry Smith   PetscFunctionReturn(0);
6615c6c1daeSBarry Smith }
6625c6c1daeSBarry Smith 
6635c6c1daeSBarry Smith /*@
6645c6c1daeSBarry Smith     PetscViewerBinaryGetSkipHeader - checks whether to write a header with size information on output, or just raw data
6655c6c1daeSBarry Smith 
6665c6c1daeSBarry Smith     Not Collective
6675c6c1daeSBarry Smith 
6685c6c1daeSBarry Smith     Input Parameter:
6695c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
6705c6c1daeSBarry Smith 
6715c6c1daeSBarry Smith     Output Parameter:
6725c6c1daeSBarry Smith .   skip - PETSC_TRUE means do not write header
6735c6c1daeSBarry Smith 
6745c6c1daeSBarry Smith     Level: advanced
6755c6c1daeSBarry Smith 
67695452b02SPatrick Sanan     Notes:
67795452b02SPatrick Sanan     This must be called after PetscViewerSetType()
6785c6c1daeSBarry Smith 
6795c6c1daeSBarry Smith             Returns false for PETSCSOCKETVIEWER, you cannot skip the header for it.
6805c6c1daeSBarry Smith 
681db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySkipInfo()`,
682db781477SPatrick Sanan           `PetscViewerBinarySetSkipHeader()`
6835c6c1daeSBarry Smith @*/
6845c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetSkipHeader(PetscViewer viewer,PetscBool  *skip)
6855c6c1daeSBarry Smith {
6865c6c1daeSBarry Smith   PetscFunctionBegin;
687cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
688cc843e7aSLisandro Dalcin   PetscValidBoolPointer(skip,2);
689cac4c232SBarry Smith   PetscUseMethod(viewer,"PetscViewerBinaryGetSkipHeader_C",(PetscViewer,PetscBool*),(viewer,skip));
6905c6c1daeSBarry Smith   PetscFunctionReturn(0);
6915c6c1daeSBarry Smith }
6925c6c1daeSBarry Smith 
693cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinaryGetSkipHeader_Binary(PetscViewer viewer,PetscBool  *skip)
6945c6c1daeSBarry Smith {
695f3b211e4SSatish Balay   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
6965c6c1daeSBarry Smith 
6975c6c1daeSBarry Smith   PetscFunctionBegin;
698cc843e7aSLisandro Dalcin   *skip = vbinary->skipheader;
6995c6c1daeSBarry Smith   PetscFunctionReturn(0);
7005c6c1daeSBarry Smith }
7015c6c1daeSBarry Smith 
7025c6c1daeSBarry Smith /*@C
7035c6c1daeSBarry Smith     PetscViewerBinaryGetInfoPointer - Extracts the file pointer for the ASCII
7045c6c1daeSBarry Smith           info file associated with a binary file.
7055c6c1daeSBarry Smith 
7065c6c1daeSBarry Smith     Not Collective
7075c6c1daeSBarry Smith 
7085c6c1daeSBarry Smith     Input Parameter:
7095c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
7105c6c1daeSBarry Smith 
7115c6c1daeSBarry Smith     Output Parameter:
7120298fd71SBarry Smith .   file - file pointer  Always returns NULL if not a binary viewer
7135c6c1daeSBarry Smith 
7145c6c1daeSBarry Smith     Level: advanced
7155c6c1daeSBarry Smith 
7165c6c1daeSBarry Smith     Notes:
7175c6c1daeSBarry Smith       For writable binary PetscViewers, the descriptor will only be valid for the
7185c6c1daeSBarry Smith     first processor in the communicator that shares the PetscViewer.
7195c6c1daeSBarry Smith 
7205c6c1daeSBarry Smith     Fortran Note:
7215c6c1daeSBarry Smith     This routine is not supported in Fortran.
7225c6c1daeSBarry Smith 
723c2e3fba1SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`
7245c6c1daeSBarry Smith @*/
7255c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetInfoPointer(PetscViewer viewer,FILE **file)
7265c6c1daeSBarry Smith {
7275c6c1daeSBarry Smith   PetscFunctionBegin;
728cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
729cc843e7aSLisandro Dalcin   PetscValidPointer(file,2);
7300298fd71SBarry Smith   *file = NULL;
731cac4c232SBarry Smith   PetscTryMethod(viewer,"PetscViewerBinaryGetInfoPointer_C",(PetscViewer,FILE **),(viewer,file));
7325c6c1daeSBarry Smith   PetscFunctionReturn(0);
7335c6c1daeSBarry Smith }
7345c6c1daeSBarry Smith 
735cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerBinaryGetInfoPointer_Binary(PetscViewer viewer,FILE **file)
7365c6c1daeSBarry Smith {
737cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
7385c6c1daeSBarry Smith 
7395c6c1daeSBarry Smith   PetscFunctionBegin;
7409566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
741cc843e7aSLisandro Dalcin   *file = vbinary->fdes_info;
742cc843e7aSLisandro Dalcin   if (viewer->format == PETSC_VIEWER_BINARY_MATLAB && !vbinary->matlabheaderwritten) {
7435c6c1daeSBarry Smith     if (vbinary->fdes_info) {
744cc843e7aSLisandro Dalcin       FILE *info = vbinary->fdes_info;
7459566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(PETSC_COMM_SELF,info,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n"));
7469566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(PETSC_COMM_SELF,info,"#$$ Set.filename = '%s';\n",vbinary->filename));
7479566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(PETSC_COMM_SELF,info,"#$$ fd = PetscOpenFile(Set.filename);\n"));
7489566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(PETSC_COMM_SELF,info,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n"));
749cc843e7aSLisandro Dalcin     }
750cc843e7aSLisandro Dalcin     vbinary->matlabheaderwritten = PETSC_TRUE;
7515c6c1daeSBarry Smith   }
7525c6c1daeSBarry Smith   PetscFunctionReturn(0);
7535c6c1daeSBarry Smith }
7545c6c1daeSBarry Smith 
755e0385b85SDave May #if defined(PETSC_HAVE_MPIIO)
756e0385b85SDave May static PetscErrorCode PetscViewerFileClose_BinaryMPIIO(PetscViewer v)
757e0385b85SDave May {
758e0385b85SDave May   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)v->data;
759e0385b85SDave May 
760e0385b85SDave May   PetscFunctionBegin;
761e8a65b7dSLisandro Dalcin   if (vbinary->mfdes != MPI_FILE_NULL) {
7629566063dSJacob Faibussowitsch     PetscCallMPI(MPI_File_close(&vbinary->mfdes));
763e0385b85SDave May   }
764e8a65b7dSLisandro Dalcin   if (vbinary->mfsub != MPI_FILE_NULL) {
7659566063dSJacob Faibussowitsch     PetscCallMPI(MPI_File_close(&vbinary->mfsub));
766e8a65b7dSLisandro Dalcin   }
767cc843e7aSLisandro Dalcin   vbinary->moff = 0;
768e0385b85SDave May   PetscFunctionReturn(0);
769e0385b85SDave May }
770e0385b85SDave May #endif
771e0385b85SDave May 
772cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerFileClose_BinarySTDIO(PetscViewer v)
773cc843e7aSLisandro Dalcin {
774cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)v->data;
775cc843e7aSLisandro Dalcin 
776cc843e7aSLisandro Dalcin   PetscFunctionBegin;
777cc843e7aSLisandro Dalcin   if (vbinary->fdes != -1) {
7789566063dSJacob Faibussowitsch     PetscCall(PetscBinaryClose(vbinary->fdes));
779cc843e7aSLisandro Dalcin     vbinary->fdes = -1;
780cc843e7aSLisandro Dalcin     if (vbinary->storecompressed) {
781cc843e7aSLisandro Dalcin       char cmd[8+PETSC_MAX_PATH_LEN],out[64+PETSC_MAX_PATH_LEN] = "";
782cc843e7aSLisandro Dalcin       const char *gzfilename = vbinary->ogzfilename ? vbinary->ogzfilename : vbinary->filename;
783cc843e7aSLisandro Dalcin       /* compress the file */
7849566063dSJacob Faibussowitsch       PetscCall(PetscStrncpy(cmd,"gzip -f ",sizeof(cmd)));
7859566063dSJacob Faibussowitsch       PetscCall(PetscStrlcat(cmd,gzfilename,sizeof(cmd)));
786cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_POPEN)
787cc843e7aSLisandro Dalcin       {
788cc843e7aSLisandro Dalcin         FILE *fp;
7899566063dSJacob Faibussowitsch         PetscCall(PetscPOpen(PETSC_COMM_SELF,NULL,cmd,"r",&fp));
790cc73adaaSBarry Smith         PetscCheck(!fgets(out,(int)(sizeof(out)-1),fp),PETSC_COMM_SELF,PETSC_ERR_LIB,"Error from command %s\n%s",cmd,out);
7919566063dSJacob Faibussowitsch         PetscCall(PetscPClose(PETSC_COMM_SELF,fp));
792cc843e7aSLisandro Dalcin       }
793cc843e7aSLisandro Dalcin #endif
794cc843e7aSLisandro Dalcin     }
795cc843e7aSLisandro Dalcin   }
7969566063dSJacob Faibussowitsch   PetscCall(PetscFree(vbinary->ogzfilename));
797cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
798cc843e7aSLisandro Dalcin }
799cc843e7aSLisandro Dalcin 
800cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerFileClose_BinaryInfo(PetscViewer v)
801cc843e7aSLisandro Dalcin {
802cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)v->data;
803cc843e7aSLisandro Dalcin 
804cc843e7aSLisandro Dalcin   PetscFunctionBegin;
805cc843e7aSLisandro Dalcin   if (v->format == PETSC_VIEWER_BINARY_MATLAB && vbinary->matlabheaderwritten) {
806cc843e7aSLisandro Dalcin     if (vbinary->fdes_info) {
807cc843e7aSLisandro Dalcin       FILE *info = vbinary->fdes_info;
8089566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(PETSC_COMM_SELF,info,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n"));
8099566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(PETSC_COMM_SELF,info,"#$$ close(fd);\n"));
8109566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(PETSC_COMM_SELF,info,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n"));
811cc843e7aSLisandro Dalcin     }
812cc843e7aSLisandro Dalcin   }
813cc843e7aSLisandro Dalcin   if (vbinary->fdes_info) {
814cc843e7aSLisandro Dalcin     FILE *info = vbinary->fdes_info;
815cc843e7aSLisandro Dalcin     vbinary->fdes_info = NULL;
816cc73adaaSBarry Smith     PetscCheck(!fclose(info),PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
817cc843e7aSLisandro Dalcin   }
818cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
819cc843e7aSLisandro Dalcin }
820cc843e7aSLisandro Dalcin 
821cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerFileClose_Binary(PetscViewer v)
822cc843e7aSLisandro Dalcin {
823cc843e7aSLisandro Dalcin   PetscFunctionBegin;
824cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
8259566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileClose_BinaryMPIIO(v));
826cc843e7aSLisandro Dalcin #endif
8279566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileClose_BinarySTDIO(v));
8289566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileClose_BinaryInfo(v));
829cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
830cc843e7aSLisandro Dalcin }
831cc843e7aSLisandro Dalcin 
83281f0254dSBarry Smith static PetscErrorCode PetscViewerDestroy_Binary(PetscViewer v)
8335c6c1daeSBarry Smith {
8345c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)v->data;
8355c6c1daeSBarry Smith 
8365c6c1daeSBarry Smith   PetscFunctionBegin;
8379566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileClose_Binary(v));
8389566063dSJacob Faibussowitsch   PetscCall(PetscFree(vbinary->filename));
8399566063dSJacob Faibussowitsch   PetscCall(PetscFree(vbinary));
840*2e956fe4SStefano Zampini   PetscCall(PetscViewerBinaryClearFunctionList(v));
841e0385b85SDave May   PetscFunctionReturn(0);
842e0385b85SDave May }
8435c6c1daeSBarry Smith 
8445c6c1daeSBarry Smith /*@C
8455c6c1daeSBarry Smith    PetscViewerBinaryOpen - Opens a file for binary input/output.
8465c6c1daeSBarry Smith 
847d083f849SBarry Smith    Collective
8485c6c1daeSBarry Smith 
8495c6c1daeSBarry Smith    Input Parameters:
8505c6c1daeSBarry Smith +  comm - MPI communicator
8515c6c1daeSBarry Smith .  name - name of file
852cc843e7aSLisandro Dalcin -  mode - open mode of file
8535c6c1daeSBarry Smith $    FILE_MODE_WRITE - create new file for binary output
8545c6c1daeSBarry Smith $    FILE_MODE_READ - open existing file for binary input
8555c6c1daeSBarry Smith $    FILE_MODE_APPEND - open existing file for binary output
8565c6c1daeSBarry Smith 
8575c6c1daeSBarry Smith    Output Parameter:
858cc843e7aSLisandro Dalcin .  viewer - PetscViewer for binary input/output to use with the specified file
8595c6c1daeSBarry Smith 
8605c6c1daeSBarry Smith     Options Database Keys:
86163c55180SPatrick Sanan +    -viewer_binary_filename <name> -
86263c55180SPatrick Sanan .    -viewer_binary_skip_info -
86363c55180SPatrick Sanan .    -viewer_binary_skip_options -
86463c55180SPatrick Sanan .    -viewer_binary_skip_header -
86563c55180SPatrick Sanan -    -viewer_binary_mpiio -
8665c6c1daeSBarry Smith 
8675c6c1daeSBarry Smith    Level: beginner
8685c6c1daeSBarry Smith 
8695c6c1daeSBarry Smith    Note:
8705c6c1daeSBarry Smith    This PetscViewer should be destroyed with PetscViewerDestroy().
8715c6c1daeSBarry Smith 
8725c6c1daeSBarry Smith     For reading files, the filename may begin with ftp:// or http:// and/or
8735c6c1daeSBarry Smith     end with .gz; in this case file is brought over and uncompressed.
8745c6c1daeSBarry Smith 
8755c6c1daeSBarry Smith     For creating files, if the file name ends with .gz it is automatically
8765c6c1daeSBarry Smith     compressed when closed.
8775c6c1daeSBarry Smith 
878db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`,
879db781477SPatrick Sanan           `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`,
880db781477SPatrick Sanan           `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()`, `PetscViewerBinarySetUseMPIIO()`,
881db781477SPatrick Sanan           `PetscViewerBinaryGetUseMPIIO()`, `PetscViewerBinaryGetMPIIOOffset()`
8825c6c1daeSBarry Smith @*/
883cc843e7aSLisandro Dalcin PetscErrorCode PetscViewerBinaryOpen(MPI_Comm comm,const char name[],PetscFileMode mode,PetscViewer *viewer)
8845c6c1daeSBarry Smith {
8855c6c1daeSBarry Smith   PetscFunctionBegin;
8869566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm,viewer));
8879566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(*viewer,PETSCVIEWERBINARY));
8889566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetMode(*viewer,mode));
8899566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetName(*viewer,name));
8909566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetFromOptions(*viewer));
8915c6c1daeSBarry Smith   PetscFunctionReturn(0);
8925c6c1daeSBarry Smith }
8935c6c1daeSBarry Smith 
8945c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
895060da220SMatthew G. Knepley static PetscErrorCode PetscViewerBinaryWriteReadMPIIO(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype,PetscBool write)
8965c6c1daeSBarry Smith {
89722a8f86cSLisandro Dalcin   MPI_Comm           comm = PetscObjectComm((PetscObject)viewer);
8985c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
89922a8f86cSLisandro Dalcin   MPI_File           mfdes = vbinary->mfdes;
9005c6c1daeSBarry Smith   MPI_Datatype       mdtype;
90169e10bbaSLisandro Dalcin   PetscMPIInt        rank,cnt;
9025c6c1daeSBarry Smith   MPI_Status         status;
9035c6c1daeSBarry Smith   MPI_Aint           ul,dsize;
9045c6c1daeSBarry Smith 
9055c6c1daeSBarry Smith   PetscFunctionBegin;
9069566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm,&rank));
9079566063dSJacob Faibussowitsch   PetscCall(PetscMPIIntCast(num,&cnt));
9089566063dSJacob Faibussowitsch   PetscCall(PetscDataTypeToMPIDataType(dtype,&mdtype));
9095c6c1daeSBarry Smith   if (write) {
910dd400576SPatrick Sanan     if (rank == 0) {
9119566063dSJacob Faibussowitsch       PetscCall(MPIU_File_write_at(mfdes,vbinary->moff,data,cnt,mdtype,&status));
91269e10bbaSLisandro Dalcin     }
9135c6c1daeSBarry Smith   } else {
914dd400576SPatrick Sanan     if (rank == 0) {
9159566063dSJacob Faibussowitsch       PetscCall(MPIU_File_read_at(mfdes,vbinary->moff,data,cnt,mdtype,&status));
9169566063dSJacob Faibussowitsch       if (cnt > 0) PetscCallMPI(MPI_Get_count(&status,mdtype,&cnt));
9175c6c1daeSBarry Smith     }
9189566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Bcast(&cnt,1,MPI_INT,0,comm));
9199566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Bcast(data,cnt,mdtype,0,comm));
92069e10bbaSLisandro Dalcin   }
9219566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_get_extent(mdtype,&ul,&dsize));
9225c6c1daeSBarry Smith   vbinary->moff += dsize*cnt;
9239860990eSLisandro Dalcin   if (count) *count = cnt;
9245c6c1daeSBarry Smith   PetscFunctionReturn(0);
9255c6c1daeSBarry Smith }
9265c6c1daeSBarry Smith #endif
9275c6c1daeSBarry Smith 
9285c6c1daeSBarry Smith /*@C
9295c6c1daeSBarry Smith    PetscViewerBinaryRead - Reads from a binary file, all processors get the same result
9305c6c1daeSBarry Smith 
931d083f849SBarry Smith    Collective
9325c6c1daeSBarry Smith 
9335c6c1daeSBarry Smith    Input Parameters:
9345c6c1daeSBarry Smith +  viewer - the binary viewer
935907376e6SBarry Smith .  data - location of the data to be written
936060da220SMatthew G. Knepley .  num - number of items of data to read
937907376e6SBarry Smith -  dtype - type of data to read
9385c6c1daeSBarry Smith 
939f8e4bde8SMatthew G. Knepley    Output Parameters:
9405972f5f3SLisandro Dalcin .  count - number of items of data actually read, or NULL.
941f8e4bde8SMatthew G. Knepley 
9425c6c1daeSBarry Smith    Level: beginner
9435c6c1daeSBarry Smith 
944db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`,
945db781477SPatrick Sanan           `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`,
946db781477SPatrick Sanan           `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()`
9475c6c1daeSBarry Smith @*/
948060da220SMatthew G. Knepley PetscErrorCode PetscViewerBinaryRead(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype)
9495c6c1daeSBarry Smith {
95022a8f86cSLisandro Dalcin   PetscViewer_Binary *vbinary;
9515c6c1daeSBarry Smith 
95222a8f86cSLisandro Dalcin   PetscFunctionBegin;
95322a8f86cSLisandro Dalcin   PetscValidHeaderSpecificType(viewer,PETSC_VIEWER_CLASSID,1,PETSCVIEWERBINARY);
95422a8f86cSLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer,num,3);
9559566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
95622a8f86cSLisandro Dalcin   vbinary = (PetscViewer_Binary*)viewer->data;
9575c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
958bc196f7cSDave May   if (vbinary->usempiio) {
9599566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWriteReadMPIIO(viewer,data,num,count,dtype,PETSC_FALSE));
9605c6c1daeSBarry Smith   } else {
9615c6c1daeSBarry Smith #endif
9629566063dSJacob Faibussowitsch     PetscCall(PetscBinarySynchronizedRead(PetscObjectComm((PetscObject)viewer),vbinary->fdes,data,num,count,dtype));
9635c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
9645c6c1daeSBarry Smith   }
9655c6c1daeSBarry Smith #endif
9665c6c1daeSBarry Smith   PetscFunctionReturn(0);
9675c6c1daeSBarry Smith }
9685c6c1daeSBarry Smith 
9695c6c1daeSBarry Smith /*@C
9705c6c1daeSBarry Smith    PetscViewerBinaryWrite - writes to a binary file, only from the first process
9715c6c1daeSBarry Smith 
972d083f849SBarry Smith    Collective
9735c6c1daeSBarry Smith 
9745c6c1daeSBarry Smith    Input Parameters:
9755c6c1daeSBarry Smith +  viewer - the binary viewer
9765c6c1daeSBarry Smith .  data - location of data
9775824c9d0SPatrick Sanan .  count - number of items of data to write
978f253e43cSLisandro Dalcin -  dtype - type of data to write
9795c6c1daeSBarry Smith 
9805c6c1daeSBarry Smith    Level: beginner
9815c6c1daeSBarry Smith 
982db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`,
983db781477SPatrick Sanan           `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`, `PetscDataType`
984db781477SPatrick Sanan           `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()`
9855c6c1daeSBarry Smith @*/
986f253e43cSLisandro Dalcin PetscErrorCode PetscViewerBinaryWrite(PetscViewer viewer,const void *data,PetscInt count,PetscDataType dtype)
9875c6c1daeSBarry Smith {
98822a8f86cSLisandro Dalcin   PetscViewer_Binary *vbinary;
9895c6c1daeSBarry Smith 
9905c6c1daeSBarry Smith   PetscFunctionBegin;
99122a8f86cSLisandro Dalcin   PetscValidHeaderSpecificType(viewer,PETSC_VIEWER_CLASSID,1,PETSCVIEWERBINARY);
99222a8f86cSLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer,count,3);
9939566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
99422a8f86cSLisandro Dalcin   vbinary = (PetscViewer_Binary*)viewer->data;
9955c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
996bc196f7cSDave May   if (vbinary->usempiio) {
9979566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWriteReadMPIIO(viewer,(void*)data,count,NULL,dtype,PETSC_TRUE));
9985c6c1daeSBarry Smith   } else {
9995c6c1daeSBarry Smith #endif
10009566063dSJacob Faibussowitsch     PetscCall(PetscBinarySynchronizedWrite(PetscObjectComm((PetscObject)viewer),vbinary->fdes,data,count,dtype));
10015c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
10025c6c1daeSBarry Smith   }
10035c6c1daeSBarry Smith #endif
10045c6c1daeSBarry Smith   PetscFunctionReturn(0);
10055c6c1daeSBarry Smith }
10065c6c1daeSBarry Smith 
10075972f5f3SLisandro Dalcin static PetscErrorCode PetscViewerBinaryWriteReadAll(PetscViewer viewer,PetscBool write,void *data,PetscInt count,PetscInt start,PetscInt total,PetscDataType dtype)
10085972f5f3SLisandro Dalcin {
10095972f5f3SLisandro Dalcin   MPI_Comm              comm = PetscObjectComm((PetscObject)viewer);
10105972f5f3SLisandro Dalcin   PetscMPIInt           size,rank;
10115972f5f3SLisandro Dalcin   MPI_Datatype          mdtype;
1012ec4bef21SJose E. Roman   PETSC_UNUSED MPI_Aint lb;
1013ec4bef21SJose E. Roman   MPI_Aint              dsize;
10145972f5f3SLisandro Dalcin   PetscBool             useMPIIO;
10155972f5f3SLisandro Dalcin 
10165972f5f3SLisandro Dalcin   PetscFunctionBegin;
10175972f5f3SLisandro Dalcin   PetscValidHeaderSpecificType(viewer,PETSC_VIEWER_CLASSID,1,PETSCVIEWERBINARY);
1018064a246eSJacob Faibussowitsch   PetscValidLogicalCollectiveBool(viewer,((start>=0)||(start==PETSC_DETERMINE)),5);
1019064a246eSJacob Faibussowitsch   PetscValidLogicalCollectiveBool(viewer,((total>=0)||(total==PETSC_DETERMINE)),6);
1020064a246eSJacob Faibussowitsch   PetscValidLogicalCollectiveInt(viewer,total,6);
10219566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
10225972f5f3SLisandro Dalcin 
10239566063dSJacob Faibussowitsch   PetscCall(PetscDataTypeToMPIDataType(dtype,&mdtype));
10249566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_get_extent(mdtype,&lb,&dsize));
10259566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm,&rank));
10269566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm,&size));
10275972f5f3SLisandro Dalcin 
10289566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryGetUseMPIIO(viewer,&useMPIIO));
10295972f5f3SLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
10305972f5f3SLisandro Dalcin   if (useMPIIO) {
10315972f5f3SLisandro Dalcin     MPI_File       mfdes;
10325972f5f3SLisandro Dalcin     MPI_Offset     off;
10335972f5f3SLisandro Dalcin     PetscMPIInt    cnt;
10345972f5f3SLisandro Dalcin 
10355972f5f3SLisandro Dalcin     if (start == PETSC_DETERMINE) {
10369566063dSJacob Faibussowitsch       PetscCallMPI(MPI_Scan(&count,&start,1,MPIU_INT,MPI_SUM,comm));
10375972f5f3SLisandro Dalcin       start -= count;
10385972f5f3SLisandro Dalcin     }
10395972f5f3SLisandro Dalcin     if (total == PETSC_DETERMINE) {
10405972f5f3SLisandro Dalcin       total = start + count;
10419566063dSJacob Faibussowitsch       PetscCallMPI(MPI_Bcast(&total,1,MPIU_INT,size-1,comm));
10425972f5f3SLisandro Dalcin     }
10439566063dSJacob Faibussowitsch     PetscCall(PetscMPIIntCast(count,&cnt));
10449566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryGetMPIIODescriptor(viewer,&mfdes));
10459566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryGetMPIIOOffset(viewer,&off));
10465972f5f3SLisandro Dalcin     off += (MPI_Offset)(start*dsize);
10475972f5f3SLisandro Dalcin     if (write) {
10489566063dSJacob Faibussowitsch       PetscCall(MPIU_File_write_at_all(mfdes,off,data,cnt,mdtype,MPI_STATUS_IGNORE));
10495972f5f3SLisandro Dalcin     } else {
10509566063dSJacob Faibussowitsch       PetscCall(MPIU_File_read_at_all(mfdes,off,data,cnt,mdtype,MPI_STATUS_IGNORE));
10515972f5f3SLisandro Dalcin     }
10525972f5f3SLisandro Dalcin     off  = (MPI_Offset)(total*dsize);
10539566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryAddMPIIOOffset(viewer,off));
10545972f5f3SLisandro Dalcin     PetscFunctionReturn(0);
10555972f5f3SLisandro Dalcin   }
10565972f5f3SLisandro Dalcin #endif
10575972f5f3SLisandro Dalcin   {
10585972f5f3SLisandro Dalcin     int         fdes;
10595972f5f3SLisandro Dalcin     char        *workbuf = NULL;
1060dd400576SPatrick Sanan     PetscInt    tcount = rank == 0 ? 0 : count,maxcount=0,message_count,flowcontrolcount;
10615972f5f3SLisandro Dalcin     PetscMPIInt tag,cnt,maxcnt,scnt=0,rcnt=0,j;
10625972f5f3SLisandro Dalcin     MPI_Status  status;
10635972f5f3SLisandro Dalcin 
10649566063dSJacob Faibussowitsch     PetscCall(PetscCommGetNewTag(comm,&tag));
10659566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Reduce(&tcount,&maxcount,1,MPIU_INT,MPI_MAX,0,comm));
10669566063dSJacob Faibussowitsch     PetscCall(PetscMPIIntCast(maxcount,&maxcnt));
10679566063dSJacob Faibussowitsch     PetscCall(PetscMPIIntCast(count,&cnt));
10685972f5f3SLisandro Dalcin 
10699566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryGetDescriptor(viewer,&fdes));
10709566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlowControlStart(viewer,&message_count,&flowcontrolcount));
1071dd400576SPatrick Sanan     if (rank == 0) {
10729566063dSJacob Faibussowitsch       PetscCall(PetscMalloc(maxcnt*dsize,&workbuf));
10735972f5f3SLisandro Dalcin       if (write) {
10749566063dSJacob Faibussowitsch         PetscCall(PetscBinaryWrite(fdes,data,cnt,dtype));
10755972f5f3SLisandro Dalcin       } else {
10769566063dSJacob Faibussowitsch         PetscCall(PetscBinaryRead(fdes,data,cnt,NULL,dtype));
10775972f5f3SLisandro Dalcin       }
10785972f5f3SLisandro Dalcin       for (j=1; j<size; j++) {
10799566063dSJacob Faibussowitsch         PetscCall(PetscViewerFlowControlStepMain(viewer,j,&message_count,flowcontrolcount));
10805972f5f3SLisandro Dalcin         if (write) {
10819566063dSJacob Faibussowitsch           PetscCallMPI(MPI_Recv(workbuf,maxcnt,mdtype,j,tag,comm,&status));
10829566063dSJacob Faibussowitsch           PetscCallMPI(MPI_Get_count(&status,mdtype,&rcnt));
10839566063dSJacob Faibussowitsch           PetscCall(PetscBinaryWrite(fdes,workbuf,rcnt,dtype));
10845972f5f3SLisandro Dalcin         } else {
10859566063dSJacob Faibussowitsch           PetscCallMPI(MPI_Recv(&scnt,1,MPI_INT,j,tag,comm,MPI_STATUS_IGNORE));
10869566063dSJacob Faibussowitsch           PetscCall(PetscBinaryRead(fdes,workbuf,scnt,NULL,dtype));
10879566063dSJacob Faibussowitsch           PetscCallMPI(MPI_Send(workbuf,scnt,mdtype,j,tag,comm));
10885972f5f3SLisandro Dalcin         }
10895972f5f3SLisandro Dalcin       }
10909566063dSJacob Faibussowitsch       PetscCall(PetscFree(workbuf));
10919566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlowControlEndMain(viewer,&message_count));
10925972f5f3SLisandro Dalcin     } else {
10939566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlowControlStepWorker(viewer,rank,&message_count));
10945972f5f3SLisandro Dalcin       if (write) {
10959566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Send(data,cnt,mdtype,0,tag,comm));
10965972f5f3SLisandro Dalcin       } else {
10979566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Send(&cnt,1,MPI_INT,0,tag,comm));
10989566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Recv(data,cnt,mdtype,0,tag,comm,MPI_STATUS_IGNORE));
10995972f5f3SLisandro Dalcin       }
11009566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlowControlEndWorker(viewer,&message_count));
11015972f5f3SLisandro Dalcin     }
11025972f5f3SLisandro Dalcin   }
11035972f5f3SLisandro Dalcin   PetscFunctionReturn(0);
11045972f5f3SLisandro Dalcin }
11055972f5f3SLisandro Dalcin 
11065972f5f3SLisandro Dalcin /*@C
11075972f5f3SLisandro Dalcin    PetscViewerBinaryReadAll - reads from a binary file from all processes
11085972f5f3SLisandro Dalcin 
11095972f5f3SLisandro Dalcin    Collective
11105972f5f3SLisandro Dalcin 
11115972f5f3SLisandro Dalcin    Input Parameters:
11125972f5f3SLisandro Dalcin +  viewer - the binary viewer
11135972f5f3SLisandro Dalcin .  data - location of data
11145972f5f3SLisandro Dalcin .  count - local number of items of data to read
11155972f5f3SLisandro Dalcin .  start - local start, can be PETSC_DETERMINE
11165972f5f3SLisandro Dalcin .  total - global number of items of data to read, can be PETSC_DETERMINE
11175972f5f3SLisandro Dalcin -  dtype - type of data to read
11185972f5f3SLisandro Dalcin 
11195972f5f3SLisandro Dalcin    Level: advanced
11205972f5f3SLisandro Dalcin 
1121db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryRead()`, `PetscViewerBinaryWriteAll()`
11225972f5f3SLisandro Dalcin @*/
11235972f5f3SLisandro Dalcin PetscErrorCode PetscViewerBinaryReadAll(PetscViewer viewer,void *data,PetscInt count,PetscInt start,PetscInt total,PetscDataType dtype)
11245972f5f3SLisandro Dalcin {
11255972f5f3SLisandro Dalcin   PetscFunctionBegin;
11269566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryWriteReadAll(viewer,PETSC_FALSE,data,count,start,total,dtype));
11275972f5f3SLisandro Dalcin   PetscFunctionReturn(0);
11285972f5f3SLisandro Dalcin }
11295972f5f3SLisandro Dalcin 
11305972f5f3SLisandro Dalcin /*@C
11315972f5f3SLisandro Dalcin    PetscViewerBinaryWriteAll - writes to a binary file from all processes
11325972f5f3SLisandro Dalcin 
11335972f5f3SLisandro Dalcin    Collective
11345972f5f3SLisandro Dalcin 
11355972f5f3SLisandro Dalcin    Input Parameters:
11365972f5f3SLisandro Dalcin +  viewer - the binary viewer
11375972f5f3SLisandro Dalcin .  data - location of data
11385972f5f3SLisandro Dalcin .  count - local number of items of data to write
11395972f5f3SLisandro Dalcin .  start - local start, can be PETSC_DETERMINE
11405972f5f3SLisandro Dalcin .  total - global number of items of data to write, can be PETSC_DETERMINE
11415972f5f3SLisandro Dalcin -  dtype - type of data to write
11425972f5f3SLisandro Dalcin 
11435972f5f3SLisandro Dalcin    Level: advanced
11445972f5f3SLisandro Dalcin 
1145db781477SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryWriteAll()`, `PetscViewerBinaryReadAll()`
11465972f5f3SLisandro Dalcin @*/
11475972f5f3SLisandro Dalcin PetscErrorCode PetscViewerBinaryWriteAll(PetscViewer viewer,const void *data,PetscInt count,PetscInt start,PetscInt total,PetscDataType dtype)
11485972f5f3SLisandro Dalcin {
11495972f5f3SLisandro Dalcin   PetscFunctionBegin;
11509566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryWriteReadAll(viewer,PETSC_TRUE,(void*)data,count,start,total,dtype));
11515972f5f3SLisandro Dalcin   PetscFunctionReturn(0);
11525972f5f3SLisandro Dalcin }
11535972f5f3SLisandro Dalcin 
11545c6c1daeSBarry Smith /*@C
11555c6c1daeSBarry Smith    PetscViewerBinaryWriteStringArray - writes to a binary file, only from the first process an array of strings
11565c6c1daeSBarry Smith 
1157d083f849SBarry Smith    Collective
11585c6c1daeSBarry Smith 
11595c6c1daeSBarry Smith    Input Parameters:
11605c6c1daeSBarry Smith +  viewer - the binary viewer
11615c6c1daeSBarry Smith -  data - location of the array of strings
11625c6c1daeSBarry Smith 
11635c6c1daeSBarry Smith    Level: intermediate
11645c6c1daeSBarry Smith 
116595452b02SPatrick Sanan     Notes:
116695452b02SPatrick Sanan     array of strings is null terminated
11675c6c1daeSBarry Smith 
1168db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`,
1169db781477SPatrick Sanan           `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`,
1170db781477SPatrick Sanan           `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()`
11715c6c1daeSBarry Smith @*/
117278fbdcc8SBarry Smith PetscErrorCode PetscViewerBinaryWriteStringArray(PetscViewer viewer,const char * const *data)
11735c6c1daeSBarry Smith {
11745c6c1daeSBarry Smith   PetscInt       i,n = 0,*sizes;
1175cc843e7aSLisandro Dalcin   size_t         len;
11765c6c1daeSBarry Smith 
117722a8f86cSLisandro Dalcin   PetscFunctionBegin;
11789566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
11795c6c1daeSBarry Smith   /* count number of strings */
11805c6c1daeSBarry Smith   while (data[n++]);
11815c6c1daeSBarry Smith   n--;
11829566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(n+1,&sizes));
11835c6c1daeSBarry Smith   sizes[0] = n;
11845c6c1daeSBarry Smith   for (i=0; i<n; i++) {
11859566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(data[i],&len));
1186cc843e7aSLisandro Dalcin     sizes[i+1] = (PetscInt)len + 1; /* size includes space for the null terminator */
11875c6c1daeSBarry Smith   }
11889566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryWrite(viewer,sizes,n+1,PETSC_INT));
11895c6c1daeSBarry Smith   for (i=0; i<n; i++) {
11909566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(viewer,(void*)data[i],sizes[i+1],PETSC_CHAR));
11915c6c1daeSBarry Smith   }
11929566063dSJacob Faibussowitsch   PetscCall(PetscFree(sizes));
11935c6c1daeSBarry Smith   PetscFunctionReturn(0);
11945c6c1daeSBarry Smith }
11955c6c1daeSBarry Smith 
11965c6c1daeSBarry Smith /*@C
11975c6c1daeSBarry Smith    PetscViewerBinaryReadStringArray - reads a binary file an array of strings
11985c6c1daeSBarry Smith 
1199d083f849SBarry Smith    Collective
12005c6c1daeSBarry Smith 
12015c6c1daeSBarry Smith    Input Parameter:
12025c6c1daeSBarry Smith .  viewer - the binary viewer
12035c6c1daeSBarry Smith 
12045c6c1daeSBarry Smith    Output Parameter:
12055c6c1daeSBarry Smith .  data - location of the array of strings
12065c6c1daeSBarry Smith 
12075c6c1daeSBarry Smith    Level: intermediate
12085c6c1daeSBarry Smith 
120995452b02SPatrick Sanan     Notes:
121095452b02SPatrick Sanan     array of strings is null terminated
12115c6c1daeSBarry Smith 
1212db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`,
1213db781477SPatrick Sanan           `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`,
1214db781477SPatrick Sanan           `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()`
12155c6c1daeSBarry Smith @*/
12165c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryReadStringArray(PetscViewer viewer,char ***data)
12175c6c1daeSBarry Smith {
1218060da220SMatthew G. Knepley   PetscInt       i,n,*sizes,N = 0;
12195c6c1daeSBarry Smith 
122022a8f86cSLisandro Dalcin   PetscFunctionBegin;
12219566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetUp(viewer));
12225c6c1daeSBarry Smith   /* count number of strings */
12239566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(viewer,&n,1,NULL,PETSC_INT));
12249566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(n,&sizes));
12259566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(viewer,sizes,n,NULL,PETSC_INT));
1226a297a907SKarl Rupp   for (i=0; i<n; i++) N += sizes[i];
12279566063dSJacob Faibussowitsch   PetscCall(PetscMalloc((n+1)*sizeof(char*) + N*sizeof(char),data));
12285c6c1daeSBarry Smith   (*data)[0] = (char*)((*data) + n + 1);
1229a297a907SKarl Rupp   for (i=1; i<n; i++) (*data)[i] = (*data)[i-1] + sizes[i-1];
12309566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(viewer,(*data)[0],N,NULL,PETSC_CHAR));
123102c9f0b5SLisandro Dalcin   (*data)[n] = NULL;
12329566063dSJacob Faibussowitsch   PetscCall(PetscFree(sizes));
12335c6c1daeSBarry Smith   PetscFunctionReturn(0);
12345c6c1daeSBarry Smith }
12355c6c1daeSBarry Smith 
1236cc843e7aSLisandro Dalcin /*@C
1237cc843e7aSLisandro Dalcin      PetscViewerFileSetMode - Sets the open mode of file
1238cc843e7aSLisandro Dalcin 
1239cc843e7aSLisandro Dalcin     Logically Collective on PetscViewer
1240cc843e7aSLisandro Dalcin 
1241cc843e7aSLisandro Dalcin   Input Parameters:
1242cc843e7aSLisandro Dalcin +  viewer - the PetscViewer; must be a a PETSCVIEWERBINARY, PETSCVIEWERMATLAB, PETSCVIEWERHDF5, or PETSCVIEWERASCII  PetscViewer
1243cc843e7aSLisandro Dalcin -  mode - open mode of file
1244cc843e7aSLisandro Dalcin $    FILE_MODE_WRITE - create new file for output
1245cc843e7aSLisandro Dalcin $    FILE_MODE_READ - open existing file for input
1246cc843e7aSLisandro Dalcin $    FILE_MODE_APPEND - open existing file for output
1247cc843e7aSLisandro Dalcin 
1248cc843e7aSLisandro Dalcin   Level: advanced
1249cc843e7aSLisandro Dalcin 
1250db781477SPatrick Sanan .seealso: `PetscViewerFileSetMode()`, `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerBinaryOpen()`
1251cc843e7aSLisandro Dalcin 
1252cc843e7aSLisandro Dalcin @*/
1253cc843e7aSLisandro Dalcin PetscErrorCode PetscViewerFileSetMode(PetscViewer viewer,PetscFileMode mode)
1254cc843e7aSLisandro Dalcin {
1255cc843e7aSLisandro Dalcin   PetscFunctionBegin;
1256cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
1257cc843e7aSLisandro Dalcin   PetscValidLogicalCollectiveEnum(viewer,mode,2);
125808401ef6SPierre Jolivet   PetscCheck(mode != FILE_MODE_UNDEFINED,PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Cannot set FILE_MODE_UNDEFINED");
1259cc73adaaSBarry Smith   else PetscCheck(mode >= FILE_MODE_UNDEFINED && mode <= FILE_MODE_APPEND_UPDATE,PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_OUTOFRANGE,"Invalid file mode %d",(int)mode);
1260cac4c232SBarry Smith   PetscTryMethod(viewer,"PetscViewerFileSetMode_C",(PetscViewer,PetscFileMode),(viewer,mode));
1261cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
1262cc843e7aSLisandro Dalcin }
1263cc843e7aSLisandro Dalcin 
1264cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerFileSetMode_Binary(PetscViewer viewer,PetscFileMode mode)
1265cc843e7aSLisandro Dalcin {
1266cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1267cc843e7aSLisandro Dalcin 
1268cc843e7aSLisandro Dalcin   PetscFunctionBegin;
1269cc73adaaSBarry Smith   PetscCheck(!viewer->setupcalled || vbinary->filemode == mode,PetscObjectComm((PetscObject)viewer),PETSC_ERR_ORDER,"Cannot change mode to %s after setup",PetscFileModes[mode]);
1270cc843e7aSLisandro Dalcin   vbinary->filemode = mode;
1271cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
1272cc843e7aSLisandro Dalcin }
1273cc843e7aSLisandro Dalcin 
1274cc843e7aSLisandro Dalcin /*@C
1275cc843e7aSLisandro Dalcin      PetscViewerFileGetMode - Gets the open mode of file
1276cc843e7aSLisandro Dalcin 
1277cc843e7aSLisandro Dalcin     Not Collective
1278cc843e7aSLisandro Dalcin 
1279cc843e7aSLisandro Dalcin   Input Parameter:
1280cc843e7aSLisandro Dalcin .  viewer - the PetscViewer; must be a PETSCVIEWERBINARY, PETSCVIEWERMATLAB, PETSCVIEWERHDF5, or PETSCVIEWERASCII  PetscViewer
1281cc843e7aSLisandro Dalcin 
1282cc843e7aSLisandro Dalcin   Output Parameter:
1283cc843e7aSLisandro Dalcin .  mode - open mode of file
1284cc843e7aSLisandro Dalcin $    FILE_MODE_WRITE - create new file for binary output
1285cc843e7aSLisandro Dalcin $    FILE_MODE_READ - open existing file for binary input
1286cc843e7aSLisandro Dalcin $    FILE_MODE_APPEND - open existing file for binary output
1287cc843e7aSLisandro Dalcin 
1288cc843e7aSLisandro Dalcin   Level: advanced
1289cc843e7aSLisandro Dalcin 
1290db781477SPatrick Sanan .seealso: `PetscViewerFileSetMode()`, `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerBinaryOpen()`
1291cc843e7aSLisandro Dalcin 
1292cc843e7aSLisandro Dalcin @*/
1293cc843e7aSLisandro Dalcin PetscErrorCode PetscViewerFileGetMode(PetscViewer viewer,PetscFileMode *mode)
1294cc843e7aSLisandro Dalcin {
1295cc843e7aSLisandro Dalcin   PetscFunctionBegin;
1296cc843e7aSLisandro Dalcin   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
1297cc843e7aSLisandro Dalcin   PetscValidPointer(mode,2);
1298cac4c232SBarry Smith   PetscUseMethod(viewer,"PetscViewerFileGetMode_C",(PetscViewer,PetscFileMode*),(viewer,mode));
1299cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
1300cc843e7aSLisandro Dalcin }
1301cc843e7aSLisandro Dalcin 
1302cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerFileGetMode_Binary(PetscViewer viewer,PetscFileMode *mode)
1303cc843e7aSLisandro Dalcin {
1304cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1305cc843e7aSLisandro Dalcin 
1306cc843e7aSLisandro Dalcin   PetscFunctionBegin;
1307cc843e7aSLisandro Dalcin   *mode = vbinary->filemode;
1308cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
1309cc843e7aSLisandro Dalcin }
1310cc843e7aSLisandro Dalcin 
1311cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerFileSetName_Binary(PetscViewer viewer,const char name[])
1312cc843e7aSLisandro Dalcin {
1313cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1314cc843e7aSLisandro Dalcin 
1315cc843e7aSLisandro Dalcin   PetscFunctionBegin;
1316cc843e7aSLisandro Dalcin   if (viewer->setupcalled && vbinary->filename) {
1317cc843e7aSLisandro Dalcin     /* gzip can be run after the file with the previous filename has been closed */
13189566063dSJacob Faibussowitsch     PetscCall(PetscFree(vbinary->ogzfilename));
13199566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(vbinary->filename,&vbinary->ogzfilename));
1320cc843e7aSLisandro Dalcin   }
13219566063dSJacob Faibussowitsch   PetscCall(PetscFree(vbinary->filename));
13229566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(name,&vbinary->filename));
1323cc843e7aSLisandro Dalcin   viewer->setupcalled = PETSC_FALSE;
1324cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
1325cc843e7aSLisandro Dalcin }
1326cc843e7aSLisandro Dalcin 
132781f0254dSBarry Smith static PetscErrorCode PetscViewerFileGetName_Binary(PetscViewer viewer,const char **name)
13285c6c1daeSBarry Smith {
13295c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
13305c6c1daeSBarry Smith 
13315c6c1daeSBarry Smith   PetscFunctionBegin;
13325c6c1daeSBarry Smith   *name = vbinary->filename;
13335c6c1daeSBarry Smith   PetscFunctionReturn(0);
13345c6c1daeSBarry Smith }
13355c6c1daeSBarry Smith 
13365c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
1337e0385b85SDave May static PetscErrorCode PetscViewerFileSetUp_BinaryMPIIO(PetscViewer viewer)
13385c6c1daeSBarry Smith {
13395c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1340e8a65b7dSLisandro Dalcin   int                amode;
13415c6c1daeSBarry Smith 
13425c6c1daeSBarry Smith   PetscFunctionBegin;
1343a297a907SKarl Rupp   vbinary->storecompressed = PETSC_FALSE;
13445c6c1daeSBarry Smith 
1345cc843e7aSLisandro Dalcin   vbinary->moff = 0;
1346cc843e7aSLisandro Dalcin   switch (vbinary->filemode) {
1347e8a65b7dSLisandro Dalcin   case FILE_MODE_READ:   amode = MPI_MODE_RDONLY; break;
1348e8a65b7dSLisandro Dalcin   case FILE_MODE_WRITE:  amode = MPI_MODE_WRONLY | MPI_MODE_CREATE; break;
134922a8f86cSLisandro Dalcin   case FILE_MODE_APPEND: amode = MPI_MODE_WRONLY | MPI_MODE_CREATE | MPI_MODE_APPEND; break;
13507e4fd573SVaclav Hapla   case FILE_MODE_UNDEFINED: SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ORDER, "Must call PetscViewerFileSetMode() before PetscViewerSetUp()");
135198921bdaSJacob Faibussowitsch   default: SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Unsupported file mode %s",PetscFileModes[vbinary->filemode]);
13525c6c1daeSBarry Smith   }
13539566063dSJacob Faibussowitsch   PetscCallMPI(MPI_File_open(PetscObjectComm((PetscObject)viewer),vbinary->filename,amode,MPI_INFO_NULL,&vbinary->mfdes));
135422a8f86cSLisandro Dalcin   /*
135522a8f86cSLisandro Dalcin       The MPI standard does not have MPI_MODE_TRUNCATE. We emulate this behavior by setting the file size to zero.
135622a8f86cSLisandro Dalcin   */
13579566063dSJacob Faibussowitsch   if (vbinary->filemode == FILE_MODE_WRITE) PetscCallMPI(MPI_File_set_size(vbinary->mfdes,0));
135822a8f86cSLisandro Dalcin   /*
135922a8f86cSLisandro Dalcin       Initially, all processes view the file as a linear byte stream. Therefore, for files opened with MPI_MODE_APPEND,
136022a8f86cSLisandro Dalcin       MPI_File_get_position[_shared](fh, &offset) returns the absolute byte position at the end of file.
136122a8f86cSLisandro Dalcin       Otherwise, we would need to call MPI_File_get_byte_offset(fh, offset, &byte_offset) to convert
136222a8f86cSLisandro Dalcin       the offset in etype units to an absolute byte position.
136322a8f86cSLisandro Dalcin    */
13649566063dSJacob Faibussowitsch   if (vbinary->filemode == FILE_MODE_APPEND) PetscCallMPI(MPI_File_get_position(vbinary->mfdes,&vbinary->moff));
1365cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
1366cc843e7aSLisandro Dalcin }
1367cc843e7aSLisandro Dalcin #endif
13685c6c1daeSBarry Smith 
1369cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerFileSetUp_BinarySTDIO(PetscViewer viewer)
1370cc843e7aSLisandro Dalcin {
1371cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1372cc843e7aSLisandro Dalcin   const char         *fname;
1373cc843e7aSLisandro Dalcin   char               bname[PETSC_MAX_PATH_LEN],*gz;
1374cc843e7aSLisandro Dalcin   PetscBool          found;
1375cc843e7aSLisandro Dalcin   PetscMPIInt        rank;
13765c6c1daeSBarry Smith 
1377cc843e7aSLisandro Dalcin   PetscFunctionBegin;
13789566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank));
13795c6c1daeSBarry Smith 
1380cc843e7aSLisandro Dalcin   /* if file name ends in .gz strip that off and note user wants file compressed */
1381cc843e7aSLisandro Dalcin   vbinary->storecompressed = PETSC_FALSE;
1382cc843e7aSLisandro Dalcin   if (vbinary->filemode == FILE_MODE_WRITE) {
13839566063dSJacob Faibussowitsch     PetscCall(PetscStrstr(vbinary->filename,".gz",&gz));
1384cc843e7aSLisandro Dalcin     if (gz && gz[3] == 0) {*gz = 0; vbinary->storecompressed = PETSC_TRUE;}
1385cc843e7aSLisandro Dalcin   }
1386cc843e7aSLisandro Dalcin #if !defined(PETSC_HAVE_POPEN)
138728b400f6SJacob Faibussowitsch   PetscCheck(!vbinary->storecompressed,PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP_SYS,"Cannot run gzip on this machine");
1388cc843e7aSLisandro Dalcin #endif
1389cc843e7aSLisandro Dalcin 
1390cc843e7aSLisandro Dalcin   fname = vbinary->filename;
1391cc843e7aSLisandro Dalcin   if (vbinary->filemode == FILE_MODE_READ) { /* possibly get the file from remote site or compressed file */
13929566063dSJacob Faibussowitsch     PetscCall(PetscFileRetrieve(PetscObjectComm((PetscObject)viewer),fname,bname,PETSC_MAX_PATH_LEN,&found));
139328b400f6SJacob Faibussowitsch     PetscCheck(found,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_OPEN,"Cannot locate file: %s",fname);
1394cc843e7aSLisandro Dalcin     fname = bname;
13955c6c1daeSBarry Smith   }
13965c6c1daeSBarry Smith 
1397cc843e7aSLisandro Dalcin   vbinary->fdes = -1;
1398dd400576SPatrick Sanan   if (rank == 0) { /* only first processor opens file*/
1399cc843e7aSLisandro Dalcin     PetscFileMode mode = vbinary->filemode;
1400cc843e7aSLisandro Dalcin     if (mode == FILE_MODE_APPEND) {
1401cc843e7aSLisandro Dalcin       /* check if asked to append to a non-existing file */
14029566063dSJacob Faibussowitsch       PetscCall(PetscTestFile(fname,'\0',&found));
1403cc843e7aSLisandro Dalcin       if (!found) mode = FILE_MODE_WRITE;
1404cc843e7aSLisandro Dalcin     }
14059566063dSJacob Faibussowitsch     PetscCall(PetscBinaryOpen(fname,mode,&vbinary->fdes));
1406cc843e7aSLisandro Dalcin   }
1407cc843e7aSLisandro Dalcin   PetscFunctionReturn(0);
1408cc843e7aSLisandro Dalcin }
1409cc843e7aSLisandro Dalcin 
1410cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerFileSetUp_BinaryInfo(PetscViewer viewer)
1411cc843e7aSLisandro Dalcin {
1412cc843e7aSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1413cc843e7aSLisandro Dalcin   PetscMPIInt        rank;
1414cc843e7aSLisandro Dalcin   PetscBool          found;
1415cc843e7aSLisandro Dalcin 
1416cc843e7aSLisandro Dalcin   PetscFunctionBegin;
1417cc843e7aSLisandro Dalcin   vbinary->fdes_info = NULL;
14189566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank));
1419dd400576SPatrick Sanan   if (!vbinary->skipinfo && (vbinary->filemode == FILE_MODE_READ || rank == 0)) {
1420cc843e7aSLisandro Dalcin     char infoname[PETSC_MAX_PATH_LEN],iname[PETSC_MAX_PATH_LEN],*gz;
1421cc843e7aSLisandro Dalcin 
14229566063dSJacob Faibussowitsch     PetscCall(PetscStrncpy(infoname,vbinary->filename,sizeof(infoname)));
1423cc843e7aSLisandro Dalcin     /* remove .gz if it ends file name */
14249566063dSJacob Faibussowitsch     PetscCall(PetscStrstr(infoname,".gz",&gz));
1425cc843e7aSLisandro Dalcin     if (gz && gz[3] == 0) *gz = 0;
1426cc843e7aSLisandro Dalcin 
14279566063dSJacob Faibussowitsch     PetscCall(PetscStrlcat(infoname,".info",sizeof(infoname)));
1428cc843e7aSLisandro Dalcin     if (vbinary->filemode == FILE_MODE_READ) {
14299566063dSJacob Faibussowitsch       PetscCall(PetscFixFilename(infoname,iname));
14309566063dSJacob Faibussowitsch       PetscCall(PetscFileRetrieve(PetscObjectComm((PetscObject)viewer),iname,infoname,PETSC_MAX_PATH_LEN,&found));
14319566063dSJacob Faibussowitsch       if (found) PetscCall(PetscOptionsInsertFile(PetscObjectComm((PetscObject)viewer),((PetscObject)viewer)->options,infoname,PETSC_FALSE));
1432dd400576SPatrick Sanan     } else if (rank == 0) { /* write or append */
1433cc843e7aSLisandro Dalcin       const char *omode = (vbinary->filemode == FILE_MODE_APPEND) ? "a" : "w";
1434cc843e7aSLisandro Dalcin       vbinary->fdes_info = fopen(infoname,omode);
143528b400f6SJacob Faibussowitsch       PetscCheck(vbinary->fdes_info,PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open .info file %s for writing",infoname);
14365c6c1daeSBarry Smith     }
14375c6c1daeSBarry Smith   }
14385c6c1daeSBarry Smith   PetscFunctionReturn(0);
14395c6c1daeSBarry Smith }
14405c6c1daeSBarry Smith 
1441cc843e7aSLisandro Dalcin static PetscErrorCode PetscViewerSetUp_Binary(PetscViewer viewer)
14425c6c1daeSBarry Smith {
14435c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1444cc843e7aSLisandro Dalcin   PetscBool          usempiio;
1445cc843e7aSLisandro Dalcin 
14465c6c1daeSBarry Smith   PetscFunctionBegin;
14479566063dSJacob Faibussowitsch   if (!vbinary->setfromoptionscalled) PetscCall(PetscViewerSetFromOptions(viewer));
144828b400f6SJacob Faibussowitsch   PetscCheck(vbinary->filename,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerFileSetName()");
144908401ef6SPierre Jolivet   PetscCheck(vbinary->filemode != (PetscFileMode)-1,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerFileSetMode()");
14509566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileClose_Binary(viewer));
1451cc843e7aSLisandro Dalcin 
14529566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryGetUseMPIIO(viewer,&usempiio));
1453cc843e7aSLisandro Dalcin   if (usempiio) {
1454cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
14559566063dSJacob Faibussowitsch     PetscCall(PetscViewerFileSetUp_BinaryMPIIO(viewer));
1456cc843e7aSLisandro Dalcin #endif
1457cc843e7aSLisandro Dalcin   } else {
14589566063dSJacob Faibussowitsch     PetscCall(PetscViewerFileSetUp_BinarySTDIO(viewer));
1459cc843e7aSLisandro Dalcin   }
14609566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetUp_BinaryInfo(viewer));
1461cc843e7aSLisandro Dalcin 
14629566063dSJacob Faibussowitsch   PetscCall(PetscLogObjectState((PetscObject)viewer,"File: %s",vbinary->filename));
14635c6c1daeSBarry Smith   PetscFunctionReturn(0);
14645c6c1daeSBarry Smith }
14655c6c1daeSBarry Smith 
146681f0254dSBarry Smith static PetscErrorCode PetscViewerView_Binary(PetscViewer v,PetscViewer viewer)
14672bf49c77SBarry Smith {
1468cb6ad94fSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)v->data;
1469cb6ad94fSLisandro Dalcin   const char         *fname = vbinary->filename ? vbinary->filename : "not yet set";
1470cc843e7aSLisandro Dalcin   const char         *fmode = vbinary->filemode != (PetscFileMode) -1 ? PetscFileModes[vbinary->filemode] : "not yet set";
1471cb6ad94fSLisandro Dalcin   PetscBool          usempiio;
14722bf49c77SBarry Smith 
14732bf49c77SBarry Smith   PetscFunctionBegin;
14749566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryGetUseMPIIO(v,&usempiio));
14759566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer,"Filename: %s\n",fname));
14769566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer,"Mode: %s (%s)\n",fmode,usempiio ? "mpiio" : "stdio"));
14772bf49c77SBarry Smith   PetscFunctionReturn(0);
14782bf49c77SBarry Smith }
14792bf49c77SBarry Smith 
148022a8f86cSLisandro Dalcin static PetscErrorCode PetscViewerSetFromOptions_Binary(PetscOptionItems *PetscOptionsObject,PetscViewer viewer)
148103a1d59fSDave May {
148222a8f86cSLisandro Dalcin   PetscViewer_Binary *binary = (PetscViewer_Binary*)viewer->data;
1483d22fd6bcSDave May   char               defaultname[PETSC_MAX_PATH_LEN];
148403a1d59fSDave May   PetscBool          flg;
1485e0385b85SDave May 
148603a1d59fSDave May   PetscFunctionBegin;
148722a8f86cSLisandro Dalcin   if (viewer->setupcalled) PetscFunctionReturn(0);
1488d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject,"Binary PetscViewer Options");
14899566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(defaultname,PETSC_MAX_PATH_LEN-1,"binaryoutput"));
14909566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-viewer_binary_filename","Specify filename","PetscViewerFileSetName",defaultname,defaultname,sizeof(defaultname),&flg));
14919566063dSJacob Faibussowitsch   if (flg) PetscCall(PetscViewerFileSetName_Binary(viewer,defaultname));
14929566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-viewer_binary_skip_info","Skip writing/reading .info file","PetscViewerBinarySetSkipInfo",binary->skipinfo,&binary->skipinfo,NULL));
14939566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-viewer_binary_skip_options","Skip parsing Vec/Mat load options","PetscViewerBinarySetSkipOptions",binary->skipoptions,&binary->skipoptions,NULL));
14949566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-viewer_binary_skip_header","Skip writing/reading header information","PetscViewerBinarySetSkipHeader",binary->skipheader,&binary->skipheader,NULL));
149503a1d59fSDave May #if defined(PETSC_HAVE_MPIIO)
14969566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-viewer_binary_mpiio","Use MPI-IO functionality to write/read binary file","PetscViewerBinarySetUseMPIIO",binary->usempiio,&binary->usempiio,NULL));
14975972f5f3SLisandro Dalcin #else
14989566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-viewer_binary_mpiio","Use MPI-IO functionality to write/read binary file (NOT AVAILABLE)","PetscViewerBinarySetUseMPIIO",PETSC_FALSE,NULL,NULL));
149903a1d59fSDave May #endif
1500d0609cedSBarry Smith   PetscOptionsHeadEnd();
1501bc196f7cSDave May   binary->setfromoptionscalled = PETSC_TRUE;
150203a1d59fSDave May   PetscFunctionReturn(0);
150303a1d59fSDave May }
150403a1d59fSDave May 
15058556b5ebSBarry Smith /*MC
15068556b5ebSBarry Smith    PETSCVIEWERBINARY - A viewer that saves to binary files
15078556b5ebSBarry Smith 
1508c2e3fba1SPatrick Sanan .seealso: `PetscViewerBinaryOpen()`, `PETSC_VIEWER_STDOUT_()`, `PETSC_VIEWER_STDOUT_SELF`, `PETSC_VIEWER_STDOUT_WORLD`, `PetscViewerCreate()`, `PetscViewerASCIIOpen()`,
1509db781477SPatrick Sanan           `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`, `PETSCVIEWERDRAW`,
1510db781477SPatrick Sanan           `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()`,
1511db781477SPatrick Sanan           `PetscViewerBinaryGetUseMPIIO()`, `PetscViewerBinarySetUseMPIIO()`
15128556b5ebSBarry Smith 
15131b266c99SBarry Smith   Level: beginner
15141b266c99SBarry Smith 
15158556b5ebSBarry Smith M*/
15168556b5ebSBarry Smith 
15178cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_Binary(PetscViewer v)
15185c6c1daeSBarry Smith {
15195c6c1daeSBarry Smith   PetscViewer_Binary *vbinary;
15205c6c1daeSBarry Smith 
15215c6c1daeSBarry Smith   PetscFunctionBegin;
15229566063dSJacob Faibussowitsch   PetscCall(PetscNewLog(v,&vbinary));
15235c6c1daeSBarry Smith   v->data = (void*)vbinary;
1524cc843e7aSLisandro Dalcin 
152503a1d59fSDave May   v->ops->setfromoptions   = PetscViewerSetFromOptions_Binary;
15265c6c1daeSBarry Smith   v->ops->destroy          = PetscViewerDestroy_Binary;
15272bf49c77SBarry Smith   v->ops->view             = PetscViewerView_Binary;
1528c98fd787SBarry Smith   v->ops->setup            = PetscViewerSetUp_Binary;
1529cc843e7aSLisandro Dalcin   v->ops->flush            = NULL; /* Should we support Flush() ? */
1530cc843e7aSLisandro Dalcin   v->ops->getsubviewer     = PetscViewerGetSubViewer_Binary;
1531cc843e7aSLisandro Dalcin   v->ops->restoresubviewer = PetscViewerRestoreSubViewer_Binary;
1532cc843e7aSLisandro Dalcin   v->ops->read             = PetscViewerBinaryRead;
1533cc843e7aSLisandro Dalcin 
1534cc843e7aSLisandro Dalcin   vbinary->fdes            = -1;
1535e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
1536cc843e7aSLisandro Dalcin   vbinary->usempiio        = PETSC_FALSE;
1537e8a65b7dSLisandro Dalcin   vbinary->mfdes           = MPI_FILE_NULL;
1538e8a65b7dSLisandro Dalcin   vbinary->mfsub           = MPI_FILE_NULL;
1539e8a65b7dSLisandro Dalcin #endif
1540cc843e7aSLisandro Dalcin   vbinary->filename        = NULL;
15417e4fd573SVaclav Hapla   vbinary->filemode        = FILE_MODE_UNDEFINED;
154202c9f0b5SLisandro Dalcin   vbinary->fdes_info       = NULL;
15435c6c1daeSBarry Smith   vbinary->skipinfo        = PETSC_FALSE;
15445c6c1daeSBarry Smith   vbinary->skipoptions     = PETSC_TRUE;
15455c6c1daeSBarry Smith   vbinary->skipheader      = PETSC_FALSE;
15465c6c1daeSBarry Smith   vbinary->storecompressed = PETSC_FALSE;
1547f90597f1SStefano Zampini   vbinary->ogzfilename     = NULL;
15485c6c1daeSBarry Smith   vbinary->flowcontrol     = 256; /* seems a good number for Cray XT-5 */
15495c6c1daeSBarry Smith 
1550cc843e7aSLisandro Dalcin   vbinary->setfromoptionscalled = PETSC_FALSE;
1551cc843e7aSLisandro Dalcin 
15529566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetFlowControl_C",PetscViewerBinaryGetFlowControl_Binary));
15539566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetFlowControl_C",PetscViewerBinarySetFlowControl_Binary));
15549566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetSkipHeader_C",PetscViewerBinaryGetSkipHeader_Binary));
15559566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetSkipHeader_C",PetscViewerBinarySetSkipHeader_Binary));
15569566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetSkipOptions_C",PetscViewerBinaryGetSkipOptions_Binary));
15579566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetSkipOptions_C",PetscViewerBinarySetSkipOptions_Binary));
15589566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetSkipInfo_C",PetscViewerBinaryGetSkipInfo_Binary));
15599566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetSkipInfo_C",PetscViewerBinarySetSkipInfo_Binary));
15609566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetInfoPointer_C",PetscViewerBinaryGetInfoPointer_Binary));
15619566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetName_C",PetscViewerFileGetName_Binary));
15629566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetName_C",PetscViewerFileSetName_Binary));
15639566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_Binary));
15649566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_Binary));
15655c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
15669566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetUseMPIIO_C",PetscViewerBinaryGetUseMPIIO_Binary));
15679566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetUseMPIIO_C",PetscViewerBinarySetUseMPIIO_Binary));
15685c6c1daeSBarry Smith #endif
15695c6c1daeSBarry Smith   PetscFunctionReturn(0);
15705c6c1daeSBarry Smith }
15715c6c1daeSBarry Smith 
15725c6c1daeSBarry Smith /* ---------------------------------------------------------------------*/
15735c6c1daeSBarry Smith /*
15745c6c1daeSBarry Smith     The variable Petsc_Viewer_Binary_keyval is used to indicate an MPI attribute that
15755c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscViewer.
15765c6c1daeSBarry Smith */
1577d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Binary_keyval = MPI_KEYVAL_INVALID;
15785c6c1daeSBarry Smith 
15795c6c1daeSBarry Smith /*@C
15805c6c1daeSBarry Smith      PETSC_VIEWER_BINARY_ - Creates a binary PetscViewer shared by all processors
15815c6c1daeSBarry Smith                      in a communicator.
15825c6c1daeSBarry Smith 
1583d083f849SBarry Smith      Collective
15845c6c1daeSBarry Smith 
15855c6c1daeSBarry Smith      Input Parameter:
15865c6c1daeSBarry Smith .    comm - the MPI communicator to share the binary PetscViewer
15875c6c1daeSBarry Smith 
15885c6c1daeSBarry Smith      Level: intermediate
15895c6c1daeSBarry Smith 
15905c6c1daeSBarry Smith    Options Database Keys:
159110699b91SBarry Smith +    -viewer_binary_filename <name> - filename in which to store the binary data, defaults to binaryoutput
159210699b91SBarry Smith .    -viewer_binary_skip_info - true means do not create .info file for this viewer
159310699b91SBarry Smith .    -viewer_binary_skip_options - true means do not use the options database for this viewer
159410699b91SBarry Smith .    -viewer_binary_skip_header - true means do not store the usual header information in the binary file
159510699b91SBarry Smith -    -viewer_binary_mpiio - true means use the file via MPI-IO, maybe faster for large files and many MPI ranks
15965c6c1daeSBarry Smith 
15975c6c1daeSBarry Smith    Environmental variables:
159810699b91SBarry Smith -   PETSC_VIEWER_BINARY_FILENAME - filename in which to store the binary data, defaults to binaryoutput
15995c6c1daeSBarry Smith 
16005c6c1daeSBarry Smith      Notes:
16015c6c1daeSBarry Smith      Unlike almost all other PETSc routines, PETSC_VIEWER_BINARY_ does not return
16025c6c1daeSBarry Smith      an error code.  The binary PetscViewer is usually used in the form
16035c6c1daeSBarry Smith $       XXXView(XXX object,PETSC_VIEWER_BINARY_(comm));
16045c6c1daeSBarry Smith 
1605db781477SPatrick Sanan .seealso: `PETSC_VIEWER_BINARY_WORLD`, `PETSC_VIEWER_BINARY_SELF`, `PetscViewerBinaryOpen()`, `PetscViewerCreate()`,
1606db781477SPatrick Sanan           `PetscViewerDestroy()`
16075c6c1daeSBarry Smith @*/
16085c6c1daeSBarry Smith PetscViewer PETSC_VIEWER_BINARY_(MPI_Comm comm)
16095c6c1daeSBarry Smith {
16105c6c1daeSBarry Smith   PetscErrorCode ierr;
16115c6c1daeSBarry Smith   PetscBool      flg;
16125c6c1daeSBarry Smith   PetscViewer    viewer;
16135c6c1daeSBarry Smith   char           fname[PETSC_MAX_PATH_LEN];
16145c6c1daeSBarry Smith   MPI_Comm       ncomm;
16155c6c1daeSBarry Smith 
16165c6c1daeSBarry Smith   PetscFunctionBegin;
161702c9f0b5SLisandro Dalcin   ierr = PetscCommDuplicate(comm,&ncomm,NULL);if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
16185c6c1daeSBarry Smith   if (Petsc_Viewer_Binary_keyval == MPI_KEYVAL_INVALID) {
161902c9f0b5SLisandro Dalcin     ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN,MPI_COMM_NULL_DELETE_FN,&Petsc_Viewer_Binary_keyval,NULL);
162002c9f0b5SLisandro Dalcin     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
16215c6c1daeSBarry Smith   }
162247435625SJed Brown   ierr = MPI_Comm_get_attr(ncomm,Petsc_Viewer_Binary_keyval,(void**)&viewer,(int*)&flg);
162302c9f0b5SLisandro Dalcin   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
16245c6c1daeSBarry Smith   if (!flg) { /* PetscViewer not yet created */
16255c6c1daeSBarry Smith     ierr = PetscOptionsGetenv(ncomm,"PETSC_VIEWER_BINARY_FILENAME",fname,PETSC_MAX_PATH_LEN,&flg);
16262cb5e1ccSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_REPEAT," ");PetscFunctionReturn(NULL);}
16275c6c1daeSBarry Smith     if (!flg) {
16285c6c1daeSBarry Smith       ierr = PetscStrcpy(fname,"binaryoutput");
16292cb5e1ccSBarry Smith       if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_REPEAT," ");PetscFunctionReturn(NULL);}
16305c6c1daeSBarry Smith     }
16315c6c1daeSBarry Smith     ierr = PetscViewerBinaryOpen(ncomm,fname,FILE_MODE_WRITE,&viewer);
16322cb5e1ccSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_REPEAT," ");PetscFunctionReturn(NULL);}
16335c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
16342cb5e1ccSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_REPEAT," ");PetscFunctionReturn(NULL);}
163547435625SJed Brown     ierr = MPI_Comm_set_attr(ncomm,Petsc_Viewer_Binary_keyval,(void*)viewer);
163602c9f0b5SLisandro Dalcin     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
16375c6c1daeSBarry Smith   }
16385c6c1daeSBarry Smith   ierr = PetscCommDestroy(&ncomm);
16392cb5e1ccSBarry Smith   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_REPEAT," ");PetscFunctionReturn(NULL);}
16405c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
16415c6c1daeSBarry Smith }
1642