22#include "fourier_interpolation.hpp"
29array<std::complex<double>, 6> cluster_mesh_fourier_interpolation(array<double, 2> k_vecs, chi_wr_cvt chi) {
31 int nk = k_vecs.shape()[0];
32 int nb = chi.target().shape()[0];
33 int nw = std::get<0>(chi.mesh()).size();
35 auto wmesh = std::get<0>(chi.mesh());
36 auto rmesh = std::get<1>(chi.mesh());
38 array<std::complex<double>, 6> chi_out(nw, nk, nb, nb, nb, nb);
40#pragma omp parallel for
41 for(
int kidx = 0; kidx < nk; kidx++) {
43 chi_out(range::all, kidx, range::all, range::all, range::all, range::all) *= 0.;
45 auto k = k_vecs(kidx, range::all);
47 for (
auto r : rmesh) {
55 auto dot_prod = k[0]*r[0] + k[1]*r[1] + k[2]*r[2];
56 auto exponent = exp( - std::complex<double>(0., dot_prod) );
58 for (
auto w : wmesh) {
59 int widx = w.data_index();
60 for (
int a : range(nb))
61 for (
int b : range(nb))
62 for (
int c : range(nb))
63 for (
int d : range(nb)) chi_out(widx, kidx, a, b, c, d) += exponent * chi[w, r](a, b, c, d);