24#include "chi_imtime.hpp"
26#include "../fourier/fourier.hpp"
32 using namespace fourier;
38chi_Dtr_t chi0_tr_from_grt_PH(g_Dtr_cvt g_tr, g_Dtr_cvt g_bwd_tr) {
40 assert( g_tr.mesh() == g_bwd_tr.mesh() );
41 assert( g_tr.target() == g_bwd_tr.target() );
45 auto tmesh = std::get<0>(g_tr.mesh());
46 auto rmesh = std::get<1>(g_tr.mesh());
48 int nb = g_tr.target().shape()[0];
49 double beta = tmesh.beta();
51 dlr_imtime btmesh{beta, Boson, tmesh.w_max(), tmesh.eps(), tmesh.symmetrize()};
52 chi_Dtr_t chi0_tr{{btmesh, rmesh}, {nb, nb, nb, nb}};
54 auto g_target = g_tr.target();
55 auto chi_target = chi0_tr.target();
57 auto arr = mpi_view(rmesh);
59#pragma omp parallel for
60 for (
unsigned int idx = 0; idx < arr.size(); idx++) {
63 auto chi0_t = make_gf<dlr_imtime>(btmesh, chi_target);
64 auto g_pr_t = make_gf<dlr_imtime>(tmesh, g_target);
65 auto g_mr_t = make_gf<dlr_imtime>(tmesh, g_target);
70 g_mr_t = g_bwd_tr(_, -r);
73 auto g_pr_c = make_gf_dlr(g_pr_t);
74 auto g_mr_c = make_gf_dlr(g_mr_t);
77 chi0_t[t](a, b, c, d) << g_pr_c(t)(d, a) * g_mr_c(beta - t)(b, c);
80 chi0_tr[_, r] = chi0_t;
83 chi0_tr = mpi::all_reduce(chi0_tr);
88chi_Dtr_t chi0_tr_from_grt_PH(g_Dtr_cvt g_tr) {
89 return chi0_tr_from_grt_PH(g_tr, g_tr);
96chi_wr_t chi0_w0r_from_grt_PH(g_Dtr_cvt g_tr, g_Dtr_cvt g_bwd_tr) {
98 assert( g_tr.mesh() == g_bwd_tr.mesh() );
99 assert( g_tr.target() == g_bwd_tr.target() );
103 auto tmesh = std::get<0>(g_tr.mesh());
104 auto rmesh = std::get<1>(g_tr.mesh());
106 int nb = g_tr.target().shape()[0];
107 double beta = tmesh.beta();
109 dlr_imtime btmesh{beta, Boson, tmesh.w_max(), tmesh.eps(), tmesh.symmetrize()};
111 imfreq bmesh{beta, Boson, 1};
112 chi_wr_t chi0_w0r{{bmesh, rmesh}, {nb, nb, nb, nb}};
114 auto g_target = g_tr.target();
115 auto chi_target = chi0_w0r.target();
117 auto arr = mpi_view(rmesh);
119#pragma omp parallel for
120 for (
unsigned int idx = 0; idx < arr.size(); idx++) {
123 auto chi0_t = make_gf<dlr_imtime>(btmesh, chi_target);
124 auto g_pr_t = make_gf<dlr_imtime>(tmesh, g_target);
125 auto g_mr_t = make_gf<dlr_imtime>(tmesh, g_target);
130 g_mr_t = g_bwd_tr(_, -r);
133 auto g_pr_c = make_gf_dlr(g_pr_t);
134 auto g_mr_c = make_gf_dlr(g_mr_t);
137 chi0_t[t](a, b, c, d) << g_pr_c(t)(d, a) * g_mr_c(beta - t)(b, c);
139 auto I = integrate_dlr_tau(chi0_t);
145 chi0_w0r = mpi::all_reduce(chi0_w0r);
150chi_wr_t chi0_w0r_from_grt_PH(g_Dtr_cvt g_tr) {
151 return chi0_w0r_from_grt_PH(g_tr, g_tr);
154target_value_t<chi_t_t>::regular_type integrate_dlr_tau(chi_Dt_cvt chi_t) {
156 auto chi_x = make_gf_dlr(chi_t);
158 auto I = zeros<dcomplex>(chi_x.target_shape());
159 for(
int l = 0; l < chi_x.mesh().size(); ++l) {
160 auto w = chi_x.mesh().dlr_freq()[l];
161 auto k0 = cppdlr::k_it(0, w);
162 auto k1 = cppdlr::k_it(1, w);
163 I += chi_x.mesh().beta() * (k0 - k1) / w * chi_x[l];
172chi_tr_t chi0_tr_from_grt_PH(g_tr_cvt g_tr, g_tr_cvt g_bwd_tr) {
174 assert( g_tr.mesh() == g_bwd_tr.mesh() );
175 assert( g_tr.target() == g_bwd_tr.target() );
179 auto tmesh = std::get<0>(g_tr.mesh());
180 auto rmesh = std::get<1>(g_tr.mesh());
182 int nb = g_tr.target().shape()[0];
183 int ntau = tmesh.size();
184 double beta = tmesh.beta();
186 chi_tr_t chi0_tr{{{beta, Boson, ntau}, rmesh}, {nb, nb, nb, nb}};
188 auto g_target = g_tr.target();
189 auto chi_target = chi0_tr.target();
198 auto arr = mpi_view(rmesh);
200#pragma omp parallel for
201 for (
unsigned int idx = 0; idx < arr.size(); idx++) {
204 auto chi0_t = make_gf<imtime>({beta, Boson, ntau}, chi_target);
205 auto g_pr_t = make_gf<imtime>(tmesh, g_target);
206 auto g_mr_t = make_gf<imtime>(tmesh, g_target);
211 g_mr_t = g_bwd_tr(_, -r);
214 for (
auto t : tmesh) chi0_t[t](a, b, c, d) << g_pr_t(t)(d, a) * g_mr_t(beta - t)(b, c);
217 chi0_tr[_, r] = chi0_t;
220 chi0_tr = mpi::all_reduce(chi0_tr);
225chi_tr_t chi0_tr_from_grt_PH(g_tr_cvt g_tr) {
226 return chi0_tr_from_grt_PH(g_tr, g_tr);
230chi_wr_t chi0_wr_from_grt_PH(g_tr_cvt g_tr, g_tr_cvt g_bwd_tr,
int nw=1) {
232 assert( g_tr.mesh() == g_bwd_tr.mesh() );
233 assert( g_tr.target() == g_bwd_tr.target() );
237 auto tmesh = std::get<0>(g_tr.mesh());
238 auto rmesh = std::get<1>(g_tr.mesh());
240 int nb = g_tr.target().shape()[0];
241 int ntau = tmesh.size();
242 double beta = tmesh.beta();
244 chi_wr_t chi0_wr{{{beta, Boson, nw}, rmesh}, {nb, nb, nb, nb}};
246 auto g_target = g_tr.target();
247 auto chi_target = chi0_wr.target();
249 auto arr = mpi_view(rmesh);
251#pragma omp parallel for
252 for (
unsigned int idx = 0; idx < arr.size(); idx++) {
255 auto chi0_t = make_gf<imtime>({beta, Boson, ntau}, chi_target);
256 auto g_pr_t = make_gf<imtime>(tmesh, g_target);
257 auto g_mr_t = make_gf<imtime>(tmesh, g_target);
262 g_mr_t = g_bwd_tr(_, -r);
265 for (
auto t : tmesh) chi0_t[t](a, b, c, d) << g_pr_t(t)(d, a) * g_mr_t(beta - t)(b, c);
269 auto chi0_w = make_gf_from_fourier(chi0_t, nw);
270 chi0_wr[_, r] = chi0_w;
274 chi0_wr = mpi::all_reduce(chi0_wr);
278chi_wr_t chi0_wr_from_grt_PH(g_tr_cvt g_tr,
int nw=1) {
279 return chi0_wr_from_grt_PH(g_tr, g_tr, nw);
283chi_wr_t chi0_w0r_from_grt_PH(g_tr_cvt g_tr, g_tr_cvt g_bwd_tr) {
285 assert( g_tr.mesh() == g_bwd_tr.mesh() );
286 assert( g_tr.target() == g_bwd_tr.target() );
290 auto tmesh = std::get<0>(g_tr.mesh());
291 auto rmesh = std::get<1>(g_tr.mesh());
294 int nb = g_tr.target().shape()[0];
295 int ntau = tmesh.size();
296 double beta = tmesh.beta();
298 chi_wr_t chi0_wr{{{beta, Boson, nw}, rmesh}, {nb, nb, nb, nb}};
300 auto g_target = g_tr.target();
301 auto chi_target = chi0_wr.target();
303 auto arr = mpi_view(rmesh);
305#pragma omp parallel for
306 for (
unsigned int idx = 0; idx < arr.size(); idx++) {
309 auto chi0_t = make_gf<imtime>({beta, Boson, ntau}, chi_target);
310 auto g_pr_t = make_gf<imtime>(tmesh, g_target);
311 auto g_mr_t = make_gf<imtime>(tmesh, g_target);
316 g_mr_t = g_bwd_tr(_, -r);
319 for (
auto t : tmesh) chi0_t[t](a, b, c, d) << g_pr_t(t)(d, a) * g_mr_t(beta - t)(b, c);
321 auto int_chi0 = chi_trapz_tau(chi0_t);
324 chi0_wr[0, r] = int_chi0;
327 chi0_wr = mpi::all_reduce(chi0_wr);
331chi_wr_t chi0_w0r_from_grt_PH(g_tr_cvt g_tr) {
332 return chi0_w0r_from_grt_PH(g_tr, g_tr);
335target_value_t<chi_t_t>::regular_type chi_trapz_tau(chi_t_cvt chi_t) {
337 auto tmesh = chi_t.mesh();
338 int ntau = tmesh.size();
339 double beta = tmesh.beta();
341 auto I = zeros<dcomplex>(chi_t.target_shape());
345 for (
auto t : tmesh) I += chi_t[t];
348 I -= 0.5 * chi_t[ntau - 1];
350 I *= beta / (ntau-1);
355chi_wr_t chi_w0r_from_chi_tr(chi_tr_cvt chi_tr) {
357 int nb = chi_tr.target().shape()[0];
359 auto tmesh = std::get<0>(chi_tr.mesh());
360 auto rmesh = std::get<1>(chi_tr.mesh());
363 double beta = tmesh.beta();
365 chi_wr_t chi_wr{{{beta, Boson, nw}, rmesh}, {nb, nb, nb, nb}};
367 auto arr = mpi_view(rmesh);
369#pragma omp parallel for
370 for (
unsigned int idx = 0; idx < arr.size(); idx++) {
374 auto I = chi_trapz_tau(chi_tr[_, r]);
380 chi_wr = mpi::all_reduce(chi_wr);
384chi_wr_t chi_wr_from_chi_tr(chi_tr_cvt chi_tr,
int nw) {
385 auto chi_wr = fourier_tr_to_wr_general_target(chi_tr, nw);
389chi_tr_t chi_tr_from_chi_wr(chi_wr_cvt chi_wr,
int ntau) {
390 auto chi_tr = fourier_wr_to_tr_general_target(chi_wr, ntau);
394chi_wk_t chi_wk_from_chi_wr(chi_wr_cvt chi_wr) {
395 auto chi_wk = fourier_wr_to_wk_general_target(chi_wr);
399chi_wr_t chi_wr_from_chi_wk(chi_wk_cvt chi_wk) {
400 auto chi_wr = fourier_wk_to_wr_general_target(chi_wk);
406chi_Dwr_t chi_wr_from_chi_tr(chi_Dtr_cvt chi_tr,
int ) {
407 auto chi_wr = fourier_Dtr_to_Dwr_general_target(chi_tr);
411chi_Dtr_t chi_tr_from_chi_wr(chi_Dwr_cvt chi_wr,
int ) {
412 auto chi_tr = fourier_Dwr_to_Dtr_general_target(chi_wr);
416chi_Dwk_t chi_wk_from_chi_wr(chi_Dwr_cvt chi_wr) {
417 auto chi_wk = fourier_wr_to_wk_general_target(chi_wr);
421chi_Dwr_t chi_wr_from_chi_wk(chi_Dwk_cvt chi_wk) {
422 auto chi_wr = fourier_wk_to_wr_general_target(chi_wk);