ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
vdwd2.h
Go to the documentation of this file.
1//==========================================================
2// AUTHOR : Peize Lin
3// DATE : 2014-04-25
4// UPDATE : 2019-04-26
5//==========================================================
6
7#ifndef VDWD2_H
8#define VDWD2_H
9
10#include "vdw.h"
11
12namespace vdw
13{
14
15class Vdwd2 : public Vdw
16{
17
18 public:
19 Vdwd2(const UnitCell &unit_in) : Vdw(unit_in) {}
20
21 ~Vdwd2() = default;
22
24 const Vdwd2Parameters &parameter() const { return para_; }
25
26 private:
28
29 void cal_energy() override;
30 void cal_force() override;
31 void cal_stress() override;
32
33 template <typename F> void index_loops(F &&f)
34 {
35 int xidx = para_.period().x / 2;
36 int yidx = para_.period().y / 2;
37 int zidx = para_.period().z / 2;
38
39 for (int it1 = 0; it1 != ucell_.ntype; ++it1)
40 {
41 for (int it2 = 0; it2 != ucell_.ntype; ++it2)
42 {
43 const double C6_product
44 = sqrt(para_.C6().at(ucell_.atoms[it1].ncpp.psd) * para_.C6().at(ucell_.atoms[it2].ncpp.psd))
45 / pow(ucell_.lat0, 6);
46 const double R0_sum
47 = (para_.R0().at(ucell_.atoms[it1].ncpp.psd) + para_.R0().at(ucell_.atoms[it2].ncpp.psd)) / ucell_.lat0;
48 if (!R0_sum)
49 {
50 ModuleBase::WARNING_QUIT("Input", "R0_sum can not be 0");
51 }
52 for (int ia1 = 0; ia1 != ucell_.atoms[it1].na; ++ia1)
53 {
54 const ModuleBase::Vector3<double> tau1 = ucell_.atoms[it1].tau[ia1];
55 for (int ia2 = 0; ia2 != ucell_.atoms[it2].na; ++ia2)
56 {
58 for (ilat_loop.x = -xidx; ilat_loop.x <= xidx; ++ilat_loop.x)
59 {
60 for (ilat_loop.y = -yidx; ilat_loop.y <= yidx; ++ilat_loop.y)
61 {
62 for (ilat_loop.z = -zidx; ilat_loop.z <= zidx; ++ilat_loop.z)
63 {
64 if ((!(ilat_loop.x || ilat_loop.y || ilat_loop.z)) && (it1 == it2) && (ia1 == ia2))
65 continue;
67 = ucell_.atoms[it2].tau[ia2] + ilat_loop * ucell_.latvec;
68 const double r_sqr = (tau1 - tau2).norm2();
69 const double r = sqrt(r_sqr);
70 // calculations happen in f
71 f(r, R0_sum, C6_product, r_sqr, it1, ia1, tau1, tau2);
72 }
73 }
74 } // end for ilat_loop
75 } // end for ia2
76 } // end for ia1
77 } // end for it2
78 } // end for it1
79 }
80};
81
82} // namespace vdw
83
84#endif // VDWD2_H
Atom_pseudo ncpp
Definition atom_spec.h:13
int na
Definition atom_spec.h:28
std::vector< ModuleBase::Vector3< double > > tau
Definition atom_spec.h:36
3 elements vector
Definition vector3.h:22
T x
Definition vector3.h:24
T y
Definition vector3.h:25
T z
Definition vector3.h:26
Definition unitcell.h:16
Atom * atoms
Definition unitcell.h:18
double & lat0
Definition unitcell.h:28
ModuleBase::Matrix3 & latvec
Definition unitcell.h:35
int & ntype
Definition unitcell.h:45
std::string psd
Definition pseudo.h:21
const ModuleBase::Vector3< int > & period() const
Definition vdw_parameters.h:18
Definition vdw.h:21
const UnitCell & ucell_
Definition vdw.h:41
Definition vdwd2_parameters.h:19
const std::map< std::string, double > R0() const
Definition vdwd2_parameters.h:48
const std::map< std::string, double > C6() const
Definition vdwd2_parameters.h:47
Definition vdwd2.h:16
~Vdwd2()=default
const Vdwd2Parameters & parameter() const
Definition vdwd2.h:24
Vdwd2Parameters para_
Definition vdwd2.h:27
Vdwd2(const UnitCell &unit_in)
Definition vdwd2.h:19
void cal_energy() override
Definition vdwd2.cpp:13
void cal_stress() override
Definition vdwd2.cpp:65
void cal_force() override
Definition vdwd2.cpp:36
Vdwd2Parameters & parameter()
Definition vdwd2.h:23
void index_loops(F &&f)
Definition vdwd2.h:33
void WARNING_QUIT(const std::string &, const std::string &)
Combine the functions of WARNING and QUIT.
Definition test_delley.cpp:14
Definition vdw.cpp:41