8namespace triqs_ctint::measures {
10 using triqs::utility::nfft_type_t;
12 M_iw::M_iw(params_t
const ¶ms_, qmc_config_t
const &qmc_config_, container_set *results)
13 : params(params_), qmc_config(qmc_config_), M_data(params_.n_blocks()) {
16 mesh::dlr_imfreq M_iw_mesh{params.beta, Fermion, params.dlr_wmax, params.dlr_eps,
true};
17 int64_t n_dlr_pts = M_iw_mesh.size();
20 results->M_iw_nfft = g_dlr_iw_t{M_iw_mesh, params.gf_struct};
21 M_iw_.rebind(results->M_iw_nfft.value());
25 target_mf.reserve(n_dlr_pts);
26 for (
auto w : M_iw_mesh) target_mf.push_back(w);
29 for (
int bl : range(params.n_blocks())) {
30 int bl_size = params.gf_struct[bl].second;
31 M_data(bl).resize(n_dlr_pts, bl_size, bl_size);
34 auto init_func = [&](int i, int j) {
35 return nfft_buf_t<1>{M_data(bl)(nda::range::all, i, j), target_mf, params.nfft_buf_size, nfft_type_t::type3, params.nfft_tol};
37 buf_vec.emplace_back(array_adapter{std::array{bl_size, bl_size}, init_func});
41 if (!results->M_hartree) {
42 results->M_hartree = make_block_vector<M_tau_scalar_t>(params.gf_struct);
43 for (auto &m : results->M_hartree.value()) M_hartree_.push_back(m);
52 for (
auto &m : M_data) m = 0;
55 for (
int b = 0; b < M_iw_.size(); ++b) {
57 foreach (qmc_config.dets[b], [&](c_t
const &c_i, cdag_t
const &cdag_j,
auto const &Ginv) {
59 if (c_i.tau == cdag_j.tau) {
60 if (!M_hartree_.empty()) M_hartree_[b](cdag_j.u, c_i.u) += Ginv * sign;
63 auto [s, dtau] = cyclic_difference(cdag_j.tau, c_i.tau);
66 auto &buf = buf_vec[b](cdag_j.u, c_i.u);
67 buf.push_back({dtau}, Ginv * s * sign);
73 for (
auto &buf_arr : buf_vec)
74 for (auto &buf : buf_arr) buf.flush();
77 for (
int bl : range(params.n_blocks())) {
78 int bl_size = params.gf_struct[bl].second;
79 auto &M_bl = M_iw_[bl];
81 for (auto mp : M_bl.mesh()) {
82 for (int i : range(bl_size))
83 for (int j : range(bl_size)) M_bl[mp](i, j) += M_data(bl)(idx, i, j);
91 Z = mpi::all_reduce(Z, comm);
92 M_iw_ = mpi::all_reduce(M_iw_, comm);
93 M_iw_ = M_iw_ / (-Z * params.beta);
96 for (
auto &m : M_hartree_) {
97 m = mpi::all_reduce(m, comm);
98 m = m / (-Z * params.beta);
void collect_results(mpi::communicator const &comm)
Collect results and normalize.
void accumulate(mc_weight_t sign)
Accumulate M_iw using nfft.