OGS
HdfWriter.cpp File Reference

Detailed Description

Definition in file HdfWriter.cpp.

#include "HdfWriter.h"
#include <hdf5.h>
#include <string>
#include <utility>
#include <vector>
#include "BaseLib/Error.h"
#include "BaseLib/Logging.h"
#include "fileIO.h"
Include dependency graph for HdfWriter.cpp:

Go to the source code of this file.

Classes

struct  MeshLib::IO::HdfWriter::HdfMesh
 

Namespaces

 MeshLib
 
 MeshLib::IO
 

Functions

template<typename... Args>
void checkHdfStatus (const hid_t status, std::string const &formatting, Args &&... args)
 
static bool checkCompression ()
 
static std::vector< Hdf5DimTypeprependDimension (Hdf5DimType const prepend_value, std::vector< Hdf5DimType > const &dimensions)
 
static hid_t createDataSet (hid_t const data_type, std::vector< Hdf5DimType > const &data_dims, std::vector< Hdf5DimType > const &max_dims, [[maybe_unused]] std::vector< Hdf5DimType > const &chunk_dims, bool const use_compression, hid_t const section, std::string const &dataset_name)
 
static void writeDataSet (void const *nodes_data, hid_t const data_type, std::vector< Hdf5DimType > const &data_dims, std::vector< Hdf5DimType > const &offset_dims, std::vector< Hdf5DimType > const &max_dims, [[maybe_unused]] std::vector< Hdf5DimType > const &chunk_dims, std::string const &dataset_name, Hdf5DimType const step, hid_t const dataset)
 Assumes a dataset is already opened by createDatasetFunction. More...
 
static void writeTimeSeries (hid_t const file, std::vector< double > const &step_times, bool const is_file_manager)
 Write vector with time values into open hdf file. More...
 

Variables

static unsigned short int const default_compression_factor = 1
 

Function Documentation

◆ checkCompression()

static bool checkCompression ( )
static

Definition at line 37 of file HdfWriter.cpp.

38 {
39  // Check if gzip compression is available and can be used for both
40  // compression and decompression.
41  if (htri_t avail = H5Zfilter_avail(H5Z_FILTER_DEFLATE); !avail)
42  {
43  WARN("gzip filter not available.\n");
44  return false;
45  }
46  unsigned int filter_info;
47  H5Zget_filter_info(H5Z_FILTER_DEFLATE, &filter_info);
48  if (!(filter_info & H5Z_FILTER_CONFIG_ENCODE_ENABLED) ||
49  !(filter_info & H5Z_FILTER_CONFIG_DECODE_ENABLED))
50  {
51  WARN("gzip filter not available for encoding and decoding.\n");
52  return false;
53  }
54  return true;
55 }
void WARN(char const *fmt, Args const &... args)
Definition: Logging.h:37

References WARN().

◆ checkHdfStatus()

template<typename... Args>
void checkHdfStatus ( const hid_t  status,
std::string const &  formatting,
Args &&...  args 
)

Definition at line 22 of file HdfWriter.cpp.

24 {
25  if (status < 0)
26  {
27  OGS_FATAL(formatting, std::forward<Args>(args)...);
28  }
29 }
#define OGS_FATAL(...)
Definition: Error.h:26

References OGS_FATAL.

Referenced by MeshLib::IO::HdfWriter::HdfWriter().

◆ createDataSet()

static hid_t createDataSet ( hid_t const  data_type,
std::vector< Hdf5DimType > const &  data_dims,
std::vector< Hdf5DimType > const &  max_dims,
[[maybe_unused] ] std::vector< Hdf5DimType > const &  chunk_dims,
bool const  use_compression,
hid_t const  section,
std::string const &  dataset_name 
)
static

Definition at line 65 of file HdfWriter.cpp.

71 {
72  int const time_dim_local_size = data_dims.size() + 1;
73 
74  std::vector<Hdf5DimType> const time_max_dims =
75  prependDimension(H5S_UNLIMITED, max_dims);
76  std::vector<Hdf5DimType> const time_data_global_dims =
77  prependDimension(1, max_dims);
78 
79  std::vector<Hdf5DimType> const time_data_chunk_dims =
80  prependDimension(1, chunk_dims);
81 
82  hid_t const fspace =
83  H5Screate_simple(time_dim_local_size, time_data_global_dims.data(),
84  time_max_dims.data());
85  assert(fspace >= 0);
86 
87  hid_t const dcpl = H5Pcreate(H5P_DATASET_CREATE);
88  assert(dcpl >= 0);
89 
90  hid_t const status =
91  H5Pset_chunk(dcpl, chunk_dims.size() + 1, time_data_chunk_dims.data());
92  if (status < 0)
93  {
94  OGS_FATAL("H5Pset_layout failed for data set: {:s}.", dataset_name);
95  }
96 
97  if (use_compression)
98  {
99  H5Pset_deflate(dcpl, default_compression_factor);
100  }
101 
102  hid_t const dataset = H5Dcreate2(section, dataset_name.c_str(), data_type,
103  fspace, H5P_DEFAULT, dcpl, H5P_DEFAULT);
104 
105  assert(dataset >= 0);
106  H5Pclose(dcpl);
107  assert(H5Sclose(fspace) >= 0);
108 
109  return dataset;
110 }
static std::vector< Hdf5DimType > prependDimension(Hdf5DimType const prepend_value, std::vector< Hdf5DimType > const &dimensions)
Definition: HdfWriter.cpp:57
static unsigned short int const default_compression_factor
Definition: HdfWriter.cpp:31

