ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
diago_david.h
Go to the documentation of this file.
1#ifndef DIAGODAVID_H
2#define DIAGODAVID_H
3
4#include "source_base/macros.h" // GetRealType
5#include "source_base/module_device/device.h" // base_device
6#include "source_base/module_device/memory_op.h"// base_device::memory
7
8#include "source_base/module_container/ATen/kernels/lapack.h" // container::kernels
9
12
13#include <vector>
14#include <functional>
15
16namespace hsolver
17{
28template <typename T = std::complex<double>, typename Device = base_device::DEVICE_CPU>
30{
31 private:
32 // Note GetTypeReal<T>::type will
33 // return T if T is real type(float, double),
34 // otherwise return the real type of T(complex<float>, std::complex<double>)
35 using Real = typename GetTypeReal<T>::type;
36
37 public:
38
55 DiagoDavid(const Real* precondition_in,
56 const int nband_in,
57 const int dim_in,
58 const int david_ndim_in,
59 const diag_comm_info& diag_comm_in);
60
69
70
71 // declare type of matrix-blockvector functions.
72 // the function type is defined as a std::function object.
92 using HPsiFunc = std::function<void(T*, T*, const int, const int)>;
93
108 using SPsiFunc = std::function<void(T*, T*, const int, const int)>;
109
131 int diag(
132 const HPsiFunc& hpsi_func, // function void hpsi(T*, T*, const int, const int)
133 const SPsiFunc& spsi_func, // function void spsi(T*, T*, const int, const int, const int)
134 const int ld_psi, // Leading dimension of the psi input
135 T *psi_in, // Pointer to eigenvectors
136 Real* eigenvalue_in, // Pointer to store the resulting eigenvalues
137 const std::vector<double>& ethr_band, // Convergence threshold for the Davidson iteration
138 const int david_maxiter, // Maximum allowed iterations for the Davidson method
139 const int ntry_max = 5, // Maximum number of diagonalization attempts (5 by default)
140 const int notconv_max = 0); // Maximum number of allowed non-converged eigenvectors
141
142 private:
143 int test_david = 0;
144
146
148 const int nband;
150 const int dim;
152 const int nbase_x;
154 const int david_ndim = 4;
156 int notconv = 0;
157
159 const Real* precondition = nullptr;
161
163 Real* eigenvalue = nullptr;
164
165 T *basis = nullptr;
166
167 T* hpsi = nullptr;
168
169 T* spsi = nullptr;
170
171 T* hcc = nullptr;
172
173 T* vcc = nullptr;
174
175 T* lagrange_matrix = nullptr;
176
178 Device* ctx = {};
179 base_device::DEVICE_CPU* cpu_ctx = {};
181
182 int diag_once(const HPsiFunc& hpsi_func,
183 const SPsiFunc& spsi_func,
184 const int dim,
185 const int nband,
186 const int ld_psi,
187 T *psi_in,
188 Real* eigenvalue_in,
189 const std::vector<double>& ethr_band,
190 const int david_maxiter);
191
207 void cal_grad(const HPsiFunc& hpsi_func,
208 const SPsiFunc& spsi_func,
209 const int& dim,
210 const int& nbase,
211 const int nbase_x,
212 const int& notconv,
213 T* hpsi,
214 T* spsi,
215 const T* vcc,
216 const int* unconv,
217 const Real* eigenvalue);
218
230 void cal_elem(const int& dim,
231 int& nbase,
232 const int nbase_x,
233 const int& notconv,
234 const T* hpsi,
235 const T* spsi,
236 T* hcc);
237
254 void refresh(const int& dim,
255 const int& nband,
256 int& nbase,
257 const int nbase_x,
258 const Real* eigenvalue,
259 const T *psi_in,
260 const int ld_psi,
261 T* hpsi,
262 T* spsi,
263 T* hcc,
264 T* vcc);
265
279 void SchmidtOrth(const int& dim,
280 const int nband,
281 const int m,
282 const T* spsi,
283 T* lagrange_m,
284 const int mm_size,
285 const int mv_size);
286
296 void planSchmidtOrth(const int nband, std::vector<int>& pre_matrix_mm_m, std::vector<int>& pre_matrix_mv_m);
297
298 void diag_zhegvx(const int& nbase,
299 const int& nband,
300 const T* hcc,
301 const int& nbase_x,
303 T* vcc);
304
325 bool check_block_conv(const int &ntry, const int &notconv, const int &ntry_max, const int &notconv_max);
326
333
340
341 // Note that ct_Device is different from base_device!
343 // using hpsi_info = typename hamilt::Operator<T, Device>::hpsi_info; // Dependence of hpsi removed
344
345 const T *one = nullptr, *zero = nullptr, *neg_one = nullptr;
346 const T one_ = static_cast<T>(1.0), zero_ = static_cast<T>(0.0), neg_one_ = static_cast<T>(-1.0);
347};
348} // namespace hsolver
349
350#endif
A class that implements the block-Davidson algorithm for solving generalized eigenvalue problems.
Definition diago_david.h:30
T * hcc
the Product of S and psi in the reduced basis set
Definition diago_david.h:171
bool check_block_conv(const int &ntry, const int &notconv, const int &ntry_max, const int &notconv_max)
Check the convergence of block eigenvectors in the Davidson iteration.
Definition diago_david.cpp:1038
void cal_grad(const HPsiFunc &hpsi_func, const SPsiFunc &spsi_func, const int &dim, const int &nbase, const int nbase_x, const int &notconv, T *hpsi, T *spsi, const T *vcc, const int *unconv, const Real *eigenvalue)
Definition diago_david.cpp:295
const T * one
Definition diago_david.h:345
~DiagoDavid()
Destructor for the DiagoDavid class.
Definition diago_david.cpp:99
int diag(const HPsiFunc &hpsi_func, const SPsiFunc &spsi_func, const int ld_psi, T *psi_in, Real *eigenvalue_in, const std::vector< double > &ethr_band, const int david_maxiter, const int ntry_max=5, const int notconv_max=0)
Performs iterative diagonalization using the David algorithm.
Definition diago_david.cpp:1007
const T zero_
Definition diago_david.h:346
const int nbase_x
maximum dimension of the reduced basis set
Definition diago_david.h:152
Real * eigenvalue
eigenvalue results
Definition diago_david.h:163
int diag_once(const HPsiFunc &hpsi_func, const SPsiFunc &spsi_func, const int dim, const int nband, const int ld_psi, T *psi_in, Real *eigenvalue_in, const std::vector< double > &ethr_band, const int david_maxiter)
Definition diago_david.cpp:118
const T * zero
Definition diago_david.h:345
void planSchmidtOrth(const int nband, std::vector< int > &pre_matrix_mm_m, std::vector< int > &pre_matrix_mv_m)
Plans the Schmidt orthogonalization for a given number of bands.
Definition diago_david.cpp:943
void SchmidtOrth(const int &dim, const int nband, const int m, const T *spsi, T *lagrange_m, const int mm_size, const int mv_size)
Definition diago_david.cpp:814
void refresh(const int &dim, const int &nband, int &nbase, const int nbase_x, const Real *eigenvalue, const T *psi_in, const int ld_psi, T *hpsi, T *spsi, T *hcc, T *vcc)
Definition diago_david.cpp:692
T * vcc
Hamiltonian on the reduced basis.
Definition diago_david.h:173
T * lagrange_matrix
eigenvectors of hc
Definition diago_david.h:175
void diag_zhegvx(const int &nbase, const int &nband, const T *hcc, const int &nbase_x, Real *eigenvalue, T *vcc)
Definition diago_david.cpp:641
T * hpsi
pointer to basis set(dim, nbase_x), leading dimension = dim
Definition diago_david.h:167
const T neg_one_
Definition diago_david.h:346
T * spsi
the product of H and psi in the reduced basis set
Definition diago_david.h:169
Real * d_precondition
Definition diago_david.h:160
const int dim
dimension of the input matrix to be diagonalized
Definition diago_david.h:150
T * basis
Definition diago_david.h:165
const int david_ndim
dimension of the subspace allowed in Davidson
Definition diago_david.h:154
typename GetTypeReal< T >::type Real
Definition diago_david.h:35
const T * neg_one
Definition diago_david.h:345
int test_david
Definition diago_david.h:143
typename ct::PsiToContainer< Device >::type ct_Device
Definition diago_david.h:342
void cal_elem(const int &dim, int &nbase, const int nbase_x, const int &notconv, const T *hpsi, const T *spsi, T *hcc)
Definition diago_david.cpp:579
const int nband
number of required eigenpairs
Definition diago_david.h:148
int notconv
number of unconverged eigenvalues
Definition diago_david.h:156
std::function< void(T *, T *, const int, const int)> SPsiFunc
A function type representing the SX function.
Definition diago_david.h:108
const T one_
Definition diago_david.h:346
base_device::DEVICE_CPU * cpu_ctx
Definition diago_david.h:179
Device * ctx
device type of psi
Definition diago_david.h:178
const Real * precondition
precondition for diag, diagonal approximation of matrix A(i.e. Hamilt)
Definition diago_david.h:159
base_device::AbacusDevice_t device
Definition diago_david.h:180
diag_comm_info diag_comm
Definition diago_david.h:145
std::function< void(T *, T *, const int, const int)> HPsiFunc
A function type representing the HX function.
Definition diago_david.h:92
#define T
Definition exp.cpp:237
AbacusDevice_t
Definition types.h:12
Definition diag_comm_info.h:9
T type
Definition macros.h:8
Definition memory_op.h:99
Definition memory_op.h:115
Definition memory_op.h:17
Definition memory_op.h:31
Definition tensor_types.h:113
Definition diag_comm_info.h:12