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
10
11#include <vector>
12#include <functional>
13
14namespace hsolver
15{
16
17template <typename T = std::complex<double>, typename Device = base_device::DEVICE_CPU>
19{
20 private:
21 // Note GetTypeReal<T>::type will
22 // return T if T is real type(float, double),
23 // otherwise return the real type of T(complex<float>, std::complex<double>)
24 using Real = typename GetTypeReal<T>::type;
25
26 public:
27 Diago_DavSubspace(const std::vector<Real>& precondition_in,
28 const int& nband_in,
29 const int& nbasis_in,
30 const int& david_ndim_in,
31 const double& diag_thr_in,
32 const int& diag_nmax_in,
33 const bool& need_subspace_in,
34 const diag_comm_info& diag_comm_in,
35 const int diago_dav_method_in,
36 const int block_size_in);
37
39
40 // See diago_david.h for information on the HPsiFunc function type
41 using HPsiFunc = std::function<void(T*, T*, const int, const int)>;
42
43 int diag(const HPsiFunc& hpsi_func,
44 const HPsiFunc& spsi_func,
45 T* psi_in,
46 const int psi_in_dmax,
47 Real* eigenvalue_in,
48 const std::vector<double>& ethr_band,
49 const bool& scf_type);
50
51 private:
54
56 const double diag_thr;
57
59 const int iter_nmax;
60
62 const bool is_subspace;
63
65 const int n_band = 0;
66
68 const int dim = 0;
69
71 const int nbase_x = 0;
72
74 const std::vector<Real>& precondition;
75 Real* d_precondition = nullptr;
76
78 int notconv = 0;
79
80 T* psi_in_iter = nullptr;
81
83 T* hphi = nullptr;
84
86 T* sphi = nullptr;
87
89 T* hcc = nullptr;
90
92 T* scc = nullptr;
93
95 T* vcc = nullptr;
96
98 Device* ctx = {};
99 base_device::DEVICE_CPU* cpu_ctx = {};
101
102 void cal_grad(const HPsiFunc& hpsi_func,
103 const HPsiFunc& spsi_func,
104 const int& dim,
105 const int& nbase,
106 const int& notconv,
107 T* psi_iter,
108 T* hphi,
109 T* spsi,
110 T* vcc,
111 const int* unconv,
112 std::vector<Real>* eigenvalue_iter);
113
114 void cal_elem(const int& dim,
115 int& nbase,
116 const int& notconv,
117 const T* psi_iter,
118 const T* sphi,
119 const T* hphi,
120 T* hcc,
121 T* scc);
122
123 void refresh(const int& dim,
124 const int& nband,
125 int& nbase,
126 const Real* eigenvalue,
127 T* psi_iter,
128 T* hphi,
129 T* sphi,
130 T* hcc,
131 T* scc,
132 T* vcc);
133
134 // void diagH_LAPACK(const int nstart,
135 // const int nbands,
136 // const T* hcc,
137 // const T* sc,
138 // const int ldh, // nstart
139 // Real* e,
140 // T* vcc);
141
142 void diag_zhegvx(const int& nbase,
143 const int& nband,
144 T* hcc,
145 T* scc,
146 const int& nbase_x,
147 std::vector<Real>* eigenvalue_iter,
148 T* vcc);
149
150 int diag_once(const HPsiFunc& hpsi_func,
151 const HPsiFunc& spsi_func,
152 T* psi_in,
153 const int psi_in_dmax,
154 Real* eigenvalue_in,
155 const std::vector<double>& ethr_band);
156
157 bool test_exit_cond(const int& ntry, const int& notconv, const bool& scf);
158
159 int diag_subspace; // 0: LAPACK, 1: Gen-ELPA, 2: ScaLAPACK
160 int diago_subspace_bs = 0; // the block size in 2d block cyclic distribution if use elpa or scalapack
161
162#ifdef __DSP
163 using resmem_complex_op = base_device::memory::resize_memory_op_mt<T, Device>;
164 using delmem_complex_op = base_device::memory::delete_memory_op_mt<T, Device>;
165#else
168#endif
170
171#ifdef __DSP
172 using resmem_real_op = base_device::memory::resize_memory_op_mt<Real, Device>;
173 using delmem_real_op = base_device::memory::delete_memory_op_mt<Real, Device>;
174#else
177#endif
179
183
190
191 const T *one = nullptr, *zero = nullptr, *neg_one = nullptr;
192 const T one_ = static_cast<T>(1.0), zero_ = static_cast<T>(0.0), neg_one_ = static_cast<T>(-1.0);
193};
194
195} // namespace hsolver
196
197#endif
Definition diago_dav_subspace.h:19
const T zero_
Definition diago_dav_subspace.h:192
const T neg_one_
Definition diago_dav_subspace.h:192
void refresh(const int &dim, const int &nband, int &nbase, const Real *eigenvalue, T *psi_iter, T *hphi, T *sphi, T *hcc, T *scc, T *vcc)
Definition diago_dav_subspace.cpp:705
base_device::AbacusDevice_t device
Definition diago_dav_subspace.h:100
std::function< void(T *, T *, const int, const int)> HPsiFunc
Definition diago_dav_subspace.h:41
const double diag_thr
the threshold for this electronic iteration
Definition diago_dav_subspace.h:56
void cal_elem(const int &dim, int &nbase, const int &notconv, const T *psi_iter, const T *sphi, const T *hphi, T *hcc, T *scc)
Definition diago_dav_subspace.cpp:427
Real * d_precondition
Definition diago_dav_subspace.h:75
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:102
const diag_comm_info diag_comm
for MPI communication
Definition diago_dav_subspace.h:53
void cal_grad(const HPsiFunc &hpsi_func, const HPsiFunc &spsi_func, const int &dim, const int &nbase, const int &notconv, T *psi_iter, T *hphi, T *spsi, T *vcc, const int *unconv, std::vector< Real > *eigenvalue_iter)
Definition diago_dav_subspace.cpp:276
const int n_band
the first dimension of the matrix to be diagonalized
Definition diago_dav_subspace.h:65
~Diago_DavSubspace()
Definition diago_dav_subspace.cpp:84
T * vcc
Eigenvectors on the reduced basis.
Definition diago_dav_subspace.h:95
T * psi_in_iter
Definition diago_dav_subspace.h:80
typename GetTypeReal< T >::type Real
Definition diago_dav_subspace.h:24
const T * zero
Definition diago_dav_subspace.h:191
const T * one
Definition diago_dav_subspace.h:191
const int nbase_x
the maximum dimension of the reduced basis set
Definition diago_dav_subspace.h:71
const std::vector< Real > & precondition
precondition for diag
Definition diago_dav_subspace.h:74
T * hphi
the product of H and psi in the reduced basis set
Definition diago_dav_subspace.h:83
T * hcc
Hamiltonian on the reduced basis.
Definition diago_dav_subspace.h:89
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:824
T * scc
Overlap on the reduced basis.
Definition diago_dav_subspace.h:92
base_device::DEVICE_CPU * cpu_ctx
Definition diago_dav_subspace.h:99
Device * ctx
device type of psi
Definition diago_dav_subspace.h:98
const T * neg_one
Definition diago_dav_subspace.h:191
int diago_subspace_bs
Definition diago_dav_subspace.h:160
int notconv
record for how many bands not have convergence eigenvalues
Definition diago_dav_subspace.h:78
int diag_subspace
Definition diago_dav_subspace.h:159
const T one_
Definition diago_dav_subspace.h:192
bool test_exit_cond(const int &ntry, const int &notconv, const bool &scf)
Definition diago_dav_subspace.cpp:857
const bool is_subspace
is diagH_subspace needed?
Definition diago_dav_subspace.h:62
T * sphi
the product of S and psi in the reduced basis set
Definition diago_dav_subspace.h:86
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:551
const int iter_nmax
maximal iteration number
Definition diago_dav_subspace.h:59
const int dim
the second dimension of the matrix to be diagonalized
Definition diago_dav_subspace.h:68
#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