TRIQS/triqs_ctseg 4.0.0
A TRIQS application
Loading...
Searching...
No Matches
densities.cpp
1// Copyright (c) 2022--present, The Simons Foundation
2// Copyright (c) 2022--present, Max Planck Institute for Polymer Research, Mainz, Germany
3// This file is part of TRIQS/ctseg and is licensed under the terms of GPLv3 or later.
4// SPDX-License-Identifier: GPL-3.0-or-later
5// See LICENSE in the root of this distribution for details.
6
7#include "densities.hpp"
8#include <itertools/itertools.hpp>
9#include <fmt/ostream.h>
10#include "../logs.hpp"
11
12namespace triqs_ctseg::measures {
13
14 densities::densities(params_t const &, work_data_t const &wdata, configuration_t const &config, results_t &results)
15 : wdata{wdata}, config{config}, results{results} {
16
17 n = nda::zeros<double>(config.n_color());
18 }
19
20 // -------------------------------------
21
22 void densities::accumulate(double s) {
23
24 Z += s;
25 for (auto const &[c, seglist] : itertools::enumerate(config.seglists)) {
26 double sum = 0;
27 for (auto &seg : seglist) sum += double(seg.length()); // accounts for cyclicity
28 n[c] += s * sum;
29 }
30 }
31
32 // -------------------------------------
33
34 void densities::collect_results(mpi::communicator const &c) {
35 Z = mpi::all_reduce(Z, c);
36 n = mpi::all_reduce(n, c);
37 n /= (Z * tau_t::beta());
38
39 std::map<std::string, nda::array<double, 1>> densities;
40 for (long offset = 0; auto [bl_name, bl_size] : wdata.gf_struct) {
41 densities[bl_name] = n[range(offset, offset + bl_size)];
42 offset += bl_size;
43 }
44 if (c.rank() == 0) {
45 SPDLOG_INFO("Densities:");
46 for (auto &[bl, dens] : densities) SPDLOG_INFO(" {}: {}", bl, fmt::streamed(dens));
47 }
48
49 results.densities = std::move(densities);
50 }
51
52} // namespace triqs_ctseg::measures