1af0996ceSBarry Smith #include <petsc/private/viewerimpl.h> /*I "petscviewer.h" I*/ 25c6c1daeSBarry Smith 376667918SBarry Smith /* 476667918SBarry Smith This needs to start the same as PetscViewer_Socket. 576667918SBarry Smith */ 65c6c1daeSBarry Smith typedef struct { 75c6c1daeSBarry Smith int fdes; /* file descriptor, ignored if using MPI IO */ 876667918SBarry Smith PetscInt flowcontrol; /* allow only <flowcontrol> messages outstanding at a time while doing IO */ 976667918SBarry Smith PetscBool skipheader; /* don't write header, only raw data */ 105c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO) 11bc196f7cSDave May PetscBool usempiio; 125c6c1daeSBarry Smith MPI_File mfdes; /* ignored unless using MPI IO */ 13e8a65b7dSLisandro Dalcin MPI_File mfsub; /* subviewer support */ 145c6c1daeSBarry Smith MPI_Offset moff; 155c6c1daeSBarry Smith #endif 16cc843e7aSLisandro Dalcin char *filename; /* file name */ 17cc843e7aSLisandro Dalcin PetscFileMode filemode; /* read/write/append mode */ 185c6c1daeSBarry Smith FILE *fdes_info; /* optional file containing info on binary file*/ 195c6c1daeSBarry Smith PetscBool storecompressed; /* gzip the write binary file when closing it*/ 20f90597f1SStefano Zampini char *ogzfilename; /* gzip can be run after the filename has been updated */ 215c6c1daeSBarry Smith PetscBool skipinfo; /* Don't create info file for writing; don't use for reading */ 225c6c1daeSBarry Smith PetscBool skipoptions; /* don't use PETSc options database when loading */ 23a261c58fSBarry Smith PetscBool matlabheaderwritten; /* if format is PETSC_VIEWER_BINARY_MATLAB has the MATLAB .info header been written yet */ 24c98fd787SBarry Smith PetscBool setfromoptionscalled; 255c6c1daeSBarry Smith } PetscViewer_Binary; 265c6c1daeSBarry Smith 27d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinaryClearFunctionList(PetscViewer v) 28d71ae5a4SJacob Faibussowitsch { 292e956fe4SStefano Zampini PetscFunctionBegin; 302e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetFlowControl_C", NULL)); 312e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinarySetFlowControl_C", NULL)); 322e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetSkipHeader_C", NULL)); 332e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinarySetSkipHeader_C", NULL)); 342e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetSkipOptions_C", NULL)); 352e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinarySetSkipOptions_C", NULL)); 362e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetSkipInfo_C", NULL)); 372e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinarySetSkipInfo_C", NULL)); 382e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetInfoPointer_C", NULL)); 392e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileGetName_C", NULL)); 402e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetName_C", NULL)); 412e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileGetMode_C", NULL)); 422e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetMode_C", NULL)); 432e956fe4SStefano Zampini #if defined(PETSC_HAVE_MPIIO) 442e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetUseMPIIO_C", NULL)); 452e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinarySetUseMPIIO_C", NULL)); 462e956fe4SStefano Zampini #endif 473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 482e956fe4SStefano Zampini } 492e956fe4SStefano Zampini 50cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 51d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinarySyncMPIIO(PetscViewer viewer) 52d71ae5a4SJacob Faibussowitsch { 53cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 54cc843e7aSLisandro Dalcin 55cc843e7aSLisandro Dalcin PetscFunctionBegin; 563ba16761SJacob Faibussowitsch if (vbinary->filemode == FILE_MODE_READ) PetscFunctionReturn(PETSC_SUCCESS); 5748a46eb9SPierre Jolivet if (vbinary->mfsub != MPI_FILE_NULL) PetscCallMPI(MPI_File_sync(vbinary->mfsub)); 58cc843e7aSLisandro Dalcin if (vbinary->mfdes != MPI_FILE_NULL) { 599566063dSJacob Faibussowitsch PetscCallMPI(MPI_Barrier(PetscObjectComm((PetscObject)viewer))); 609566063dSJacob Faibussowitsch PetscCallMPI(MPI_File_sync(vbinary->mfdes)); 61cc843e7aSLisandro Dalcin } 623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 63cc843e7aSLisandro Dalcin } 64cc843e7aSLisandro Dalcin #endif 65cc843e7aSLisandro Dalcin 66d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerGetSubViewer_Binary(PetscViewer viewer, MPI_Comm comm, PetscViewer *outviewer) 67d71ae5a4SJacob Faibussowitsch { 68e8a65b7dSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 69cc843e7aSLisandro Dalcin PetscMPIInt rank; 705c6c1daeSBarry Smith 715c6c1daeSBarry Smith PetscFunctionBegin; 729566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 73e8a65b7dSLisandro Dalcin 74e8a65b7dSLisandro Dalcin /* Return subviewer in process zero */ 759566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 76dd400576SPatrick Sanan if (rank == 0) { 77e5afcf28SBarry Smith PetscMPIInt flg; 78e5afcf28SBarry Smith 799566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_compare(PETSC_COMM_SELF, comm, &flg)); 80cc73adaaSBarry Smith PetscCheck(flg == MPI_IDENT || flg == MPI_CONGRUENT, PETSC_COMM_SELF, PETSC_ERR_SUP, "PetscViewerGetSubViewer() for PETSCVIEWERBINARY requires a singleton MPI_Comm"); 819566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, outviewer)); 829566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(*outviewer, PETSCVIEWERBINARY)); 839566063dSJacob Faibussowitsch PetscCall(PetscMemcpy((*outviewer)->data, vbinary, sizeof(PetscViewer_Binary))); 8412f4c3a9SLisandro Dalcin (*outviewer)->setupcalled = PETSC_TRUE; 8596509d17SLisandro Dalcin } else { 8696509d17SLisandro Dalcin *outviewer = NULL; 8796509d17SLisandro Dalcin } 88e8a65b7dSLisandro Dalcin 89e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 90e8a65b7dSLisandro Dalcin if (vbinary->usempiio && *outviewer) { 91e8a65b7dSLisandro Dalcin PetscViewer_Binary *obinary = (PetscViewer_Binary *)(*outviewer)->data; 92e8a65b7dSLisandro Dalcin /* Parent viewer opens a new MPI file handle on PETSC_COMM_SELF and keeps track of it for future reuse */ 93e8a65b7dSLisandro Dalcin if (vbinary->mfsub == MPI_FILE_NULL) { 94e8a65b7dSLisandro Dalcin int amode; 95cc843e7aSLisandro Dalcin switch (vbinary->filemode) { 96d71ae5a4SJacob Faibussowitsch case FILE_MODE_READ: 97d71ae5a4SJacob Faibussowitsch amode = MPI_MODE_RDONLY; 98d71ae5a4SJacob Faibussowitsch break; 99d71ae5a4SJacob Faibussowitsch case FILE_MODE_WRITE: 100d71ae5a4SJacob Faibussowitsch amode = MPI_MODE_WRONLY; 101d71ae5a4SJacob Faibussowitsch break; 102d71ae5a4SJacob Faibussowitsch case FILE_MODE_APPEND: 103d71ae5a4SJacob Faibussowitsch amode = MPI_MODE_WRONLY; 104d71ae5a4SJacob Faibussowitsch break; 105d71ae5a4SJacob Faibussowitsch default: 106d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Unsupported file mode %s", PetscFileModes[vbinary->filemode]); 107e8a65b7dSLisandro Dalcin } 1089566063dSJacob Faibussowitsch PetscCallMPI(MPI_File_open(PETSC_COMM_SELF, vbinary->filename, amode, MPI_INFO_NULL, &vbinary->mfsub)); 109e8a65b7dSLisandro Dalcin } 110e8a65b7dSLisandro Dalcin /* Subviewer gets the MPI file handle on PETSC_COMM_SELF */ 111e8a65b7dSLisandro Dalcin obinary->mfdes = vbinary->mfsub; 112e8a65b7dSLisandro Dalcin obinary->mfsub = MPI_FILE_NULL; 113e8a65b7dSLisandro Dalcin obinary->moff = vbinary->moff; 114e8a65b7dSLisandro Dalcin } 115e8a65b7dSLisandro Dalcin #endif 116cc843e7aSLisandro Dalcin 117cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 1189566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySyncMPIIO(viewer)); 119cc843e7aSLisandro Dalcin #endif 1203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1215c6c1daeSBarry Smith } 1225c6c1daeSBarry Smith 123d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerRestoreSubViewer_Binary(PetscViewer viewer, MPI_Comm comm, PetscViewer *outviewer) 124d71ae5a4SJacob Faibussowitsch { 125e8a65b7dSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 126cc843e7aSLisandro Dalcin PetscMPIInt rank; 127e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 128e8a65b7dSLisandro Dalcin MPI_Offset moff = 0; 129e8a65b7dSLisandro Dalcin #endif 1305c6c1daeSBarry Smith 1315c6c1daeSBarry Smith PetscFunctionBegin; 1329566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 133c5853193SPierre Jolivet PetscCheck(rank == 0 || !*outviewer, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Subviewer not obtained from viewer"); 134e8a65b7dSLisandro Dalcin 135e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 136e8a65b7dSLisandro Dalcin if (vbinary->usempiio && *outviewer) { 137e8a65b7dSLisandro Dalcin PetscViewer_Binary *obinary = (PetscViewer_Binary *)(*outviewer)->data; 13808401ef6SPierre Jolivet PetscCheck(obinary->mfdes == vbinary->mfsub, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Subviewer not obtained from viewer"); 1399566063dSJacob Faibussowitsch if (obinary->mfsub != MPI_FILE_NULL) PetscCallMPI(MPI_File_close(&obinary->mfsub)); 140e8a65b7dSLisandro Dalcin moff = obinary->moff; 141e8a65b7dSLisandro Dalcin } 142e8a65b7dSLisandro Dalcin #endif 143e8a65b7dSLisandro Dalcin 144e8a65b7dSLisandro Dalcin if (*outviewer) { 145e8a65b7dSLisandro Dalcin PetscViewer_Binary *obinary = (PetscViewer_Binary *)(*outviewer)->data; 14608401ef6SPierre Jolivet PetscCheck(obinary->fdes == vbinary->fdes, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Subviewer not obtained from viewer"); 1479566063dSJacob Faibussowitsch PetscCall(PetscFree((*outviewer)->data)); 1482e956fe4SStefano Zampini PetscCall(PetscViewerBinaryClearFunctionList(*outviewer)); 1499566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(outviewer)); 1505c6c1daeSBarry Smith } 151e8a65b7dSLisandro Dalcin 152e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 153e8a65b7dSLisandro Dalcin if (vbinary->usempiio) { 154e8a65b7dSLisandro Dalcin PetscInt64 ioff = (PetscInt64)moff; /* We could use MPI_OFFSET datatype (requires MPI 2.2) */ 1559566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&ioff, 1, MPIU_INT64, 0, PetscObjectComm((PetscObject)viewer))); 156e8a65b7dSLisandro Dalcin vbinary->moff = (MPI_Offset)ioff; 157e8a65b7dSLisandro Dalcin } 158e8a65b7dSLisandro Dalcin #endif 159cc843e7aSLisandro Dalcin 160cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 1619566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySyncMPIIO(viewer)); 162cc843e7aSLisandro Dalcin #endif 1633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1645c6c1daeSBarry Smith } 1655c6c1daeSBarry Smith 1665c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO) 1675c6c1daeSBarry Smith /*@C 16885b8072bSPatrick Sanan PetscViewerBinaryGetMPIIOOffset - Gets the current global offset that should be passed to `MPI_File_set_view()` or `MPI_File_{write|read}_at[_all]()` 1695c6c1daeSBarry Smith 170cf53795eSBarry Smith Not Collective; No Fortran Support 1715c6c1daeSBarry Smith 1725c6c1daeSBarry Smith Input Parameter: 173c410d8ccSBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 1745c6c1daeSBarry Smith 1755c6c1daeSBarry Smith Output Parameter: 17622a8f86cSLisandro Dalcin . off - the current global offset 1775c6c1daeSBarry Smith 1785c6c1daeSBarry Smith Level: advanced 1795c6c1daeSBarry Smith 180811af0c4SBarry Smith Note: 181811af0c4SBarry Smith Use `PetscViewerBinaryAddMPIIOOffset()` to increase this value after you have written a view. 182811af0c4SBarry Smith 183d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinaryGetUseMPIIO()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryAddMPIIOOffset()` 1845c6c1daeSBarry Smith @*/ 185d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryGetMPIIOOffset(PetscViewer viewer, MPI_Offset *off) 186d71ae5a4SJacob Faibussowitsch { 18722a8f86cSLisandro Dalcin PetscViewer_Binary *vbinary; 1885c6c1daeSBarry Smith 1895c6c1daeSBarry Smith PetscFunctionBegin; 19022a8f86cSLisandro Dalcin PetscValidHeaderSpecificType(viewer, PETSC_VIEWER_CLASSID, 1, PETSCVIEWERBINARY); 19122a8f86cSLisandro Dalcin PetscValidPointer(off, 2); 19222a8f86cSLisandro Dalcin vbinary = (PetscViewer_Binary *)viewer->data; 1935c6c1daeSBarry Smith *off = vbinary->moff; 1943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1955c6c1daeSBarry Smith } 1965c6c1daeSBarry Smith 1975c6c1daeSBarry Smith /*@C 19822a8f86cSLisandro Dalcin PetscViewerBinaryAddMPIIOOffset - Adds to the current global offset 1995c6c1daeSBarry Smith 200cf53795eSBarry Smith Logically Collective; No Fortran Support 2015c6c1daeSBarry Smith 2025c6c1daeSBarry Smith Input Parameters: 203811af0c4SBarry Smith + viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 20422a8f86cSLisandro Dalcin - off - the addition to the global offset 2055c6c1daeSBarry Smith 2065c6c1daeSBarry Smith Level: advanced 2075c6c1daeSBarry Smith 208811af0c4SBarry Smith Note: 209811af0c4SBarry Smith Use `PetscViewerBinaryGetMPIIOOffset()` to get the value that you should pass to `MPI_File_set_view()` or `MPI_File_{write|read}_at[_all]()` 210811af0c4SBarry Smith 211d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinaryGetUseMPIIO()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryGetMPIIOOffset()` 2125c6c1daeSBarry Smith @*/ 213d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryAddMPIIOOffset(PetscViewer viewer, MPI_Offset off) 214d71ae5a4SJacob Faibussowitsch { 21522a8f86cSLisandro Dalcin PetscViewer_Binary *vbinary; 2165c6c1daeSBarry Smith 2175c6c1daeSBarry Smith PetscFunctionBegin; 21822a8f86cSLisandro Dalcin PetscValidHeaderSpecificType(viewer, PETSC_VIEWER_CLASSID, 1, PETSCVIEWERBINARY); 21922a8f86cSLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, (PetscInt)off, 2); 22022a8f86cSLisandro Dalcin vbinary = (PetscViewer_Binary *)viewer->data; 2215c6c1daeSBarry Smith vbinary->moff += off; 2223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2235c6c1daeSBarry Smith } 2245c6c1daeSBarry Smith 2255c6c1daeSBarry Smith /*@C 226811af0c4SBarry Smith PetscViewerBinaryGetMPIIODescriptor - Extracts the MPI IO file descriptor from a `PetscViewer`. 2275c6c1daeSBarry Smith 228cf53795eSBarry Smith Not Collective; No Fortran Support 2295c6c1daeSBarry Smith 2305c6c1daeSBarry Smith Input Parameter: 231811af0c4SBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 2325c6c1daeSBarry Smith 2335c6c1daeSBarry Smith Output Parameter: 2345c6c1daeSBarry Smith . fdes - file descriptor 2355c6c1daeSBarry Smith 2365c6c1daeSBarry Smith Level: advanced 2375c6c1daeSBarry Smith 238d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinaryGetUseMPIIO()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryGetMPIIOOffset()` 2395c6c1daeSBarry Smith @*/ 240d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryGetMPIIODescriptor(PetscViewer viewer, MPI_File *fdes) 241d71ae5a4SJacob Faibussowitsch { 24222a8f86cSLisandro Dalcin PetscViewer_Binary *vbinary; 2435c6c1daeSBarry Smith 2445c6c1daeSBarry Smith PetscFunctionBegin; 24522a8f86cSLisandro Dalcin PetscValidHeaderSpecificType(viewer, PETSC_VIEWER_CLASSID, 1, PETSCVIEWERBINARY); 24622a8f86cSLisandro Dalcin PetscValidPointer(fdes, 2); 2479566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 24822a8f86cSLisandro Dalcin vbinary = (PetscViewer_Binary *)viewer->data; 2495c6c1daeSBarry Smith *fdes = vbinary->mfdes; 2503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2515c6c1daeSBarry Smith } 252cc843e7aSLisandro Dalcin #endif 2535c6c1daeSBarry Smith 254cc843e7aSLisandro Dalcin /*@ 255cc843e7aSLisandro Dalcin PetscViewerBinarySetUseMPIIO - Sets a binary viewer to use MPI-IO for reading/writing. Must be called 256811af0c4SBarry Smith before `PetscViewerFileSetName()` 257cc843e7aSLisandro Dalcin 258c3339decSBarry Smith Logically Collective 259cc843e7aSLisandro Dalcin 260cc843e7aSLisandro Dalcin Input Parameters: 261811af0c4SBarry Smith + viewer - the `PetscViewer`; must be a `PETSCVIEWERBINARY` 262811af0c4SBarry Smith - use - `PETSC_TRUE` means MPI-IO will be used 263cc843e7aSLisandro Dalcin 264811af0c4SBarry Smith Options Database Key: 265*38b83642SBarry Smith . -viewer_binary_mpiio - <true or false> flag for using MPI-IO 266cc843e7aSLisandro Dalcin 267cc843e7aSLisandro Dalcin Level: advanced 268cc843e7aSLisandro Dalcin 269d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerFileSetMode()`, `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerBinaryOpen()`, 270db781477SPatrick Sanan `PetscViewerBinaryGetUseMPIIO()` 271cc843e7aSLisandro Dalcin @*/ 272d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinarySetUseMPIIO(PetscViewer viewer, PetscBool use) 273d71ae5a4SJacob Faibussowitsch { 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)); 2783ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 279cc843e7aSLisandro Dalcin } 280cc843e7aSLisandro Dalcin 281cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 282d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinarySetUseMPIIO_Binary(PetscViewer viewer, PetscBool use) 283d71ae5a4SJacob Faibussowitsch { 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; 2883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 289a8aae444SDave May } 290a8aae444SDave May #endif 291a8aae444SDave May 292cc843e7aSLisandro Dalcin /*@ 2933f423023SBarry Smith PetscViewerBinaryGetUseMPIIO - Returns `PETSC_TRUE` if the binary viewer uses MPI-IO. 2945c6c1daeSBarry Smith 2955c6c1daeSBarry Smith Not Collective 2965c6c1daeSBarry Smith 2975c6c1daeSBarry Smith Input Parameter: 298811af0c4SBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()`; must be a `PETSCVIEWERBINARY` 2995c6c1daeSBarry Smith 3005c6c1daeSBarry Smith Output Parameter: 301811af0c4SBarry Smith . use - `PETSC_TRUE` if MPI-IO is being used 3025c6c1daeSBarry Smith 3035c6c1daeSBarry Smith Level: advanced 3045c6c1daeSBarry Smith 305bc196f7cSDave May Note: 3063f423023SBarry Smith If MPI-IO is not available, this function will always return `PETSC_FALSE` 307bc196f7cSDave May 308d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryGetMPIIOOffset()` 3095c6c1daeSBarry Smith @*/ 310d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryGetUseMPIIO(PetscViewer viewer, PetscBool *use) 311d71ae5a4SJacob Faibussowitsch { 3125c6c1daeSBarry Smith PetscFunctionBegin; 313cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 314cc843e7aSLisandro Dalcin PetscValidBoolPointer(use, 2); 315cc843e7aSLisandro Dalcin *use = PETSC_FALSE; 316cac4c232SBarry Smith PetscTryMethod(viewer, "PetscViewerBinaryGetUseMPIIO_C", (PetscViewer, PetscBool *), (viewer, use)); 3173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3185c6c1daeSBarry Smith } 3195c6c1daeSBarry Smith 320cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 321d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinaryGetUseMPIIO_Binary(PetscViewer viewer, PetscBool *use) 322d71ae5a4SJacob Faibussowitsch { 3235c6c1daeSBarry Smith PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 3245c6c1daeSBarry Smith 3255c6c1daeSBarry Smith PetscFunctionBegin; 326cc843e7aSLisandro Dalcin *use = vbinary->usempiio; 3273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 328cc843e7aSLisandro Dalcin } 329cc843e7aSLisandro Dalcin #endif 330cc843e7aSLisandro Dalcin 331cc843e7aSLisandro Dalcin /*@ 332c410d8ccSBarry Smith PetscViewerBinarySetFlowControl - Sets how many messages are allowed to be outstanding at the same time during parallel IO reads/writes 333cc843e7aSLisandro Dalcin 334cc843e7aSLisandro Dalcin Not Collective 335cc843e7aSLisandro Dalcin 336d8d19677SJose E. Roman Input Parameters: 337c410d8ccSBarry Smith + viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 338cc843e7aSLisandro Dalcin - fc - the number of messages, defaults to 256 if this function was not called 339cc843e7aSLisandro Dalcin 340cc843e7aSLisandro Dalcin Level: advanced 341cc843e7aSLisandro Dalcin 342d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinaryGetFlowControl()` 343cc843e7aSLisandro Dalcin @*/ 344d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinarySetFlowControl(PetscViewer viewer, PetscInt fc) 345d71ae5a4SJacob Faibussowitsch { 346cc843e7aSLisandro Dalcin PetscFunctionBegin; 347cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 348cc843e7aSLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, fc, 2); 349cac4c232SBarry Smith PetscTryMethod(viewer, "PetscViewerBinarySetFlowControl_C", (PetscViewer, PetscInt), (viewer, fc)); 3503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3515c6c1daeSBarry Smith } 3525c6c1daeSBarry Smith 353d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinarySetFlowControl_Binary(PetscViewer viewer, PetscInt fc) 354d71ae5a4SJacob Faibussowitsch { 355cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 356cc843e7aSLisandro Dalcin 357cc843e7aSLisandro Dalcin PetscFunctionBegin; 35808401ef6SPierre Jolivet PetscCheck(fc > 1, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ARG_OUTOFRANGE, "Flow control count must be greater than 1, %" PetscInt_FMT " was set", fc); 359cc843e7aSLisandro Dalcin vbinary->flowcontrol = fc; 3603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 361cc843e7aSLisandro Dalcin } 362cc843e7aSLisandro Dalcin 363cc843e7aSLisandro Dalcin /*@ 364c410d8ccSBarry Smith PetscViewerBinaryGetFlowControl - Returns how many messages are allowed to be outstanding at the same time during parallel IO reads/writes 3655c6c1daeSBarry Smith 3665c6c1daeSBarry Smith Not Collective 3675c6c1daeSBarry Smith 3685c6c1daeSBarry Smith Input Parameter: 369811af0c4SBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 3705c6c1daeSBarry Smith 3715c6c1daeSBarry Smith Output Parameter: 3725c6c1daeSBarry Smith . fc - the number of messages 3735c6c1daeSBarry Smith 3745c6c1daeSBarry Smith Level: advanced 3755c6c1daeSBarry Smith 376d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()`, `PetscViewerBinarySetFlowControl()` 3775c6c1daeSBarry Smith @*/ 378d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryGetFlowControl(PetscViewer viewer, PetscInt *fc) 379d71ae5a4SJacob Faibussowitsch { 3805c6c1daeSBarry Smith PetscFunctionBegin; 381cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 382cc843e7aSLisandro Dalcin PetscValidIntPointer(fc, 2); 383cac4c232SBarry Smith PetscUseMethod(viewer, "PetscViewerBinaryGetFlowControl_C", (PetscViewer, PetscInt *), (viewer, fc)); 3843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3855c6c1daeSBarry Smith } 3865c6c1daeSBarry Smith 38776667918SBarry Smith PETSC_INTERN PetscErrorCode PetscViewerBinaryGetFlowControl_Binary(PetscViewer viewer, PetscInt *fc) 388d71ae5a4SJacob Faibussowitsch { 3895c6c1daeSBarry Smith PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 3905c6c1daeSBarry Smith 3915c6c1daeSBarry Smith PetscFunctionBegin; 392cc843e7aSLisandro Dalcin *fc = vbinary->flowcontrol; 3933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3945c6c1daeSBarry Smith } 3955c6c1daeSBarry Smith 3965c6c1daeSBarry Smith /*@C 397811af0c4SBarry Smith PetscViewerBinaryGetDescriptor - Extracts the file descriptor from a `PetscViewer` of `PetscViewerType` `PETSCVIEWERBINARY`. 3985c6c1daeSBarry Smith 399cd05f99aSJacob Faibussowitsch Collective because it may trigger a `PetscViewerSetUp()` call; No Fortran Support 4005c6c1daeSBarry Smith 4015c6c1daeSBarry Smith Input Parameter: 402811af0c4SBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 4035c6c1daeSBarry Smith 4045c6c1daeSBarry Smith Output Parameter: 4055c6c1daeSBarry Smith . fdes - file descriptor 4065c6c1daeSBarry Smith 4075c6c1daeSBarry Smith Level: advanced 4085c6c1daeSBarry Smith 409811af0c4SBarry Smith Note: 410811af0c4SBarry Smith For writable binary `PetscViewer`s, the descriptor will only be valid for the 411811af0c4SBarry Smith first processor in the communicator that shares the `PetscViewer`. For readable 412c410d8ccSBarry Smith files it will only be valid on processes that have the file. If MPI rank 0 does not 413c410d8ccSBarry Smith have the file it generates an error even if another MPI process does have the file. 4145c6c1daeSBarry Smith 415d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetInfoPointer()` 4165c6c1daeSBarry Smith @*/ 417d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryGetDescriptor(PetscViewer viewer, int *fdes) 418d71ae5a4SJacob Faibussowitsch { 41922a8f86cSLisandro Dalcin PetscViewer_Binary *vbinary; 4205c6c1daeSBarry Smith 4215c6c1daeSBarry Smith PetscFunctionBegin; 42222a8f86cSLisandro Dalcin PetscValidHeaderSpecificType(viewer, PETSC_VIEWER_CLASSID, 1, PETSCVIEWERBINARY); 42322a8f86cSLisandro Dalcin PetscValidPointer(fdes, 2); 4249566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 42522a8f86cSLisandro Dalcin vbinary = (PetscViewer_Binary *)viewer->data; 4265c6c1daeSBarry Smith *fdes = vbinary->fdes; 4273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4285c6c1daeSBarry Smith } 4295c6c1daeSBarry Smith 4305c6c1daeSBarry Smith /*@ 431c410d8ccSBarry Smith PetscViewerBinarySkipInfo - Binary file will not have `.info` file created with it 4325c6c1daeSBarry Smith 4335c6c1daeSBarry Smith Not Collective 4345c6c1daeSBarry Smith 435fd292e60Sprj- Input Parameter: 436811af0c4SBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerCreate()` 4375c6c1daeSBarry Smith 4385c6c1daeSBarry Smith Options Database Key: 439c410d8ccSBarry Smith . -viewer_binary_skip_info - true indicates do not generate `.info` file 4405c6c1daeSBarry Smith 4415c6c1daeSBarry Smith Level: advanced 4425c6c1daeSBarry Smith 44395452b02SPatrick Sanan Notes: 444811af0c4SBarry Smith This must be called after `PetscViewerSetType()`. If you use `PetscViewerBinaryOpen()` then 4453f423023SBarry Smith you can only skip the info file with the `-viewer_binary_skip_info` flag. To use the function you must open the 446811af0c4SBarry Smith viewer with `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerBinarySkipInfo()`. 4475c6c1daeSBarry Smith 448c410d8ccSBarry Smith The `.info` files contains meta information about the data in the binary file, for example the block size if it was 4495c6c1daeSBarry Smith set for a vector or matrix. 4505c6c1daeSBarry Smith 451811af0c4SBarry Smith This routine is deprecated, use `PetscViewerBinarySetSkipInfo()` 452811af0c4SBarry Smith 453d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySetSkipOptions()`, 454db781477SPatrick Sanan `PetscViewerBinaryGetSkipOptions()`, `PetscViewerBinaryGetSkipInfo()` 4555c6c1daeSBarry Smith @*/ 456d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinarySkipInfo(PetscViewer viewer) 457d71ae5a4SJacob Faibussowitsch { 4585c6c1daeSBarry Smith PetscFunctionBegin; 4599566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(viewer, PETSC_TRUE)); 4603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 461807ea322SDave May } 462807ea322SDave May 463807ea322SDave May /*@ 464c410d8ccSBarry Smith PetscViewerBinarySetSkipInfo - Binary file will not have `.info` file created with it 465807ea322SDave May 466807ea322SDave May Not Collective 467807ea322SDave May 468d8d19677SJose E. Roman Input Parameters: 4693f423023SBarry Smith + viewer - PetscViewer context, obtained from `PetscViewerCreate()` 470c410d8ccSBarry Smith - skip - `PETSC_TRUE` implies the `.info` file will not be generated 471807ea322SDave May 472807ea322SDave May Options Database Key: 473c410d8ccSBarry Smith . -viewer_binary_skip_info - true indicates do not generate `.info` file 474807ea322SDave May 475807ea322SDave May Level: advanced 476807ea322SDave May 477c410d8ccSBarry Smith Notes: 478c410d8ccSBarry Smith This must be called after `PetscViewerSetType()`. If you use `PetscViewerBinaryOpen()` then 479c410d8ccSBarry Smith you can only skip the info file with the `-viewer_binary_skip_info` flag. To use the function you must open the 480c410d8ccSBarry Smith viewer with `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerBinarySkipInfo()`. 481c410d8ccSBarry Smith 482c410d8ccSBarry Smith The `.info` file contains meta information about the data in the binary file, for example the block size if it was 483c410d8ccSBarry Smith set for a vector or matrix. 484c410d8ccSBarry Smith 485d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySetSkipOptions()`, 486c410d8ccSBarry Smith `PetscViewerBinaryGetSkipOptions()`, `PetscViewerBinaryGetSkipInfo()`, `PetscViewerBinaryGetInfoPointer()` 487807ea322SDave May @*/ 488d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinarySetSkipInfo(PetscViewer viewer, PetscBool skip) 489d71ae5a4SJacob Faibussowitsch { 490807ea322SDave May PetscFunctionBegin; 491cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 492cc843e7aSLisandro Dalcin PetscValidLogicalCollectiveBool(viewer, skip, 2); 493cac4c232SBarry Smith PetscTryMethod(viewer, "PetscViewerBinarySetSkipInfo_C", (PetscViewer, PetscBool), (viewer, skip)); 4943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 495807ea322SDave May } 496807ea322SDave May 497d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinarySetSkipInfo_Binary(PetscViewer viewer, PetscBool skip) 498d71ae5a4SJacob Faibussowitsch { 499807ea322SDave May PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 500807ea322SDave May 501807ea322SDave May PetscFunctionBegin; 502cc843e7aSLisandro Dalcin vbinary->skipinfo = skip; 5033ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 504807ea322SDave May } 505807ea322SDave May 506807ea322SDave May /*@ 507c410d8ccSBarry Smith PetscViewerBinaryGetSkipInfo - check if viewer wrote a `.info` file 508807ea322SDave May 509807ea322SDave May Not Collective 510807ea322SDave May 511807ea322SDave May Input Parameter: 512811af0c4SBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 513807ea322SDave May 514807ea322SDave May Output Parameter: 515c410d8ccSBarry Smith . skip - `PETSC_TRUE` implies the `.info` file was not generated 516807ea322SDave May 517807ea322SDave May Level: advanced 518807ea322SDave May 519811af0c4SBarry Smith Note: 520811af0c4SBarry Smith This must be called after `PetscViewerSetType()` 521807ea322SDave May 522d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, 523c410d8ccSBarry Smith `PetscViewerBinarySetSkipOptions()`, `PetscViewerBinarySetSkipInfo()`, `PetscViewerBinaryGetInfoPointer()` 524807ea322SDave May @*/ 525d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryGetSkipInfo(PetscViewer viewer, PetscBool *skip) 526d71ae5a4SJacob Faibussowitsch { 527807ea322SDave May PetscFunctionBegin; 528cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 529cc843e7aSLisandro Dalcin PetscValidBoolPointer(skip, 2); 530cac4c232SBarry Smith PetscUseMethod(viewer, "PetscViewerBinaryGetSkipInfo_C", (PetscViewer, PetscBool *), (viewer, skip)); 5313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 532807ea322SDave May } 533807ea322SDave May 534d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinaryGetSkipInfo_Binary(PetscViewer viewer, PetscBool *skip) 535d71ae5a4SJacob Faibussowitsch { 536807ea322SDave May PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 537807ea322SDave May 538807ea322SDave May PetscFunctionBegin; 539cc843e7aSLisandro Dalcin *skip = vbinary->skipinfo; 5403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 541807ea322SDave May } 542807ea322SDave May 5435c6c1daeSBarry Smith /*@ 544c410d8ccSBarry Smith PetscViewerBinarySetSkipOptions - do not use values in the PETSc options database when loading objects 5455c6c1daeSBarry Smith 5465c6c1daeSBarry Smith Not Collective 5475c6c1daeSBarry Smith 5485c6c1daeSBarry Smith Input Parameters: 549811af0c4SBarry Smith + viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 550811af0c4SBarry Smith - skip - `PETSC_TRUE` means do not use the options from the options database 5515c6c1daeSBarry Smith 5525c6c1daeSBarry Smith Options Database Key: 553811af0c4SBarry Smith . -viewer_binary_skip_options <true or false> - true means do not use the options from the options database 5545c6c1daeSBarry Smith 5555c6c1daeSBarry Smith Level: advanced 5565c6c1daeSBarry Smith 557811af0c4SBarry Smith Note: 558811af0c4SBarry Smith This must be called after `PetscViewerSetType()` 5595c6c1daeSBarry Smith 560d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySkipInfo()`, 561db781477SPatrick Sanan `PetscViewerBinaryGetSkipOptions()` 5625c6c1daeSBarry Smith @*/ 563d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinarySetSkipOptions(PetscViewer viewer, PetscBool skip) 564d71ae5a4SJacob Faibussowitsch { 5655c6c1daeSBarry Smith PetscFunctionBegin; 566cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 567cc843e7aSLisandro Dalcin PetscValidLogicalCollectiveBool(viewer, skip, 2); 568cac4c232SBarry Smith PetscTryMethod(viewer, "PetscViewerBinarySetSkipOptions_C", (PetscViewer, PetscBool), (viewer, skip)); 5693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 570807ea322SDave May } 571807ea322SDave May 572d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinarySetSkipOptions_Binary(PetscViewer viewer, PetscBool skip) 573d71ae5a4SJacob Faibussowitsch { 574cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 575807ea322SDave May 576807ea322SDave May PetscFunctionBegin; 577cc843e7aSLisandro Dalcin vbinary->skipoptions = skip; 5783ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5795c6c1daeSBarry Smith } 5805c6c1daeSBarry Smith 5815c6c1daeSBarry Smith /*@ 5825c6c1daeSBarry Smith PetscViewerBinaryGetSkipOptions - checks if viewer uses the PETSc options database when loading objects 5835c6c1daeSBarry Smith 5845c6c1daeSBarry Smith Not Collective 5855c6c1daeSBarry Smith 5865c6c1daeSBarry Smith Input Parameter: 587811af0c4SBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 5885c6c1daeSBarry Smith 5895c6c1daeSBarry Smith Output Parameter: 590811af0c4SBarry Smith . skip - `PETSC_TRUE` means do not use 5915c6c1daeSBarry Smith 5925c6c1daeSBarry Smith Level: advanced 5935c6c1daeSBarry Smith 594811af0c4SBarry Smith Note: 595811af0c4SBarry Smith This must be called after `PetscViewerSetType()` 5965c6c1daeSBarry Smith 597d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySkipInfo()`, 598db781477SPatrick Sanan `PetscViewerBinarySetSkipOptions()` 5995c6c1daeSBarry Smith @*/ 600d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryGetSkipOptions(PetscViewer viewer, PetscBool *skip) 601d71ae5a4SJacob Faibussowitsch { 6025c6c1daeSBarry Smith PetscFunctionBegin; 603cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 604cc843e7aSLisandro Dalcin PetscValidBoolPointer(skip, 2); 605cac4c232SBarry Smith PetscUseMethod(viewer, "PetscViewerBinaryGetSkipOptions_C", (PetscViewer, PetscBool *), (viewer, skip)); 6063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6075c6c1daeSBarry Smith } 6085c6c1daeSBarry Smith 609d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinaryGetSkipOptions_Binary(PetscViewer viewer, PetscBool *skip) 610d71ae5a4SJacob Faibussowitsch { 611d21b9a37SPierre Jolivet PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 6125c6c1daeSBarry Smith 6135c6c1daeSBarry Smith PetscFunctionBegin; 614cc843e7aSLisandro Dalcin *skip = vbinary->skipoptions; 6153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6165c6c1daeSBarry Smith } 6175c6c1daeSBarry Smith 6185c6c1daeSBarry Smith /*@ 6195c6c1daeSBarry Smith PetscViewerBinarySetSkipHeader - do not write a header with size information on output, just raw data 6205c6c1daeSBarry Smith 6215c6c1daeSBarry Smith Not Collective 6225c6c1daeSBarry Smith 6235c6c1daeSBarry Smith Input Parameters: 624811af0c4SBarry Smith + viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 625811af0c4SBarry Smith - skip - `PETSC_TRUE` means do not write header 6265c6c1daeSBarry Smith 6275c6c1daeSBarry Smith Options Database Key: 628811af0c4SBarry Smith . -viewer_binary_skip_header <true or false> - true means do not write header 6295c6c1daeSBarry Smith 6305c6c1daeSBarry Smith Level: advanced 6315c6c1daeSBarry Smith 632c410d8ccSBarry Smith Notes: 633811af0c4SBarry Smith This must be called after `PetscViewerSetType()` 6345c6c1daeSBarry Smith 635c410d8ccSBarry Smith If this option is selected, the output file cannot be read with the `XXXLoad()` such as `VecLoad()` 636c410d8ccSBarry Smith 637d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySkipInfo()`, 638db781477SPatrick Sanan `PetscViewerBinaryGetSkipHeader()` 6395c6c1daeSBarry Smith @*/ 640d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinarySetSkipHeader(PetscViewer viewer, PetscBool skip) 641d71ae5a4SJacob Faibussowitsch { 6425c6c1daeSBarry Smith PetscFunctionBegin; 643cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 644cc843e7aSLisandro Dalcin PetscValidLogicalCollectiveBool(viewer, skip, 2); 645cac4c232SBarry Smith PetscTryMethod(viewer, "PetscViewerBinarySetSkipHeader_C", (PetscViewer, PetscBool), (viewer, skip)); 6463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6475c6c1daeSBarry Smith } 6485c6c1daeSBarry Smith 649d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinarySetSkipHeader_Binary(PetscViewer viewer, PetscBool skip) 650d71ae5a4SJacob Faibussowitsch { 6515c6c1daeSBarry Smith PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 6525c6c1daeSBarry Smith 6535c6c1daeSBarry Smith PetscFunctionBegin; 654cc843e7aSLisandro Dalcin vbinary->skipheader = skip; 6553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6565c6c1daeSBarry Smith } 6575c6c1daeSBarry Smith 6585c6c1daeSBarry Smith /*@ 6595c6c1daeSBarry Smith PetscViewerBinaryGetSkipHeader - checks whether to write a header with size information on output, or just raw data 6605c6c1daeSBarry Smith 6615c6c1daeSBarry Smith Not Collective 6625c6c1daeSBarry Smith 6635c6c1daeSBarry Smith Input Parameter: 664811af0c4SBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 6655c6c1daeSBarry Smith 6665c6c1daeSBarry Smith Output Parameter: 667811af0c4SBarry Smith . skip - `PETSC_TRUE` means do not write header 6685c6c1daeSBarry Smith 6695c6c1daeSBarry Smith Level: advanced 6705c6c1daeSBarry Smith 67195452b02SPatrick Sanan Notes: 67295452b02SPatrick Sanan This must be called after PetscViewerSetType() 6735c6c1daeSBarry Smith 674811af0c4SBarry Smith Returns `PETSC_FALSE` for `PETSCSOCKETVIEWER`, you cannot skip the header for it. 6755c6c1daeSBarry Smith 676d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinarySkipInfo()`, 677db781477SPatrick Sanan `PetscViewerBinarySetSkipHeader()` 6785c6c1daeSBarry Smith @*/ 679d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryGetSkipHeader(PetscViewer viewer, PetscBool *skip) 680d71ae5a4SJacob Faibussowitsch { 6815c6c1daeSBarry Smith PetscFunctionBegin; 682cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 683cc843e7aSLisandro Dalcin PetscValidBoolPointer(skip, 2); 684cac4c232SBarry Smith PetscUseMethod(viewer, "PetscViewerBinaryGetSkipHeader_C", (PetscViewer, PetscBool *), (viewer, skip)); 6853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6865c6c1daeSBarry Smith } 6875c6c1daeSBarry Smith 688d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinaryGetSkipHeader_Binary(PetscViewer viewer, PetscBool *skip) 689d71ae5a4SJacob Faibussowitsch { 690f3b211e4SSatish Balay PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 6915c6c1daeSBarry Smith 6925c6c1daeSBarry Smith PetscFunctionBegin; 693cc843e7aSLisandro Dalcin *skip = vbinary->skipheader; 6943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6955c6c1daeSBarry Smith } 6965c6c1daeSBarry Smith 6975c6c1daeSBarry Smith /*@C 6985c6c1daeSBarry Smith PetscViewerBinaryGetInfoPointer - Extracts the file pointer for the ASCII 699c410d8ccSBarry Smith `.info` file associated with a binary file. 7005c6c1daeSBarry Smith 701cf53795eSBarry Smith Not Collective; No Fortran Support 7025c6c1daeSBarry Smith 7035c6c1daeSBarry Smith Input Parameter: 704811af0c4SBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerBinaryOpen()` 7055c6c1daeSBarry Smith 7065c6c1daeSBarry Smith Output Parameter: 707c410d8ccSBarry Smith . file - file pointer Always returns `NULL` if not a binary viewer 7085c6c1daeSBarry Smith 7095c6c1daeSBarry Smith Level: advanced 7105c6c1daeSBarry Smith 711811af0c4SBarry Smith Note: 712811af0c4SBarry Smith For writable binary `PetscViewer`s, the file pointer will only be valid for the 713c410d8ccSBarry Smith first processor in the MPI communicator that shares the `PetscViewer`. 7145c6c1daeSBarry Smith 715c410d8ccSBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinaryGetDescriptor()`, `PetscViewerBinaryGetSkipInfo()`, 716c410d8ccSBarry Smith `PetscViewerBinarySetSkipInfo()` 7175c6c1daeSBarry Smith @*/ 718d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryGetInfoPointer(PetscViewer viewer, FILE **file) 719d71ae5a4SJacob Faibussowitsch { 7205c6c1daeSBarry Smith PetscFunctionBegin; 721cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 722cc843e7aSLisandro Dalcin PetscValidPointer(file, 2); 7230298fd71SBarry Smith *file = NULL; 724cac4c232SBarry Smith PetscTryMethod(viewer, "PetscViewerBinaryGetInfoPointer_C", (PetscViewer, FILE **), (viewer, file)); 7253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7265c6c1daeSBarry Smith } 7275c6c1daeSBarry Smith 728d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinaryGetInfoPointer_Binary(PetscViewer viewer, FILE **file) 729d71ae5a4SJacob Faibussowitsch { 730cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 7315c6c1daeSBarry Smith 7325c6c1daeSBarry Smith PetscFunctionBegin; 7339566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 734cc843e7aSLisandro Dalcin *file = vbinary->fdes_info; 735cc843e7aSLisandro Dalcin if (viewer->format == PETSC_VIEWER_BINARY_MATLAB && !vbinary->matlabheaderwritten) { 7365c6c1daeSBarry Smith if (vbinary->fdes_info) { 737cc843e7aSLisandro Dalcin FILE *info = vbinary->fdes_info; 7389566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, info, "#--- begin code written by PetscViewerBinary for MATLAB format ---#\n")); 7399566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, info, "#$$ Set.filename = '%s';\n", vbinary->filename)); 7409566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, info, "#$$ fd = PetscOpenFile(Set.filename);\n")); 7419566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, info, "#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n")); 742cc843e7aSLisandro Dalcin } 743cc843e7aSLisandro Dalcin vbinary->matlabheaderwritten = PETSC_TRUE; 7445c6c1daeSBarry Smith } 7453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7465c6c1daeSBarry Smith } 7475c6c1daeSBarry Smith 748e0385b85SDave May #if defined(PETSC_HAVE_MPIIO) 749d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileClose_BinaryMPIIO(PetscViewer v) 750d71ae5a4SJacob Faibussowitsch { 751e0385b85SDave May PetscViewer_Binary *vbinary = (PetscViewer_Binary *)v->data; 752e0385b85SDave May 753e0385b85SDave May PetscFunctionBegin; 75448a46eb9SPierre Jolivet if (vbinary->mfdes != MPI_FILE_NULL) PetscCallMPI(MPI_File_close(&vbinary->mfdes)); 75548a46eb9SPierre Jolivet if (vbinary->mfsub != MPI_FILE_NULL) PetscCallMPI(MPI_File_close(&vbinary->mfsub)); 756cc843e7aSLisandro Dalcin vbinary->moff = 0; 7573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 758e0385b85SDave May } 759e0385b85SDave May #endif 760e0385b85SDave May 761d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileClose_BinarySTDIO(PetscViewer v) 762d71ae5a4SJacob Faibussowitsch { 763cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)v->data; 764cc843e7aSLisandro Dalcin 765cc843e7aSLisandro Dalcin PetscFunctionBegin; 766cc843e7aSLisandro Dalcin if (vbinary->fdes != -1) { 7679566063dSJacob Faibussowitsch PetscCall(PetscBinaryClose(vbinary->fdes)); 768cc843e7aSLisandro Dalcin vbinary->fdes = -1; 769cc843e7aSLisandro Dalcin if (vbinary->storecompressed) { 770cc843e7aSLisandro Dalcin char cmd[8 + PETSC_MAX_PATH_LEN], out[64 + PETSC_MAX_PATH_LEN] = ""; 771cc843e7aSLisandro Dalcin const char *gzfilename = vbinary->ogzfilename ? vbinary->ogzfilename : vbinary->filename; 772cc843e7aSLisandro Dalcin /* compress the file */ 7739566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(cmd, "gzip -f ", sizeof(cmd))); 7749566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(cmd, gzfilename, sizeof(cmd))); 775cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_POPEN) 776cc843e7aSLisandro Dalcin { 777cc843e7aSLisandro Dalcin FILE *fp; 7789566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_SELF, NULL, cmd, "r", &fp)); 779cc73adaaSBarry Smith PetscCheck(!fgets(out, (int)(sizeof(out) - 1), fp), PETSC_COMM_SELF, PETSC_ERR_LIB, "Error from command %s\n%s", cmd, out); 7809566063dSJacob Faibussowitsch PetscCall(PetscPClose(PETSC_COMM_SELF, fp)); 781cc843e7aSLisandro Dalcin } 782cc843e7aSLisandro Dalcin #endif 783cc843e7aSLisandro Dalcin } 784cc843e7aSLisandro Dalcin } 7859566063dSJacob Faibussowitsch PetscCall(PetscFree(vbinary->ogzfilename)); 7863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 787cc843e7aSLisandro Dalcin } 788cc843e7aSLisandro Dalcin 789d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileClose_BinaryInfo(PetscViewer v) 790d71ae5a4SJacob Faibussowitsch { 791cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)v->data; 792cc843e7aSLisandro Dalcin 793cc843e7aSLisandro Dalcin PetscFunctionBegin; 794cc843e7aSLisandro Dalcin if (v->format == PETSC_VIEWER_BINARY_MATLAB && vbinary->matlabheaderwritten) { 795cc843e7aSLisandro Dalcin if (vbinary->fdes_info) { 796cc843e7aSLisandro Dalcin FILE *info = vbinary->fdes_info; 7979566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, info, "#--- begin code written by PetscViewerBinary for MATLAB format ---#\n")); 7989566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, info, "#$$ close(fd);\n")); 7999566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, info, "#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n")); 800cc843e7aSLisandro Dalcin } 801cc843e7aSLisandro Dalcin } 802cc843e7aSLisandro Dalcin if (vbinary->fdes_info) { 803cc843e7aSLisandro Dalcin FILE *info = vbinary->fdes_info; 804cc843e7aSLisandro Dalcin vbinary->fdes_info = NULL; 805cc73adaaSBarry Smith PetscCheck(!fclose(info), PETSC_COMM_SELF, PETSC_ERR_SYS, "fclose() failed on file"); 806cc843e7aSLisandro Dalcin } 8073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 808cc843e7aSLisandro Dalcin } 809cc843e7aSLisandro Dalcin 810d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileClose_Binary(PetscViewer v) 811d71ae5a4SJacob Faibussowitsch { 812cc843e7aSLisandro Dalcin PetscFunctionBegin; 813cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 8149566063dSJacob Faibussowitsch PetscCall(PetscViewerFileClose_BinaryMPIIO(v)); 815cc843e7aSLisandro Dalcin #endif 8169566063dSJacob Faibussowitsch PetscCall(PetscViewerFileClose_BinarySTDIO(v)); 8179566063dSJacob Faibussowitsch PetscCall(PetscViewerFileClose_BinaryInfo(v)); 8183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 819cc843e7aSLisandro Dalcin } 820cc843e7aSLisandro Dalcin 821d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_Binary(PetscViewer v) 822d71ae5a4SJacob Faibussowitsch { 8235c6c1daeSBarry Smith PetscViewer_Binary *vbinary = (PetscViewer_Binary *)v->data; 8245c6c1daeSBarry Smith 8255c6c1daeSBarry Smith PetscFunctionBegin; 8269566063dSJacob Faibussowitsch PetscCall(PetscViewerFileClose_Binary(v)); 8279566063dSJacob Faibussowitsch PetscCall(PetscFree(vbinary->filename)); 8289566063dSJacob Faibussowitsch PetscCall(PetscFree(vbinary)); 8292e956fe4SStefano Zampini PetscCall(PetscViewerBinaryClearFunctionList(v)); 8303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 831e0385b85SDave May } 8325c6c1daeSBarry Smith 8335c6c1daeSBarry Smith /*@C 8345c6c1daeSBarry Smith PetscViewerBinaryOpen - Opens a file for binary input/output. 8355c6c1daeSBarry Smith 836d083f849SBarry Smith Collective 8375c6c1daeSBarry Smith 8385c6c1daeSBarry Smith Input Parameters: 8395c6c1daeSBarry Smith + comm - MPI communicator 8405c6c1daeSBarry Smith . name - name of file 841cc843e7aSLisandro Dalcin - mode - open mode of file 8423f423023SBarry Smith .vb 8433f423023SBarry Smith FILE_MODE_WRITE - create new file for binary output 8443f423023SBarry Smith FILE_MODE_READ - open existing file for binary input 8453f423023SBarry Smith FILE_MODE_APPEND - open existing file for binary output 8463f423023SBarry Smith .ve 8475c6c1daeSBarry Smith 8485c6c1daeSBarry Smith Output Parameter: 849cc843e7aSLisandro Dalcin . viewer - PetscViewer for binary input/output to use with the specified file 8505c6c1daeSBarry Smith 8515c6c1daeSBarry Smith Options Database Keys: 852811af0c4SBarry Smith + -viewer_binary_filename <name> - name of file to use 853811af0c4SBarry Smith . -viewer_binary_skip_info - true to skip opening an info file 854811af0c4SBarry Smith . -viewer_binary_skip_options - true to not use options database while creating viewer 855811af0c4SBarry Smith . -viewer_binary_skip_header - true to skip output object headers to the file 856811af0c4SBarry Smith - -viewer_binary_mpiio - true to use MPI-IO for input and output to the file (more scalable for large problems) 8575c6c1daeSBarry Smith 8585c6c1daeSBarry Smith Level: beginner 8595c6c1daeSBarry Smith 8605c6c1daeSBarry Smith Note: 861811af0c4SBarry Smith This `PetscViewer` should be destroyed with `PetscViewerDestroy()`. 8625c6c1daeSBarry Smith 8635c6c1daeSBarry Smith For reading files, the filename may begin with ftp:// or http:// and/or 8645c6c1daeSBarry Smith end with .gz; in this case file is brought over and uncompressed. 8655c6c1daeSBarry Smith 8665c6c1daeSBarry Smith For creating files, if the file name ends with .gz it is automatically 8675c6c1daeSBarry Smith compressed when closed. 8685c6c1daeSBarry Smith 869d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`, 870db781477SPatrick Sanan `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`, 871db781477SPatrick Sanan `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()`, `PetscViewerBinarySetUseMPIIO()`, 872db781477SPatrick Sanan `PetscViewerBinaryGetUseMPIIO()`, `PetscViewerBinaryGetMPIIOOffset()` 8735c6c1daeSBarry Smith @*/ 874d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryOpen(MPI_Comm comm, const char name[], PetscFileMode mode, PetscViewer *viewer) 875d71ae5a4SJacob Faibussowitsch { 8765c6c1daeSBarry Smith PetscFunctionBegin; 8779566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, viewer)); 8789566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERBINARY)); 8799566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(*viewer, mode)); 8809566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(*viewer, name)); 8819566063dSJacob Faibussowitsch PetscCall(PetscViewerSetFromOptions(*viewer)); 8823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8835c6c1daeSBarry Smith } 8845c6c1daeSBarry Smith 8855c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO) 886d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerBinaryWriteReadMPIIO(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype, PetscBool write) 887d71ae5a4SJacob Faibussowitsch { 88822a8f86cSLisandro Dalcin MPI_Comm comm = PetscObjectComm((PetscObject)viewer); 8895c6c1daeSBarry Smith PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 89022a8f86cSLisandro Dalcin MPI_File mfdes = vbinary->mfdes; 8915c6c1daeSBarry Smith MPI_Datatype mdtype; 89269e10bbaSLisandro Dalcin PetscMPIInt rank, cnt; 8935c6c1daeSBarry Smith MPI_Status status; 8945c6c1daeSBarry Smith MPI_Aint ul, dsize; 8955c6c1daeSBarry Smith 8965c6c1daeSBarry Smith PetscFunctionBegin; 8979566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 8989566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(num, &cnt)); 8999566063dSJacob Faibussowitsch PetscCall(PetscDataTypeToMPIDataType(dtype, &mdtype)); 9005c6c1daeSBarry Smith if (write) { 90148a46eb9SPierre Jolivet if (rank == 0) PetscCall(MPIU_File_write_at(mfdes, vbinary->moff, data, cnt, mdtype, &status)); 9025c6c1daeSBarry Smith } else { 903dd400576SPatrick Sanan if (rank == 0) { 9049566063dSJacob Faibussowitsch PetscCall(MPIU_File_read_at(mfdes, vbinary->moff, data, cnt, mdtype, &status)); 9059566063dSJacob Faibussowitsch if (cnt > 0) PetscCallMPI(MPI_Get_count(&status, mdtype, &cnt)); 9065c6c1daeSBarry Smith } 9079566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&cnt, 1, MPI_INT, 0, comm)); 9089566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(data, cnt, mdtype, 0, comm)); 90969e10bbaSLisandro Dalcin } 9109566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_get_extent(mdtype, &ul, &dsize)); 9115c6c1daeSBarry Smith vbinary->moff += dsize * cnt; 9129860990eSLisandro Dalcin if (count) *count = cnt; 9133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9145c6c1daeSBarry Smith } 9155c6c1daeSBarry Smith #endif 9165c6c1daeSBarry Smith 9175c6c1daeSBarry Smith /*@C 9185c6c1daeSBarry Smith PetscViewerBinaryRead - Reads from a binary file, all processors get the same result 9195c6c1daeSBarry Smith 920*38b83642SBarry Smith Collective; No Fortran Support 9215c6c1daeSBarry Smith 9225c6c1daeSBarry Smith Input Parameters: 923c410d8ccSBarry Smith + viewer - the `PETSCVIEWERBINARY` viewer 924060da220SMatthew G. Knepley . num - number of items of data to read 925907376e6SBarry Smith - dtype - type of data to read 9265c6c1daeSBarry Smith 927c410d8ccSBarry Smith Output Parameters: 928c410d8ccSBarry Smith + data - location of the read data, treated as an array of the type indicated by `dtype` 929c410d8ccSBarry Smith - count - number of items of data actually read, or `NULL`. 930f8e4bde8SMatthew G. Knepley 9315c6c1daeSBarry Smith Level: beginner 9325c6c1daeSBarry Smith 933d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`, 934db781477SPatrick Sanan `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`, 935db781477SPatrick Sanan `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()` 9365c6c1daeSBarry Smith @*/ 937d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype) 938d71ae5a4SJacob Faibussowitsch { 93922a8f86cSLisandro Dalcin PetscViewer_Binary *vbinary; 9405c6c1daeSBarry Smith 94122a8f86cSLisandro Dalcin PetscFunctionBegin; 94222a8f86cSLisandro Dalcin PetscValidHeaderSpecificType(viewer, PETSC_VIEWER_CLASSID, 1, PETSCVIEWERBINARY); 94322a8f86cSLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, num, 3); 9449566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 94522a8f86cSLisandro Dalcin vbinary = (PetscViewer_Binary *)viewer->data; 9465c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO) 947bc196f7cSDave May if (vbinary->usempiio) { 9489566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteReadMPIIO(viewer, data, num, count, dtype, PETSC_FALSE)); 9495c6c1daeSBarry Smith } else { 9505c6c1daeSBarry Smith #endif 9519566063dSJacob Faibussowitsch PetscCall(PetscBinarySynchronizedRead(PetscObjectComm((PetscObject)viewer), vbinary->fdes, data, num, count, dtype)); 9525c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO) 9535c6c1daeSBarry Smith } 9545c6c1daeSBarry Smith #endif 9553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9565c6c1daeSBarry Smith } 9575c6c1daeSBarry Smith 9585c6c1daeSBarry Smith /*@C 959811af0c4SBarry Smith PetscViewerBinaryWrite - writes to a binary file, only from the first MPI rank 9605c6c1daeSBarry Smith 961*38b83642SBarry Smith Collective; No Fortran Support 9625c6c1daeSBarry Smith 9635c6c1daeSBarry Smith Input Parameters: 964c410d8ccSBarry Smith + viewer - the `PETSCVIEWERBINARY` viewer 965c410d8ccSBarry Smith . data - location of data, treated as an array of the type indicated by `dtype` 9665824c9d0SPatrick Sanan . count - number of items of data to write 967f253e43cSLisandro Dalcin - dtype - type of data to write 9685c6c1daeSBarry Smith 9695c6c1daeSBarry Smith Level: beginner 9705c6c1daeSBarry Smith 971d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`, 972db781477SPatrick Sanan `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`, `PetscDataType` 973db781477SPatrick Sanan `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()` 9745c6c1daeSBarry Smith @*/ 975d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryWrite(PetscViewer viewer, const void *data, PetscInt count, PetscDataType dtype) 976d71ae5a4SJacob Faibussowitsch { 97722a8f86cSLisandro Dalcin PetscViewer_Binary *vbinary; 9785c6c1daeSBarry Smith 9795c6c1daeSBarry Smith PetscFunctionBegin; 98022a8f86cSLisandro Dalcin PetscValidHeaderSpecificType(viewer, PETSC_VIEWER_CLASSID, 1, PETSCVIEWERBINARY); 98122a8f86cSLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, count, 3); 9829566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 98322a8f86cSLisandro Dalcin vbinary = (PetscViewer_Binary *)viewer->data; 9845c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO) 985bc196f7cSDave May if (vbinary->usempiio) { 9869566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteReadMPIIO(viewer, (void *)data, count, NULL, dtype, PETSC_TRUE)); 9875c6c1daeSBarry Smith } else { 9885c6c1daeSBarry Smith #endif 9899566063dSJacob Faibussowitsch PetscCall(PetscBinarySynchronizedWrite(PetscObjectComm((PetscObject)viewer), vbinary->fdes, data, count, dtype)); 9905c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO) 9915c6c1daeSBarry Smith } 9925c6c1daeSBarry Smith #endif 9933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9945c6c1daeSBarry Smith } 9955c6c1daeSBarry Smith 996*38b83642SBarry Smith static PetscErrorCode PetscViewerBinaryWriteReadAll(PetscViewer viewer, PetscBool write, void *data, PetscInt count, PetscInt64 start, PetscInt64 total, PetscDataType dtype) 997d71ae5a4SJacob Faibussowitsch { 9985972f5f3SLisandro Dalcin MPI_Comm comm = PetscObjectComm((PetscObject)viewer); 9995972f5f3SLisandro Dalcin PetscMPIInt size, rank; 10005972f5f3SLisandro Dalcin MPI_Datatype mdtype; 1001ec4bef21SJose E. Roman PETSC_UNUSED MPI_Aint lb; 1002ec4bef21SJose E. Roman MPI_Aint dsize; 10035972f5f3SLisandro Dalcin PetscBool useMPIIO; 10045972f5f3SLisandro Dalcin 10055972f5f3SLisandro Dalcin PetscFunctionBegin; 10065972f5f3SLisandro Dalcin PetscValidHeaderSpecificType(viewer, PETSC_VIEWER_CLASSID, 1, PETSCVIEWERBINARY); 1007064a246eSJacob Faibussowitsch PetscValidLogicalCollectiveBool(viewer, ((start >= 0) || (start == PETSC_DETERMINE)), 5); 1008064a246eSJacob Faibussowitsch PetscValidLogicalCollectiveBool(viewer, ((total >= 0) || (total == PETSC_DETERMINE)), 6); 1009064a246eSJacob Faibussowitsch PetscValidLogicalCollectiveInt(viewer, total, 6); 10109566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 10115972f5f3SLisandro Dalcin 10129566063dSJacob Faibussowitsch PetscCall(PetscDataTypeToMPIDataType(dtype, &mdtype)); 10139566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_get_extent(mdtype, &lb, &dsize)); 10149566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 10159566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 10165972f5f3SLisandro Dalcin 10179566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetUseMPIIO(viewer, &useMPIIO)); 10185972f5f3SLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 10195972f5f3SLisandro Dalcin if (useMPIIO) { 10205972f5f3SLisandro Dalcin MPI_File mfdes; 10215972f5f3SLisandro Dalcin MPI_Offset off; 10225972f5f3SLisandro Dalcin PetscMPIInt cnt; 10235972f5f3SLisandro Dalcin 10245972f5f3SLisandro Dalcin if (start == PETSC_DETERMINE) { 1025*38b83642SBarry Smith PetscInt64 pcnt = count; 1026*38b83642SBarry Smith PetscCallMPI(MPI_Scan(&pcnt, &start, 1, MPIU_INT64, MPI_SUM, comm)); 10275972f5f3SLisandro Dalcin start -= count; 10285972f5f3SLisandro Dalcin } 10295972f5f3SLisandro Dalcin if (total == PETSC_DETERMINE) { 10305972f5f3SLisandro Dalcin total = start + count; 1031*38b83642SBarry Smith PetscCallMPI(MPI_Bcast(&total, 1, MPIU_INT64, size - 1, comm)); 10325972f5f3SLisandro Dalcin } 10339566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(count, &cnt)); 10349566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetMPIIODescriptor(viewer, &mfdes)); 10359566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetMPIIOOffset(viewer, &off)); 10365972f5f3SLisandro Dalcin off += (MPI_Offset)(start * dsize); 10375972f5f3SLisandro Dalcin if (write) { 10389566063dSJacob Faibussowitsch PetscCall(MPIU_File_write_at_all(mfdes, off, data, cnt, mdtype, MPI_STATUS_IGNORE)); 10395972f5f3SLisandro Dalcin } else { 10409566063dSJacob Faibussowitsch PetscCall(MPIU_File_read_at_all(mfdes, off, data, cnt, mdtype, MPI_STATUS_IGNORE)); 10415972f5f3SLisandro Dalcin } 10425972f5f3SLisandro Dalcin off = (MPI_Offset)(total * dsize); 10439566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryAddMPIIOOffset(viewer, off)); 10443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10455972f5f3SLisandro Dalcin } 10465972f5f3SLisandro Dalcin #endif 10475972f5f3SLisandro Dalcin { 10485972f5f3SLisandro Dalcin int fdes; 10495972f5f3SLisandro Dalcin char *workbuf = NULL; 1050dd400576SPatrick Sanan PetscInt tcount = rank == 0 ? 0 : count, maxcount = 0, message_count, flowcontrolcount; 10515972f5f3SLisandro Dalcin PetscMPIInt tag, cnt, maxcnt, scnt = 0, rcnt = 0, j; 10525972f5f3SLisandro Dalcin MPI_Status status; 10535972f5f3SLisandro Dalcin 10549566063dSJacob Faibussowitsch PetscCall(PetscCommGetNewTag(comm, &tag)); 10559566063dSJacob Faibussowitsch PetscCallMPI(MPI_Reduce(&tcount, &maxcount, 1, MPIU_INT, MPI_MAX, 0, comm)); 10569566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(maxcount, &maxcnt)); 10579566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(count, &cnt)); 10585972f5f3SLisandro Dalcin 10599566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetDescriptor(viewer, &fdes)); 10609566063dSJacob Faibussowitsch PetscCall(PetscViewerFlowControlStart(viewer, &message_count, &flowcontrolcount)); 1061dd400576SPatrick Sanan if (rank == 0) { 10629566063dSJacob Faibussowitsch PetscCall(PetscMalloc(maxcnt * dsize, &workbuf)); 10635972f5f3SLisandro Dalcin if (write) { 10649566063dSJacob Faibussowitsch PetscCall(PetscBinaryWrite(fdes, data, cnt, dtype)); 10655972f5f3SLisandro Dalcin } else { 10669566063dSJacob Faibussowitsch PetscCall(PetscBinaryRead(fdes, data, cnt, NULL, dtype)); 10675972f5f3SLisandro Dalcin } 10685972f5f3SLisandro Dalcin for (j = 1; j < size; j++) { 10699566063dSJacob Faibussowitsch PetscCall(PetscViewerFlowControlStepMain(viewer, j, &message_count, flowcontrolcount)); 10705972f5f3SLisandro Dalcin if (write) { 10719566063dSJacob Faibussowitsch PetscCallMPI(MPI_Recv(workbuf, maxcnt, mdtype, j, tag, comm, &status)); 10729566063dSJacob Faibussowitsch PetscCallMPI(MPI_Get_count(&status, mdtype, &rcnt)); 10739566063dSJacob Faibussowitsch PetscCall(PetscBinaryWrite(fdes, workbuf, rcnt, dtype)); 10745972f5f3SLisandro Dalcin } else { 10759566063dSJacob Faibussowitsch PetscCallMPI(MPI_Recv(&scnt, 1, MPI_INT, j, tag, comm, MPI_STATUS_IGNORE)); 10769566063dSJacob Faibussowitsch PetscCall(PetscBinaryRead(fdes, workbuf, scnt, NULL, dtype)); 10779566063dSJacob Faibussowitsch PetscCallMPI(MPI_Send(workbuf, scnt, mdtype, j, tag, comm)); 10785972f5f3SLisandro Dalcin } 10795972f5f3SLisandro Dalcin } 10809566063dSJacob Faibussowitsch PetscCall(PetscFree(workbuf)); 10819566063dSJacob Faibussowitsch PetscCall(PetscViewerFlowControlEndMain(viewer, &message_count)); 10825972f5f3SLisandro Dalcin } else { 10839566063dSJacob Faibussowitsch PetscCall(PetscViewerFlowControlStepWorker(viewer, rank, &message_count)); 10845972f5f3SLisandro Dalcin if (write) { 10859566063dSJacob Faibussowitsch PetscCallMPI(MPI_Send(data, cnt, mdtype, 0, tag, comm)); 10865972f5f3SLisandro Dalcin } else { 10879566063dSJacob Faibussowitsch PetscCallMPI(MPI_Send(&cnt, 1, MPI_INT, 0, tag, comm)); 10889566063dSJacob Faibussowitsch PetscCallMPI(MPI_Recv(data, cnt, mdtype, 0, tag, comm, MPI_STATUS_IGNORE)); 10895972f5f3SLisandro Dalcin } 10909566063dSJacob Faibussowitsch PetscCall(PetscViewerFlowControlEndWorker(viewer, &message_count)); 10915972f5f3SLisandro Dalcin } 10925972f5f3SLisandro Dalcin } 10933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10945972f5f3SLisandro Dalcin } 10955972f5f3SLisandro Dalcin 10965972f5f3SLisandro Dalcin /*@C 1097c410d8ccSBarry Smith PetscViewerBinaryReadAll - reads from a binary file from all MPI processes, each rank receives its own portion of the data 10985972f5f3SLisandro Dalcin 1099*38b83642SBarry Smith Collective; No Fortran Support 11005972f5f3SLisandro Dalcin 11015972f5f3SLisandro Dalcin Input Parameters: 1102c410d8ccSBarry Smith + viewer - the `PETSCVIEWERBINARY` viewer 11035972f5f3SLisandro Dalcin . count - local number of items of data to read 1104811af0c4SBarry Smith . start - local start, can be `PETSC_DETERMINE` 1105811af0c4SBarry Smith . total - global number of items of data to read, can be `PETSC_DETERMINE` 11065972f5f3SLisandro Dalcin - dtype - type of data to read 11075972f5f3SLisandro Dalcin 1108c410d8ccSBarry Smith Output Parameter: 1109c410d8ccSBarry Smith . data - location of data, treated as an array of type indicated by `dtype` 1110c410d8ccSBarry Smith 11115972f5f3SLisandro Dalcin Level: advanced 11125972f5f3SLisandro Dalcin 1113d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryRead()`, `PetscViewerBinaryWriteAll()` 11145972f5f3SLisandro Dalcin @*/ 1115*38b83642SBarry Smith PetscErrorCode PetscViewerBinaryReadAll(PetscViewer viewer, void *data, PetscInt count, PetscInt64 start, PetscInt64 total, PetscDataType dtype) 1116d71ae5a4SJacob Faibussowitsch { 11175972f5f3SLisandro Dalcin PetscFunctionBegin; 11189566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteReadAll(viewer, PETSC_FALSE, data, count, start, total, dtype)); 11193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11205972f5f3SLisandro Dalcin } 11215972f5f3SLisandro Dalcin 11225972f5f3SLisandro Dalcin /*@C 1123c410d8ccSBarry Smith PetscViewerBinaryWriteAll - writes to a binary file from all MPI processes, each rank writes its own portion of the data 11245972f5f3SLisandro Dalcin 1125*38b83642SBarry Smith Collective; No Fortran Support 11265972f5f3SLisandro Dalcin 11275972f5f3SLisandro Dalcin Input Parameters: 1128c410d8ccSBarry Smith + viewer - the `PETSCVIEWERBINARY` viewer 11295972f5f3SLisandro Dalcin . data - location of data 1130c410d8ccSBarry Smith . count - local number of items of data to write, treated as an array of type indicated by `dtype` 1131811af0c4SBarry Smith . start - local start, can be `PETSC_DETERMINE` 1132811af0c4SBarry Smith . total - global number of items of data to write, can be `PETSC_DETERMINE` 11335972f5f3SLisandro Dalcin - dtype - type of data to write 11345972f5f3SLisandro Dalcin 11355972f5f3SLisandro Dalcin Level: advanced 11365972f5f3SLisandro Dalcin 1137d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerBinaryOpen()`, `PetscViewerBinarySetUseMPIIO()`, `PetscViewerBinaryWriteAll()`, `PetscViewerBinaryReadAll()` 11385972f5f3SLisandro Dalcin @*/ 1139*38b83642SBarry Smith PetscErrorCode PetscViewerBinaryWriteAll(PetscViewer viewer, const void *data, PetscInt count, PetscInt64 start, PetscInt64 total, PetscDataType dtype) 1140d71ae5a4SJacob Faibussowitsch { 11415972f5f3SLisandro Dalcin PetscFunctionBegin; 11429566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteReadAll(viewer, PETSC_TRUE, (void *)data, count, start, total, dtype)); 11433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11445972f5f3SLisandro Dalcin } 11455972f5f3SLisandro Dalcin 11465c6c1daeSBarry Smith /*@C 1147811af0c4SBarry Smith PetscViewerBinaryWriteStringArray - writes to a binary file, only from the first MPI rank, an array of strings 11485c6c1daeSBarry Smith 1149*38b83642SBarry Smith Collective; No Fortran Support 11505c6c1daeSBarry Smith 11515c6c1daeSBarry Smith Input Parameters: 1152c410d8ccSBarry Smith + viewer - the `PETSCVIEWERBINARY` viewer 11535c6c1daeSBarry Smith - data - location of the array of strings 11545c6c1daeSBarry Smith 11555c6c1daeSBarry Smith Level: intermediate 11565c6c1daeSBarry Smith 1157811af0c4SBarry Smith Note: 11583f423023SBarry Smith The array of strings must be `NULL` terminated 11595c6c1daeSBarry Smith 1160d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`, 1161db781477SPatrick Sanan `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`, 1162db781477SPatrick Sanan `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()` 11635c6c1daeSBarry Smith @*/ 1164d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryWriteStringArray(PetscViewer viewer, const char *const *data) 1165d71ae5a4SJacob Faibussowitsch { 11665c6c1daeSBarry Smith PetscInt i, n = 0, *sizes; 1167cc843e7aSLisandro Dalcin size_t len; 11685c6c1daeSBarry Smith 116922a8f86cSLisandro Dalcin PetscFunctionBegin; 11709566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 11715c6c1daeSBarry Smith /* count number of strings */ 11729371c9d4SSatish Balay while (data[n++]) 11739371c9d4SSatish Balay ; 11745c6c1daeSBarry Smith n--; 11759566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n + 1, &sizes)); 11765c6c1daeSBarry Smith sizes[0] = n; 11775c6c1daeSBarry Smith for (i = 0; i < n; i++) { 11789566063dSJacob Faibussowitsch PetscCall(PetscStrlen(data[i], &len)); 1179cc843e7aSLisandro Dalcin sizes[i + 1] = (PetscInt)len + 1; /* size includes space for the null terminator */ 11805c6c1daeSBarry Smith } 11819566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, sizes, n + 1, PETSC_INT)); 118248a46eb9SPierre Jolivet for (i = 0; i < n; i++) PetscCall(PetscViewerBinaryWrite(viewer, (void *)data[i], sizes[i + 1], PETSC_CHAR)); 11839566063dSJacob Faibussowitsch PetscCall(PetscFree(sizes)); 11843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11855c6c1daeSBarry Smith } 11865c6c1daeSBarry Smith 11875c6c1daeSBarry Smith /*@C 1188c410d8ccSBarry Smith PetscViewerBinaryReadStringArray - reads a binary file an array of strings to all MPI processes 11895c6c1daeSBarry Smith 1190*38b83642SBarry Smith Collective; No Fortran Support 11915c6c1daeSBarry Smith 11925c6c1daeSBarry Smith Input Parameter: 1193c410d8ccSBarry Smith . viewer - the `PETSCVIEWERBINARY` viewer 11945c6c1daeSBarry Smith 11955c6c1daeSBarry Smith Output Parameter: 11965c6c1daeSBarry Smith . data - location of the array of strings 11975c6c1daeSBarry Smith 11985c6c1daeSBarry Smith Level: intermediate 11995c6c1daeSBarry Smith 1200811af0c4SBarry Smith Note: 12013f423023SBarry Smith The array of strings must `NULL` terminated 12025c6c1daeSBarry Smith 1203d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`, 1204db781477SPatrick Sanan `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`, 1205db781477SPatrick Sanan `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()` 12065c6c1daeSBarry Smith @*/ 1207d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerBinaryReadStringArray(PetscViewer viewer, char ***data) 1208d71ae5a4SJacob Faibussowitsch { 1209060da220SMatthew G. Knepley PetscInt i, n, *sizes, N = 0; 12105c6c1daeSBarry Smith 121122a8f86cSLisandro Dalcin PetscFunctionBegin; 12129566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 12135c6c1daeSBarry Smith /* count number of strings */ 12149566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &n, 1, NULL, PETSC_INT)); 12159566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n, &sizes)); 12169566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, sizes, n, NULL, PETSC_INT)); 1217a297a907SKarl Rupp for (i = 0; i < n; i++) N += sizes[i]; 12189566063dSJacob Faibussowitsch PetscCall(PetscMalloc((n + 1) * sizeof(char *) + N * sizeof(char), data)); 12195c6c1daeSBarry Smith (*data)[0] = (char *)((*data) + n + 1); 1220a297a907SKarl Rupp for (i = 1; i < n; i++) (*data)[i] = (*data)[i - 1] + sizes[i - 1]; 12219566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, (*data)[0], N, NULL, PETSC_CHAR)); 122202c9f0b5SLisandro Dalcin (*data)[n] = NULL; 12239566063dSJacob Faibussowitsch PetscCall(PetscFree(sizes)); 12243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12255c6c1daeSBarry Smith } 12265c6c1daeSBarry Smith 1227cc843e7aSLisandro Dalcin /*@C 1228cc843e7aSLisandro Dalcin PetscViewerFileSetMode - Sets the open mode of file 1229cc843e7aSLisandro Dalcin 1230c3339decSBarry Smith Logically Collective 1231cc843e7aSLisandro Dalcin 1232cc843e7aSLisandro Dalcin Input Parameters: 1233811af0c4SBarry Smith + viewer - the `PetscViewer`; must be a a `PETSCVIEWERBINARY`, `PETSCVIEWERMATLAB`, `PETSCVIEWERHDF5`, or `PETSCVIEWERASCII` `PetscViewer` 1234cc843e7aSLisandro Dalcin - mode - open mode of file 1235cf53795eSBarry Smith .vb 1236cf53795eSBarry Smith FILE_MODE_WRITE - create new file for output 1237cf53795eSBarry Smith FILE_MODE_READ - open existing file for input 1238cf53795eSBarry Smith FILE_MODE_APPEND - open existing file for output 1239cf53795eSBarry Smith .ve 1240cc843e7aSLisandro Dalcin 1241cc843e7aSLisandro Dalcin Level: advanced 1242cc843e7aSLisandro Dalcin 1243d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerFileSetMode()`, `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerBinaryOpen()` 1244cc843e7aSLisandro Dalcin @*/ 1245d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFileSetMode(PetscViewer viewer, PetscFileMode mode) 1246d71ae5a4SJacob Faibussowitsch { 1247cc843e7aSLisandro Dalcin PetscFunctionBegin; 1248cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 1249cc843e7aSLisandro Dalcin PetscValidLogicalCollectiveEnum(viewer, mode, 2); 125008401ef6SPierre Jolivet PetscCheck(mode != FILE_MODE_UNDEFINED, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Cannot set FILE_MODE_UNDEFINED"); 1251f7d195e4SLawrence Mitchell PetscCheck(mode >= FILE_MODE_UNDEFINED && mode <= FILE_MODE_APPEND_UPDATE, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ARG_OUTOFRANGE, "Invalid file mode %d", (int)mode); 1252cac4c232SBarry Smith PetscTryMethod(viewer, "PetscViewerFileSetMode_C", (PetscViewer, PetscFileMode), (viewer, mode)); 12533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1254cc843e7aSLisandro Dalcin } 1255cc843e7aSLisandro Dalcin 1256d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetMode_Binary(PetscViewer viewer, PetscFileMode mode) 1257d71ae5a4SJacob Faibussowitsch { 1258cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 1259cc843e7aSLisandro Dalcin 1260cc843e7aSLisandro Dalcin PetscFunctionBegin; 1261cc73adaaSBarry Smith PetscCheck(!viewer->setupcalled || vbinary->filemode == mode, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ORDER, "Cannot change mode to %s after setup", PetscFileModes[mode]); 1262cc843e7aSLisandro Dalcin vbinary->filemode = mode; 12633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1264cc843e7aSLisandro Dalcin } 1265cc843e7aSLisandro Dalcin 1266cc843e7aSLisandro Dalcin /*@C 1267c410d8ccSBarry Smith PetscViewerFileGetMode - Gets the open mode of a file associated with a `PetscViewer` 1268cc843e7aSLisandro Dalcin 1269cc843e7aSLisandro Dalcin Not Collective 1270cc843e7aSLisandro Dalcin 1271cc843e7aSLisandro Dalcin Input Parameter: 1272811af0c4SBarry Smith . viewer - the `PetscViewer`; must be a `PETSCVIEWERBINARY`, `PETSCVIEWERMATLAB`, `PETSCVIEWERHDF5`, or `PETSCVIEWERASCII` `PetscViewer` 1273cc843e7aSLisandro Dalcin 1274cc843e7aSLisandro Dalcin Output Parameter: 1275cc843e7aSLisandro Dalcin . mode - open mode of file 1276cf53795eSBarry Smith .vb 1277cf53795eSBarry Smith FILE_MODE_WRITE - create new file for binary output 1278cf53795eSBarry Smith FILE_MODE_READ - open existing file for binary input 1279cf53795eSBarry Smith FILE_MODE_APPEND - open existing file for binary output 1280cf53795eSBarry Smith .ve 1281cc843e7aSLisandro Dalcin 1282cc843e7aSLisandro Dalcin Level: advanced 1283cc843e7aSLisandro Dalcin 1284d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerFileSetMode()`, `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerBinaryOpen()` 1285cc843e7aSLisandro Dalcin @*/ 1286d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFileGetMode(PetscViewer viewer, PetscFileMode *mode) 1287d71ae5a4SJacob Faibussowitsch { 1288cc843e7aSLisandro Dalcin PetscFunctionBegin; 1289cc843e7aSLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 1290cc843e7aSLisandro Dalcin PetscValidPointer(mode, 2); 1291cac4c232SBarry Smith PetscUseMethod(viewer, "PetscViewerFileGetMode_C", (PetscViewer, PetscFileMode *), (viewer, mode)); 12923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1293cc843e7aSLisandro Dalcin } 1294cc843e7aSLisandro Dalcin 1295d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileGetMode_Binary(PetscViewer viewer, PetscFileMode *mode) 1296d71ae5a4SJacob Faibussowitsch { 1297cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 1298cc843e7aSLisandro Dalcin 1299cc843e7aSLisandro Dalcin PetscFunctionBegin; 1300cc843e7aSLisandro Dalcin *mode = vbinary->filemode; 13013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1302cc843e7aSLisandro Dalcin } 1303cc843e7aSLisandro Dalcin 1304d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetName_Binary(PetscViewer viewer, const char name[]) 1305d71ae5a4SJacob Faibussowitsch { 1306cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 1307cc843e7aSLisandro Dalcin 1308cc843e7aSLisandro Dalcin PetscFunctionBegin; 1309cc843e7aSLisandro Dalcin if (viewer->setupcalled && vbinary->filename) { 1310cc843e7aSLisandro Dalcin /* gzip can be run after the file with the previous filename has been closed */ 13119566063dSJacob Faibussowitsch PetscCall(PetscFree(vbinary->ogzfilename)); 13129566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(vbinary->filename, &vbinary->ogzfilename)); 1313cc843e7aSLisandro Dalcin } 13149566063dSJacob Faibussowitsch PetscCall(PetscFree(vbinary->filename)); 13159566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(name, &vbinary->filename)); 1316cc843e7aSLisandro Dalcin viewer->setupcalled = PETSC_FALSE; 13173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1318cc843e7aSLisandro Dalcin } 1319cc843e7aSLisandro Dalcin 1320d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileGetName_Binary(PetscViewer viewer, const char **name) 1321d71ae5a4SJacob Faibussowitsch { 13225c6c1daeSBarry Smith PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 13235c6c1daeSBarry Smith 13245c6c1daeSBarry Smith PetscFunctionBegin; 13255c6c1daeSBarry Smith *name = vbinary->filename; 13263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13275c6c1daeSBarry Smith } 13285c6c1daeSBarry Smith 13295c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO) 1330d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetUp_BinaryMPIIO(PetscViewer viewer) 1331d71ae5a4SJacob Faibussowitsch { 13325c6c1daeSBarry Smith PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 1333e8a65b7dSLisandro Dalcin int amode; 13345c6c1daeSBarry Smith 13355c6c1daeSBarry Smith PetscFunctionBegin; 1336a297a907SKarl Rupp vbinary->storecompressed = PETSC_FALSE; 13375c6c1daeSBarry Smith 1338cc843e7aSLisandro Dalcin vbinary->moff = 0; 1339cc843e7aSLisandro Dalcin switch (vbinary->filemode) { 1340d71ae5a4SJacob Faibussowitsch case FILE_MODE_READ: 1341d71ae5a4SJacob Faibussowitsch amode = MPI_MODE_RDONLY; 1342d71ae5a4SJacob Faibussowitsch break; 1343d71ae5a4SJacob Faibussowitsch case FILE_MODE_WRITE: 1344d71ae5a4SJacob Faibussowitsch amode = MPI_MODE_WRONLY | MPI_MODE_CREATE; 1345d71ae5a4SJacob Faibussowitsch break; 1346d71ae5a4SJacob Faibussowitsch case FILE_MODE_APPEND: 1347d71ae5a4SJacob Faibussowitsch amode = MPI_MODE_WRONLY | MPI_MODE_CREATE | MPI_MODE_APPEND; 1348d71ae5a4SJacob Faibussowitsch break; 1349d71ae5a4SJacob Faibussowitsch case FILE_MODE_UNDEFINED: 1350d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_ORDER, "Must call PetscViewerFileSetMode() before PetscViewerSetUp()"); 1351d71ae5a4SJacob Faibussowitsch default: 1352d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unsupported file mode %s", PetscFileModes[vbinary->filemode]); 13535c6c1daeSBarry Smith } 13549566063dSJacob Faibussowitsch PetscCallMPI(MPI_File_open(PetscObjectComm((PetscObject)viewer), vbinary->filename, amode, MPI_INFO_NULL, &vbinary->mfdes)); 135522a8f86cSLisandro Dalcin /* 135622a8f86cSLisandro Dalcin The MPI standard does not have MPI_MODE_TRUNCATE. We emulate this behavior by setting the file size to zero. 135722a8f86cSLisandro Dalcin */ 13589566063dSJacob Faibussowitsch if (vbinary->filemode == FILE_MODE_WRITE) PetscCallMPI(MPI_File_set_size(vbinary->mfdes, 0)); 135922a8f86cSLisandro Dalcin /* 136022a8f86cSLisandro Dalcin Initially, all processes view the file as a linear byte stream. Therefore, for files opened with MPI_MODE_APPEND, 136122a8f86cSLisandro Dalcin MPI_File_get_position[_shared](fh, &offset) returns the absolute byte position at the end of file. 136222a8f86cSLisandro Dalcin Otherwise, we would need to call MPI_File_get_byte_offset(fh, offset, &byte_offset) to convert 136322a8f86cSLisandro Dalcin the offset in etype units to an absolute byte position. 136422a8f86cSLisandro Dalcin */ 13659566063dSJacob Faibussowitsch if (vbinary->filemode == FILE_MODE_APPEND) PetscCallMPI(MPI_File_get_position(vbinary->mfdes, &vbinary->moff)); 13663ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1367cc843e7aSLisandro Dalcin } 1368cc843e7aSLisandro Dalcin #endif 13695c6c1daeSBarry Smith 1370d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetUp_BinarySTDIO(PetscViewer viewer) 1371d71ae5a4SJacob Faibussowitsch { 1372cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 1373cc843e7aSLisandro Dalcin const char *fname; 1374bbcf679cSJacob Faibussowitsch char bname[PETSC_MAX_PATH_LEN], *gz = NULL; 1375cc843e7aSLisandro Dalcin PetscBool found; 1376cc843e7aSLisandro Dalcin PetscMPIInt rank; 13775c6c1daeSBarry Smith 1378cc843e7aSLisandro Dalcin PetscFunctionBegin; 13799566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 13805c6c1daeSBarry Smith 1381cc843e7aSLisandro Dalcin /* if file name ends in .gz strip that off and note user wants file compressed */ 1382cc843e7aSLisandro Dalcin vbinary->storecompressed = PETSC_FALSE; 1383cc843e7aSLisandro Dalcin if (vbinary->filemode == FILE_MODE_WRITE) { 13849566063dSJacob Faibussowitsch PetscCall(PetscStrstr(vbinary->filename, ".gz", &gz)); 13859371c9d4SSatish Balay if (gz && gz[3] == 0) { 13869371c9d4SSatish Balay *gz = 0; 13879371c9d4SSatish Balay vbinary->storecompressed = PETSC_TRUE; 13889371c9d4SSatish Balay } 1389cc843e7aSLisandro Dalcin } 1390cc843e7aSLisandro Dalcin #if !defined(PETSC_HAVE_POPEN) 139128b400f6SJacob Faibussowitsch PetscCheck(!vbinary->storecompressed, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP_SYS, "Cannot run gzip on this machine"); 1392cc843e7aSLisandro Dalcin #endif 1393cc843e7aSLisandro Dalcin 1394cc843e7aSLisandro Dalcin fname = vbinary->filename; 1395cc843e7aSLisandro Dalcin if (vbinary->filemode == FILE_MODE_READ) { /* possibly get the file from remote site or compressed file */ 13969566063dSJacob Faibussowitsch PetscCall(PetscFileRetrieve(PetscObjectComm((PetscObject)viewer), fname, bname, PETSC_MAX_PATH_LEN, &found)); 139728b400f6SJacob Faibussowitsch PetscCheck(found, PetscObjectComm((PetscObject)viewer), PETSC_ERR_FILE_OPEN, "Cannot locate file: %s", fname); 1398cc843e7aSLisandro Dalcin fname = bname; 13995c6c1daeSBarry Smith } 14005c6c1daeSBarry Smith 1401cc843e7aSLisandro Dalcin vbinary->fdes = -1; 1402dd400576SPatrick Sanan if (rank == 0) { /* only first processor opens file*/ 1403cc843e7aSLisandro Dalcin PetscFileMode mode = vbinary->filemode; 1404cc843e7aSLisandro Dalcin if (mode == FILE_MODE_APPEND) { 1405cc843e7aSLisandro Dalcin /* check if asked to append to a non-existing file */ 14069566063dSJacob Faibussowitsch PetscCall(PetscTestFile(fname, '\0', &found)); 1407cc843e7aSLisandro Dalcin if (!found) mode = FILE_MODE_WRITE; 1408cc843e7aSLisandro Dalcin } 14099566063dSJacob Faibussowitsch PetscCall(PetscBinaryOpen(fname, mode, &vbinary->fdes)); 1410cc843e7aSLisandro Dalcin } 14113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1412cc843e7aSLisandro Dalcin } 1413cc843e7aSLisandro Dalcin 1414bf31d2d3SBarry Smith #include <errno.h> 1415d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetUp_BinaryInfo(PetscViewer viewer) 1416d71ae5a4SJacob Faibussowitsch { 1417cc843e7aSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 1418cc843e7aSLisandro Dalcin PetscMPIInt rank; 1419cc843e7aSLisandro Dalcin PetscBool found; 1420cc843e7aSLisandro Dalcin 1421cc843e7aSLisandro Dalcin PetscFunctionBegin; 1422cc843e7aSLisandro Dalcin vbinary->fdes_info = NULL; 14239566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 1424dd400576SPatrick Sanan if (!vbinary->skipinfo && (vbinary->filemode == FILE_MODE_READ || rank == 0)) { 1425cc843e7aSLisandro Dalcin char infoname[PETSC_MAX_PATH_LEN], iname[PETSC_MAX_PATH_LEN], *gz; 1426cc843e7aSLisandro Dalcin 14279566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(infoname, vbinary->filename, sizeof(infoname))); 1428cc843e7aSLisandro Dalcin /* remove .gz if it ends file name */ 14299566063dSJacob Faibussowitsch PetscCall(PetscStrstr(infoname, ".gz", &gz)); 1430cc843e7aSLisandro Dalcin if (gz && gz[3] == 0) *gz = 0; 1431cc843e7aSLisandro Dalcin 14329566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(infoname, ".info", sizeof(infoname))); 1433cc843e7aSLisandro Dalcin if (vbinary->filemode == FILE_MODE_READ) { 14349566063dSJacob Faibussowitsch PetscCall(PetscFixFilename(infoname, iname)); 14359566063dSJacob Faibussowitsch PetscCall(PetscFileRetrieve(PetscObjectComm((PetscObject)viewer), iname, infoname, PETSC_MAX_PATH_LEN, &found)); 14369566063dSJacob Faibussowitsch if (found) PetscCall(PetscOptionsInsertFile(PetscObjectComm((PetscObject)viewer), ((PetscObject)viewer)->options, infoname, PETSC_FALSE)); 1437dd400576SPatrick Sanan } else if (rank == 0) { /* write or append */ 1438cc843e7aSLisandro Dalcin const char *omode = (vbinary->filemode == FILE_MODE_APPEND) ? "a" : "w"; 1439cc843e7aSLisandro Dalcin vbinary->fdes_info = fopen(infoname, omode); 1440bf31d2d3SBarry Smith PetscCheck(vbinary->fdes_info, PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Cannot open .info file %s for writing due to \"%s\"", infoname, strerror(errno)); 14415c6c1daeSBarry Smith } 14425c6c1daeSBarry Smith } 14433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 14445c6c1daeSBarry Smith } 14455c6c1daeSBarry Smith 1446d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerSetUp_Binary(PetscViewer viewer) 1447d71ae5a4SJacob Faibussowitsch { 14485c6c1daeSBarry Smith PetscViewer_Binary *vbinary = (PetscViewer_Binary *)viewer->data; 1449cc843e7aSLisandro Dalcin PetscBool usempiio; 1450cc843e7aSLisandro Dalcin 14515c6c1daeSBarry Smith PetscFunctionBegin; 14529566063dSJacob Faibussowitsch if (!vbinary->setfromoptionscalled) PetscCall(PetscViewerSetFromOptions(viewer)); 145328b400f6SJacob Faibussowitsch PetscCheck(vbinary->filename, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Must call PetscViewerFileSetName()"); 145408401ef6SPierre Jolivet PetscCheck(vbinary->filemode != (PetscFileMode)-1, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Must call PetscViewerFileSetMode()"); 14559566063dSJacob Faibussowitsch PetscCall(PetscViewerFileClose_Binary(viewer)); 1456cc843e7aSLisandro Dalcin 14579566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetUseMPIIO(viewer, &usempiio)); 1458cc843e7aSLisandro Dalcin if (usempiio) { 1459cc843e7aSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 14609566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetUp_BinaryMPIIO(viewer)); 1461cc843e7aSLisandro Dalcin #endif 1462cc843e7aSLisandro Dalcin } else { 14639566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetUp_BinarySTDIO(viewer)); 1464cc843e7aSLisandro Dalcin } 14659566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetUp_BinaryInfo(viewer)); 1466cc843e7aSLisandro Dalcin 14679566063dSJacob Faibussowitsch PetscCall(PetscLogObjectState((PetscObject)viewer, "File: %s", vbinary->filename)); 14683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 14695c6c1daeSBarry Smith } 14705c6c1daeSBarry Smith 1471d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerView_Binary(PetscViewer v, PetscViewer viewer) 1472d71ae5a4SJacob Faibussowitsch { 1473cb6ad94fSLisandro Dalcin PetscViewer_Binary *vbinary = (PetscViewer_Binary *)v->data; 1474cb6ad94fSLisandro Dalcin const char *fname = vbinary->filename ? vbinary->filename : "not yet set"; 1475cc843e7aSLisandro Dalcin const char *fmode = vbinary->filemode != (PetscFileMode)-1 ? PetscFileModes[vbinary->filemode] : "not yet set"; 1476cb6ad94fSLisandro Dalcin PetscBool usempiio; 14772bf49c77SBarry Smith 14782bf49c77SBarry Smith PetscFunctionBegin; 14799566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetUseMPIIO(v, &usempiio)); 14809566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Filename: %s\n", fname)); 14819566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Mode: %s (%s)\n", fmode, usempiio ? "mpiio" : "stdio")); 14823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 14832bf49c77SBarry Smith } 14842bf49c77SBarry Smith 1485d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerSetFromOptions_Binary(PetscViewer viewer, PetscOptionItems *PetscOptionsObject) 1486d71ae5a4SJacob Faibussowitsch { 148722a8f86cSLisandro Dalcin PetscViewer_Binary *binary = (PetscViewer_Binary *)viewer->data; 1488d22fd6bcSDave May char defaultname[PETSC_MAX_PATH_LEN]; 148903a1d59fSDave May PetscBool flg; 1490e0385b85SDave May 149103a1d59fSDave May PetscFunctionBegin; 14923ba16761SJacob Faibussowitsch if (viewer->setupcalled) PetscFunctionReturn(PETSC_SUCCESS); 1493d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Binary PetscViewer Options"); 14949566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(defaultname, PETSC_MAX_PATH_LEN - 1, "binaryoutput")); 14959566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-viewer_binary_filename", "Specify filename", "PetscViewerFileSetName", defaultname, defaultname, sizeof(defaultname), &flg)); 14969566063dSJacob Faibussowitsch if (flg) PetscCall(PetscViewerFileSetName_Binary(viewer, defaultname)); 14979566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-viewer_binary_skip_info", "Skip writing/reading .info file", "PetscViewerBinarySetSkipInfo", binary->skipinfo, &binary->skipinfo, NULL)); 14989566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-viewer_binary_skip_options", "Skip parsing Vec/Mat load options", "PetscViewerBinarySetSkipOptions", binary->skipoptions, &binary->skipoptions, NULL)); 14999566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-viewer_binary_skip_header", "Skip writing/reading header information", "PetscViewerBinarySetSkipHeader", binary->skipheader, &binary->skipheader, NULL)); 150003a1d59fSDave May #if defined(PETSC_HAVE_MPIIO) 15019566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-viewer_binary_mpiio", "Use MPI-IO functionality to write/read binary file", "PetscViewerBinarySetUseMPIIO", binary->usempiio, &binary->usempiio, NULL)); 15025972f5f3SLisandro Dalcin #else 15039566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-viewer_binary_mpiio", "Use MPI-IO functionality to write/read binary file (NOT AVAILABLE)", "PetscViewerBinarySetUseMPIIO", PETSC_FALSE, NULL, NULL)); 150403a1d59fSDave May #endif 1505d0609cedSBarry Smith PetscOptionsHeadEnd(); 1506bc196f7cSDave May binary->setfromoptionscalled = PETSC_TRUE; 15073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 150803a1d59fSDave May } 150903a1d59fSDave May 15108556b5ebSBarry Smith /*MC 15118556b5ebSBarry Smith PETSCVIEWERBINARY - A viewer that saves to binary files 15128556b5ebSBarry Smith 15131b266c99SBarry Smith Level: beginner 15141b266c99SBarry Smith 1515d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerBinaryOpen()`, `PETSC_VIEWER_STDOUT_()`, `PETSC_VIEWER_STDOUT_SELF`, `PETSC_VIEWER_STDOUT_WORLD`, `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, 1516811af0c4SBarry Smith `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`, `PETSCVIEWERDRAW`, `PETSCVIEWERSOCKET` 1517811af0c4SBarry Smith `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()`, 1518811af0c4SBarry Smith `PetscViewerBinaryGetUseMPIIO()`, `PetscViewerBinarySetUseMPIIO()` 15198556b5ebSBarry Smith M*/ 15208556b5ebSBarry Smith 1521d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_Binary(PetscViewer v) 1522d71ae5a4SJacob Faibussowitsch { 15235c6c1daeSBarry Smith PetscViewer_Binary *vbinary; 15245c6c1daeSBarry Smith 15255c6c1daeSBarry Smith PetscFunctionBegin; 15264dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&vbinary)); 15275c6c1daeSBarry Smith v->data = (void *)vbinary; 1528cc843e7aSLisandro Dalcin 152903a1d59fSDave May v->ops->setfromoptions = PetscViewerSetFromOptions_Binary; 15305c6c1daeSBarry Smith v->ops->destroy = PetscViewerDestroy_Binary; 15312bf49c77SBarry Smith v->ops->view = PetscViewerView_Binary; 1532c98fd787SBarry Smith v->ops->setup = PetscViewerSetUp_Binary; 1533cc843e7aSLisandro Dalcin v->ops->flush = NULL; /* Should we support Flush() ? */ 1534cc843e7aSLisandro Dalcin v->ops->getsubviewer = PetscViewerGetSubViewer_Binary; 1535cc843e7aSLisandro Dalcin v->ops->restoresubviewer = PetscViewerRestoreSubViewer_Binary; 1536cc843e7aSLisandro Dalcin v->ops->read = PetscViewerBinaryRead; 1537cc843e7aSLisandro Dalcin 1538cc843e7aSLisandro Dalcin vbinary->fdes = -1; 1539e8a65b7dSLisandro Dalcin #if defined(PETSC_HAVE_MPIIO) 1540cc843e7aSLisandro Dalcin vbinary->usempiio = PETSC_FALSE; 1541e8a65b7dSLisandro Dalcin vbinary->mfdes = MPI_FILE_NULL; 1542e8a65b7dSLisandro Dalcin vbinary->mfsub = MPI_FILE_NULL; 1543e8a65b7dSLisandro Dalcin #endif 1544cc843e7aSLisandro Dalcin vbinary->filename = NULL; 15457e4fd573SVaclav Hapla vbinary->filemode = FILE_MODE_UNDEFINED; 154602c9f0b5SLisandro Dalcin vbinary->fdes_info = NULL; 15475c6c1daeSBarry Smith vbinary->skipinfo = PETSC_FALSE; 15485c6c1daeSBarry Smith vbinary->skipoptions = PETSC_TRUE; 15495c6c1daeSBarry Smith vbinary->skipheader = PETSC_FALSE; 15505c6c1daeSBarry Smith vbinary->storecompressed = PETSC_FALSE; 1551f90597f1SStefano Zampini vbinary->ogzfilename = NULL; 15525c6c1daeSBarry Smith vbinary->flowcontrol = 256; /* seems a good number for Cray XT-5 */ 15535c6c1daeSBarry Smith 1554cc843e7aSLisandro Dalcin vbinary->setfromoptionscalled = PETSC_FALSE; 1555cc843e7aSLisandro Dalcin 15569566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetFlowControl_C", PetscViewerBinaryGetFlowControl_Binary)); 15579566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinarySetFlowControl_C", PetscViewerBinarySetFlowControl_Binary)); 15589566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetSkipHeader_C", PetscViewerBinaryGetSkipHeader_Binary)); 15599566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinarySetSkipHeader_C", PetscViewerBinarySetSkipHeader_Binary)); 15609566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetSkipOptions_C", PetscViewerBinaryGetSkipOptions_Binary)); 15619566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinarySetSkipOptions_C", PetscViewerBinarySetSkipOptions_Binary)); 15629566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetSkipInfo_C", PetscViewerBinaryGetSkipInfo_Binary)); 15639566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinarySetSkipInfo_C", PetscViewerBinarySetSkipInfo_Binary)); 15649566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetInfoPointer_C", PetscViewerBinaryGetInfoPointer_Binary)); 15659566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileGetName_C", PetscViewerFileGetName_Binary)); 15669566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetName_C", PetscViewerFileSetName_Binary)); 15679566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileGetMode_C", PetscViewerFileGetMode_Binary)); 15689566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetMode_C", PetscViewerFileSetMode_Binary)); 15695c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPIIO) 15709566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinaryGetUseMPIIO_C", PetscViewerBinaryGetUseMPIIO_Binary)); 15719566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerBinarySetUseMPIIO_C", PetscViewerBinarySetUseMPIIO_Binary)); 15725c6c1daeSBarry Smith #endif 15733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 15745c6c1daeSBarry Smith } 15755c6c1daeSBarry Smith 15765c6c1daeSBarry Smith /* 15775c6c1daeSBarry Smith The variable Petsc_Viewer_Binary_keyval is used to indicate an MPI attribute that 15785c6c1daeSBarry Smith is attached to a communicator, in this case the attribute is a PetscViewer. 15795c6c1daeSBarry Smith */ 1580d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Binary_keyval = MPI_KEYVAL_INVALID; 15815c6c1daeSBarry Smith 15825c6c1daeSBarry Smith /*@C 1583811af0c4SBarry Smith PETSC_VIEWER_BINARY_ - Creates a `PETSCVIEWERBINARY` `PetscViewer` shared by all processors 15845c6c1daeSBarry Smith in a communicator. 15855c6c1daeSBarry Smith 1586d083f849SBarry Smith Collective 15875c6c1daeSBarry Smith 15885c6c1daeSBarry Smith Input Parameter: 1589811af0c4SBarry Smith . comm - the MPI communicator to share the `PETSCVIEWERBINARY` 15905c6c1daeSBarry Smith 15915c6c1daeSBarry Smith Level: intermediate 15925c6c1daeSBarry Smith 15935c6c1daeSBarry Smith Options Database Keys: 159410699b91SBarry Smith + -viewer_binary_filename <name> - filename in which to store the binary data, defaults to binaryoutput 159510699b91SBarry Smith . -viewer_binary_skip_info - true means do not create .info file for this viewer 159610699b91SBarry Smith . -viewer_binary_skip_options - true means do not use the options database for this viewer 159710699b91SBarry Smith . -viewer_binary_skip_header - true means do not store the usual header information in the binary file 159810699b91SBarry Smith - -viewer_binary_mpiio - true means use the file via MPI-IO, maybe faster for large files and many MPI ranks 15995c6c1daeSBarry Smith 1600811af0c4SBarry Smith Environmental variable: 160110699b91SBarry Smith - PETSC_VIEWER_BINARY_FILENAME - filename in which to store the binary data, defaults to binaryoutput 16025c6c1daeSBarry Smith 1603811af0c4SBarry Smith Note: 1604811af0c4SBarry Smith Unlike almost all other PETSc routines, `PETSC_VIEWER_BINARY_` does not return 16055c6c1daeSBarry Smith an error code. The binary PetscViewer is usually used in the form 16065c6c1daeSBarry Smith $ XXXView(XXX object, PETSC_VIEWER_BINARY_(comm)); 16075c6c1daeSBarry Smith 1608d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERBINARY`, `PETSC_VIEWER_BINARY_WORLD`, `PETSC_VIEWER_BINARY_SELF`, `PetscViewerBinaryOpen()`, `PetscViewerCreate()`, 1609db781477SPatrick Sanan `PetscViewerDestroy()` 16105c6c1daeSBarry Smith @*/ 1611d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_BINARY_(MPI_Comm comm) 1612d71ae5a4SJacob Faibussowitsch { 16135c6c1daeSBarry Smith PetscErrorCode ierr; 16143ba16761SJacob Faibussowitsch PetscMPIInt mpi_ierr; 16155c6c1daeSBarry Smith PetscBool flg; 16165c6c1daeSBarry Smith PetscViewer viewer; 16175c6c1daeSBarry Smith char fname[PETSC_MAX_PATH_LEN]; 16185c6c1daeSBarry Smith MPI_Comm ncomm; 16195c6c1daeSBarry Smith 16205c6c1daeSBarry Smith PetscFunctionBegin; 16219371c9d4SSatish Balay ierr = PetscCommDuplicate(comm, &ncomm, NULL); 16229371c9d4SSatish Balay if (ierr) { 16233ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_BINARY_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 16249371c9d4SSatish Balay PetscFunctionReturn(NULL); 16259371c9d4SSatish Balay } 16265c6c1daeSBarry Smith if (Petsc_Viewer_Binary_keyval == MPI_KEYVAL_INVALID) { 16273ba16761SJacob Faibussowitsch mpi_ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_Binary_keyval, NULL); 16283ba16761SJacob Faibussowitsch if (mpi_ierr) { 16293ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_BINARY_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 16309371c9d4SSatish Balay PetscFunctionReturn(NULL); 16319371c9d4SSatish Balay } 16325c6c1daeSBarry Smith } 16333ba16761SJacob Faibussowitsch mpi_ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_Binary_keyval, (void **)&viewer, (int *)&flg); 16343ba16761SJacob Faibussowitsch if (mpi_ierr) { 16353ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_BINARY_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 16369371c9d4SSatish Balay PetscFunctionReturn(NULL); 16379371c9d4SSatish Balay } 16385c6c1daeSBarry Smith if (!flg) { /* PetscViewer not yet created */ 16395c6c1daeSBarry Smith ierr = PetscOptionsGetenv(ncomm, "PETSC_VIEWER_BINARY_FILENAME", fname, PETSC_MAX_PATH_LEN, &flg); 16409371c9d4SSatish Balay if (ierr) { 16413ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_BINARY_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 16429371c9d4SSatish Balay PetscFunctionReturn(NULL); 16439371c9d4SSatish Balay } 16445c6c1daeSBarry Smith if (!flg) { 1645c6a7a370SJeremy L Thompson ierr = PetscStrncpy(fname, "binaryoutput", sizeof(fname)); 16469371c9d4SSatish Balay if (ierr) { 16473ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_BINARY_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 16489371c9d4SSatish Balay PetscFunctionReturn(NULL); 16499371c9d4SSatish Balay } 16505c6c1daeSBarry Smith } 16515c6c1daeSBarry Smith ierr = PetscViewerBinaryOpen(ncomm, fname, FILE_MODE_WRITE, &viewer); 16529371c9d4SSatish Balay if (ierr) { 16533ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_BINARY_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 16549371c9d4SSatish Balay PetscFunctionReturn(NULL); 16559371c9d4SSatish Balay } 16565c6c1daeSBarry Smith ierr = PetscObjectRegisterDestroy((PetscObject)viewer); 16579371c9d4SSatish Balay if (ierr) { 16583ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_BINARY_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 16599371c9d4SSatish Balay PetscFunctionReturn(NULL); 16609371c9d4SSatish Balay } 16613ba16761SJacob Faibussowitsch mpi_ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_Binary_keyval, (void *)viewer); 16623ba16761SJacob Faibussowitsch if (mpi_ierr) { 16633ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_BINARY_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 16649371c9d4SSatish Balay PetscFunctionReturn(NULL); 16659371c9d4SSatish Balay } 16665c6c1daeSBarry Smith } 16675c6c1daeSBarry Smith ierr = PetscCommDestroy(&ncomm); 16689371c9d4SSatish Balay if (ierr) { 16693ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_BINARY_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 16709371c9d4SSatish Balay PetscFunctionReturn(NULL); 16719371c9d4SSatish Balay } 16725c6c1daeSBarry Smith PetscFunctionReturn(viewer); 16735c6c1daeSBarry Smith } 1674