ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
pw_basis_k.h
Go to the documentation of this file.
1#ifndef PWBASISK_H
2#define PWBASISK_H
3
4#include "pw_basis.h"
5#include "source_psi/psi.h"
7namespace ModulePW
8{
9
56class PW_Basis_K : public PW_Basis
57{
58
59public:
60 PW_Basis_K();
61 PW_Basis_K(std::string device_, std::string precision_) : PW_Basis(device_, precision_) {classname="PW_Basis_K";}
63
64 //init parameters of pw_basis_k class
65 void initparameters(
66 const bool gamma_only_in,
67 const double ecut_in,
68 const int nk_in, //number of k points in this pool
69 const ModuleBase::Vector3<double> *kvec_d, // Direct coordinates of k points
70 const int distribution_type_in = 1,
71 const bool xprime_in = true
72 );
73
74 public:
75 int nks=0;//number of k points in this pool
76 ModuleBase::Vector3<double> *kvec_d=nullptr; // Direct coordinates of k points
77 ModuleBase::Vector3<double> *kvec_c=nullptr; // Cartesian coordinates of k points
78 int *npwk=nullptr; //[nks] number of plane waves of different k-points
79 int npwk_max=0; //max npwk among all nks k-points, it may be smaller than npw
80 //npw cutoff: (|g|+|k|)^2, npwk in the the npw ball, thus is smaller
81 double gk_ecut=0; //Energy cut off for (g+k)^2/2
82
83public:
84 //prepare for transforms between real and reciprocal spaces
85 void setuptransform();
86
87 int *igl2isz_k=nullptr, * d_igl2isz_k = nullptr; //[npwk_max*nks] map (igl,ik) to (is,iz)
88 int *igl2ig_k=nullptr;//[npwk_max*nks] map (igl,ik) to ig
89 int *ig2ixyz_k=nullptr;
90 std::vector<int> ig2ixyz_k_cpu;
91 double *gk2=nullptr; // modulus (G+K)^2 of G vectors [npwk_max*nks]
92
93 // liuyu add 2023-09-06
94 double erf_ecut=0.0; // the value of the constant energy cutoff
95 double erf_height=0.0; // the height of the energy step for reciprocal vectors
96 double erf_sigma=0.0; // the width of the energy step for reciprocal vectors
97
98 //collect gdirect, gcar, gg
99 void collect_local_pw(const double& erf_ecut_in = 0.0,
100 const double& erf_height_in = 0.0,
101 const double& erf_sigma_in = 0.1);
102
103 private:
104 float * s_gk2 = nullptr;
105 double * d_gk2 = nullptr; // modulus (G+K)^2 of G vectors [npwk_max*nks]
106 //create igl2isz_k map array for fft
107 void setupIndGk();
108 // get ig2ixyz_k
109 void get_ig2ixyz_k();
110 //calculate G+K, it is a private function
111 ModuleBase::Vector3<double> cal_GplusK_cartesian(const int ik, const int ig) const;
112
113 public:
114 template <typename FPTYPE>
115 void real2recip(const FPTYPE* in,
116 std::complex<FPTYPE>* out,
117 const int ik,
118 const bool add = false,
119 const FPTYPE factor = 1.0) const; // in:(nplane,nx*ny) ; out(nz, ns)
120 template <typename FPTYPE>
121 void real2recip(const std::complex<FPTYPE>* in,
122 std::complex<FPTYPE>* out,
123 const int ik,
124 const bool add = false,
125 const FPTYPE factor = 1.0) const; // in:(nplane,nx*ny) ; out(nz, ns)
126 template <typename FPTYPE>
127 void recip2real(const std::complex<FPTYPE>* in,
128 FPTYPE* out,
129 const int ik,
130 const bool add = false,
131 const FPTYPE factor = 1.0) const; // in:(nz, ns) ; out(nplane,nx*ny)
132 template <typename FPTYPE>
133 void recip2real(const std::complex<FPTYPE>* in,
134 std::complex<FPTYPE>* out,
135 const int ik,
136 const bool add = false,
137 const FPTYPE factor = 1.0) const; // in:(nz, ns) ; out(nplane,nx*ny)
138 #if defined(__DSP)
139 template <typename FPTYPE, typename Device>
140 void convolution(const Device* ctx,
141 const int ik,
142 const int size,
143 const std::complex<FPTYPE>* input,
144 const FPTYPE* input1,
145 std::complex<FPTYPE>* output,
146 const bool add = false,
147 const FPTYPE factor =1.0) const ;
148
149 template <typename FPTYPE>
150 void real2recip_dsp(const std::complex<FPTYPE>* in,
151 std::complex<FPTYPE>* out,
152 const int ik,
153 const bool add = false,
154 const FPTYPE factor = 1.0) const; // in:(nplane,nx*ny) ; out(nz, ns)
155 template <typename FPTYPE>
156 void recip2real_dsp(const std::complex<FPTYPE>* in,
157 std::complex<FPTYPE>* out,
158 const int ik,
159 const bool add = false,
160 const FPTYPE factor = 1.0) const; // in:(nz, ns) ; out(nplane,nx*ny)
161
162 #endif
163
164 template <typename FPTYPE, typename Device>
165 void real_to_recip(const Device* ctx,
166 const std::complex<FPTYPE>* in,
167 std::complex<FPTYPE>* out,
168 const int ik,
169 const bool add = false,
170 const FPTYPE factor = 1.0) const; // in:(nplane,nx*ny) ; out(nz, ns)
171 template <typename FPTYPE, typename Device>
172 void recip_to_real(const Device* ctx,
173 const std::complex<FPTYPE>* in,
174 std::complex<FPTYPE>* out,
175 const int ik,
176 const bool add = false,
177 const FPTYPE factor = 1.0) const; // in:(nz, ns) ; out(nplane,nx*ny)
178
179
180 template <typename TK,
181 typename Device,
182 typename std::enable_if<std::is_same<Device, base_device::DEVICE_CPU>::value, int>::type = 0>
183 void real_to_recip(const TK* in,
184 TK* out,
185 const int ik,
186 const bool add = false,
187 const typename GetTypeReal<TK>::type factor = 1.0) const
188 {
189 #if defined(__DSP)
190 this->real2recip_dsp(in, out, ik, add, factor);
191 #else
192 this->real2recip(in,out,ik,add,factor);
193 #endif
194 }
195 template <typename TK,
196 typename Device,
197 typename std::enable_if<std::is_same<Device, base_device::DEVICE_CPU>::value, int>::type = 0>
198 void recip_to_real(const TK* in,
199 TK* out,
200 const int ik,
201 const bool add = false,
202 const typename GetTypeReal<TK>::type factor = 1.0) const
203 {
204
205 #if defined(__DSP)
206 this->recip2real_dsp(in,out,ik,add,factor);
207 #else
208 this->recip2real(in,out,ik,add,factor);
209 #endif
210 }
211 template <typename FPTYPE>
212 void real2recip_gpu(const std::complex<FPTYPE>* in,
213 std::complex<FPTYPE>* out,
214 const int ik,
215 const bool add = false,
216 const FPTYPE factor = 1.0) const; // in:(nplane,nx*ny) ; out(nz, ns)
217
218 template <typename FPTYPE>
219 void recip2real_gpu(const std::complex<FPTYPE>* in,
220 std::complex<FPTYPE>* out,
221 const int ik,
222 const bool add = false,
223 const FPTYPE factor = 1.0) const; // in:(nz, ns) ; out(nplane,nx*ny)
224
225 template <typename FPTYPE,
226 typename Device,
227 typename std::enable_if<!std::is_same<Device, base_device::DEVICE_CPU>::value, int>::type = 0>
228 void real_to_recip(const FPTYPE* in,
229 FPTYPE* out,
230 const int ik,
231 const bool add = false,
232 const typename GetTypeReal<FPTYPE>::type factor = 1.0) const
233 {
234 this->real2recip_gpu(in, out, ik, add, factor);
235 }
236
237 template <typename TK,
238 typename Device,
239 typename std::enable_if<std::is_same<Device, base_device::DEVICE_GPU>::value, int>::type = 0>
240 void recip_to_real(const TK* in,
241 TK* out,
242 const int ik,
243 const bool add = false,
244 const typename GetTypeReal<TK>::type factor = 1.0) const
245 {
246 this->recip2real_gpu(in, out, ik, add, factor);
247 }
248
249 public:
250 //operator:
251 //get (G+K)^2:
252 double& getgk2(const int ik, const int igl) const;
253 //get G
254 ModuleBase::Vector3<double>& getgcar(const int ik, const int igl) const;
255 //get G-direct
256 ModuleBase::Vector3<double> getgdirect(const int ik, const int igl) const;
257 //get (G+K)
258 ModuleBase::Vector3<double> getgpluskcar(const int ik, const int igl) const;
259 //get igl2isz_k
260 int& getigl2isz(const int ik, const int igl) const;
261 //get igl2ig_k or igk(ik,ig) in older ABACUS
262 int& getigl2ig(const int ik, const int igl) const;
263
264 //get ig_to_ix
265 std::vector<int> get_ig2ix(const int ik) const;
266 //get ig_to_iy
267 std::vector<int> get_ig2iy(const int ik) const;
268 //get ig_to_iz
269 std::vector<int> get_ig2iz(const int ik) const;
270
271 template <typename FPTYPE> FPTYPE * get_gk2_data() const;
272 template <typename FPTYPE> FPTYPE * get_gcar_data() const;
273 template <typename FPTYPE> FPTYPE * get_kvec_c_data() const;
274
275private:
276 float * s_gcar = nullptr, * s_kvec_c = nullptr;
277 double * d_gcar = nullptr, * d_kvec_c = nullptr;
278};
279
280}
281#endif //PlaneWave_K class
282
283#include "./pw_basis_k_big.h" //temporary it will be removed
284
3 elements vector
Definition vector3.h:22
Special pw_basis class. It includes different k-points.
Definition pw_basis_k.h:57
double * d_kvec_c
Definition pw_basis_k.h:277
ModuleBase::Vector3< double > getgdirect(const int ik, const int igl) const
Definition pw_basis_k.cpp:381
float * s_gk2
Definition pw_basis_k.h:104
FPTYPE * get_kvec_c_data() const
void real_to_recip(const Device *ctx, const std::complex< FPTYPE > *in, std::complex< FPTYPE > *out, const int ik, const bool add=false, const FPTYPE factor=1.0) const
Definition xc3_mock.h:81
ModuleBase::Vector3< double > & getgcar(const int ik, const int igl) const
Definition pw_basis_k.cpp:376
PW_Basis_K()
Definition pw_basis_k.cpp:12
int npwk_max
Definition pw_basis_k.h:79
int * ig2ixyz_k
[npw] map ig to ixyz
Definition pw_basis_k.h:89
void recip2real(const std::complex< FPTYPE > *in, FPTYPE *out, const int ik, const bool add=false, const FPTYPE factor=1.0) const
transform reciprocal space to real space
Definition pw_transform_k.cpp:228
~PW_Basis_K()
Definition pw_basis_k.cpp:17
void real_to_recip(const FPTYPE *in, FPTYPE *out, const int ik, const bool add=false, const typename GetTypeReal< FPTYPE >::type factor=1.0) const
Definition pw_basis_k.h:228
double gk_ecut
Definition pw_basis_k.h:81
std::vector< int > get_ig2ix(const int ik) const
Definition pw_basis_k.cpp:432
double * d_gk2
Definition pw_basis_k.h:105
double & getgk2(const int ik, const int igl) const
Definition pw_basis_k.cpp:371
void recip_to_real(const Device *ctx, const std::complex< FPTYPE > *in, std::complex< FPTYPE > *out, const int ik, const bool add=false, const FPTYPE factor=1.0) const
Definition xc3_mock.h:94
double erf_ecut
Definition pw_basis_k.h:94
void real2recip(const FPTYPE *in, std::complex< FPTYPE > *out, const int ik, const bool add=false, const FPTYPE factor=1.0) const
transform real space to reciprocal space
Definition pw_transform_k.cpp:91
int * npwk
Definition pw_basis_k.h:78
void setuptransform()
Definition pw_basis_k.cpp:198
std::vector< int > get_ig2iz(const int ik) const
Definition pw_basis_k.cpp:472
ModuleBase::Vector3< double > cal_GplusK_cartesian(const int ik, const int ig) const
Definition pw_basis_k.cpp:343
double * d_gcar
Definition pw_basis_k.h:277
void real2recip_gpu(const std::complex< FPTYPE > *in, std::complex< FPTYPE > *out, const int ik, const bool add=false, const FPTYPE factor=1.0) const
int & getigl2ig(const int ik, const int igl) const
Definition pw_basis_k.cpp:398
double erf_height
Definition pw_basis_k.h:95
int * igl2ig_k
Definition pw_basis_k.h:88
void initparameters(const bool gamma_only_in, const double ecut_in, const int nk_in, const ModuleBase::Vector3< double > *kvec_d, const int distribution_type_in=1, const bool xprime_in=true)
Definition pw_basis_k.cpp:49
double erf_sigma
Definition pw_basis_k.h:96
int * igl2isz_k
Definition pw_basis_k.h:87
void recip_to_real(const TK *in, TK *out, const int ik, const bool add=false, const typename GetTypeReal< TK >::type factor=1.0) const
Definition pw_basis_k.h:198
float * s_gcar
Definition pw_basis_k.h:276
double * gk2
[npw] map ig to ixyz,which is used in dsp fft.
Definition pw_basis_k.h:91
ModuleBase::Vector3< double > getgpluskcar(const int ik, const int igl) const
Definition pw_basis_k.cpp:390
std::vector< int > get_ig2iy(const int ik) const
Definition pw_basis_k.cpp:452
ModuleBase::Vector3< double > * kvec_d
Definition pw_basis_k.h:76
PW_Basis_K(std::string device_, std::string precision_)
Definition pw_basis_k.h:61
int * d_igl2isz_k
Definition pw_basis_k.h:87
std::vector< int > ig2ixyz_k_cpu
Definition pw_basis_k.h:90
int & getigl2isz(const int ik, const int igl) const
Definition pw_basis_k.cpp:394
ModuleBase::Vector3< double > * kvec_c
Definition pw_basis_k.h:77
float * s_kvec_c
Definition pw_basis_k.h:276
void get_ig2ixyz_k()
Definition pw_basis_k.cpp:403
FPTYPE * get_gk2_data() const
void recip2real_gpu(const std::complex< FPTYPE > *in, std::complex< FPTYPE > *out, const int ik, const bool add=false, const FPTYPE factor=1.0) const
void real_to_recip(const TK *in, TK *out, const int ik, const bool add=false, const typename GetTypeReal< TK >::type factor=1.0) const
Definition pw_basis_k.h:183
void setupIndGk()
Definition pw_basis_k.cpp:130
FPTYPE * get_gcar_data() const
int nks
Definition pw_basis_k.h:75
A class which can convert a function of "r" to the corresponding linear superposition of plane waves ...
Definition pw_basis.h:56
std::string classname
Definition pw_basis.h:59
void collect_local_pw()
Definition pw_basis.cpp:135
Definition output.h:13
Definition pw_op.cpp:3
T type
Definition macros.h:8