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;
91 std::vector<double> ethr_band(nband, diag_ethr);
93 dim,
psi, eigenvalue.data(), ethr_band, maxiter, ntry_max, 0));
95 else if (method ==
"dav_subspace")
107 std::vector<double> ethr_band(nband, diag_ethr);
109 dav_subspace.
diag(hpsi_func, spsi_func,
psi, dim, eigenvalue.data(), ethr_band,
false ));
111 else if (method ==
"cg")
143 std::vector<Real<T>> precondition_(precondition);
150 std::vector<double> ethr_band(nband, diag_ethr);
151 cg.
diag(hpsi_func, spsi_func, psi_tensor, eigen_tensor, ethr_band, precon_tensor);
153 else {
throw std::runtime_error(
"HSolverLR::solve: method not implemented"); }
157 for (
int ist = 0;ist < nband;++ist) { eig[ist] = eigenvalue[ist]; }
const Input_para & inp
Definition parameter.h:26
A multi-dimensional reference array of elements of a single data type.
Definition tensor_map.h:19
A class for representing the shape of a tensor.
Definition tensor_shape.h:13
int64_t dim_size(int dim) const
Get the size of a dimension in the tensor.
Definition tensor_shape.cpp:31
A multi-dimensional array of elements of a single data type.
Definition tensor.h:32
void * data() const
Get a pointer to the data buffer of the tensor.
Definition tensor.cpp:73
int64_t NumElements() const
Get the total number of elements in the tensor.
Definition tensor.cpp:70
const TensorShape & shape() const
Get the shape of the tensor.
Definition tensor.cpp:67
void diag(const Func &hpsi_func, const Func &spsi_func, ct::Tensor &psi, ct::Tensor &eigen, const std::vector< double > ðr_band, const ct::Tensor &prec={})
Definition diago_cg.cpp:578
A class that implements the block-Davidson algorithm for solving generalized eigenvalue problems.
Definition diago_david.h:27
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:967
Definition diago_iter_assist.h:14
Definition diago_dav_subspace.h:19
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:824
#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:37
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
Template struct for mapping a DataType to its corresponding enum value.
Definition tensor_types.h:194
Definition diag_comm_info.h:12