Loading include/dca/phys/dca_step/cluster_solver/stdthread_qmci/stdthread_qmci_accumulator.hpp +8 −3 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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(); Loading include/dca/phys/dca_step/cluster_solver/stdthread_qmci/stdthread_qmci_cluster_solver.hpp +7 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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(); } Loading Loading @@ -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(); } Loading test/integration/cluster_solver/stdthread_qmci/stdthread_ctint_cluster_solver_test.cpp +32 −7 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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(); } test/integration/cluster_solver/stdthread_qmci/stdthread_ctint_test_per_sample_output.json 0 → 100644 +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 } } Loading
include/dca/phys/dca_step/cluster_solver/stdthread_qmci/stdthread_qmci_accumulator.hpp +8 −3 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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(); Loading
include/dca/phys/dca_step/cluster_solver/stdthread_qmci/stdthread_qmci_cluster_solver.hpp +7 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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(); } Loading Loading @@ -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(); } Loading
test/integration/cluster_solver/stdthread_qmci/stdthread_ctint_cluster_solver_test.cpp +32 −7 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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(); }
test/integration/cluster_solver/stdthread_qmci/stdthread_ctint_test_per_sample_output.json 0 → 100644 +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 } }