35#ifndef NEKTAR_LIB_UTILITIES_BASIC_UTILS_H5_H
36#define NEKTAR_LIB_UTILITIES_BASIC_UTILS_H5_H
50#define H5_CONSTRUCT(ans, func, args) \
52 hid_t ret = func args; \
54 ErrorUtil::Error(ErrorUtil::efatal, __FILE__, __LINE__, \
55 "HDF5 error in API function " #func, 0); \
58#define H5_CALL(func, args) \
60 herr_t ret = func args; \
62 ErrorUtil::Error(ErrorUtil::efatal, __FILE__, __LINE__, \
63 "HDF5 error in API function " #func, 0); \
66class Error :
public std::exception
95class Object :
public std::enable_shared_from_this<Object>
108 inline operator hid_t()
const
189 return !(*
this == other);
203 const H5L_info_t *info,
229 const std::string &name,
const std::vector<T> &data,
274 return !(*
this == other);
282 static herr_t
helper(hid_t g_id,
const char *name,
283 const H5A_info_t *info,
void *op_data);
298 void SetAttribute(
const std::string &name,
const T &value);
300 void SetAttribute(
const std::string &name,
const std::vector<T> &value);
302 template <
class T>
void GetAttribute(
const std::string &name, T &value);
304 void GetAttribute(
const std::string &name, std::vector<T> &value);
321 hsize_t
max = H5S_UNLIMITED - 1);
324 const std::vector<hsize_t> &max_dims);
328 const hsize_t count);
330 const hsize_t count);
333 const std::vector<hsize_t> count);
335 const std::vector<hsize_t> count);
338 const std::vector<hsize_t> &coords);
420 void Add(std::string name,
size_t offset, hid_t type)
422 H5Tinsert(
m_Id, name.c_str(), offset, type);
424 void AddString(std::string name,
size_t offset,
size_t size)
426 hid_t strtype = H5Tcopy(H5T_C_S1);
427 H5Tset_size(strtype, size);
428 H5Tinsert(
m_Id, name.c_str(), offset, strtype);
478 const std::string &filename,
unsigned mode,
482 const std::string &filename,
unsigned mode,
519 template <
class T>
void Write(
const std::vector<T> &data)
522 H5_CALL(H5Dwrite, (
m_Id, mem_t->GetId(), H5S_ALL, H5S_ALL, H5P_DEFAULT,
532 H5_CALL(H5Dwrite, (
m_Id, mem_t->GetId(), memspace->GetId(),
533 filespace->GetId(), dxpl->GetId(), &data[0]));
542 H5Dwrite(
m_Id, dt->GetId(), memspace->GetId(), filespace->GetId(),
543 dxpl->GetId(), &data[0]);
550 H5_CALL(H5Dwrite, (
m_Id, type->GetId(), H5S_ALL, filespace->GetId(),
551 dxpl->GetId(), s.c_str()));
559 ret =
new const char *[s.size()];
560 for (
size_t i = 0; i < s.size(); ++i)
562 ret[i] = s[i].c_str();
564 H5Dwrite(
m_Id, type->GetId(), H5S_ALL, filespace->GetId(),
568 template <
class T>
void Read(std::vector<T> &data)
572 ASSERTL0(H5Sget_simple_extent_ndims(space->GetId()) == 1,
573 "vector data not 1D");
575 H5Sget_simple_extent_dims(space->GetId(), &len, &maxdim);
579 H5_CALL(H5Dread, (
m_Id, mem_t->GetId(), H5S_ALL, H5S_ALL, H5P_DEFAULT,
588 len = H5Sget_select_npoints(filespace->GetId());
593 H5_CALL(H5Dread, (
m_Id, mem_t->GetId(), memspace->GetId(),
594 filespace->GetId(), dxpl->GetId(), data.data()));
598 std::vector<std::vector<int>> &coords,
604 int w = coords[0].size();
606 hsize_t *cds =
new hsize_t[coords.size() * w];
607 for (
int i = 0; i < coords.size(); i++)
609 for (
int j = 0; j < coords[i].size(); j++)
611 cds[i * w + j] = hsize_t(coords[i][j]);
615 H5Sselect_elements(filespace->GetId(), H5S_SELECT_SET, coords.size(),
620 len = H5Sget_select_npoints(filespace->GetId());
625 H5_CALL(H5Dread, (
m_Id, mem_t->GetId(), memspace->GetId(),
626 filespace->GetId(), dxpl->GetId(), data.data()));
628 H5Sselect_all(filespace->GetId());
637 std::vector<hsize_t> dims = filespace->GetDims();
638 rdata = (
char **)malloc(dims[0] *
sizeof(
char *));
640 H5_CALL(H5Dread, (
m_Id, tp->GetId(), H5S_ALL, filespace->GetId(),
641 dxpl->GetId(), rdata));
643 for (
int i = 0; i < dims[0]; i++)
645 data.push_back(std::string(rdata[i]));
660 T>::Convert(
const T &obj)
674 return PredefinedDataType::Native<T>();
694 return Converter::Convert(obj);
701 return Converter::Deconvert(obj);
714 return std::string(obj);
738 H5_CALL(H5Awrite, (attr->GetId(), type->GetId(),
744 const std::vector<T> &value)
754 const void *converted_buf =
nullptr;
757 converted_vals.resize(value.size());
758 for (
size_t i = 0; i < value.size(); ++i)
762 converted_buf = &converted_vals[0];
766 converted_buf = &value[0];
769 H5_CALL(H5Awrite, (attr->GetId(), type->GetId(), converted_buf));
781 H5_CALL(H5Aread, (attr->GetId(), type->GetId(),
788 std::vector<T> &value)
797 ASSERTL0(H5Sget_simple_extent_ndims(space->GetId()) == 1,
798 "vector data not 1D");
800 H5Sget_simple_extent_dims(space->GetId(), &len, &maxdim);
803 void *converted_buf =
nullptr;
806 converted_vals.resize(len);
807 converted_buf = &converted_vals[0];
811 converted_buf = &value[0];
814 H5_CALL(H5Aread, (attr->GetId(), type->GetId(), converted_buf));
818 typename Vec::iterator src = converted_vals.begin(),
819 end = converted_vals.end();
820 typename std::vector<T>::iterator dest = value.begin();
821 for (; src != end; ++src, ++dest)
830 const std::string &name,
const std::vector<T> &data,
837 dataset->Write(data);
#define ASSERTL0(condition, msg)
#define H5_CALL(func, args)
#define LIB_UTILITIES_EXPORT
static AttributeSharedPtr Open(hid_t parent, const std::string &name)
DataSpaceSharedPtr GetSpace() const
static AttributeSharedPtr Create(hid_t parent, const std::string &name, DataTypeSharedPtr type, DataSpaceSharedPtr space)
bool operator==(const AttrIterator &other) const
static herr_t helper(hid_t g_id, const char *name, const H5A_info_t *info, void *op_data)
const std::string & operator*()
bool operator!=(const AttrIterator &other) const
CanHaveAttributesSharedPtr m_obj
AttrIterator & operator++()
std::string m_currentName
Mixin for objects that can have attributes (Group, DataSet, DataType)
AttributeSharedPtr OpenAttribute(const std::string &name)
void GetAttribute(const std::string &name, T &value)
AttrIterator attr_begin()
AttributeSharedPtr CreateAttribute(const std::string &name, DataTypeSharedPtr type, DataSpaceSharedPtr space)
void SetAttribute(const std::string &name, const T &value)
LinkIterator & operator++()
static herr_t helper(hid_t g_id, const char *name, const H5L_info_t *info, void *op_data)
std::string m_currentName
bool operator!=(const LinkIterator &other) const
std::string GetName() const
bool operator==(const LinkIterator &other) const
CanHaveGroupsDataSetsSharedPtr m_grp
const std::string & operator*()
Mixin for objects that contain groups and datasets (Group and File)
virtual hsize_t v_GetNumElements()=0
GroupSharedPtr OpenGroup(const std::string &name, PListSharedPtr accessPL=PList::Default()) const
DataSetSharedPtr OpenDataSet(const std::string &name, PListSharedPtr accessPL=PList::Default()) const
friend class key_iterator
GroupSharedPtr CreateGroup(const std::string &name, PListSharedPtr createPL=PList::Default(), PListSharedPtr accessPL=PList::Default())
DataSetSharedPtr CreateDataSet(const std::string &name, DataTypeSharedPtr type, DataSpaceSharedPtr space, PListSharedPtr createPL=PList::Default(), PListSharedPtr accessPL=PList::Default())
DataSetSharedPtr CreateWriteDataSet(const std::string &name, const std::vector< T > &data, PListSharedPtr createPL=PList::Default(), PListSharedPtr accessPL=PList::Default())
bool ContainsDataSet(std::string nm)
void AddString(std::string name, size_t offset, size_t size)
static CompoundDataTypeSharedPtr Create(size_t sz)
void Add(std::string name, size_t offset, hid_t type)
void Read(std::vector< T > &data)
void Write(const std::vector< T > &data, DataSpaceSharedPtr filespace, PListSharedPtr dxpl=PList::Default())
void ReadVectorString(std::vector< std::string > &data, DataSpaceSharedPtr filespace, PListSharedPtr dxpl=PList::Default())
void WriteString(std::string s, DataSpaceSharedPtr filespace, DataTypeSharedPtr type, PListSharedPtr dxpl=PList::Default())
void Read(std::vector< T > &data, DataSpaceSharedPtr filespace, std::vector< std::vector< int > > &coords, PListSharedPtr dxpl=PList::Default())
DataSpaceSharedPtr GetSpace() const
void Read(std::vector< T > &data, DataSpaceSharedPtr filespace, PListSharedPtr dxpl=PList::Default())
void WriteVectorString(std::vector< std::string > s, DataSpaceSharedPtr filespace, DataTypeSharedPtr type, PListSharedPtr dxpl=PList::Default())
void Write(const std::vector< T > &data, DataSpaceSharedPtr filespace, DataTypeSharedPtr dt, PListSharedPtr dxpl=PList::Default())
void Write(const std::vector< T > &data)
void SelectRange(const hsize_t start, const hsize_t count)
void AppendRange(const hsize_t start, const hsize_t count)
static DataSpaceSharedPtr Null()
static DataSpaceSharedPtr Scalar()
std::vector< hsize_t > GetDims()
static DataSpaceSharedPtr OneD(hsize_t size)
void SetSelection(const hsize_t num_elmt, const std::vector< hsize_t > &coords)
Wrap and HDF5 data type object. Technically this can have attributes, but not really bothered.
static DataTypeSharedPtr OfObject(const T &obj)
DataTypeSharedPtr Copy() const
static DataTypeSharedPtr String(size_t len=0)
static FileSharedPtr Open(const std::string &filename, unsigned mode, PListSharedPtr accessPL=PList::Default())
static FileSharedPtr Create(const std::string &filename, unsigned mode, PListSharedPtr createPL=PList::Default(), PListSharedPtr accessPL=PList::Default())
hsize_t v_GetNumElements() override
std::vector< std::string > GetElementNames()
hsize_t v_GetNumElements() override
CanHaveAttributesSharedPtr operator[](hsize_t idx)
CanHaveAttributesSharedPtr operator[](const std::string &key)
static PListSharedPtr ObjectCreate()
Properties for object creation.
static PListSharedPtr DatasetXfer()
Properties for raw data transfer.
static PListSharedPtr StringCreate()
Properties for character encoding when encoding strings or object names.
static PListSharedPtr FileAccess()
Properties for file access.
void SetDxMpioIndependent()
void SetMpio(CommSharedPtr comm)
void SetDxMpioCollective()
void SetDeflate(const unsigned level=1)
static PListSharedPtr FileCreate()
Properties for file creation.
static PListSharedPtr GroupAccess()
Properties for group access.
static PListSharedPtr DatasetAccess()
Properties for dataset access.
static PListSharedPtr Default()
Default options.
static PListSharedPtr FileMount()
Properties for file mounting.
static PListSharedPtr ObjectCopy()
Properties governing the object copying process.
static PListSharedPtr DatasetCreate()
Properties for dataset creation.
static PListSharedPtr GroupCreate()
Properties for group creation.
void SetChunk(const std::vector< hsize_t > &dims)
static PListSharedPtr AttributeCreate()
Properties for attribute creation.
static PListSharedPtr LinkAccess()
Properties governing link traversal when accessing objects.
static PListSharedPtr LinkCreate()
Properties governing link creation.
static PListSharedPtr DatatypeCreate()
Properties for datatype creation.
static PListSharedPtr DatatypeAccess()
Properties for datatype access.
Predefined HDF data types that must not be closed when done with.
static DataTypeSharedPtr Native()
static DataTypeSharedPtr CS1()
std::shared_ptr< DataSpace > DataSpaceSharedPtr
std::shared_ptr< PList > PListSharedPtr
std::shared_ptr< Object > ObjectSharedPtr
std::shared_ptr< File > FileSharedPtr
std::shared_ptr< DataType > DataTypeSharedPtr
std::shared_ptr< CanHaveGroupsDataSets > CanHaveGroupsDataSetsSharedPtr
std::shared_ptr< Attribute > AttributeSharedPtr
std::shared_ptr< CompoundDataType > CompoundDataTypeSharedPtr
std::shared_ptr< CanHaveAttributes > CanHaveAttributesSharedPtr
std::shared_ptr< Group > GroupSharedPtr
std::shared_ptr< DataSet > DataSetSharedPtr
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
scalarT< T > max(scalarT< T > lhs, scalarT< T > rhs)
const char * ConvertedVectorElemType
static std::string Deconvert(const ConvertedType &obj)
const char * ConvertedType
static ConvertedType Convert(const std::string &obj)
static ConvertedType Convert(const T &obj)
T ConvertedVectorElemType
static T Deconvert(const ConvertedType &obj)
static const bool MustConvert
Traits class for HDF5 data types.
DataTypeConversionPolicy< T > Converter
Converter::ConvertedType ConvertedType
static const void * GetAddress(const ConvertedType &obj)
static void * GetAddress(ConvertedType &obj)
static DataTypeSharedPtr GetType()
static ConvertedType Convert(const T &obj)
static const hid_t NativeType
static DataTypeSharedPtr GetType(const T &obj)
static T Deconvert(const ConvertedType &obj)