20#include "./fourier_common.hpp"
21#include <itertools/itertools.hpp>
25namespace triqs_tprf::fourier {
28 template <
typename M1,
typename M2> fourier_plan __impl_plan(
int fftw_backward_forward, M1
const &out_mesh, gf_vec_cvt<M2> g_in) {
30 auto g_out = gf_vec_t<M1>{out_mesh, std::array{g_in.target_shape()[0]}};
31 long n_others = g_in.data().shape()[1];
33 auto dims = g_in.mesh().dims();
34 auto dims_int = stdutil::make_std_array<int>(dims);
36 return _fourier_base_plan(g_in.data(), g_out.data(), dims.size(), dims_int.data(), n_others, fftw_backward_forward);
39 fourier_plan _fourier_plan(triqs::mesh::cyclat
const &r_mesh, gf_vec_cvt<brzone> gk) {
return __impl_plan(FFTW_FORWARD, r_mesh, gk); }
40 fourier_plan _fourier_plan(triqs::mesh::brzone
const &k_mesh, gf_vec_cvt<cyclat> gr) {
return __impl_plan(FFTW_BACKWARD, k_mesh, gr); }
44 gf_vec_t<cyclat> _fourier_impl(triqs::mesh::cyclat
const &r_mesh, gf_vec_cvt<brzone> gk, fourier_plan &p) {
46 auto gr = gf_vec_t<cyclat>{r_mesh, {gk.target_shape()[0]}};
47 _fourier_base(gk.data(), gr.data(), p);
49 gr.data() /= gk.mesh().size();
55 gf_vec_t<brzone> _fourier_impl(triqs::mesh::brzone
const &k_mesh, gf_vec_cvt<cyclat> gr, fourier_plan &p) {
56 auto gk = gf_vec_t<brzone>{k_mesh, {gr.target_shape()[0]}};
57 _fourier_base(gr.data(), gk.data(), p);