Commit 6e538796 authored by Doak, Peter W.'s avatar Doak, Peter W.
Browse files

can write most/all output with ADIOS2

parent 6a85459a
Loading
Loading
Loading
Loading
+26 −10
Original line number Diff line number Diff line
@@ -63,6 +63,9 @@ public:
  void open_group(const std::string& new_path);
  void close_group();

  void begin_step();
  void end_step();

  std::string get_path(const std::string& name = "");

  template <typename arbitrary_struct_t>
@@ -172,6 +175,9 @@ private:
  void write(const std::string& name, const std::vector<size_t>& size, const Scalar* data,
             const std::vector<size_t>& start, const std::vector<size_t>& count);

  template <typename T, typename... Args>
  void getVariable(const std::string& name, adios2::Variable<T>& var, const Args&... args);

  template <typename Scalar>
  void addAttribute(const std::string& set, const std::string& name,
                    const std::vector<size_t>& size, const Scalar* data);
@@ -193,6 +199,17 @@ private:
  std::vector<size_t> size_check_;
};

template <class CT>
template <typename T, typename... Args>
void ADIOS2Writer<CT>::getVariable(const std::string& name, adios2::Variable<T>& var,
                                   const Args&... args) {
  adios2::Variable<T> var_temp = io_.InquireVariable<T>(name);
  if (static_cast<bool>(var_temp) == false)
    var = io_.DefineVariable<T>(name, args...);
  else
    var = var_temp;
}

