21#include "./density_matrix.hpp"
22#include <mpi/vector.hpp>
26namespace triqs_cthyb {
28 measure_density_matrix::measure_density_matrix(qmc_data
const &data, std::vector<matrix_t> &density_matrix) : data(data), block_dm(density_matrix) {
29 block_dm.resize(data.imp_trace.get_density_matrix().size());
30 for (
int i = 0; i < block_dm.size(); ++i) {
31 block_dm[i] = data.imp_trace.get_density_matrix()[i].mat;
37 void measure_density_matrix::accumulate(mc_weight_t s) {
43 data.imp_trace.compute();
44 z += s * data.atomic_reweighting;
45 s /= data.atomic_weight;
48 int size = block_dm.size();
49 for (
int i = 0; i < size; ++i)
50 if (data.imp_trace.get_density_matrix()[i].is_valid) { block_dm[i] += s * data.imp_trace.get_density_matrix()[i].mat; }
55 void measure_density_matrix::collect_results(mpi::communicator
const &c) {
57 z = mpi::all_reduce(z, c);
58 block_dm = mpi::all_reduce(block_dm, c);
59 for (
auto &b : block_dm){
64 b = make_regular(0.5*(b + dagger(b)));
67 if (c.rank() != 0)
return;
71 for (
auto &b : block_dm) tr += trace(b);
72 if (std::abs(tr - 1) > 0.0001) TRIQS_RUNTIME_ERROR <<
"Trace of the density matrix is " << tr <<
" instead of 1";
73 if (std::abs(tr - 1) > 1.e-10)
74 std::cerr <<
"Warning :: Trace of the density matrix is " << std::setprecision(13) << tr << std::setprecision(6) <<
" instead of 1"