Actual source code: adios.c

  1: #include <petsc/private/viewerimpl.h>
  2: #include <adios.h>
  3: #include <adios_read.h>

  5: #include <petsc/private/vieweradiosimpl.h>

  7: static PetscErrorCode PetscViewerSetFromOptions_ADIOS(PetscViewer v, PetscOptionItems *PetscOptionsObject)
  8: {
  9:   PetscFunctionBegin;
 10:   PetscOptionsHeadBegin(PetscOptionsObject, "ADIOS PetscViewer Options");
 11:   PetscOptionsHeadEnd();
 12:   PetscFunctionReturn(PETSC_SUCCESS);
 13: }

 15: static PetscErrorCode PetscViewerFileClose_ADIOS(PetscViewer viewer)
 16: {
 17:   PetscViewer_ADIOS *adios = (PetscViewer_ADIOS *)viewer->data;

 19:   PetscFunctionBegin;
 20:   switch (adios->btype) {
 21:   case FILE_MODE_READ:
 22:     PetscCallExternal(adios_read_close, adios->adios_fp);
 23:     break;
 24:   case FILE_MODE_WRITE:
 25:     PetscCallExternal(adios_close, adios->adios_handle);
 26:     break;
 27:   default:
 28:     break;
 29:   }
 30:   PetscCall(PetscFree(adios->filename));
 31:   PetscFunctionReturn(PETSC_SUCCESS);
 32: }

 34: static PetscErrorCode PetscViewerDestroy_ADIOS(PetscViewer viewer)
 35: {
 36:   PetscViewer_ADIOS *adios = (PetscViewer_ADIOS *)viewer->data;

 38:   PetscFunctionBegin;
 39:   PetscCall(PetscViewerFileClose_ADIOS(viewer));
 40:   PetscCall(PetscFree(adios));
 41:   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetName_C", NULL));
 42:   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetName_C", NULL));
 43:   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetMode_C", NULL));
 44:   PetscFunctionReturn(PETSC_SUCCESS);
 45: }

 47: static PetscErrorCode PetscViewerFileSetMode_ADIOS(PetscViewer viewer, PetscFileMode type)
 48: {
 49:   PetscViewer_ADIOS *adios = (PetscViewer_ADIOS *)viewer->data;

 51:   PetscFunctionBegin;
 52:   adios->btype = type;
 53:   PetscFunctionReturn(PETSC_SUCCESS);
 54: }

 56: static PetscErrorCode PetscViewerFileSetName_ADIOS(PetscViewer viewer, const char name[])
 57: {
 58:   PetscViewer_ADIOS *adios = (PetscViewer_ADIOS *)viewer->data;

 60:   PetscFunctionBegin;
 61:   if (adios->filename) PetscCall(PetscFree(adios->filename));
 62:   PetscCall(PetscStrallocpy(name, &adios->filename));
 63:   /* Create or open the file collectively */
 64:   switch (adios->btype) {
 65:   case FILE_MODE_READ:
 66:     adios->adios_fp = adios_read_open_file(adios->filename, ADIOS_READ_METHOD_BP, PetscObjectComm((PetscObject)viewer));
 67:     break;
 68:   case FILE_MODE_WRITE:
 69:     adios_open(&adios->adios_handle, "PETSc", adios->filename, "w", PetscObjectComm((PetscObject)viewer));
 70:     break;
 71:   case FILE_MODE_UNDEFINED:
 72:     SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_ORDER, "Must call PetscViewerFileSetMode() before PetscViewerFileSetName()");
 73:   default:
 74:     SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unsupported file mode %s", PetscFileModes[adios->btype]);
 75:   }
 76:   PetscFunctionReturn(PETSC_SUCCESS);
 77: }

 79: static PetscErrorCode PetscViewerFileGetName_ADIOS(PetscViewer viewer, const char **name)
 80: {
 81:   PetscViewer_ADIOS *vadios = (PetscViewer_ADIOS *)viewer->data;

 83:   PetscFunctionBegin;
 84:   *name = vadios->filename;
 85:   PetscFunctionReturn(PETSC_SUCCESS);
 86: }

 88: /*MC
 89:    PETSCVIEWERADIOS - A viewer that writes to an ADIOS file

 91:   Level: beginner

 93: .seealso: `PetscViewerADIOSOpen()`, `PetscViewerStringSPrintf()`, `PetscViewerSocketOpen()`, `PetscViewerDrawOpen()`, `PETSCVIEWERSOCKET`,
 94:           `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`, `PETSCVIEWERDRAW`, `PETSCVIEWERSTRING`,
 95:           `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`,
 96:           `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()`
 97: M*/

 99: PETSC_EXTERN PetscErrorCode PetscViewerCreate_ADIOS(PetscViewer v)
100: {
101:   PetscViewer_ADIOS *adios;

103:   PetscFunctionBegin;
104:   PetscCall(PetscNew(&adios));

106:   v->data                = (void *)adios;
107:   v->ops->destroy        = PetscViewerDestroy_ADIOS;
108:   v->ops->setfromoptions = PetscViewerSetFromOptions_ADIOS;
109:   v->ops->flush          = NULL;
110:   adios->btype           = FILE_MODE_UNDEFINED;
111:   adios->filename        = NULL;
112:   adios->timestep        = -1;

114:   PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetName_C", PetscViewerFileSetName_ADIOS));
115:   PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileGetName_C", PetscViewerFileGetName_ADIOS));
116:   PetscCall(PetscObjectComposeFunction((PetscObject)v, "PetscViewerFileSetMode_C", PetscViewerFileSetMode_ADIOS));
117:   PetscFunctionReturn(PETSC_SUCCESS);
118: }

120: /*@C
121:   PetscViewerADIOSOpen - Opens a file for ADIOS input/output.

123:   Collective

125:   Input Parameters:
126: + comm - MPI communicator
127: . name - name of file
128: - type - type of file
129: .vb
130:     FILE_MODE_WRITE - create new file for binary output
131:     FILE_MODE_READ - open existing file for binary input
132:     FILE_MODE_APPEND - open existing file for binary output
133: .ve

135:   Output Parameter:
136: . adiosv - `PetscViewer` for ADIOS input/output to use with the specified file

138:   Level: beginner

140:   Note:
141:   This `PetscViewer` should be destroyed with `PetscViewerDestroy()`.

143: .seealso: `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`, `PetscViewerHDF5Open()`,
144:           `VecView()`, `MatView()`, `VecLoad()`, `PetscViewerSetType()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetName()`
145:           `MatLoad()`, `PetscFileMode`, `PetscViewer`
146: @*/
147: PetscErrorCode PetscViewerADIOSOpen(MPI_Comm comm, const char name[], PetscFileMode type, PetscViewer *adiosv)
148: {
149:   PetscFunctionBegin;
150:   PetscCall(PetscViewerCreate(comm, adiosv));
151:   PetscCall(PetscViewerSetType(*adiosv, PETSCVIEWERADIOS));
152:   PetscCall(PetscViewerFileSetMode(*adiosv, type));
153:   PetscCall(PetscViewerFileSetName(*adiosv, name));
154:   PetscFunctionReturn(PETSC_SUCCESS);
155: }