31 this->
gk2 =
new double[3];
32 this->
npwk =
new int[1];
43 this->
gk2[igl] = (ik + igl) * 1.5;
44 return this->
gk2[igl];
57template <
typename T,
typename Device>
59 const std::string& calculation) {
60 basis_type_ = basis_type;
61 calculation_ = calculation;
62 this->one_ =
new T(
static_cast<T>(1.0));
63 this->zero_ =
new T(
static_cast<T>(0.0));
64 this->neg_one_ =
new T(
static_cast<T>(-1.0));
67template <
typename T,
typename Device>
69 const std::string& calculation,
70 const bool& need_subspace,
71 const SubspaceFunc& subspace_func,
72 const Real& pw_diag_thr,
73 const int& pw_diag_nmax,
75 basis_type_ = basis_type;
76 calculation_ = calculation;
77 need_subspace_ = need_subspace;
78 subspace_func_ = subspace_func;
79 pw_diag_thr_ = pw_diag_thr;
80 pw_diag_nmax_ = pw_diag_nmax;
82 this->one_ =
new T(
static_cast<T>(1.0));
83 this->zero_ =
new T(
static_cast<T>(0.0));
84 this->neg_one_ =
new T(
static_cast<T>(-1.0));
87template <
typename T,
typename Device>
91 delete this->neg_one_;
94template <
typename T,
typename Device>
96 const SPsiFunc& spsi_func,
102 const std::vector<double>& ethr_band,
105 for (
int ib = 0; ib < nband; ib++) {
106 eigenvalue_in[ib] = 0.0;
107 T* psi_band = psi_in +
static_cast<size_t>(ib) *
static_cast<size_t>(ld_psi);
108 for (
int ig = 0; ig < ld_psi; ig++) {
109 psi_band[ig] +=
T(2.0, 0.0);
110 eigenvalue_in[ib] += psi_band[ig].real();
112 eigenvalue_in[ib] /= ld_psi;
118template class DiagoCG<std::complex<float>, base_device::DEVICE_CPU>;
119template class DiagoCG<std::complex<double>, base_device::DEVICE_CPU>;
121template <
typename T,
typename Device>
125 const int david_ndim_in,
126 const diag_comm_info& diag_comm_in)
127 : nband(nband_in),
dim(dim_in), nbase_x(david_ndim_in * nband_in), david_ndim(david_ndim_in), diag_comm(diag_comm_in) {
129 this->precondition = precondition_in;
138template <
typename T,
typename Device>
139DiagoDavid<T, Device>::~DiagoDavid() {
140 delmem_complex_op()(this->hpsi);
141 delmem_complex_op()(this->spsi);
142 delmem_complex_op()(this->hcc);
143 delmem_complex_op()(this->vcc);
144 delmem_complex_op()(this->lagrange_matrix);
148template <
typename T,
typename Device>
149int DiagoDavid<T, Device>::diag(
const std::function<
void(
T*,
T*,
const int,
const int)>& hpsi_func,
150 const std::function<
void(
T*,
T*,
const int,
const int)>& spsi_func,
154 const std::vector<double>& ethr_band,
155 const int david_maxiter,
157 const int notconv_max) {
171template class DiagoDavid<std::complex<float>, base_device::DEVICE_CPU>;
172template class DiagoDavid<std::complex<double>, base_device::DEVICE_CPU>;
174template class DiagoIterAssist<std::complex<float>, base_device::DEVICE_CPU>;
175template class DiagoIterAssist<std::complex<double>, base_device::DEVICE_CPU>;
3x3 matrix and related mathamatical operations
Definition matrix3.h:19
PW_Basis_K()
Definition pw_basis_k.cpp:12
int npwk_max
Definition pw_basis_k.h:78
~PW_Basis_K()
Definition pw_basis_k.cpp:17
double & getgk2(const int ik, const int igl) const
Definition pw_basis_k.cpp:380
int * npwk
Definition pw_basis_k.h:77
double * gk2
[npw] map ig to ixyz,which is used in dsp fft.
Definition pw_basis_k.h:90
int nks
Definition pw_basis_k.h:74
PW_Basis()
Definition pw_basis.cpp:11
virtual void distribute_r()
distribute real-space grids to different processors
Definition pw_distributer.cpp:11
virtual void initgrids(const double lat0_in, const ModuleBase::Matrix3 latvec_in, const double gridecut)
Definition pw_init.cpp:23
double tpiba2
4pi^2/lat0^2
Definition pw_basis.h:173
virtual ~PW_Basis()
Definition pw_basis.cpp:23
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
DiagoCG(const std::string &basis_type, const std::string &calculation)
Definition diago_cg.cpp:18
~DiagoCG()
Definition diago_cg.cpp:49
DiagoDavid(const Real *precondition_in, const int nband_in, const int dim_in, const int david_ndim_in, const diag_comm_info &diag_comm_in)
Constructor for the DiagoDavid class.
Definition diago_david.cpp:16
static Real avg_iter
average steps of last cg diagonalization for each band.
Definition diago_iter_assist.h:28
#define T
Definition exp.cpp:237
int dim
Definition ions_move_basic.cpp:8
AbacusDevice_t get_device_type(const Device *dev)
Get the device type enum for a given device type (compile-time version).
Definition device_helpers.h:31
Definition diag_comm_info.h:9
Definition memory_op.h:115
int nproc_in_pool
Definition pw_test.cpp:12