ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
pulay_force_stress_gint.hpp
Go to the documentation of this file.
1#pragma once
7namespace PulayForceStress
8{
9 template<typename TK, typename TR>
14 const UnitCell& ucell,
15 const elecstate::Potential* pot,
16 typename TGint<TK>::type& gint,
17 const bool& isforce,
18 const bool& isstress,
19 const bool& set_dmr_gint)
20 {
21 const int nspin = PARAM.inp.nspin;
22
23#ifdef __OLD_GINT
24 if (set_dmr_gint) { gint.transfer_DM2DtoGrid(dm.get_DMR_vector()); } // 2d block to grid
25 for (int is = 0; is < nspin; ++is)
26 {
27 const double* vr_eff1 = pot->get_effective_v(is);
28 const double* vofk_eff1 = nullptr;
30 {
31 vofk_eff1 = pot->get_effective_vofk(is);
32 Gint_inout inout(is, vr_eff1, vofk_eff1, isforce, isstress, &f, &s, Gint_Tools::job_type::force_meta);
33 gint.cal_gint(&inout);
34 }
35 else
36 {
37 Gint_inout inout(is, vr_eff1, isforce, isstress, &f, &s, Gint_Tools::job_type::force);
38 gint.cal_gint(&inout);
39 }
40 }
41#else
42 std::vector<const double*> vr_eff(nspin, nullptr);
43 std::vector<const double*> vofk_eff(nspin, nullptr);
45 {
46 for (int is = 0; is < nspin; ++is)
47 {
48 vr_eff[is] = pot->get_effective_v(is);
49 vofk_eff[is] = pot->get_effective_vofk(is);
50 }
51 ModuleGint::cal_gint_fvl_meta(nspin, vr_eff, vofk_eff, dm.get_DMR_vector(), isforce, isstress, &f, &s);
52 }
53 else
54 {
55 for(int is = 0; is < nspin; ++is)
56 {
57 vr_eff[is] = pot->get_effective_v(is);
58 }
59 ModuleGint::cal_gint_fvl(nspin, vr_eff, dm.get_DMR_vector(), isforce, isstress, &f, &s);
60 }
61#endif
62
63 if (isstress) { StressTools::stress_fill(-1.0, ucell.omega, s); }
64 }
65}
Definition gint_tools.h:33
Definition matrix.h:19
const Input_para & inp
Definition parameter.h:26
Definition unitcell.h:16
double & omega
Definition unitcell.h:32
static int get_func_type()
Definition xc_functional.h:67
static bool get_ked_flag()
Definition xc_functional.h:79
Definition density_matrix.h:36
const std::vector< hamilt::HContainer< TR > * > & get_DMR_vector() const
get pointer vector of DMR
Definition density_matrix.h:145
Definition potential_new.h:48
ModuleBase::matrix & get_effective_vofk()
Definition potential_new.h:110
ModuleBase::matrix & get_effective_v()
Definition potential_new.h:79
void cal_gint_fvl(const int nspin, const std::vector< const double * > &vr_eff, const std::vector< HContainer< double > * > &dm_vec, const bool isforce, const bool isstress, ModuleBase::matrix *fvl, ModuleBase::matrix *svl)
Definition gint_interface.cpp:136
void cal_gint_fvl_meta(const int nspin, const std::vector< const double * > &vr_eff, const std::vector< const double * > &vofk, const std::vector< HContainer< double > * > &dm_vec, const bool isforce, const bool isstress, ModuleBase::matrix *fvl, ModuleBase::matrix *svl)
Definition gint_interface.cpp:158
Definition pulay_force_stress.h:22
void cal_pulay_fs(ModuleBase::matrix &f, ModuleBase::matrix &s, const elecstate::DensityMatrix< TK, TR > &dm, const UnitCell &ucell, const Parallel_Orbitals &pv, const double *(&dHSx)[3], const double *(&dHSxy)[6], const bool &isforce, const bool &isstress, Record_adj *ra=nullptr, const double &factor_force=1.0, const double &factor_stress=1.0)
for 2-center-integration terms, provided force and stress derivatives
void stress_fill(const double &lat0_, const double &omega_, ModuleBase::matrix &stress_matrix)
Definition stress_tools.cpp:4
Parameter PARAM
Definition parameter.cpp:3
int nspin
LDA ; LSDA ; non-linear spin.
Definition input_parameter.h:84
Definition write_vxc.hpp:16