Commit db7edc37 authored by gbalduzz's avatar gbalduzz
Browse files

Store name and domain sizes as attribute.

parent 550ab08c
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -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) {
@@ -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;
}
+35 −28
Original line number Diff line number Diff line
@@ -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_;

@@ -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>
@@ -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>
@@ -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>
@@ -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>
+21 −2
Original line number Diff line number Diff line
@@ -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();
@@ -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;