ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
fft_cpu.h
Go to the documentation of this file.
1#ifndef FFT_CPU_H
2#define FFT_CPU_H
3
4#include "fft_base.h"
5#include "fftw3.h"
6namespace ModulePW
7{
8template <typename FPTYPE>
9class FFT_CPU : public FFT_BASE<FPTYPE>
10{
11 public:
13 FFT_CPU(const int fft_mode_in):fft_mode(fft_mode_in){};
15
32 void initfft(int nx_in,
33 int ny_in,
34 int nz_in,
35 int lixy_in,
36 int rixy_in,
37 int ns_in,
38 int nplane_in,
39 int nproc_in,
40 bool gamma_only_in,
41 bool xprime_in = true) override;
42
44 void setupFFT() override;
45
46 // void initplan(const unsigned int& flag = 0);
48 void cleanFFT() override;
49
51 void clear() override;
52
62 FPTYPE* get_rspace_data() const override;
63
64 __attribute__((weak))
65 std::complex<FPTYPE>* get_auxr_data() const override;
66
67 __attribute__((weak))
68 std::complex<FPTYPE>* get_auxg_data() const override;
69
78 __attribute__((weak))
79 void fftxyfor(std::complex<FPTYPE>* in,
80 std::complex<FPTYPE>* out) const override;
81
82 __attribute__((weak))
83 void fftxybac(std::complex<FPTYPE>* in,
84 std::complex<FPTYPE>* out) const override;
85
86 __attribute__((weak))
87 void fftzfor(std::complex<FPTYPE>* in,
88 std::complex<FPTYPE>* out) const override;
89
90 __attribute__((weak))
91 void fftzbac(std::complex<FPTYPE>* in,
92 std::complex<FPTYPE>* out) const override;
93
95 void fftxyr2c(FPTYPE* in,
96 std::complex<FPTYPE>* out) const override;
97
98 __attribute__((weak))
99 void fftxyc2r(std::complex<FPTYPE>* in,
100 FPTYPE* out) const override;
101 private:
102 void clearfft(fftw_plan& plan);
103 void clearfft(fftwf_plan& plan);
104
105 fftw_plan planzfor = NULL;
106 fftw_plan planzbac = NULL;
107 fftw_plan planxfor1 = NULL;
108 fftw_plan planxbac1 = NULL;
109 fftw_plan planxfor2 = NULL;
110 fftw_plan planxbac2 = NULL;
111 fftw_plan planyfor = NULL;
112 fftw_plan planybac = NULL;
113 fftw_plan planxr2c = NULL;
114 fftw_plan planxc2r = NULL;
115 fftw_plan planyr2c = NULL;
116 fftw_plan planyc2r = NULL;
117
118 fftwf_plan planfzfor = NULL;
119 fftwf_plan planfzbac = NULL;
120 fftwf_plan planfxfor1= NULL;
121 fftwf_plan planfxbac1= NULL;
122 fftwf_plan planfxfor2= NULL;
123 fftwf_plan planfxbac2= NULL;
124 fftwf_plan planfyfor = NULL;
125 fftwf_plan planfybac = NULL;
126 fftwf_plan planfxr2c = NULL;
127 fftwf_plan planfxc2r = NULL;
128 fftwf_plan planfyr2c = NULL;
129 fftwf_plan planfyc2r = NULL;
130
131 std::complex<float>*c_auxg = nullptr;
132 std::complex<float>*c_auxr = nullptr; // fft space
133 std::complex<double>*z_auxg = nullptr;
134 std::complex<double>*z_auxr = nullptr; // fft space
135
136 float* s_rspace = nullptr; // real number space for r, [nplane * nx *ny]
137 double* d_rspace = nullptr; // real number space for r, [nplane * nx *ny]
138 int fftnx=0;
139 int fftny=0;
140 int fftnxy=0;
141 int nxy=0;
142 int nplane=0;
143 int ns=0; //number of sticks
144 int nproc=1; // number of proc.
145 int maxgrids = 0;
146 bool gamma_only = false;
147
151 int lixy=0;
152
156 int rixy=0;
162 bool xprime = true;
166 int fft_mode = 0;
167};
168}
169#endif // FFT_CPU_H
Definition fft_base.h:9
virtual int int int int int int int nproc_in
Definition fft_base.h:26
virtual int int int int int ns_in
Definition fft_base.h:24
virtual int int int int rixy_in
Definition fft_base.h:23
virtual int int int int int int int bool bool xprime_in
Definition fft_base.h:28
virtual int int int int int int int bool gamma_only_in
Definition fft_base.h:27
virtual int int nz_in
Definition fft_base.h:21
virtual int int int int int int nplane_in
Definition fft_base.h:25
virtual int ny_in
Definition fft_base.h:20
virtual int int int lixy_in
Definition fft_base.h:22
Definition fft_cpu.h:10
fftwf_plan planfyr2c
Definition fft_cpu.h:128
void fftxyc2r(std::complex< double > *in, double *out) const
Definition fft_cpu.cpp:442
int fftnxy
Definition fft_cpu.h:140
std::complex< double > * z_auxr
Definition fft_cpu.h:134
FFT_CPU(const int fft_mode_in)
Definition fft_cpu.h:13
int nproc
Definition fft_cpu.h:144
fftwf_plan planfzfor
Definition fft_cpu.h:118
float * s_rspace
Definition fft_cpu.h:136
fftw_plan planxr2c
Definition fft_cpu.h:113
void fftzfor(std::complex< double > *in, std::complex< double > *out) const
Definition fft_cpu.cpp:406
std::complex< double > * z_auxg
Definition fft_cpu.h:133
void fftxybac(std::complex< double > *in, std::complex< double > *out) const
Definition fft_cpu.cpp:376
double * get_rspace_data() const
Definition fft_cpu.cpp:466
int nplane
Definition fft_cpu.h:142
fftwf_plan planfzbac
Definition fft_cpu.h:119
fftw_plan planxfor2
Definition fft_cpu.h:109
fftw_plan planyc2r
Definition fft_cpu.h:116
int rixy
rixy: the right edge of the pw ball in the x or y direction
Definition fft_cpu.h:156
bool xprime
xprime: whether xprime is used,when do recip2real, x-fft will be done last and when doing real2recip,...
Definition fft_cpu.h:162
fftwf_plan planfxbac2
Definition fft_cpu.h:123
void fftzbac(std::complex< double > *in, std::complex< double > *out) const
Definition fft_cpu.cpp:412
void initfft(int nx_in, int ny_in, int nz_in, int lixy_in, int rixy_in, int ns_in, int nplane_in, int nproc_in, bool gamma_only_in, bool xprime_in=true) override
Initialize the fft parameters.
Definition fft_cpu.cpp:7
fftw_plan planxc2r
Definition fft_cpu.h:114
int fft_mode
fft_mode: fftw mode 0: estimate, 1: measure, 2: patient, 3: exhaustive
Definition fft_cpu.h:166
fftwf_plan planfxc2r
Definition fft_cpu.h:127
void fftxyr2c(double *in, std::complex< double > *out) const
Definition fft_cpu.cpp:418
fftw_plan planxfor1
Definition fft_cpu.h:107
fftwf_plan planfxr2c
Definition fft_cpu.h:126
fftw_plan planyfor
Definition fft_cpu.h:111
fftwf_plan planfybac
Definition fft_cpu.h:125
void clearfft(fftwf_plan &plan)
__attribute__((weak)) void clear() override
Initialize the fft parameters as virtual function.
int fftny
Definition fft_cpu.h:139
fftw_plan planybac
Definition fft_cpu.h:112
fftw_plan planxbac1
Definition fft_cpu.h:108
int nxy
Definition fft_cpu.h:141
__attribute__((weak)) std __attribute__((weak)) std __attribute__((weak)) void fftxyfor(std __attribute__((weak)) void fftxybac(std __attribute__((weak)) void fftzfor(std __attribute__((weak)) void fftzbac(std __attribute__((weak)) void fftxyr2c(FPTYPE *in
Forward FFT in x-y direction.
__attribute__((weak)) void cleanFFT() override
Initialize the fft parameters as virtual function.
void fftxyfor(std::complex< double > *in, std::complex< double > *out) const
Definition fft_cpu.cpp:345
fftw_plan planyr2c
Definition fft_cpu.h:115
fftwf_plan planfxfor1
Definition fft_cpu.h:120
std::complex< double > * get_auxr_data() const
Definition fft_cpu.cpp:468
int fftnx
Definition fft_cpu.h:138
void clear()
Clear the fft data as pure virtual function.
Definition fft_cpu.cpp:328
double * d_rspace
Definition fft_cpu.h:137
fftwf_plan planfyfor
Definition fft_cpu.h:124
std::complex< double > * get_auxg_data() const
Definition fft_cpu.cpp:470
fftw_plan planxbac2
Definition fft_cpu.h:110
void cleanFFT()
Clean the fft plan as pure virtual function.
Definition fft_cpu.cpp:311
std::complex< float > * c_auxg
Definition fft_cpu.h:131
int lixy
lixy: the left edge of the pw ball in the y direction
Definition fft_cpu.h:151
bool gamma_only
Definition fft_cpu.h:146
__attribute__((weak)) void setupFFT() override
Initialize the fft parameters as virtual function.
__attribute__((weak)) FPTYPE *get_rspace_data() const override
Get the real space data the CPU FFT.
int ns
Definition fft_cpu.h:143
fftw_plan planzfor
Definition fft_cpu.h:105
std::complex< float > * c_auxr
Definition fft_cpu.h:132
FFT_CPU()
Definition fft_cpu.h:12
int maxgrids
Definition fft_cpu.h:145
fftwf_plan planfxbac1
Definition fft_cpu.h:121
void setupFFT()
Setup the fft plan and data as pure virtual function.
Definition fft_cpu.cpp:43
void clearfft(fftw_plan &plan)
fftwf_plan planfxfor2
Definition fft_cpu.h:122
~FFT_CPU()
Definition fft_cpu.h:14
fftwf_plan planfyc2r
Definition fft_cpu.h:129
fftw_plan planzbac
Definition fft_cpu.h:106
Definition pw_op.cpp:3