14c02969dSBarry Smith #include <petsc/private/viewerimpl.h> /*I "petscsys.h" I*/ 24c02969dSBarry Smith #include <adios.h> 322580e64SBarry Smith #include <adios_read.h> 44c02969dSBarry Smith 58a976931SBarry Smith #include <petsc/private/vieweradiosimpl.h> 64c02969dSBarry Smith 7d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerSetFromOptions_ADIOS(PetscViewer v, PetscOptionItems *PetscOptionsObject) 8d71ae5a4SJacob Faibussowitsch { 94c02969dSBarry Smith PetscFunctionBegin; 10d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "ADIOS PetscViewer Options"); 11d0609cedSBarry Smith PetscOptionsHeadEnd(); 123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 134c02969dSBarry Smith } 144c02969dSBarry Smith 15d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileClose_ADIOS(PetscViewer viewer) 16d71ae5a4SJacob Faibussowitsch { 174c02969dSBarry Smith PetscViewer_ADIOS *adios = (PetscViewer_ADIOS *)viewer->data; 184c02969dSBarry Smith 194c02969dSBarry Smith PetscFunctionBegin; 2022580e64SBarry Smith switch (adios->btype) { 21d71ae5a4SJacob Faibussowitsch case FILE_MODE_READ: 223ba16761SJacob Faibussowitsch PetscCallExternal(adios_read_close, adios->adios_fp); 23d71ae5a4SJacob Faibussowitsch break; 24d71ae5a4SJacob Faibussowitsch case FILE_MODE_WRITE: 253ba16761SJacob Faibussowitsch PetscCallExternal(adios_close, adios->adios_handle); 26d71ae5a4SJacob Faibussowitsch break; 27d71ae5a4SJacob Faibussowitsch default: 28d71ae5a4SJacob Faibussowitsch break; 2922580e64SBarry Smith } 309566063dSJacob Faibussowitsch PetscCall(PetscFree(adios->filename)); 313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 324c02969dSBarry Smith } 334c02969dSBarry Smith 34d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDestroy_ADIOS(PetscViewer viewer) 35d71ae5a4SJacob Faibussowitsch { 364c02969dSBarry Smith PetscViewer_ADIOS *adios = (PetscViewer_ADIOS *)viewer->data; 374c02969dSBarry Smith 384c02969dSBarry Smith PetscFunctionBegin; 399566063dSJacob Faibussowitsch PetscCall(PetscViewerFileClose_ADIOS(viewer)); 409566063dSJacob Faibussowitsch PetscCall(PetscFree(adios)); 419566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetName_C", NULL)); 429566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetName_C", NULL)); 439566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetMode_C", NULL)); 443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 454c02969dSBarry Smith } 464c02969dSBarry Smith 47d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFileSetMode_ADIOS(PetscViewer viewer, PetscFileMode type) 48d71ae5a4SJacob Faibussowitsch { 494c02969dSBarry Smith PetscViewer_ADIOS *adios = (PetscViewer_ADIOS *)viewer->data; 504c02969dSBarry Smith 514c02969dSBarry Smith PetscFunctionBegin; 524c02969dSBarry Smith adios->btype = type; 533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 544c02969dSBarry Smith } 554c02969dSBarry Smith 56d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFileSetName_ADIOS(PetscViewer viewer, const char name[]) 57d71ae5a4SJacob Faibussowitsch { 58a56f64adSBarry Smith PetscViewer_ADIOS *adios = (PetscViewer_ADIOS *)viewer->data; 59a56f64adSBarry Smith 604c02969dSBarry Smith PetscFunctionBegin; 619566063dSJacob Faibussowitsch if (adios->filename) PetscCall(PetscFree(adios->filename)); 629566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(name, &adios->filename)); 63a56f64adSBarry Smith /* Create or open the file collectively */ 64a56f64adSBarry Smith switch (adios->btype) { 65d71ae5a4SJacob Faibussowitsch case FILE_MODE_READ: 66d71ae5a4SJacob Faibussowitsch adios->adios_fp = adios_read_open_file(adios->filename, ADIOS_READ_METHOD_BP, PetscObjectComm((PetscObject)viewer)); 67d71ae5a4SJacob Faibussowitsch break; 68d71ae5a4SJacob Faibussowitsch case FILE_MODE_WRITE: 69d71ae5a4SJacob Faibussowitsch adios_open(&adios->adios_handle, "PETSc", adios->filename, "w", PetscObjectComm((PetscObject)viewer)); 70d71ae5a4SJacob Faibussowitsch break; 71d71ae5a4SJacob Faibussowitsch case FILE_MODE_UNDEFINED: 72d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_ORDER, "Must call PetscViewerFileSetMode() before PetscViewerFileSetName()"); 73d71ae5a4SJacob Faibussowitsch default: 74d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unsupported file mode %s", PetscFileModes[adios->btype]); 75a56f64adSBarry Smith } 763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 774c02969dSBarry Smith } 784c02969dSBarry Smith 79d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileGetName_ADIOS(PetscViewer viewer, const char **name) 80d71ae5a4SJacob Faibussowitsch { 814c02969dSBarry Smith PetscViewer_ADIOS *vadios = (PetscViewer_ADIOS *)viewer->data; 824c02969dSBarry Smith 834c02969dSBarry Smith PetscFunctionBegin; 844c02969dSBarry Smith *name = vadios->filename; 853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 864c02969dSBarry Smith } 874c02969dSBarry Smith 884c02969dSBarry Smith /*MC 894c02969dSBarry Smith PETSCVIEWERADIOS - A viewer that writes to an ADIOS file 904c02969dSBarry Smith 91811af0c4SBarry Smith Level: beginner 92811af0c4SBarry Smith 93db781477SPatrick Sanan .seealso: `PetscViewerADIOSOpen()`, `PetscViewerStringSPrintf()`, `PetscViewerSocketOpen()`, `PetscViewerDrawOpen()`, `PETSCVIEWERSOCKET`, 94db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`, `PETSCVIEWERDRAW`, `PETSCVIEWERSTRING`, 95db781477SPatrick Sanan `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`, 96db781477SPatrick Sanan `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()` 974c02969dSBarry Smith M*/ 984c02969dSBarry Smith 99d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_ADIOS(PetscViewer v) 100d71ae5a4SJacob Faibussowitsch { 1014c02969dSBarry Smith PetscViewer_ADIOS *adios; 1024c02969dSBarry Smith 1034c02969dSBarry Smith PetscFunctionBegin; 1044dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&adios)); 1054c02969dSBarry Smith 1064c02969dSBarry Smith v->data = (void *)adios; 1074c02969dSBarry Smith v->ops->destroy = PetscViewerDestroy_ADIOS; 1084c02969dSBarry Smith v->ops->setfromoptions = PetscViewerSetFromOptions_ADIOS; 1097e4fd573SVaclav Hapla v->ops->flush = NULL; 1107e4fd573SVaclav Hapla adios->btype = FILE_MODE_UNDEFINED; 1117e4fd573SVaclav Hapla adios->filename = NULL; 1124c02969dSBarry Smith adios->timestep = -1; 1134c02969dSBarry Smith 1149566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetName_C", PetscViewerFileSetName_ADIOS)); 1159566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileGetName_C", PetscViewerFileGetName_ADIOS)); 1169566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetMode_C", PetscViewerFileSetMode_ADIOS)); 1173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1184c02969dSBarry Smith } 1194c02969dSBarry Smith 1204c02969dSBarry Smith /*@C 1214c02969dSBarry Smith PetscViewerADIOSOpen - Opens a file for ADIOS input/output. 1224c02969dSBarry Smith 123d083f849SBarry Smith Collective 1244c02969dSBarry Smith 1254c02969dSBarry Smith Input Parameters: 1264c02969dSBarry Smith + comm - MPI communicator 1274c02969dSBarry Smith . name - name of file 1284c02969dSBarry Smith - type - type of file 129*20f4b53cSBarry Smith .vb 130*20f4b53cSBarry Smith FILE_MODE_WRITE - create new file for binary output 131*20f4b53cSBarry Smith FILE_MODE_READ - open existing file for binary input 132*20f4b53cSBarry Smith FILE_MODE_APPEND - open existing file for binary output 133*20f4b53cSBarry Smith .ve 1344c02969dSBarry Smith 1354c02969dSBarry Smith Output Parameter: 136811af0c4SBarry Smith . adiosv - `PetscViewer` for ADIOS input/output to use with the specified file 1374c02969dSBarry Smith 1384c02969dSBarry Smith Level: beginner 1394c02969dSBarry Smith 1404c02969dSBarry Smith Note: 141*20f4b53cSBarry Smith This `PetscViewer` should be destroyed with `PetscViewerDestroy()`. 1424c02969dSBarry Smith 143db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`, `PetscViewerHDF5Open()`, 144db781477SPatrick Sanan `VecView()`, `MatView()`, `VecLoad()`, `PetscViewerSetType()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetName()` 145db781477SPatrick Sanan `MatLoad()`, `PetscFileMode`, `PetscViewer` 1464c02969dSBarry Smith @*/ 147d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerADIOSOpen(MPI_Comm comm, const char name[], PetscFileMode type, PetscViewer *adiosv) 148d71ae5a4SJacob Faibussowitsch { 1494c02969dSBarry Smith PetscFunctionBegin; 1509566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, adiosv)); 1519566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(*adiosv, PETSCVIEWERADIOS)); 1529566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(*adiosv, type)); 1539566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(*adiosv, name)); 1543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1554c02969dSBarry Smith } 1564c02969dSBarry Smith 1574c02969dSBarry Smith /*@C 1584c02969dSBarry Smith PetscDataTypeToADIOSDataType - Converts the PETSc name of a datatype to its ADIOS name. 1594c02969dSBarry Smith 1604c02969dSBarry Smith Not collective 1614c02969dSBarry Smith 1624c02969dSBarry Smith Input Parameter: 163811af0c4SBarry Smith . ptype - the PETSc datatype name (for example `PETSC_DOUBLE`) 1644c02969dSBarry Smith 1654c02969dSBarry Smith Output Parameter: 166811af0c4SBarry Smith . mtype - the ADIOS datatype (for example MPI_DOUBLE, ...) 1674c02969dSBarry Smith 1684c02969dSBarry Smith Level: advanced 1694c02969dSBarry Smith 170db781477SPatrick Sanan .seealso: `PetscDataType`, `PetscADIOSDataTypeToPetscDataType()` 1714c02969dSBarry Smith @*/ 172d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDataTypeToADIOSDataType(PetscDataType ptype, enum ADIOS_DATATYPES *htype) 173d71ae5a4SJacob Faibussowitsch { 1744c02969dSBarry Smith PetscFunctionBegin; 1754c02969dSBarry Smith if (ptype == PETSC_INT) 1764c02969dSBarry Smith #if defined(PETSC_USE_64BIT_INDICES) 1774c02969dSBarry Smith *htype = adios_long; 1784c02969dSBarry Smith #else 1794c02969dSBarry Smith *htype = adios_integer; 1804c02969dSBarry Smith #endif 1814c02969dSBarry Smith else if (ptype == PETSC_ENUM) *htype = adios_integer; 1824c02969dSBarry Smith else if (ptype == PETSC_DOUBLE) *htype = adios_double; 1834c02969dSBarry Smith else if (ptype == PETSC_LONG) *htype = adios_long; 1844c02969dSBarry Smith else if (ptype == PETSC_SHORT) *htype = adios_short; 1854c02969dSBarry Smith else if (ptype == PETSC_FLOAT) *htype = adios_real; 1864c02969dSBarry Smith else if (ptype == PETSC_CHAR) *htype = adios_string_array; 1874c02969dSBarry Smith else if (ptype == PETSC_STRING) *htype = adios_string; 1884c02969dSBarry Smith else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Unsupported PETSc datatype"); 1893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1904c02969dSBarry Smith } 1914c02969dSBarry Smith 1924c02969dSBarry Smith /*@C 1934c02969dSBarry Smith PetscADIOSDataTypeToPetscDataType - Finds the PETSc name of a datatype from its ADIOS name 1944c02969dSBarry Smith 1954c02969dSBarry Smith Not collective 1964c02969dSBarry Smith 1974c02969dSBarry Smith Input Parameter: 1984c02969dSBarry Smith . htype - the ADIOS datatype (for example H5T_NATIVE_DOUBLE, ...) 1994c02969dSBarry Smith 2004c02969dSBarry Smith Output Parameter: 201811af0c4SBarry Smith . ptype - the PETSc datatype name (for example `PETSC_DOUBLE`) 2024c02969dSBarry Smith 2034c02969dSBarry Smith Level: advanced 2044c02969dSBarry Smith 205db781477SPatrick Sanan .seealso: `PetscDataType`, `PetscADIOSDataTypeToPetscDataType()` 2064c02969dSBarry Smith @*/ 207d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscADIOSDataTypeToPetscDataType(enum ADIOS_DATATYPES htype, PetscDataType *ptype) 208d71ae5a4SJacob Faibussowitsch { 2094c02969dSBarry Smith PetscFunctionBegin; 2104c02969dSBarry Smith #if defined(PETSC_USE_64BIT_INDICES) 2114c02969dSBarry Smith if (htype == adios_integer) *ptype = PETSC_ENUM; 2124c02969dSBarry Smith else if (htype == adios_long) *ptype = PETSC_INT; 2134c02969dSBarry Smith #else 2144c02969dSBarry Smith if (htype == adios_integer) *ptype = PETSC_INT; 2154c02969dSBarry Smith #endif 2164c02969dSBarry Smith else if (htype == adios_double) *ptype = PETSC_DOUBLE; 2174c02969dSBarry Smith else if (htype == adios_long) *ptype = PETSC_LONG; 2184c02969dSBarry Smith else if (htype == adios_short) *ptype = PETSC_SHORT; 2194c02969dSBarry Smith else if (htype == adios_real) *ptype = PETSC_FLOAT; 2204c02969dSBarry Smith else if (htype == adios_string_array) *ptype = PETSC_CHAR; 2214c02969dSBarry Smith else if (htype == adios_string) *ptype = PETSC_STRING; 2224c02969dSBarry Smith else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Unsupported ADIOS datatype"); 2233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2244c02969dSBarry Smith } 225