ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
operator_lr_diag.h
Go to the documentation of this file.
1#pragma once
5#ifdef __MPI
7#endif
8namespace LR
9{
11 template<typename T = double, typename Device = base_device::DEVICE_CPU>
12 class OperatorLRDiag : public hamilt::Operator<T, Device>
13 {
14 public:
15 OperatorLRDiag(const double* eig_ks, const Parallel_2D& pX_in, const int& nk_in, const int& nocc_in, const int& nvirt_in)
16 : pX(pX_in), nk(nk_in), nocc(nocc_in), nvirt(nvirt_in)
17 { // calculate the difference of eigenvalues
18 ModuleBase::TITLE("OperatorLRDiag", "OperatorLRDiag");
19 const int nbands = nocc + nvirt;
21 this->eig_ks_diff.create(nk, pX.get_local_size(), false);
22 for (int ik = 0;ik < nk;++ik)
23 {
24 const int& istart = ik * nbands;
25 for (int io = 0;io < pX.get_col_size();++io) //nocc_local
26 {
27 for (int iv = 0;iv < pX.get_row_size();++iv) //nvirt_local
28 {
29 int io_g = pX.local2global_col(io);
30 int iv_g = pX.local2global_row(iv);
31 this->eig_ks_diff(ik, io * pX.get_row_size() + iv) = eig_ks[istart + nocc + iv_g] - eig_ks[istart + io_g];
32 }
33 }
34 }
35 };
36 void init(const int ik_in) override {};
37
40 virtual void act(const int nbands,
41 const int nbasis,
42 const int npol,
43 const T* psi_in,
44 T* hpsi,
45 const int ngk_ik = 0,
46 const bool is_first_node = false)const override
47 {
48 ModuleBase::TITLE("OperatorLRDiag", "act");
49 ModuleBase::vector_mul_vector_op<T, Device>()(nk * pX.get_local_size(), // local size of particle-hole basis
50 hpsi,
51 psi_in,
52 this->eig_ks_diff.c);
53 }
54 private:
57 const int& nk;
58 const int& nocc;
59 const int& nvirt;
60 Device* ctx = {};
61 };
62}
Diag part of A operator: [AX]_iak = (e_ak - e_ik) X_iak.
Definition operator_lr_diag.h:13
virtual void act(const int nbands, const int nbasis, const int npol, const T *psi_in, T *hpsi, const int ngk_ik=0, const bool is_first_node=false) const override
Definition operator_lr_diag.h:40
const int & nocc
Definition operator_lr_diag.h:58
Device * ctx
Definition operator_lr_diag.h:60
const int & nvirt
Definition operator_lr_diag.h:59
ModuleBase::matrix eig_ks_diff
Definition operator_lr_diag.h:56
void init(const int ik_in) override
Definition operator_lr_diag.h:36
const Parallel_2D & pX
Definition operator_lr_diag.h:55
OperatorLRDiag(const double *eig_ks, const Parallel_2D &pX_in, const int &nk_in, const int &nocc_in, const int &nvirt_in)
Definition operator_lr_diag.h:15
const int & nk
Definition operator_lr_diag.h:57
Definition matrix.h:19
double * c
Definition matrix.h:25
void create(const int nrow, const int ncol, const bool flag_zero=true)
Definition matrix.cpp:122
This class packs the basic information of 2D-block-cyclic parallel distribution of an arbitrary matri...
Definition parallel_2d.h:12
int64_t get_local_size() const
number of local matrix elements
Definition parallel_2d.h:39
int local2global_col(const int ilc) const
get the global index of a local index (col)
Definition parallel_2d.h:63
int get_row_size() const
number of local rows
Definition parallel_2d.h:21
int local2global_row(const int ilr) const
get the global index of a local index (row)
Definition parallel_2d.h:57
int get_col_size() const
number of local columns
Definition parallel_2d.h:27
Definition operator.h:38
psi::Psi< T, Device > * hpsi
Definition operator.h:112
int ik
Definition operator.h:101
enum calculation_type cal_type
Definition operator.h:107
bool is_first_node
Definition operator.h:109
#define T
Definition exp.cpp:237
Definition esolver_ks_lcao.h:37
void TITLE(const std::string &class_name, const std::string &function_name, const bool disable)
Definition tool_title.cpp:18
Definition math_kernel_op.h:85