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
56 DiagoDavid(const Real* precondition_in,
57 const int nband_in,
58 const int dim_in,
59 const int david_ndim_in,
60 const bool use_paw_in,
61 const diag_comm_info& diag_comm_in);
62
71
72
73 // declare type of matrix-blockvector functions.
74 // the function type is defined as a std::function object.
94 using HPsiFunc = std::function<void(T*, T*, const int, const int)>;
95
110 using SPsiFunc = std::function<void(T*, T*, const int, const int)>;
111
133 int diag(
134 const HPsiFunc& hpsi_func, // function void hpsi(T*, T*, const int, const int)
135 const SPsiFunc& spsi_func, // function void spsi(T*, T*, const int, const int, const int)
136 const int ld_psi, // Leading dimension of the psi input
137 T *psi_in, // Pointer to eigenvectors
138 Real* eigenvalue_in, // Pointer to store the resulting eigenvalues
139 const std::vector<double>& ethr_band, // Convergence threshold for the Davidson iteration
140 const int david_maxiter, // Maximum allowed iterations for the Davidson method
141 const int ntry_max = 5, // Maximum number of diagonalization attempts (5 by default)
142 const int notconv_max = 0); // Maximum number of allowed non-converged eigenvectors
143
144 private:
145 bool use_paw = false;
146 int test_david = 0;
147
149
151 const int nband;
153 const int dim;
155 const int nbase_x;
157 const int david_ndim = 4;
159 int notconv = 0;
160
162 const Real* precondition = nullptr;
164
166 Real* eigenvalue = nullptr;
167
168 T *basis = nullptr;
169
170 T* hpsi = nullptr;
171
172 T* spsi = nullptr;
173
174 T* hcc = nullptr;
175
176 T* vcc = nullptr;
177
178 T* lagrange_matrix = nullptr;
179
181 Device* ctx = {};
182 base_device::DEVICE_CPU* cpu_ctx = {};
184
185 int diag_once(const HPsiFunc& hpsi_func,
186 const SPsiFunc& spsi_func,
187 const int dim,
188 const int nband,
189 const int ld_psi,
190 T *psi_in,
191 Real* eigenvalue_in,
192 const std::vector<double>& ethr_band,
193 const int david_maxiter);
194
210 void cal_grad(const HPsiFunc& hpsi_func,
211 const SPsiFunc& spsi_func,
212 const int& dim,
213 const int& nbase,
214 const int nbase_x,
215 const int& notconv,
216 T* hpsi,
217 T* spsi,
218 const T* vcc,
219 const int* unconv,
220 const Real* eigenvalue);
221
233 void cal_elem(const int& dim,
234 int& nbase,
235 const int nbase_x,
236 const int& notconv,
237 const T* hpsi,
238 const T* spsi,
239 T* hcc);
240
257 void refresh(const int& dim,
258 const int& nband,
259 int& nbase,
260 const int nbase_x,
261 const Real* eigenvalue,
262 const T *psi_in,
263 const int ld_psi,
264 T* hpsi,
265 T* spsi,
266 T* hcc,
267 T* vcc);
268
282 void SchmidtOrth(const int& dim,
283 const int nband,
284 const int m,
285 const T* spsi,
286 T* lagrange_m,
287 const int mm_size,
288 const int mv_size);
289
299 void planSchmidtOrth(const int nband, std::vector<int>& pre_matrix_mm_m, std::vector<int>& pre_matrix_mv_m);
300
301 void diag_zhegvx(const int& nbase,
302 const int& nband,
303 const T* hcc,
304 const int& nbase_x,
306 T* vcc);
307
328 bool check_block_conv(const int &ntry, const int &notconv, const int &ntry_max, const int &notconv_max);
329
336
343
344 // Note that ct_Device is different from base_device!
346 // using hpsi_info = typename hamilt::Operator<T, Device>::hpsi_info; // Dependence of hpsi removed
347
348 const T *one = nullptr, *zero = nullptr, *neg_one = nullptr;
349 const T one_ = static_cast<T>(1.0), zero_ = static_cast<T>(0.0), neg_one_ = static_cast<T>(-1.0);
350};
351} // namespace hsolver
352
353#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:174
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:1000
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:348
~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:969
const T zero_
Definition diago_david.h:349
const int nbase_x
maximum dimension of the reduced basis set
Definition diago_david.h:155
Real * eigenvalue
eigenvalue results
Definition diago_david.h:166
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:145
const T * zero
Definition diago_david.h:348
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:905
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:779
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:657
T * vcc
Hamiltonian on the reduced basis.
Definition diago_david.h:176
T * lagrange_matrix
eigenvectors of hc
Definition diago_david.h:178
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:170
const T neg_one_
Definition diago_david.h:349
T * spsi
the product of H and psi in the reduced basis set
Definition diago_david.h:172
Real * d_precondition
Definition diago_david.h:163
const int dim
dimension of the input matrix to be diagonalized
Definition diago_david.h:153
T * basis
Definition diago_david.h:168
const int david_ndim
dimension of the subspace allowed in Davidson
Definition diago_david.h:157
typename GetTypeReal< T >::type Real
Definition diago_david.h:35
const T * neg_one
Definition diago_david.h:348
int test_david
Definition diago_david.h:146
typename ct::PsiToContainer< Device >::type ct_Device
Definition diago_david.h:345
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:151
int notconv
number of unconverged eigenvalues
Definition diago_david.h:159
std::function< void(T *, T *, const int, const int)> SPsiFunc
A function type representing the SX function.
Definition diago_david.h:110
const T one_
Definition diago_david.h:349
base_device::DEVICE_CPU * cpu_ctx
Definition diago_david.h:182
Device * ctx
device type of psi
Definition diago_david.h:181
const Real * precondition
precondition for diag, diagonal approximation of matrix A(i.e. Hamilt)
Definition diago_david.h:162
base_device::AbacusDevice_t device
Definition diago_david.h:183
diag_comm_info diag_comm
Definition diago_david.h:148
std::function< void(T *, T *, const int, const int)> HPsiFunc
A function type representing the HX function.
Definition diago_david.h:94
#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