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
9
10#include <vector>
11#include <functional>
12
13namespace hsolver
14{
25template <typename T = std::complex<double>, typename Device = base_device::DEVICE_CPU>
27{
28 private:
29 // Note GetTypeReal<T>::type will
30 // return T if T is real type(float, double),
31 // otherwise return the real type of T(complex<float>, std::complex<double>)
32 using Real = typename GetTypeReal<T>::type;
33
34 public:
35
53 DiagoDavid(const Real* precondition_in,
54 const int nband_in,
55 const int dim_in,
56 const int david_ndim_in,
57 const bool use_paw_in,
58 const diag_comm_info& diag_comm_in);
59
68
69
70 // declare type of matrix-blockvector functions.
71 // the function type is defined as a std::function object.
91 using HPsiFunc = std::function<void(T*, T*, const int, const int)>;
92
107 using SPsiFunc = std::function<void(T*, T*, const int, const int)>;
108
130 int diag(
131 const HPsiFunc& hpsi_func, // function void hpsi(T*, T*, const int, const int)
132 const SPsiFunc& spsi_func, // function void spsi(T*, T*, const int, const int, const int)
133 const int ld_psi, // Leading dimension of the psi input
134 T *psi_in, // Pointer to eigenvectors
135 Real* eigenvalue_in, // Pointer to store the resulting eigenvalues
136 const std::vector<double>& ethr_band, // Convergence threshold for the Davidson iteration
137 const int david_maxiter, // Maximum allowed iterations for the Davidson method
138 const int ntry_max = 5, // Maximum number of diagonalization attempts (5 by default)
139 const int notconv_max = 0); // Maximum number of allowed non-converged eigenvectors
140
141 private:
142 bool use_paw = false;
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 // using hpsi_info = typename hamilt::Operator<T, Device>::hpsi_info; // Dependence of hpsi removed
342
343 const T *one = nullptr, *zero = nullptr, *neg_one = nullptr;
344 const T one_ = static_cast<T>(1.0), zero_ = static_cast<T>(0.0), neg_one_ = static_cast<T>(-1.0);
345};
346} // namespace hsolver
347
348#endif
A class that implements the block-Davidson algorithm for solving generalized eigenvalue problems.
Definition diago_david.h:27
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:998
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:343
~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:967
const T zero_
Definition diago_david.h:344
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
bool use_paw
Definition diago_david.h:142
const T * zero
Definition diago_david.h:343
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:903
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:777
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:655
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:606
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:344
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:32
const T * neg_one
Definition diago_david.h:343
int test_david
Definition diago_david.h:143
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:527
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:107
const T one_
Definition diago_david.h:344
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:91
#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:61
Definition memory_op.h:77
Definition memory_op.h:17
Definition memory_op.h:31
Definition diag_comm_info.h:12