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
4#ifdef __MPI
5#endif
6namespace LR
7{
9 template<typename T = double, typename Device = base_device::DEVICE_CPU>
10 class OperatorLRDiag : public hamilt::Operator<T, Device>
11 {
12 public:
13 OperatorLRDiag(const double* eig_ks, const Parallel_2D& pX_in, const int& nk_in, const int& nocc_in, const int& nvirt_in)
14 : pX(pX_in), nk(nk_in), nocc(nocc_in), nvirt(nvirt_in)
15 { // calculate the difference of eigenvalues
16 ModuleBase::TITLE("OperatorLRDiag", "OperatorLRDiag");
17 const int nbands = nocc + nvirt;
19 this->eig_ks_diff.create(nk, pX.get_local_size(), false);
20 for (int ik = 0;ik < nk;++ik)
21 {
22 const int& istart = ik * nbands;
23 for (int io = 0;io < pX.get_col_size();++io) //nocc_local
24 {
25 for (int iv = 0;iv < pX.get_row_size();++iv) //nvirt_local
26 {
27 int io_g = pX.local2global_col(io);
28 int iv_g = pX.local2global_row(iv);
29 this->eig_ks_diff(ik, io * pX.get_row_size() + iv) = eig_ks[istart + nocc + iv_g] - eig_ks[istart + io_g];
30 }
31 }
32 }
33 };
34 void init(const int ik_in) override {};
35
38 virtual void act(const int nbands,
39 const int nbasis,
40 const int npol,
41 const T* psi_in,
42 T* hpsi,
43 const int ngk_ik = 0,
44 const bool is_first_node = false)const override
45 {
46 ModuleBase::TITLE("OperatorLRDiag", "act");
47 ModuleBase::vector_mul_vector_op<T, Device>()(nk * pX.get_local_size(), // local size of particle-hole basis
48 hpsi,
49 psi_in,
50 this->eig_ks_diff.c);
51 }
52 private:
55 const int& nk;
56 const int& nocc;
57 const int& nvirt;
58 Device* ctx = {};
59 };
60}
Diag part of A operator: [AX]_iak = (e_ak - e_ik) X_iak.
Definition operator_lr_diag.h:11
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:38
const int & nocc
Definition operator_lr_diag.h:56
Device * ctx
Definition operator_lr_diag.h:58
const int & nvirt
Definition operator_lr_diag.h:57
ModuleBase::matrix eig_ks_diff
Definition operator_lr_diag.h:54
void init(const int ik_in) override
Definition operator_lr_diag.h:34
const Parallel_2D & pX
Definition operator_lr_diag.h:53
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:13
const int & nk
Definition operator_lr_diag.h:55
Definition matrix.h:18
double * c
Definition matrix.h:24
void create(const int nrow, const int ncol, const bool flag_zero=true)
Definition matrix.cpp:125
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:36
psi::Psi< T, Device > * hpsi
Definition operator.h:110
int ik
Definition operator.h:99
enum calculation_type cal_type
Definition operator.h:105
bool is_first_node
Definition operator.h:107
#define T
Definition exp.cpp:237
Definition esolver_ks_lcao.h:20
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:84