Special pw_basis class for sup girds, which is constrcuted in order to be consistent with the smooth grids in terms of sticks. Easy for conversion between smooth and sup grids in reciprocal space.
More...
|
| PW_Basis_Sup () |
|
| PW_Basis_Sup (std::string device_, std::string precision_) |
|
| ~PW_Basis_Sup () |
|
void | setuptransform (const ModulePW::PW_Basis *pw_rho) |
|
| PW_Basis () |
|
| PW_Basis (std::string device_, std::string precision_) |
|
virtual | ~PW_Basis () |
|
void | initmpi (const int poolnproc_in, const int poolrank_in, MPI_Comm pool_world_in) |
|
virtual void | initgrids (const double lat0_in, const ModuleBase::Matrix3 latvec_in, const double gridecut) |
|
virtual void | initgrids (const double lat0_in, const ModuleBase::Matrix3 latvec_in, const int nx_in, int ny_in, int nz_in) |
|
void | initparameters (const bool gamma_only_in, const double pwecut_in, const int distribution_type_in=1, const bool xprime_in=true) |
|
void | setfullpw (const bool inpt_full_pw=false, const int inpt_full_pw_dim=0) |
|
void | setuptransform () |
|
void | collect_local_pw () |
|
void | collect_uniqgg () |
|
template<typename FPTYPE > |
void | real2recip (const FPTYPE *in, std::complex< FPTYPE > *out, const bool add=false, const FPTYPE factor=1.0) const |
| transform real space to reciprocal space
|
|
template<typename FPTYPE > |
void | real2recip (const std::complex< FPTYPE > *in, std::complex< FPTYPE > *out, const bool add=false, const FPTYPE factor=1.0) const |
| transform real space to reciprocal space
|
|
template<typename FPTYPE > |
void | recip2real (const std::complex< FPTYPE > *in, FPTYPE *out, const bool add=false, const FPTYPE factor=1.0) const |
| transform reciprocal space to real space
|
|
template<typename FPTYPE > |
void | recip2real (const std::complex< FPTYPE > *in, std::complex< FPTYPE > *out, const bool add=false, const FPTYPE factor=1.0) const |
| transform reciprocal space to real space
|
|
template<typename FPTYPE > |
void | real2recip_gpu (const FPTYPE *in, std::complex< FPTYPE > *out, const bool add=false, const FPTYPE factor=1.0) const |
|
template<typename FPTYPE > |
void | real2recip_gpu (const std::complex< FPTYPE > *in, std::complex< FPTYPE > *out, const bool add=false, const FPTYPE factor=1.0) const |
|
template<typename FPTYPE > |
void | recip2real_gpu (const std::complex< FPTYPE > *in, FPTYPE *out, const bool add=false, const FPTYPE factor=1.0) const |
|
template<typename FPTYPE > |
void | recip2real_gpu (const std::complex< FPTYPE > *in, std::complex< FPTYPE > *out, const bool add=false, const FPTYPE factor=1.0) const |
|
template<typename TK , typename TR , typename Device , typename std::enable_if<!std::is_same< TK, typename GetTypeReal< TK >::type >::value &&(std::is_same< TR, typename GetTypeReal< TK >::type >::value||std::is_same< TR, TK >::value) &&std::is_same< Device, base_device::DEVICE_CPU >::value, int >::type = 0> |
void | recip_to_real (TK *in, TR *out, const bool add=false, const typename GetTypeReal< TK >::type factor=1.0) const |
| Converts data from reciprocal space to real space on Cpu.
|
|
template<typename TK , typename TR , typename Device , typename std::enable_if<!std::is_same< TK, typename GetTypeReal< TK >::type >::value &&(std::is_same< TR, typename GetTypeReal< TK >::type >::value||std::is_same< TR, TK >::value) &&std::is_same< Device, base_device::DEVICE_GPU >::value, int >::type = 0> |
void | recip_to_real (TK *in, TR *out, const bool add=false, const typename GetTypeReal< TK >::type factor=1.0) const |
| Converts data from reciprocal space (Fourier space) to real space.
|
|
template<typename TR , typename TK , typename Device , typename std::enable_if<!std::is_same< TK, typename GetTypeReal< TK >::type >::value &&(std::is_same< TR, typename GetTypeReal< TK >::type >::value||std::is_same< TR, TK >::value) &&std::is_same< Device, base_device::DEVICE_CPU >::value, int >::type = 0> |
void | real_to_recip (TR *in, TK *out, const bool add=false, const typename GetTypeReal< TK >::type factor=1.0) const |
| Converts data from real space to reciprocal space (Fourier space).
|
|
template<typename TR , typename TK , typename Device , typename std::enable_if<!std::is_same< TK, typename GetTypeReal< TK >::type >::value &&(std::is_same< TR, typename GetTypeReal< TK >::type >::value||std::is_same< TR, TK >::value) &&std::is_same< Device, base_device::DEVICE_GPU >::value, int >::type = 0> |
void | real_to_recip (TR *in, TK *out, const bool add=false, const typename GetTypeReal< TK >::type factor=1.0) const |
|
void | getfftixy2is (int *fftixy2is) const |
|
void | set_device (std::string device_) |
|
void | set_precision (std::string precision_) |
|
std::string | get_device () const |
|
std::string | get_precision () const |
|
|
void | distribute_g (const ModulePW::PW_Basis *pw_rho) |
|
void | distribution_method3 (const ModulePW::PW_Basis *pw_rho) |
|
void | divide_sticks_3 (const int *st_length2D, const int *st_i, const int *st_j, const int *st_length, const int *fftixy2ip_s, const int &nx_s, const int &ny_s) |
|
void | get_ig2isz_is2fftixy (int *st_bottom2D, int *st_length2D, const ModulePW::PW_Basis *pw_rho) |
|
void | distribute_g () |
| distribute plane waves to different cores
|
|
virtual void | distribute_r () |
| distribute real-space grids to different processors
|
|
void | getstartgr () |
|
void | distribution_method1 () |
|
void | divide_sticks_1 (int *st_i, int *st_j, int *st_length) |
| (3-1) Distribute sticks to cores according to the number of plane waves.
|
|
void | distribution_method2 () |
|
void | divide_sticks_2 () |
| (2) Devide the sticks to each core according to the number of sticks Sticks are in the order of ixy increasing.
|
|
void | count_pw_st (int *st_length2D, int *st_bottom2D) |
| (1) We count the total number of planewaves (tot_npw) and sticks (this->nstot) here.
|
|
void | get_ig2isz_is2fftixy (int *st_bottom, int *st_length) |
| (5) Construct ig2isz, and is2fftixy.
|
|
void | collect_st (int *st_length2D, int *st_bottom2D, int *st_i, int *st_j, int *st_length) |
| (2) Collect the x, y indexs, length of the sticks.
|
|
void | get_istot2ixy (int *st_i, int *st_j) |
| (3-2) Rearrange sticks in the order of the ip of core increasing, in each core, sticks are sorted in the order of ixy increasing.
|
|
void | create_maps (int *st_length2D) |
| (3) Create the maps from ixy to ip, istot, and from istot to ixy, and construt npw_per simultaneously.
|
|
template<typename T > |
void | gatherp_scatters (std::complex< T > *in, std::complex< T > *out) const |
| gather planes and scatter sticks
|
|
template<typename T > |
void | gathers_scatterp (std::complex< T > *in, std::complex< T > *out) const |
| gather sticks and scatter planes
|
|
Special pw_basis class for sup girds, which is constrcuted in order to be consistent with the smooth grids in terms of sticks. Easy for conversion between smooth and sup grids in reciprocal space.
- Author
- liuyu on 2023-10-12
Math: plane waves: <r|g>=1/sqrt(V) * exp(igr) f(r) = 1/sqrt(V) * \sum_g{c(g)*exp(igr)} c(g) = \int f(r)*exp(-igr) dr
USAGE: Similar to PW_Basis, but we need to set up the smooth grids first.
Distribute planewaves in reciprocal space to cores. Firstly, divide the sphere in reciprocal space into sticks, which are vertical to x-y plane. Secondly, distribute these sticks to cores.
Example | -— ixy increasing —> | -— ixy increasing —> |... index of sticks 0, 1, 2, ..., nst_per[0]-1, nst_per[0], ..., nst_per[1]-1, ... |___________________________|______________________________|___ ip 0 1 ... npw approximate equal to npw approximate equal to...
Note: This method are ONLY used for dense grids in uspp, and it is not suitable for other cases. The smooth grids is constructed by distribution_method1(). Then, in order to conserve the consistence of planewaves between dense and smooth grids, we divide sticks corresponding to smooth girds first, and then the left ones are divided to ensure the approximate equality of planewaves on each core.
Known: smooth grids Known: G, GT, GGT, fftny, fftnx, nz, poolnproc, poolrank, ggecut output: ig2isz[ig], istot2ixy[is], is2fftixy[is], fftixy2ip[ixy], startnsz_per[ip], nst_per[ip], nst