6#include "./nn_nu_dlr.hpp"
8#include <triqs/mesh.hpp>
10namespace triqs_ctseg::measures {
12 nn_nu_dlr::nn_nu_dlr(params_t
const &p, work_data_t
const &wdata, configuration_t
const &config, results_t &results)
13 : wdata{wdata}, config{config}, results{results} {
17 dtau = p.beta / (ntau - 1);
18 n_color = config.n_color();
19 block_number = wdata.block_number;
20 index_in_block = wdata.index_in_block;
22 auto m = dlr_imfreq(p.beta, Boson, p.dlr_omega_max, p.dlr_epsilon);
23 q_nu_block = make_block2_gf<dlr_imfreq>(m, p.gf_struct);
24 q_nu = gf<dlr_imfreq>(m, {n_color, n_color});
30 void nn_nu_dlr::accumulate(
double s) {
32 LOG(
"\n =================== MEASURE n_n(i nu) ================ \n");
37 auto ksi1 = [&](
double a,
double b, matsubara_freq
const &nu) -> dcomplex {
39 if (nu.n == 0)
return (b - a);
41 return (std::exp(inu * b) - std::exp(inu * a)) / inu;
45 auto ksi = [&](segment_t
const &seg, matsubara_freq
const &nu) -> dcomplex {
46 if (not is_cyclic(seg))
47 return ksi1(
double(seg.tau_cdag),
double(seg.tau_c), nu);
49 return ksi1(
double(seg.tau_cdag), beta, nu) + ksi1(0,
double(seg.tau_c), nu);
53 auto n_a_nu = [&](
long a, matsubara_freq
const &nu) -> dcomplex {
55 for (
auto const &seg : config.seglists[a]) sum += ksi(seg, nu);
60 auto R = nda::range(n_color);
61 nda::array<dcomplex, 1> n(n_color);
62 for (
auto const &nu : q_nu.mesh()) {
63 for (
auto a : R) { n(a) = n_a_nu(a, nu); }
65 for (
auto b : R) q_nu[nu](a, b) += s * n(a) * std::conj(n(b));
71 void nn_nu_dlr::collect_results(mpi::communicator
const &c) {
73 Z = mpi::all_reduce(Z, c);
75 q_nu = mpi::all_reduce(q_nu, c);
76 q_nu = q_nu / Z / beta;
79 for (
int c1 : range(n_color)) {
80 for (
int c2 : range(n_color)) {
81 q_nu_block(block_number[c1], block_number[c2]).data()(range::all, index_in_block[c1], index_in_block[c2]) =
82 q_nu.data()(range::all, c1, c2);
85 results.nn_nu_dlr = std::move(q_nu_block);