24#include <nda/linalg/eigh.hpp>
32 template<
typename g_out_t,
typename g_in_t,
typename mesh_t>
33 g_out_t dlr_on_immesh_template(g_in_t g_c, mesh_t mesh) {
34 g_out_t g_out(mesh, g_c.target_shape());
41 g_w_t dlr_on_imfreq(g_Dc_cvt g_c, mesh::imfreq wmesh) {
42 return dlr_on_immesh_template<g_w_t, g_Dc_cvt, mesh::imfreq>(g_c, wmesh);
45 chi_w_t dlr_on_imfreq(chi_Dc_cvt chi_c, mesh::imfreq wmesh) {
46 return dlr_on_immesh_template<chi_w_t, chi_Dc_cvt, mesh::imfreq>(chi_c, wmesh);
49 g_t_t dlr_on_imtime(g_Dc_cvt g_c, mesh::imtime tmesh) {
50 return dlr_on_immesh_template<g_t_t, g_Dc_cvt, mesh::imtime>(g_c, tmesh);
53 chi_t_t dlr_on_imtime(chi_Dc_cvt chi_c, mesh::imtime tmesh) {
54 return dlr_on_immesh_template<chi_t_t, chi_Dc_cvt, mesh::imtime>(chi_c, tmesh);
57 std::tuple<chi_wk_t, chi_k_t> split_into_dynamic_wk_and_constant_k(chi_wk_cvt chi_wk) {
60 auto wmesh = std::get<0>(chi_wk.mesh());
61 auto kmesh = std::get<1>(chi_wk.mesh());
63 chi_wk_t chi_dyn_wk(chi_wk.mesh(), chi_wk.target_shape());
65 chi_k_t chi_const_k(kmesh, chi_wk.target_shape());
68 auto arr = mpi_view(kmesh);
70#pragma omp parallel for
71 for (
unsigned int idx = 0; idx < arr.size(); idx++) {
74 auto chi_w = chi_wk[_, k];
75 auto tail = std::get<0>(fit_tail(chi_w));
77 for (
auto [a, b, c, d] : chi_wk.target_indices()) chi_const_k[k](a, b, c, d) = tail(0, a, b, c, d);
79 for (
auto w : wmesh) chi_dyn_wk[w, k] = chi_wk[w, k] - chi_const_k[k];
82 chi_dyn_wk = mpi::all_reduce(chi_dyn_wk);
83 chi_const_k = mpi::all_reduce(chi_const_k);
84 return {chi_dyn_wk, chi_const_k};
87 template<
typename g_out_t,
typename g_dyn_t,
typename g_stat_t>
88 g_out_t add_dynamic_and_static_template(g_dyn_t g_dyn_wk, g_stat_t g_stat_k) {
90 g_out_t g_wk(g_dyn_wk.mesh(), g_dyn_wk.target_shape());
93 auto arr = mpi_view(g_wk.mesh());
94#pragma omp parallel for
95 for (
int idx = 0; idx < arr.size(); idx++) {
96 auto &[w, k] = arr[idx];
99 g_wk[w, k] = g_dyn_wk[w, k] + g_stat_k[k];
101 g_wk = mpi::all_reduce(g_wk);
105 g_fk_t add_dynamic_and_static(g_fk_t g_dyn_fk, e_k_t g_stat_k) {
106 return add_dynamic_and_static_template<g_fk_t, g_fk_t, e_k_t>(g_dyn_fk, g_stat_k);
109 chi_fk_t add_dynamic_and_static(chi_fk_t chi_dyn_fk, chi_k_t chi_stat_k) {
110 return add_dynamic_and_static_template<chi_fk_t, chi_fk_t, chi_k_t>(chi_dyn_fk, chi_stat_k);
113 g_wk_t add_dynamic_and_static(g_wk_t g_dyn_wk, e_k_t g_stat_k) {
114 return add_dynamic_and_static_template<g_wk_t, g_wk_t, e_k_t>(g_dyn_wk, g_stat_k);
117 chi_wk_t add_dynamic_and_static(chi_wk_t chi_dyn_wk, chi_k_t chi_stat_k) {
118 return add_dynamic_and_static_template<chi_wk_t, chi_wk_t, chi_k_t>(chi_dyn_wk, chi_stat_k);
121 g_Dwk_t add_dynamic_and_static(g_Dwk_t g_dyn_wk, e_k_t g_stat_k) {
122 return add_dynamic_and_static_template<g_Dwk_t, g_Dwk_t, e_k_t>(g_dyn_wk, g_stat_k);
125 chi_Dwk_t add_dynamic_and_static(chi_Dwk_t chi_dyn_wk, chi_k_t chi_stat_k) {
126 return add_dynamic_and_static_template<chi_Dwk_t, chi_Dwk_t, chi_k_t>(chi_dyn_wk, chi_stat_k);
146 double fermi(
double e) {
148 return 1. / (exp(e) + 1.);
150 double exp_me = exp(-e);
151 return exp_me / (1 + exp_me);
155 double bose(
double e) {
156 return 1. / (exp(e) - 1.);