19 inline void print_eigs(
const std::vector<T>& eigs,
const std::string& label =
"",
const double factor = 1.0)
21 std::cout << label << std::endl;
22 for (
auto& e : eigs) { std::cout << e * factor <<
" "; }
23 std::cout << std::endl;
27 template<
typename T,
typename THamilt>
33 const std::string method,
35 const std::vector<
Real<T>>& precondition,
36 const bool hermitian =
true)
39 const std::vector<std::string> spin_types = {
"singlet",
"triplet" };
44 std::vector<Real<T>> eigenvalue(nband);
52 if (method ==
"lapack")
54 std::vector<T> Amat_full = hm.matrix();
55 const int gdim = std::sqrt(Amat_full.size());
56 eigenvalue.resize(gdim);
60 std::vector<std::complex<double>> eig_complex(gdim);
62 print_eigs(eig_complex,
"Right eigenvalues: of the non-Hermitian matrix: (Ry)");
63 for (
int i = 0;
i < gdim;
i++) { eigenvalue[
i] = eig_complex[
i].real(); }
66 hm.global2local(
psi, Amat_full.data(), nband);
73 auto hpsi_func = [&hm](
T* psi_in,
T* hpsi,
const int ld_psi,
const int nvec) {hm.hPsi(psi_in, hpsi, ld_psi, nvec);};
74 auto spsi_func = [&hm](
const T* psi_in,
T* spsi,
const int ld_psi,
const int nvec)
75 { std::memcpy(spsi, psi_in,
sizeof(
T) * ld_psi * nvec); };
80 const int ntry_max = 5;
90 std::vector<double> ethr_band(nband, diag_ethr);
92 dim,
psi, eigenvalue.data(), ethr_band, maxiter, ntry_max, 0));
94 else if (method ==
"dav_subspace")
105 std::vector<double> ethr_band(nband, diag_ethr);
107 dav_subspace.
diag(hpsi_func, spsi_func,
psi, dim, eigenvalue.data(), ethr_band,
false ));
109 else if (method ==
"cg")
136 auto subspace_func = [](
T* psi_in,
T* psi_out,
const int ld_psi,
const int nband,
const bool S_orth) {
140 auto hpsi_func = [&hm](
T* psi_in,
T* hpsi,
const int ld_psi,
const int nvec) {
141 hm.hPsi(psi_in, hpsi, ld_psi, nvec);
143 auto spsi_func = [](
T* psi_in,
T* spsi,
const int ld_psi,
const int nvec) {
144 std::memcpy(spsi, psi_in,
sizeof(
T) *
static_cast<size_t>(ld_psi) *
static_cast<size_t>(nvec));
147 std::vector<double> ethr_band(nband, diag_ethr);
156 precondition.data());
158 else {
throw std::runtime_error(
"HSolverLR::solve: method not implemented"); }
162 for (
int ist = 0;ist < nband;++ist) { eig[ist] = eigenvalue[ist]; }
186 <<
"; current threshold: " << diag_ethr << std::endl;
const std::complex< double > i
Definition cal_pLpR.cpp:46
const Input_para & inp
Definition parameter.h:26
double diag(const HPsiFunc &hpsi_func, const SPsiFunc &spsi_func, const int ld_psi, const int nband, const int dim, T *psi_in, Real *eigenvalue_in, const std::vector< double > ðr_band, const Real *prec=nullptr)
Definition diago_cg.cpp:582
A class that implements the block-Davidson algorithm for solving generalized eigenvalue problems.
Definition diago_david.h:30
int diag(const HPsiFunc &hpsi_func, const SPsiFunc &spsi_func, const int ld_psi, T *psi_in, Real *eigenvalue_in, const std::vector< double > ðr_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
Definition diago_iter_assist.h:16
Definition diago_dav_subspace.h:20
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 > ðr_band, const bool &scf_type)
Definition diago_dav_subspace.cpp:815
#define T
Definition exp.cpp:237
int NPROC_IN_POOL
local number of process in a pool
Definition global_variable.cpp:24
int RANK_IN_POOL
global index of pool (count in process), my_rank in each pool
Definition global_variable.cpp:26
void print_eigs(const std::vector< T > &eigs, const std::string &label="", const double factor=1.0)
Definition hsolver_lrtd.hpp:19
void solve(const THamilt &hm, T *psi, const int &dim, const int &nband, double *eig, const std::string method, const Real< T > &diag_ethr, const std::vector< Real< T > > &precondition, const bool hermitian=true)
eigensolver for common Hamilt
Definition hsolver_lrtd.hpp:28
void diag_lapack(const int &n, double *mat, double *eig)
diagonalize a hermitian matrix
Definition lr_util.cpp:118
void diag_lapack_nh(const int &n, double *mat, std::complex< double > *eig)
diagonalize a general matrix
Definition lr_util.cpp:147
Definition esolver_ks_lcao.h:20
typename GetTypeReal< T >::type Real
Definition hsolver_lrtd.hpp:14
const double Ry_to_eV
Definition constants.h:81
void TITLE(const std::string &class_name, const std::string &function_name, const bool disable)
Definition tool_title.cpp:18
MPI_Comm POOL_WORLD
Definition parallel_comm.cpp:6
Parameter PARAM
Definition parameter.cpp:3
T type
Definition macros.h:8
Definition diag_comm_info.h:12