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"
7#include "source_estate/module_dm/density_matrix.h" // mohan add 2025-11-04
8#include <memory>
9
10class LCAO_Matrix;
11class Charge_Mixing;
12namespace elecstate
13{
14 class ElecState;
15 template <typename TK, typename TR>
16 class DensityMatrix;
17
19 std::vector<std::vector<std::complex<double>>> restore_dm(const K_Vectors& kv,
20 const std::vector<std::vector<std::complex<double>>>& dm_k_ibz,
22 const Parallel_2D& pv);
24 std::vector<std::vector<double>> restore_dm(const K_Vectors& kv,
25 const std::vector<std::vector<double>>& dm_k_ibz,
27 const Parallel_2D& pv);
28
29}
30
31template<typename T, typename Tdata>
33{
34public:
35 using TA = int;
36 using TC = std::array<int, 3>;
37 using TAC = std::pair<TA, TC>;
38
41 {
42 this->exx_ptr = std::make_shared<Exx_LRI<Tdata>>(info);
43 }
45
47 //void write_Hexxs_cereal(const std::string& file_name) const;
48 //void read_Hexxs_cereal(const std::string& file_name);
49
50 std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>>& get_Hexxs() const { return this->exx_ptr->Hexxs; }
51 double &get_Eexx() const { return this->exx_ptr->Eexx; }
52 ModuleBase::matrix &get_force() const { return this->exx_ptr->force_exx; }
53 ModuleBase::matrix &get_stress() const { return this->exx_ptr->stress_exx; }
54
55 // Processes in ESolver_KS_LCAO
57 void init(const MPI_Comm &mpi_comm,
58 const UnitCell &ucell,
59 const K_Vectors &kv,
60 const LCAO_Orbitals& orb);
61
63 void cal_exx_ions(const UnitCell& ucell, const bool write_cv = false);
64
66 void cal_exx_elec(const std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>>& Ds,
67 const UnitCell& ucell,
68 const Parallel_Orbitals& pv,
69 const ModuleSymmetry::Symmetry_rotation* p_symrot = nullptr);
70
72 void cal_exx_force(const int& nat);
73
75 void cal_exx_stress(const double& omega, const double& lat0);
76
77 // Processes in ESolver_KS_LCAO
81 void exx_before_all_runners(const K_Vectors& kv, const UnitCell& ucell, const Parallel_2D& pv);
82
84 void exx_beforescf(const int istep, const K_Vectors& kv, const Charge_Mixing& chgmix, const UnitCell& ucell, const LCAO_Orbitals& orb);
85
87 void exx_eachiterinit(const int istep,
88 const UnitCell& ucell,
90 const K_Vectors& kv,
91 const int& iter);
92
94 void exx_hamilt2rho(elecstate::ElecState& elec, const Parallel_Orbitals& pv, const int iter);
95
97 void exx_iter_finish(const K_Vectors& kv,
98 const UnitCell& ucell,
101 elecstate::DensityMatrix<T,double>* dm, // mohan add 2025-11-04
102 Charge_Mixing& chgmix,
103 const double& scf_ene_thr,
104 int& iter,
105 const int istep,
106 bool& conv_esolver);
108 bool exx_after_converge(const UnitCell& ucell,
111 const K_Vectors& kv,
112 const int& nspin,
113 int& iter,
114 const int& istep,
115 const double& etot,
116 const double& scf_ene_thr);
117
121
122 std::shared_ptr<Exx_LRI<Tdata>> exx_ptr;
123
124private:
126
129
131 {
132 bool init = false;
133 bool ions = false;
134 bool elec = false;
135 bool force = false;
136 bool stress = false;
137 };
139};
140
141#include "Exx_LRI_interface.hpp"
142
143#endif
Definition charge_mixing.h:9
Definition Exx_LRI_interface.h:33
elecstate::DensityMatrix< T, double > * dm_last_step
Definition Exx_LRI_interface.h:120
void cal_exx_force(const int &nat)
: in cal_exx_force: Exx_LRI::cal_exx_force()
Definition Exx_LRI_interface.hpp:61
ModuleBase::matrix & get_stress() const
Definition Exx_LRI_interface.h:53
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:80
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:120
std::pair< TA, TC > TAC
Definition Exx_LRI_interface.h:37
std::vector< std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > > & get_Hexxs() const
Definition Exx_LRI_interface.h:50
double etot_last_outer_loop
Definition Exx_LRI_interface.h:119
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:31
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:20
ModuleSymmetry::Symmetry_rotation symrot_
Definition Exx_LRI_interface.h:128
bool exx_spacegroup_symmetry
Definition Exx_LRI_interface.h:127
int two_level_step
Definition Exx_LRI_interface.h:118
ModuleBase::matrix & get_force() const
Definition Exx_LRI_interface.h:52
Mix_DMk_2D mix_DMk_2D
Definition Exx_LRI_interface.h:125
void exx_hamilt2rho(elecstate::ElecState &elec, const Parallel_Orbitals &pv, const int iter)
in hamilt2rho: calculate Hexx and Eexx
Definition Exx_LRI_interface.hpp:234
Flag_Finish flag_finish
Definition Exx_LRI_interface.h:138
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:333
std::array< int, 3 > TC
Definition Exx_LRI_interface.h:36
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:100
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:176
int TA
Definition Exx_LRI_interface.h:35
double & get_Eexx() const
Definition Exx_LRI_interface.h:51
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:43
std::shared_ptr< Exx_LRI< Tdata > > exx_ptr
Definition Exx_LRI_interface.h:122
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:264
Exx_LRI_Interface(const Exx_Info::Exx_Info_RI &info)
Constructor for Exx_LRI_Interface.
Definition Exx_LRI_interface.h:40
Definition klist.h:13
Definition ORB_read.h:19
Definition Mix_DMk_2D.h:17
Definition matrix.h:19
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:17
Definition density_matrix.h:36
Definition elecstate.h:15
Definition hamilt.h:16
Definition cal_dm.h:10
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:12
std::pair< int, TC > TAC
Definition ri_cv_io_test.cpp:10
Definition exx_info.h:53
Definition Exx_LRI_interface.h:131
bool ions
Definition Exx_LRI_interface.h:133
bool force
Definition Exx_LRI_interface.h:135
bool init
Definition Exx_LRI_interface.h:132
bool stress
Definition Exx_LRI_interface.h:136
bool elec
Definition Exx_LRI_interface.h:134