24#include "../types.hpp"
25#include "../fourier/fourier.hpp"
33 using namespace fourier;
36template <
typename Gf_type>
37auto fourier_Dwr_to_Dtr_general_target(Gf_type g_wr) {
41 auto wmesh = std::get<0>(g_wr.mesh());
42 auto rmesh = std::get<1>(g_wr.mesh());
44 auto tmesh = triqs::mesh::dlr_imtime(wmesh);
46 auto g_tr = make_gf<prod<dlr_imtime, cyclat>>({tmesh, rmesh}, g_wr.target());
48 auto r_arr = mpi_view(rmesh);
49#pragma omp parallel for
50 for (
unsigned int idx = 0; idx < r_arr.size(); idx++) {
53 auto g_w = make_gf<dlr_imfreq>({wmesh}, g_wr.target());
57 auto g_c = make_gf_dlr(g_w);
58 auto g_t = make_gf_dlr_imtime(g_c);
62 g_tr = mpi::all_reduce(g_tr);
67template <
typename Gf_type>
68auto fourier_Dtr_to_Dwr_general_target(Gf_type g_tr) {
72 auto tmesh = std::get<0>(g_tr.mesh());
73 auto rmesh = std::get<1>(g_tr.mesh());
75 auto wmesh = triqs::mesh::dlr_imfreq(tmesh);
77 auto g_wr = make_gf<prod<dlr_imfreq, cyclat>>({wmesh, rmesh}, g_tr.target());
79 auto r_arr = mpi_view(rmesh);
80#pragma omp parallel for
81 for (
unsigned int idx = 0; idx < r_arr.size(); idx++) {
84 auto g_t = make_gf<dlr_imtime>({tmesh}, g_tr.target());
88 auto g_c = make_gf_dlr(g_t);
89 auto g_w = make_gf_dlr_imfreq(g_c);
93 g_wr = mpi::all_reduce(g_wr);
98template <
typename Gf_type>
99auto fourier_wr_to_tr_general_target(Gf_type g_wr,
int n_tau = -1) {
104 auto wmesh = std::get<0>(g_wr.mesh());
105 auto rmesh = std::get<1>(g_wr.mesh());
107 auto tmesh = make_adjoint_mesh(wmesh, n_tau);
108 auto g_tr = make_gf<prod<imtime, cyclat>>({tmesh, rmesh}, g_wr.target());
110 auto r0 = *rmesh.begin();
111 auto p = _fourier_plan<0>(gf_const_view(g_wr[_, r0]), gf_view(g_tr[_, r0]));
113 auto r_arr = mpi_view(rmesh);
115#pragma omp parallel for
116 for (
unsigned int idx = 0; idx < r_arr.size(); idx++) {
117 auto &r = r_arr[idx];
119 auto g_w = make_gf<imfreq>(wmesh, g_wr.target());
120 auto g_t = make_gf<imtime>(tmesh, g_tr.target());
124 _fourier_with_plan<0>(gf_const_view(g_w), gf_view(g_t), p);
128 g_tr = mpi::all_reduce(g_tr);
132template <
typename Gf_type>
133auto fourier_tr_to_wr_general_target(Gf_type g_tr,
int n_w = -1) {
137 auto tmesh = std::get<0>(g_tr.mesh());
138 auto rmesh = std::get<1>(g_tr.mesh());
140 auto wmesh = make_adjoint_mesh(tmesh, n_w);
141 auto g_wr = make_gf<prod<imfreq, cyclat>>({wmesh, rmesh}, g_tr.target());
143 auto r0 = *rmesh.begin();
144 auto p = _fourier_plan<0>(gf_const_view(g_tr[_, r0]), gf_view(g_wr[_, r0]));
146 auto r_arr = mpi_view(rmesh);
148#pragma omp parallel for
149 for (
unsigned int idx = 0; idx < r_arr.size(); idx++) {
150 auto &r = r_arr[idx];
152 auto g_t = make_gf<imtime>(tmesh, g_tr.target());
153 auto g_w = make_gf<imfreq>(wmesh, g_wr.target());
157 _fourier_with_plan<0>(gf_const_view(g_t), gf_view(g_w), p);
161 g_wr = mpi::all_reduce(g_wr);
165template <
typename Gf_type>
166auto fourier_wk_to_wr_general_target(Gf_type g_wk) {
171 auto wmesh = std::get<0>(g_wk.mesh());
172 auto kmesh = std::get<1>(g_wk.mesh());
174 auto rmesh = make_adjoint_mesh(kmesh);
175 auto g_wr = make_gf<prod<
decltype(wmesh), cyclat>>({wmesh, rmesh}, g_wk.target());
177 auto w0 = *wmesh.begin();
178 auto p = _fourier_plan<0>(gf_const_view(g_wk[w0, _]), gf_view(g_wr[w0, _]));
180 auto w_arr = mpi_view(wmesh);
182#pragma omp parallel for
183 for (
unsigned int idx = 0; idx < w_arr.size(); idx++) {
184 auto &w = w_arr[idx];
186 auto g_k = make_gf<brzone>(kmesh, g_wk.target());
187 auto g_r = make_gf<cyclat>(rmesh, g_wr.target());
191 _fourier_with_plan<0>(gf_const_view(g_k), gf_view(g_r), p);
195 g_wr = mpi::all_reduce(g_wr);
199template <
typename Gf_type>
200auto fourier_wr_to_wk_general_target(Gf_type g_wr) {
205 auto wmesh = std::get<0>(g_wr.mesh());
206 auto rmesh = std::get<1>(g_wr.mesh());
208 auto kmesh = make_adjoint_mesh(rmesh);
209 auto g_wk = make_gf<prod<
decltype(wmesh), brzone>>({wmesh, kmesh}, g_wr.target());
211 auto w0 = *wmesh.begin();
212 auto p = _fourier_plan<0>(gf_const_view(g_wr[w0, _]), gf_view(g_wk[w0, _]));
214 auto w_arr = mpi_view(wmesh);
216#pragma omp parallel for
217 for (
unsigned int idx = 0; idx < w_arr.size(); idx++) {
218 auto &w = w_arr[idx];
220 auto g_r = make_gf<cyclat>(rmesh, g_wr.target());
221 auto g_k = make_gf<brzone>(kmesh, g_wk.target());
225 _fourier_with_plan<0>(gf_const_view(g_r), gf_view(g_k), p);
229 g_wk = mpi::all_reduce(g_wk);