hdf5: some reorganization of the code + new member functions
This commit is contained in:
parent
8b66ad04ba
commit
b4ab639747
3 changed files with 100 additions and 47 deletions
|
@ -23,15 +23,9 @@ namespace CNORXZ
|
|||
{
|
||||
const hid_t tid = getTypeId(*data.data());
|
||||
//VCHECK(tid);
|
||||
init(data.range(), tid);
|
||||
//init(data.range(), tid);
|
||||
if(data.begin().formatIsTrivial()){
|
||||
Vector<hsize_t> dims(mDataRange->dim());
|
||||
for(SizeT i = 0; i != dims.size(); ++i){
|
||||
dims[i] = mDataRange->sub(i)->size();
|
||||
}
|
||||
const hid_t memspace = H5Screate_simple(dims.size(), dims.data(), NULL);
|
||||
H5Dwrite(mId, mType, memspace, mFilespace, H5P_DEFAULT, data.data());
|
||||
H5Sclose(memspace);
|
||||
init(data.range(), tid, data.data());
|
||||
}
|
||||
else {
|
||||
CXZ_ERROR("Got array type with non-trivial format; non-contiguous data formats are not supported yet!");
|
||||
|
@ -47,19 +41,23 @@ namespace CNORXZ
|
|||
template <typename T>
|
||||
MArray<T> SDataset<T>::read() const
|
||||
{
|
||||
Vector<hsize_t> dims(mDataRange->dim());
|
||||
for(SizeT i = 0; i != dims.size(); ++i){
|
||||
dims[i] = mDataRange->sub(i)->size();
|
||||
}
|
||||
const hid_t mem_space_id = H5Screate_simple(static_cast<hsize_t>(dims.size()),
|
||||
dims.data(), nullptr);
|
||||
const hid_t xfer_plist_id = H5Pcreate(H5P_DATASET_XFER);
|
||||
MArray<T> out(mDataRange);
|
||||
const herr_t err = H5Dread(mId, mType, mem_space_id, mFilespace, xfer_plist_id, out.data());
|
||||
CXZ_ASSERT(err >= 0, "error while reading dataset '" << mName
|
||||
<< "', errorcode :" << err);
|
||||
H5Pclose(xfer_plist_id);
|
||||
H5Sclose(mem_space_id);
|
||||
readbase(out.data(), nullptr, nullptr);
|
||||
return out;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
template <class I, typename M>
|
||||
MArray<T> SDataset<T>::read(const IndexInterface<I,M>& idx) const
|
||||
{
|
||||
CXZ_ASSERT(idx.dim() == mDataRange->dim(), "got index of inconsistent dimension, got"
|
||||
<< idx.dim() << ", expected " << mDataRange->dim());
|
||||
const RangePtr outrange = idx.range();
|
||||
CXZ_ASSERT(outrange->size() == mDataRange->size(),
|
||||
"got index of range of inconsistent size, expected "
|
||||
<< mDataRange->size() << ", got " << outrange->size());
|
||||
MArray<T> out(outrange);
|
||||
readbase(out.data(), outrange, nullptr);
|
||||
return out;
|
||||
}
|
||||
|
||||
|
@ -70,43 +68,25 @@ namespace CNORXZ
|
|||
CXZ_ASSERT(beg.dim() == mDataRange->dim(), "got index of inconsistent dimension, got"
|
||||
<< beg.dim() << ", expected " << mDataRange->dim());
|
||||
const RangePtr outrange = beg.prange(end);
|
||||
Vector<hsize_t> dims(outrange->dim());
|
||||
for(SizeT i = 0; i != dims.size(); ++i){
|
||||
dims[i] = outrange->sub(i)->size();
|
||||
}
|
||||
const Vector<hsize_t> fpos = mkFPos(beg);
|
||||
H5Sselect_hyperslab(mFilespace, H5S_SELECT_SET, fpos.data(), NULL, dims.data(), NULL);
|
||||
const hid_t mem_space_id = H5Screate_simple(static_cast<hsize_t>(dims.size()),
|
||||
dims.data(), nullptr);
|
||||
const hid_t xfer_plist_id = H5Pcreate(H5P_DATASET_XFER);
|
||||
MArray<T> out(outrange);
|
||||
const herr_t err = H5Dread(mId, mType, mem_space_id, mFilespace, xfer_plist_id, out.data());
|
||||
CXZ_ASSERT(err >= 0, "error while reading dataset '" << mName
|
||||
<< "', errorcode :" << err);
|
||||
H5Pclose(xfer_plist_id);
|
||||
H5Sclose(mem_space_id);
|
||||
readbase(out.data(), outrange, toYptr(beg));
|
||||
return out;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
template <class I, typename M>
|
||||
Vector<hsize_t> SDataset<T>::mkFPos(const IndexInterface<I,M>& beg) const
|
||||
Sptr<YIndex> SDataset<T>::toYptr(const IndexInterface<I,M>& beg) const
|
||||
{
|
||||
Vector<hsize_t> fpos(beg.dim());
|
||||
if constexpr(has_static_sub<I>::value){
|
||||
iter<0,index_dim<I>::value> ( [&](auto i) { fpos[i] = beg.THIS().pack().get(i)->lex(); }, NoF{} );
|
||||
if constexpr(std::is_same<YIndex,I>::value){
|
||||
return std::make_shared<YIndex>(beg.THIS());
|
||||
}
|
||||
else if constexpr(has_sub<I>::value){
|
||||
for(SizeT i = 0; i != beg.dim(); ++i){
|
||||
fpos[i] = beg.THIS().pack().get(i)->lex();
|
||||
}
|
||||
else if constexpr(has_sub<I>::value) {
|
||||
return yindexPtr(beg.pack());
|
||||
}
|
||||
else {
|
||||
fpos[0] = beg.lex();
|
||||
return yindexPtr(DPack(std::make_shared<I>(beg)));
|
||||
}
|
||||
return fpos;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -48,7 +48,21 @@ namespace CNORXZ
|
|||
@param dataRange A potentially multi-dimensional range characterizing the dataset.
|
||||
@param type Data type id.
|
||||
*/
|
||||
Dataset& init(const RangePtr& dataRange, hid_t type);
|
||||
virtual Dataset& init(const RangePtr& dataRange, hid_t type);
|
||||
|
||||
/** Initalize the dataset.
|
||||
@param dataRange A potentially multi-dimensional range characterizing the dataset.
|
||||
@param type Data type id.
|
||||
@param data Pointer to raw data.
|
||||
*/
|
||||
virtual Dataset& init(const RangePtr& dataRange, hid_t type, const void* data);
|
||||
|
||||
/** Read the dataset.
|
||||
@param dest Pointer to destination.
|
||||
@param readrange Range of the destination data.
|
||||
@param beg Position within the file space.
|
||||
*/
|
||||
virtual void readbase(void* dest, RangePtr readrange, Sptr<YIndex> beg) const;
|
||||
|
||||
/** Initalize the dataset.
|
||||
@param data Array containing the dataset.
|
||||
|
@ -62,6 +76,8 @@ namespace CNORXZ
|
|||
const RangePtr& dataRange() const;
|
||||
|
||||
protected:
|
||||
Vector<hsize_t> mkOff(const Sptr<YIndex>& beg) const;
|
||||
|
||||
RangePtr mDataRange; /**< The data range. */
|
||||
hid_t mType; /**< The data type identifier. */
|
||||
hid_t mFilespace; /**< The hdf5 file space identifier. */
|
||||
|
@ -89,6 +105,14 @@ namespace CNORXZ
|
|||
*/
|
||||
MArray<T> read() const;
|
||||
|
||||
/** Read the dataset using range of given index.
|
||||
The index position is ignored.
|
||||
@param idx Index specifying the range type.
|
||||
@return Array containing the dataset values.
|
||||
*/
|
||||
template <class I, typename M>
|
||||
MArray<T> read(const IndexInterface<I,M>& idx) const;
|
||||
|
||||
/** Read a given subset of the dataset.
|
||||
The subset needs to be hypercubic.
|
||||
@param beg Index indicating the begin edge of the hypercube.
|
||||
|
@ -100,8 +124,10 @@ namespace CNORXZ
|
|||
|
||||
private:
|
||||
|
||||
//template <class I, typename M>
|
||||
//Vector<hsize_t> mkFPos(const IndexInterface<I,M>& beg) const;
|
||||
template <class I, typename M>
|
||||
Vector<hsize_t> mkFPos(const IndexInterface<I,M>& beg) const;
|
||||
Sptr<YIndex> toYptr(const IndexInterface<I,M>& beg) const;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -105,10 +105,57 @@ namespace CNORXZ
|
|||
return *this;
|
||||
}
|
||||
|
||||
Dataset& Dataset::init(const RangePtr& dataRange, hid_t type, const void* data)
|
||||
{
|
||||
init(dataRange, type);
|
||||
Vector<hsize_t> dims(mDataRange->dim());
|
||||
for(SizeT i = 0; i != dims.size(); ++i){
|
||||
dims[i] = mDataRange->sub(i)->size();
|
||||
}
|
||||
const hid_t memspace = H5Screate_simple(dims.size(), dims.data(), NULL);
|
||||
H5Dwrite(mId, mType, memspace, mFilespace, H5P_DEFAULT, data);
|
||||
H5Sclose(memspace);
|
||||
return *this;
|
||||
}
|
||||
|
||||
void Dataset::readbase(void* dest, RangePtr readrange, Sptr<YIndex> beg) const
|
||||
{
|
||||
// TODO: Check if readrange is compatible with mDataRange!!!
|
||||
if(not readrange){
|
||||
readrange = mDataRange;
|
||||
}
|
||||
Vector<hsize_t> dims(readrange->dim());
|
||||
for(SizeT i = 0; i != dims.size(); ++i){
|
||||
dims[i] = readrange->sub(i)->size();
|
||||
}
|
||||
if(beg){
|
||||
const Vector<hsize_t> fpos = mkOff(beg);
|
||||
H5Sselect_hyperslab(mFilespace, H5S_SELECT_SET, fpos.data(), NULL, dims.data(), NULL);
|
||||
}
|
||||
const hid_t mem_space_id = H5Screate_simple(static_cast<hsize_t>(dims.size()),
|
||||
dims.data(), nullptr);
|
||||
const hid_t xfer_plist_id = H5Pcreate(H5P_DATASET_XFER);
|
||||
//MArray<T> out(readrange);
|
||||
const herr_t err = H5Dread(mId, mType, mem_space_id, mFilespace, xfer_plist_id, dest);
|
||||
CXZ_ASSERT(err >= 0, "error while reading dataset '" << mName
|
||||
<< "', errorcode :" << err);
|
||||
H5Pclose(xfer_plist_id);
|
||||
H5Sclose(mem_space_id);
|
||||
}
|
||||
|
||||
const RangePtr& Dataset::dataRange() const
|
||||
{
|
||||
return mDataRange;
|
||||
}
|
||||
|
||||
Vector<hsize_t> Dataset::mkOff(const Sptr<YIndex>& beg) const
|
||||
{
|
||||
Vector<hsize_t> off(beg->dim());
|
||||
for(SizeT i = 0; i != beg->dim(); ++i){
|
||||
off[i] = beg->pack().get(i)->lex();
|
||||
}
|
||||
return off;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue