ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
diago_dav_subspace.h
Go to the documentation of this file.
1#ifndef DIAGO_NEW_DAV_H
2#define DIAGO_NEW_DAV_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
12
13#include <vector>
14#include <functional>
15
16namespace hsolver
17{
18
19template <typename T = std::complex<double>, typename Device = base_device::DEVICE_CPU>
21{
22 private:
23 // Note GetTypeReal<T>::type will
24 // return T if T is real type(float, double),
25 // otherwise return the real type of T(complex<float>, std::complex<double>)
26 using Real = typename GetTypeReal<T>::type;
27
28 public:
29 Diago_DavSubspace(const std::vector<Real>& precondition_in,
30 const int& nband_in,
31 const int& nbasis_in,
32 const int& david_ndim_in,
33 const double& diag_thr_in,
34 const int& diag_nmax_in,
35 const diag_comm_info& diag_comm_in,
36 const int diago_dav_method_in,
37 const int block_size_in);
38
40
41 // See diago_david.h for information on the HPsiFunc function type
42 using HPsiFunc = std::function<void(T*, T*, const int, const int)>;
43
44 int diag(const HPsiFunc& hpsi_func,
45 const HPsiFunc& spsi_func,
46 T* psi_in,
47 const int psi_in_dmax,
48 Real* eigenvalue_in,
49 const std::vector<double>& ethr_band,
50 const bool& scf_type);
51
52 private:
55
57 const double diag_thr;
58
60 const int iter_nmax;
61
63 const int n_band = 0;
64
66 const int dim = 0;
67
69 const int nbase_x = 0;
70
72 const std::vector<Real>& precondition;
73 Real* d_precondition = nullptr;
74
76 int notconv = 0;
77
78 T* psi_in_iter = nullptr;
79
81 T* hpsi = nullptr;
82
84 T* spsi = nullptr;
85
87 T* hcc = nullptr;
88
90 T* scc = nullptr;
91
93 T* vcc = nullptr;
94
95 T* d_scc = nullptr;
96 Real* d_eigenvalue = nullptr;
97
99 Device* ctx = {};
100 base_device::DEVICE_CPU* cpu_ctx = {};
102
103 void cal_grad(const HPsiFunc& hpsi_func,
104 const HPsiFunc& spsi_func,
105 const int& dim,
106 const int& nbase,
107 const int& notconv,
108 T* psi_iter,
109 T* hpsi,
110 T* spsi,
111 T* vcc,
112 const int* unconv,
113 std::vector<Real>* eigenvalue_iter);
114
115 void cal_elem(const int& dim,
116 int& nbase,
117 const int& notconv,
118 const T* psi_iter,
119 const T* spsi,
120 const T* hpsi,
121 T* hcc,
122 T* scc);
123
124 void refresh(const int& dim,
125 const int& nband,
126 int& nbase,
127 const Real* eigenvalue,
128 T* psi_iter,
129 T* hpsi,
130 T* spsi,
131 T* hcc,
132 T* scc,
133 T* vcc);
134
135 // void diagH_LAPACK(const int nstart,
136 // const int nbands,
137 // const T* hcc,
138 // const T* sc,
139 // const int ldh, // nstart
140 // Real* e,
141 // T* vcc);
142
143 void diag_zhegvx(const int& nbase,
144 const int& nband,
145 T* hcc,
146 T* scc,
147 const int& nbase_x,
148 std::vector<Real>* eigenvalue_iter,
149 T* vcc);
150
151 int diag_once(const HPsiFunc& hpsi_func,
152 const HPsiFunc& spsi_func,
153 T* psi_in,
154 const int psi_in_dmax,
155 Real* eigenvalue_in,
156 const std::vector<double>& ethr_band);
157
158 bool test_exit_cond(const int& ntry, const int& notconv, const bool& scf);
159
160 int diag_subspace; // 0: LAPACK, 1: Gen-ELPA, 2: ScaLAPACK
161 int diago_subspace_bs = 0; // the block size in 2d block cyclic distribution if use elpa or scalapack
162
163#ifdef __DSP
164 using resmem_complex_op = base_device::memory::resize_memory_op_mt<T, Device>;
165 using delmem_complex_op = base_device::memory::delete_memory_op_mt<T, Device>;
166#else
169#endif
171
172#ifdef __DSP
173 using resmem_real_op = base_device::memory::resize_memory_op_mt<Real, Device>;
174 using delmem_real_op = base_device::memory::delete_memory_op_mt<Real, Device>;
175#else
178#endif
181
185
193
194 // Note that ct_Device is different from base_device!
196 // using hegvd_op = container::kernels::lapack_hegvd<T, ct_Device>;
197
198 const T *one = nullptr, *zero = nullptr, *neg_one = nullptr;
199 const T one_ = static_cast<T>(1.0), zero_ = static_cast<T>(0.0), neg_one_ = static_cast<T>(-1.0);
200};
201
202} // namespace hsolver
203
204#endif
Definition diago_dav_subspace.h:21
void cal_elem(const int &dim, int &nbase, const int &notconv, const T *psi_iter, const T *spsi, const T *hpsi, T *hcc, T *scc)
Definition diago_dav_subspace.cpp:405
const T zero_
Definition diago_dav_subspace.h:199
const T neg_one_
Definition diago_dav_subspace.h:199
base_device::AbacusDevice_t device
Definition diago_dav_subspace.h:101
std::function< void(T *, T *, const int, const int)> HPsiFunc
Definition diago_dav_subspace.h:42
const double diag_thr
the threshold for this electronic iteration
Definition diago_dav_subspace.h:57
Real * d_precondition
Definition diago_dav_subspace.h:73
void cal_grad(const HPsiFunc &hpsi_func, const HPsiFunc &spsi_func, const int &dim, const int &nbase, const int &notconv, T *psi_iter, T *hpsi, T *spsi, T *vcc, const int *unconv, std::vector< Real > *eigenvalue_iter)
Definition diago_dav_subspace.cpp:275
int diag_once(const HPsiFunc &hpsi_func, const HPsiFunc &spsi_func, T *psi_in, const int psi_in_dmax, Real *eigenvalue_in, const std::vector< double > &ethr_band)
Definition diago_dav_subspace.cpp:109
const diag_comm_info diag_comm
for MPI communication
Definition diago_dav_subspace.h:54
const int n_band
the first dimension of the matrix to be diagonalized
Definition diago_dav_subspace.h:63
~Diago_DavSubspace()
Definition diago_dav_subspace.cpp:88
T * hpsi
the product of H and psi in the reduced basis set
Definition diago_dav_subspace.h:81
T * vcc
Eigenvectors on the reduced basis.
Definition diago_dav_subspace.h:93
T * psi_in_iter
Definition diago_dav_subspace.h:78
typename GetTypeReal< T >::type Real
Definition diago_dav_subspace.h:26
const T * zero
Definition diago_dav_subspace.h:198
Real * d_eigenvalue
Definition diago_dav_subspace.h:96
const T * one
Definition diago_dav_subspace.h:198
const int nbase_x
the maximum dimension of the reduced basis set
Definition diago_dav_subspace.h:69
const std::vector< Real > & precondition
precondition for diag
Definition diago_dav_subspace.h:72
T * hcc
Hamiltonian on the reduced basis.
Definition diago_dav_subspace.h:87
void refresh(const int &dim, const int &nband, int &nbase, const Real *eigenvalue, T *psi_iter, T *hpsi, T *spsi, T *hcc, T *scc, T *vcc)
Definition diago_dav_subspace.cpp:658
typename ct::PsiToContainer< Device >::type ct_Device
Definition diago_dav_subspace.h:195
int diag(const HPsiFunc &hpsi_func, const HPsiFunc &spsi_func, T *psi_in, const int psi_in_dmax, Real *eigenvalue_in, const std::vector< double > &ethr_band, const bool &scf_type)
Definition diago_dav_subspace.cpp:742
T * scc
Overlap on the reduced basis.
Definition diago_dav_subspace.h:90
T * d_scc
Definition diago_dav_subspace.h:95
base_device::DEVICE_CPU * cpu_ctx
Definition diago_dav_subspace.h:100
T * spsi
the product of S and psi in the reduced basis set
Definition diago_dav_subspace.h:84
Device * ctx
device type of psi
Definition diago_dav_subspace.h:99
const T * neg_one
Definition diago_dav_subspace.h:198
int diago_subspace_bs
Definition diago_dav_subspace.h:161
int notconv
record for how many bands not have convergence eigenvalues
Definition diago_dav_subspace.h:76
int diag_subspace
Definition diago_dav_subspace.h:160
const T one_
Definition diago_dav_subspace.h:199
bool test_exit_cond(const int &ntry, const int &notconv, const bool &scf)
Definition diago_dav_subspace.cpp:775
void diag_zhegvx(const int &nbase, const int &nband, T *hcc, T *scc, const int &nbase_x, std::vector< Real > *eigenvalue_iter, T *vcc)
Definition diago_dav_subspace.cpp:529
const int iter_nmax
maximal iteration number
Definition diago_dav_subspace.h:60
const int dim
the second dimension of the matrix to be diagonalized
Definition diago_dav_subspace.h:66
#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:45
Definition memory_op.h:31
Definition tensor_types.h:113
Definition diag_comm_info.h:12