cnorxz/src/opt/hdf5_mpi/include/h5_rdataset.cc.h

73 lines
2.3 KiB
C++

// -*- C++ -*-
/**
@file opt/hdf5-mpi/include/h5_dataset.cc.h
@brief Implementation of template member functions of RDataset and SRDataset.
Copyright (c) 2024 Christian Zimmermann. All rights reserved.
Mail: chizeta@f3l.de
**/
#ifndef __cxz_h5_rdataset_cc_h__
#define __cxz_h5_rdataset_cc_h__
#include "h5_rdataset.h"
namespace CNORXZ
{
namespace hdf5
{
template <typename T>
RDataset& RDataset::init(const mpi::RArray<T>& data)
{
const hid_t tid = getTypeId(*data.data());
if(data.begin().formatIsTrivial()){
dynamic_cast<Dataset*>(this)->initbase(data.range(), tid, data.data());
}
else {
CXZ_ERROR("Got array type with non-trivial format; non-contiguous data formats are not supported yet!");
}
return *this;
}
template <typename T>
SRDataset<T>::SRDataset(const String& name, const ContentBase* _parent) :
RDataset(name, _parent)
{}
template <typename T>
mpi::RArray<T> SRDataset<T>::read(const RangePtr& geom) const
{
auto rr = rangeCast<mpi::RRange<YRange,YRange>>( mpi::rrange(mFileRange, geom) );
auto mbeg = std::make_shared<mpi::RIndex<YIndex,YIndex>>(rr);
auto mend = std::make_shared<mpi::RIndex<YIndex,YIndex>>(rr);
*mend = mend->lmax().val()-1;
auto fbeg = std::make_shared<YIndex>(mFileRange);
mpi::RArray<T> out(rr);
rreadbase(out.data(), sizeof(T), mbeg, mend, fbeg);
return out;
}
template <typename T>
template <class I, class K>
mpi::RArray<T> SRDataset<T>::read(const mpi::RIndex<I,K>& idx) const
{
CXZ_ASSERT(idx.dim() == mFileRange->dim(), "got index of inconsistent dimension, got"
<< idx.dim() << ", expected " << mFileRange->dim());
auto outrange = rangeCast<mpi::RRange<YRange,YRange>>( idx.range() );
CXZ_ASSERT(outrange->size() == mFileRange->size(),
"got index of range of inconsistent size, expected "
<< mFileRange->size() << ", got " << outrange->size());
mpi::RArray<T> out(outrange);
auto mbeg = std::make_shared<mpi::RIndex<YIndex,YIndex>>(outrange);
auto mend = std::make_shared<mpi::RIndex<YIndex,YIndex>>(outrange);
*mend = mend->lmax().val()-1;
auto fbeg = std::make_shared<YIndex>(mFileRange);
rreadbase(out.data(), sizeof(T), mbeg, mend, fbeg);
return out;
}
}
}
#endif