ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
forces.h
Go to the documentation of this file.
1#ifndef FORCES_H
2#define FORCES_H
3
9#include "source_cell/klist.h"
15#include "source_psi/psi.h"
16#include "structure_factor.h"
17
18template <typename FPTYPE, typename Device = base_device::DEVICE_CPU>
19class Forces
20{
21 public:
22 template <typename T>
23 friend class Force_Stress_LCAO;
24 /* This routine is a driver routine which compute the forces
25 * acting on the atoms, the complete forces in plane waves
26 * is computed from 4 main parts
27 * (1) cal_force_loc: contribution due to local potential.
28 * (2) cal_foce_ew: contribution due to ewald potential.
29 * (3) cal_force_cc: contributino due to NLCC.
30 * (4) cal_nl: contribution due to the non-local pseudopotential.
31 * (5) cal_force_us: contribution due to US pseudopotential.
32 * (6) cal_scc: contributino due to incomplete SCF calculation.
33 */
34 Forces(const int nat_in) : nat(nat_in){};
36
37 void cal_force(UnitCell& ucell,
38 ModuleBase::matrix& force,
39 const elecstate::ElecState& elec,
40 const ModulePW::PW_Basis* const rho_basis,
42 Structure_Factor* p_sf,
43 surchem& solvent,
44 const pseudopot_cell_vl* locpp,
45 const pseudopot_cell_vnl* nlpp = nullptr,
46 K_Vectors* pkv = nullptr,
47 ModulePW::PW_Basis_K* psi_basis = nullptr,
48 const psi::Psi<std::complex<FPTYPE>, Device>* psi_in = nullptr);
49
50 protected:
51 int nat = 0;
52 int npwx = 0;
53
54 void cal_force_loc(const UnitCell& ucell,
55 ModuleBase::matrix& forcelc,
56 const ModulePW::PW_Basis* const rho_basis,
57 const ModuleBase::matrix& vloc,
58 const Charge* const chr);
59 void cal_force_ew(const UnitCell& ucell,
60 ModuleBase::matrix& forceion,
61 const ModulePW::PW_Basis* const rho_basis,
62 const Structure_Factor* p_sf);
63 void cal_force_cc(ModuleBase::matrix& forcecc,
64 const ModulePW::PW_Basis* const rho_basis,
65 const Charge* const chr,
66 const bool* numeric,
67 UnitCell& ucell_in);
78 void cal_force_nl(ModuleBase::matrix& forcenl,
79 const ModuleBase::matrix& wg,
80 const ModuleBase::matrix& ekb,
81 const K_Vectors* p_kv,
82 const ModulePW::PW_Basis_K* psi_basis,
83 const Structure_Factor* p_sf,
84 const pseudopot_cell_vnl& nlpp_in,
85 const UnitCell& ucell_in,
86 const psi::Psi<std::complex<FPTYPE>, Device>* psi_in = nullptr);
93 void cal_force_onsite(ModuleBase::matrix& force_onsite,
94 const ModuleBase::matrix& wg,
95 const ModulePW::PW_Basis_K* wfc_basis,
96 const UnitCell& ucell_in,
97 const psi::Psi <std::complex<FPTYPE>, Device>* psi_in = nullptr);
98 void cal_force_scc(ModuleBase::matrix& forcescc,
99 const ModulePW::PW_Basis* const rho_basis,
100 const ModuleBase::matrix& v_current,
101 const bool vnew_exist,
102 const bool* numeric,
103 const UnitCell& ucell_in);
104 void cal_force_us(ModuleBase::matrix& forcenl,
105 const ModulePW::PW_Basis* const rho_basis,
106 const pseudopot_cell_vnl& ppcell_in,
107 const elecstate::ElecState& elec,
108 const UnitCell& ucell);
109 void cal_ylm(int lmax, int npw, const FPTYPE* gk_in, FPTYPE* ylm);
110 void deriv_drhoc(const bool& numeric,
111 const int mesh,
112 const FPTYPE* r,
113 const FPTYPE* rab,
114 const FPTYPE* rhoc,
115 FPTYPE* drhocg,
116 const ModulePW::PW_Basis* const rho_basis,
117 int type,
118 const UnitCell& ucell_in); // used in nonlinear core correction stress
119 void deriv_drhoc_scc(const bool& numeric,
120 const int mesh,
121 const FPTYPE* r,
122 const FPTYPE* rab,
123 const FPTYPE* rhoc,
124 FPTYPE* drhocg,
125 const ModulePW::PW_Basis* const rho_basis,
126 const UnitCell& ucell_in); // used in nonlinear core correction stress
127 protected:
128 Device* ctx = {};
129 base_device::DEVICE_CPU* cpu_ctx = {};
131 private:
133
139 = base_device::memory::synchronize_memory_op<std::complex<FPTYPE>, Device, base_device::DEVICE_CPU>;
141 = base_device::memory::synchronize_memory_op<std::complex<FPTYPE>, base_device::DEVICE_CPU, Device>;
142
147
151};
152
153#endif
Definition charge.h:20
Definition FORCE_STRESS.h:22
Definition forces.h:20
void cal_force_nl(ModuleBase::matrix &forcenl, const ModuleBase::matrix &wg, const ModuleBase::matrix &ekb, const K_Vectors *p_kv, const ModulePW::PW_Basis_K *psi_basis, const Structure_Factor *p_sf, const pseudopot_cell_vnl &nlpp_in, const UnitCell &ucell_in, const psi::Psi< std::complex< FPTYPE >, Device > *psi_in=nullptr)
This routine computes the atomic force of non-local pseudopotential F^{NL}_i = \sum_{n,...
Definition forces_nl.cpp:11
base_device::AbacusDevice_t device
Definition forces.h:130
int nat
Definition forces.h:51
void cal_force_cc(ModuleBase::matrix &forcecc, const ModulePW::PW_Basis *const rho_basis, const Charge *const chr, const bool *numeric, UnitCell &ucell_in)
Definition forces_cc.cpp:31
void cal_force_onsite(ModuleBase::matrix &force_onsite, const ModuleBase::matrix &wg, const ModulePW::PW_Basis_K *wfc_basis, const UnitCell &ucell_in, const psi::Psi< std::complex< FPTYPE >, Device > *psi_in=nullptr)
atomic force for DFT+U and DeltaSpin
Definition forces_onsite.cpp:11
void cal_force_scc(ModuleBase::matrix &forcescc, const ModulePW::PW_Basis *const rho_basis, const ModuleBase::matrix &v_current, const bool vnew_exist, const bool *numeric, const UnitCell &ucell_in)
Definition forces_scc.cpp:24
void deriv_drhoc(const bool &numeric, const int mesh, const FPTYPE *r, const FPTYPE *rab, const FPTYPE *rhoc, FPTYPE *drhocg, const ModulePW::PW_Basis *const rho_basis, int type, const UnitCell &ucell_in)
Definition forces_cc.cpp:233
int npwx
Definition forces.h:52
Device * ctx
Definition forces.h:128
void cal_force(UnitCell &ucell, ModuleBase::matrix &force, const elecstate::ElecState &elec, const ModulePW::PW_Basis *const rho_basis, ModuleSymmetry::Symmetry *p_symm, Structure_Factor *p_sf, surchem &solvent, const pseudopot_cell_vl *locpp, const pseudopot_cell_vnl *nlpp=nullptr, K_Vectors *pkv=nullptr, ModulePW::PW_Basis_K *psi_basis=nullptr, const psi::Psi< std::complex< FPTYPE >, Device > *psi_in=nullptr)
Definition forces.cpp:25
base_device::DEVICE_CPU * cpu_ctx
Definition forces.h:129
Forces(const int nat_in)
Definition forces.h:34
void deriv_drhoc_scc(const bool &numeric, const int mesh, const FPTYPE *r, const FPTYPE *rab, const FPTYPE *rhoc, FPTYPE *drhocg, const ModulePW::PW_Basis *const rho_basis, const UnitCell &ucell_in)
Definition forces_scc.cpp:142
~Forces()
Definition forces.h:35
void cal_force_us(ModuleBase::matrix &forcenl, const ModulePW::PW_Basis *const rho_basis, const pseudopot_cell_vnl &ppcell_in, const elecstate::ElecState &elec, const UnitCell &ucell)
Definition forces_us.cpp:17
void cal_force_ew(const UnitCell &ucell, ModuleBase::matrix &forceion, const ModulePW::PW_Basis *const rho_basis, const Structure_Factor *p_sf)
Definition forces.cpp:472
void cal_ylm(int lmax, int npw, const FPTYPE *gk_in, FPTYPE *ylm)
void cal_force_loc(const UnitCell &ucell, ModuleBase::matrix &forcelc, const ModulePW::PW_Basis *const rho_basis, const ModuleBase::matrix &vloc, const Charge *const chr)
Definition forces.cpp:324
Definition klist.h:13
Definition matrix.h:19
Special pw_basis class. It includes different k-points.
Definition pw_basis_k.h:57
A class which can convert a function of "r" to the corresponding linear superposition of plane waves ...
Definition pw_basis.h:56
Definition symmetry.h:16
Definition structure_factor.h:11
Definition unitcell.h:16
Definition elecstate.h:15
Definition VL_in_pw.h:11
Definition VNL_in_pw.h:21
Definition psi.h:37
Definition surchem.h:15
AbacusDevice_t
Definition types.h:12
Definition math_kernel_op.h:217
Definition memory_op.h:77
Definition memory_op.h:17