8#include <pocketfft_hdronly.h>
36 bool =
false)
override {
37 grid_dimension_1_ = dimension_1;
38 grid_dimension_2_ = dimension_2;
39 grid_dimension_3_ = dimension_3;
41 work_.assign(total_points,
Complex(0.0, 0.0));
42 output_buffer_.assign(total_points,
Complex(0.0, 0.0));
44 shape_ = {
static_cast<std::size_t
>(dimension_1),
45 static_cast<std::size_t
>(dimension_2),
46 static_cast<std::size_t
>(dimension_3)};
47 const auto element_bytes =
static_cast<std::ptrdiff_t
>(
sizeof(
Complex));
49 element_bytes * dimension_2 * dimension_3, element_bytes * dimension_3, element_bytes};
51 number_of_threads_ = 1;
52 const char* omp_threads_env = std::getenv(
"OMP_NUM_THREADS");
53 if (omp_threads_env !=
nullptr && std::atoi(omp_threads_env) > 1) {
54 number_of_threads_ =
static_cast<std::size_t
>(std::atoi(omp_threads_env));
59 return grid_dimension_1_;
62 return grid_dimension_2_;
65 return grid_dimension_3_;
68 return grid_dimension_1_ * grid_dimension_2_ * grid_dimension_3_;
73 transform(data, data,
true);
83 transform(data, data,
false);
88 int wrapped_index_1 = (miller_1 >= 0) ? miller_1 : miller_1 + grid_dimension_1_;
89 int wrapped_index_2 = (miller_2 >= 0) ? miller_2 : miller_2 + grid_dimension_2_;
90 int wrapped_index_3 = (miller_3 >= 0) ? miller_3 : miller_3 + grid_dimension_3_;
91 return (wrapped_index_1 * grid_dimension_2_ + wrapped_index_2) * grid_dimension_3_ +
112 return output_buffer_.data();
117 transform(work_.data(), output_buffer_.data(),
false);
122 transform(work_.data(), output_buffer_.data(),
true);
126 std::memcpy(work_.data(),
127 output_buffer_.data(),
133 void transform(
const Complex* input,
Complex* output,
bool is_forward,
Real scale = 1.0)
const {
134 pocketfft::c2c(shape_,
145 int grid_dimension_1_{}, grid_dimension_2_{}, grid_dimension_3_{};
146 pocketfft::shape_t shape_;
147 pocketfft::stride_t strides_;
148 pocketfft::shape_t axes_{0, 1, 2};
149 std::size_t number_of_threads_{1};
150 mutable std::vector<Complex> work_;
151 mutable std::vector<Complex> output_buffer_;
Complex * input_buffer() const override
int grid_dimension_3() const override
int local_offset() const override
int grid_dimension_2() const override
void forward(Complex *data) const override
void reduce_g_space(Complex *, int) const override
Complex * output_buffer() const override
int grid_dimension_1() const override
void init(int dimension_1, int dimension_2, int dimension_3, bool=false) override
void execute_inverse_raw_on_buffers() const override
int g_vector_to_fft_grid_index(int miller_1, int miller_2, int miller_3) const override
void inverse(Complex *data) const override
void execute_forward_on_buffers() const override
void prepare_forward_from_output() const override
int local_grid_points() const override
void inverse_raw(Complex *data) const override
int total_grid_points() const override
std::complex< double > Complex
std::atomic< long long > fft_call_count
static ProfilingCounters & instance()