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