24namespace triqs_cthyb {
26 using namespace triqs::gfs;
27 using namespace triqs::mesh;
29 measure_G_l::measure_G_l(std::optional<G_l_t> &G_l_opt, qmc_data
const &data,
int n_l, gf_struct_t
const &gf_struct) : data(data), average_sign(0) {
30 G_l_opt = block_gf<legendre>{{data.config.beta(), Fermion, n_l}, gf_struct};
35 void measure_G_l::accumulate(mc_weight_t s) {
36 s *= data.atomic_reweighting;
39 double beta = data.config.beta();
40 auto Tn = triqs::utility::legendre_generator();
42 for (
auto block_idx : range(G_l.size())) {
44 foreach (data.dets[block_idx], [
this, s, block_idx, beta, &Tn](op_t
const &x, op_t
const &y, det_scalar_t M) {
46 double poly_arg = 2 * double(y.first - x.first) / beta - 1.0;
49 auto val = (y.first >= x.first ? s : -s) * M;
51 for (auto l : G_l[block_idx].mesh()) {
53 this->G_l[block_idx][l](y.second, x.second) += val * Tn.next();
60 void measure_G_l::collect_results(mpi::communicator
const &c) {
62 average_sign = mpi::all_reduce(average_sign, c);
63 G_l = mpi::all_reduce(G_l, c);
65 double beta = data.config.beta();
67 for (
auto &G_l_block : G_l) {
68 for (
auto l : G_l_block.mesh()) {
70 G_l_block[l] *= -(sqrt(2.0 * l.index() + 1.0) / (real(average_sign) * beta));
72 matrix<double> id(G_l_block.target_shape());
74 enforce_discontinuity(G_l_block,
id);