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>
111 virtual void Close() = 0;
118 inline operator hid_t()
const 135 static PListSharedPtr Default();
137 static PListSharedPtr ObjectCreate();
139 static PListSharedPtr FileCreate();
141 static PListSharedPtr FileAccess();
143 static PListSharedPtr DatasetCreate();
145 static PListSharedPtr DatasetAccess();
147 static PListSharedPtr DatasetXfer();
149 static PListSharedPtr FileMount();
151 static PListSharedPtr GroupCreate();
153 static PListSharedPtr GroupAccess();
155 static PListSharedPtr DatatypeCreate();
157 static PListSharedPtr DatatypeAccess();
159 static PListSharedPtr StringCreate();
161 static PListSharedPtr AttributeCreate();
163 static PListSharedPtr ObjectCopy();
165 static PListSharedPtr LinkCreate();
167 static PListSharedPtr LinkAccess();
172 void SetChunk(
const std::vector<hsize_t> &dims);
173 void SetDeflate(
const unsigned level = 1);
175 void SetDxMpioCollective();
176 void SetDxMpioIndependent();
189 LinkIterator(CanHaveGroupsDataSetsSharedPtr grp, hsize_t idx = 0);
195 return !(*
this == other);
204 return m_currentName;
208 static herr_t helper(hid_t g_id,
210 const H5L_info_t *info,
212 CanHaveGroupsDataSetsSharedPtr
m_grp;
221 GroupSharedPtr CreateGroup(
const std::string &
name,
227 DataSetSharedPtr CreateDataSet(
const std::string &name,
228 DataTypeSharedPtr type,
229 DataSpaceSharedPtr space,
236 DataSetSharedPtr CreateWriteDataSet(
237 const std::string &name,
238 const std::vector<T> &data,
244 GroupSharedPtr OpenGroup(
const std::string &name,
249 DataSetSharedPtr OpenDataSet(
250 const std::string &name,
253 bool ContainsDataSet(std::string nm);
255 virtual hsize_t GetNumElements() = 0;
259 friend class key_iterator;
269 AttrIterator(CanHaveAttributesSharedPtr obj, hsize_t idx = 0);
275 return !(*
this == other);
283 static herr_t helper(hid_t g_id,
285 const H5A_info_t *info,
294 AttributeSharedPtr CreateAttribute(
const std::string &name,
295 DataTypeSharedPtr type,
296 DataSpaceSharedPtr space);
297 AttributeSharedPtr OpenAttribute(
const std::string &name);
300 void SetAttribute(
const std::string &name,
const T &value);
302 void SetAttribute(
const std::string &name,
const std::vector<T> &value);
304 template <
class T>
void GetAttribute(
const std::string &name, T &value);
306 void GetAttribute(
const std::string &name, std::vector<T> &value);
308 int GetNumAttr()
const;
317 static DataSpaceSharedPtr
Null();
318 static DataSpaceSharedPtr Scalar();
319 static DataSpaceSharedPtr
OneD(hsize_t size);
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);
333 void SelectRange(
const std::vector<hsize_t> start,
334 const std::vector<hsize_t> count);
335 void AppendRange(
const std::vector<hsize_t> start,
336 const std::vector<hsize_t> count);
338 void SetSelection(
const hsize_t num_elmt,
339 const std::vector<hsize_t> &coords);
344 std::vector<hsize_t> GetDims();
359 static const bool MustConvert =
false;
362 static ConvertedType Convert(
const T &obj);
363 static T Deconvert(
const ConvertedType &obj);
379 static ConvertedType Convert(
const T &obj);
380 static T Deconvert(
const ConvertedType &obj);
385 static const void *GetAddress(
const ConvertedType &obj);
386 static void *GetAddress(ConvertedType &obj);
391 static DataTypeSharedPtr GetType();
392 static DataTypeSharedPtr GetType(
const T &obj);
400 static DataTypeSharedPtr String(
size_t len = 0);
401 template <
class T>
static DataTypeSharedPtr
OfObject(
const T &obj)
403 boost::ignore_unused(obj);
406 virtual void Close();
407 DataTypeSharedPtr Copy()
const;
416 static CompoundDataTypeSharedPtr Create(
size_t sz);
418 void Add(std::string name,
size_t offset, hid_t type)
420 H5Tinsert(m_Id, name.c_str(), offset, type);
422 void AddString(std::string name,
size_t offset,
size_t size)
424 hid_t strtype = H5Tcopy (H5T_C_S1);
425 H5Tset_size (strtype, size);
426 H5Tinsert(m_Id, name.c_str(), offset, strtype);
437 template <
class T>
static DataTypeSharedPtr Native();
438 static DataTypeSharedPtr CS1();
451 DataSpaceSharedPtr GetSpace()
const;
457 static AttributeSharedPtr Create(hid_t parent,
458 const std::string &name,
459 DataTypeSharedPtr type,
460 DataSpaceSharedPtr space);
461 static AttributeSharedPtr Open(hid_t parent,
const std::string &name);
469 static FileSharedPtr Create(
const std::string &filename,
473 static FileSharedPtr Open(
const std::string &filename,
478 virtual hsize_t GetNumElements();
490 virtual hsize_t GetNumElements();
491 std::vector<std::string> GetElementNames();
492 CanHaveAttributesSharedPtr operator[](hsize_t idx);
493 CanHaveAttributesSharedPtr operator[](
const std::string &key);
505 DataSpaceSharedPtr GetSpace()
const;
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,
516 DataSpaceSharedPtr filespace,
523 (m_Id, mem_t->GetId(), memspace->GetId(), filespace->GetId(),
524 dxpl->GetId(), &data[0]) );
528 void Write(
const std::vector<T> &data,
529 DataSpaceSharedPtr filespace,
530 DataTypeSharedPtr dt,
544 DataSpaceSharedPtr filespace,
545 DataTypeSharedPtr type,
550 (m_Id, type->GetId(), H5S_ALL, filespace->GetId(), dxpl->GetId(), s.c_str()));
554 DataSpaceSharedPtr filespace,
555 DataTypeSharedPtr type,
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)
569 DataSpaceSharedPtr space = GetSpace();
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,
583 DataSpaceSharedPtr filespace,
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,
598 DataSpaceSharedPtr filespace,
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());
635 DataSpaceSharedPtr filespace,
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);
703 static const bool MustConvert =
true;
706 inline static ConvertedType
Convert(
const std::string &obj)
710 inline static std::string
Deconvert(
const ConvertedType &obj)
712 return std::string(obj);
727 template <
typename T>
732 AttributeSharedPtr attr = CreateAttribute(name, type, space);
741 template <
typename T>
743 const std::vector<T> &value)
751 AttributeSharedPtr attr = CreateAttribute(name, type, space);
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>
776 AttributeSharedPtr attr = OpenAttribute(name);
786 template <
typename T>
788 std::vector<T> &value)
795 AttributeSharedPtr attr = OpenAttribute(name);
796 DataSpaceSharedPtr space = attr->GetSpace();
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,
832 PListSharedPtr createPL,
833 PListSharedPtr accessPL)
837 DataSetSharedPtr dataset =
838 CreateDataSet(name, type, space, createPL, accessPL);
839 dataset->Write(data);
void WriteString(std::string s, DataSpaceSharedPtr filespace, DataTypeSharedPtr type, PListSharedPtr dxpl=PList::Default())
#define H5_CALL(func, args)
static ConvertedType Convert(const T &obj)
void Write(const std::vector< T > &data)
#define ASSERTL0(condition, msg)
std::string GetName() const
void Read(std::vector< T > &data, DataSpaceSharedPtr filespace, std::vector< std::vector< int > > &coords, PListSharedPtr dxpl=PList::Default())
CanHaveAttributesSharedPtr m_obj
void Write(const std::vector< T > &data, DataSpaceSharedPtr filespace, DataTypeSharedPtr dt, PListSharedPtr dxpl=PList::Default())
static const void * GetAddress(const ConvertedType &obj)
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
static DataTypeSharedPtr OfObject(const T &obj)
static T Deconvert(const ConvertedType &obj)
static DataTypeSharedPtr GetType()
std::shared_ptr< DataSpace > DataSpaceSharedPtr
static DataTypeSharedPtr String(size_t len=0)
Converter::ConvertedType ConvertedType
Mixin for objects that can have attributes (Group, DataSet, DataType)
void Add(std::string name, size_t offset, hid_t type)
void AddString(std::string name, size_t offset, size_t size)
std::shared_ptr< DataSet > DataSetSharedPtr
const char * ConvertedVectorElemType
const char * ConvertedType
DataSetSharedPtr CreateWriteDataSet(const std::string &name, const std::vector< T > &data, PListSharedPtr createPL=PList::Default(), PListSharedPtr accessPL=PList::Default())
std::shared_ptr< DataType > DataTypeSharedPtr
bool operator==(const BasisKey &x, const BasisKey &y)
std::shared_ptr< PList > PListSharedPtr
DataTypeConversionPolicy< T > Converter
Wrap and HDF5 data type object. Technically this can have attributes, but not really bothered...
NekVector< DataType > operator*(const NekMatrix< LhsDataType, MatrixType > &lhs, const NekVector< DataType > &rhs)
bool operator!=(const AttrIterator &other) const
static ConvertedType Convert(const T &obj)
static DataSpaceSharedPtr OneD(hsize_t size)
std::shared_ptr< File > FileSharedPtr
std::shared_ptr< CanHaveGroupsDataSets > CanHaveGroupsDataSetsSharedPtr
T ConvertedVectorElemType
static const hid_t NativeType
Traits class for HDF5 data types.
static ConvertedType Convert(const std::string &obj)
void SetAttribute(const std::string &name, const T &value)
std::shared_ptr< Object > ObjectSharedPtr
static DataSpaceSharedPtr Scalar()
void ReadVectorString(std::vector< std::string > &data, DataSpaceSharedPtr filespace, PListSharedPtr dxpl=PList::Default())
Mixin for objects that contain groups and datasets (Group and File)
static T Deconvert(const ConvertedType &obj)
void Read(std::vector< T > &data)
CanHaveGroupsDataSetsSharedPtr m_grp
static DataTypeSharedPtr Native()
std::shared_ptr< CompoundDataType > CompoundDataTypeSharedPtr
std::shared_ptr< Group > GroupSharedPtr
std::string m_currentName
std::shared_ptr< Attribute > AttributeSharedPtr
void Read(std::vector< T > &data, DataSpaceSharedPtr filespace, PListSharedPtr dxpl=PList::Default())
std::string m_currentName
std::shared_ptr< CanHaveAttributes > CanHaveAttributesSharedPtr
void GetAttribute(const std::string &name, T &value)
static std::string Deconvert(const ConvertedType &obj)
Predefined HDF data types that must not be closed when done with.
void WriteVectorString(std::vector< std::string > s, DataSpaceSharedPtr filespace, DataTypeSharedPtr type, PListSharedPtr dxpl=PList::Default())
static PListSharedPtr Default()
Default options.
void Write(const std::vector< T > &data, DataSpaceSharedPtr filespace, PListSharedPtr dxpl=PList::Default())
bool operator!=(const LinkIterator &other) const