24#include <triqs/gfs.hpp>
25#include <triqs/mesh.hpp>
26#include <triqs/utility/tuple_tools.hpp>
28#include "fourier_common.hpp"
30namespace triqs_tprf::fourier {
33 using namespace triqs::gfs;
34 using namespace triqs::mesh;
40 template <
typename V>
using gf_vec_t = gf<V, tensor_valued<1>>;
41 template <
typename V>
using gf_vec_vt = gf_view<V, tensor_valued<1>>;
42 template <
typename V>
using gf_vec_cvt = gf_const_view<V, tensor_valued<1>>;
45 gf_vec_t<imfreq> _fourier_impl(mesh::imfreq
const &iw_mesh, gf_vec_cvt<imtime> gt, fourier_plan &p, array_const_view<dcomplex, 2> mom_23 = {});
46 gf_vec_t<imtime> _fourier_impl(mesh::imtime
const &tau_mesh, gf_vec_cvt<imfreq> gw, fourier_plan &p, array_const_view<dcomplex, 2> mom_123 = {});
47 fourier_plan _fourier_plan(mesh::imfreq
const &iw_mesh, gf_vec_cvt<imtime> gt);
48 fourier_plan _fourier_plan(mesh::imtime
const &tau_mesh, gf_vec_cvt<imfreq> gw);
51 gf_vec_t<cyclat> _fourier_impl(mesh::cyclat
const &r_mesh, gf_vec_cvt<brzone> gk, fourier_plan &p);
52 gf_vec_t<brzone> _fourier_impl(mesh::brzone
const &k_mesh, gf_vec_cvt<cyclat> gr, fourier_plan &p);
53 fourier_plan _fourier_plan(mesh::cyclat
const &r_mesh, gf_vec_cvt<brzone> gk);
54 fourier_plan _fourier_plan(mesh::brzone
const &k_mesh, gf_vec_cvt<cyclat> gr);
67 template <
int N,
typename V1,
typename V2,
typename T,
typename... OptArgs>
68 void _fourier_with_plan(gf_const_view<V1, T> gin, gf_view<V2, T> gout, fourier_plan &p, OptArgs
const &...opt_args) {
71 auto const &out_mesh = [&gout]() ->
auto const & {
72 using m_t = std::decay_t<
decltype(gout.mesh())>;
73 if constexpr (triqs::mesh::is_product<m_t>)
74 return std::get<N>(gout.mesh());
80 auto gout_flatten = _fourier_impl(out_mesh, flatten_gf_2d<N>(gin), p, flatten_2d<0>(make_array_const_view(opt_args))...);
82 if constexpr (gin.data_rank == 1)
83 gout.data() = gout_flatten.data()(_, 0);
86 auto g_rot = nda::rotate_index_view<N>(gout.data());
87 for (
auto mp : out_mesh) {
88 auto g_rot_sl = g_rot(mp.data_index(), _);
89 auto gout_col = gout_flatten.data()(mp.data_index(), _);
90 nda::for_each(g_rot_sl.shape(), [&g_rot_sl, &gout_col, c =
long(0)](
auto &&...i)
mutable { return g_rot_sl(i...) = gout_col(c++); });
97 template <
int N,
typename V1,
typename V2,
typename T,
typename... OptArgs>
98 fourier_plan _fourier_plan(gf_const_view<V1, T> gin, gf_view<V2, T> gout, OptArgs
const &...opt_args) {
101 auto const &out_mesh = [&gout]() ->
auto const & {
102 using m_t = std::decay_t<
decltype(gout.mesh())>;
103 if constexpr (triqs::mesh::is_product<m_t>)
104 return std::get<N>(gout.mesh());
110 return _fourier_plan(out_mesh, flatten_gf_2d<N>(gin), flatten_2d(opt_args, N)...);