10namespace triqs_ctseg::measures {
12 nn_tau::nn_tau(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 q_tau = gf<imtime>({beta, Boson, ntau}, {n_color, n_color});
24 q_tau_block = make_block2_gf<imtime>({beta, Boson, ntau}, p.gf_struct);
30 inline static range::all_t nda_all = range::all_t{};
32 void nn_tau::accumulate(
double s) {
34 LOG(
"\n =================== MEASURE nn(tau) ================ \n");
39 for (
int b = 0; b < n_color; ++b) {
40 if (n_at_boundary(config.seglists[b]) == 0)
continue;
41 for (
int a = 0; a < n_color; ++a)
42 for (
auto const &seg : config.seglists[a]) {
45 int u_idx_c = (seg.tau_c == tau_t::beta()) ? ntau - 1 : int(std::floor(seg.tau_c / dtau));
47 int u_idx_cdag = int(std::ceil(seg.tau_cdag / dtau));
49 auto d = q_tau.data()(nda_all, a, b);
51 auto fill = [s, &d](
long u_idx1,
long u_idx2) {
52 ALWAYS_EXPECTS((u_idx1 >= u_idx2),
"error", 1);
53 for (
auto u = u_idx1; u >= u_idx2; --u) d(u) += s;
57 if (not is_cyclic(seg)) {
58 if (u_idx_c >= u_idx_cdag) fill(u_idx_c, u_idx_cdag);
60 ALWAYS_EXPECTS((u_idx_cdag >= u_idx_c),
"eee", 1);
62 fill(ntau - 1, u_idx_cdag);
70 void nn_tau::collect_results(mpi::communicator
const &c) {
72 Z = mpi::all_reduce(Z, c);
74 q_tau = mpi::all_reduce(q_tau, c);
78 for (
int c1 : range(n_color)) {
79 for (
int c2 : range(n_color)) {
80 q_tau_block(block_number[c1], block_number[c2]).data()(range::all, index_in_block[c1], index_in_block[c2]) =
81 q_tau.data()(range::all, c1, c2);
84 results.nn_tau = std::move(q_tau_block);