xref: /petsc/src/sys/classes/viewer/impls/binary/binv.c (revision 02c9f0b548ed2228330a66acd2df0a92dd2a8bb1)
15c6c1daeSBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/viewerimpl.h>    /*I   "petscviewer.h"   I*/
35c6c1daeSBarry Smith #include <fcntl.h>
45c6c1daeSBarry Smith #if defined(PETSC_HAVE_UNISTD_H)
55c6c1daeSBarry Smith #include <unistd.h>
65c6c1daeSBarry Smith #endif
75c6c1daeSBarry Smith #if defined(PETSC_HAVE_IO_H)
85c6c1daeSBarry Smith #include <io.h>
95c6c1daeSBarry Smith #endif
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith typedef struct  {
125c6c1daeSBarry Smith   int           fdes;                 /* file descriptor, ignored if using MPI IO */
135c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
14bc196f7cSDave May   PetscBool     usempiio;
155c6c1daeSBarry Smith   MPI_File      mfdes;                /* ignored unless using MPI IO */
16e8a65b7dSLisandro Dalcin   MPI_File      mfsub;                /* subviewer support */
175c6c1daeSBarry Smith   MPI_Offset    moff;
185c6c1daeSBarry Smith #endif
195c6c1daeSBarry Smith   PetscFileMode btype;                /* read or write? */
205c6c1daeSBarry Smith   FILE          *fdes_info;           /* optional file containing info on binary file*/
215c6c1daeSBarry Smith   PetscBool     storecompressed;      /* gzip the write binary file when closing it*/
225c6c1daeSBarry Smith   char          *filename;
23f90597f1SStefano Zampini   char          *ogzfilename;         /* gzip can be run after the filename has been updated */
245c6c1daeSBarry Smith   PetscBool     skipinfo;             /* Don't create info file for writing; don't use for reading */
255c6c1daeSBarry Smith   PetscBool     skipoptions;          /* don't use PETSc options database when loading */
265c6c1daeSBarry Smith   PetscInt      flowcontrol;          /* allow only <flowcontrol> messages outstanding at a time while doing IO */
275c6c1daeSBarry Smith   PetscBool     skipheader;           /* don't write header, only raw data */
28a261c58fSBarry Smith   PetscBool     matlabheaderwritten;  /* if format is PETSC_VIEWER_BINARY_MATLAB has the MATLAB .info header been written yet */
29c98fd787SBarry Smith   PetscBool     setfromoptionscalled;
305c6c1daeSBarry Smith } PetscViewer_Binary;
315c6c1daeSBarry Smith 
3281f0254dSBarry Smith static PetscErrorCode PetscViewerGetSubViewer_Binary(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
335c6c1daeSBarry Smith {
345c6c1daeSBarry Smith   int                rank;
355c6c1daeSBarry Smith   PetscErrorCode     ierr;
36e8a65b7dSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
375c6c1daeSBarry Smith 
385c6c1daeSBarry Smith   PetscFunctionBegin;
39c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
40e8a65b7dSLisandro Dalcin 
41e8a65b7dSLisandro Dalcin   /* Return subviewer in process zero */
42ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
435c6c1daeSBarry Smith   if (!rank) {
44e5afcf28SBarry Smith     PetscMPIInt flg;
45e5afcf28SBarry Smith 
46e5afcf28SBarry Smith     ierr = MPI_Comm_compare(PETSC_COMM_SELF,comm,&flg);CHKERRQ(ierr);
47e5afcf28SBarry Smith     if (flg != MPI_IDENT && flg != MPI_CONGRUENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"PetscViewerGetSubViewer() for PETSCVIEWERBINARY requires a singleton MPI_Comm");
48e5afcf28SBarry Smith     ierr = PetscViewerCreate(comm,outviewer);CHKERRQ(ierr);
495c6c1daeSBarry Smith     ierr = PetscViewerSetType(*outviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
50e8a65b7dSLisandro Dalcin     ierr = PetscMemcpy((*outviewer)->data,vbinary,sizeof(PetscViewer_Binary));CHKERRQ(ierr);
5112f4c3a9SLisandro Dalcin     (*outviewer)->setupcalled = PETSC_TRUE;
5296509d17SLisandro Dalcin   } else {
5396509d17SLisandro Dalcin     *outviewer = NULL;
5496509d17SLisandro Dalcin   }
55e8a65b7dSLisandro Dalcin 
56e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
57e8a65b7dSLisandro Dalcin   if (vbinary->usempiio && *outviewer) {
58e8a65b7dSLisandro Dalcin     PetscViewer_Binary *obinary = (PetscViewer_Binary*)(*outviewer)->data;
59e8a65b7dSLisandro Dalcin     /* Parent viewer opens a new MPI file handle on PETSC_COMM_SELF and keeps track of it for future reuse */
60e8a65b7dSLisandro Dalcin     if (vbinary->mfsub == MPI_FILE_NULL) {
61e8a65b7dSLisandro Dalcin       int amode;
62e8a65b7dSLisandro Dalcin       switch (vbinary->btype) {
63e8a65b7dSLisandro Dalcin       case FILE_MODE_READ:  amode = MPI_MODE_RDONLY; break;
64e8a65b7dSLisandro Dalcin       case FILE_MODE_WRITE: amode = MPI_MODE_WRONLY; break;
65e8a65b7dSLisandro Dalcin       default: SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported file mode %s",PetscFileModes[vbinary->btype]);
66e8a65b7dSLisandro Dalcin       }
67e8a65b7dSLisandro Dalcin       ierr = MPI_File_open(PETSC_COMM_SELF,vbinary->filename,amode,MPI_INFO_NULL,&vbinary->mfsub);CHKERRQ(ierr);
68e8a65b7dSLisandro Dalcin     }
69e8a65b7dSLisandro Dalcin     /* Subviewer gets the MPI file handle on PETSC_COMM_SELF */
70e8a65b7dSLisandro Dalcin     obinary->mfdes = vbinary->mfsub;
71e8a65b7dSLisandro Dalcin     obinary->mfsub = MPI_FILE_NULL;
72e8a65b7dSLisandro Dalcin     obinary->moff  = vbinary->moff;
73e8a65b7dSLisandro Dalcin   }
74e8a65b7dSLisandro Dalcin #endif
755c6c1daeSBarry Smith   PetscFunctionReturn(0);
765c6c1daeSBarry Smith }
775c6c1daeSBarry Smith 
7881f0254dSBarry Smith static PetscErrorCode PetscViewerRestoreSubViewer_Binary(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
795c6c1daeSBarry Smith {
80e5afcf28SBarry Smith   PetscMPIInt        rank;
81e8a65b7dSLisandro Dalcin   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
82e8a65b7dSLisandro Dalcin   PetscErrorCode     ierr;
83e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
84e8a65b7dSLisandro Dalcin   MPI_Offset         moff = 0;
85e8a65b7dSLisandro Dalcin #endif
865c6c1daeSBarry Smith 
875c6c1daeSBarry Smith   PetscFunctionBegin;
88ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
89e8a65b7dSLisandro Dalcin   if (rank && *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Subviewer not obtained from viewer");
90e8a65b7dSLisandro Dalcin 
91e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
92e8a65b7dSLisandro Dalcin   if (vbinary->usempiio && *outviewer) {
93e8a65b7dSLisandro Dalcin     PetscViewer_Binary *obinary = (PetscViewer_Binary*)(*outviewer)->data;
94e8a65b7dSLisandro Dalcin     if (obinary->mfdes != vbinary->mfsub) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Subviewer not obtained from viewer");
95e8a65b7dSLisandro Dalcin     moff = obinary->moff;
96e8a65b7dSLisandro Dalcin   }
97e8a65b7dSLisandro Dalcin #endif
98e8a65b7dSLisandro Dalcin 
99e8a65b7dSLisandro Dalcin   if (*outviewer) {
100e8a65b7dSLisandro Dalcin     PetscViewer_Binary *obinary = (PetscViewer_Binary*)(*outviewer)->data;
101e8a65b7dSLisandro Dalcin     if (obinary->fdes != vbinary->fdes) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Subviewer not obtained from viewer");
1025c6c1daeSBarry Smith     ierr = PetscFree((*outviewer)->data);CHKERRQ(ierr);
1035c6c1daeSBarry Smith     ierr = PetscHeaderDestroy(outviewer);CHKERRQ(ierr);
1045c6c1daeSBarry Smith   }
105e8a65b7dSLisandro Dalcin 
106e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
107e8a65b7dSLisandro Dalcin   if (vbinary->usempiio) {
108e8a65b7dSLisandro Dalcin     PetscInt64 ioff = (PetscInt64)moff; /* We could use MPI_OFFSET datatype (requires MPI 2.2) */
109e8a65b7dSLisandro Dalcin     ierr = MPI_Bcast(&ioff,1,MPIU_INT64,0,PetscObjectComm((PetscObject)viewer));CHKERRQ(ierr);
110e8a65b7dSLisandro Dalcin     vbinary->moff = (MPI_Offset)ioff;
111e8a65b7dSLisandro Dalcin   }
112e8a65b7dSLisandro Dalcin #endif
1135c6c1daeSBarry Smith   PetscFunctionReturn(0);
1145c6c1daeSBarry Smith }
1155c6c1daeSBarry Smith 
1165c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
1175c6c1daeSBarry Smith /*@C
1185c6c1daeSBarry Smith     PetscViewerBinaryGetMPIIOOffset - Gets the current offset that should be passed to MPI_File_set_view()
1195c6c1daeSBarry Smith 
1205c6c1daeSBarry Smith     Not Collective
1215c6c1daeSBarry Smith 
1225c6c1daeSBarry Smith     Input Parameter:
1235c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
1245c6c1daeSBarry Smith 
1255c6c1daeSBarry Smith     Output Parameter:
1265c6c1daeSBarry Smith .    off - the current offset
1275c6c1daeSBarry Smith 
1285c6c1daeSBarry Smith     Level: advanced
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith     Fortran Note:
1315c6c1daeSBarry Smith     This routine is not supported in Fortran.
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith     Use PetscViewerBinaryAddMPIIOOffset() to increase this value after you have written a view.
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith 
13667918a83SBarry Smith .seealso: PetscViewerBinaryOpen(), PetscViewerBinaryGetInfoPointer(), PetscViewerBinaryGetUseMPIIO(), PetscViewerBinarySetUseMPIIO(), PetscViewerBinaryAddMPIIOOffset()
1375c6c1daeSBarry Smith @*/
1385c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetMPIIOOffset(PetscViewer viewer,MPI_Offset *off)
1395c6c1daeSBarry Smith {
1405c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith   PetscFunctionBegin;
1435c6c1daeSBarry Smith   *off = vbinary->moff;
1445c6c1daeSBarry Smith   PetscFunctionReturn(0);
1455c6c1daeSBarry Smith }
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith /*@C
1485c6c1daeSBarry Smith     PetscViewerBinaryAddMPIIOOffset - Adds to the current offset that should be passed to MPI_File_set_view()
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith     Not Collective
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith     Input Parameters:
1535c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
1545c6c1daeSBarry Smith -    off - the addition to the offset
1555c6c1daeSBarry Smith 
1565c6c1daeSBarry Smith     Level: advanced
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith     Fortran Note:
1595c6c1daeSBarry Smith     This routine is not supported in Fortran.
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith     Use PetscViewerBinaryGetMPIIOOffset() to get the value that you should pass to MPI_File_set_view()
1625c6c1daeSBarry Smith 
1635c6c1daeSBarry Smith 
16467918a83SBarry Smith .seealso: PetscViewerBinaryOpen(),PetscViewerBinaryGetInfoPointer(), PetscViewerBinaryGetUseMPIIO(), PetscViewerBinarySetUseMPIIO(), PetscViewerBinaryGetMPIIOOffset()
1655c6c1daeSBarry Smith @*/
1665c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryAddMPIIOOffset(PetscViewer viewer,MPI_Offset off)
1675c6c1daeSBarry Smith {
1685c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1695c6c1daeSBarry Smith 
1705c6c1daeSBarry Smith   PetscFunctionBegin;
1715c6c1daeSBarry Smith   vbinary->moff += off;
1725c6c1daeSBarry Smith   PetscFunctionReturn(0);
1735c6c1daeSBarry Smith }
1745c6c1daeSBarry Smith 
1755c6c1daeSBarry Smith /*@C
1765c6c1daeSBarry Smith     PetscViewerBinaryGetMPIIODescriptor - Extracts the MPI IO file descriptor from a PetscViewer.
1775c6c1daeSBarry Smith 
1785c6c1daeSBarry Smith     Not Collective
1795c6c1daeSBarry Smith 
1805c6c1daeSBarry Smith     Input Parameter:
1815c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith     Output Parameter:
1845c6c1daeSBarry Smith .   fdes - file descriptor
1855c6c1daeSBarry Smith 
1865c6c1daeSBarry Smith     Level: advanced
1875c6c1daeSBarry Smith 
1885c6c1daeSBarry Smith     Fortran Note:
1895c6c1daeSBarry Smith     This routine is not supported in Fortran.
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith 
19267918a83SBarry Smith .seealso: PetscViewerBinaryOpen(),PetscViewerBinaryGetInfoPointer(), PetscViewerBinaryGetUseMPIIO(), PetscViewerBinarySetUseMPIIO(), PetscViewerBinaryGetMPIIOOffset()
1935c6c1daeSBarry Smith @*/
1945c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetMPIIODescriptor(PetscViewer viewer,MPI_File *fdes)
1955c6c1daeSBarry Smith {
19603a1d59fSDave May   PetscErrorCode     ierr;
1975c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1985c6c1daeSBarry Smith 
1995c6c1daeSBarry Smith   PetscFunctionBegin;
200c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
2015c6c1daeSBarry Smith   *fdes = vbinary->mfdes;
2025c6c1daeSBarry Smith   PetscFunctionReturn(0);
2035c6c1daeSBarry Smith }
2045c6c1daeSBarry Smith 
20581f0254dSBarry Smith static PetscErrorCode PetscViewerBinaryGetUseMPIIO_Binary(PetscViewer viewer,PetscBool  *flg)
206a8aae444SDave May {
207a8aae444SDave May   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
208a8aae444SDave May 
209a8aae444SDave May   PetscFunctionBegin;
210bc196f7cSDave May   *flg = vbinary->usempiio;
211a8aae444SDave May   PetscFunctionReturn(0);
212a8aae444SDave May }
213a8aae444SDave May #endif
214a8aae444SDave May 
215a8aae444SDave May 
2165c6c1daeSBarry Smith /*@C
217bc196f7cSDave May     PetscViewerBinaryGetUseMPIIO - Returns PETSC_TRUE if the binary viewer uses MPI-IO.
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith     Not Collective
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith     Input Parameter:
2225c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
2235c6c1daeSBarry Smith 
2245c6c1daeSBarry Smith     Output Parameter:
225bc196f7cSDave May -   flg - PETSC_TRUE if MPI-IO is being used
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith     Options Database:
2285c6c1daeSBarry Smith     -viewer_binary_mpiio : Flag for using MPI-IO
2295c6c1daeSBarry Smith 
2305c6c1daeSBarry Smith     Level: advanced
2315c6c1daeSBarry Smith 
232bc196f7cSDave May     Note:
233bc196f7cSDave May     If MPI-IO is not available, this function will always return PETSC_FALSE
234bc196f7cSDave May 
2355c6c1daeSBarry Smith     Fortran Note:
2365c6c1daeSBarry Smith     This routine is not supported in Fortran.
2375c6c1daeSBarry Smith 
2385c6c1daeSBarry Smith 
23967918a83SBarry Smith .seealso: PetscViewerBinaryOpen(), PetscViewerBinaryGetInfoPointer(), PetscViewerBinarySetUseMPIIO(), PetscViewerBinaryGetMPIIOOffset()
2405c6c1daeSBarry Smith @*/
241bc196f7cSDave May PetscErrorCode PetscViewerBinaryGetUseMPIIO(PetscViewer viewer,PetscBool *flg)
2425c6c1daeSBarry Smith {
243a8aae444SDave May   PetscErrorCode ierr;
2445c6c1daeSBarry Smith 
2455c6c1daeSBarry Smith   PetscFunctionBegin;
246a8aae444SDave May   *flg = PETSC_FALSE;
247bc196f7cSDave May   ierr = PetscTryMethod(viewer,"PetscViewerBinaryGetUseMPIIO_C",(PetscViewer,PetscBool*),(viewer,flg));CHKERRQ(ierr);
2485c6c1daeSBarry Smith   PetscFunctionReturn(0);
2495c6c1daeSBarry Smith }
2505c6c1daeSBarry Smith 
25181f0254dSBarry Smith static PetscErrorCode  PetscViewerBinaryGetFlowControl_Binary(PetscViewer viewer,PetscInt *fc)
2525c6c1daeSBarry Smith {
2535c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
2545c6c1daeSBarry Smith 
2555c6c1daeSBarry Smith   PetscFunctionBegin;
2565c6c1daeSBarry Smith   *fc = vbinary->flowcontrol;
2575c6c1daeSBarry Smith   PetscFunctionReturn(0);
2585c6c1daeSBarry Smith }
2595c6c1daeSBarry Smith 
2605c6c1daeSBarry Smith /*@C
2615c6c1daeSBarry Smith     PetscViewerBinaryGetFlowControl - Returns how many messages are allowed to outstanding at the same time during parallel IO reads/writes
2625c6c1daeSBarry Smith 
2635c6c1daeSBarry Smith     Not Collective
2645c6c1daeSBarry Smith 
2655c6c1daeSBarry Smith     Input Parameter:
2665c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
2675c6c1daeSBarry Smith 
2685c6c1daeSBarry Smith     Output Parameter:
2695c6c1daeSBarry Smith .   fc - the number of messages
2705c6c1daeSBarry Smith 
2715c6c1daeSBarry Smith     Level: advanced
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith .seealso: PetscViewerBinaryOpen(),PetscViewerBinaryGetInfoPointer(), PetscViewerBinarySetFlowControl()
2745c6c1daeSBarry Smith 
2755c6c1daeSBarry Smith @*/
2765c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetFlowControl(PetscViewer viewer,PetscInt *fc)
2775c6c1daeSBarry Smith {
2785c6c1daeSBarry Smith   PetscErrorCode ierr;
2795c6c1daeSBarry Smith 
2805c6c1daeSBarry Smith   PetscFunctionBegin;
281163d334eSBarry Smith   ierr = PetscUseMethod(viewer,"PetscViewerBinaryGetFlowControl_C",(PetscViewer,PetscInt*),(viewer,fc));CHKERRQ(ierr);
2825c6c1daeSBarry Smith   PetscFunctionReturn(0);
2835c6c1daeSBarry Smith }
2845c6c1daeSBarry Smith 
28581f0254dSBarry Smith static PetscErrorCode PetscViewerBinarySetFlowControl_Binary(PetscViewer viewer,PetscInt fc)
2865c6c1daeSBarry Smith {
2875c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
2885c6c1daeSBarry Smith 
2895c6c1daeSBarry Smith   PetscFunctionBegin;
290ce94432eSBarry Smith   if (fc <= 1) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_OUTOFRANGE,"Flow control count must be greater than 1, %D was set",fc);
2915c6c1daeSBarry Smith   vbinary->flowcontrol = fc;
2925c6c1daeSBarry Smith   PetscFunctionReturn(0);
2935c6c1daeSBarry Smith }
2945c6c1daeSBarry Smith 
2955c6c1daeSBarry Smith /*@C
296639ff905SBarry Smith     PetscViewerBinarySetFlowControl - Sets how many messages are allowed to outstanding at the same time during parallel IO reads/writes
2975c6c1daeSBarry Smith 
2985c6c1daeSBarry Smith     Not Collective
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith     Input Parameter:
3015c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
302639ff905SBarry Smith -   fc - the number of messages, defaults to 256 if this function was not called
3035c6c1daeSBarry Smith 
3045c6c1daeSBarry Smith     Level: advanced
3055c6c1daeSBarry Smith 
3065c6c1daeSBarry Smith .seealso: PetscViewerBinaryOpen(),PetscViewerBinaryGetInfoPointer(), PetscViewerBinaryGetFlowControl()
3075c6c1daeSBarry Smith 
3085c6c1daeSBarry Smith @*/
3095c6c1daeSBarry Smith PetscErrorCode  PetscViewerBinarySetFlowControl(PetscViewer viewer,PetscInt fc)
3105c6c1daeSBarry Smith {
3115c6c1daeSBarry Smith   PetscErrorCode ierr;
3125c6c1daeSBarry Smith 
3135c6c1daeSBarry Smith   PetscFunctionBegin;
3145c6c1daeSBarry Smith   ierr = PetscUseMethod(viewer,"PetscViewerBinarySetFlowControl_C",(PetscViewer,PetscInt),(viewer,fc));CHKERRQ(ierr);
3155c6c1daeSBarry Smith   PetscFunctionReturn(0);
3165c6c1daeSBarry Smith }
3175c6c1daeSBarry Smith 
3185c6c1daeSBarry Smith /*@C
3195c6c1daeSBarry Smith     PetscViewerBinaryGetDescriptor - Extracts the file descriptor from a PetscViewer.
3205c6c1daeSBarry Smith 
3215872f025SBarry Smith     Collective On PetscViewer
3225c6c1daeSBarry Smith 
3235c6c1daeSBarry Smith     Input Parameter:
3245c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
3255c6c1daeSBarry Smith 
3265c6c1daeSBarry Smith     Output Parameter:
3275c6c1daeSBarry Smith .   fdes - file descriptor
3285c6c1daeSBarry Smith 
3295c6c1daeSBarry Smith     Level: advanced
3305c6c1daeSBarry Smith 
3315c6c1daeSBarry Smith     Notes:
3325c6c1daeSBarry Smith       For writable binary PetscViewers, the descriptor will only be valid for the
3335c6c1daeSBarry Smith     first processor in the communicator that shares the PetscViewer. For readable
3345c6c1daeSBarry Smith     files it will only be valid on nodes that have the file. If node 0 does not
3355c6c1daeSBarry Smith     have the file it generates an error even if another node does have the file.
3365c6c1daeSBarry Smith 
3375c6c1daeSBarry Smith     Fortran Note:
3385c6c1daeSBarry Smith     This routine is not supported in Fortran.
3395c6c1daeSBarry Smith 
34095452b02SPatrick Sanan     Developer Notes:
34195452b02SPatrick Sanan     This must be called on all processes because Dave May changed
3425872f025SBarry Smith     the source code that this may be trigger a PetscViewerSetUp() call if it was not previously triggered.
3435872f025SBarry Smith 
3445872f025SBarry Smith 
3455c6c1daeSBarry Smith 
3465c6c1daeSBarry Smith .seealso: PetscViewerBinaryOpen(),PetscViewerBinaryGetInfoPointer()
3475c6c1daeSBarry Smith @*/
3485c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetDescriptor(PetscViewer viewer,int *fdes)
3495c6c1daeSBarry Smith {
35003a1d59fSDave May   PetscErrorCode     ierr;
3515c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
3525c6c1daeSBarry Smith 
3535c6c1daeSBarry Smith   PetscFunctionBegin;
354c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
3555c6c1daeSBarry Smith   *fdes = vbinary->fdes;
3565c6c1daeSBarry Smith   PetscFunctionReturn(0);
3575c6c1daeSBarry Smith }
3585c6c1daeSBarry Smith 
3595c6c1daeSBarry Smith /*@
3605c6c1daeSBarry Smith     PetscViewerBinarySkipInfo - Binary file will not have .info file created with it
3615c6c1daeSBarry Smith 
3625c6c1daeSBarry Smith     Not Collective
3635c6c1daeSBarry Smith 
3645c6c1daeSBarry Smith     Input Paramter:
3655c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerCreate()
3665c6c1daeSBarry Smith 
3675c6c1daeSBarry Smith     Options Database Key:
3685c6c1daeSBarry Smith .   -viewer_binary_skip_info
3695c6c1daeSBarry Smith 
3705c6c1daeSBarry Smith     Level: advanced
3715c6c1daeSBarry Smith 
37295452b02SPatrick Sanan     Notes:
37395452b02SPatrick Sanan     This must be called after PetscViewerSetType(). If you use PetscViewerBinaryOpen() then
3745c6c1daeSBarry Smith     you can only skip the info file with the -viewer_binary_skip_info flag. To use the function you must open the
375a2d7db39SDave May     viewer with PetscViewerCreate(), PetscViewerSetType(), PetscViewerBinarySkipInfo().
3765c6c1daeSBarry Smith 
3775c6c1daeSBarry Smith     The .info contains meta information about the data in the binary file, for example the block size if it was
3785c6c1daeSBarry Smith     set for a vector or matrix.
3795c6c1daeSBarry Smith 
3805c6c1daeSBarry Smith .seealso: PetscViewerBinaryOpen(), PetscViewerBinaryGetDescriptor(), PetscViewerBinarySetSkipOptions(),
381807ea322SDave May           PetscViewerBinaryGetSkipOptions(), PetscViewerBinaryGetSkipInfo()
3825c6c1daeSBarry Smith @*/
3835c6c1daeSBarry Smith PetscErrorCode PetscViewerBinarySkipInfo(PetscViewer viewer)
3845c6c1daeSBarry Smith {
3855c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
3865c6c1daeSBarry Smith 
3875c6c1daeSBarry Smith   PetscFunctionBegin;
3885c6c1daeSBarry Smith   vbinary->skipinfo = PETSC_TRUE;
3895c6c1daeSBarry Smith   PetscFunctionReturn(0);
3905c6c1daeSBarry Smith }
3915c6c1daeSBarry Smith 
39281f0254dSBarry Smith static PetscErrorCode PetscViewerBinarySetSkipInfo_Binary(PetscViewer viewer,PetscBool skip)
393807ea322SDave May {
394807ea322SDave May   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
395807ea322SDave May 
396807ea322SDave May   PetscFunctionBegin;
397807ea322SDave May   vbinary->skipinfo = skip;
398807ea322SDave May   PetscFunctionReturn(0);
399807ea322SDave May }
400807ea322SDave May 
401807ea322SDave May /*@
402807ea322SDave May     PetscViewerBinarySetSkipInfo - Binary file will not have .info file created with it
403807ea322SDave May 
404807ea322SDave May     Not Collective
405807ea322SDave May 
406807ea322SDave May     Input Paramter:
407807ea322SDave May .   viewer - PetscViewer context, obtained from PetscViewerCreate()
408807ea322SDave May 
409807ea322SDave May     Options Database Key:
410807ea322SDave May .   -viewer_binary_skip_info
411807ea322SDave May 
412807ea322SDave May     Level: advanced
413807ea322SDave May 
414807ea322SDave May .seealso: PetscViewerBinaryOpen(), PetscViewerBinaryGetDescriptor(), PetscViewerBinarySetSkipOptions(),
415807ea322SDave May           PetscViewerBinaryGetSkipOptions(), PetscViewerBinaryGetSkipInfo()
416807ea322SDave May @*/
417807ea322SDave May PetscErrorCode PetscViewerBinarySetSkipInfo(PetscViewer viewer,PetscBool skip)
418807ea322SDave May {
419807ea322SDave May   PetscErrorCode ierr;
420807ea322SDave May 
421807ea322SDave May   PetscFunctionBegin;
422807ea322SDave May   ierr = PetscUseMethod(viewer,"PetscViewerBinarySetSkipInfo_C",(PetscViewer,PetscBool),(viewer,skip));CHKERRQ(ierr);
423807ea322SDave May   PetscFunctionReturn(0);
424807ea322SDave May }
425807ea322SDave May 
42681f0254dSBarry Smith static PetscErrorCode PetscViewerBinaryGetSkipInfo_Binary(PetscViewer viewer,PetscBool *skip)
427807ea322SDave May {
428807ea322SDave May   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
429807ea322SDave May 
430807ea322SDave May   PetscFunctionBegin;
431807ea322SDave May   *skip  = vbinary->skipinfo;
432807ea322SDave May   PetscFunctionReturn(0);
433807ea322SDave May }
434807ea322SDave May 
435807ea322SDave May /*@
436807ea322SDave May     PetscViewerBinaryGetSkipInfo - check if viewer wrote a .info file
437807ea322SDave May 
438807ea322SDave May     Not Collective
439807ea322SDave May 
440807ea322SDave May     Input Parameter:
441807ea322SDave May .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
442807ea322SDave May 
443807ea322SDave May     Output Parameter:
444807ea322SDave May .   skip - PETSC_TRUE implies the .info file was not generated
445807ea322SDave May 
446807ea322SDave May     Level: advanced
447807ea322SDave May 
44895452b02SPatrick Sanan     Notes:
44995452b02SPatrick Sanan     This must be called after PetscViewerSetType()
450807ea322SDave May 
451807ea322SDave May .seealso: PetscViewerBinaryOpen(), PetscViewerBinaryGetDescriptor(), PetscViewerBinarySkipInfo(),
452807ea322SDave May           PetscViewerBinarySetSkipOptions(), PetscViewerBinarySetSkipInfo()
453807ea322SDave May @*/
454807ea322SDave May PetscErrorCode PetscViewerBinaryGetSkipInfo(PetscViewer viewer,PetscBool *skip)
455807ea322SDave May {
456807ea322SDave May   PetscErrorCode ierr;
457807ea322SDave May 
458807ea322SDave May   PetscFunctionBegin;
459807ea322SDave May   ierr = PetscUseMethod(viewer,"PetscViewerBinaryGetSkipInfo_C",(PetscViewer,PetscBool*),(viewer,skip));CHKERRQ(ierr);
460807ea322SDave May   PetscFunctionReturn(0);
461807ea322SDave May }
462807ea322SDave May 
46381f0254dSBarry Smith static PetscErrorCode PetscViewerBinarySetSkipOptions_Binary(PetscViewer viewer,PetscBool skip)
464807ea322SDave May {
465807ea322SDave May   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
466807ea322SDave May 
467807ea322SDave May   PetscFunctionBegin;
468807ea322SDave May   vbinary->skipoptions = skip;
469807ea322SDave May   PetscFunctionReturn(0);
470807ea322SDave May }
471807ea322SDave May 
4725c6c1daeSBarry Smith /*@
4735c6c1daeSBarry Smith     PetscViewerBinarySetSkipOptions - do not use the PETSc options database when loading objects
4745c6c1daeSBarry Smith 
4755c6c1daeSBarry Smith     Not Collective
4765c6c1daeSBarry Smith 
4775c6c1daeSBarry Smith     Input Parameters:
4785c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
4795c6c1daeSBarry Smith -   skip - PETSC_TRUE means do not use
4805c6c1daeSBarry Smith 
4815c6c1daeSBarry Smith     Options Database Key:
4825c6c1daeSBarry Smith .   -viewer_binary_skip_options
4835c6c1daeSBarry Smith 
4845c6c1daeSBarry Smith     Level: advanced
4855c6c1daeSBarry Smith 
48695452b02SPatrick Sanan     Notes:
48795452b02SPatrick Sanan     This must be called after PetscViewerSetType()
4885c6c1daeSBarry Smith 
4895c6c1daeSBarry Smith .seealso: PetscViewerBinaryOpen(), PetscViewerBinaryGetDescriptor(), PetscViewerBinarySkipInfo(),
4905c6c1daeSBarry Smith           PetscViewerBinaryGetSkipOptions()
4915c6c1daeSBarry Smith @*/
4925c6c1daeSBarry Smith PetscErrorCode PetscViewerBinarySetSkipOptions(PetscViewer viewer,PetscBool skip)
4935c6c1daeSBarry Smith {
494807ea322SDave May   PetscErrorCode ierr;
4955c6c1daeSBarry Smith 
4965c6c1daeSBarry Smith   PetscFunctionBegin;
497807ea322SDave May   ierr = PetscUseMethod(viewer,"PetscViewerBinarySetSkipOptions_C",(PetscViewer,PetscBool),(viewer,skip));CHKERRQ(ierr);
498807ea322SDave May   PetscFunctionReturn(0);
499807ea322SDave May }
500807ea322SDave May 
50181f0254dSBarry Smith static PetscErrorCode PetscViewerBinaryGetSkipOptions_Binary(PetscViewer viewer,PetscBool *skip)
502807ea322SDave May {
503807ea322SDave May   PetscViewer_Binary *vbinary;
504807ea322SDave May 
505807ea322SDave May   PetscFunctionBegin;
506807ea322SDave May   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
507807ea322SDave May   vbinary = (PetscViewer_Binary*)viewer->data;
508807ea322SDave May   *skip   = vbinary->skipoptions;
5095c6c1daeSBarry Smith   PetscFunctionReturn(0);
5105c6c1daeSBarry Smith }
5115c6c1daeSBarry Smith 
5125c6c1daeSBarry Smith /*@
5135c6c1daeSBarry Smith     PetscViewerBinaryGetSkipOptions - checks if viewer uses the PETSc options database when loading objects
5145c6c1daeSBarry Smith 
5155c6c1daeSBarry Smith     Not Collective
5165c6c1daeSBarry Smith 
5175c6c1daeSBarry Smith     Input Parameter:
5185c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
5195c6c1daeSBarry Smith 
5205c6c1daeSBarry Smith     Output Parameter:
5215c6c1daeSBarry Smith .   skip - PETSC_TRUE means do not use
5225c6c1daeSBarry Smith 
5235c6c1daeSBarry Smith     Level: advanced
5245c6c1daeSBarry Smith 
52595452b02SPatrick Sanan     Notes:
52695452b02SPatrick Sanan     This must be called after PetscViewerSetType()
5275c6c1daeSBarry Smith 
5285c6c1daeSBarry Smith .seealso: PetscViewerBinaryOpen(), PetscViewerBinaryGetDescriptor(), PetscViewerBinarySkipInfo(),
5295c6c1daeSBarry Smith           PetscViewerBinarySetSkipOptions()
5305c6c1daeSBarry Smith @*/
5315c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetSkipOptions(PetscViewer viewer,PetscBool *skip)
5325c6c1daeSBarry Smith {
533807ea322SDave May   PetscErrorCode ierr;
5345c6c1daeSBarry Smith 
5355c6c1daeSBarry Smith   PetscFunctionBegin;
536807ea322SDave May   ierr = PetscUseMethod(viewer,"PetscViewerBinaryGetSkipOptions_C",(PetscViewer,PetscBool*),(viewer,skip));CHKERRQ(ierr);
5375c6c1daeSBarry Smith   PetscFunctionReturn(0);
5385c6c1daeSBarry Smith }
5395c6c1daeSBarry Smith 
54081f0254dSBarry Smith static PetscErrorCode PetscViewerBinarySetSkipHeader_Binary(PetscViewer viewer,PetscBool skip)
5415c6c1daeSBarry Smith {
5425c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
5435c6c1daeSBarry Smith 
5445c6c1daeSBarry Smith   PetscFunctionBegin;
5455c6c1daeSBarry Smith   vbinary->skipheader = skip;
5465c6c1daeSBarry Smith   PetscFunctionReturn(0);
5475c6c1daeSBarry Smith }
5485c6c1daeSBarry Smith 
5495c6c1daeSBarry Smith /*@
5505c6c1daeSBarry Smith     PetscViewerBinarySetSkipHeader - do not write a header with size information on output, just raw data
5515c6c1daeSBarry Smith 
5525c6c1daeSBarry Smith     Not Collective
5535c6c1daeSBarry Smith 
5545c6c1daeSBarry Smith     Input Parameters:
5555c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
5565c6c1daeSBarry Smith -   skip - PETSC_TRUE means do not write header
5575c6c1daeSBarry Smith 
5585c6c1daeSBarry Smith     Options Database Key:
5595c6c1daeSBarry Smith .   -viewer_binary_skip_header
5605c6c1daeSBarry Smith 
5615c6c1daeSBarry Smith     Level: advanced
5625c6c1daeSBarry Smith 
56395452b02SPatrick Sanan     Notes:
56495452b02SPatrick Sanan     This must be called after PetscViewerSetType()
5655c6c1daeSBarry Smith 
5665c6c1daeSBarry Smith            Can ONLY be called on a binary viewer
5675c6c1daeSBarry Smith 
5685c6c1daeSBarry Smith .seealso: PetscViewerBinaryOpen(), PetscViewerBinaryGetDescriptor(), PetscViewerBinarySkipInfo(),
5695c6c1daeSBarry Smith           PetscViewerBinaryGetSkipHeader()
5705c6c1daeSBarry Smith @*/
5715c6c1daeSBarry Smith PetscErrorCode PetscViewerBinarySetSkipHeader(PetscViewer viewer,PetscBool skip)
5725c6c1daeSBarry Smith {
5735c6c1daeSBarry Smith   PetscErrorCode ierr;
5745c6c1daeSBarry Smith 
5755c6c1daeSBarry Smith   PetscFunctionBegin;
5765c6c1daeSBarry Smith   ierr = PetscUseMethod(viewer,"PetscViewerBinarySetSkipHeader_C",(PetscViewer,PetscBool),(viewer,skip));CHKERRQ(ierr);
5775c6c1daeSBarry Smith   PetscFunctionReturn(0);
5785c6c1daeSBarry Smith }
5795c6c1daeSBarry Smith 
58081f0254dSBarry Smith static PetscErrorCode PetscViewerBinaryGetSkipHeader_Binary(PetscViewer viewer,PetscBool  *skip)
5815c6c1daeSBarry Smith {
5825c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
5835c6c1daeSBarry Smith 
5845c6c1daeSBarry Smith   PetscFunctionBegin;
5855c6c1daeSBarry Smith   *skip = vbinary->skipheader;
5865c6c1daeSBarry Smith   PetscFunctionReturn(0);
5875c6c1daeSBarry Smith }
5885c6c1daeSBarry Smith 
5895c6c1daeSBarry Smith /*@
5905c6c1daeSBarry Smith     PetscViewerBinaryGetSkipHeader - checks whether to write a header with size information on output, or just raw data
5915c6c1daeSBarry Smith 
5925c6c1daeSBarry Smith     Not Collective
5935c6c1daeSBarry Smith 
5945c6c1daeSBarry Smith     Input Parameter:
5955c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
5965c6c1daeSBarry Smith 
5975c6c1daeSBarry Smith     Output Parameter:
5985c6c1daeSBarry Smith .   skip - PETSC_TRUE means do not write header
5995c6c1daeSBarry Smith 
6005c6c1daeSBarry Smith     Level: advanced
6015c6c1daeSBarry Smith 
60295452b02SPatrick Sanan     Notes:
60395452b02SPatrick Sanan     This must be called after PetscViewerSetType()
6045c6c1daeSBarry Smith 
6055c6c1daeSBarry Smith             Returns false for PETSCSOCKETVIEWER, you cannot skip the header for it.
6065c6c1daeSBarry Smith 
6075c6c1daeSBarry Smith .seealso: PetscViewerBinaryOpen(), PetscViewerBinaryGetDescriptor(), PetscViewerBinarySkipInfo(),
6085c6c1daeSBarry Smith           PetscViewerBinarySetSkipHeader()
6095c6c1daeSBarry Smith @*/
6105c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetSkipHeader(PetscViewer viewer,PetscBool  *skip)
6115c6c1daeSBarry Smith {
6125c6c1daeSBarry Smith   PetscErrorCode ierr;
6135c6c1daeSBarry Smith 
6145c6c1daeSBarry Smith   PetscFunctionBegin;
6155c6c1daeSBarry Smith   *skip = PETSC_FALSE;
616163d334eSBarry Smith   ierr  = PetscUseMethod(viewer,"PetscViewerBinaryGetSkipHeader_C",(PetscViewer,PetscBool*),(viewer,skip));CHKERRQ(ierr);
6175c6c1daeSBarry Smith   PetscFunctionReturn(0);
6185c6c1daeSBarry Smith }
6195c6c1daeSBarry Smith 
62081f0254dSBarry Smith static PetscErrorCode PetscViewerBinaryGetInfoPointer_Binary(PetscViewer viewer,FILE **file)
6215c6c1daeSBarry Smith {
622f3b211e4SSatish Balay   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
623a261c58fSBarry Smith   PetscErrorCode     ierr;
624a261c58fSBarry Smith   MPI_Comm           comm;
6255c6c1daeSBarry Smith 
6265c6c1daeSBarry Smith   PetscFunctionBegin;
627c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
6285c6c1daeSBarry Smith   *file = vbinary->fdes_info;
629a261c58fSBarry Smith   if (viewer->format == PETSC_VIEWER_BINARY_MATLAB && !vbinary->matlabheaderwritten) {
630a261c58fSBarry Smith     vbinary->matlabheaderwritten = PETSC_TRUE;
631a261c58fSBarry Smith     ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
632da88d4d4SJed Brown     ierr = PetscFPrintf(comm,*file,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n");CHKERRQ(ierr);
633da88d4d4SJed Brown     ierr = PetscFPrintf(comm,*file,"#$$ Set.filename = '%s';\n",vbinary->filename);CHKERRQ(ierr);
634da88d4d4SJed Brown     ierr = PetscFPrintf(comm,*file,"#$$ fd = PetscOpenFile(Set.filename);\n");CHKERRQ(ierr);
635da88d4d4SJed Brown     ierr = PetscFPrintf(comm,*file,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n");CHKERRQ(ierr);
636a261c58fSBarry Smith   }
6375c6c1daeSBarry Smith   PetscFunctionReturn(0);
6385c6c1daeSBarry Smith }
6395c6c1daeSBarry Smith 
6405c6c1daeSBarry Smith /*@C
6415c6c1daeSBarry Smith     PetscViewerBinaryGetInfoPointer - Extracts the file pointer for the ASCII
6425c6c1daeSBarry Smith           info file associated with a binary file.
6435c6c1daeSBarry Smith 
6445c6c1daeSBarry Smith     Not Collective
6455c6c1daeSBarry Smith 
6465c6c1daeSBarry Smith     Input Parameter:
6475c6c1daeSBarry Smith .   viewer - PetscViewer context, obtained from PetscViewerBinaryOpen()
6485c6c1daeSBarry Smith 
6495c6c1daeSBarry Smith     Output Parameter:
6500298fd71SBarry Smith .   file - file pointer  Always returns NULL if not a binary viewer
6515c6c1daeSBarry Smith 
6525c6c1daeSBarry Smith     Level: advanced
6535c6c1daeSBarry Smith 
6545c6c1daeSBarry Smith     Notes:
6555c6c1daeSBarry Smith       For writable binary PetscViewers, the descriptor will only be valid for the
6565c6c1daeSBarry Smith     first processor in the communicator that shares the PetscViewer.
6575c6c1daeSBarry Smith 
6585c6c1daeSBarry Smith     Fortran Note:
6595c6c1daeSBarry Smith     This routine is not supported in Fortran.
6605c6c1daeSBarry Smith 
6615c6c1daeSBarry Smith .seealso: PetscViewerBinaryOpen(),PetscViewerBinaryGetDescriptor()
6625c6c1daeSBarry Smith @*/
6635c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryGetInfoPointer(PetscViewer viewer,FILE **file)
6645c6c1daeSBarry Smith {
6655c6c1daeSBarry Smith   PetscErrorCode ierr;
6665c6c1daeSBarry Smith 
6675c6c1daeSBarry Smith   PetscFunctionBegin;
6680298fd71SBarry Smith   *file = NULL;
6695c6c1daeSBarry Smith   ierr  = PetscTryMethod(viewer,"PetscViewerBinaryGetInfoPointer_C",(PetscViewer,FILE **),(viewer,file));CHKERRQ(ierr);
6705c6c1daeSBarry Smith   PetscFunctionReturn(0);
6715c6c1daeSBarry Smith }
6725c6c1daeSBarry Smith 
6735c6c1daeSBarry Smith static PetscErrorCode PetscViewerFileClose_Binary(PetscViewer v)
6745c6c1daeSBarry Smith {
6755c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)v->data;
6765c6c1daeSBarry Smith   PetscErrorCode     ierr;
6775c6c1daeSBarry Smith   PetscMPIInt        rank;
6785c6c1daeSBarry Smith   int                err;
6795c6c1daeSBarry Smith 
6805c6c1daeSBarry Smith   PetscFunctionBegin;
681ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)v),&rank);CHKERRQ(ierr);
6825c6c1daeSBarry Smith   if ((!rank || vbinary->btype == FILE_MODE_READ) && vbinary->fdes) {
6835c6c1daeSBarry Smith     close(vbinary->fdes);
6845c6c1daeSBarry Smith     if (!rank && vbinary->storecompressed) {
6855c6c1daeSBarry Smith       char par[PETSC_MAX_PATH_LEN],buf[PETSC_MAX_PATH_LEN];
6865c6c1daeSBarry Smith       FILE *fp;
6875c6c1daeSBarry Smith       /* compress the file */
688a126751eSBarry Smith       ierr = PetscStrncpy(par,"gzip -f ",sizeof(par));CHKERRQ(ierr);
689a126751eSBarry Smith       ierr = PetscStrlcat(par,vbinary->ogzfilename ? vbinary->ogzfilename : vbinary->filename,sizeof(par));CHKERRQ(ierr);
690f90597f1SStefano Zampini       ierr = PetscFree(vbinary->ogzfilename);CHKERRQ(ierr);
6915c6c1daeSBarry Smith #if defined(PETSC_HAVE_POPEN)
6920298fd71SBarry Smith       ierr = PetscPOpen(PETSC_COMM_SELF,NULL,par,"r",&fp);CHKERRQ(ierr);
6935c6c1daeSBarry Smith       if (fgets(buf,1024,fp)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error from command %s\n%s",par,buf);
694016831caSBarry Smith       ierr = PetscPClose(PETSC_COMM_SELF,fp);CHKERRQ(ierr);
6955c6c1daeSBarry Smith #else
6965c6c1daeSBarry Smith       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"Cannot run external programs on this machine");
6975c6c1daeSBarry Smith #endif
6985c6c1daeSBarry Smith     }
6995c6c1daeSBarry Smith   }
7005c6c1daeSBarry Smith   if (vbinary->fdes_info) {
7015c6c1daeSBarry Smith     err = fclose(vbinary->fdes_info);
7025c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
7035c6c1daeSBarry Smith   }
7045c6c1daeSBarry Smith   PetscFunctionReturn(0);
7055c6c1daeSBarry Smith }
7065c6c1daeSBarry Smith 
707e0385b85SDave May #if defined(PETSC_HAVE_MPIIO)
708e0385b85SDave May static PetscErrorCode PetscViewerFileClose_BinaryMPIIO(PetscViewer v)
709e0385b85SDave May {
710e0385b85SDave May   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)v->data;
711e0385b85SDave May   int                err;
712e0385b85SDave May   PetscErrorCode     ierr;
713e0385b85SDave May 
714e0385b85SDave May   PetscFunctionBegin;
715e8a65b7dSLisandro Dalcin   if (vbinary->mfdes != MPI_FILE_NULL) {
716e0385b85SDave May     ierr = MPI_File_close(&vbinary->mfdes);CHKERRQ(ierr);
717e0385b85SDave May   }
718e8a65b7dSLisandro Dalcin   if (vbinary->mfsub != MPI_FILE_NULL) {
719e8a65b7dSLisandro Dalcin     ierr = MPI_File_close(&vbinary->mfsub);CHKERRQ(ierr);
720e8a65b7dSLisandro Dalcin   }
721e0385b85SDave May   if (vbinary->fdes_info) {
722e0385b85SDave May     err = fclose(vbinary->fdes_info);
723e0385b85SDave May     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
724e0385b85SDave May   }
725e0385b85SDave May   PetscFunctionReturn(0);
726e0385b85SDave May }
727e0385b85SDave May #endif
728e0385b85SDave May 
72981f0254dSBarry Smith static PetscErrorCode PetscViewerDestroy_Binary(PetscViewer v)
7305c6c1daeSBarry Smith {
7315c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)v->data;
7325c6c1daeSBarry Smith   PetscErrorCode     ierr;
7335c6c1daeSBarry Smith 
7345c6c1daeSBarry Smith   PetscFunctionBegin;
735a261c58fSBarry Smith   if (v->format == PETSC_VIEWER_BINARY_MATLAB) {
736a261c58fSBarry Smith     MPI_Comm comm;
737a261c58fSBarry Smith     FILE     *info;
738a261c58fSBarry Smith 
739a261c58fSBarry Smith     ierr = PetscObjectGetComm((PetscObject)v,&comm);CHKERRQ(ierr);
740a261c58fSBarry Smith     ierr = PetscViewerBinaryGetInfoPointer(v,&info);CHKERRQ(ierr);
741da88d4d4SJed Brown     ierr = PetscFPrintf(comm,info,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n");CHKERRQ(ierr);
742da88d4d4SJed Brown     ierr = PetscFPrintf(comm,info,"#$$ close(fd);\n");CHKERRQ(ierr);
743da88d4d4SJed Brown     ierr = PetscFPrintf(comm,info,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n");CHKERRQ(ierr);
744a261c58fSBarry Smith   }
7455c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
746bc196f7cSDave May   if (vbinary->usempiio) {
747e0385b85SDave May     ierr = PetscViewerFileClose_BinaryMPIIO(v);CHKERRQ(ierr);
748e0385b85SDave May   } else {
749e0385b85SDave May #endif
750e0385b85SDave May     ierr = PetscViewerFileClose_Binary(v);CHKERRQ(ierr);
751e0385b85SDave May #if defined(PETSC_HAVE_MPIIO)
7525c6c1daeSBarry Smith   }
7535c6c1daeSBarry Smith #endif
754f90597f1SStefano Zampini   ierr = PetscFree(vbinary->filename);CHKERRQ(ierr);
755f90597f1SStefano Zampini   ierr = PetscFree(vbinary->ogzfilename);CHKERRQ(ierr);
756e0385b85SDave May   ierr = PetscFree(vbinary);CHKERRQ(ierr);
757e0385b85SDave May   PetscFunctionReturn(0);
758e0385b85SDave May }
7595c6c1daeSBarry Smith 
7605c6c1daeSBarry Smith /*@C
7615c6c1daeSBarry Smith    PetscViewerBinaryOpen - Opens a file for binary input/output.
7625c6c1daeSBarry Smith 
763d083f849SBarry Smith    Collective
7645c6c1daeSBarry Smith 
7655c6c1daeSBarry Smith    Input Parameters:
7665c6c1daeSBarry Smith +  comm - MPI communicator
7675c6c1daeSBarry Smith .  name - name of file
7685c6c1daeSBarry Smith -  type - type of file
7695c6c1daeSBarry Smith $    FILE_MODE_WRITE - create new file for binary output
7705c6c1daeSBarry Smith $    FILE_MODE_READ - open existing file for binary input
7715c6c1daeSBarry Smith $    FILE_MODE_APPEND - open existing file for binary output
7725c6c1daeSBarry Smith 
7735c6c1daeSBarry Smith    Output Parameter:
7745c6c1daeSBarry Smith .  binv - PetscViewer for binary input/output to use with the specified file
7755c6c1daeSBarry Smith 
7765c6c1daeSBarry Smith     Options Database Keys:
77763c55180SPatrick Sanan +    -viewer_binary_filename <name> -
77863c55180SPatrick Sanan .    -viewer_binary_skip_info -
77963c55180SPatrick Sanan .    -viewer_binary_skip_options -
78063c55180SPatrick Sanan .    -viewer_binary_skip_header -
78163c55180SPatrick Sanan -    -viewer_binary_mpiio -
7825c6c1daeSBarry Smith 
7835c6c1daeSBarry Smith    Level: beginner
7845c6c1daeSBarry Smith 
7855c6c1daeSBarry Smith    Note:
7865c6c1daeSBarry Smith    This PetscViewer should be destroyed with PetscViewerDestroy().
7875c6c1daeSBarry Smith 
7885c6c1daeSBarry Smith     For reading files, the filename may begin with ftp:// or http:// and/or
7895c6c1daeSBarry Smith     end with .gz; in this case file is brought over and uncompressed.
7905c6c1daeSBarry Smith 
7915c6c1daeSBarry Smith     For creating files, if the file name ends with .gz it is automatically
7925c6c1daeSBarry Smith     compressed when closed.
7935c6c1daeSBarry Smith 
7945c6c1daeSBarry Smith     For writing files it only opens the file on processor 0 in the communicator.
7955c6c1daeSBarry Smith     For readable files it opens the file on all nodes that have the file. If
7965c6c1daeSBarry Smith     node 0 does not have the file it generates an error even if other nodes
7975c6c1daeSBarry Smith     do have the file.
7985c6c1daeSBarry Smith 
7996a9046bcSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(),
8005c6c1daeSBarry Smith           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
80167918a83SBarry Smith           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscViewerBinaryRead(), PetscViewerBinarySetUseMPIIO(),
80267918a83SBarry Smith           PetscViewerBinaryGetUseMPIIO(), PetscViewerBinaryGetMPIIOOffset()
8035c6c1daeSBarry Smith @*/
8045c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryOpen(MPI_Comm comm,const char name[],PetscFileMode type,PetscViewer *binv)
8055c6c1daeSBarry Smith {
8065c6c1daeSBarry Smith   PetscErrorCode ierr;
8075c6c1daeSBarry Smith 
8085c6c1daeSBarry Smith   PetscFunctionBegin;
8095c6c1daeSBarry Smith   ierr = PetscViewerCreate(comm,binv);CHKERRQ(ierr);
8105c6c1daeSBarry Smith   ierr = PetscViewerSetType(*binv,PETSCVIEWERBINARY);CHKERRQ(ierr);
8115c6c1daeSBarry Smith   ierr = PetscViewerFileSetMode(*binv,type);CHKERRQ(ierr);
8125c6c1daeSBarry Smith   ierr = PetscViewerFileSetName(*binv,name);CHKERRQ(ierr);
81303a1d59fSDave May   ierr = PetscViewerSetFromOptions(*binv);CHKERRQ(ierr);
8145c6c1daeSBarry Smith   PetscFunctionReturn(0);
8155c6c1daeSBarry Smith }
8165c6c1daeSBarry Smith 
8175c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
818060da220SMatthew G. Knepley static PetscErrorCode PetscViewerBinaryWriteReadMPIIO(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype,PetscBool write)
8195c6c1daeSBarry Smith {
8205c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
8215c6c1daeSBarry Smith   PetscErrorCode     ierr;
822e8a65b7dSLisandro Dalcin   MPI_File           mfdes;
8235c6c1daeSBarry Smith   MPI_Datatype       mdtype;
824e597bc1dSJed Brown   PetscMPIInt        cnt;
8255c6c1daeSBarry Smith   MPI_Status         status;
8265c6c1daeSBarry Smith   MPI_Aint           ul,dsize;
8275c6c1daeSBarry Smith 
8285c6c1daeSBarry Smith   PetscFunctionBegin;
829e8a65b7dSLisandro Dalcin   mfdes = vbinary->mfdes;
830060da220SMatthew G. Knepley   ierr = PetscMPIIntCast(num,&cnt);CHKERRQ(ierr);
8315c6c1daeSBarry Smith   ierr = PetscDataTypeToMPIDataType(dtype,&mdtype);CHKERRQ(ierr);
832e8a65b7dSLisandro Dalcin   ierr = MPI_File_set_view(mfdes,vbinary->moff,mdtype,mdtype,(char*)"native",MPI_INFO_NULL);CHKERRQ(ierr);
8335c6c1daeSBarry Smith   if (write) {
834e8a65b7dSLisandro Dalcin     ierr = MPIU_File_write_all(mfdes,data,cnt,mdtype,&status);CHKERRQ(ierr);
8355c6c1daeSBarry Smith   } else {
836e8a65b7dSLisandro Dalcin     ierr = MPIU_File_read_all(mfdes,data,cnt,mdtype,&status);CHKERRQ(ierr);
8379860990eSLisandro Dalcin     if (cnt > 0) {ierr = MPI_Get_count(&status,mdtype,&cnt);CHKERRQ(ierr);}
8385c6c1daeSBarry Smith   }
8395c6c1daeSBarry Smith   ierr = MPI_Type_get_extent(mdtype,&ul,&dsize);CHKERRQ(ierr);
840a297a907SKarl Rupp 
8415c6c1daeSBarry Smith   vbinary->moff += dsize*cnt;
8429860990eSLisandro Dalcin   if (count) *count = cnt;
8435c6c1daeSBarry Smith   PetscFunctionReturn(0);
8445c6c1daeSBarry Smith }
8455c6c1daeSBarry Smith #endif
8465c6c1daeSBarry Smith 
8475c6c1daeSBarry Smith /*@C
8485c6c1daeSBarry Smith    PetscViewerBinaryRead - Reads from a binary file, all processors get the same result
8495c6c1daeSBarry Smith 
850d083f849SBarry Smith    Collective
8515c6c1daeSBarry Smith 
8525c6c1daeSBarry Smith    Input Parameters:
8535c6c1daeSBarry Smith +  viewer - the binary viewer
854907376e6SBarry Smith .  data - location of the data to be written
855060da220SMatthew G. Knepley .  num - number of items of data to read
856907376e6SBarry Smith -  dtype - type of data to read
8575c6c1daeSBarry Smith 
858f8e4bde8SMatthew G. Knepley    Output Parameters:
8590780a867SBarry Smith .  count - number of items of data actually read, or NULL. Unless an error is generated this is always set to the input parameter num.
860f8e4bde8SMatthew G. Knepley 
8615c6c1daeSBarry Smith    Level: beginner
8625c6c1daeSBarry Smith 
8630780a867SBarry Smith    Developer Note: Since count is always set to num it is not clear what purpose the output argument count serves.
8640780a867SBarry Smith 
8656a9046bcSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(),
8665c6c1daeSBarry Smith           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
8675c6c1daeSBarry Smith           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead()
8685c6c1daeSBarry Smith @*/
869060da220SMatthew G. Knepley PetscErrorCode PetscViewerBinaryRead(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype)
8705c6c1daeSBarry Smith {
8715c6c1daeSBarry Smith   PetscErrorCode     ierr;
8725c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
8735c6c1daeSBarry Smith 
874c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
8755c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
876bc196f7cSDave May   if (vbinary->usempiio) {
877060da220SMatthew G. Knepley     ierr = PetscViewerBinaryWriteReadMPIIO(viewer,data,num,count,dtype,PETSC_FALSE);CHKERRQ(ierr);
8785c6c1daeSBarry Smith   } else {
8795c6c1daeSBarry Smith #endif
8809860990eSLisandro Dalcin     ierr = PetscBinarySynchronizedRead(PetscObjectComm((PetscObject)viewer),vbinary->fdes,data,num,count,dtype);CHKERRQ(ierr);
8815c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
8825c6c1daeSBarry Smith   }
8835c6c1daeSBarry Smith #endif
8845c6c1daeSBarry Smith   PetscFunctionReturn(0);
8855c6c1daeSBarry Smith }
8865c6c1daeSBarry Smith 
8875c6c1daeSBarry Smith /*@C
8885c6c1daeSBarry Smith    PetscViewerBinaryWrite - writes to a binary file, only from the first process
8895c6c1daeSBarry Smith 
890d083f849SBarry Smith    Collective
8915c6c1daeSBarry Smith 
8925c6c1daeSBarry Smith    Input Parameters:
8935c6c1daeSBarry Smith +  viewer - the binary viewer
8945c6c1daeSBarry Smith .  data - location of data
8955824c9d0SPatrick Sanan .  count - number of items of data to write
8965824c9d0SPatrick Sanan .  dtype - type of data to write
8975c6c1daeSBarry Smith -  istemp - data may be overwritten
8985c6c1daeSBarry Smith 
8995c6c1daeSBarry Smith    Level: beginner
9005c6c1daeSBarry Smith 
90195452b02SPatrick Sanan    Notes:
90295452b02SPatrick Sanan     because byte-swapping may be done on the values in data it cannot be declared const
9035c6c1daeSBarry Smith 
9046a9046bcSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(),
9055c6c1daeSBarry Smith           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(), PetscDataType
9065c6c1daeSBarry Smith           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead()
9075c6c1daeSBarry Smith @*/
9085c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryWrite(PetscViewer viewer,void *data,PetscInt count,PetscDataType dtype,PetscBool istemp)
9095c6c1daeSBarry Smith {
9105c6c1daeSBarry Smith   PetscErrorCode     ierr;
9115c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
9125c6c1daeSBarry Smith 
9135c6c1daeSBarry Smith   PetscFunctionBegin;
914c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
9155c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
916bc196f7cSDave May   if (vbinary->usempiio) {
917060da220SMatthew G. Knepley     ierr = PetscViewerBinaryWriteReadMPIIO(viewer,data,count,NULL,dtype,PETSC_TRUE);CHKERRQ(ierr);
9185c6c1daeSBarry Smith   } else {
9195c6c1daeSBarry Smith #endif
920ce94432eSBarry Smith     ierr = PetscBinarySynchronizedWrite(PetscObjectComm((PetscObject)viewer),vbinary->fdes,data,count,dtype,istemp);CHKERRQ(ierr);
9215c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
9225c6c1daeSBarry Smith   }
9235c6c1daeSBarry Smith #endif
9245c6c1daeSBarry Smith   PetscFunctionReturn(0);
9255c6c1daeSBarry Smith }
9265c6c1daeSBarry Smith 
9275c6c1daeSBarry Smith /*@C
9285c6c1daeSBarry Smith    PetscViewerBinaryWriteStringArray - writes to a binary file, only from the first process an array of strings
9295c6c1daeSBarry Smith 
930d083f849SBarry Smith    Collective
9315c6c1daeSBarry Smith 
9325c6c1daeSBarry Smith    Input Parameters:
9335c6c1daeSBarry Smith +  viewer - the binary viewer
9345c6c1daeSBarry Smith -  data - location of the array of strings
9355c6c1daeSBarry Smith 
9365c6c1daeSBarry Smith 
9375c6c1daeSBarry Smith    Level: intermediate
9385c6c1daeSBarry Smith 
93995452b02SPatrick Sanan     Notes:
94095452b02SPatrick Sanan     array of strings is null terminated
9415c6c1daeSBarry Smith 
9426a9046bcSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(),
9435c6c1daeSBarry Smith           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
9445c6c1daeSBarry Smith           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead()
9455c6c1daeSBarry Smith @*/
94678fbdcc8SBarry Smith PetscErrorCode PetscViewerBinaryWriteStringArray(PetscViewer viewer,const char * const *data)
9475c6c1daeSBarry Smith {
9485c6c1daeSBarry Smith   PetscErrorCode ierr;
9495c6c1daeSBarry Smith   PetscInt       i,n = 0,*sizes;
9505c6c1daeSBarry Smith 
951c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
9525c6c1daeSBarry Smith   /* count number of strings */
9535c6c1daeSBarry Smith   while (data[n++]) ;
9545c6c1daeSBarry Smith   n--;
955854ce69bSBarry Smith   ierr     = PetscMalloc1(n+1,&sizes);CHKERRQ(ierr);
9565c6c1daeSBarry Smith   sizes[0] = n;
9575c6c1daeSBarry Smith   for (i=0; i<n; i++) {
9585c6c1daeSBarry Smith     size_t tmp;
9595c6c1daeSBarry Smith     ierr       = PetscStrlen(data[i],&tmp);CHKERRQ(ierr);
9605c6c1daeSBarry Smith     sizes[i+1] = tmp + 1;   /* size includes space for the null terminator */
9615c6c1daeSBarry Smith   }
9625c6c1daeSBarry Smith   ierr = PetscViewerBinaryWrite(viewer,sizes,n+1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
9635c6c1daeSBarry Smith   for (i=0; i<n; i++) {
96478fbdcc8SBarry Smith     ierr = PetscViewerBinaryWrite(viewer,(void*)data[i],sizes[i+1],PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
9655c6c1daeSBarry Smith   }
9665c6c1daeSBarry Smith   ierr = PetscFree(sizes);CHKERRQ(ierr);
9675c6c1daeSBarry Smith   PetscFunctionReturn(0);
9685c6c1daeSBarry Smith }
9695c6c1daeSBarry Smith 
9705c6c1daeSBarry Smith /*@C
9715c6c1daeSBarry Smith    PetscViewerBinaryReadStringArray - reads a binary file an array of strings
9725c6c1daeSBarry Smith 
973d083f849SBarry Smith    Collective
9745c6c1daeSBarry Smith 
9755c6c1daeSBarry Smith    Input Parameter:
9765c6c1daeSBarry Smith .  viewer - the binary viewer
9775c6c1daeSBarry Smith 
9785c6c1daeSBarry Smith    Output Parameter:
9795c6c1daeSBarry Smith .  data - location of the array of strings
9805c6c1daeSBarry Smith 
9815c6c1daeSBarry Smith    Level: intermediate
9825c6c1daeSBarry Smith 
98395452b02SPatrick Sanan     Notes:
98495452b02SPatrick Sanan     array of strings is null terminated
9855c6c1daeSBarry Smith 
9866a9046bcSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(),
9875c6c1daeSBarry Smith           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
9885c6c1daeSBarry Smith           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead()
9895c6c1daeSBarry Smith @*/
9905c6c1daeSBarry Smith PetscErrorCode PetscViewerBinaryReadStringArray(PetscViewer viewer,char ***data)
9915c6c1daeSBarry Smith {
9925c6c1daeSBarry Smith   PetscErrorCode ierr;
993060da220SMatthew G. Knepley   PetscInt       i,n,*sizes,N = 0;
9945c6c1daeSBarry Smith 
995c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
9965c6c1daeSBarry Smith   /* count number of strings */
997060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&n,1,NULL,PETSC_INT);CHKERRQ(ierr);
998785e854fSJed Brown   ierr = PetscMalloc1(n,&sizes);CHKERRQ(ierr);
999060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,sizes,n,NULL,PETSC_INT);CHKERRQ(ierr);
1000a297a907SKarl Rupp   for (i=0; i<n; i++) N += sizes[i];
1001854ce69bSBarry Smith   ierr = PetscMalloc((n+1)*sizeof(char*) + N*sizeof(char),data);CHKERRQ(ierr);
10025c6c1daeSBarry Smith   (*data)[0] = (char*)((*data) + n + 1);
1003a297a907SKarl Rupp   for (i=1; i<n; i++) (*data)[i] = (*data)[i-1] + sizes[i-1];
1004060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,(*data)[0],N,NULL,PETSC_CHAR);CHKERRQ(ierr);
1005a297a907SKarl Rupp 
1006*02c9f0b5SLisandro Dalcin   (*data)[n] = NULL;
1007a297a907SKarl Rupp 
10085c6c1daeSBarry Smith   ierr = PetscFree(sizes);CHKERRQ(ierr);
10095c6c1daeSBarry Smith   PetscFunctionReturn(0);
10105c6c1daeSBarry Smith }
10115c6c1daeSBarry Smith 
101281f0254dSBarry Smith static PetscErrorCode PetscViewerFileGetName_Binary(PetscViewer viewer,const char **name)
10135c6c1daeSBarry Smith {
10145c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
10155c6c1daeSBarry Smith 
10165c6c1daeSBarry Smith   PetscFunctionBegin;
10175c6c1daeSBarry Smith   *name = vbinary->filename;
10185c6c1daeSBarry Smith   PetscFunctionReturn(0);
10195c6c1daeSBarry Smith }
10205c6c1daeSBarry Smith 
10215c6c1daeSBarry Smith /*@C
10225c6c1daeSBarry Smith      PetscViewerFileGetMode - Gets the type of file to be open
10235c6c1daeSBarry Smith 
10245c6c1daeSBarry Smith     Not Collective
10255c6c1daeSBarry Smith 
10265c6c1daeSBarry Smith   Input Parameter:
1027232ac771SBarry Smith .  viewer - the PetscViewer; must be a PETSCVIEWERBINARY, PETSCVIEWERMATLAB, PETSCVIEWERHDF5, or PETSCVIEWERASCII  PetscViewer
10285c6c1daeSBarry Smith 
10295c6c1daeSBarry Smith   Output Parameter:
10305c6c1daeSBarry Smith .  type - type of file
10315c6c1daeSBarry Smith $    FILE_MODE_WRITE - create new file for binary output
10325c6c1daeSBarry Smith $    FILE_MODE_READ - open existing file for binary input
10335c6c1daeSBarry Smith $    FILE_MODE_APPEND - open existing file for binary output
10345c6c1daeSBarry Smith 
10355c6c1daeSBarry Smith   Level: advanced
10365c6c1daeSBarry Smith 
10375c6c1daeSBarry Smith .seealso: PetscViewerFileSetMode(), PetscViewerCreate(), PetscViewerSetType(), PetscViewerBinaryOpen()
10385c6c1daeSBarry Smith 
10395c6c1daeSBarry Smith @*/
10405c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetMode(PetscViewer viewer,PetscFileMode *type)
10415c6c1daeSBarry Smith {
10425c6c1daeSBarry Smith   PetscErrorCode ierr;
10435c6c1daeSBarry Smith 
10445c6c1daeSBarry Smith   PetscFunctionBegin;
10455c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
10465c6c1daeSBarry Smith   PetscValidPointer(type,2);
10475c6c1daeSBarry Smith   ierr = PetscUseMethod(viewer,"PetscViewerFileGetMode_C",(PetscViewer,PetscFileMode*),(viewer,type));CHKERRQ(ierr);
10485c6c1daeSBarry Smith   PetscFunctionReturn(0);
10495c6c1daeSBarry Smith }
10505c6c1daeSBarry Smith 
10515c6c1daeSBarry Smith /*@
1052bc196f7cSDave May     PetscViewerBinarySetUseMPIIO - Sets a binary viewer to use MPI-IO for reading/writing. Must be called
10535c6c1daeSBarry Smith         before PetscViewerFileSetName()
10545c6c1daeSBarry Smith 
10555c6c1daeSBarry Smith     Logically Collective on PetscViewer
10565c6c1daeSBarry Smith 
10575c6c1daeSBarry Smith     Input Parameters:
1058bc196f7cSDave May +   viewer - the PetscViewer; must be a binary
1059bc196f7cSDave May -   flg - PETSC_TRUE means MPI-IO will be used
10605c6c1daeSBarry Smith 
10615c6c1daeSBarry Smith     Options Database:
10625c6c1daeSBarry Smith     -viewer_binary_mpiio : Flag for using MPI-IO
10635c6c1daeSBarry Smith 
10645c6c1daeSBarry Smith     Level: advanced
10655c6c1daeSBarry Smith 
1066bc196f7cSDave May .seealso: PetscViewerFileSetMode(), PetscViewerCreate(), PetscViewerSetType(), PetscViewerBinaryOpen(),
1067bc196f7cSDave May           PetscViewerBinaryGetUseMPIIO()
10685c6c1daeSBarry Smith 
10695c6c1daeSBarry Smith @*/
1070bc196f7cSDave May PetscErrorCode PetscViewerBinarySetUseMPIIO(PetscViewer viewer,PetscBool flg)
10715c6c1daeSBarry Smith {
10725c6c1daeSBarry Smith   PetscErrorCode ierr;
10735c6c1daeSBarry Smith 
10745c6c1daeSBarry Smith   PetscFunctionBegin;
10755c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
1076bc196f7cSDave May   ierr = PetscTryMethod(viewer,"PetscViewerBinarySetUseMPIIO_C",(PetscViewer,PetscBool),(viewer,flg));CHKERRQ(ierr);
10775c6c1daeSBarry Smith   PetscFunctionReturn(0);
10785c6c1daeSBarry Smith }
10795c6c1daeSBarry Smith 
10805c6c1daeSBarry Smith /*@C
10815c6c1daeSBarry Smith      PetscViewerFileSetMode - Sets the type of file to be open
10825c6c1daeSBarry Smith 
10835c6c1daeSBarry Smith     Logically Collective on PetscViewer
10845c6c1daeSBarry Smith 
10855c6c1daeSBarry Smith   Input Parameters:
1086232ac771SBarry Smith +  viewer - the PetscViewer; must be a a PETSCVIEWERBINARY, PETSCVIEWERMATLAB, PETSCVIEWERHDF5, or PETSCVIEWERASCII  PetscViewer
10875c6c1daeSBarry Smith -  type - type of file
1088f8859db6SBarry Smith $    FILE_MODE_WRITE - create new file for output
1089f8859db6SBarry Smith $    FILE_MODE_READ - open existing file for input
1090f8859db6SBarry Smith $    FILE_MODE_APPEND - open existing file for output
10915c6c1daeSBarry Smith 
10925c6c1daeSBarry Smith   Level: advanced
10935c6c1daeSBarry Smith 
10945c6c1daeSBarry Smith .seealso: PetscViewerFileSetMode(), PetscViewerCreate(), PetscViewerSetType(), PetscViewerBinaryOpen()
10955c6c1daeSBarry Smith 
10965c6c1daeSBarry Smith @*/
10975c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetMode(PetscViewer viewer,PetscFileMode type)
10985c6c1daeSBarry Smith {
10995c6c1daeSBarry Smith   PetscErrorCode ierr;
11005c6c1daeSBarry Smith 
11015c6c1daeSBarry Smith   PetscFunctionBegin;
11025c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
11035c6c1daeSBarry Smith   PetscValidLogicalCollectiveEnum(viewer,type,2);
11045c6c1daeSBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileSetMode_C",(PetscViewer,PetscFileMode),(viewer,type));CHKERRQ(ierr);
11055c6c1daeSBarry Smith   PetscFunctionReturn(0);
11065c6c1daeSBarry Smith }
11075c6c1daeSBarry Smith 
110881f0254dSBarry Smith static PetscErrorCode PetscViewerFileGetMode_Binary(PetscViewer viewer,PetscFileMode *type)
11095c6c1daeSBarry Smith {
11105c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
11115c6c1daeSBarry Smith 
11125c6c1daeSBarry Smith   PetscFunctionBegin;
11135c6c1daeSBarry Smith   *type = vbinary->btype;
11145c6c1daeSBarry Smith   PetscFunctionReturn(0);
11155c6c1daeSBarry Smith }
11165c6c1daeSBarry Smith 
111781f0254dSBarry Smith static PetscErrorCode PetscViewerFileSetMode_Binary(PetscViewer viewer,PetscFileMode type)
11185c6c1daeSBarry Smith {
11195c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
11205c6c1daeSBarry Smith 
11215c6c1daeSBarry Smith   PetscFunctionBegin;
11225c6c1daeSBarry Smith   vbinary->btype = type;
11235c6c1daeSBarry Smith   PetscFunctionReturn(0);
11245c6c1daeSBarry Smith }
11255c6c1daeSBarry Smith 
112681f0254dSBarry Smith static PetscErrorCode PetscViewerFileSetName_Binary(PetscViewer viewer,const char name[])
1127e0385b85SDave May {
1128e0385b85SDave May   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
1129e0385b85SDave May   PetscErrorCode     ierr;
1130e0385b85SDave May 
1131e0385b85SDave May   PetscFunctionBegin;
1132f90597f1SStefano Zampini   if (vbinary->filename) {
1133f90597f1SStefano Zampini     /* gzip can be run after the file with the previous filename has been closed */
1134f90597f1SStefano Zampini     ierr = PetscFree(vbinary->ogzfilename);CHKERRQ(ierr);
1135f90597f1SStefano Zampini     ierr = PetscStrallocpy(vbinary->filename,&vbinary->ogzfilename);CHKERRQ(ierr);
1136f90597f1SStefano Zampini     ierr = PetscFree(vbinary->filename);CHKERRQ(ierr);
1137f90597f1SStefano Zampini     viewer->setupcalled = PETSC_FALSE;
1138f90597f1SStefano Zampini   }
1139e0385b85SDave May   ierr = PetscStrallocpy(name,&vbinary->filename);CHKERRQ(ierr);
1140e0385b85SDave May   PetscFunctionReturn(0);
1141e0385b85SDave May }
11425c6c1daeSBarry Smith /*
11435c6c1daeSBarry Smith         Actually opens the file
11445c6c1daeSBarry Smith */
1145e0877f53SBarry Smith static PetscErrorCode PetscViewerFileSetUp_Binary(PetscViewer viewer)
11465c6c1daeSBarry Smith {
11475c6c1daeSBarry Smith   PetscMPIInt        rank;
11485c6c1daeSBarry Smith   PetscErrorCode     ierr;
11495c6c1daeSBarry Smith   size_t             len;
11505c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
11515c6c1daeSBarry Smith   const char         *fname;
11522259a519SDave May   char               bname[PETSC_MAX_PATH_LEN],*gz;
11535c6c1daeSBarry Smith   PetscBool          found;
11545c6c1daeSBarry Smith   PetscFileMode      type = vbinary->btype;
11555c6c1daeSBarry Smith 
11565c6c1daeSBarry Smith   PetscFunctionBegin;
1157e0385b85SDave May   if (type == (PetscFileMode) -1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerFileSetMode()");
11582259a519SDave May   if (!vbinary->filename) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerFileSetName()");
11595c6c1daeSBarry Smith   ierr = PetscViewerFileClose_Binary(viewer);CHKERRQ(ierr);
11605c6c1daeSBarry Smith 
1161ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
11625c6c1daeSBarry Smith 
11635c6c1daeSBarry Smith   /* if ends in .gz strip that off and note user wants file compressed */
11645c6c1daeSBarry Smith   vbinary->storecompressed = PETSC_FALSE;
11655c6c1daeSBarry Smith   if (!rank && type == FILE_MODE_WRITE) {
11665c6c1daeSBarry Smith     /* remove .gz if it ends library name */
11675c6c1daeSBarry Smith     ierr = PetscStrstr(vbinary->filename,".gz",&gz);CHKERRQ(ierr);
11685c6c1daeSBarry Smith     if (gz) {
11695c6c1daeSBarry Smith       ierr = PetscStrlen(gz,&len);CHKERRQ(ierr);
11705c6c1daeSBarry Smith       if (len == 3) {
11715c6c1daeSBarry Smith         *gz = 0;
11725c6c1daeSBarry Smith         vbinary->storecompressed = PETSC_TRUE;
11735c6c1daeSBarry Smith       }
11745c6c1daeSBarry Smith     }
11755c6c1daeSBarry Smith   }
11765c6c1daeSBarry Smith 
11775c6c1daeSBarry Smith   /* only first processor opens file if writeable */
11785c6c1daeSBarry Smith   if (!rank || type == FILE_MODE_READ) {
11795c6c1daeSBarry Smith 
11805c6c1daeSBarry Smith     if (type == FILE_MODE_READ) {
11815c6c1daeSBarry Smith       /* possibly get the file from remote site or compressed file */
1182ce94432eSBarry Smith       ierr  = PetscFileRetrieve(PetscObjectComm((PetscObject)viewer),vbinary->filename,bname,PETSC_MAX_PATH_LEN,&found);CHKERRQ(ierr);
11835c6c1daeSBarry Smith       fname = bname;
118441c4be4aSVaclav Hapla       /* comm below may be global as all ranks go here for FILE_MODE_READ and output 'found' of PetscFileRetrieve() is valid on all processes */
118541c4be4aSVaclav Hapla       if (!found) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_OPEN,"Cannot locate file: %s on node zero",vbinary->filename);
1186a297a907SKarl Rupp     } else fname = vbinary->filename;
118755819941SStefano Zampini     if (type == FILE_MODE_APPEND) { /* check if asked to append to a non-existing file */
118855819941SStefano Zampini       ierr = PetscTestFile(fname,'\0',&found);CHKERRQ(ierr);
118955819941SStefano Zampini     }
11905c6c1daeSBarry Smith 
11915c6c1daeSBarry Smith #if defined(PETSC_HAVE_O_BINARY)
119255819941SStefano Zampini     if (type == FILE_MODE_WRITE || (type == FILE_MODE_APPEND && !found) ) {
11935c6c1daeSBarry Smith       if ((vbinary->fdes = open(fname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,0666)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot create file %s for writing",fname);
11945c6c1daeSBarry Smith     } else if (type == FILE_MODE_READ && fname) {
11955c6c1daeSBarry Smith       if ((vbinary->fdes = open(fname,O_RDONLY|O_BINARY,0)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file %s for reading",fname);
11965c6c1daeSBarry Smith     } else if (type == FILE_MODE_APPEND) {
11975c6c1daeSBarry Smith       if ((vbinary->fdes = open(fname,O_WRONLY|O_APPEND|O_BINARY,0)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file %s for writing",fname);
11985c6c1daeSBarry Smith     } else if (fname) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown file type");
11995c6c1daeSBarry Smith #else
120055819941SStefano Zampini     if (type == FILE_MODE_WRITE || (type == FILE_MODE_APPEND && !found) ) {
12015c6c1daeSBarry Smith       if ((vbinary->fdes = creat(fname,0666)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot create file %s for writing",fname);
12025c6c1daeSBarry Smith     } else if (type == FILE_MODE_READ && fname) {
12035c6c1daeSBarry Smith       if ((vbinary->fdes = open(fname,O_RDONLY,0)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file %s for reading",fname);
12045c6c1daeSBarry Smith     } else if (type == FILE_MODE_APPEND) {
12055c6c1daeSBarry Smith       if ((vbinary->fdes = open(fname,O_WRONLY|O_APPEND,0)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file %s for writing",fname);
12065c6c1daeSBarry Smith     } else if (fname) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown file type");
12075c6c1daeSBarry Smith #endif
12085c6c1daeSBarry Smith   } else vbinary->fdes = -1;
12095c6c1daeSBarry Smith 
12105c6c1daeSBarry Smith   /*
12115c6c1daeSBarry Smith       try to open info file: all processors open this file if read only
12125c6c1daeSBarry Smith   */
12135c6c1daeSBarry Smith   if (!vbinary->skipinfo && (!rank || type == FILE_MODE_READ)) {
12145c6c1daeSBarry Smith     char infoname[PETSC_MAX_PATH_LEN],iname[PETSC_MAX_PATH_LEN];
12155c6c1daeSBarry Smith 
1216a126751eSBarry Smith     ierr = PetscStrncpy(infoname,vbinary->filename,sizeof(infoname));CHKERRQ(ierr);
12175c6c1daeSBarry Smith     /* remove .gz if it ends library name */
12185c6c1daeSBarry Smith     ierr = PetscStrstr(infoname,".gz",&gz);CHKERRQ(ierr);
12195c6c1daeSBarry Smith     if (gz) {
12205c6c1daeSBarry Smith       ierr = PetscStrlen(gz,&len);CHKERRQ(ierr);
1221a297a907SKarl Rupp       if (len == 3) *gz = 0;
12225c6c1daeSBarry Smith     }
12235c6c1daeSBarry Smith 
1224a126751eSBarry Smith     ierr = PetscStrlcat(infoname,".info",sizeof(infoname));CHKERRQ(ierr);
12255c6c1daeSBarry Smith     ierr = PetscFixFilename(infoname,iname);CHKERRQ(ierr);
12265c6c1daeSBarry Smith     if (type == FILE_MODE_READ) {
1227ce94432eSBarry Smith       ierr = PetscFileRetrieve(PetscObjectComm((PetscObject)viewer),iname,infoname,PETSC_MAX_PATH_LEN,&found);CHKERRQ(ierr);
12281f5e1f59SVaclav Hapla       if (found) {
1229c5929fdfSBarry Smith         ierr = PetscOptionsInsertFile(PetscObjectComm((PetscObject)viewer),((PetscObject)viewer)->options,infoname,PETSC_FALSE);CHKERRQ(ierr);
12301f5e1f59SVaclav Hapla       }
12315c6c1daeSBarry Smith     } else {
12325c6c1daeSBarry Smith       vbinary->fdes_info = fopen(infoname,"w");
12335c6c1daeSBarry Smith       if (!vbinary->fdes_info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open .info file %s for writing",infoname);
12345c6c1daeSBarry Smith     }
12355c6c1daeSBarry Smith   }
12365c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
1237e0385b85SDave May   PetscLogObjectState((PetscObject)viewer,"File: %s",vbinary->filename);
12385c6c1daeSBarry Smith #endif
12395c6c1daeSBarry Smith   PetscFunctionReturn(0);
12405c6c1daeSBarry Smith }
12415c6c1daeSBarry Smith 
12425c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
1243e0385b85SDave May static PetscErrorCode PetscViewerFileSetUp_BinaryMPIIO(PetscViewer viewer)
12445c6c1daeSBarry Smith {
12455c6c1daeSBarry Smith   PetscMPIInt        rank;
12465c6c1daeSBarry Smith   PetscErrorCode     ierr;
12475c6c1daeSBarry Smith   size_t             len;
12485c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
12492259a519SDave May   char               *gz;
12505c6c1daeSBarry Smith   PetscBool          found;
12515c6c1daeSBarry Smith   PetscFileMode      type = vbinary->btype;
1252e8a65b7dSLisandro Dalcin   int                amode;
12535c6c1daeSBarry Smith 
12545c6c1daeSBarry Smith   PetscFunctionBegin;
1255e0385b85SDave May   if (type == (PetscFileMode) -1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerFileSetMode()");
12562259a519SDave May   if (!vbinary->filename) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerFileSetName()");
1257e0385b85SDave May   ierr = PetscViewerFileClose_BinaryMPIIO(viewer);CHKERRQ(ierr);
12585c6c1daeSBarry Smith 
1259a297a907SKarl Rupp   vbinary->storecompressed = PETSC_FALSE;
12605c6c1daeSBarry Smith 
1261e8a65b7dSLisandro Dalcin   switch (type) {
1262e8a65b7dSLisandro Dalcin   case FILE_MODE_READ:  amode = MPI_MODE_RDONLY; break;
1263e8a65b7dSLisandro Dalcin   case FILE_MODE_WRITE: amode = MPI_MODE_WRONLY | MPI_MODE_CREATE; break;
1264e8a65b7dSLisandro Dalcin   default: SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Unsupported file mode %s",PetscFileModes[type]);
12655c6c1daeSBarry Smith   }
1266e8a65b7dSLisandro Dalcin   ierr = MPI_File_open(PetscObjectComm((PetscObject)viewer),vbinary->filename,amode,MPI_INFO_NULL,&vbinary->mfdes);CHKERRQ(ierr);
12675c6c1daeSBarry Smith 
12685c6c1daeSBarry Smith   /*
12695c6c1daeSBarry Smith       try to open info file: all processors open this file if read only
12705c6c1daeSBarry Smith 
1271bebe2cf6SSatish Balay       Below is identical code to the code for Binary above, should be put in separate routine
12725c6c1daeSBarry Smith   */
1273e8a65b7dSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
12745c6c1daeSBarry Smith   if (!vbinary->skipinfo && (!rank || type == FILE_MODE_READ)) {
12755c6c1daeSBarry Smith     char infoname[PETSC_MAX_PATH_LEN],iname[PETSC_MAX_PATH_LEN];
12765c6c1daeSBarry Smith 
1277a126751eSBarry Smith     ierr = PetscStrncpy(infoname,vbinary->filename,sizeof(infoname));CHKERRQ(ierr);
12785c6c1daeSBarry Smith     /* remove .gz if it ends library name */
12795c6c1daeSBarry Smith     ierr = PetscStrstr(infoname,".gz",&gz);CHKERRQ(ierr);
12805c6c1daeSBarry Smith     if (gz) {
12815c6c1daeSBarry Smith       ierr = PetscStrlen(gz,&len);CHKERRQ(ierr);
1282a297a907SKarl Rupp       if (len == 3) *gz = 0;
12835c6c1daeSBarry Smith     }
12845c6c1daeSBarry Smith 
1285a126751eSBarry Smith     ierr = PetscStrlcat(infoname,".info",sizeof(infoname));CHKERRQ(ierr);
12865c6c1daeSBarry Smith     ierr = PetscFixFilename(infoname,iname);CHKERRQ(ierr);
12875c6c1daeSBarry Smith     if (type == FILE_MODE_READ) {
1288ce94432eSBarry Smith       ierr = PetscFileRetrieve(PetscObjectComm((PetscObject)viewer),iname,infoname,PETSC_MAX_PATH_LEN,&found);CHKERRQ(ierr);
1289c5929fdfSBarry Smith       ierr = PetscOptionsInsertFile(PetscObjectComm((PetscObject)viewer),((PetscObject)viewer)->options,infoname,PETSC_FALSE);CHKERRQ(ierr);
12905c6c1daeSBarry Smith     } else {
12915c6c1daeSBarry Smith       vbinary->fdes_info = fopen(infoname,"w");
12925c6c1daeSBarry Smith       if (!vbinary->fdes_info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open .info file %s for writing",infoname);
12935c6c1daeSBarry Smith     }
12945c6c1daeSBarry Smith   }
12955c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
1296e0385b85SDave May   PetscLogObjectState((PetscObject)viewer,"File: %s",vbinary->filename);
12975c6c1daeSBarry Smith #endif
12985c6c1daeSBarry Smith   PetscFunctionReturn(0);
12995c6c1daeSBarry Smith }
13005c6c1daeSBarry Smith 
130181f0254dSBarry Smith static PetscErrorCode PetscViewerBinarySetUseMPIIO_Binary(PetscViewer viewer,PetscBool flg)
13025c6c1daeSBarry Smith {
13035c6c1daeSBarry Smith   PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data;
13045c6c1daeSBarry Smith   PetscFunctionBegin;
1305bc196f7cSDave May   vbinary->usempiio = flg;
13065c6c1daeSBarry Smith   PetscFunctionReturn(0);
13075c6c1daeSBarry Smith }
13085c6c1daeSBarry Smith #endif
13095c6c1daeSBarry Smith 
131081f0254dSBarry Smith static PetscErrorCode PetscViewerView_Binary(PetscViewer v,PetscViewer viewer)
13112bf49c77SBarry Smith {
13122bf49c77SBarry Smith   PetscErrorCode     ierr;
13132bf49c77SBarry Smith   PetscViewer_Binary *binary = (PetscViewer_Binary*)v->data;
13142bf49c77SBarry Smith 
13152bf49c77SBarry Smith   PetscFunctionBegin;
13162bf49c77SBarry Smith   if (binary->filename) {
13172bf49c77SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",binary->filename);CHKERRQ(ierr);
13182bf49c77SBarry Smith   }
13192bf49c77SBarry Smith   PetscFunctionReturn(0);
13202bf49c77SBarry Smith }
13212bf49c77SBarry Smith 
132203a1d59fSDave May static PetscErrorCode PetscViewerSetUp_Binary(PetscViewer v)
132303a1d59fSDave May {
132403a1d59fSDave May   PetscErrorCode     ierr;
132503a1d59fSDave May   PetscViewer_Binary *binary = (PetscViewer_Binary*)v->data;
1326e0385b85SDave May 
132703a1d59fSDave May   PetscFunctionBegin;
1328da07bb01SDave May   if (!binary->setfromoptionscalled) { ierr = PetscViewerSetFromOptions(v);CHKERRQ(ierr); }
132903a1d59fSDave May 
1330e0385b85SDave May #if defined(PETSC_HAVE_MPIIO)
1331bc196f7cSDave May   if (binary->usempiio) {
1332e0385b85SDave May     ierr = PetscViewerFileSetUp_BinaryMPIIO(v);CHKERRQ(ierr);
1333e0385b85SDave May   } else {
1334e0385b85SDave May #endif
1335e0385b85SDave May     ierr = PetscViewerFileSetUp_Binary(v);CHKERRQ(ierr);
1336e0385b85SDave May #if defined(PETSC_HAVE_MPIIO)
1337e0385b85SDave May   }
1338e0385b85SDave May #endif
133903a1d59fSDave May   PetscFunctionReturn(0);
134003a1d59fSDave May }
134103a1d59fSDave May 
13424416b707SBarry Smith static PetscErrorCode PetscViewerSetFromOptions_Binary(PetscOptionItems *PetscOptionsObject,PetscViewer v)
134303a1d59fSDave May {
134403a1d59fSDave May   PetscErrorCode     ierr;
134503a1d59fSDave May   PetscViewer_Binary *binary = (PetscViewer_Binary*)v->data;
1346d22fd6bcSDave May   char               defaultname[PETSC_MAX_PATH_LEN];
134703a1d59fSDave May   PetscBool          flg;
1348e0385b85SDave May 
134903a1d59fSDave May   PetscFunctionBegin;
135003a1d59fSDave May   ierr = PetscOptionsHead(PetscOptionsObject,"Binary PetscViewer Options");CHKERRQ(ierr);
1351d22fd6bcSDave May   ierr = PetscSNPrintf(defaultname,PETSC_MAX_PATH_LEN-1,"binaryoutput");CHKERRQ(ierr);
1352d22fd6bcSDave May   ierr = PetscOptionsString("-viewer_binary_filename","Specify filename","PetscViewerFileSetName",defaultname,defaultname,PETSC_MAX_PATH_LEN-1,&flg);CHKERRQ(ierr);
1353d22fd6bcSDave May   if (flg) { ierr = PetscViewerFileSetName_Binary(v,defaultname);CHKERRQ(ierr); }
135434a9cc2cSBarry Smith   ierr = PetscOptionsBool("-viewer_binary_skip_info","Skip writing/reading .info file","PetscViewerBinarySetSkipInfo",PETSC_FALSE,&binary->skipinfo,NULL);CHKERRQ(ierr);
135534a9cc2cSBarry Smith   ierr = PetscOptionsBool("-viewer_binary_skip_options","Skip parsing vec load options","PetscViewerBinarySetSkipOptions",PETSC_TRUE,&binary->skipoptions,NULL);CHKERRQ(ierr);
135634a9cc2cSBarry Smith   ierr = PetscOptionsBool("-viewer_binary_skip_header","Skip writing/reading header information","PetscViewerBinarySetSkipHeader",PETSC_FALSE,&binary->skipheader,NULL);CHKERRQ(ierr);
135703a1d59fSDave May #if defined(PETSC_HAVE_MPIIO)
135834a9cc2cSBarry Smith   ierr = PetscOptionsBool("-viewer_binary_mpiio","Use MPI-IO functionality to write/read binary file","PetscViewerBinarySetUseMPIIO",PETSC_FALSE,&binary->usempiio,NULL);CHKERRQ(ierr);
135934a9cc2cSBarry Smith #elif defined(PETSC_HAVE_MPIUNI)
136034a9cc2cSBarry Smith   ierr = PetscOptionsBool("-viewer_binary_mpiio","Use MPI-IO functionality to write/read binary file","PetscViewerBinarySetUseMPIIO",PETSC_FALSE,NULL,NULL);CHKERRQ(ierr);
136103a1d59fSDave May #endif
136203a1d59fSDave May   ierr = PetscOptionsTail();CHKERRQ(ierr);
1363bc196f7cSDave May   binary->setfromoptionscalled = PETSC_TRUE;
136403a1d59fSDave May   PetscFunctionReturn(0);
136503a1d59fSDave May }
136603a1d59fSDave May 
13678556b5ebSBarry Smith /*MC
13688556b5ebSBarry Smith    PETSCVIEWERBINARY - A viewer that saves to binary files
13698556b5ebSBarry Smith 
13708556b5ebSBarry Smith 
13718556b5ebSBarry Smith .seealso:  PetscViewerBinaryOpen(), PETSC_VIEWER_STDOUT_(),PETSC_VIEWER_STDOUT_SELF, PETSC_VIEWER_STDOUT_WORLD, PetscViewerCreate(), PetscViewerASCIIOpen(),
13728556b5ebSBarry Smith            PetscViewerMatlabOpen(), VecView(), DMView(), PetscViewerMatlabPutArray(), PETSCVIEWERASCII, PETSCVIEWERMATLAB, PETSCVIEWERDRAW,
137367918a83SBarry Smith            PetscViewerFileSetName(), PetscViewerFileSetMode(), PetscViewerFormat, PetscViewerType, PetscViewerSetType(),
137467918a83SBarry Smith            PetscViewerBinaryGetUseMPIIO(), PetscViewerBinarySetUseMPIIO()
13758556b5ebSBarry Smith 
13761b266c99SBarry Smith   Level: beginner
13771b266c99SBarry Smith 
13788556b5ebSBarry Smith M*/
13798556b5ebSBarry Smith 
13808cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_Binary(PetscViewer v)
13815c6c1daeSBarry Smith {
13825c6c1daeSBarry Smith   PetscErrorCode     ierr;
13835c6c1daeSBarry Smith   PetscViewer_Binary *vbinary;
13845c6c1daeSBarry Smith 
13855c6c1daeSBarry Smith   PetscFunctionBegin;
1386b00a9115SJed Brown   ierr                     = PetscNewLog(v,&vbinary);CHKERRQ(ierr);
13875c6c1daeSBarry Smith   v->data                  = (void*)vbinary;
138803a1d59fSDave May   v->ops->setfromoptions   = PetscViewerSetFromOptions_Binary;
13895c6c1daeSBarry Smith   v->ops->destroy          = PetscViewerDestroy_Binary;
13902bf49c77SBarry Smith   v->ops->view             = PetscViewerView_Binary;
1391c98fd787SBarry Smith   v->ops->setup            = PetscViewerSetUp_Binary;
1392c98fd787SBarry Smith   v->ops->flush            = NULL;
13935c6c1daeSBarry Smith   vbinary->fdes            = 0;
1394e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO)
1395e8a65b7dSLisandro Dalcin   vbinary->mfdes           = MPI_FILE_NULL;
1396e8a65b7dSLisandro Dalcin   vbinary->mfsub           = MPI_FILE_NULL;
1397e8a65b7dSLisandro Dalcin #endif
1398*02c9f0b5SLisandro Dalcin   vbinary->fdes_info       = NULL;
13995c6c1daeSBarry Smith   vbinary->skipinfo        = PETSC_FALSE;
14005c6c1daeSBarry Smith   vbinary->skipoptions     = PETSC_TRUE;
14015c6c1daeSBarry Smith   vbinary->skipheader      = PETSC_FALSE;
1402da07bb01SDave May   vbinary->setfromoptionscalled = PETSC_FALSE;
1403559f443fSBarry Smith   v->ops->getsubviewer     = PetscViewerGetSubViewer_Binary;
1404559f443fSBarry Smith   v->ops->restoresubviewer = PetscViewerRestoreSubViewer_Binary;
14051d641e7bSMichael Lange   v->ops->read             = PetscViewerBinaryRead;
14065c6c1daeSBarry Smith   vbinary->btype           = (PetscFileMode) -1;
14075c6c1daeSBarry Smith   vbinary->storecompressed = PETSC_FALSE;
1408f90597f1SStefano Zampini   vbinary->filename        = NULL;
1409f90597f1SStefano Zampini   vbinary->ogzfilename     = NULL;
14105c6c1daeSBarry Smith   vbinary->flowcontrol     = 256; /* seems a good number for Cray XT-5 */
14115c6c1daeSBarry Smith 
1412bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetFlowControl_C",PetscViewerBinaryGetFlowControl_Binary);CHKERRQ(ierr);
1413bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetFlowControl_C",PetscViewerBinarySetFlowControl_Binary);CHKERRQ(ierr);
1414bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetSkipHeader_C",PetscViewerBinarySetSkipHeader_Binary);CHKERRQ(ierr);
1415bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetSkipHeader_C",PetscViewerBinaryGetSkipHeader_Binary);CHKERRQ(ierr);
1416807ea322SDave May   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetSkipOptions_C",PetscViewerBinaryGetSkipOptions_Binary);CHKERRQ(ierr);
1417807ea322SDave May   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetSkipOptions_C",PetscViewerBinarySetSkipOptions_Binary);CHKERRQ(ierr);
1418807ea322SDave May   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetSkipInfo_C",PetscViewerBinaryGetSkipInfo_Binary);CHKERRQ(ierr);
1419807ea322SDave May   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetSkipInfo_C",PetscViewerBinarySetSkipInfo_Binary);CHKERRQ(ierr);
1420bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetInfoPointer_C",PetscViewerBinaryGetInfoPointer_Binary);CHKERRQ(ierr);
1421bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetName_C",PetscViewerFileSetName_Binary);CHKERRQ(ierr);
1422bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_Binary);CHKERRQ(ierr);
1423bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_Binary);CHKERRQ(ierr);
1424bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetName_C",PetscViewerFileGetName_Binary);CHKERRQ(ierr);
14255c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO)
1426bc196f7cSDave May   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinaryGetUseMPIIO_C",PetscViewerBinaryGetUseMPIIO_Binary);CHKERRQ(ierr);
1427bc196f7cSDave May   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerBinarySetUseMPIIO_C",PetscViewerBinarySetUseMPIIO_Binary);CHKERRQ(ierr);
14285c6c1daeSBarry Smith #endif
14295c6c1daeSBarry Smith   PetscFunctionReturn(0);
14305c6c1daeSBarry Smith }
14315c6c1daeSBarry Smith 
14325c6c1daeSBarry Smith /* ---------------------------------------------------------------------*/
14335c6c1daeSBarry Smith /*
14345c6c1daeSBarry Smith     The variable Petsc_Viewer_Binary_keyval is used to indicate an MPI attribute that
14355c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscViewer.
14365c6c1daeSBarry Smith */
1437d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Binary_keyval = MPI_KEYVAL_INVALID;
14385c6c1daeSBarry Smith 
14395c6c1daeSBarry Smith /*@C
14405c6c1daeSBarry Smith      PETSC_VIEWER_BINARY_ - Creates a binary PetscViewer shared by all processors
14415c6c1daeSBarry Smith                      in a communicator.
14425c6c1daeSBarry Smith 
1443d083f849SBarry Smith      Collective
14445c6c1daeSBarry Smith 
14455c6c1daeSBarry Smith      Input Parameter:
14465c6c1daeSBarry Smith .    comm - the MPI communicator to share the binary PetscViewer
14475c6c1daeSBarry Smith 
14485c6c1daeSBarry Smith      Level: intermediate
14495c6c1daeSBarry Smith 
14505c6c1daeSBarry Smith    Options Database Keys:
14515c6c1daeSBarry Smith +    -viewer_binary_filename <name>
14525c6c1daeSBarry Smith .    -viewer_binary_skip_info
1453a2d7db39SDave May .    -viewer_binary_skip_options
1454a2d7db39SDave May .    -viewer_binary_skip_header
1455a2d7db39SDave May -    -viewer_binary_mpiio
14565c6c1daeSBarry Smith 
14575c6c1daeSBarry Smith    Environmental variables:
14585c6c1daeSBarry Smith -   PETSC_VIEWER_BINARY_FILENAME
14595c6c1daeSBarry Smith 
14605c6c1daeSBarry Smith      Notes:
14615c6c1daeSBarry Smith      Unlike almost all other PETSc routines, PETSC_VIEWER_BINARY_ does not return
14625c6c1daeSBarry Smith      an error code.  The binary PetscViewer is usually used in the form
14635c6c1daeSBarry Smith $       XXXView(XXX object,PETSC_VIEWER_BINARY_(comm));
14645c6c1daeSBarry Smith 
14655c6c1daeSBarry Smith .seealso: PETSC_VIEWER_BINARY_WORLD, PETSC_VIEWER_BINARY_SELF, PetscViewerBinaryOpen(), PetscViewerCreate(),
14665c6c1daeSBarry Smith           PetscViewerDestroy()
14675c6c1daeSBarry Smith @*/
14685c6c1daeSBarry Smith PetscViewer PETSC_VIEWER_BINARY_(MPI_Comm comm)
14695c6c1daeSBarry Smith {
14705c6c1daeSBarry Smith   PetscErrorCode ierr;
14715c6c1daeSBarry Smith   PetscBool      flg;
14725c6c1daeSBarry Smith   PetscViewer    viewer;
14735c6c1daeSBarry Smith   char           fname[PETSC_MAX_PATH_LEN];
14745c6c1daeSBarry Smith   MPI_Comm       ncomm;
14755c6c1daeSBarry Smith 
14765c6c1daeSBarry Smith   PetscFunctionBegin;
1477*02c9f0b5SLisandro 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);}
14785c6c1daeSBarry Smith   if (Petsc_Viewer_Binary_keyval == MPI_KEYVAL_INVALID) {
1479*02c9f0b5SLisandro Dalcin     ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN,MPI_COMM_NULL_DELETE_FN,&Petsc_Viewer_Binary_keyval,NULL);
1480*02c9f0b5SLisandro Dalcin     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
14815c6c1daeSBarry Smith   }
148247435625SJed Brown   ierr = MPI_Comm_get_attr(ncomm,Petsc_Viewer_Binary_keyval,(void**)&viewer,(int*)&flg);
1483*02c9f0b5SLisandro Dalcin   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
14845c6c1daeSBarry Smith   if (!flg) { /* PetscViewer not yet created */
14855c6c1daeSBarry Smith     ierr = PetscOptionsGetenv(ncomm,"PETSC_VIEWER_BINARY_FILENAME",fname,PETSC_MAX_PATH_LEN,&flg);
1486*02c9f0b5SLisandro Dalcin     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
14875c6c1daeSBarry Smith     if (!flg) {
14885c6c1daeSBarry Smith       ierr = PetscStrcpy(fname,"binaryoutput");
1489*02c9f0b5SLisandro Dalcin       if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
14905c6c1daeSBarry Smith     }
14915c6c1daeSBarry Smith     ierr = PetscViewerBinaryOpen(ncomm,fname,FILE_MODE_WRITE,&viewer);
1492*02c9f0b5SLisandro Dalcin     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
14935c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
1494*02c9f0b5SLisandro Dalcin     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
149547435625SJed Brown     ierr = MPI_Comm_set_attr(ncomm,Petsc_Viewer_Binary_keyval,(void*)viewer);
1496*02c9f0b5SLisandro Dalcin     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
14975c6c1daeSBarry Smith   }
14985c6c1daeSBarry Smith   ierr = PetscCommDestroy(&ncomm);
1499*02c9f0b5SLisandro Dalcin   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_BINARY_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(NULL);}
15005c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
15015c6c1daeSBarry Smith }
1502