7#include "./G_F_tau.hpp"
10namespace triqs_ctseg::measures {
12 G_F_tau::G_F_tau(params_t
const &p, work_data_t
const &wdata, configuration_t
const &config, results_t &results)
13 : wdata{wdata}, config{config}, results{results} {
16 measure_F_tau = p.measure_F_tau and wdata.rot_inv;
17 gf_struct = p.gf_struct;
19 G_tau = block_gf<imtime>{triqs::mesh::imtime{beta, Fermion, p.n_tau_G}, p.gf_struct};
20 F_tau = block_gf<imtime>{triqs::mesh::imtime{beta, Fermion, p.n_tau_G}, p.gf_struct};
28 void G_F_tau::accumulate(
double s) {
30 LOG(
"\n =================== MEASURE G(tau) ================ \n");
34 for (
auto [bl_idx, det] : itertools::enumerate(wdata.dets)) {
36 auto &g = G_tau[bl_idx];
37 auto &f = F_tau[bl_idx];
38 for (
long id_y : range(N)) {
39 auto y = det.get_y(id_y);
41 if (measure_F_tau) f_fact = fprefactor(bl_idx, y);
42 for (
long id_x : range(N)) {
43 auto x = det.get_x(id_x);
44 auto Minv = det.inverse_matrix(id_y, id_x);
46 auto val = (y.first >= x.first ? s : -s) * Minv;
47 auto dtau = double(y.first - x.first);
48 g[closest_mesh_pt(dtau)](y.second, x.second) += val;
49 if (measure_F_tau) f[closest_mesh_pt(dtau)](y.second, x.second) += val * f_fact;
57 void G_F_tau::collect_results(mpi::communicator
const &c) {
59 Z = mpi::all_reduce(Z, c);
61 G_tau = mpi::all_reduce(G_tau, c);
62 G_tau = G_tau / (-beta * Z * G_tau[0].mesh().delta());
65 for (
auto &g : G_tau) {
67 g[g.mesh().size() - 1] *= 2;
70 results.G_tau = std::move(G_tau);
73 F_tau = mpi::all_reduce(F_tau, c);
74 F_tau = F_tau / (-beta * Z * F_tau[0].mesh().delta());
76 for (
auto &f : F_tau) {
78 f[f.mesh().size() - 1] *= 2;
80 results.F_tau = std::move(F_tau);
86 double G_F_tau::fprefactor(
long const &block, std::pair<tau_t, long>
const &y) {
87 int color = wdata.block_to_color(block, y.second);
89 for (
auto const &[c, sl] : itertools::enumerate(config.seglists)) {
90 auto ntau = n_tau(y.first, sl);
91 if (c != color) I_tau += wdata.U(c, color) * ntau;
93 I_tau -= K_overlap(sl, y.first,
false, wdata.Kprime, c, color);
94 if (c == color) I_tau -= 2 * real(wdata.Kprime(0)(c, c));
96 if (wdata.has_Jperp) {
97 I_tau -= 4 * real(wdata.Kprime_spin(0)(c, color)) * ntau;
98 I_tau -= 2 * K_overlap(sl, y.first,
false, wdata.Kprime_spin, c, color);