PSCF v1.2
FFT.cpp
1/*
2* PSCF Package
3*
4* Copyright 2016 - 2022, 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 // Explicit class instantiations
17
18 template class FFT<1>;
19 template class FFT<2>;
20 template class FFT<3>;
21
22 // Planning functions, explicit specializations.
23
24 template<>
25 void FFT<1>::makePlans(RField<1>& rField, RFieldDft<1>& kField,
26 CField<1>& cFieldIn, CField<1>& cFieldOut)
27 {
28 int n0 = rSize_;
29 unsigned int flags = FFTW_ESTIMATE;
30 rcfPlan_ = fftw_plan_dft_r2c_1d(n0, &rField[0], &kField[0], flags);
31 criPlan_ = fftw_plan_dft_c2r_1d(n0, &kField[0], &rField[0], flags);
32 int sign = FFTW_FORWARD;
33 ccfPlan_ = fftw_plan_dft_1d(n0, &cFieldIn[0], &cFieldOut[0],
34 sign, flags);
35 sign = FFTW_BACKWARD;
36 cciPlan_ = fftw_plan_dft_1d(n0, &cFieldOut[0], &cFieldIn[0],
37 sign, flags);
38 }
39
40 template <>
41 void FFT<2>::makePlans(RField<2>& rField, RFieldDft<2>& kField,
42 CField<2>& cFieldIn, CField<2>& cFieldOut)
43 {
44 unsigned int flags = FFTW_ESTIMATE;
45 int n0 = meshDimensions_[0];
46 int n1 = meshDimensions_[1];
47 rcfPlan_ = fftw_plan_dft_r2c_2d(n0, n1, &rField[0], &kField[0], flags);
48 criPlan_ = fftw_plan_dft_c2r_2d(n0, n1, &kField[0], &rField[0], flags);
49 int sign = FFTW_FORWARD;
50 ccfPlan_ = fftw_plan_dft_2d(n0, n1, &cFieldIn[0], &cFieldOut[0],
51 sign, flags);
52 sign = FFTW_BACKWARD;
53 cciPlan_ = fftw_plan_dft_2d(n0, n1, &cFieldOut[0], &cFieldIn[0],
54 sign, flags);
55 }
56
57 template <>
58 void FFT<3>::makePlans(RField<3>& rField, RFieldDft<3>& kField,
59 CField<3>& cFieldIn, CField<3>& cFieldOut)
60 {
61 unsigned int flags = FFTW_ESTIMATE;
62 int n0 = meshDimensions_[0];
63 int n1 = meshDimensions_[1];
64 int n2 = meshDimensions_[2];
65 rcfPlan_ = fftw_plan_dft_r2c_3d(n0, n1, n2,
66 &rField[0], &kField[0], flags);
67 criPlan_ = fftw_plan_dft_c2r_3d(n0, n1, n2,
68 &kField[0], &rField[0], flags);
69 int sign = FFTW_FORWARD;
70 ccfPlan_ = fftw_plan_dft_3d(n0, n1, n2,
71 &cFieldIn[0], &cFieldOut[0], sign, flags);
72 sign = FFTW_BACKWARD;
73 cciPlan_ = fftw_plan_dft_3d(n0, n1, n2,
74 &cFieldIn[0], &cFieldOut[0], sign, flags);
75 }
76
77}
78}
79}
PSCF package top-level namespace.
Definition param_pc.dox:1
Utility classes for scientific computation.