24#include <triqs/utility/time_pt.hpp>
25#include <triqs/experimental/nfft_buf.hpp>
28 namespace experimental {
31 using namespace triqs::gfs;
32 using namespace triqs::mesh;
33 using triqs::utility::time_pt;
36 template <
int MeshRank,
int TargetRank>
class nfft_array_t {
39 using freq_mesh_t =
typename nfft_buf_t<MeshRank>::freq_mesh_t;
40 using res_gf_t = gf<freq_mesh_t, tensor_valued<TargetRank>>;
41 static constexpr int result_rank = MeshRank + TargetRank;
43 nfft_array_t() =
default;
45 nfft_array_t(nfft_array_t
const &other) =
delete;
46 nfft_array_t(nfft_array_t &&other) : indexmap(other.indexmap), buffers(std::move(other.buffers)) { fiw_arr.rebind(other.fiw_arr); }
48 nfft_array_t &operator=(nfft_array_t
const &other) =
delete;
49 nfft_array_t &operator=(nfft_array_t &&other) {
50 indexmap = other.indexmap;
51 buffers = std::move(other.buffers);
52 fiw_arr.rebind(other.fiw_arr);
59 nfft_array_t(freq_mesh_t
const &fiw_mesh, array_view<dcomplex, result_rank> fiw_arr_, array<long, TargetRank>
const &buf_sizes)
60 : indexmap(make_target_shape(fiw_arr_.shape())), fiw_arr(fiw_arr_) {
61 buffers.reserve(indexmap.size());
62 for_each(buf_sizes.shape(), [
this, &fiw_mesh, &buf_sizes](
auto... ind) {
64 buffers.emplace_back(fiw_mesh, fiw_arr(ellipsis(), ind...), buf_sizes(ind...), false);
66 buffers.emplace_back(fiw_mesh, fiw_arr(ellipsis(), ind...), buf_sizes(ind...), true);
72 void push_back(std::array<double, MeshRank>
const &tau_arr, std::array<int, TargetRank>
const &ind_arr, dcomplex fxy) {
73 select_buffer(ind_arr, std::make_index_sequence<TargetRank>()).push_back(tau_arr, fxy);
78 for (
auto &buf : buffers) buf.flush();
82 template <
size_t... Is>
inline nfft_buf_t<MeshRank> &select_buffer(std::array<int, TargetRank>
const &ind_arr, std::index_sequence<Is...>) {
83 return buffers[indexmap(ind_arr[Is]...)];
86 std::array<long, TargetRank> make_target_shape(std::array<long, result_rank>
const &shape) {
87 std::array<long, TargetRank> res;
88 for (
int n = 0; n < TargetRank; ++n) res[n] = shape[n + MeshRank];
89 return std::array<long, TargetRank>(res);
93 nda::idx_map<TargetRank, 0, C_stride_order<TargetRank>, layout_prop_e::none> indexmap;
96 std::vector<nfft_buf_t<MeshRank>> buffers;
99 array_view<dcomplex, result_rank> fiw_arr;