yrange: fix in range cast specialization + hdf5_mpi: further read test
This commit is contained in:
parent
ffec135eec
commit
b3cbc61718
5 changed files with 50 additions and 2 deletions
|
@ -700,6 +700,16 @@ namespace CNORXZ
|
||||||
|
|
||||||
Sptr<YRange> RangeCast<YRange>::func(const RangePtr& r)
|
Sptr<YRange> RangeCast<YRange>::func(const RangePtr& r)
|
||||||
{
|
{
|
||||||
|
if(r->stype() == "Y"){
|
||||||
|
return std::dynamic_pointer_cast<YRange>(r);
|
||||||
|
}
|
||||||
|
if(r->stype() == "M" or r->dim() > 1){
|
||||||
|
Vector<RangePtr> rv(r->dim());
|
||||||
|
for(SizeT i = 0; i != rv.size(); ++i){
|
||||||
|
rv[i] = r->sub(i);
|
||||||
|
}
|
||||||
|
return std::dynamic_pointer_cast<YRange>( YRangeFactory(rv).create() );
|
||||||
|
}
|
||||||
return std::dynamic_pointer_cast<YRange>( YRangeFactory({r}).create() );
|
return std::dynamic_pointer_cast<YRange>( YRangeFactory({r}).create() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,7 @@ namespace CNORXZ
|
||||||
|
|
||||||
/** Read the dataset using range of given index.
|
/** Read the dataset using range of given index.
|
||||||
The index position is ignored.
|
The index position is ignored.
|
||||||
@param idx Index specifying the range type.
|
@param idx Index specifying the range.
|
||||||
@return Array containing the dataset values.
|
@return Array containing the dataset values.
|
||||||
*/
|
*/
|
||||||
template <class I, typename M>
|
template <class I, typename M>
|
||||||
|
|
|
@ -45,6 +45,20 @@ namespace CNORXZ
|
||||||
return out;
|
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);
|
||||||
|
readbase(out.data(), outrange, nullptr);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,13 @@ namespace CNORXZ
|
||||||
@return Array containing the dataset values.
|
@return Array containing the dataset values.
|
||||||
*/
|
*/
|
||||||
mpi::RArray<T> read(const RangePtr& geom) const;
|
mpi::RArray<T> read(const RangePtr& geom) const;
|
||||||
|
|
||||||
|
/** Read the dataset.
|
||||||
|
@param idx Index specifying the range.
|
||||||
|
@return RArray containing the dataset values.
|
||||||
|
*/
|
||||||
|
template <class I, class K>
|
||||||
|
mpi::RArray<T> read(const mpi::RIndex<I,K>& idx) const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,8 @@ namespace
|
||||||
using namespace CNORXZ::mpi;
|
using namespace CNORXZ::mpi;
|
||||||
using Test::Numbers;
|
using Test::Numbers;
|
||||||
|
|
||||||
typedef MIndex<CIndex,CIndex,CIndex,CIndex> C4;
|
typedef UIndex<SizeT> UI;
|
||||||
|
typedef MIndex<UI,UI,UI,UI> U4;
|
||||||
|
|
||||||
class RDataset_test : public ::testing::Test
|
class RDataset_test : public ::testing::Test
|
||||||
{
|
{
|
||||||
|
@ -111,6 +112,22 @@ namespace
|
||||||
auto i = std::make_shared<CIndex>(mLR2);
|
auto i = std::make_shared<CIndex>(mLR2);
|
||||||
i->ifor( operation( [](Double a, Double b) { EXPECT_EQ(a,b); }, mA2(i), a(i) ), NoF{} )();
|
i->ifor( operation( [](Double a, Double b) { EXPECT_EQ(a,b); }, mA2(i), a(i) ), NoF{} )();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(RDataset_test, ReadExplicit)
|
||||||
|
{
|
||||||
|
RFile h5f(mFilename, false);
|
||||||
|
//auto dat = h5f.open().getGroup("dir")->open().get("dat", [](const String& name, const ContentBase* par, auto& i)
|
||||||
|
//{ (*i)->close(); auto dset = std::make_shared<SRDataset<Double>>(name, par); *i = dset;
|
||||||
|
// return dset; } );
|
||||||
|
auto dat = getRDataset<Double>(h5f.open().getGroup("dir")->open(),"dat");
|
||||||
|
RIndex<U4,U4> idx(mA2.range());
|
||||||
|
|
||||||
|
auto a = dat->read(idx);
|
||||||
|
h5f.close();
|
||||||
|
|
||||||
|
auto i = std::make_shared<CIndex>(mLR2);
|
||||||
|
i->ifor( operation( [](Double a, Double b) { EXPECT_EQ(a,b); }, mA2(i), a(i) ), NoF{} )();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
|
|
Loading…
Reference in a new issue