6 #ifndef HPP_HDFUTILSCPP_H 7 #define HPP_HDFUTILSCPP_H 19 #include <hdf5/serial/H5Cpp.h> 32 H5::DataType dataType;
33 if (std::is_same<T, float>::value) {
34 dataType = H5::PredType::NATIVE_FLOAT;
36 else if (std::is_same<T, double>::value) {
37 dataType = H5::PredType::NATIVE_DOUBLE;
39 else if (std::is_same<T, int>::value) {
40 dataType = H5::PredType::NATIVE_INT32;
42 else if (std::is_same<T, long int>::value) {
43 dataType = H5::PredType::NATIVE_LONG;
45 else if (std::is_same<T, long long int>::value) {
46 dataType = H5::PredType::NATIVE_LLONG;
48 else if (std::is_same<T, unsigned int>::value) {
49 dataType = H5::PredType::NATIVE_UINT32;
51 else if (std::is_same<T, unsigned long int>::value) {
52 dataType = H5::PredType::NATIVE_ULONG;
54 else if (std::is_same<T, unsigned long long int>::value) {
55 dataType = H5::PredType::NATIVE_ULLONG;
58 throw HDFUtilsError(
"Datatype lookup not implemented for this type.");
70 H5::DataSet
createHDF5Dataset(H5::H5File& file,
const H5std_string& datasetName, std::vector<hsize_t> dataDims) {
72 hsize_t dataRank = dataDims.size();
73 H5::DataSpace dataspace;
75 dataspace = H5::DataSpace();
78 dataspace = H5::DataSpace(dataRank, dataDims.data());
80 H5::DataType dataType = getHDF5Type<T>();
81 H5::DataSet dataset = file.createDataSet(datasetName.c_str(), dataType, dataspace);
88 H5::DataSet
createHDF5GridOfArrays(H5::H5File& file,
const H5std_string& datasetName, std::vector<hsize_t> gridDims, std::vector<hsize_t> arrayDims) {
90 std::vector<hsize_t> dataDims = gridDims;
91 dataDims.insert(dataDims.end(), arrayDims.begin(), arrayDims.end());
94 return createHDF5Dataset<T>(file, datasetName, dataDims);
99 std::vector<hsize_t> arrayDims)
107 H5::DataType
datatype = dataset.getDataType();
108 H5::DataType datatypeExpected = getHDF5Type<T>();
109 if (!(datatype == datatypeExpected)) {
114 H5::DataSpace dataspace = dataset.getSpace();
115 hsize_t dataRank = dataspace.getSimpleExtentNdims();
116 std::vector<hsize_t> dataDims(dataRank);
117 dataspace.getSimpleExtentDims(dataDims.data());
120 hsize_t gridRank = gridOffset.size();
121 hsize_t arrayRank = arrayDims.size();
122 hsize_t dataRankExpected = gridRank + arrayRank;
123 if (dataRank != dataRankExpected) {
128 std::vector<hsize_t> arrayDimsRead(dataDims.end()-arrayDims.size(), dataDims.end());
129 if (arrayDims != arrayDimsRead) {
134 std::vector<hsize_t> gridDims(dataDims.begin(), dataDims.begin()+gridRank);
137 for (
unsigned int i=0; i<gridRank; i++) {
138 if (gridOffset[i] > gridDims[i]-1) {
145 std::vector<hsize_t>
dataCount(dataRank);
146 for (
unsigned int i=0; i<gridRank; i++) {
147 dataOffset[i] = gridOffset[i];
150 for (
unsigned int i=0; i<arrayRank; i++) {
151 dataOffset[gridRank + i] = 0;
152 dataCount[gridRank + i] = arrayDims[i];
165 template <
typename T>
169 H5::DataSpace dataspace = dataset.getSpace();
175 dataspace.selectHyperslab(H5S_SELECT_SET, parms.
dataCount.data(), parms.
dataOffset.data());
179 dataset.read(output, parms.
datatype, memspace, dataspace);
182 dataset.write(output, parms.
datatype, memspace, dataspace);
189 template <
typename T>
194 template <
typename T>
199 template <
typename T>
200 void readSingleHDF5Array(H5::DataSet& dataset, std::vector<hsize_t> gridOffset, std::vector<hsize_t> arrayDims, T* output) {
201 HDFReadWriteParams parms = getReadWriteParametersForSingleHDF5Array<T>(dataset, gridOffset, arrayDims);
202 readHDF5SimpleArray<T>(dataset, parms, output);
205 template <
typename T>
206 void writeSingleHDF5Array(H5::DataSet& dataset, std::vector<hsize_t> gridOffset, std::vector<hsize_t> arrayDims, T* output) {
207 HDFReadWriteParams parms = getReadWriteParametersForSingleHDF5Array<T>(dataset, gridOffset, arrayDims);
208 writeHDF5SimpleArray<T>(dataset, parms, output);
211 template <
typename T>
214 std::vector<hsize_t> dataDims = {vec.size()};
215 H5::DataSet dset = createHDF5Dataset<T>(file, dsetName, dataDims);
216 writeSingleHDF5Array<T>(dset,
dataOffset, dataDims, vec.data());
219 template <
typename T>
220 void addAttribute(H5::H5File& file,
const std::string& attrName, T attrVal) {
221 H5::DataSpace scalarSpace(H5S_SCALAR);
222 auto attr = file.createAttribute(attrName, getHDF5Type<T>(), scalarSpace);
223 attr.write(getHDF5Type<T>(), &attrVal);
std::vector< hsize_t > dataOffset
Definition: hdfUtilsCpp.h:64
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
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
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
void writeHDF5SimpleArray(hid_t dset_id, hid_t plist_id, HDFReadWriteParamsC parms, T *output)
Definition: hdfUtils.h:269
Header file for helper functions with HDF.
HDFReadWrite
Definition: hdfUtils.h:51
Definition: hdfUtils.h:26
H5::DataType getHDF5Type()
Get HDF5 equivalent type.
Definition: hdfUtilsCpp.h:31
void addAttribute(H5::H5File &file, const std::string &attrName, T attrVal)
Definition: hdfUtilsCpp.h:220
H5::DataType datatype
Definition: hdfUtilsCpp.h:66
void readHDF5SimpleArray(hid_t dset_id, hid_t plist_id, HDFReadWriteParamsC parms, T *output)
Definition: hdfUtils.h:264
Definition: hdfUtilsCpp.h:63
void writeVectorToHDF5Array(H5::H5File &file, const std::string &dsetName, std::vector< T > &vec)
Definition: hdfUtilsCpp.h:212
std::vector< hsize_t > dataCount
Definition: hdfUtilsCpp.h:65
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