25#include <boost/mpi/communicator.hpp>
28#include <heffte_backends.h>
32#include <initializer_list>
38template <
typename FloatType,
class FFTConfig>
class P3MFFT {
40 using backend_tag = heffte::backend::default_backend<heffte::tag::cpu>::type;
42 std::conditional_t<FFTConfig::use_r2c, heffte::fft3d_r2c<backend_tag>,
43 heffte::fft3d<backend_tag>>;
44 using Box = heffte::box3d<>;
47 std::unique_ptr<Box> in_box;
49 std::unique_ptr<Box> out_box;
51 std::vector<std::complex<FloatType>> m_workspace;
53 std::unique_ptr<FFT3D> fft3d;
55 template <
typename T, std::
size_t N>
57 std::array<T, N>
res{};
58 std::ranges::copy(
vec,
res.begin());
84 for (
auto i : {0
u, 1u, 2u}) {
92 out_box = std::make_unique<Box>(
out_boxes[comm.rank()]);
94 in_box = std::make_unique<Box>(
100 heffte::plan_options
options = heffte::default_options<backend_tag>();
112 options.algorithm = heffte::reshape_algorithm::p2p_plined;
119 if constexpr (FFTConfig::use_r2c) {
120 fft3d = std::make_unique<FFT3D>(*in_box, *out_box, FFTConfig::r2c_dir,
123 fft3d = std::make_unique<FFT3D>(*in_box, *out_box, comm,
options);
125 m_workspace.resize(fft3d->size_workspace());
142 fft3d->forward(
in,
out, m_workspace.data());
145 fft3d->backward(
in,
out, m_workspace.data());
Vector implementation and trait types for boost qvm interoperability.
Utils::Vector3i rs_local_size() const
void forward(auto &&in, auto &&out)
Utils::Vector3i ks_local_ld_index() const
void backward(auto &&in, auto &&out)
P3MFFT(boost::mpi::communicator comm, Utils::Vector3i const &global_mesh, Utils::Vector3i const &rs_local_ld_index, Utils::Vector3i const &rs_local_ur_index, Utils::Vector3i const &node_grid)
Utils::Vector3i ks_local_size() const
Utils::Vector3i ks_local_ur_index() const
static DEVICE_QUALIFIER constexpr Vector< T, N > broadcast(typename Base::value_type const &value) noexcept
Create a vector that has all entries set to the same value.
cudaStream_t stream[1]
CUDA streams for parallel computing on CPU and GPU.
T product(Vector< T, N > const &v)