1#ifndef EXX_LRI_INTERFACE_HPP
2#define EXX_LRI_INTERFACE_HPP
47template<
typename T,
typename Tdata>
54 this->exx_ptr->init(mpi_comm, ucell, kv, orb);
55 this->flag_finish.init =
true;
58template<
typename T,
typename Tdata>
62 if(!this->flag_finish.init)
63 {
throw std::runtime_error(
"Exx init unfinished when "+std::string(__FILE__)+
" line "+std::to_string(__LINE__)); }
65 this->exx_ptr->cal_exx_ions(ucell, write_cv);
67 this->flag_finish.ions =
true;
70template<
typename T,
typename Tdata>
77 if(!this->flag_finish.init || !this->flag_finish.ions)
79 throw std::runtime_error(
"Exx init unfinished when "
80 +std::string(__FILE__)+
" line "+std::to_string(__LINE__));
83 this->exx_ptr->cal_exx_elec(Ds, ucell, pv, p_symrot);
85 this->flag_finish.elec =
true;
88template<
typename T,
typename Tdata>
92 if(!this->flag_finish.init || !this->flag_finish.ions)
94 throw std::runtime_error(
"Exx init unfinished when "+std::string(__FILE__)+
" line "+std::to_string(__LINE__));
96 if(!this->flag_finish.elec)
98 throw std::runtime_error(
"Exx Hamiltonian unfinished when "+std::string(__FILE__)
99 +
" line "+std::to_string(__LINE__));
102 this->exx_ptr->cal_exx_force(nat);
104 this->flag_finish.force =
true;
107template<
typename T,
typename Tdata>
111 if(!this->flag_finish.init || !this->flag_finish.ions)
113 throw std::runtime_error(
"Exx init unfinished when "
114 +std::string(__FILE__)+
" line "+std::to_string(__LINE__));
116 if(!this->flag_finish.elec)
118 throw std::runtime_error(
"Exx Hamiltonian unfinished when "
119 +std::string(__FILE__)+
" line "+std::to_string(__LINE__));
122 this->exx_ptr->cal_exx_stress(omega, lat0);
124 this->flag_finish.stress =
true;
127template<
typename T,
typename Tdata>
136 if (this->exx_spacegroup_symmetry)
139 this->symrot_.find_irreducible_sector(
143 this->symrot_.cal_Ms(kv, ucell, pv);
147template<
typename T,
typename Tdata>
188 if (this->exx_spacegroup_symmetry)
194 { this->mix_DMk_2D.set_mixing(
nullptr); }
196 { this->mix_DMk_2D.set_mixing(chgmix.
get_mixing()); }
198 this->two_level_step = 0;
203template<
typename T,
typename Tdata>
214 && (this->two_level_step
219 && this->two_level_step == 0
223 const bool flag_restart = (iter == 1) ?
true :
false;
227 if (this->exx_spacegroup_symmetry)
228 { this->mix_DMk_2D.mix(symrot_.restore_dm(kv,dm_in.get_DMK_vector(), *dm_in.get_paraV_pointer()), flag_restart); }
230 { this->mix_DMk_2D.mix(dm_in.get_DMK_vector(), flag_restart); }
231 const std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>>
233 ? RI_2D_Comm::split_m2D_ktoR<Tdata>(
235 *this->exx_ptr->p_kv,
236 this->mix_DMk_2D.get_DMk_gamma_out(),
237 *dm_in.get_paraV_pointer(),
239 : RI_2D_Comm::split_m2D_ktoR<Tdata>(
241 *this->exx_ptr->p_kv,
242 this->mix_DMk_2D.get_DMk_k_out(),
243 *dm_in.get_paraV_pointer(),
245 this->exx_spacegroup_symmetry);
247 if (this->exx_spacegroup_symmetry &&
GlobalC::exx_info.info_ri.exx_symmetry_realspace)
248 { this->cal_exx_elec(Ds, ucell,*dm_in.get_paraV_pointer(), &this->symrot_); }
250 { this->cal_exx_elec(Ds, ucell,*dm_in.get_paraV_pointer()); }
253 if(istep > 0 && flag_restart)
254 { cal(*dm_last_step); }
261template<
typename T,
typename Tdata>
271 && this->two_level_step == 0 && iter == 1)
277 catch (
const std::exception& e)
278 { std::cout <<
"WARNING: Cannot read Eexx from disk, the energy of the 1st loop will be wrong, sbut it does not influence the subsequent loops." << std::endl; }
283 elec.
set_exx(this->get_Eexx());
291template<
typename T,
typename Tdata>
297 const double& scf_ene_thr,
303 if (
GlobalC::restart.info_save.save_H && (this->two_level_step > 0 || istep > 0)
344 conv_esolver = this->exx_after_converge(
358template<
typename T,
typename Tdata>
368 const double& scf_ene_thr)
371 auto restart_reset = [
this]()
374 this->exx_ptr->Eexx = 0;
386 if (this->two_level_step || istep > 0)
396 std::cout <<
" Entering 2nd SCF, where EXX is updated" << std::endl;
397 this->two_level_step++;
405 { std::cout <<
FmtCore::format(
" deltaE (eV) from outer loop: %.8e \n", ediff); }
408 || (iter == 1 && this->two_level_step != 0)
409 || (ediff < scf_ene_thr && this->two_level_step != 0))
416 this->etot_last_outer_loop = etot;
418 if (this->two_level_step == 0)
421 std::cout <<
" Updating EXX " << std::flush;
422 timeval t_start; gettimeofday(&t_start,
nullptr);
425 const bool flag_restart = (this->two_level_step == 0 &&
PARAM.
inp.
init_wfc !=
"file") ?
true :
false;
427 if (this->exx_spacegroup_symmetry)
433 const std::vector<std::map<int, std::map<std::pair<int, std::array<int, 3>>, RI::Tensor<Tdata>>>>
434 Ds = std::is_same<T, double>::value
435 ? RI_2D_Comm::split_m2D_ktoR<Tdata>(ucell,*this->exx_ptr->p_kv, this->mix_DMk_2D.get_DMk_gamma_out(), *dm.
get_paraV_pointer(), nspin)
436 : RI_2D_Comm::split_m2D_ktoR<Tdata>(ucell,*this->exx_ptr->p_kv, this->mix_DMk_2D.get_DMk_k_out(), *dm.
get_paraV_pointer(), nspin, this->exx_spacegroup_symmetry);
438 if (this->exx_spacegroup_symmetry &&
GlobalC::exx_info.info_ri.exx_symmetry_realspace)
443 this->two_level_step++;
445 timeval t_end; gettimeofday(&t_end,
nullptr);
446 std::cout <<
"and rerun SCF\t"
447 << std::setprecision(3) << std::setiosflags(std::ios::scientific)
448 << (double)(t_end.tv_sec-t_start.tv_sec) + (double)(t_end.tv_usec-t_start.tv_usec)/1000000.0
449 << std::defaultfloat <<
" (s)" << std::endl;
Atom_pseudo ncpp
Definition atom_spec.h:13
Definition charge_mixing.h:9
Base_Mixing::Mixing * get_mixing() const
Definition charge_mixing.h:103
void close_kerker_gg0()
Definition charge_mixing.h:52
void cal_exx_force(const int &nat)
: in cal_exx_force: Exx_LRI::cal_exx_force()
Definition Exx_LRI_interface.hpp:89
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
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
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
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
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
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
static std::string format(const char *fmt, const Ts &... args)
static function to format data
Definition formatter.h:41
int get_nkstot_full() const
Definition klist.h:78
int get_nks() const
Definition klist.h:68
Definition symmetry_rotation.h:16
static int symm_flag
Definition symmetry.h:30
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
const Input_para & inp
Definition parameter.h:26
const System_para & globalv
Definition parameter.h:30
std::string folder
Definition restart.h:31
Info_Load info_load
Definition restart.h:29
bool load_disk(const std::string label, const int index, const int size, T *data, const bool error_quit=true) const
Definition restart.h:43
bool save_disk(const std::string label, const int index, const int size, T *data, const bool error_quit=true) const
Definition restart.h:34
Atom * atoms
Definition unitcell.h:18
Lattice lat
Definition unitcell.h:25
ModuleSymmetry::Symmetry symm
Definition unitcell.h:55
Statistics st
Definition unitcell.h:44
static int get_func_type()
Definition xc_functional.h:67
static void set_xc_type(const std::string xc_func_in)
Definition xc_functional.cpp:48
Definition density_matrix.h:36
const std::vector< std::vector< TK > > & get_DMK_vector() const
get pointer vector of DMK
Definition density_matrix.h:161
const Parallel_Orbitals * get_paraV_pointer() const
get pointer of paraV
Definition density_matrix.h:173
Definition elecstate_lcao.h:15
Definition elecstate.h:15
fenergy f_en
energies contribute to the total free energy
Definition elecstate.h:157
void set_exx(const double &Eexx)
calculation if converged
Definition elecstate_exx.cpp:8
std::string xc_func
Definition pseudo.h:25
Exx_Info exx_info
Definition test_xc.cpp:29
Restart restart
Definition for_testing_input_conv.h:255
int MY_RANK
global index of process
Definition global_variable.cpp:21
const double Ry_to_eV
Definition constants.h:81
void TITLE(const std::string &class_name, const std::string &function_name, const bool disable)
Definition tool_title.cpp:18
void write_Hexxs_csr(const std::string &file_name, const UnitCell &ucell, const std::map< int, std::map< TAC, RI::Tensor< Tdata > > > &Hexxs)
write Hexxs in CSR format
void bcast_double(double *object, const int n)
Definition parallel_common.cpp:49
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
Parameter PARAM
Definition parameter.cpp:3
bool separate_loop
Definition exx_info.h:35
double hybrid_alpha
Definition exx_info.h:31
size_t hybrid_step
Definition exx_info.h:36
Exx_Info_Global info_global
Definition exx_info.h:38
bool restart_exx
Definition restart.h:27
bool gamma_only_local
Definition system_parameter.h:38
double etot
the total free energy
Definition fp_energy.h:18
double exx
the exact exchange energy.
Definition fp_energy.h:31