Commit f249b1bc authored by gbalduzz's avatar gbalduzz
Browse files

properly solve conflicts between config store and read/write directories.

parent 1d466648
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -202,6 +202,7 @@ template <typename ParametersType, typename DcaDataType, typename MCIntegratorTy
void DcaLoop<ParametersType, DcaDataType, MCIntegratorType>::readInitialStatus(
    const std::string& filename) {
  io::Buffer buffer;
  bool buffer_read = false;

  if (concurrency_.id() == concurrency_.first()) {
    io::HDF5Reader reader;
@@ -219,16 +220,21 @@ void DcaLoop<ParametersType, DcaDataType, MCIntegratorType>::readInitialStatus(
    reader.execute(data_.Sigma);
    reader.close_group();

    if (parameters_.store_configuration()) {
      reader.open_group("Configurations");
    reader.execute("sample", buffer);
      buffer_read = reader.execute("sample", buffer);
      reader.close_group();
    }
  }

  concurrency_.broadcast(parameters_.get_chemical_potential());
  concurrency_.broadcast(data_.Sigma);
  concurrency_.broadcast(buffer);

  concurrency_.broadcast(buffer_read);
  if (buffer_read) {
    concurrency_.broadcast(buffer);
    monte_carlo_integrator_.setSampleConfiguration(buffer);
  }

  perform_lattice_mapping();
}
@@ -429,7 +435,7 @@ void DcaLoop<ParametersType, DcaDataType, MCIntegratorType>::logSelfEnergy(int i
  }
}

}  // namespace dca
}  // namespace phys
}  // namespace dca

#endif  // DCA_PHYS_DCA_LOOP_DCA_LOOP_HPP
+32 −31
Original line number Diff line number Diff line
@@ -80,6 +80,8 @@ private:

  void printIntegrationMetadata() const;

  void finalizeWalker(Walker& walker, int walker_id);

private:
  using BaseClass::accumulator_;
  using BaseClass::concurrency_;
@@ -112,6 +114,7 @@ private:
  std::shared_ptr<io::HDF5Writer> writer_;

  bool last_iteration_ = false;
  bool read_configuration_ = false;
  unsigned measurements_ = 0;
};

