Actual source code: viewerhdf5impl.h

  1: #pragma once

  3: #if defined(H5_VERSION)
  4:   #error "viewerhdf5impl.h must be included *before* any other HDF5 headers"
  5: #else
  6:   #define H5_USE_18_API
  7: #endif
  8: #include <petscviewerhdf5.h>
  9: #include <petsc/private/viewerimpl.h>

 11: #if defined(PETSC_HAVE_HDF5)

 13:   /*
 14:   HDF5 function specifications usually read:
 15:   Returns a non-negative value if successful; otherwise returns a negative value.
 16:   (see e.g. https://support.hdfgroup.org/HDF5/doc/RM/RM_H5O.html#Object-Close)
 17: */
 18:   #define PetscCallHDF5(func, args) \
 19:     do { \
 20:       herr_t _status; \
 21:       PetscStackPushExternal(#func); \
 22:       _status = func args; \
 23:       PetscStackPop; \
 24:       PetscCheck(_status >= 0, PETSC_COMM_SELF, PETSC_ERR_LIB, "Error in HDF5 call %s() Status %d", #func, (int)_status); \
 25:     } while (0)

 27:   #define PetscCallHDF5ReturnNoCheck(ret, func, args) \
 28:     do { \
 29:       PetscStackPushExternal(#func); \
 30:       ret = func args; \
 31:       PetscStackPop; \
 32:     } while (0)

 34:   #define PetscCallHDF5Return(ret, func, args) \
 35:     do { \
 36:       PetscCallHDF5ReturnNoCheck(ret, func, args); \
 37:       PetscCheck(ret >= 0, PETSC_COMM_SELF, PETSC_ERR_LIB, "Error in HDF5 call %s() Status %d", #func, (int)ret); \
 38:     } while (0)

 40: typedef struct PetscViewerHDF5GroupList {
 41:   const char                      *name;
 42:   struct PetscViewerHDF5GroupList *next;
 43: } PetscViewerHDF5GroupList;

 45: typedef struct {
 46:   char                     *filename;
 47:   PetscFileMode             btype;
 48:   hid_t                     file_id;
 49:   hid_t                     dxpl_id;         /* H5P_DATASET_XFER property list controlling raw data transfer (read/write). Properties are modified using H5Pset_dxpl_* functions. */
 50:   PetscBool                 timestepping;    /* Flag to indicate whether objects are stored by time index */
 51:   PetscInt                  timestep;        /* The time index to look for an object at */
 52:   PetscBool                 defTimestepping; /* Default if timestepping attribute is not found. Support for legacy files with no timestepping attribute */
 53:   PetscViewerHDF5GroupList *groups;
 54:   PetscBool                 basedimension2; /* save vectors and DMDA vectors with a dimension of at least 2 even if the bs/dof is 1 */
 55:   PetscBool                 spoutput;       /* write data in single precision even if PETSc is compiled with double precision PetscReal */
 56:   PetscBool                 horizontal;     /* store column vectors as blocks (needed for MATDENSE I/O) */
 57: } PetscViewer_HDF5;

 59: PETSC_SINGLE_LIBRARY_INTERN PetscErrorCode PetscViewerHDF5CheckTimestepping_Internal(PetscViewer, const char[]); /* currently used in src/dm/impls/da/gr2.c so needs to be extern */

 61:   /* DMPlex-specific support */
 62:   #define DMPLEX_STORAGE_VERSION_READING_KEY "_dm_plex_storage_version_reading"
 63:   #define DMPLEX_STORAGE_VERSION_WRITING_KEY "_dm_plex_storage_version_writing"

 65: static inline PetscErrorCode PetscViewerHDF5ResetAttachedDMPlexStorageVersion(PetscViewer v)
 66: {
 67:   PetscFunctionBegin;
 68:   PetscCall(PetscObjectCompose((PetscObject)v, DMPLEX_STORAGE_VERSION_READING_KEY, NULL));
 69:   PetscCall(PetscObjectCompose((PetscObject)v, DMPLEX_STORAGE_VERSION_WRITING_KEY, NULL));
 70:   PetscFunctionReturn(PETSC_SUCCESS);
 71: }
 72: #endif