40 fftw_destroy_plan(fPlan_);
43 fftw_destroy_plan(iPlan_);
62 setup(rField, kField);
80 for (
int i = 0; i < D; ++i) {
82 meshDimensions_[i] = rDimensions[i];
83 rSize_ *= rDimensions[i];
85 kSize_ *= rDimensions[i];
87 kSize_ *= (rDimensions[i]/2 + 1);
94 if (!rFieldCopy_.isAllocated()) {
95 rFieldCopy_.allocate(rDimensions);
97 if (rFieldCopy_.capacity() != rSize_) {
98 rFieldCopy_.deallocate();
99 rFieldCopy_.allocate(rDimensions);
105 if (!kFieldCopy_.isAllocated()) {
106 kFieldCopy_.allocate(kDimensions);
108 if (kFieldCopy_.capacity() != rSize_) {
109 kFieldCopy_.deallocate();
110 kFieldCopy_.allocate(kDimensions);
116 makePlans(rField, kField);
135 double scale = 1.0/double(rSize_);
136 for (
int i = 0; i < rSize_; ++i) {
137 rFieldCopy_[i] = rField[i]*scale;
141 fftw_execute_dft_r2c(fPlan_, &rFieldCopy_[0], &kField[0]);
158 fftw_execute_dft_c2r(iPlan_, &kField[0], &rField[0]);
171 kFieldCopy_ = kField;
172 inverseTransform(kFieldCopy_, rField);
An IntVec<D, T> is a D-component vector of elements of integer type T.
void forwardTransform(RField< D > const &in, RFieldDft< D > &out) const
Compute forward (real-to-complex) Fourier transform.
virtual ~FFT()
Destructor.
FFT()
Default constructor.
void inverseTransformSafe(RFieldDft< D > const &in, RField< D > &out) const
Compute inverse (complex-to-real) Fourier transform without destroying input.
void inverseTransform(RFieldDft< D > &in, RField< D > &out) const
Compute inverse (complex-to-real) Fourier transform.
void setup(IntVec< D > const &meshDimensions)
Setup grid dimensions, plans and work space.
Fourier transform of a real field on an FFT mesh.
IntVec< D > const & meshDimensions() const
Return vector of spatial mesh dimensions by constant reference.
void allocate(IntVec< D > const &meshDimensions)
Allocate the underlying C array for an FFT grid.
Field of real double precision values on an FFT mesh.
const IntVec< D > & meshDimensions() const
Return mesh dimensions by constant reference.
void allocate(const IntVec< D > &meshDimensions)
Allocate the underlying C array for an FFT grid.
int capacity() const
Return allocated size.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
C++ namespace for polymer self-consistent field theory (PSCF).
Utility classes for scientific computation.