ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
psi_initializer.h
Go to the documentation of this file.
1#ifndef PSI_INITIALIZER_H
2#define PSI_INITIALIZER_H
3// data structure support
4#include "source_basis/module_pw/pw_basis_k.h" // for kpoint related data structure
7#include "source_psi/psi.h" // for psi data structure
8// smart pointer for auto-memory management
9#include <memory>
10// numerical algorithm support
11#include "source_base/spherical_bessel_transformer.h" // for spherical bessel transform
12#ifdef __MPI
13#include <mpi.h>
14#endif
15#include "source_base/macros.h"
17#include "source_cell/klist.h"
18
19#include <type_traits>
20/*
21Psi (planewave based wavefunction) initializer
22Auther: Kirk0830
23Institute: AI for Science Institute, BEIJING
24
25This class is used to allocate memory and give initial guess for psi
26therefore only double datatype is needed to be supported.
27Following methods are available:
28 1. file: use wavefunction file to initialize psi
29 implemented in psi_initializer_file.h
30 2. random: use random number to initialize psi
31 implemented in psi_initializer_random.h
32 3. atomic: use pseudo-wavefunction in pseudopotential file to initialize psi
33 implemented in psi_initializer_atomic.h
34 4. atomic+random: mix 'atomic' with some random numbers to initialize psi
35 5. nao: use numerical orbitals to initialize psi
36 implemented in psi_initializer_nao.h
37 6. nao+random: mix 'nao' with some random numbers to initialize psi
38
39To use:
40- WAVEFUNCTION INITIALIZATION
41A practical example would be in ESolver_KS_PW, because polymorphism is achieved by
42pointer, while a raw pointer is risky, therefore std::unique_ptr is a better
43choice.
441. new a std::unique_ptr<psi_initializer<T> with specific derived class
452. initialize() to link psi_initializer with external data and methods
463. tabulate() to calculate the interpolate table
474. init_psig() to calculate projection of atomic radial function onto planewave basis
48In summary:
49new->initialize->tabulate->init_psig
50*/
51template <typename T>
53{
54 private:
55 using Real = typename GetTypeReal<T>::type;
56
57 public:
59 virtual ~psi_initializer(){};
61 virtual void initialize(const Structure_Factor*, //< structure factor
62 const ModulePW::PW_Basis_K*, //< planewave basis
63 const UnitCell*, //< unit cell
64 const K_Vectors* = nullptr, //< parallel kpoints
65 const int& = 1, //< random seed
66 const pseudopot_cell_vnl* = nullptr, //< nonlocal pseudopotential
67 const int& = 0); //< rank
68
70 virtual void tabulate()
71 {
72 return;
73 };
74
76 virtual void init_psig(T* psig, const int& ik) = 0;
77
78 // ======================== Tool functions ========================
79 // getter and setter
80 std::string method() const
81 {
82 return this->method_;
83 }
84 int nbands_start() const
85 {
86 return this->nbands_start_;
87 }
88 int nbands_complem() const
89 {
90 return this->nbands_complem_;
91 }
92
93 template <typename U>
94 typename std::enable_if<std::is_same<U, float>::value, U>::type cast_to_T(const std::complex<double> in)
95 {
96 return static_cast<float>(in.real());
97 }
98 template <typename U>
99 typename std::enable_if<std::is_same<U, double>::value, U>::type cast_to_T(const std::complex<double> in)
100 {
101 return static_cast<double>(in.real());
102 }
103 template <typename U>
104 typename std::enable_if<std::is_same<U, std::complex<float>>::value, U>::type cast_to_T(
105 const std::complex<double> in)
106 {
107 return std::complex<float>(static_cast<float>(in.real()), static_cast<float>(in.imag()));
108 }
109 template <typename U>
110 typename std::enable_if<std::is_same<U, std::complex<double>>::value, U>::type cast_to_T(
111 const std::complex<double> in)
112 {
113 return std::complex<double>(in.real(), in.imag());
114 }
115
116 protected:
117#ifdef __MPI // MPI additional implementation
119 void stick_to_pool(Real* stick, //< stick
120 const int& ir, //< ir
121 Real* out) const; //< out
122#endif
123 void random_t(T* psi,
124 const int iw_start,
125 const int iw_end,
126 const int ik,
127 const int mode = 1);
128 const Structure_Factor* sf_ = nullptr;
129 const ModulePW::PW_Basis_K* pw_wfc_ = nullptr;
130 const UnitCell* p_ucell_ = nullptr;
131 const K_Vectors* p_kv = nullptr;
133 int random_seed_ = 1;
134 std::vector<int> ixy2is_;
135 int mem_saver_ = 0;
136 std::string method_ = "none";
138 double mixing_coef_ = 0;
140};
141#endif
Definition klist.h:13
Special pw_basis class. It includes different k-points.
Definition pw_basis_k.h:57
Definition structure_factor.h:11
Definition unitcell.h:16
Definition VNL_in_pw.h:21
Definition psi_initializer.h:53
virtual ~psi_initializer()
Definition psi_initializer.h:59
double mixing_coef_
mixing coefficient for atomic+random and nao+random
Definition psi_initializer.h:138
std::string method_
method name
Definition psi_initializer.h:136
virtual void tabulate()
CENTRAL FUNCTION: calculate the interpolate table if needed.
Definition psi_initializer.h:70
const pseudopot_cell_vnl * p_pspot_nl_
pseudopot_cell_vnl
Definition psi_initializer.h:132
int nbands_start() const
Definition psi_initializer.h:84
std::enable_if< std::is_same< U, std::complex< double > >::value, U >::type cast_to_T(const std::complex< double > in)
Definition psi_initializer.h:110
virtual void initialize(const Structure_Factor *, const ModulePW::PW_Basis_K *, const UnitCell *, const K_Vectors *=nullptr, const int &=1, const pseudopot_cell_vnl *=nullptr, const int &=0)
initialize the psi_initializer with external data and methods
Definition psi_initializer.cpp:16
void random_t(T *psi, const int iw_start, const int iw_end, const int ik, const int mode=1)
mode, 0 for rr*exp(i*arg), 1 for rr/(1+gk2)*exp(i*arg)
Definition psi_initializer.cpp:33
int nbands_complem() const
Definition psi_initializer.h:88
int mem_saver_
if save memory, only for nscf
Definition psi_initializer.h:135
typename GetTypeReal< T >::type Real
Definition psi_initializer.h:55
int nbands_complem_
complement number of bands, which is nbands_start_ - ucell.natomwfc
Definition psi_initializer.h:137
std::vector< int > ixy2is_
used by stick_to_pool function
Definition psi_initializer.h:134
std::enable_if< std::is_same< U, double >::value, U >::type cast_to_T(const std::complex< double > in)
Definition psi_initializer.h:99
const K_Vectors * p_kv
Parallel_Kpoints.
Definition psi_initializer.h:131
virtual void init_psig(T *psig, const int &ik)=0
CENTRAL FUNCTION: init psi in pw basis.
std::enable_if< std::is_same< U, float >::value, U >::type cast_to_T(const std::complex< double > in)
Definition psi_initializer.h:94
std::string method() const
Definition psi_initializer.h:80
const Structure_Factor * sf_
Structure_Factor.
Definition psi_initializer.h:128
int nbands_start_
starting nbands, which is no less than PARAM.inp.nbands
Definition psi_initializer.h:139
const ModulePW::PW_Basis_K * pw_wfc_
use |k+G>, |G>, getgpluskcar and so on in PW_Basis_K
Definition psi_initializer.h:129
const UnitCell * p_ucell_
UnitCell.
Definition psi_initializer.h:130
psi_initializer()
Definition psi_initializer.h:58
int random_seed_
random seed, shared by random, atomic+random, nao+random
Definition psi_initializer.h:133
std::enable_if< std::is_same< U, std::complex< float > >::value, U >::type cast_to_T(const std::complex< double > in)
Definition psi_initializer.h:104
#define T
Definition exp.cpp:237
Definition exx_lip.h:23
T type
Definition macros.h:8