ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
Exx_LRI_interface.h
Go to the documentation of this file.
1#ifndef EXX_LRI_INTERFACE_H
2#define EXX_LRI_INTERFACE_H
3
4#include "Exx_LRI.h"
8#include "source_estate/module_dm/density_matrix.h" // mohan add 2025-11-04
10#include <memory>
11
12class LCAO_Matrix;
13class Charge_Mixing;
14namespace elecstate
15{
16 class ElecState;
17 template <typename TK, typename TR>
18 class DensityMatrix;
19
21 std::vector<std::vector<std::complex<double>>> restore_dm(const K_Vectors& kv,
22 const std::vector<std::vector<std::complex<double>>>& dm_k_ibz,
24 const Parallel_2D& pv);
26 std::vector<std::vector<double>> restore_dm(const K_Vectors& kv,
27 const std::vector<std::vector<double>>& dm_k_ibz,
29 const Parallel_2D& pv);
30
31}
32
33template<typename T, typename Tdata>
35{
36public:
37 using TA = int;
38 using TC = std::array<int, 3>;
39 using TAC = std::pair<TA, TC>;
40
43 {
44 this->exx_ptr = std::make_shared<Exx_LRI<Tdata>>(info);
45 }
47
49 //void write_Hexxs_cereal(const std::string& file_name) const;
50 //void read_Hexxs_cereal(const std::string& file_name);
51
52 std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>>& get_Hexxs() const { return this->exx_ptr->Hexxs; }
53 double &get_Eexx() const { return this->exx_ptr->Eexx; }
54 ModuleBase::matrix &get_force() const { return this->exx_ptr->force_exx; }
55 ModuleBase::matrix &get_stress() const { return this->exx_ptr->stress_exx; }
56
57 // Processes in ESolver_KS_LCAO
59 void init(const MPI_Comm &mpi_comm,
60 const UnitCell &ucell,
61 const K_Vectors &kv,
62 const LCAO_Orbitals& orb);
63
65 void cal_exx_ions(const UnitCell& ucell, const bool write_cv = false);
66
68 void cal_exx_elec(const std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>>& Ds,
69 const UnitCell& ucell,
70 const Parallel_Orbitals& pv,
71 const ModuleSymmetry::Symmetry_rotation* p_symrot = nullptr);
72
74 void cal_exx_force(const int& nat);
75
77 void cal_exx_stress(const double& omega, const double& lat0);
78
79 // Processes in ESolver_KS_LCAO
83 void exx_before_all_runners(const K_Vectors& kv, const UnitCell& ucell, const Parallel_2D& pv);
84
86 void exx_beforescf(const int istep, const K_Vectors& kv, const Charge_Mixing& chgmix, const UnitCell& ucell, const LCAO_Orbitals& orb);
87
89 void exx_eachiterinit(const int istep,
90 const UnitCell& ucell,
92 const K_Vectors& kv,
93 const int& iter);
94
96 void exx_hamilt2rho(elecstate::ElecState& elec, const Parallel_Orbitals& pv, const int iter);
97
99 void exx_iter_finish(const K_Vectors& kv,
100 const UnitCell& ucell,
103 elecstate::DensityMatrix<T,double>* dm, // mohan add 2025-11-04
104 Charge_Mixing& chgmix,
105 const double& scf_ene_thr,
106 int& iter,
107 const int istep,
108 bool& conv_esolver);
110 bool exx_after_converge(const UnitCell& ucell,
113 const K_Vectors& kv,
114 const int& nspin,
115 int& iter,
116 const int& istep,
117 const double& etot,
118 const double& scf_ene_thr);
119
123
124 std::shared_ptr<Exx_LRI<Tdata>> exx_ptr;
125
126private:
128
131
133 {
134 bool init = false;
135 bool ions = false;
136 bool elec = false;
137 bool force = false;
138 bool stress = false;
139 };
141};
142
143#include "Exx_LRI_interface.hpp"
144
145#endif
Definition charge_mixing.h:9
Definition Exx_LRI_interface.h:35
elecstate::DensityMatrix< T, double > * dm_last_step
Definition Exx_LRI_interface.h:122
void cal_exx_force(const int &nat)
: in cal_exx_force: Exx_LRI::cal_exx_force()
Definition Exx_LRI_interface.hpp:63
ModuleBase::matrix & get_stress() const
Definition Exx_LRI_interface.h:55
Exx_LRI_Interface()=delete
void cal_exx_stress(const double &omega, const double &lat0)
: in cal_exx_stress: Exx_LRI::cal_exx_stress()
Definition Exx_LRI_interface.hpp:82
void exx_beforescf(const int istep, const K_Vectors &kv, const Charge_Mixing &chgmix, const UnitCell &ucell, const LCAO_Orbitals &orb)
in beforescf: set xc type, opt_orb, do DM mixing
Definition Exx_LRI_interface.hpp:122
std::pair< TA, TC > TAC
Definition Exx_LRI_interface.h:39
std::vector< std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > > & get_Hexxs() const
Definition Exx_LRI_interface.h:52
double etot_last_outer_loop
Definition Exx_LRI_interface.h:121
void cal_exx_ions(const UnitCell &ucell, const bool write_cv=false)
: in cal_exx_ions: Exx_LRI::cal_exx_ions()
Definition Exx_LRI_interface.hpp:33
void init(const MPI_Comm &mpi_comm, const UnitCell &ucell, const K_Vectors &kv, const LCAO_Orbitals &orb)
in init: Exx_LRI::init()
Definition Exx_LRI_interface.hpp:22
ModuleSymmetry::Symmetry_rotation symrot_
Definition Exx_LRI_interface.h:130
bool exx_spacegroup_symmetry
Definition Exx_LRI_interface.h:129
int two_level_step
Definition Exx_LRI_interface.h:120
ModuleBase::matrix & get_force() const
Definition Exx_LRI_interface.h:54
Mix_DMk_2D mix_DMk_2D
Definition Exx_LRI_interface.h:127
void exx_hamilt2rho(elecstate::ElecState &elec, const Parallel_Orbitals &pv, const int iter)
in hamilt2rho: calculate Hexx and Eexx
Definition Exx_LRI_interface.hpp:223
Flag_Finish flag_finish
Definition Exx_LRI_interface.h:140
bool exx_after_converge(const UnitCell &ucell, hamilt::Hamilt< T > &hamilt, const elecstate::DensityMatrix< T, double > &dm, const K_Vectors &kv, const int &nspin, int &iter, const int &istep, const double &etot, const double &scf_ene_thr)
: in do_after_converge: add exx operators; do DM mixing if seperate loop
Definition Exx_LRI_interface.hpp:322
std::array< int, 3 > TC
Definition Exx_LRI_interface.h:38
void exx_before_all_runners(const K_Vectors &kv, const UnitCell &ucell, const Parallel_2D &pv)
in before_all_runners: set symmetry according to irreducible k-points since k-points are not reduced ...
Definition Exx_LRI_interface.hpp:102
void exx_eachiterinit(const int istep, const UnitCell &ucell, const elecstate::DensityMatrix< T, double > &dm, const K_Vectors &kv, const int &iter)
in eachiterinit: do DM mixing and calculate Hexx when entering 2nd SCF
Definition Exx_LRI_interface.hpp:165
int TA
Definition Exx_LRI_interface.h:37
double & get_Eexx() const
Definition Exx_LRI_interface.h:53
void cal_exx_elec(const std::vector< std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > > &Ds, const UnitCell &ucell, const Parallel_Orbitals &pv, const ModuleSymmetry::Symmetry_rotation *p_symrot=nullptr)
: in cal_exx_elec: Exx_LRI::cal_exx_elec()
Definition Exx_LRI_interface.hpp:45
std::shared_ptr< Exx_LRI< Tdata > > exx_ptr
Definition Exx_LRI_interface.h:124
void exx_iter_finish(const K_Vectors &kv, const UnitCell &ucell, hamilt::Hamilt< T > &hamilt, elecstate::ElecState &elec, elecstate::DensityMatrix< T, double > *dm, Charge_Mixing &chgmix, const double &scf_ene_thr, int &iter, const int istep, bool &conv_esolver)
in iter_finish: write Hexx, do something according to whether SCF is converged
Definition Exx_LRI_interface.hpp:253
Exx_LRI_Interface(const Exx_Info::Exx_Info_RI &info)
Constructor for Exx_LRI_Interface.
Definition Exx_LRI_interface.h:42
Definition klist.h:12
Definition ORB_read.h:18
Definition Mix_DMk_2D.h:16
Definition matrix.h:18
Definition symmetry_rotation.h:16
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:15
Definition density_matrix.h:70
Definition elecstate.h:15
Definition hamilt.h:17
Definition read_atoms_helper_test.cpp:11
std::vector< std::vector< std::complex< double > > > restore_dm(const K_Vectors &kv, const std::vector< std::vector< std::complex< double > > > &dm_k_ibz, const ModuleSymmetry::Symmetry_rotation &symrot, const Parallel_2D &pv)
for symmetry, multi-k, nspin<4: restore DM(k) form DM(k_ibz)
Definition hamilt.h:13
std::pair< int, TC > TAC
Definition ri_cv_io_test.cpp:10
Definition exx_info.h:52
Definition Exx_LRI_interface.h:133
bool ions
Definition Exx_LRI_interface.h:135
bool force
Definition Exx_LRI_interface.h:137
bool init
Definition Exx_LRI_interface.h:134
bool stress
Definition Exx_LRI_interface.h:138
bool elec
Definition Exx_LRI_interface.h:136