Implement hyperslab read.

git-svn-id: https://subversion.assembla.com/svn/qmcdev/trunk@6184 e5b18d87-469d-4833-9cc0-8cdfa06e9491
This commit is contained in:
Jeongnim Kim 2014-01-24 14:51:55 +00:00
parent 0d7d9dcfc9
commit cc8c632869
2 changed files with 44 additions and 5 deletions

View File

@ -94,6 +94,33 @@ inline bool h5d_write(hid_t grp, const std::string& aname, hsize_t ndims, const
return ret != -1;
}
/** return true, if successful */
template<typename T>
bool h5d_read(hid_t grp, const std::string& aname, hsize_t ndims,
const hsize_t* gcounts, const hsize_t* counts, const hsize_t* offsets,
T* first , hid_t xfer_plist)
{
if(grp<0)
return true;
hid_t h1 = H5Dopen(grp, aname.c_str());
if(h1<0)
return false;
//herr_t ret = H5Dread(h1, h5d_type_id, H5S_ALL, H5S_ALL, xfer_plist, first);
hid_t dataspace = H5Dget_space(h1);
hid_t memspace = H5Screate_simple(ndims, counts, NULL);
herr_t ret = H5Sselect_hyperslab(dataspace,H5S_SELECT_SET, offsets,NULL,counts,NULL);
hid_t h5d_type_id=get_h5_datatype(*first);
ret = H5Dread(h1, h5d_type_id, memspace, dataspace, xfer_plist, first);
H5Sclose(dataspace);
H5Sclose(memspace);
H5Dclose(h1);
return ret != -1;
}
template<typename T>
inline bool h5d_write(hid_t grp, const std::string& aname, hsize_t ndims,
const hsize_t* gcounts, const hsize_t* counts, const hsize_t* offsets,
@ -106,7 +133,6 @@ inline bool h5d_write(hid_t grp, const std::string& aname, hsize_t ndims,
herr_t ret=-1;
if(h1<0) //missing create one
{
cout << "phdf write " << endl;
hid_t dataspace=H5Screate_simple(ndims,gcounts,NULL);
hid_t dataset=H5Dcreate(grp, aname.c_str(),h5d_type_id, dataspace, H5P_DEFAULT);

View File

@ -64,6 +64,7 @@ struct hyperslab_proxy: public container_proxy<CT>
slab_dims[slab_rank]=element_size;
slab_rank+=1;
}
use_slab=true;
}
/** return the size of the i-th dimension
@ -88,12 +89,24 @@ struct h5data_proxy<hyperslab_proxy<CT,MAXDIM> >
h5data_proxy(hyperslab_proxy<CT,MAXDIM>& a): ref_(a) {}
inline bool read(hid_t grp, const std::string& aname, hid_t xfer_plist=H5P_DEFAULT)
{
int rank=ref_.slab_rank;
if(!get_space(grp,aname,rank,ref_.slab_dims.data(),true))
if(ref_.use_slab)
{
ref_.change_shape();
return h5d_read(grp,aname.c_str(),
ref_.slab_rank,
ref_.slab_dims.data(),
ref_.slab_dims_local.data(),
ref_.slab_offset.data(),
ref_.data(),xfer_plist);
}
else
{
int rank=ref_.slab_rank;
if(!get_space(grp,aname,rank,ref_.slab_dims.data(),true))
{
ref_.change_shape();
}
return h5d_read(grp,aname,ref_.data(),xfer_plist);
}
return h5d_read(grp,aname,ref_.data(),xfer_plist);
}
inline bool write(hid_t grp, const std::string& aname, hid_t xfer_plist=H5P_DEFAULT)
{