Loading include/dca/io/hdf5/hdf5_reader.hpp +11 −3 Original line number Diff line number Diff line Loading @@ -256,9 +256,17 @@ bool HDF5Reader::execute(const std::string& name, func::function<Scalartype, dom std::cout << "\n\tstart reading function : " << name; // Check sizes. H5::DataSet dataset = file_->openDataSet(full_name.c_str()); // Read sizes. std::vector<hsize_t> dims; execute(name + "/" + "domain-sizes", dims); auto domain_attribute = dataset.openAttribute("domain-sizes"); hsize_t n_dims; domain_attribute.getSpace().getSimpleExtentDims(&n_dims); dims.resize(n_dims); domain_attribute.read(HDF5_TYPE<hsize_t>::get_PredType(), dims.data()); // Check sizes. if (dims.size() != f.signature()) throw(std::length_error("The number of domains is different")); for (int i = 0; i < f.signature(); ++i) { Loading @@ -266,7 +274,7 @@ bool HDF5Reader::execute(const std::string& name, func::function<Scalartype, dom throw(std::length_error("The size of domain " + std::to_string(i) + " is different")); } read(full_name + "/data", HDF5_TYPE<Scalartype>::get_PredType(), f.values()); read(full_name, HDF5_TYPE<Scalartype>::get_PredType(), f.values()); return true; } Loading include/dca/io/hdf5/hdf5_writer.hpp +35 −28 Original line number Diff line number Diff line Loading @@ -146,8 +146,11 @@ private: bool exists(const std::string& name) const; void write(const std::string& name, const std::vector<hsize_t>& size, H5::DataType type, H5::DataSet write(const std::string& name, const std::vector<hsize_t>& size, H5::DataType type, const void* data); void addAttribute(const H5::DataSet& set, const std::string& name, const std::vector<hsize_t>& size, H5::DataType type, const void* data); void addAttribute(const H5::DataSet& set, const std::string& name, const std::string& value); std::unique_ptr<H5::H5File> file_; Loading Loading @@ -298,27 +301,22 @@ void HDF5Writer::execute(const std::string& name, const func::function<Scalar, d if (f.size() == 0) return; open_group(name); std::string new_path = get_path(); execute("name", f.get_name()); const std::string full_name = get_path() + "/" + name; std::vector<hsize_t> dims; for (int l = 0; l < f.signature(); ++l) dims.push_back(f[l]); execute("domain-sizes", dims); // be carefull --> HDF5 is by default row-major, while the function-class is column-major ! std::reverse(dims.begin(), dims.end()); std::string full_name = new_path + "/data"; auto dataset = write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), f.values()); write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), f.values()); addAttribute(dataset, "name", f.get_name()); close_group(); std::reverse(dims.begin(), dims.end()); auto type = HDF5_TYPE<hsize_t>::get_PredType(); addAttribute(dataset, "domain-sizes", std::vector<hsize_t>{dims.size()}, type, dims.data()); } template <typename Scalar, typename domain_type> Loading @@ -327,41 +325,46 @@ void HDF5Writer::execute(const std::string& name, if (f.size() == 0) return; open_group(name); std::string new_path = get_path(); execute("name", f.get_name()); const std::string full_name = get_path() + "/" + name; std::vector<hsize_t> dims; for (int l = 0; l < f.signature(); ++l) dims.push_back(f[l]); execute("domain-sizes", dims); // be carefull --> HDF5 is by default row-major, while the function-class is column-major ! std::reverse(dims.begin(), dims.end()); // Add real-imaginary dimension dims.push_back(2); std::string full_name = get_path() + "/data"; write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), f.values()); close_group(); auto dataset = write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), f.values()); addAttribute(dataset, "name", f.get_name()); dims.pop_back(); std::reverse(dims.begin(), dims.end()); auto type = HDF5_TYPE<hsize_t>::get_PredType(); addAttribute(dataset, "domain-sizes", std::vector<hsize_t>{dims.size()}, type, dims.data()); } template <typename Scalar> void HDF5Writer::execute(const std::string& name, const dca::linalg::Vector<Scalar, dca::linalg::CPU>& V) { std::string full_name = get_path() + "/" + name; auto dataset = write(full_name, std::vector<hsize_t>{V.size()}, HDF5_TYPE<Scalar>::get_PredType(), V.ptr()); addAttribute(dataset, "name", V.get_name()); } template <typename Scalar> void HDF5Writer::execute(const std::string& name, const dca::linalg::Vector<std::complex<Scalar>, dca::linalg::CPU>& V) { std::string full_name = get_path() + "/" + name; write(full_name, std::vector<hsize_t>{V.size(), 2}, HDF5_TYPE<Scalar>::get_PredType(), V.ptr()); auto dataset = write(full_name, std::vector<hsize_t>{V.size(), 2}, HDF5_TYPE<Scalar>::get_PredType(), V.ptr()); addAttribute(dataset, "name", V.get_name()); } template <typename Scalar> Loading @@ -377,7 +380,9 @@ void HDF5Writer::execute(const std::string& name, linearized[linindex++] = A(i, j); std::string full_name = get_path() + "/" + name; write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), linearized.data()); auto dataset = write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), linearized.data()); addAttribute(dataset, "name", A.get_name()); } template <typename Scalar> Loading @@ -393,7 +398,9 @@ void HDF5Writer::execute(const std::string& name, linearized[linindex++] = A(i, j); std::string full_name = get_path() + "/" + name; write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), linearized.data()); auto dataset = write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), linearized.data()); addAttribute(dataset, "name", A.get_name()); } template <class T> Loading src/io/hdf5/hdf5_writer.cpp +21 −2 Original line number Diff line number Diff line Loading @@ -113,8 +113,8 @@ void HDF5Writer::execute(const std::string& name, } } void HDF5Writer::write(const std::string& name, const std::vector<hsize_t>& dims, H5::DataType type, const void* data) { H5::DataSet HDF5Writer::write(const std::string& name, const std::vector<hsize_t>& dims, H5::DataType type, const void* data) { if (exists(name)) { H5::DataSet dataset = file_->openDataSet(name.c_str()); H5::DataSpace dataspace = dataset.getSpace(); Loading @@ -127,15 +127,34 @@ void HDF5Writer::write(const std::string& name, const std::vector<hsize_t>& dims } dataset.write(data, type, dataspace, H5P_DEFAULT); return dataset; } else { H5::DataSpace dataspace(dims.size(), dims.data()); H5::DataSet dataset(file_->createDataSet(name.c_str(), type, dataspace)); dataset.write(data, type, dataspace, H5P_DEFAULT); return dataset; } } void HDF5Writer::addAttribute(const H5::DataSet& set, const std::string& name, const std::vector<hsize_t>& size, H5::DataType type, const void* data) { if (set.attrExists(name)) { return; } H5::DataSpace space(size.size(), size.data()); auto attribute = set.createAttribute(name, type, space); attribute.write(type, data); } void HDF5Writer::addAttribute(const H5::DataSet& set, const std::string& name, const std::string& value) { H5::StrType str_type(H5::PredType::C_S1, value.size()); addAttribute(set, name, std::vector<hsize_t>{1}, str_type, value.c_str()); } bool HDF5Writer::exists(const std::string& name) const { auto code = H5Gget_objinfo(file_id_, name.c_str(), 0, NULL); return code == 0; Loading Loading
include/dca/io/hdf5/hdf5_reader.hpp +11 −3 Original line number Diff line number Diff line Loading @@ -256,9 +256,17 @@ bool HDF5Reader::execute(const std::string& name, func::function<Scalartype, dom std::cout << "\n\tstart reading function : " << name; // Check sizes. H5::DataSet dataset = file_->openDataSet(full_name.c_str()); // Read sizes. std::vector<hsize_t> dims; execute(name + "/" + "domain-sizes", dims); auto domain_attribute = dataset.openAttribute("domain-sizes"); hsize_t n_dims; domain_attribute.getSpace().getSimpleExtentDims(&n_dims); dims.resize(n_dims); domain_attribute.read(HDF5_TYPE<hsize_t>::get_PredType(), dims.data()); // Check sizes. if (dims.size() != f.signature()) throw(std::length_error("The number of domains is different")); for (int i = 0; i < f.signature(); ++i) { Loading @@ -266,7 +274,7 @@ bool HDF5Reader::execute(const std::string& name, func::function<Scalartype, dom throw(std::length_error("The size of domain " + std::to_string(i) + " is different")); } read(full_name + "/data", HDF5_TYPE<Scalartype>::get_PredType(), f.values()); read(full_name, HDF5_TYPE<Scalartype>::get_PredType(), f.values()); return true; } Loading
include/dca/io/hdf5/hdf5_writer.hpp +35 −28 Original line number Diff line number Diff line Loading @@ -146,8 +146,11 @@ private: bool exists(const std::string& name) const; void write(const std::string& name, const std::vector<hsize_t>& size, H5::DataType type, H5::DataSet write(const std::string& name, const std::vector<hsize_t>& size, H5::DataType type, const void* data); void addAttribute(const H5::DataSet& set, const std::string& name, const std::vector<hsize_t>& size, H5::DataType type, const void* data); void addAttribute(const H5::DataSet& set, const std::string& name, const std::string& value); std::unique_ptr<H5::H5File> file_; Loading Loading @@ -298,27 +301,22 @@ void HDF5Writer::execute(const std::string& name, const func::function<Scalar, d if (f.size() == 0) return; open_group(name); std::string new_path = get_path(); execute("name", f.get_name()); const std::string full_name = get_path() + "/" + name; std::vector<hsize_t> dims; for (int l = 0; l < f.signature(); ++l) dims.push_back(f[l]); execute("domain-sizes", dims); // be carefull --> HDF5 is by default row-major, while the function-class is column-major ! std::reverse(dims.begin(), dims.end()); std::string full_name = new_path + "/data"; auto dataset = write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), f.values()); write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), f.values()); addAttribute(dataset, "name", f.get_name()); close_group(); std::reverse(dims.begin(), dims.end()); auto type = HDF5_TYPE<hsize_t>::get_PredType(); addAttribute(dataset, "domain-sizes", std::vector<hsize_t>{dims.size()}, type, dims.data()); } template <typename Scalar, typename domain_type> Loading @@ -327,41 +325,46 @@ void HDF5Writer::execute(const std::string& name, if (f.size() == 0) return; open_group(name); std::string new_path = get_path(); execute("name", f.get_name()); const std::string full_name = get_path() + "/" + name; std::vector<hsize_t> dims; for (int l = 0; l < f.signature(); ++l) dims.push_back(f[l]); execute("domain-sizes", dims); // be carefull --> HDF5 is by default row-major, while the function-class is column-major ! std::reverse(dims.begin(), dims.end()); // Add real-imaginary dimension dims.push_back(2); std::string full_name = get_path() + "/data"; write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), f.values()); close_group(); auto dataset = write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), f.values()); addAttribute(dataset, "name", f.get_name()); dims.pop_back(); std::reverse(dims.begin(), dims.end()); auto type = HDF5_TYPE<hsize_t>::get_PredType(); addAttribute(dataset, "domain-sizes", std::vector<hsize_t>{dims.size()}, type, dims.data()); } template <typename Scalar> void HDF5Writer::execute(const std::string& name, const dca::linalg::Vector<Scalar, dca::linalg::CPU>& V) { std::string full_name = get_path() + "/" + name; auto dataset = write(full_name, std::vector<hsize_t>{V.size()}, HDF5_TYPE<Scalar>::get_PredType(), V.ptr()); addAttribute(dataset, "name", V.get_name()); } template <typename Scalar> void HDF5Writer::execute(const std::string& name, const dca::linalg::Vector<std::complex<Scalar>, dca::linalg::CPU>& V) { std::string full_name = get_path() + "/" + name; write(full_name, std::vector<hsize_t>{V.size(), 2}, HDF5_TYPE<Scalar>::get_PredType(), V.ptr()); auto dataset = write(full_name, std::vector<hsize_t>{V.size(), 2}, HDF5_TYPE<Scalar>::get_PredType(), V.ptr()); addAttribute(dataset, "name", V.get_name()); } template <typename Scalar> Loading @@ -377,7 +380,9 @@ void HDF5Writer::execute(const std::string& name, linearized[linindex++] = A(i, j); std::string full_name = get_path() + "/" + name; write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), linearized.data()); auto dataset = write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), linearized.data()); addAttribute(dataset, "name", A.get_name()); } template <typename Scalar> Loading @@ -393,7 +398,9 @@ void HDF5Writer::execute(const std::string& name, linearized[linindex++] = A(i, j); std::string full_name = get_path() + "/" + name; write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), linearized.data()); auto dataset = write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), linearized.data()); addAttribute(dataset, "name", A.get_name()); } template <class T> Loading
src/io/hdf5/hdf5_writer.cpp +21 −2 Original line number Diff line number Diff line Loading @@ -113,8 +113,8 @@ void HDF5Writer::execute(const std::string& name, } } void HDF5Writer::write(const std::string& name, const std::vector<hsize_t>& dims, H5::DataType type, const void* data) { H5::DataSet HDF5Writer::write(const std::string& name, const std::vector<hsize_t>& dims, H5::DataType type, const void* data) { if (exists(name)) { H5::DataSet dataset = file_->openDataSet(name.c_str()); H5::DataSpace dataspace = dataset.getSpace(); Loading @@ -127,15 +127,34 @@ void HDF5Writer::write(const std::string& name, const std::vector<hsize_t>& dims } dataset.write(data, type, dataspace, H5P_DEFAULT); return dataset; } else { H5::DataSpace dataspace(dims.size(), dims.data()); H5::DataSet dataset(file_->createDataSet(name.c_str(), type, dataspace)); dataset.write(data, type, dataspace, H5P_DEFAULT); return dataset; } } void HDF5Writer::addAttribute(const H5::DataSet& set, const std::string& name, const std::vector<hsize_t>& size, H5::DataType type, const void* data) { if (set.attrExists(name)) { return; } H5::DataSpace space(size.size(), size.data()); auto attribute = set.createAttribute(name, type, space); attribute.write(type, data); } void HDF5Writer::addAttribute(const H5::DataSet& set, const std::string& name, const std::string& value) { H5::StrType str_type(H5::PredType::C_S1, value.size()); addAttribute(set, name, std::vector<hsize_t>{1}, str_type, value.c_str()); } bool HDF5Writer::exists(const std::string& name) const { auto code = H5Gget_objinfo(file_id_, name.c_str(), 0, NULL); return code == 0; Loading