From fe341a249822f3c08da9cad198159b984e81510b Mon Sep 17 00:00:00 2001 From: Cristian C Lalescu <Cristian.Lalescu@ds.mpg.de> Date: Thu, 1 Jun 2017 23:08:43 +0200 Subject: [PATCH] add "require_size" hdf5 functionality --- bfps/_base.py | 7 ++++-- bfps/cpp/hdf5_tools.cpp | 53 +++++++++++++++++++++++++++++++++++++++++ bfps/cpp/hdf5_tools.hpp | 15 ++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/bfps/_base.py b/bfps/_base.py index 03604896..77040a01 100644 --- a/bfps/_base.py +++ b/bfps/_base.py @@ -175,9 +175,12 @@ class _base(object): def rewrite_par( self, group = None, - parameters = None): + parameters = None, + file_name = None): assert(group != 'parameters') - ofile = h5py.File(os.path.join(self.work_dir, self.simname + '.h5'), 'r+') + if type(file_name) == None: + file_name = os.path.join(self.work_dir, self.simname + '.h5') + ofile = h5py.File(file_name, 'a') for k in parameters.keys(): if group not in ofile.keys(): ofile.create_group(group) diff --git a/bfps/cpp/hdf5_tools.cpp b/bfps/cpp/hdf5_tools.cpp index abd894aa..1383b28b 100644 --- a/bfps/cpp/hdf5_tools.cpp +++ b/bfps/cpp/hdf5_tools.cpp @@ -1,5 +1,23 @@ #include "hdf5_tools.hpp" +int hdf5_tools::require_size_single_dataset(hid_t dset, int tsize) +{ + int ndims; + hsize_t space; + space = H5Dget_space(dset); + ndims = H5Sget_simple_extent_ndims(space); + hsize_t *dims = new hsize_t[ndims]; + H5Sget_simple_extent_dims(space, dims, NULL); + if (dims[0] < tsize) + { + dims[0] = tsize; + H5Dset_extent(dset, dims); + } + H5Sclose(space); + delete[] dims; + return EXIT_SUCCESS; +} + int hdf5_tools::grow_single_dataset(hid_t dset, int tincrement) { int ndims; @@ -15,6 +33,21 @@ int hdf5_tools::grow_single_dataset(hid_t dset, int tincrement) return EXIT_SUCCESS; } +herr_t hdf5_tools::require_size_dataset_visitor( + hid_t o_id, + const char *name, + const H5O_info_t *info, + void *op_data) +{ + if (info->type == H5O_TYPE_DATASET) + { + hsize_t dset = H5Dopen(o_id, name, H5P_DEFAULT); + require_size_single_dataset(dset, *((int*)(op_data))); + H5Dclose(dset); + } + return EXIT_SUCCESS; +} + herr_t hdf5_tools::grow_dataset_visitor( hid_t o_id, const char *name, @@ -50,6 +83,26 @@ int hdf5_tools::grow_file_datasets( return file_problems; } + +int hdf5_tools::require_size_file_datasets( + const hid_t stat_file, + const std::string group_name, + int tsize) +{ + int file_problems = 0; + + hid_t group; + group = H5Gopen(stat_file, group_name.c_str(), H5P_DEFAULT); + H5Ovisit( + group, + H5_INDEX_NAME, + H5_ITER_NATIVE, + require_size_dataset_visitor, + &tsize); + H5Gclose(group); + return file_problems; +} + template <typename number> std::vector<number> hdf5_tools::read_vector( const hid_t group, diff --git a/bfps/cpp/hdf5_tools.hpp b/bfps/cpp/hdf5_tools.hpp index 0e3b38fe..0eebd84b 100644 --- a/bfps/cpp/hdf5_tools.hpp +++ b/bfps/cpp/hdf5_tools.hpp @@ -48,6 +48,21 @@ namespace hdf5_tools const std::string group_name, int tincrement); + int require_size_single_dataset( + hid_t dset, + int tincrement); + + herr_t require_size_dataset_visitor( + hid_t o_id, + const char *name, + const H5O_info_t *info, + void *op_data); + + int require_size_file_datasets( + const hid_t stat_file, + const std::string group_name, + int tincrement); + template <typename number> std::vector<number> read_vector( const hid_t group, -- GitLab