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>
9
10namespace hsolver
11{
12
13template <typename T, typename Device = base_device::DEVICE_CPU>
15{
16 protected:
17 // Note GetTypeReal<T>::type will
18 // return T if T is real type(float, double),
19 // otherwise return the real type of T(complex<float>, std::complex<double>)
20 using Real = typename GetTypeReal<T>::type;
24
25 public:
27 const std::string calculation_type_in,
28 const std::string basis_type_in,
29 const std::string method_in,
30 const bool use_uspp_in,
31 const int nspin_in,
32 const int scf_iter_in,
33 const int diag_iter_max_in,
34 const double diag_thr_in,
35 const bool need_subspace_in,
36 const bool use_k_continuity_in = false)
37 : wfc_basis(wfc_basis_in), calculation_type(calculation_type_in), basis_type(basis_type_in), method(method_in),
38 use_uspp(use_uspp_in), nspin(nspin_in), scf_iter(scf_iter_in),
39 diag_iter_max(diag_iter_max_in), diag_thr(diag_thr_in), need_subspace(need_subspace_in),
40 use_k_continuity(use_k_continuity_in) {};
41
48 void solve(hamilt::Hamilt<T, Device>* pHamilt,
51 double* out_eigenvalues,
52 const int rank_in_pool_in,
53 const int nproc_in_pool_in,
54 const bool skip_charge,
55 const double tpiba,
56 const int nat);
57
58
59 protected:
60 // diago caller
63 std::vector<Real>& pre_condition,
64 Real* eigenvalue,
65 const int& nk_nums);
66
67 // calculate the precondition array for diagonalization in PW base
68 void update_precondition(std::vector<Real>& h_diag, const int ik, const int npw, const Real vl_of_0);
69
70 void output_iterInfo();
71
73
74 const std::string calculation_type;
75 const std::string basis_type;
76 const std::string method;
77 const bool use_uspp;
78 const int nspin;
79
80 const int scf_iter; // Start from 1
81 const int diag_iter_max; // max iter times for diagonalization
82 const double diag_thr; // threshold for diagonalization
83
84 const bool need_subspace; // for cg or dav_subspace
85
86 const bool use_k_continuity;
87
88 protected:
89 Device* ctx = {};
90
91 int rank_in_pool = 0;
93
94 std::vector<double> ethr_band;
95
96 private:
98 void cal_smooth_ethr(const double& wk, const double* wg, const double& ethr, std::vector<double>& ethrs);
99
100
101
102 // K-point continuity related members
103 std::vector<int> k_order;
104 std::unordered_map<int, int> k_parent;
105 std::vector<ModuleBase::Vector3<double>> kvecs_c;
106
107 void build_k_neighbors();
108 void propagate_psi(psi::Psi<T, Device>& psi, const int from_ik, const int to_ik);
109};
110
111} // namespace hsolver
112
113#endif
Special pw_basis class. It includes different k-points.
Definition pw_basis_k.h:56
Definition elecstate.h:15
Definition hamilt.h:17
Definition hsolver_pw.h:15
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:230
std::vector< int > k_order
Definition hsolver_pw.h:103
int rank_in_pool
Definition hsolver_pw.h:91
std::unordered_map< int, int > k_parent
Definition hsolver_pw.h:104
std::vector< ModuleBase::Vector3< double > > kvecs_c
Definition hsolver_pw.h:105
void update_precondition(std::vector< Real > &h_diag, const int ik, const int npw, const Real vl_of_0)
Definition hsolver_pw.cpp:387
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_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:26
const std::string method
Definition hsolver_pw.h:76
const bool use_k_continuity
Definition hsolver_pw.h:86
const int scf_iter
Definition hsolver_pw.h:80
const int diag_iter_max
Definition hsolver_pw.h:81
const std::string basis_type
Definition hsolver_pw.h:75
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:69
std::vector< double > ethr_band
Definition hsolver_pw.h:94
const bool use_uspp
Definition hsolver_pw.h:77
const bool need_subspace
Definition hsolver_pw.h:84
const int nspin
Definition hsolver_pw.h:78
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:27
Device * ctx
Definition hsolver_pw.h:89
void propagate_psi(psi::Psi< T, Device > &psi, const int from_ik, const int to_ik)
Definition hsolver_pw.cpp:504
int nproc_in_pool
Definition hsolver_pw.h:92
ModulePW::PW_Basis_K * wfc_basis
Definition hsolver_pw.h:72
const double diag_thr
Definition hsolver_pw.h:82
const std::string calculation_type
Definition hsolver_pw.h:74
typename GetTypeReal< T >::type Real
Definition hsolver_pw.h:20
void output_iterInfo()
Definition hsolver_pw.cpp:436
void build_k_neighbors()
Definition hsolver_pw.cpp:450
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:115
Definition memory_op.h:17
Definition memory_op.h:31