@@ -131,6 +134,7 @@ StdThreadQmciClusterSolver<QmciSolver>::StdThreadQmciClusterSolver(

      accumulators_queue_(),

      config_dump_(nr_walkers_),
      autocorrelation_data_(parameters_, 0),

      writer_(writer) {
@@ -139,9 +143,6 @@ StdThreadQmciClusterSolver<QmciSolver>::StdThreadQmciClusterSolver(
        "Both the number of walkers and the number of accumulators must be at least 1.");
  }

  if (parameters_.store_configuration())
    config_dump_.resize(nr_walkers_);

  for (int i = 0; i < nr_walkers_; ++i) {
    rng_vector_.emplace_back(concurrency_.id(), concurrency_.number_of_processors(),
                             parameters_.get_seed());
@@ -156,12 +157,14 @@ StdThreadQmciClusterSolver<QmciSolver>::StdThreadQmciClusterSolver(

template <class QmciSolver>
void StdThreadQmciClusterSolver<QmciSolver>::setSampleConfiguration(const io::Buffer& buff) {
  if (parameters_.store_configuration())
  if (!parameters_.store_configuration())
    return;

  config_dump_.resize(nr_walkers_);
  for (auto& x : config_dump_)
    x = buff;

  read_configuration_ = true;
}

template <class QmciSolver>
@@ -228,11 +231,14 @@ void StdThreadQmciClusterSolver<QmciSolver>::integrate() {

  print_metadata();

  if (writer_ && config_dump_.size()) {  // write one sample configuration.
  if (parameters_.store_configuration()) {
    if (writer_) {  // write one sample configuration.
      writer_->open_group("Configurations");
      writer_->rewrite("sample", config_dump_[0]);
      writer_->close_group();
    }
    read_configuration_ = true;
  }

  QmciSolver::accumulator_.finalize();
}
@@ -320,18 +326,7 @@ void StdThreadQmciClusterSolver<QmciSolver>::startWalker(int id) {
    }
  }

  if (id == 0 && concurrency_.id() == concurrency_.first()) {
    std::cout << "\n\t\t QMCI ends\n" << std::endl;
    walker.printSummary();
  }

  if (parameters_.store_configuration() || (parameters_.get_directory_config_write() != "" &&
                                            dca_iteration_ == parameters_.get_dca_iterations() - 1))
    config_dump_[walker_index] = walker.dumpConfig();

  walker_fingerprints_[walker_index] = walker.deviceFingerprint();

  autocorrelation_data_ += walker;
  finalizeWalker(walker, walker_index);

  Profiler::stop_threading(id);

@@ -345,9 +340,8 @@ void StdThreadQmciClusterSolver<QmciSolver>::initializeAndWarmUp(Walker& walker,
  Profiler profiler("thermalization", "stdthread-MC-walker", __LINE__, id);

  // Read previous configuration.
  if (config_dump_[walker_id].size()) {
  if (read_configuration_) {
    walker.readConfig(config_dump_[walker_id]);
    config_dump_[walker_id].setg(0);  // Ready to read again if it is not overwritten.
  }

  walker.initialize(dca_iteration_);
@@ -492,14 +486,7 @@ void StdThreadQmciClusterSolver<QmciSolver>::startWalkerAndAccumulator(int id) {
    accumulator_obj.sumTo(QmciSolver::accumulator_);
  }

  if (parameters_.store_configuration() || (parameters_.get_directory_config_write() != "" &&
                                            dca_iteration_ == parameters_.get_dca_iterations() - 1))
    config_dump_[id] = walker.dumpConfig();

  walker_fingerprints_[id] = walker.deviceFingerprint();
  accum_fingerprints_[id] = accumulator_obj.deviceFingerprint();

  autocorrelation_data_ += walker;
  finalizeWalker(walker, id);

  Profiler::stop_threading(id);

@@ -507,6 +494,18 @@ void StdThreadQmciClusterSolver<QmciSolver>::startWalkerAndAccumulator(int id) {
    throw(*current_exception);
}

template <class QmciSolver>
void StdThreadQmciClusterSolver<QmciSolver>::finalizeWalker(Walker& walker, int walker_id) {
  config_dump_[walker_id] = walker.dumpConfig();
  walker_fingerprints_[walker_id] = walker.deviceFingerprint();
  autocorrelation_data_ += walker;

  if (walker_id == 0 && concurrency_.id() == concurrency_.first()) {
    std::cout << "\n\t\t QMCI ends\n" << std::endl;
    walker.printSummary();
  }
}

template <class QmciSolver>
void StdThreadQmciClusterSolver<QmciSolver>::writeConfigurations() const {
  if (parameters_.get_directory_config_write() == "")
@@ -539,6 +538,8 @@ void StdThreadQmciClusterSolver<QmciSolver>::readConfigurations() {
    reader.open_file(inp_name);
    for (int id = 0; id < config_dump_.size(); ++id)
      reader.execute("configuration_" + std::to_string(id), config_dump_[id]);

    read_configuration_ = true;
  }
  catch (std::exception& err) {
    std::cerr << err.what() << "\nCould not read the configuration.\n";
+6 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ public:
protected:
  // Resize vector arguments to have the same size as the number of iterations.
  void inline solveDcaIterationConflict(int iterations);
  void inline solveConfigReadConflict(bool read);

private:
  void generateRandomSeed() {
@@ -307,6 +308,11 @@ void MciParameters::solveDcaIterationConflict(int iterations) {
  solve_confilct(sweeps_per_measurement_);
}

void MciParameters::solveConfigReadConflict(bool read) {
  if(read)
    store_configuration_ = true;
}

}  // namespace params
}  // namespace phys
}  // namespace dca
+1 −0
Original line number Diff line number Diff line
@@ -393,6 +393,7 @@ void Parameters<Concurrency, Threading, Profiler, Model, RandomNumberGenerator,
  PhysicsParameters::readWrite(reader_or_writer);

  solveDcaIterationConflict(get_dca_iterations());
  solveConfigReadConflict(get_directory_config_read() != "");
}

template <typename Concurrency, typename Threading, typename Profiler, typename Model,