21 #include <hdf5/openmpi/hdf5.h> 29 explicit HDFUtilsError (
const std::string &val) : std::runtime_error::runtime_error(val) {}
33 #define HDFCHECK(ans) hdfAssert((ans), __FILE__, __LINE__) 34 inline void hdfAssert(herr_t code,
const char *file,
int line){
37 std::ostringstream errorStringStream;
38 errorStringStream <<
"HDF error above occured at ";
39 errorStringStream << file <<
":" << line;
49 #define HDF_IGNORE_ERRORS(expr) hdfSuppressErrors();expr;hdfRestoreErrors() 76 if (std::is_same<T, float>::value) {
77 dataType = H5T_NATIVE_FLOAT;
79 else if (std::is_same<T, double>::value) {
80 dataType = H5T_NATIVE_DOUBLE;
82 else if (std::is_same<T, unsigned short>::value) {
83 dataType = H5T_NATIVE_USHORT;
85 else if (std::is_same<T, unsigned int>::value) {
86 dataType = H5T_NATIVE_UINT;
88 else if (std::is_same<T, hdf_complex_t>::value) {
92 throw HDFUtilsError(
"Datatype lookup not implemented for this type.");
103 template <
typename T>
104 hid_t
createHDF5Dataset(hid_t file_id, std::string datasetName, std::vector<hsize_t> dataDims) {
106 hsize_t dataRank = dataDims.size();
109 hid_t dataspace = H5Screate_simple(dataRank, dataDims.data(), NULL);
113 hid_t dataType = getHDF5TypeC<T>();
116 hid_t dataset = H5Dcreate(file_id, datasetName.c_str(), dataType, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
126 template <
typename T>
127 hid_t
createHDF5GridOfArrays(hid_t file_id, std::string datasetName, std::vector<hsize_t> gridDims, std::vector<hsize_t> arrayDims) {
129 std::vector<hsize_t> dataDims = gridDims;
130 dataDims.insert(dataDims.end(), arrayDims.begin(), arrayDims.end());
133 return createHDF5Dataset<T>(file_id, datasetName, dataDims);
144 template <
typename T>
146 std::vector<hsize_t> arrayDims, std::vector<hsize_t> arrayCount)
154 hid_t datatype = H5Dget_type(dset_id);
156 hid_t datatypeExpected = getHDF5TypeC<T>();
157 if (!H5Tequal(datatype,datatypeExpected)) {
161 datatype = datatypeExpected;
164 hid_t dataspace = H5Dget_space(dset_id);
166 hsize_t dataRank = H5Sget_simple_extent_ndims(dataspace);
168 std::vector<hsize_t> dataDims(dataRank);
169 H5Sget_simple_extent_dims(dataspace, dataDims.data(), NULL);
172 hsize_t gridRank = gridOffset.size();
173 hsize_t arrayRank = arrayDims.size();
174 hsize_t dataRankExpected = gridRank + arrayRank;
175 if (dataRank != dataRankExpected) {
180 std::vector<hsize_t> arrayDimsRead(dataDims.end()-arrayDims.size(), dataDims.end());
181 if (arrayDims != arrayDimsRead) {
186 std::vector<hsize_t> gridDims(dataDims.begin(), dataDims.begin()+gridRank);
189 for (
unsigned int i=0; i<gridRank; i++) {
190 if (gridOffset[i] > gridDims[i]-1) {
196 std::vector<hsize_t> dataOffset(dataRank);
197 std::vector<hsize_t> dataCount(dataRank);
198 for (
unsigned int i=0; i<gridRank; i++) {
199 dataOffset[i] = gridOffset[i];
200 dataCount[i] = arrayCount[i];
202 for (
unsigned int i=0; i<arrayRank; i++) {
203 dataOffset[gridRank + i] = 0;
204 dataCount[gridRank + i] = arrayDims[i];
227 template <
typename T>
229 std::vector<hsize_t> arrayDims)
231 unsigned int gridRank = gridOffset.size();
232 std::vector<hsize_t> arrayCount(gridRank, 1);
233 return getReadWriteParametersForMultipleHDF5Arrays<T>(dset_id, gridOffset, arrayDims, arrayCount);
236 template <
typename T>
239 hid_t dataspace = H5Dget_space(dset_id);
241 hid_t memspace = H5Screate_simple(parms.
dataCount.size(), parms.
dataCount.data(), NULL);
249 HDFCHECK(H5Dread(dset_id, parms.
datatype, memspace, dataspace, plist_id, output));
252 HDFCHECK(H5Dwrite(dset_id, parms.
datatype, memspace, dataspace, plist_id, output));
263 template <
typename T>
268 template <
typename T>
273 template <
typename T>
274 void readSingleHDF5Array(hid_t dset_id, hid_t plist_id, std::vector<hsize_t> gridOffset, std::vector<hsize_t> arrayDims, T* output) {
275 HDFReadWriteParamsC parms = getReadWriteParametersForSingleHDF5Array<T>(dset_id, gridOffset, arrayDims);
276 readHDF5SimpleArray<T>(dset_id, plist_id, parms, output);
279 template <
typename T>
281 std::vector<hsize_t> gridOffset;
282 HDFReadWriteParamsC parms = getReadWriteParametersForSingleHDF5Array<T>(dset_id, gridOffset, arrayDims);
283 readHDF5SimpleArray<T>(dset_id, plist_id, parms, output);
286 template <
typename T>
287 void writeSingleHDF5Array(hid_t dset_id, hid_t plist_id, std::vector<hsize_t> gridOffset, std::vector<hsize_t> arrayDims, T* output) {
288 HDFReadWriteParamsC parms = getReadWriteParametersForSingleHDF5Array<T>(dset_id, gridOffset, arrayDims);
289 writeHDF5SimpleArray<T>(dset_id, plist_id, parms, output);
292 template <
typename T>
294 std::vector<hsize_t> gridOffset;
295 HDFReadWriteParamsC parms = getReadWriteParametersForSingleHDF5Array<T>(dset_id, gridOffset, arrayDims);
296 writeHDF5SimpleArray<T>(dset_id, plist_id, parms, output);
299 template <
typename T>
300 void writeMultipleHDF5Arrays(hid_t dset_id, hid_t plist_id, std::vector<hsize_t> gridOffset, std::vector<hsize_t> arrayDims, std::vector<hsize_t> arrayCount, T* output) {
301 HDFReadWriteParamsC parms = getReadWriteParametersForMultipleHDF5Arrays<T>(dset_id, gridOffset, arrayDims, arrayCount);
302 writeHDF5SimpleArray<T>(dset_id, plist_id, parms, output);
305 template <
typename T>
306 void readMultipleHDF5Arrays(hid_t dset_id, hid_t plist_id, std::vector<hsize_t> gridOffset, std::vector<hsize_t> arrayDims, std::vector<hsize_t> arrayCount, T* output) {
307 HDFReadWriteParamsC parms = getReadWriteParametersForMultipleHDF5Arrays<T>(dset_id, gridOffset, arrayDims, arrayCount);
308 readHDF5SimpleArray<T>(dset_id, plist_id, parms, output);
311 template <
typename T>
314 std::vector<hsize_t> arrayDims;
315 HDFReadWriteParamsC parms = getReadWriteParametersForSingleHDF5Array<T>(dset_id, gridOffset, arrayDims);
316 readHDF5SimpleArray<T>(dset_id, plist_id, parms, output);
319 template <
typename T>
322 std::vector<hsize_t> arrayDims;
323 HDFReadWriteParamsC parms = getReadWriteParametersForSingleHDF5Array<T>(dset_id, gridOffset, arrayDims);
324 writeHDF5SimpleArray<T>(dset_id, plist_id, parms, output);
342 HDF5Handler(std::string filename, MPI_Comm comm,
bool doCreate);
348 template <
typename T>
349 hid_t createDataset(std::string datasetName, std::vector<hsize_t> dataDims);
350 template <
typename T>
351 hid_t createDataset(std::string datasetName, std::vector<hsize_t> gridDims, std::vector<hsize_t> arrayDims);
354 hid_t getDataset(std::string datasetName);
360 std::vector<std::string> getDatasetNames();
370 bool usingMPI =
false;
381 void openDataset(std::string datasetName);
void hdfAssert(herr_t code, const char *file, int line)
Definition: hdfUtils.h:34
std::vector< hsize_t > dataOffset
Definition: hdfUtils.h:98
#define HDFCHECK(ans)
Definition: hdfUtils.h:33
std::vector< hsize_t > dataCount
Definition: hdfUtils.h:99
HDFReadWriteParamsC getReadWriteParametersForMultipleHDF5Arrays(hid_t dset_id, std::vector< hsize_t > gridOffset, std::vector< hsize_t > arrayDims, std::vector< hsize_t > arrayCount)
Gets the parameters and ensures that they're compatible with the actual dataset.
Definition: hdfUtils.h:145
H5E_auto2_t dummyHDFErrorHandler
Definition: hdfUtils.cpp:14
HDFReadWriteParamsC getReadWriteParametersForSingleHDF5Array(hid_t dset_id, std::vector< hsize_t > gridOffset, std::vector< hsize_t > arrayDims)
Gets the parameters and ensures that they're compatible with the actual dataset.
Definition: hdfUtils.h:228
hid_t createHDF5Dataset(hid_t file_id, std::string datasetName, std::vector< hsize_t > dataDims)
Definition: hdfUtils.h:104
hid_t file_id
Definition: hdfUtils.h:367
Definition: casesUtils.cpp:4
void writeSingleHDF5Array(hid_t dset_id, hid_t plist_id, std::vector< hsize_t > gridOffset, std::vector< hsize_t > arrayDims, T *output)
Definition: hdfUtils.h:287
int comm_size
Definition: hdfUtils.h:372
void readWriteHDF5SimpleArray(hid_t dset_id, hid_t plist_id, HDFReadWriteParamsC parms, T *output, HDFReadWrite mode)
Definition: hdfUtils.h:237
hid_t createHDF5GridOfArrays(hid_t file_id, std::string datasetName, std::vector< hsize_t > gridDims, std::vector< hsize_t > arrayDims)
Definition: hdfUtils.h:127
hid_t datatype
Definition: hdfUtils.h:100
Definition: hdfUtils.h:338
void writeHDF5SimpleArray(hid_t dset_id, hid_t plist_id, HDFReadWriteParamsC parms, T *output)
Definition: hdfUtils.h:269
void writeMultipleHDF5Arrays(hid_t dset_id, hid_t plist_id, std::vector< hsize_t > gridOffset, std::vector< hsize_t > arrayDims, std::vector< hsize_t > arrayCount, T *output)
Definition: hdfUtils.h:300
std::vector< hsize_t > getDatasetDims(hid_t dset_id)
Definition: hdfUtils.cpp:35
Definition: hdfUtils.h:97
void readMultipleHDF5Arrays(hid_t dset_id, hid_t plist_id, std::vector< hsize_t > gridOffset, std::vector< hsize_t > arrayDims, std::vector< hsize_t > arrayCount, T *output)
Definition: hdfUtils.h:306
A complex number type.
Definition: hdfUtils.h:62
double r
Definition: hdfUtils.h:63
HDFReadWrite
Definition: hdfUtils.h:51
std::string filename
Definition: hdfUtils.h:366
void hdfSuppressErrors()
Definition: hdfUtils.cpp:16
Definition: hdfUtils.h:26
std::map< std::string, hid_t > currentlyOpenDatasets
Definition: hdfUtils.h:378
hid_t getPropertyListTransferIndependent()
Definition: hdfUtils.h:357
hid_t getHDF5TypeC()
Get HDF5 equivalent type.
Definition: hdfUtils.h:74
hid_t plist_id_file_access
Definition: hdfUtils.h:384
void * dummyHDFClientData
Definition: hdfUtils.cpp:15
void readSingleHDF5Value(hid_t dset_id, hid_t plist_id, std::vector< hsize_t > gridOffset, T *output)
Definition: hdfUtils.h:312
hid_t hdf_complex_id
Definition: hdfUtils.cpp:32
void readHDF5SimpleArray(hid_t dset_id, hid_t plist_id, HDFReadWriteParamsC parms, T *output)
Definition: hdfUtils.h:264
void writeSingleHDF5Value(hid_t dset_id, hid_t plist_id, std::vector< hsize_t > gridOffset, T *output)
Definition: hdfUtils.h:320
int comm_rank
Definition: hdfUtils.h:373
void hdfRestoreErrors()
Definition: hdfUtils.cpp:20
HDFUtilsError(const std::string &val)
Definition: hdfUtils.h:29
hid_t plist_id_xfer_independent
Definition: hdfUtils.h:390
double i
Definition: hdfUtils.h:64
MPI_Comm comm
Definition: hdfUtils.h:371
void readSingleHDF5Array(hid_t dset_id, hid_t plist_id, std::vector< hsize_t > gridOffset, std::vector< hsize_t > arrayDims, T *output)
Definition: hdfUtils.h:274