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 <memory>
8
9class LCAO_Matrix;
10class Charge_Mixing;
11namespace elecstate
12{
13 class ElecState;
14 template <typename TK, typename TR>
15 class DensityMatrix;
16
18 std::vector<std::vector<std::complex<double>>> restore_dm(const K_Vectors& kv,
19 const std::vector<std::vector<std::complex<double>>>& dm_k_ibz,
21 const Parallel_2D& pv);
23 std::vector<std::vector<double>> restore_dm(const K_Vectors& kv,
24 const std::vector<std::vector<double>>& dm_k_ibz,
26 const Parallel_2D& pv);
27
28}
29
30template<typename T, typename Tdata>
32{
33public:
34 using TA = int;
35 using TC = std::array<int, 3>;
36 using TAC = std::pair<TA, TC>;
37
40 {
41 this->exx_ptr = std::make_shared<Exx_LRI<Tdata>>(info);
42 }
44
46 //void write_Hexxs_cereal(const std::string& file_name) const;
47 //void read_Hexxs_cereal(const std::string& file_name);
48
49 std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>>& get_Hexxs() const { return this->exx_ptr->Hexxs; }
50 double &get_Eexx() const { return this->exx_ptr->Eexx; }
51 ModuleBase::matrix &get_force() const { return this->exx_ptr->force_exx; }
52 ModuleBase::matrix &get_stress() const { return this->exx_ptr->stress_exx; }
53
54 // Processes in ESolver_KS_LCAO
56 void init(const MPI_Comm &mpi_comm,
57 const UnitCell &ucell,
58 const K_Vectors &kv,
59 const LCAO_Orbitals& orb);
60
62 void cal_exx_ions(const UnitCell& ucell, const bool write_cv = false);
63
65 void cal_exx_elec(const std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>>& Ds,
66 const UnitCell& ucell,
67 const Parallel_Orbitals& pv,
68 const ModuleSymmetry::Symmetry_rotation* p_symrot = nullptr);
69
71 void cal_exx_force(const int& nat);
72
74 void cal_exx_stress(const double& omega, const double& lat0);
75
76 // Processes in ESolver_KS_LCAO
80 void exx_before_all_runners(const K_Vectors& kv, const UnitCell& ucell, const Parallel_2D& pv);
81
83 void exx_beforescf(const int istep, const K_Vectors& kv, const Charge_Mixing& chgmix, const UnitCell& ucell, const LCAO_Orbitals& orb);
84
86 void exx_eachiterinit(const int istep,
87 const UnitCell& ucell,
89 const K_Vectors& kv,
90 const int& iter);
91
93 void exx_hamilt2rho(elecstate::ElecState& elec, const Parallel_Orbitals& pv, const int iter);
94
96 void exx_iter_finish(const K_Vectors& kv,
97 const UnitCell& ucell,
100 Charge_Mixing& chgmix,
101 const double& scf_ene_thr,
102 int& iter,
103 const int istep,
104 bool& conv_esolver);
106 bool exx_after_converge(const UnitCell& ucell,
109 const K_Vectors& kv,
110 const int& nspin,
111 int& iter,
112 const int& istep,
113 const double& etot,
114 const double& scf_ene_thr);
115
119
120 std::shared_ptr<Exx_LRI<Tdata>> exx_ptr;
121
122private:
124
127
129 {
130 bool init = false;
131 bool ions = false;
132 bool elec = false;
133 bool force = false;
134 bool stress = false;
135 };
137};
138
139#include "Exx_LRI_interface.hpp"
140
141#endif
Definition charge_mixing.h:9
Definition Exx_LRI_interface.h:32
elecstate::DensityMatrix< T, double > * dm_last_step
Definition Exx_LRI_interface.h:118
void cal_exx_force(const int &nat)
: in cal_exx_force: Exx_LRI::cal_exx_force()
Definition Exx_LRI_interface.hpp:89
ModuleBase::matrix & get_stress() const
Definition Exx_LRI_interface.h:52
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:108
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:148
std::pair< TA, TC > TAC
Definition Exx_LRI_interface.h:36
std::vector< std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > > & get_Hexxs() const
Definition Exx_LRI_interface.h:49
double etot_last_outer_loop
Definition Exx_LRI_interface.h:117
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:59
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:48
ModuleSymmetry::Symmetry_rotation symrot_
Definition Exx_LRI_interface.h:126
bool exx_spacegroup_symmetry
Definition Exx_LRI_interface.h:125
int two_level_step
Definition Exx_LRI_interface.h:116
ModuleBase::matrix & get_force() const
Definition Exx_LRI_interface.h:51
Mix_DMk_2D mix_DMk_2D
Definition Exx_LRI_interface.h:123
void exx_hamilt2rho(elecstate::ElecState &elec, const Parallel_Orbitals &pv, const int iter)
in hamilt2rho: calculate Hexx and Eexx
Definition Exx_LRI_interface.hpp:262
void exx_iter_finish(const K_Vectors &kv, const UnitCell &ucell, hamilt::Hamilt< T > &hamilt, elecstate::ElecState &elec, 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:292
Flag_Finish flag_finish
Definition Exx_LRI_interface.h:136
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:359
std::array< int, 3 > TC
Definition Exx_LRI_interface.h:35
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:128
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:204
int TA
Definition Exx_LRI_interface.h:34
double & get_Eexx() const
Definition Exx_LRI_interface.h:50
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:71
std::shared_ptr< Exx_LRI< Tdata > > exx_ptr
Definition Exx_LRI_interface.h:120
Exx_LRI_Interface(const Exx_Info::Exx_Info_RI &info)
Constructor for Exx_LRI_Interface.
Definition Exx_LRI_interface.h:39
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:16
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:129
bool ions
Definition Exx_LRI_interface.h:131
bool force
Definition Exx_LRI_interface.h:133
bool init
Definition Exx_LRI_interface.h:130
bool stress
Definition Exx_LRI_interface.h:134
bool elec
Definition Exx_LRI_interface.h:132