template <class CT>
template <typename arbitrary_struct_t>
void ADIOS2Writer<CT>::to_file(adios2::ADIOS& adios, const arbitrary_struct_t& arbitrary_struct,
@@ -220,7 +237,6 @@ void ADIOS2Writer<CT>::execute(const std::string& name, bool value) {
  write<int>(full_name, dims, &int_value);
}

  
template <class CT>
template <typename Scalar>
void ADIOS2Writer<CT>::execute(const std::string& name, const std::pair<Scalar, Scalar>& value) {
@@ -270,7 +286,7 @@ void ADIOS2Writer<CT>::execute(const std::string& name,
  adios2::Dims dims{nTotal};
  adios2::Variable<Scalar> vVecs;
  adios2::Dims start{0};
  vVecs = io_.DefineVariable<Scalar>(full_name, dims, start, dims);
  getVariable<Scalar>(full_name, vVecs, dims, start, dims);

  typename adios2::Variable<Scalar>::Span span = file_.Put(vVecs);
  size_t pos = 0;
@@ -296,7 +312,7 @@ void ADIOS2Writer<CT>::execute(const std::string& name,
  adios2::Dims dims{value.size(), n};
  adios2::Variable<Scalar> v;
  adios2::Dims start{0, 0};
  v = io_.DefineVariable<Scalar>(full_name, dims, start, dims);
  getVariable(full_name, v, dims, start, dims);

  typename adios2::Variable<Scalar>::Span span = file_.Put(v);

@@ -535,11 +551,11 @@ void ADIOS2Writer<CT>::write(const std::string& name, const std::vector<size_t>&
  size_t ndim = size.size();
  adios2::Variable<Scalar> v;
  if (ndim == 0) {
    v = io_.DefineVariable<Scalar>(name);
    getVariable<Scalar>(name, v);
  }
  else {
    std::vector<size_t> start(ndim, 0);
    v = io_.DefineVariable<Scalar>(name, size, start, size);
    getVariable<Scalar>(name, v, size, start, size);
  }
  file_.Put(v, data, adios2::Mode::Sync);
}
@@ -552,10 +568,10 @@ void ADIOS2Writer<CT>::write(const std::string& name, const std::vector<size_t>&
  size_t ndim = size.size();
  adios2::Variable<Scalar> v;
  if (ndim == 0) {
    v = io_.DefineVariable<Scalar>(name);
    getVariable<Scalar>(name, v);
  }
  else {
    v = io_.DefineVariable<Scalar>(name, size, start, count);
    getVariable<Scalar>(name, v, size, start, count);
  }
  file_.Put(v, data, adios2::Mode::Sync);
}
+3 −0
Original line number Diff line number Diff line
@@ -56,6 +56,9 @@ public:

  std::string get_path();

  void begin_step() {};
  void end_step() {};
  
  void erase(const std::string& name);

  template <typename arbitrary_struct_t>
+3 −0
Original line number Diff line number Diff line
@@ -44,6 +44,9 @@ public:
  // Precondition: the current group is not the root.
  void close_group();

  void begin_step() {};
  void end_step() {};

  constexpr static bool is_reader = false;
  constexpr static bool is_writer = true;

+31 −23
Original line number Diff line number Diff line
@@ -51,6 +51,14 @@ public:
  constexpr static bool is_reader = false;
  constexpr static bool is_writer = true;

  void begin_step() {
    std::visit([&](auto& var) { var.begin_step();}, writer_);
  }

  void end_step() {
    std::visit([&](auto& var) { var.end_step();}, writer_);
  }

  void open_file(const std::string& file_name, bool overwrite = true) {
    std::visit([&](auto& var) { var.open_file(file_name, overwrite); }, writer_);
  }
@@ -69,33 +77,33 @@ public:
  template <class... Args>
  void execute(const Args&... args) {
    // currently only the ADIOS2Writer supports parallel writes
#ifdef DCA_HAVE_ADIOS2
    if constexpr (std::is_same<decltype(writer_), ADIOS2Writer<Concurrency>>::value) {
      std::visit([&](auto& var) { var.execute(args...); }, writer_);
    }
    else {
#endif
// #ifdef DCA_HAVE_ADIOS2
//     if constexpr (std::is_same<decltype(writer_), ADIOS2Writer<Concurrency>>::value) {
//       std::visit([&](auto& var) { var.execute(args...); }, writer_);
//     }
//     else {
// #endif
      if (concurrency_.id() == concurrency_.first()) {
        std::visit([&](auto& var) { var.execute(args...); }, writer_);
      }
#ifdef DCA_HAVE_ADIOS2
    }
#endif
// #ifdef DCA_HAVE_ADIOS2
//     }
// #endif
  }

  template <class... Args>
  void rewrite(const std::string& name, const Args&... args) {
#ifdef DCA_HAVE_ADIOS2
    if constexpr (std::is_same<decltype(writer_), ADIOS2Writer<Concurrency>>::value) {
      std::visit(
          [&](auto& var) {
            var.erase(name);
            var.execute(name, args...);
          },
          writer_);
    }
    else {
#endif
// #ifdef DCA_HAVE_ADIOS2
//     if constexpr (std::is_same<decltype(writer_), ADIOS2Writer<Concurrency>>::value) {
//       std::visit(
//           [&](auto& var) {
//             var.erase(name);
//             var.execute(name, args...);
//           },
//           writer_);
//     }
//     else {
// #endif
      if (concurrency_.id() == concurrency_.first()) {
        std::visit(
            [&](auto& var) {
@@ -104,9 +112,9 @@ public:
            },
            writer_);
      }
#ifdef DCA_HAVE_ADIOS2
    }
#endif
// #ifdef DCA_HAVE_ADIOS2
//     }
// #endif
  }

  operator bool() const noexcept {
+1 −1
Original line number Diff line number Diff line
@@ -564,8 +564,8 @@ void DcaData<Parameters, DT>::initialize_G0() {

template <class Parameters, DistType DT>
void DcaData<Parameters, DT>::initializeSigma(const std::string& filename) {
  io::Reader reader(concurrency_, parameters_.get_output_format());
  if (concurrency_.id() == concurrency_.first()) {
    io::Reader reader(concurrency_, parameters_.get_output_format());
    reader.open_file(filename);

    if (parameters_.adjust_chemical_potential()) {
Loading