References default_compression_factor, OGS_FATAL, and prependDimension().

Referenced by MeshLib::IO::HdfWriter::HdfWriter().

◆ prependDimension()

static std::vector<Hdf5DimType> prependDimension ( Hdf5DimType const  prepend_value,
std::vector< Hdf5DimType > const &  dimensions 
)
static

Definition at line 57 of file HdfWriter.cpp.

59 {
60  std::vector<Hdf5DimType> dims = {prepend_value};
61  dims.insert(dims.end(), dimensions.begin(), dimensions.end());
62  return dims;
63 }

Referenced by createDataSet(), and writeDataSet().

◆ writeDataSet()

static void writeDataSet ( void const *  nodes_data,
hid_t const  data_type,
std::vector< Hdf5DimType > const &  data_dims,
std::vector< Hdf5DimType > const &  offset_dims,
std::vector< Hdf5DimType > const &  max_dims,
[[maybe_unused] ] std::vector< Hdf5DimType > const &  chunk_dims,
std::string const &  dataset_name,
Hdf5DimType const  step,
hid_t const  dataset 
)
static

Assumes a dataset is already opened by createDatasetFunction.

Defines what (nodes_data, data_type) will be written how (data subsections: data_dims, offset_dims, max_dims, chunk_dims, time) where (dataset and dataset_name)

Definition at line 117 of file HdfWriter.cpp.

126 {
127  Hdf5DimType const time_steps = step + 1;
128 
129  std::vector<Hdf5DimType> const time_data_local_dims = data_dims;
130  std::vector<Hdf5DimType> const time_max_dims =
131  prependDimension(time_steps, max_dims);
132  std::vector<Hdf5DimType> const time_offsets =
133  prependDimension(step, offset_dims);
134  std::vector<hsize_t> const count =
135  prependDimension(1, time_data_local_dims);
136 
137  hid_t const io_transfer_property = createHDF5TransferPolicy();
138 
139  hid_t const mspace = H5Screate_simple(time_data_local_dims.size(),
140  time_data_local_dims.data(), NULL);
141  assert(H5Sselect_all(mspace) >= 0);
142 
143  hid_t status = H5Dset_extent(dataset, time_max_dims.data());
144  if (status < 0)
145  {
146  OGS_FATAL("H5D set extent failed dataset '{:s}'.", dataset_name);
147  }
148  hid_t const fspace = H5Dget_space(dataset);
149 
150  H5Sselect_hyperslab(fspace, H5S_SELECT_SET, time_offsets.data(), NULL,
151  count.data(), NULL);
152 
153  status = H5Dwrite(dataset, data_type, mspace, fspace, io_transfer_property,
154  nodes_data);
155  if (status < 0)
156  {
157  OGS_FATAL("H5Dwrite failed in dataset '{:s}'.", dataset_name);
158  }
159 
160  H5Sclose(mspace);
161  H5Pclose(io_transfer_property);
162 
163  return;
164 }
unsigned long long Hdf5DimType
Definition: HdfData.h:22
int64_t createHDF5TransferPolicy()
Definition: fileIO.cpp:69

References MeshLib::IO::createHDF5TransferPolicy(), OGS_FATAL, and prependDimension().

Referenced by MeshLib::IO::HdfWriter::HdfWriter(), and MeshLib::IO::HdfWriter::writeStep().

◆ writeTimeSeries()

static void writeTimeSeries ( hid_t const  file,
std::vector< double > const &  step_times,
bool const  is_file_manager 
)
static

Write vector with time values into open hdf file.

In contrast to all other hdf write methods writing is only performed by one process (is_file_manager_true). file handle is to an already opened file

Definition at line 172 of file HdfWriter.cpp.

175 {
176  hsize_t const size = step_times.size();
177  hid_t const memspace = H5Screate_simple(1, &size, NULL);
178  hid_t const filespace = H5Screate_simple(1, &size, NULL);
179 
180  if (is_file_manager)
181  {
182  H5Sselect_all(memspace);
183  H5Sselect_all(filespace);
184  }
185  else
186  {
187  H5Sselect_none(memspace);
188  H5Sselect_none(filespace);
189  }
190 
191  hid_t const dataset =
192  H5Dcreate2(file, "/times", H5T_NATIVE_DOUBLE, filespace, H5P_DEFAULT,
193  H5P_DEFAULT, H5P_DEFAULT);
194 
195  H5Dwrite(dataset, H5T_NATIVE_DOUBLE, memspace, filespace, H5P_DEFAULT,
196  step_times.data());
197 
198  H5Dclose(dataset);
199  H5Sclose(memspace);
200  H5Sclose(filespace);
201 };

Referenced by MeshLib::IO::HdfWriter::~HdfWriter().

Variable Documentation

◆ default_compression_factor

unsigned short int const default_compression_factor = 1
static

Definition at line 31 of file HdfWriter.cpp.

Referenced by createDataSet().