xref: /petsc/include/petsc/private/viewerhdf5impl.h (revision 281ff59e3bafde594e860867b5957e3510a915d6)
1 #pragma once
2 
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>
10 
11 #if defined(PETSC_HAVE_HDF5)
12 
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)
26 
27   #define PetscCallHDF5ReturnNoCheck(ret, func, args) \
28     do { \
29       PetscStackPushExternal(#func); \
30       ret = func args; \
31       PetscStackPop; \
32     } while (0)
33 
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)
39 
40 typedef struct PetscViewerHDF5GroupList {
41   const char                      *name;
42   struct PetscViewerHDF5GroupList *next;
43 } PetscViewerHDF5GroupList;
44 
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   PetscBool                 compress;       // Compress output when possible
58 } PetscViewer_HDF5;
59 
60 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 
62   /* DMPlex-specific support */
63   #define DMPLEX_STORAGE_VERSION_READING_KEY "_dm_plex_storage_version_reading"
64   #define DMPLEX_STORAGE_VERSION_WRITING_KEY "_dm_plex_storage_version_writing"
65 
PetscViewerHDF5ResetAttachedDMPlexStorageVersion(PetscViewer v)66 static inline PetscErrorCode PetscViewerHDF5ResetAttachedDMPlexStorageVersion(PetscViewer v)
67 {
68   PetscFunctionBegin;
69   PetscCall(PetscObjectCompose((PetscObject)v, DMPLEX_STORAGE_VERSION_READING_KEY, NULL));
70   PetscCall(PetscObjectCompose((PetscObject)v, DMPLEX_STORAGE_VERSION_WRITING_KEY, NULL));
71   PetscFunctionReturn(PETSC_SUCCESS);
72 }
73 #endif
74