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
9#include <functional>
10
11namespace hsolver
12{
13
14template <typename T, typename Device = base_device::DEVICE_CPU>
16{
17 private:
18 using Real = typename GetTypeReal<T>::type;
19
20 public:
22 static int PW_DIAG_NMAX;
23
25 static int LCAO_DIAG_NMAX;
26
28 static Real avg_iter;
29 static bool need_subspace;
30
31 static int SCF_ITER;
32
33 // for psi::Psi structure
50 static void diag_subspace(const hamilt::Hamilt<T, Device>* const pHamilt,
53 Real *en,
54 int n_band = 0,
55 const bool is_S_orthogonal = false);
56
66 static void diag_subspace_init(
68 const T* psi,
69 int psi_nr,
70 int psi_nc,
72 Real* en,
73 const std::function<void(T*, const int)>& add_to_hcc = [](T* null, const int n) {},
74 const std::function<void(const T* const, const int, const int)>& export_vcc = [](const T* null, const int n, const int m) {});
75
76 static void diag_heevx(const int nstart,
77 const int nbands,
78 const T *hcc,
79 const int ldh,
80 Real *e,
81 T *vcc);
82 static void diag_hegvd(const int nstart,
83 const int nbands,
84 const T *hcc,
85 T *sc,
86 const int ldh, // nstart
87 Real *e,
88 T *vcc);
89
95 static void cal_hs_subspace(const hamilt::Hamilt<T, Device>* pHamilt, // hamiltonian operator carrier
96 const psi::Psi<T, Device>& psi, // [in] wavefunction
97 T *hcc,
98 T *scc);
99
108 static void diag_responce(const T* hcc,
109 T* scc,
110 const int nbands,
111 const T* mat_in,
112 T* mat_out,
113 int mat_col,
114 Real* en);
115
117 static void diag_subspace_psi(const T* hcc,
118 T* scc,
119 const int dim_subspace,
121 Real* en);
122
123 static bool test_exit_cond(const int& ntry, const int& notconv);
124
125 private:
126 constexpr static const Device* ctx = {};
127
129
138
145
146 static T one;
147 static T zero;
148};
149
150template <typename T, typename Device>
152
153template <typename T, typename Device>
155
156template <typename T, typename Device>
158
159template <typename T, typename Device>
161
162template <typename T, typename Device>
164
165template <typename T, typename Device>
167
168template <typename T, typename Device>
170
171template <typename T, typename Device>
172T DiagoIterAssist<T, Device>::one = static_cast<T>(1.0);
173
174template <typename T, typename Device>
175T DiagoIterAssist<T, Device>::zero = static_cast<T>(0.0);
176} // namespace hsolver
177
178#endif
Definition hamilt.h:17
std::tuple< const psi::Psi< T, Device > *, const psi::Range, T * > hpsi_info
Definition operator.h:47
Definition diago_iter_assist.h:16
static Real PW_DIAG_THR
Definition diago_iter_assist.h:21
typename GetTypeReal< T >::type Real
Definition diago_iter_assist.h:18
static int PW_DIAG_NMAX
Definition diago_iter_assist.h:22
static Real avg_iter
average steps of last cg diagonalization for each band.
Definition diago_iter_assist.h:28
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:475
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:22
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:174
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:544
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:387
static int SCF_ITER
Definition diago_iter_assist.h:31
static T one
Definition diago_iter_assist.h:146
static T zero
Definition diago_iter_assist.h:147
typename hamilt::Operator< T, Device >::hpsi_info hpsi_info
Definition diago_iter_assist.h:128
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:587
static int LCAO_DIAG_NMAX
Definition diago_iter_assist.h:25
static constexpr const Device * ctx
Definition diago_iter_assist.h:126
static Real LCAO_DIAG_THR
Definition diago_iter_assist.h:24
static bool need_subspace
Definition diago_iter_assist.h:29
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:424
static bool test_exit_cond(const int &ntry, const int &notconv)
Definition diago_iter_assist.cpp:636
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