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, \
63 "HDF5 error in API function " #func, \
67 #define H5_CALL(func, args) \
69 herr_t ret = func args; \
71 ErrorUtil::Error(ErrorUtil::efatal, \
74 "HDF5 error in API function " #func, \
79 class Error :
public std::exception
108 class Object :
public std::enable_shared_from_this<Object>
118 inline operator hid_t()
const
172 void SetChunk(
const std::vector<hsize_t> &dims);
195 return !(*
this == other);
208 static herr_t
helper(hid_t g_id,
210 const H5L_info_t *info,
237 const std::string &
name,
238 const std::vector<T> &data,
250 const std::string &
name,
275 return !(*
this == other);
283 static herr_t
helper(hid_t g_id,
285 const H5A_info_t *info,
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);
330 void SelectRange(
const hsize_t start,
const hsize_t count);
331 void AppendRange(
const hsize_t start,
const hsize_t count);
334 const std::vector<hsize_t> count);
336 const std::vector<hsize_t> count);
339 const std::vector<hsize_t> &coords);
344 std::vector<hsize_t>
GetDims();
403 boost::ignore_unused(obj);
406 virtual void Close();
418 void Add(std::string
name,
size_t offset, hid_t type)
420 H5Tinsert(
m_Id,
name.c_str(), offset, type);
424 hid_t strtype = H5Tcopy (H5T_C_S1);
425 H5Tset_size (strtype, size);
426 H5Tinsert(
m_Id,
name.c_str(), offset, strtype);
458 const std::string &
name,
507 template <
class T>
void Write(
const std::vector<T> &data)
512 (
m_Id, mem_t->GetId(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &data[0]));
515 void Write(
const std::vector<T> &data,
523 (
m_Id, mem_t->GetId(), memspace->GetId(), filespace->GetId(),
524 dxpl->GetId(), &data[0]) );
528 void Write(
const std::vector<T> &data,
550 (
m_Id, type->GetId(), H5S_ALL, filespace->GetId(), dxpl->GetId(), s.c_str()));
559 ret =
new const char*[s.size()];
560 for (
size_t i = 0; i < s.size(); ++i) {
561 ret[i] = s[i].c_str();
563 H5Dwrite(
m_Id, type->GetId(), H5S_ALL, filespace->GetId(), dxpl->GetId(), ret);
566 template <
class T>
void Read(std::vector<T> &data)
570 ASSERTL0(H5Sget_simple_extent_ndims(space->GetId()) == 1,
571 "vector data not 1D");
573 H5Sget_simple_extent_dims(space->GetId(), &len, &maxdim);
579 (
m_Id, mem_t->GetId(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &data[0]));
582 void Read(std::vector<T> &data,
588 len = H5Sget_select_npoints(filespace->GetId());
593 H5_CALL(H5Dread, (
m_Id, mem_t->GetId(), memspace->GetId(),
594 filespace->GetId(), dxpl->GetId(), &data[0]));
597 void Read(std::vector<T> &data,
599 std::vector<std::vector<int> > &coords,
605 int w = coords[0].size();
607 hsize_t *cds =
new hsize_t[coords.size() * w];
608 for(
int i = 0; i < coords.size(); i++)
610 for(
int j = 0; j < coords[i].size(); j++)
612 cds[i * w + j] = hsize_t(coords[i][j]);
616 H5Sselect_elements(filespace->GetId(),
623 len = H5Sget_select_npoints(filespace->GetId());
628 H5_CALL(H5Dread, (
m_Id, mem_t->GetId(), memspace->GetId(),
629 filespace->GetId(), dxpl->GetId(), &data[0]));
631 H5Sselect_all(filespace->GetId());
640 std::vector<hsize_t> dims = filespace->GetDims();
641 rdata = (
char **) malloc (dims[0] *
sizeof(
char *));
643 H5_CALL(H5Dread, (
m_Id, tp->GetId(), H5S_ALL, filespace->GetId(), dxpl->GetId(), rdata));
645 for(
int i = 0; i < dims[0]; i++)
647 data.push_back(std::string(rdata[i]));
658 T>::Convert(
const T &obj)
672 return PredefinedDataType::Native<T>();
692 return Converter::Convert(obj);
699 return Converter::Deconvert(obj);
712 return std::string(obj);
727 template <
typename T>
741 template <
typename T>
743 const std::vector<T> &value)
753 const void *converted_buf = NULL;
756 converted_vals.resize(value.size());
757 for (
size_t i = 0; i < value.size(); ++i)
761 converted_buf = &converted_vals[0];
765 converted_buf = &value[0];
768 H5_CALL(H5Awrite, (attr->GetId(), type->GetId(), converted_buf));
771 template <
typename T>
786 template <
typename T>
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 = NULL;
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,
831 const std::vector<T> &data,
839 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
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)
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())
virtual hsize_t GetNumElements()=0
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())
virtual hsize_t GetNumElements()
virtual hsize_t GetNumElements()
std::vector< std::string > GetElementNames()
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.
PredefinedDataType(hid_t)
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.
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)