ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
hsolver_pw.h
Go to the documentation of this file.
1#ifndef HSOLVERPW_H
2#define HSOLVERPW_H
3
8#include <unordered_map>
10
11namespace hsolver
12{
13
14template <typename T, typename Device = base_device::DEVICE_CPU>
16{
17 protected:
18 // Note GetTypeReal<T>::type will
19 // return T if T is real type(float, double),
20 // otherwise return the real type of T(complex<float>, std::complex<double>)
21 using Real = typename GetTypeReal<T>::type;
25
26 public:
28 const std::string calculation_type_in,
29 const std::string basis_type_in,
30 const std::string method_in,
31 const bool use_paw_in,
32 const bool use_uspp_in,
33 const int nspin_in,
34 const int scf_iter_in,
35 const int diag_iter_max_in,
36 const double diag_thr_in,
37 const bool need_subspace_in,
38 const bool use_k_continuity_in = false)
39 : wfc_basis(wfc_basis_in), calculation_type(calculation_type_in), basis_type(basis_type_in), method(method_in),
40 use_paw(use_paw_in), use_uspp(use_uspp_in), nspin(nspin_in), scf_iter(scf_iter_in),
41 diag_iter_max(diag_iter_max_in), diag_thr(diag_thr_in), need_subspace(need_subspace_in),
42 use_k_continuity(use_k_continuity_in) {};
43
50 void solve(hamilt::Hamilt<T, Device>* pHamilt,
53 double* out_eigenvalues,
54 const int rank_in_pool_in,
55 const int nproc_in_pool_in,
56 const bool skip_charge,
57 const double tpiba,
58 const int nat);
59
60
61 protected:
62 // diago caller
65 std::vector<Real>& pre_condition,
66 Real* eigenvalue,
67 const int& nk_nums);
68
69 // calculate the precondition array for diagonalization in PW base
70 void update_precondition(std::vector<Real>& h_diag, const int ik, const int npw, const Real vl_of_0);
71
72 void output_iterInfo();
73
75
76 const std::string calculation_type;
77 const std::string basis_type;
78 const std::string method;
79 const bool use_paw;
80 const bool use_uspp;
81 const int nspin;
82
83 const int scf_iter; // Start from 1
84 const int diag_iter_max; // max iter times for diagonalization
85 const double diag_thr; // threshold for diagonalization
86
87 const bool need_subspace; // for cg or dav_subspace
88
89 const bool use_k_continuity;
90
91 protected:
92 Device* ctx = {};
93
94 int rank_in_pool = 0;
96
97 std::vector<double> ethr_band;
98
99 private:
101 void cal_smooth_ethr(const double& wk, const double* wg, const double& ethr, std::vector<double>& ethrs);
102
103#ifdef USE_PAW
104 void paw_func_in_kloop(const int ik,
105 const double tpiba);
106
107 void call_paw_cell_set_currentk(const int ik);
108
109 void paw_func_after_kloop(psi::Psi<T, Device>& psi, elecstate::ElecState* pes,const double tpiba,const int nat);
110#endif
111
112 // K-point continuity related members
113 std::vector<int> k_order;
114 std::unordered_map<int, int> k_parent;
115 std::vector<ModuleBase::Vector3<double>> kvecs_c;
116
117 void build_k_neighbors();
118 void propagate_psi(psi::Psi<T, Device>& psi, const int from_ik, const int to_ik);
119};
120
121} // namespace hsolver
122
123#endif
Special pw_basis class. It includes different k-points.
Definition pw_basis_k.h:57
Definition elecstate.h:15
Definition hamilt.h:16
Definition hsolver_pw.h:16
void hamiltSolvePsiK(hamilt::Hamilt< T, Device > *hm, psi::Psi< T, Device > &psi, std::vector< Real > &pre_condition, Real *eigenvalue, const int &nk_nums)
Definition hsolver_pw.cpp:232
std::vector< int > k_order
Definition hsolver_pw.h:113
int rank_in_pool
Definition hsolver_pw.h:94
std::unordered_map< int, int > k_parent
Definition hsolver_pw.h:114
std::vector< ModuleBase::Vector3< double > > kvecs_c
Definition hsolver_pw.h:115
void update_precondition(std::vector< Real > &h_diag, const int ik, const int npw, const Real vl_of_0)
Definition hsolver_pw.cpp:467
const std::string method
Definition hsolver_pw.h:78
const bool use_k_continuity
Definition hsolver_pw.h:89
const int scf_iter
Definition hsolver_pw.h:83
const int diag_iter_max
Definition hsolver_pw.h:84
const std::string basis_type
Definition hsolver_pw.h:77
void solve(hamilt::Hamilt< T, Device > *pHamilt, psi::Psi< T, Device > &psi, elecstate::ElecState *pes, double *out_eigenvalues, const int rank_in_pool_in, const int nproc_in_pool_in, const bool skip_charge, const double tpiba, const int nat)
solve function for pw
Definition hsolver_pw.cpp:68
std::vector< double > ethr_band
Definition hsolver_pw.h:97
const bool use_uspp
Definition hsolver_pw.h:80
HSolverPW(ModulePW::PW_Basis_K *wfc_basis_in, const std::string calculation_type_in, const std::string basis_type_in, const std::string method_in, const bool use_paw_in, const bool use_uspp_in, const int nspin_in, const int scf_iter_in, const int diag_iter_max_in, const double diag_thr_in, const bool need_subspace_in, const bool use_k_continuity_in=false)
Definition hsolver_pw.h:27
const bool need_subspace
Definition hsolver_pw.h:87
const int nspin
Definition hsolver_pw.h:81
void cal_smooth_ethr(const double &wk, const double *wg, const double &ethr, std::vector< double > &ethrs)
calculate the threshold for iterative-diagonalization for each band
Definition hsolver_pw.cpp:26
Device * ctx
Definition hsolver_pw.h:92
void propagate_psi(psi::Psi< T, Device > &psi, const int from_ik, const int to_ik)
Definition hsolver_pw.cpp:584
int nproc_in_pool
Definition hsolver_pw.h:95
ModulePW::PW_Basis_K * wfc_basis
Definition hsolver_pw.h:74
const bool use_paw
Definition hsolver_pw.h:79
const double diag_thr
Definition hsolver_pw.h:85
const std::string calculation_type
Definition hsolver_pw.h:76
typename GetTypeReal< T >::type Real
Definition hsolver_pw.h:21
void output_iterInfo()
Definition hsolver_pw.cpp:516
void build_k_neighbors()
Definition hsolver_pw.cpp:530
Definition psi.h:37
Definition diag_comm_info.h:9
Definition exx_lip.h:23
T type
Definition macros.h:8
Definition memory_op.h:77
Definition memory_op.h:17
Definition memory_op.h:31