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

can write MFunction but its full of zeros

parent 744c2418
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -248,7 +248,6 @@ template <class Parameters, typename Real>
const typename SpAccumulator<Parameters, linalg::CPU, Real>::MFunction& SpAccumulator<Parameters, linalg::CPU, Real>::get_single_measurement_sign_times_MFunction() {
  single_measurement_M_r_w_.reset(new MFunction("single_function_M_r_w"));
  finalizeFunction(*single_measurement_M_r_t_, *single_measurement_M_r_w_);

  return *single_measurement_M_r_w_;
}

+1 −1
Original line number Diff line number Diff line
@@ -224,8 +224,8 @@ void SpAccumulator<Parameters, linalg::GPU, Real>::finalizeFunction(std::array<N
template <class Parameters, typename Real>
const auto& SpAccumulator<Parameters, linalg::GPU, Real>::get_single_measurement_sign_times_M_r_w() {
  single_measurement_M_r_w_.reset(new MFunction("single_function_M_r_w"));
  single_measurement_M_r_t_.synchronizeCopy();
  finalizeFunction(single_measurement_M_r_t_, *single_measurement_M_r_w_);

  return *single_measurement_M_r_w_;
}

+22 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ public:
  void waitForQmciWalker();

  void logPerConfigurationGreensFunction(const SpGreensFunction&) const;
  void logPerConfigurationMFunction(const MFunction&) const;

  void measure();

@@ -152,6 +153,27 @@ void StdThreadQmciAccumulator<QmciAccumulator, SpGreensFunction>::measure() {
  QmciAccumulator::measure();
}

template <class QmciAccumulator, class MFunction>
void StdThreadQmciAccumulator<QmciAccumulator, MFunction>::logPerConfigurationMFunction(
    const MFunction& mfunc) const {
  const bool print_to_log = writer_ && static_cast<bool>(*writer_);  // File exists and it is open.
  if (print_to_log && stamping_period_ && (meas_id_ % stamping_period_) == 0) {
    if (writer_ && (writer_->isADIOS2() || concurrency_id_ == 0)) {
      // Induce copy for GPU MFunction
      const std::string stamp_name = "r_" + std::to_string(concurrency_id_) + "_meas_" +
                                     std::to_string(meas_id_) + "_w_" +
                                     std::to_string(walker_thread_id_);
      writer_->lock();
      writer_->open_group("STQW_Configurations");
      writer_->open_group(stamp_name);
      writer_->execute("MFunction", mfunc);
      writer_->close_group();
      writer_->close_group();
      writer_->unlock();
    }
  }
}

template <class QmciAccumulator, class SpGreensFunction>
void StdThreadQmciAccumulator<QmciAccumulator, SpGreensFunction>::logPerConfigurationGreensFunction(
    const SpGreensFunction& spf) const {
+10 −6
Original line number Diff line number Diff line
@@ -86,8 +86,8 @@ public:

private:
  void startWalker(int id);
  void startAccumulator(int id);
  void startWalkerAndAccumulator(int id);
  void startAccumulator(int id, const Parameters& parameters);
  void startWalkerAndAccumulator(int id, const Parameters& parameters);

  void initializeAndWarmUp(Walker& walker, int id, int walker_id);

@@ -216,9 +216,9 @@ void StdThreadQmciClusterSolver<QmciSolver>::integrate() {
    if (thread_task_handler_.getTask(i) == "walker")
      futures.emplace_back(pool.enqueue(&ThisType::startWalker, this, i));
    else if (thread_task_handler_.getTask(i) == "accumulator")
      futures.emplace_back(pool.enqueue(&ThisType::startAccumulator, this, i));
      futures.emplace_back(pool.enqueue(&ThisType::startAccumulator, this, i, parameters_));
    else if (thread_task_handler_.getTask(i) == "walker and accumulator")
      futures.emplace_back(pool.enqueue(&ThisType::startWalkerAndAccumulator, this, i));
      futures.emplace_back(pool.enqueue(&ThisType::startWalkerAndAccumulator, this, i, parameters_));
    else
      throw std::logic_error("Thread task is undefined.");
  }
@@ -434,7 +434,7 @@ auto StdThreadQmciClusterSolver<QmciSolver>::computeSingleMeasurement_G_k_w(cons
}

template <class QmciSolver>
void StdThreadQmciClusterSolver<QmciSolver>::startAccumulator(int id) {
void StdThreadQmciClusterSolver<QmciSolver>::startAccumulator(int id, const Parameters& parameters) {
  Profiler::start_threading(id);

  auto accumulator_log = last_iteration_ ? BaseClass::writer_ : nullptr;
@@ -465,6 +465,8 @@ void StdThreadQmciClusterSolver<QmciSolver>::startAccumulator(int id) {
        if (last_iteration_) {
          auto [M_r_w, sign] = getSingleMFunc(accumulator_obj);
          auto single_meas_G_k_w = computeSingleMeasurement_G_k_w(M_r_w, sign);
          if(parameters.per_measurement_MFunction())
            accumulator_obj.logPerConfigurationMFunction(M_r_w);
          accumulator_obj.logPerConfigurationGreensFunction(single_meas_G_k_w);
          accumulator_obj.clearSingleMeasurement();
        }
@@ -499,7 +501,7 @@ void StdThreadQmciClusterSolver<QmciSolver>::startAccumulator(int id) {
}

template <class QmciSolver>
void StdThreadQmciClusterSolver<QmciSolver>::startWalkerAndAccumulator(int id) {
void StdThreadQmciClusterSolver<QmciSolver>::startWalkerAndAccumulator(int id, const Parameters& parameters) {
  Profiler::start_threading(id);

  // Create and warm a walker.
@@ -533,6 +535,8 @@ void StdThreadQmciClusterSolver<QmciSolver>::startWalkerAndAccumulator(int id) {
        if (last_iteration_) {
          auto [M_r_w, sign] = getSingleMFunc(accumulator_obj);
          auto single_meas_G_k_w = computeSingleMeasurement_G_k_w(M_r_w, sign);
          if(parameters.per_measurement_MFunction())
            accumulator_obj.logPerConfigurationMFunction(M_r_w);
          accumulator_obj.logPerConfigurationGreensFunction(single_meas_G_k_w);
          accumulator_obj.clearSingleMeasurement();
        }
+13 −5
Original line number Diff line number Diff line
@@ -78,7 +78,6 @@ public:
    std::fill(measurements_.begin(), measurements_.end(), measurements);
  }

  
  int get_walkers() const {
    return walkers_;
  }
@@ -127,6 +126,9 @@ public:
  int stamping_period() const {
    return stamping_period_;
  }
  bool per_measurement_MFunction() const {
    return per_measurement_MFunction_;
  }

protected:
  // Resize vector arguments to have the same size as the number of iterations.
@@ -159,6 +161,7 @@ private:
  bool store_configuration_;
  DistType g4_distribution_;
  int stamping_period_ = 0;
  bool per_measurement_MFunction_ = false;
};

template <typename Concurrency>
@@ -182,7 +185,7 @@ int MciParameters::getBufferSize(const Concurrency& concurrency) const {
  buffer_size += concurrency.get_buffer_size(store_configuration_);
  buffer_size += concurrency.get_buffer_size(g4_distribution_);
  buffer_size += concurrency.get_buffer_size(stamping_period_);

  buffer_size += concurrency.get_buffer_size(per_measurement_MFunction_);
  return buffer_size;
}

@@ -206,6 +209,7 @@ void MciParameters::pack(const Concurrency& concurrency, char* buffer, int buffe
  concurrency.pack(buffer, buffer_size, position, store_configuration_);
  concurrency.pack(buffer, buffer_size, position, g4_distribution_);
  concurrency.pack(buffer, buffer_size, position, stamping_period_);
  concurrency.pack(buffer, buffer_size, position, per_measurement_MFunction_);
}

template <typename Concurrency>
@@ -228,6 +232,7 @@ void MciParameters::unpack(const Concurrency& concurrency, char* buffer, int buf
  concurrency.unpack(buffer, buffer_size, position, store_configuration_);
  concurrency.unpack(buffer, buffer_size, position, g4_distribution_);
  concurrency.unpack(buffer, buffer_size, position, stamping_period_);
  concurrency.unpack(buffer, buffer_size, position, per_measurement_MFunction_);
}

template <typename ReaderOrWriter>
@@ -283,6 +288,9 @@ void MciParameters::readWrite(ReaderOrWriter& reader_or_writer) {
  reader_or_writer.execute("time-correlation-window", time_correlation_window_);
  reader_or_writer.execute("compute-G-correlation", compute_G_correlation_);
  reader_or_writer.execute("stamping-period", stamping_period_);
  reader_or_writer.execute("per-measurement-MFunction", per_measurement_MFunction_);
  reader_or_writer.execute("compute-G-correlation", compute_G_correlation_);

  reader_or_writer.execute("store-configuration", store_configuration_);

  // Read arguments for threaded solver.