ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
diago_iter_assist.h
Go to the documentation of this file.
1#ifndef DIAGOITERASSIST_H
2#define DIAGOITERASSIST_H
3
7#include "source_psi/psi.h"
8
9namespace hsolver
10{
11
12template <typename T, typename Device = base_device::DEVICE_CPU>
14{
15 private:
16 using Real = typename GetTypeReal<T>::type;
17
18 public:
20 static int PW_DIAG_NMAX;
21
23 static int LCAO_DIAG_NMAX;
24
26 static Real avg_iter;
27 static bool need_subspace;
28
29 static int SCF_ITER;
30
31 // for psi::Psi structure
48 static void diag_subspace(const hamilt::Hamilt<T, Device>* const pHamilt,
51 Real *en,
52 int n_band = 0,
53 const bool is_S_orthogonal = false);
54
64 static void diag_subspace_init(
66 const T* psi,
67 int psi_nr,
68 int psi_nc,
70 Real* en,
71 const std::function<void(T*, const int)>& add_to_hcc = [](T* null, const int n) {},
72 const std::function<void(const T* const, const int, const int)>& export_vcc = [](const T* null, const int n, const int m) {});
73
74 static void diag_heevx(const int nstart,
75 const int nbands,
76 const T *hcc,
77 const int ldh,
78 Real *e,
79 T *vcc);
80 static void diag_hegvd(const int nstart,
81 const int nbands,
82 const T *hcc,
83 T *sc,
84 const int ldh, // nstart
85 Real *e,
86 T *vcc);
87
93 static void cal_hs_subspace(const hamilt::Hamilt<T, Device>* pHamilt, // hamiltonian operator carrier
94 const psi::Psi<T, Device>& psi, // [in] wavefunction
95 T *hcc,
96 T *scc);
97
106 static void diag_responce(const T* hcc,
107 T* scc,
108 const int nbands,
109 const T* mat_in,
110 T* mat_out,
111 int mat_col,
112 Real* en);
113
115 static void diag_subspace_psi(const T* hcc,
116 T* scc,
117 const int dim_subspace,
119 Real* en);
120
121 static bool test_exit_cond(const int& ntry, const int& notconv);
122
123 private:
124 constexpr static const Device* ctx = {};
125
127
136
143
144 static T one;
145 static T zero;
146};
147
148template <typename T, typename Device>
150
151template <typename T, typename Device>
153
154template <typename T, typename Device>
156
157template <typename T, typename Device>
159
160template <typename T, typename Device>
162
163template <typename T, typename Device>
165
166template <typename T, typename Device>
168
169template <typename T, typename Device>
170T DiagoIterAssist<T, Device>::one = static_cast<T>(1.0);
171
172template <typename T, typename Device>
173T DiagoIterAssist<T, Device>::zero = static_cast<T>(0.0);
174} // namespace hsolver
175
176#endif
Definition hamilt.h:16
std::tuple< const psi::Psi< T, Device > *, const psi::Range, T * > hpsi_info
Definition operator.h:49
Definition diago_iter_assist.h:14
static Real PW_DIAG_THR
Definition diago_iter_assist.h:19
typename GetTypeReal< T >::type Real
Definition diago_iter_assist.h:16
static int PW_DIAG_NMAX
Definition diago_iter_assist.h:20
static Real avg_iter
average steps of last cg diagonalization for each band.
Definition diago_iter_assist.h:26
static void cal_hs_subspace(const hamilt::Hamilt< T, Device > *pHamilt, const psi::Psi< T, Device > &psi, T *hcc, T *scc)
calculate Hamiltonian and overlap matrix in subspace spanned by nstart states psi
Definition diago_iter_assist.cpp:473
static void diag_subspace(const hamilt::Hamilt< T, Device > *const pHamilt, const psi::Psi< T, Device > &psi, psi::Psi< T, Device > &evc, Real *en, int n_band=0, const bool is_S_orthogonal=false)
Diagonalizes the Hamiltonian in a subspace defined by the given wavefunction.
Definition diago_iter_assist.cpp:21
static void diag_subspace_init(hamilt::Hamilt< T, Device > *pHamilt, const T *psi, int psi_nr, int psi_nc, psi::Psi< T, Device > &evc, Real *en, const std::function< void(T *, const int)> &add_to_hcc=[](T *null, const int n) {}, const std::function< void(const T *const, const int, const int)> &export_vcc=[](const T *null, const int n, const int m) {})
use LAPACK to diagonalize the Hamiltonian matrix
Definition diago_iter_assist.cpp:173
static void diag_responce(const T *hcc, T *scc, const int nbands, const T *mat_in, T *mat_out, int mat_col, Real *en)
calculate the response matrix from rotation matrix solved by diagonalization of H and S matrix
Definition diago_iter_assist.cpp:542
static void diag_heevx(const int nstart, const int nbands, const T *hcc, const int ldh, Real *e, T *vcc)
Definition diago_iter_assist.cpp:385
static int SCF_ITER
Definition diago_iter_assist.h:29
static T one
Definition diago_iter_assist.h:144
static T zero
Definition diago_iter_assist.h:145
typename hamilt::Operator< T, Device >::hpsi_info hpsi_info
Definition diago_iter_assist.h:126
static void diag_subspace_psi(const T *hcc, T *scc, const int dim_subspace, psi::Psi< T, Device > &evc, Real *en)
calculate the response wavefunction psi from rotation matrix solved by diagonalization of H and S mat...
Definition diago_iter_assist.cpp:585
static int LCAO_DIAG_NMAX
Definition diago_iter_assist.h:23
static constexpr const Device * ctx
Definition diago_iter_assist.h:124
static Real LCAO_DIAG_THR
Definition diago_iter_assist.h:22
static bool need_subspace
Definition diago_iter_assist.h:27
static void diag_hegvd(const int nstart, const int nbands, const T *hcc, T *sc, const int ldh, Real *e, T *vcc)
Definition diago_iter_assist.cpp:422
static bool test_exit_cond(const int &ntry, const int &notconv)
Definition diago_iter_assist.cpp:634
Definition psi.h:37
#define T
Definition exp.cpp:237
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