TRIQS/triqs_ctint 4.0.0
A TRIQS application
Loading...
Searching...
No Matches
chi2_tau_impl.hpp
1// Copyright (c) 2018--present, The Simons Foundation
2// This file is part of TRIQS/ctint and is licensed under the terms of GPLv3 or later.
3// SPDX-License-Identifier: GPL-3.0-or-later
4// See LICENSE in the root of this distribution for details.
5
6#include "./chi2_tau.hpp"
7
8using namespace triqs::utility;
9
10namespace triqs_ctint::measures {
11
12 template <Chan_t Chan>
13 chi2_tau<Chan>::chi2_tau(params_t const &params_, qmc_config_t &qmc_config_, container_set *results)
14 : params(params_), qmc_config(qmc_config_), tau_mesh{params_.beta, Boson, params_.n_tau_chi2} {
15
16 // Init measurement container and capture view
17 if (Chan == Chan_t::PP) {
18 results->chi2pp_tau = make_block2_gf(tau_mesh, params.gf_struct);
19 chi2_tau_.rebind(results->chi2pp_tau.value());
20 } else if (Chan == Chan_t::PH) {
21 results->chi2ph_tau = make_block2_gf(tau_mesh, params.gf_struct);
22 chi2_tau_.rebind(results->chi2ph_tau.value());
23 }
24 chi2_tau_() = 0;
25 }
26
27 template <Chan_t Chan> void chi2_tau<Chan>::accumulate(mc_weight_t sign) {
28 // Accumulate sign
29 Z += sign;
30
31 // Calculate chi2ph
32 for (int bl1 : range(params.n_blocks()))
33 for (int bl2 : range(params.n_blocks())) {
34
35 auto &det1 = qmc_config.dets[bl1];
36 auto &det2 = qmc_config.dets[bl2];
37 auto &chi2_tau = chi2_tau_(bl1, bl2);
38 int bl1_size = chi2_tau.target_shape()[0];
39 int bl2_size = chi2_tau.target_shape()[2];
40
41 for (int a : range(bl1_size))
42 for (int b : range(bl1_size))
43 for (int c : range(bl2_size))
44 for (int d : range(bl2_size))
45 for (auto tau : tau_mesh) {
46
47 cdag_t cdag_a, cdag_c;
48 c_t c_b, c_d;
49
50 auto tau_point = make_tau_t(double(tau));
51 auto taup_point = tau_point;
52
53 // Time-Ordering
54 tau_point.n += 3; // tau -> tau^{+++}
55 taup_point.n += 2; // taup -> tau^{++}
56
57 if (tau.index() == params.n_tau_chi2 - 1) {
58 tau_point = tau_t::get_beta_minus();
59 taup_point = tau_t::get_beta_minus_minus();
60 }
61
62 if constexpr (Chan == Chan_t::PP) { // Particle-particle channel
63
64 cdag_a = cdag_t{tau_point, a};
65 c_b = c_t{tau_t::get_zero_plus(), b};
66 cdag_c = cdag_t{taup_point, c};
67 c_d = c_t{tau_t::get_zero(), d};
68
69 } else if constexpr (Chan == Chan_t::PH) { // Particle-hole channel
70
71 cdag_a = cdag_t{tau_point, a};
72 c_b = c_t{taup_point, b};
73 cdag_c = cdag_t{tau_t::get_zero_plus(), c};
74 c_d = c_t{tau_t::get_zero(), d};
75 }
76
77 if (bl1 == bl2)
78 chi2_tau[tau](a, b, c, d) += sign * det1.try_insert2(0, 1, 0, 1, c_b, c_d, cdag_a, cdag_c);
79 else
80 chi2_tau[tau](a, b, c, d) += sign * det1.try_insert(0, 0, c_b, cdag_a) * det2.try_insert(0, 0, c_d, cdag_c);
81
82 det1.reject_last_try();
83 det2.reject_last_try();
84 }
85 }
86 }
87
88 template <Chan_t Chan> void chi2_tau<Chan>::collect_results(mpi::communicator const &comm) {
89 // Collect results and normalize
90 Z = mpi::all_reduce(Z, comm);
91 chi2_tau_ = mpi::all_reduce(chi2_tau_, comm);
92 chi2_tau_ = chi2_tau_ / Z;
93 }
94
95} // namespace triqs_ctint::measures
void accumulate(mc_weight_t sign)
Accumulate M_tau using binning.
void collect_results(mpi::communicator const &comm)
Collect results and normalize.
static constexpr tau_t get_zero()
Return \tau = 0.
Definition vertex.hpp:48
static constexpr tau_t get_beta_minus_minus()
Return \tau = beta^{–} = \beta - 2*\delta.
Definition vertex.hpp:63
static constexpr tau_t get_beta_minus()
Return \tau = beta^{-} = \beta - \delta.
Definition vertex.hpp:60
static constexpr tau_t get_zero_plus()
Return \tau = 0^{+} = 0 + \delta.
Definition vertex.hpp:51