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

adding test program for single measurement out. reverse Mfunc sign

parent 6ac537fc
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ public:

  void logPerConfigurationGreensFunction(const SpGreensFunction&) const;

  void logPerConfigurationMFunction(const SpGreensFunction&) const;
  void logPerConfigurationMFunction(const SpGreensFunction&, const int sign) const;

  void measure();

@@ -156,17 +156,22 @@ void StdThreadQmciAccumulator<QmciAccumulator, SpGreensFunction>::measure() {

template <class QmciAccumulator, class SpGreensFunction>
void StdThreadQmciAccumulator<QmciAccumulator, SpGreensFunction>::logPerConfigurationMFunction(
    const SpGreensFunction& mfunc) const {
    const SpGreensFunction& mfunc, const int sign) 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)) {
      const std::string stamp_name = "r_" + std::to_string(concurrency_id_) + "_meas_" +
                                     std::to_string(meas_id_) + "_w_" +
                                     std::to_string(walker_thread_id_);
      // Normally we /= the sign but here it is going to be strictly +/- 1 so the
      // faster operation can be used.
      auto signFreeMFunc = mfunc;
      signFreeMFunc *= -sign;
      writer_->lock();
      writer_->open_group("STQW_Configurations");
      writer_->open_group(stamp_name);
      writer_->execute("MFunction", mfunc);
      writer_->execute("MFunction", signFreeMFunc);
      writer_->execute("sign", sign);
      writer_->close_group();
      writer_->close_group();
      writer_->unlock();
+7 −2
Original line number Diff line number Diff line
@@ -78,10 +78,15 @@ public:
    const int sign;
  };

  /** gets the MFunction which for CT-INT and CT-AUX is M_r_w
   *  we also need the sign since the MFunction is accumulated
   *  with as a product of fval and sign
   */
  MFuncAndSign getSingleMFunc(StdThreadAccumulatorType& accumulator) const {
    const MFunction& mfunc(accumulator.get_single_measurement_sign_times_MFunction());
      return {mfunc, accumulator.get_sign()};
  };

  auto transformMFunction(const MFuncAndSign& mfs) const;
  auto computeSingleMeasurement_G_k_w(const SpGreensFunction& M_k_w);

@@ -471,7 +476,7 @@ void StdThreadQmciClusterSolver<QmciSolver>::startAccumulator(int id, const Para
          auto M_k_w = transformMFunction(mfs);
          auto single_meas_G_k_w = computeSingleMeasurement_G_k_w(M_k_w);
          if(parameters.per_measurement_MFunction())
            accumulator_obj.logPerConfigurationMFunction(M_k_w);
            accumulator_obj.logPerConfigurationMFunction(M_k_w, mfs.sign);
          accumulator_obj.logPerConfigurationGreensFunction(single_meas_G_k_w);
          accumulator_obj.clearSingleMeasurement();
        }
@@ -542,7 +547,7 @@ void StdThreadQmciClusterSolver<QmciSolver>::startWalkerAndAccumulator(int id, c
          auto M_k_w = transformMFunction(mfs);
          auto single_meas_G_k_w = computeSingleMeasurement_G_k_w(M_k_w);
          if(parameters.per_measurement_MFunction())
            accumulator_obj.logPerConfigurationMFunction(M_k_w);
            accumulator_obj.logPerConfigurationMFunction(M_k_w, mfs.sign);
          accumulator_obj.logPerConfigurationGreensFunction(single_meas_G_k_w);
          accumulator_obj.clearSingleMeasurement();
        }
+32 −7
Original line number Diff line number Diff line
@@ -44,13 +44,14 @@ using RngType = dca::math::random::StdRandomWrapper<std::mt19937_64>;
using Lattice = dca::phys::models::square_lattice<dca::phys::domains::D4>;
using Model = dca::phys::models::TightBindingModel<Lattice>;
using StdThreading = dca::parallel::stdthread;
using Parameters = dca::phys::params::Parameters<TestConcurrency, StdThreading, dca::profiling::NullProfiler,
using Parameters =
    dca::phys::params::Parameters<TestConcurrency, StdThreading, dca::profiling::NullProfiler,
                                  Model, RngType, dca::ClusterSolverId::CT_INT>;
using Data = dca::phys::DcaData<Parameters>;
using BaseSolver = dca::phys::solver::CtintClusterSolver<dca::linalg::CPU, Parameters>;
using QmcSolver = dca::phys::solver::StdThreadQmciClusterSolver<BaseSolver>;

void performTest(const std::string& input, const std::string& baseline) {
void performBaselineTest(const std::string& input, const std::string& baseline) {
  static bool update_model = true;

  TestConcurrency concurrency(0, nullptr);
@@ -105,11 +106,35 @@ void performTest(const std::string& input, const std::string& baseline) {
}

TEST(PosixCtintClusterSolverTest, NonShared) {
  performTest("stdthread_ctint_test_nonshared_input.json",
  performBaselineTest("stdthread_ctint_test_nonshared_input.json",
                      "stdthread_ctint_test_nonshared_baseline.hdf5");
}

TEST(PosixCtintClusterSolverTest, Shared) {
  performTest("stdthread_ctint_test_shared_input.json",
  performBaselineTest("stdthread_ctint_test_shared_input.json",
                      "stdthread_ctint_test_shared_baseline.hdf5");
}

TEST(PosixCtintClusterSolverTest, PerMeasurementIO) {
  static bool update_model = true;

  TestConcurrency concurrency(0, nullptr);

  Parameters parameters(dca::util::GitVersion::string(), concurrency);
  parameters.read_input_and_broadcast<dca::io::JSONReader>(
      input_dir + "stdthread_ctint_test_per_sample_output.json");
  if (update_model) {
    parameters.update_model();
    parameters.update_domains();
  }
  update_model = false;

  // Initialize data with G0 computation.
  Data data(parameters);
  data.initialize();

  // Do one integration step.
  QmcSolver qmc_solver(parameters, data, nullptr);
  qmc_solver.initialize(0);
  qmc_solver.integrate();
}
+64 −0
Original line number Diff line number Diff line
{
	"output" :
	{
            "directory": "./",
            "output-format": "ADIOS2",
            "filename-dca": "single_meas_G.bp",
            "dump-lattice-self-energy": true,
            "dump-cluster-Greens-functions" : true
        },
        "physics": {
                "beta"                      :  2,
                "chemical-potential"        : 0
        },

        "single-band-Hubbard-model":
        {
                "t"       : 1,
                "U"       : 5
        },

        "domains": {
                "real-space-grids": {
                        "cluster": [[2, 0],
                                [0, 2]]
                },

                "imaginary-time": {
                        "sp-time-intervals": 512
                },

                "imaginary-frequency": {
                        "sp-fermionic-frequencies": 512,
                        "four-point-fermionic-frequencies": 8
                }
        },

        "CT-INT" : {
                "initial-configuration-size" :5,
                "alpha-dd-pos" : 0.501
        },

        "DCA": {
                "iterations": 1,
                "self-energy-mixing-factor": 1.,
                "interacting-orbitals": [0]
        },

        "Monte-Carlo-integration" :
        {
                "warm-up-sweeps"         : 100,
                "sweeps-per-measurement" : 1,
                "measurements"           : 400,

                "threaded-solver" : {
                        "walkers": 1,
                        "accumulators": 1,
                        "shared-walk-and-accumulation-thread": true,
                        "fix-meas-per-walker": true
                },
                "stamping-period" : 1,
                "per-measurement-MFunction" : true,
                "seed" : 0
        }
}