35 #ifndef NEKTAR_LIB_UTILITIES_BASIC_UTILS_H5_H
36 #define NEKTAR_LIB_UTILITIES_BASIC_UTILS_H5_H
44 #include <boost/core/ignore_unused.hpp>
51 namespace LibUtilities
56 #define H5_CONSTRUCT(ans, func, args) \
58 hid_t ret = func args; \
60 ErrorUtil::Error(ErrorUtil::efatal, __FILE__, __LINE__, \
61 "HDF5 error in API function " #func, 0); \
64 #define H5_CALL(func, args) \
66 herr_t ret = func args; \
68 ErrorUtil::Error(ErrorUtil::efatal, __FILE__, __LINE__, \
69 "HDF5 error in API function " #func, 0); \
72 class Error :
public std::exception
101 class Object :
public std::enable_shared_from_this<Object>
114 inline operator hid_t()
const
168 void SetChunk(
const std::vector<hsize_t> &dims);
175 virtual void v_Close()
override;
194 return !(*
this == other);
207 static herr_t
helper(hid_t g_id,
const char *
name,
208 const H5L_info_t *info,
void *op_data);
234 const std::string &
name,
const std::vector<T> &data,
246 const std::string &
name,
277 return !(*
this == other);
285 static herr_t
helper(hid_t g_id,
const char *
name,
286 const H5A_info_t *info,
void *op_data);
322 DataSpace(hsize_t size, hsize_t max = H5S_UNLIMITED - 1);
323 DataSpace(
const std::vector<hsize_t> &dims);
324 DataSpace(
const std::vector<hsize_t> &dims,
325 const std::vector<hsize_t> &max_dims);
328 void SelectRange(
const hsize_t start,
const hsize_t count);
329 void AppendRange(
const hsize_t start,
const hsize_t count);
332 const std::vector<hsize_t> count);
334 const std::vector<hsize_t> count);
337 const std::vector<hsize_t> &coords);
342 std::vector<hsize_t>
GetDims();
345 virtual void v_Close()
override;
404 boost::ignore_unused(obj);
410 virtual void v_Close()
override;
419 void Add(std::string
name,
size_t offset, hid_t type)
421 H5Tinsert(
m_Id,
name.c_str(), offset, type);
425 hid_t strtype = H5Tcopy(H5T_C_S1);
426 H5Tset_size(strtype, size);
427 H5Tinsert(
m_Id,
name.c_str(), offset, strtype);
431 virtual void v_Close()
override;
445 virtual void v_Close()
override;
459 virtual void v_Close()
override;
484 virtual void v_Close()
override;
501 virtual void v_Close()
override;
515 template <
class T>
void Write(
const std::vector<T> &data)
518 H5_CALL(H5Dwrite, (
m_Id, mem_t->GetId(), H5S_ALL, H5S_ALL, H5P_DEFAULT,
528 H5_CALL(H5Dwrite, (
m_Id, mem_t->GetId(), memspace->GetId(),
529 filespace->GetId(), dxpl->GetId(), &data[0]));
538 H5Dwrite(
m_Id, dt->GetId(), memspace->GetId(), filespace->GetId(),
539 dxpl->GetId(), &data[0]);
546 H5_CALL(H5Dwrite, (
m_Id, type->GetId(), H5S_ALL, filespace->GetId(),
547 dxpl->GetId(), s.c_str()));
555 ret =
new const char *[s.size()];
556 for (
size_t i = 0; i < s.size(); ++i)
558 ret[i] = s[i].c_str();
560 H5Dwrite(
m_Id, type->GetId(), H5S_ALL, filespace->GetId(),
564 template <
class T>
void Read(std::vector<T> &data)
568 ASSERTL0(H5Sget_simple_extent_ndims(space->GetId()) == 1,
569 "vector data not 1D");
571 H5Sget_simple_extent_dims(space->GetId(), &len, &maxdim);
575 H5_CALL(H5Dread, (
m_Id, mem_t->GetId(), H5S_ALL, H5S_ALL, H5P_DEFAULT,
584 len = H5Sget_select_npoints(filespace->GetId());
589 H5_CALL(H5Dread, (
m_Id, mem_t->GetId(), memspace->GetId(),
590 filespace->GetId(), dxpl->GetId(), &data[0]));
594 std::vector<std::vector<int>> &coords,
600 int w = coords[0].size();
602 hsize_t *cds =
new hsize_t[coords.size() * w];
603 for (
int i = 0; i < coords.size(); i++)
605 for (
int j = 0; j < coords[i].size(); j++)
607 cds[i * w + j] = hsize_t(coords[i][j]);
611 H5Sselect_elements(filespace->GetId(), H5S_SELECT_SET, coords.size(),
616 len = H5Sget_select_npoints(filespace->GetId());
621 H5_CALL(H5Dread, (
m_Id, mem_t->GetId(), memspace->GetId(),
622 filespace->GetId(), dxpl->GetId(), &data[0]));
624 H5Sselect_all(filespace->GetId());
633 std::vector<hsize_t> dims = filespace->GetDims();
634 rdata = (
char **)malloc(dims[0] *
sizeof(
char *));
636 H5_CALL(H5Dread, (
m_Id, tp->GetId(), H5S_ALL, filespace->GetId(),
637 dxpl->GetId(), rdata));
639 for (
int i = 0; i < dims[0]; i++)
641 data.push_back(std::string(rdata[i]));
646 virtual void v_Close()
override;
655 T>::Convert(
const T &obj)
669 return PredefinedDataType::Native<T>();
689 return Converter::Convert(obj);
696 return Converter::Deconvert(obj);
709 return std::string(obj);
724 template <
typename T>
733 H5_CALL(H5Awrite, (attr->GetId(), type->GetId(),
737 template <
typename T>
739 const std::vector<T> &value)
749 const void *converted_buf = NULL;
752 converted_vals.resize(value.size());
753 for (
size_t i = 0; i < value.size(); ++i)
757 converted_buf = &converted_vals[0];
761 converted_buf = &value[0];
764 H5_CALL(H5Awrite, (attr->GetId(), type->GetId(), converted_buf));
767 template <
typename T>
776 H5_CALL(H5Aread, (attr->GetId(), type->GetId(),
781 template <
typename T>
783 std::vector<T> &value)
792 ASSERTL0(H5Sget_simple_extent_ndims(space->GetId()) == 1,
793 "vector data not 1D");
795 H5Sget_simple_extent_dims(space->GetId(), &len, &maxdim);
798 void *converted_buf = NULL;
801 converted_vals.resize(len);
802 converted_buf = &converted_vals[0];
806 converted_buf = &value[0];
809 H5_CALL(H5Aread, (attr->GetId(), type->GetId(), converted_buf));
813 typename Vec::iterator src = converted_vals.begin(),
814 end = converted_vals.end();
815 typename std::vector<T>::iterator dest = value.begin();
816 for (; src != end; ++src, ++dest)
825 const std::string &
name,
const std::vector<T> &data,
832 dataset->Write(data);
#define ASSERTL0(condition, msg)
#define H5_CALL(func, args)
static AttributeSharedPtr Open(hid_t parent, const std::string &name)
DataSpaceSharedPtr GetSpace() const
virtual void v_Close() override
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*()
AttrIterator(CanHaveAttributesSharedPtr obj, hsize_t idx=0)
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
LinkIterator(CanHaveGroupsDataSetsSharedPtr grp, hsize_t idx=0)
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)
virtual void v_Close() override
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())
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())
virtual void v_Close() override
void Read(std::vector< T > &data, DataSpaceSharedPtr filespace, std::vector< std::vector< int >> &coords, 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)
virtual void v_Close() override
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)
virtual void v_Close() override
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())
virtual hsize_t v_GetNumElements() override
virtual void v_Close() override
std::vector< std::string > GetElementNames()
virtual hsize_t v_GetNumElements() override
CanHaveAttributesSharedPtr operator[](hsize_t idx)
virtual void v_Close() override
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.
virtual void v_Close() override
Predefined HDF data types that must not be closed when done with.
PredefinedDataType(hid_t)
static DataTypeSharedPtr Native()
virtual void v_Close() override
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.
The above copyright notice and this permission notice shall be included.
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 DataTypeSharedPtr GetType()
static ConvertedType Convert(const T &obj)
static const hid_t NativeType
static void * GetAddress(ConvertedType &obj)
static DataTypeSharedPtr GetType(const T &obj)
static T Deconvert(const ConvertedType &obj)
static const void * GetAddress(const ConvertedType &obj)