24namespace triqs_cthyb {
26 using namespace triqs::gfs;
27 using namespace triqs::mesh;
29 measure_G_tau::measure_G_tau(qmc_data
const &data,
int n_tau, gf_struct_t
const &gf_struct,
container_set_t &results)
30 : data(data), average_sign(0) {
31 results.G_tau_accum = block_gf<imtime, G_target_t>({data.config.beta(), Fermion, n_tau}, gf_struct);
32 G_tau.rebind(*results.G_tau_accum);
35 results.asymmetry_G_tau = block_gf{G_tau};
36 asymmetry_G_tau.rebind(*results.asymmetry_G_tau);
39 void measure_G_tau::accumulate(mc_weight_t s) {
40 s *= data.atomic_reweighting;
43 for (
auto block_idx : range(G_tau.size())) {
44 foreach (data.dets[block_idx], [
this, s, block_idx](op_t
const &x, op_t
const &y, det_scalar_t M) {
46 auto val = (y.first >= x.first ? s : -s) * M;
47 double dtau = double(y.first - x.first);
48 this->G_tau[block_idx][closest_mesh_pt(dtau)](y.second, x.second) += val;
54 void measure_G_tau::collect_results(mpi::communicator
const &c) {
56 G_tau = mpi::all_reduce(G_tau, c);
57 average_sign = mpi::all_reduce(average_sign, c);
59 for (
auto &G_tau_block : G_tau) {
60 double beta = G_tau_block.mesh().beta();
61 G_tau_block /= -real(average_sign) * beta * G_tau_block.mesh().delta();
64 int last = G_tau_block.mesh().size() - 1;
66 G_tau_block[last] *= 2;
69 G_tau_block[0] = 0.5 * matrix_t(G_tau_block[0] - 1 - G_tau_block[last]);
70 G_tau_block[last] = -1 - G_tau_block[0];
75 asymmetry_G_tau = make_hermitian(G_tau) - G_tau;
76 G_tau = G_tau + asymmetry_G_tau;
Container for all results accumulated by the simulation.