ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
operator_lr_exx.h
Go to the documentation of this file.
1#ifdef __EXX
2#pragma once
7namespace LR
8{
9
11 template<typename T = double>
12 class OperatorLREXX : public hamilt::Operator<T, base_device::DEVICE_CPU>
13 {
14 using TA = int;
15 static const size_t Ndim = 3;
16 using TC = std::array<int, Ndim>;
17 using TAC = std::pair<TA, TC>;
18
19 public:
20 OperatorLREXX(const int& nspin,
21 const int& naos,
22 const int& nocc,
23 const int& nvirt,
24 const UnitCell& ucell_in,
25 const psi::Psi<T>& psi_ks_in,
26 std::unique_ptr<elecstate::DensityMatrix<T, T>>& DM_trans_in,
27 // HContainer<double>* hR_in,
28 std::weak_ptr<Exx_LRI<T>> exx_lri_in,
29 const K_Vectors& kv_in,
30 const Parallel_2D& pX_in,
31 const Parallel_2D& pc_in,
32 const Parallel_Orbitals& pmat_in,
33 const double& alpha = 1.0,
34 const std::vector<int>& aims_nbasis = {})
35 : nspin(nspin), naos(naos), nocc(nocc), nvirt(nvirt), nk(kv_in.get_nks() / nspin),
36 psi_ks(psi_ks_in), DM_trans(DM_trans_in), exx_lri(exx_lri_in), kv(kv_in),
37 pX(pX_in), pc(pc_in), pmat(pmat_in), ucell(ucell_in), alpha(alpha),
38 aims_nbasis(aims_nbasis)
39 {
40 ModuleBase::TITLE("OperatorLREXX", "OperatorLREXX");
42 this->is_first_node = false;
43
44 // reduce psi_ks for later use
45 this->psi_ks_full.resize(this->nk, nocc + nvirt, this->naos);
46 for (int ik = 0;ik < nk;++ik)
47 {
48 LR_Util::gather_2d_to_full(this->pc, &this->psi_ks(ik, 0, 0), &this->psi_ks_full(ik, 0, 0), false, this->naos, nocc + nvirt);
49 }
50
51 // get cells in BvK supercell
52 const TC period = RI_Util::get_Born_vonKarmen_period(kv_in);
53 this->BvK_cells = RI_Util::get_Born_von_Karmen_cells(period);
54
55 this->allocate_Ds_onebase();
56 this->exx_lri.lock()->Hexxs.resize(1);
57 };
58
59 void init(const int ik_in) override {};
60
61 virtual void act(const int nbands,
62 const int nbasis,
63 const int npol,
64 const T* psi_in,
65 T* hpsi,
66 const int ngk_ik = 0,
67 const bool is_first_node = false) const override;
68
69 private:
70 //global sizes
71 const int nspin = 1;
72 const int naos = 1;
73 const int nocc = 1;
74 const int nvirt = 1;
75 const int nk = 1;
76 const double alpha = 1.0; //(allow non-ref constant)
77 const bool cal_dm_trans = false;
78 const bool tdm_sym = false;
79 const K_Vectors& kv;
81 const psi::Psi<T>& psi_ks = nullptr;
82 psi::Psi<T> psi_ks_full;
83 const std::vector<int> aims_nbasis={};
84
86 std::unique_ptr<elecstate::DensityMatrix<T, T>>& DM_trans;
87
91 // elecstate::DensityMatrix<T, double>* DM_onebase;
92 mutable std::map<TA, std::map<TAC, RI::Tensor<T>>> Ds_onebase;
93
94 // cells in the Born von Karmen supercell (direct)
95 std::vector<std::array<int, Ndim>> BvK_cells;
96
98 // hamilt::HContainer<double>* hR = nullptr;
99
104 std::weak_ptr<Exx_LRI<T>> exx_lri;
105
106 const UnitCell& ucell;
107
109 const Parallel_2D& pc;
110 const Parallel_2D& pX;
111 const Parallel_Orbitals& pmat;
112
113
114 // allocate Ds_onebase
115 void allocate_Ds_onebase();
116
117 void cal_DM_onebase(const int io, const int iv, const int ik) const;
118
119 };
120}
121#endif
Definition Exx_LRI.h:51
Definition klist.h:13
This class packs the basic information of 2D-block-cyclic parallel distribution of an arbitrary matri...
Definition parallel_2d.h:12
Definition parallel_orbitals.h:9
Definition unitcell.h:16
Definition density_matrix.h:36
Definition operator.h:38
Definition psi.h:37
#define T
Definition exp.cpp:237
void gather_2d_to_full(const Parallel_2D &pv, const T *submat, T *fullmat, bool col_first, int global_nrow, int global_ncol)
gather 2d matrix to full matrix the defination of row and col is consistent with setup_2d_division
Definition lr_util.hpp:148
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
int TA
Definition RI_2D_Comm.h:25
std::array< int, 3 > get_Born_vonKarmen_period(const K_Vectors &kv)
Definition RI_Util.hpp:16
std::vector< std::array< Tcell, Ndim > > get_Born_von_Karmen_cells(const std::array< Tcell, Ndim > &Born_von_Karman_period)
Definition RI_Util.hpp:34
std::array< int, 3 > TC
Definition ri_cv_io_test.cpp:9
std::pair< int, TC > TAC
Definition ri_cv_io_test.cpp:10