TRIQS/triqs_tprf 4.0.0
A TRIQS application
Loading...
Searching...
No Matches
fourier.hpp
1/*******************************************************************************
2 *
3 * TRIQS: a Toolbox for Research in Interacting Quantum Systems
4 *
5 * Copyright (C) 2019, The Simons Foundation and S. Käser
6 * Authors: S. Käser
7 *
8 * TRIQS is free software: you can redistribute it and/or modify it under the
9 * terms of the GNU General Public License as published by the Free Software
10 * Foundation, either version 3 of the License, or (at your option) any later
11 * version.
12 *
13 * TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY
14 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * TRIQS. If not, see <http://www.gnu.org/licenses/>.
20 *
21 ******************************************************************************/
22#pragma once
23
24#include "../types.hpp"
25#include "../fourier/fourier.hpp"
26#include <omp.h>
27#include "../mpi.hpp"
28
29namespace triqs_tprf {
30
31
32 namespace {
33 using namespace fourier;
34 }
35
36template <typename Gf_type>
37auto fourier_Dwr_to_Dtr_general_target(Gf_type g_wr) {
38
39 auto _ = all_t{};
40
41 auto wmesh = std::get<0>(g_wr.mesh());
42 auto rmesh = std::get<1>(g_wr.mesh());
43
44 auto tmesh = triqs::mesh::dlr_imtime(wmesh);
45
46 auto g_tr = make_gf<prod<dlr_imtime, cyclat>>({tmesh, rmesh}, g_wr.target());
47
48 auto r_arr = mpi_view(rmesh);
49#pragma omp parallel for
50 for (unsigned int idx = 0; idx < r_arr.size(); idx++) {
51 auto &r = r_arr[idx];
52
53 auto g_w = make_gf<dlr_imfreq>({wmesh}, g_wr.target());
54
55 g_w = g_wr[_, r];
56
57 auto g_c = make_gf_dlr(g_w);
58 auto g_t = make_gf_dlr_imtime(g_c);
59
60 g_tr[_, r] = g_t;
61 }
62 g_tr = mpi::all_reduce(g_tr);
63
64 return g_tr;
65}
66
67template <typename Gf_type>
68auto fourier_Dtr_to_Dwr_general_target(Gf_type g_tr) {
69
70 auto _ = all_t{};
71
72 auto tmesh = std::get<0>(g_tr.mesh());
73 auto rmesh = std::get<1>(g_tr.mesh());
74
75 auto wmesh = triqs::mesh::dlr_imfreq(tmesh);
76
77 auto g_wr = make_gf<prod<dlr_imfreq, cyclat>>({wmesh, rmesh}, g_tr.target());
78
79 auto r_arr = mpi_view(rmesh);
80#pragma omp parallel for
81 for (unsigned int idx = 0; idx < r_arr.size(); idx++) {
82 auto &r = r_arr[idx];
83
84 auto g_t = make_gf<dlr_imtime>({tmesh}, g_tr.target());
85
86 g_t = g_tr[_, r];
87
88 auto g_c = make_gf_dlr(g_t);
89 auto g_w = make_gf_dlr_imfreq(g_c);
90
91 g_wr[_, r] = g_w;
92 }
93 g_wr = mpi::all_reduce(g_wr);
94
95 return g_wr;
96}
97
98template <typename Gf_type>
99auto fourier_wr_to_tr_general_target(Gf_type g_wr, int n_tau = -1) {
100
101 auto _ = all_t{};
102 // Get rid of structured binding declarations in this file due to issue #11
103 //auto [wmesh, rmesh] = g_wr.mesh();
104 auto wmesh = std::get<0>(g_wr.mesh());
105 auto rmesh = std::get<1>(g_wr.mesh());
106
107 auto tmesh = make_adjoint_mesh(wmesh, n_tau);
108 auto g_tr = make_gf<prod<imtime, cyclat>>({tmesh, rmesh}, g_wr.target());
109
110 auto r0 = *rmesh.begin();
111 auto p = _fourier_plan<0>(gf_const_view(g_wr[_, r0]), gf_view(g_tr[_, r0]));
112
113 auto r_arr = mpi_view(rmesh);
114
115#pragma omp parallel for
116 for (unsigned int idx = 0; idx < r_arr.size(); idx++) {
117 auto &r = r_arr[idx];
118
119 auto g_w = make_gf<imfreq>(wmesh, g_wr.target());
120 auto g_t = make_gf<imtime>(tmesh, g_tr.target());
121
122 g_w = g_wr[_, r];
123
124 _fourier_with_plan<0>(gf_const_view(g_w), gf_view(g_t), p);
125
126 g_tr[_, r] = g_t;
127 }
128 g_tr = mpi::all_reduce(g_tr);
129 return g_tr;
130}
131
132template <typename Gf_type>
133auto fourier_tr_to_wr_general_target(Gf_type g_tr, int n_w = -1) {
134
135 auto _ = all_t{};
136 //auto [tmesh, rmesh] = g_tr.mesh();
137 auto tmesh = std::get<0>(g_tr.mesh());
138 auto rmesh = std::get<1>(g_tr.mesh());
139
140 auto wmesh = make_adjoint_mesh(tmesh, n_w);
141 auto g_wr = make_gf<prod<imfreq, cyclat>>({wmesh, rmesh}, g_tr.target());
142
143 auto r0 = *rmesh.begin();
144 auto p = _fourier_plan<0>(gf_const_view(g_tr[_, r0]), gf_view(g_wr[_, r0]));
145
146 auto r_arr = mpi_view(rmesh);
147
148#pragma omp parallel for
149 for (unsigned int idx = 0; idx < r_arr.size(); idx++) {
150 auto &r = r_arr[idx];
151
152 auto g_t = make_gf<imtime>(tmesh, g_tr.target());
153 auto g_w = make_gf<imfreq>(wmesh, g_wr.target());
154
155 g_t = g_tr[_, r];
156
157 _fourier_with_plan<0>(gf_const_view(g_t), gf_view(g_w), p);
158
159 g_wr[_, r] = g_w;
160 }
161 g_wr = mpi::all_reduce(g_wr);
162 return g_wr;
163}
164
165template <typename Gf_type>
166auto fourier_wk_to_wr_general_target(Gf_type g_wk) {
167
168 auto _ = all_t{};
169
170 //auto [wmesh, kmesh] = g_wk.mesh();
171 auto wmesh = std::get<0>(g_wk.mesh());
172 auto kmesh = std::get<1>(g_wk.mesh());
173
174 auto rmesh = make_adjoint_mesh(kmesh);
175 auto g_wr = make_gf<prod<decltype(wmesh), cyclat>>({wmesh, rmesh}, g_wk.target());
176
177 auto w0 = *wmesh.begin();
178 auto p = _fourier_plan<0>(gf_const_view(g_wk[w0, _]), gf_view(g_wr[w0, _]));
179
180 auto w_arr = mpi_view(wmesh);
181
182#pragma omp parallel for
183 for (unsigned int idx = 0; idx < w_arr.size(); idx++) {
184 auto &w = w_arr[idx];
185
186 auto g_k = make_gf<brzone>(kmesh, g_wk.target());
187 auto g_r = make_gf<cyclat>(rmesh, g_wr.target());
188
189 g_k = g_wk[w, _];
190
191 _fourier_with_plan<0>(gf_const_view(g_k), gf_view(g_r), p);
192
193 g_wr[w, _] = g_r;
194 }
195 g_wr = mpi::all_reduce(g_wr);
196 return g_wr;
197}
198
199template <typename Gf_type>
200auto fourier_wr_to_wk_general_target(Gf_type g_wr) {
201
202 auto _ = all_t{};
203
204 //auto [wmesh, rmesh] = g_wr.mesh();
205 auto wmesh = std::get<0>(g_wr.mesh());
206 auto rmesh = std::get<1>(g_wr.mesh());
207
208 auto kmesh = make_adjoint_mesh(rmesh);
209 auto g_wk = make_gf<prod<decltype(wmesh), brzone>>({wmesh, kmesh}, g_wr.target());
210
211 auto w0 = *wmesh.begin();
212 auto p = _fourier_plan<0>(gf_const_view(g_wr[w0, _]), gf_view(g_wk[w0, _]));
213
214 auto w_arr = mpi_view(wmesh);
215
216#pragma omp parallel for
217 for (unsigned int idx = 0; idx < w_arr.size(); idx++) {
218 auto &w = w_arr[idx];
219
220 auto g_r = make_gf<cyclat>(rmesh, g_wr.target());
221 auto g_k = make_gf<brzone>(kmesh, g_wk.target());
222
223 g_r = g_wr[w, _];
224
225 _fourier_with_plan<0>(gf_const_view(g_r), gf_view(g_k), p);
226
227 g_wk[w, _] = g_k;
228 }
229 g_wk = mpi::all_reduce(g_wk);
230 return g_wk;
231}
232
233} // namespace triqs_tprf