OGS
HdfWriter.cpp File Reference
#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

namespace  MeshLib
namespace  MeshLib::IO

Functions

template<typename... Args>
void checkHdfStatus (const hid_t status, fmt::format_string< Args... > 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, 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, 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.
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.

Variables

static unsigned short int const default_compression_factor = 1

Function Documentation

◆ checkCompression()

bool checkCompression ( )
static

Definition at line 29 of file HdfWriter.cpp.

30{
31 // Check if gzip compression is available and can be used for both
32 // compression and decompression.
33 if (htri_t avail = H5Zfilter_avail(H5Z_FILTER_DEFLATE); !avail)
34 {
35 WARN("gzip filter not available.\n");
36 return false;
37 }
38 unsigned int filter_info;
39 H5Zget_filter_info(H5Z_FILTER_DEFLATE, &filter_info);
40 if (!(filter_info & H5Z_FILTER_CONFIG_ENCODE_ENABLED) ||
41 !(filter_info & H5Z_FILTER_CONFIG_DECODE_ENABLED))
42 {
43 WARN("gzip filter not available for encoding and decoding.\n");
44 return false;
45 }
46 return true;
47}
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:34

References WARN().

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

◆ checkHdfStatus()

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

Definition at line 16 of file HdfWriter.cpp.

18{
19 if (status < 0)
20 {
21 OGS_FATAL(formatting, std::forward<Args>(args)...);
22 }
23}
#define OGS_FATAL(...)
Definition Error.h:19

References OGS_FATAL.

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

◆ createDataSet()

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

Definition at line 57 of file HdfWriter.cpp.

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

References default_compression_factor, OGS_FATAL, and prependDimension().

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

◆ prependDimension()

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

Definition at line 49 of file HdfWriter.cpp.

51{
52 std::vector<Hdf5DimType> dims = {prepend_value};
53 dims.insert(dims.end(), dimensions.begin(), dimensions.end());
54 return dims;
55}

Referenced by createDataSet(), and writeDataSet().

◆ writeDataSet()

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,
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 109 of file HdfWriter.cpp.

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

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

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

◆ writeTimeSeries()

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 164 of file HdfWriter.cpp.

167{
168 hsize_t const size = step_times.size();
169 hid_t const memspace = H5Screate_simple(1, &size, NULL);
170 hid_t const filespace = H5Screate_simple(1, &size, NULL);
171
172 if (is_file_manager)
173 {
174 H5Sselect_all(memspace);
175 H5Sselect_all(filespace);
176 }
177 else
178 {
179 H5Sselect_none(memspace);
180 H5Sselect_none(filespace);
181 }
182
183 hid_t const dataset =
184 H5Dcreate2(file, "/times", H5T_NATIVE_DOUBLE, filespace, H5P_DEFAULT,
185 H5P_DEFAULT, H5P_DEFAULT);
186
187 H5Dwrite(dataset, H5T_NATIVE_DOUBLE, memspace, filespace, H5P_DEFAULT,
188 step_times.data());
189
190 H5Dclose(dataset);
191 H5Sclose(memspace);
192 H5Sclose(filespace);
193};
constexpr int size(int const displacement_dim)
Vectorized tensor size for given displacement dimension.

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

Variable Documentation

◆ default_compression_factor

unsigned short int const default_compression_factor = 1
static

Definition at line 25 of file HdfWriter.cpp.

Referenced by createDataSet().