PSCF v1.4.0
FFT.cpp
1/*
2* PSCF - Polymer Self-Consistent Field
3*
4* Copyright 2015 - 2025, The Regents of the University of Minnesota
5* Distributed under the terms of the GNU General Public License.
6*/
7
8#include "FFT.tpp"
9
10namespace Pscf {
11namespace Prdc {
12namespace Cpu {
13
14 using namespace Util;
15
16 // Planning member functions, explicit specializations.
17
18 template <>
19 void FFT<1>::makePlans(RField<1>& rField, RFieldDft<1>& kField,
20 CField<1>& cFieldIn, CField<1>& cFieldOut)
21 {
22 int n0 = rSize_;
23 unsigned int flags = FFTW_ESTIMATE;
24 rcfPlan_ = fftw_plan_dft_r2c_1d(n0, &rField[0], &kField[0], flags);
25 criPlan_ = fftw_plan_dft_c2r_1d(n0, &kField[0], &rField[0], flags);
26 int sign = FFTW_FORWARD;
27 ccfPlan_ = fftw_plan_dft_1d(n0, &cFieldIn[0], &cFieldOut[0],
28 sign, flags);
29 sign = FFTW_BACKWARD;
30 cciPlan_ = fftw_plan_dft_1d(n0, &cFieldOut[0], &cFieldIn[0],
31 sign, flags);
32 }
33
34 template <>
35 void FFT<2>::makePlans(RField<2>& rField, RFieldDft<2>& kField,
36 CField<2>& cFieldIn, CField<2>& cFieldOut)
37 {
38 unsigned int flags = FFTW_ESTIMATE;
39 int n0 = meshDimensions_[0];
40 int n1 = meshDimensions_[1];
41 rcfPlan_ = fftw_plan_dft_r2c_2d(n0, n1, &rField[0], &kField[0], flags);
42 criPlan_ = fftw_plan_dft_c2r_2d(n0, n1, &kField[0], &rField[0], flags);
43 int sign = FFTW_FORWARD;
44 ccfPlan_ = fftw_plan_dft_2d(n0, n1, &cFieldIn[0], &cFieldOut[0],
45 sign, flags);
46 sign = FFTW_BACKWARD;
47 cciPlan_ = fftw_plan_dft_2d(n0, n1, &cFieldOut[0], &cFieldIn[0],
48 sign, flags);
49 }
50
51 template <>
52 void FFT<3>::makePlans(RField<3>& rField, RFieldDft<3>& kField,
53 CField<3>& cFieldIn, CField<3>& cFieldOut)
54 {
55 unsigned int flags = FFTW_ESTIMATE;
56 int n0 = meshDimensions_[0];
57 int n1 = meshDimensions_[1];
58 int n2 = meshDimensions_[2];
59 rcfPlan_ = fftw_plan_dft_r2c_3d(n0, n1, n2,
60 &rField[0], &kField[0], flags);
61 criPlan_ = fftw_plan_dft_c2r_3d(n0, n1, n2,
62 &kField[0], &rField[0], flags);
63 int sign = FFTW_FORWARD;
64 ccfPlan_ = fftw_plan_dft_3d(n0, n1, n2,
65 &cFieldIn[0], &cFieldOut[0], sign, flags);
66 sign = FFTW_BACKWARD;
67 cciPlan_ = fftw_plan_dft_3d(n0, n1, n2,
68 &cFieldIn[0], &cFieldOut[0], sign, flags);
69 }
70
71 // Explicit class instantiation definitions
72 template class FFT<1>;
73 template class FFT<2>;
74 template class FFT<3>;
75
76}
77}
78}
Field of complex double precision values on an FFT mesh.
Definition cpu/CField.h:29
Fourier transform wrapper.
Definition cpu/FFT.h:39
Fourier transform of a real field on an FFT mesh.
Field of real double precision values on an FFT mesh.
Definition cpu/RField.h:27
Fields and FFTs for periodic boundary conditions (CPU)
Definition complex.cpp:12
Periodic fields and crystallography.
Definition complex.cpp:11
PSCF package top-level namespace.