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#include "source_lcao/module_dftu/dftu.h" // mohan add 2025-11-06
18
19template <typename FPTYPE, typename Device = base_device::DEVICE_CPU>
20class Forces
21{
22 public:
23 template <typename T>
24 friend class Force_Stress_LCAO;
25 /* This routine is a driver routine which compute the forces
26 * acting on the atoms, the complete forces in plane waves
27 * is computed from 4 main parts
28 * (1) cal_force_loc: contribution due to local potential.
29 * (2) cal_foce_ew: contribution due to ewald potential.
30 * (3) cal_force_cc: contributino due to NLCC.
31 * (4) cal_nl: contribution due to the non-local pseudopotential.
32 * (5) cal_force_us: contribution due to US pseudopotential.
33 * (6) cal_scc: contributino due to incomplete SCF calculation.
34 */
35 Forces(const int nat_in) : nat(nat_in){};
37
38 void cal_force(UnitCell& ucell,
39 ModuleBase::matrix& force,
40 const elecstate::ElecState& elec,
41 const ModulePW::PW_Basis* const rho_basis,
43 Structure_Factor* p_sf,
44 surchem& solvent,
45 const Plus_U *p_dftu, //mohan add 2025-11-06
46 const pseudopot_cell_vl* locpp,
47 const pseudopot_cell_vnl* nlpp = nullptr,
48 K_Vectors* pkv = nullptr,
49 ModulePW::PW_Basis_K* psi_basis = nullptr,
50 const psi::Psi<std::complex<FPTYPE>, Device>* psi_in = nullptr);
51
52 protected:
53 int nat = 0;
54 int npwx = 0;
55
56 void cal_force_loc(const UnitCell& ucell,
57 ModuleBase::matrix& forcelc,
58 const ModulePW::PW_Basis* const rho_basis,
59 const ModuleBase::matrix& vloc,
60 const Charge* const chr);
61 void cal_force_ew(const UnitCell& ucell,
62 ModuleBase::matrix& forceion,
63 const ModulePW::PW_Basis* const rho_basis,
64 const Structure_Factor* p_sf);
65 void cal_force_cc(ModuleBase::matrix& forcecc,
66 const ModulePW::PW_Basis* const rho_basis,
67 const Charge* const chr,
68 const bool* numeric,
69 UnitCell& ucell_in);
80 void cal_force_nl(ModuleBase::matrix& forcenl,
81 const ModuleBase::matrix& wg,
82 const ModuleBase::matrix& ekb,
83 const K_Vectors* p_kv,
84 const ModulePW::PW_Basis_K* psi_basis,
85 const Structure_Factor* p_sf,
86 const pseudopot_cell_vnl& nlpp_in,
87 const UnitCell& ucell_in,
88 const psi::Psi<std::complex<FPTYPE>, Device>* psi_in = nullptr);
95 void cal_force_onsite(ModuleBase::matrix& force_onsite,
96 const ModuleBase::matrix& wg,
97 const ModulePW::PW_Basis_K* wfc_basis,
98 const UnitCell& ucell_in,
99 const Plus_U &dftu, // mohan add 2025-11-06
100 const psi::Psi <std::complex<FPTYPE>, Device>* psi_in = nullptr);
101
102 void cal_force_scc(ModuleBase::matrix& forcescc,
103 const ModulePW::PW_Basis* const rho_basis,
104 const ModuleBase::matrix& v_current,
105 const bool vnew_exist,
106 const bool* numeric,
107 const UnitCell& ucell_in);
108 void cal_force_us(ModuleBase::matrix& forcenl,
109 const ModulePW::PW_Basis* const rho_basis,
110 const pseudopot_cell_vnl& ppcell_in,
111 const elecstate::ElecState& elec,
112 const UnitCell& ucell);
113 void cal_ylm(int lmax, int npw, const FPTYPE* gk_in, FPTYPE* ylm);
114 void deriv_drhoc(const bool& numeric,
115 const int mesh,
116 const FPTYPE* r,
117 const FPTYPE* rab,
118 const FPTYPE* rhoc,
119 FPTYPE* drhocg,
120 const ModulePW::PW_Basis* const rho_basis,
121 int type,
122 const UnitCell& ucell_in); // used in nonlinear core correction stress
123 void deriv_drhoc_scc(const bool& numeric,
124 const int mesh,
125 const FPTYPE* r,
126 const FPTYPE* rab,
127 const FPTYPE* rhoc,
128 FPTYPE* drhocg,
129 const ModulePW::PW_Basis* const rho_basis,
130 const UnitCell& ucell_in); // used in nonlinear core correction stress
131 protected:
132 Device* ctx = {};
133 base_device::DEVICE_CPU* cpu_ctx = {};
135 private:
137
143 = base_device::memory::synchronize_memory_op<std::complex<FPTYPE>, Device, base_device::DEVICE_CPU>;
145 = base_device::memory::synchronize_memory_op<std::complex<FPTYPE>, base_device::DEVICE_CPU, Device>;
146
151
155};
156
157#endif
Definition charge.h:18
Definition FORCE_STRESS.h:25
Definition forces.h:21
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:134
int nat
Definition forces.h:53
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_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:245
int npwx
Definition forces.h:54
Device * ctx
Definition forces.h:132
base_device::DEVICE_CPU * cpu_ctx
Definition forces.h:133
Forces(const int nat_in)
Definition forces.h:35
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:144
~Forces()
Definition forces.h:36
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 Plus_U *p_dftu, 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
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:474
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:326
void cal_force_onsite(ModuleBase::matrix &force_onsite, const ModuleBase::matrix &wg, const ModulePW::PW_Basis_K *wfc_basis, const UnitCell &ucell_in, const Plus_U &dftu, const psi::Psi< std::complex< FPTYPE >, Device > *psi_in=nullptr)
atomic force for DFT+U and DeltaSpin
Definition forces_onsite.cpp:11
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 dftu.h:20
Definition structure_factor.h:11
Definition unitcell.h:17
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:115
Definition memory_op.h:17
Plus_U dftu
Definition test_dftu.cpp:14