25 #include "./base/base_uses.f90"
31 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pair_potential_util'
32 REAL(KIND=
dp),
PARAMETER,
PRIVATE :: min_hicut_value = 1.0e-15_dp, &
33 default_hicut_value = 1.0e3_dp
46 FUNCTION ener_pot(pot, r, energy_cutoff)
RESULT(value)
47 TYPE(pair_potential_single_type),
POINTER :: pot
48 REAL(kind=
dp),
INTENT(IN) :: r, energy_cutoff
49 REAL(kind=
dp) ::
value
51 INTEGER :: i, index, index1, index2, j, n
52 REAL(kind=
dp) :: bd6, bd8, dampsum, f6, f8, lvalue, pp, &
56 DO j = 1,
SIZE(pot%type)
58 IF ((pot%set(j)%rmin /=
not_initialized) .AND. (r < pot%set(j)%rmin)) cycle
60 IF ((pot%set(j)%rmax /=
not_initialized) .AND. (r >= pot%set(j)%rmax)) cycle
64 4.0_dp*pot%set(j)%lj%epsilon*(pot%set(j)%lj%sigma12*r**(-12) - pot%set(j)%lj% &
66 ELSE IF (pot%type(j) ==
lj_type)
THEN
67 lvalue = pot%set(j)%lj%epsilon* &
68 (pot%set(j)%lj%sigma12*r**(-12) - pot%set(j)%lj%sigma6*r**(-6))
69 ELSE IF (pot%type(j) ==
ip_type)
THEN
71 IF (r > pot%set(j)%ipbv%rcore)
THEN
73 lvalue = lvalue + pot%set(j)%ipbv%a(i)/(r**(i - 1)*real(i - 1,
dp))
77 lvalue = pot%set(j)%ipbv%m*r + pot%set(j)%ipbv%b
80 ELSE IF (pot%type(j) ==
wl_type)
THEN
81 lvalue = pot%set(j)%willis%a*exp(-pot%set(j)%willis%b*r) - pot%set(j)%willis%c/r**6
82 ELSE IF (pot%type(j) ==
gw_type)
THEN
83 scale = exp(pot%set(j)%goodwin%m*(-(r/pot%set(j)%goodwin%dc)**pot%set(j)%goodwin%mc + &
84 (pot%set(j)%goodwin%d/pot%set(j)%goodwin%dc)**pot%set(j)%goodwin%mc))
85 lvalue = scale*pot%set(j)%goodwin%vr0*(pot%set(j)%goodwin%d/r)**pot%set(j)%goodwin%m
86 ELSE IF (pot%type(j) ==
ft_type)
THEN
87 lvalue = pot%set(j)%ft%a*exp(-pot%set(j)%ft%b*r) - pot%set(j)%ft%c/r**6 - pot%set(j)%ft%d/r**8
88 ELSE IF (pot%type(j) ==
ftd_type)
THEN
90 bd6 = pot%set(j)%ftd%bd(1)
95 dampsum = dampsum + xf*
ifac(i)
97 f6 = 1.0_dp - exp(-bd6*r)*dampsum
99 bd8 = pot%set(j)%ftd%bd(2)
104 dampsum = dampsum + xf*
ifac(i)
106 f8 = 1.0_dp - exp(-bd8*r)*dampsum
107 lvalue = pot%set(j)%ftd%a*exp(-pot%set(j)%ftd%b*r) - f6*pot%set(j)%ftd%c/r**6 - f8*pot%set(j)%ftd%d/r**8
108 ELSE IF (pot%type(j) ==
ea_type)
THEN
109 index = int(r/pot%set(j)%eam%drar) + 1
110 IF (index > pot%set(j)%eam%npoints)
THEN
111 index = pot%set(j)%eam%npoints
112 ELSEIF (index < 1)
THEN
115 qq = r - pot%set(j)%eam%rval(index)
116 pp = pot%set(j)%eam%phi(index) + &
117 qq*pot%set(j)%eam%phip(index)
119 ELSE IF (pot%type(j) ==
b4_type)
THEN
120 IF (r <= pot%set(j)%buck4r%r1)
THEN
121 pp = pot%set(j)%buck4r%a*exp(-pot%set(j)%buck4r%b*r)
122 ELSEIF (r > pot%set(j)%buck4r%r1 .AND. r <= pot%set(j)%buck4r%r2)
THEN
124 DO n = 0, pot%set(j)%buck4r%npoly1
125 pp = pp + pot%set(j)%buck4r%poly1(n)*r**n
127 ELSEIF (r > pot%set(j)%buck4r%r2 .AND. r <= pot%set(j)%buck4r%r3)
THEN
129 DO n = 0, pot%set(j)%buck4r%npoly2
130 pp = pp + pot%set(j)%buck4r%poly2(n)*r**n
132 ELSEIF (r > pot%set(j)%buck4r%r3)
THEN
133 pp = -pot%set(j)%buck4r%c/r**6
136 ELSE IF (pot%type(j) ==
tab_type)
THEN
137 index1 = floor((r - pot%set(j)%tab%r(1))/pot%set(j)%tab%dr) + 1
139 IF (index2 > pot%set(j)%tab%npoints)
THEN
140 index2 = pot%set(j)%tab%npoints
142 ELSEIF (index1 < 1)
THEN
146 pp = pot%set(j)%tab%e(index1) + (r - pot%set(j)%tab%r(index1))* &
147 (pot%set(j)%tab%e(index2) - pot%set(j)%tab%e(index1))/ &
148 (pot%set(j)%tab%r(index2) - pot%set(j)%tab%r(index1))
150 ELSE IF (pot%type(j) ==
bm_type)
THEN
151 lvalue = pot%set(j)%buckmo%f0*(pot%set(j)%buckmo%b1 + pot%set(j)%buckmo%b2)* &
152 exp((pot%set(j)%buckmo%a1 + pot%set(j)%buckmo%a2 - r)/(pot%set(j)%buckmo%b1 + pot%set(j)%buckmo%b2)) &
153 - pot%set(j)%buckmo%c/r**6 &
154 + pot%set(j)%buckmo%d*(exp(-2._dp*pot%set(j)%buckmo%beta*(r - pot%set(j)%buckmo%r0)) - &
155 2.0_dp*exp(-pot%set(j)%buckmo%beta*(r - pot%set(j)%buckmo%r0)))
156 ELSE IF (pot%type(j) ==
gp_type)
THEN
157 pot%set(j)%gp%values(1) = r
158 lvalue =
evalf(pot%set(j)%gp%myid, pot%set(j)%gp%values)
160 cpabort(
"Error evaluating generic potential energy function")
164 value =
value + lvalue
166 value =
value - energy_cutoff
179 TYPE(pair_potential_single_type),
POINTER :: pot
180 REAL(kind=
dp),
INTENT(IN) :: r
183 REAL(kind=
dp) :: au,
fac, x
186 IF (r <= pot%zbl_rcut(1))
THEN
187 au = 0.88534_dp*
bohr/(pot%z1**0.23_dp + pot%z2**0.23_dp)
190 ener_zbl =
fac/r*(0.1818_dp*exp(-3.2_dp*x) + 0.5099_dp*exp(-0.9423_dp*x) + &
191 0.2802_dp*exp(-0.4029_dp*x) + 0.02817_dp*exp(-0.2016_dp*x))
192 ELSEIF (r > pot%zbl_rcut(1) .AND. r <= pot%zbl_rcut(2))
THEN
193 ener_zbl = pot%zbl_poly(0) + pot%zbl_poly(1)*r + pot%zbl_poly(2)*r*r + pot%zbl_poly(3)*r*r*r + &
194 pot%zbl_poly(4)*r*r*r*r + pot%zbl_poly(5)*r*r*r*r*r
214 TYPE(pair_potential_single_type),
POINTER :: pot
215 REAL(kind=
dp),
INTENT(IN) :: rcov1, rcov2, z1, z2
217 REAL(kind=
dp) :: au, d1, d2, dd1, dd2,
fac, v1, v2, x, &
220 pot%zbl_rcut(1) = (rcov1 + rcov2)*(1.0_dp - 0.2_dp)*
bohr
221 pot%zbl_rcut(2) = (rcov1 + rcov2)*
bohr
227 au = 0.88534_dp*
bohr/(z1**0.23_dp + z2**0.23_dp)
230 v1 =
fac/x1*(0.1818_dp*exp(-3.2_dp*x) + 0.5099_dp*exp(-0.9423_dp*x) + &
231 0.2802_dp*exp(-0.4029_dp*x) + 0.02817_dp*exp(-0.2016_dp*x))
232 d1 =
fac/x1/au*(-3.2_dp*0.1818_dp*exp(-3.2_dp*x) - 0.9423_dp*0.5099_dp*exp(-0.9423_dp*x) &
233 - 0.4029_dp*0.2802_dp*exp(-0.4029_dp*x) - 0.2016_dp*0.02817_dp*exp(-0.2016_dp*x)) &
234 -
fac/x1/x1*(0.1818_dp*exp(-3.2_dp*x) + 0.5099_dp*exp(-0.9423_dp*x) + &
235 0.2802_dp*exp(-0.4029_dp*x) + 0.02817_dp*exp(-0.2016_dp*x))
237 dd1 = 2.0_dp*
fac/x1**3*(0.1818_dp*exp(-0.32e1_dp*x) &
238 + 0.5099_dp*exp(-0.9423_dp*x) + 0.2802_dp*exp(-0.4029_dp*x) &
239 + 0.2817e-1_dp*exp(-0.2016_dp*x)) &
240 - 0.2e1_dp*
fac/x1**2/au*(-0.58176_dp*exp(-0.32e1_dp*x) - 0.48047877_dp*exp(-0.9423_dp*x) &
241 - 0.11289258_dp*exp(-0.4029_dp*x) - 0.5679072e-2_dp*exp(-0.2016_dp*x)) &
242 +
fac/x1/au**2*(0.1861632e1_dp*exp(-0.32e1_dp*x) + &
243 0.4527551450_dp*exp(-0.9423_dp*x) + 0.4548442048e-1_dp*exp(-0.4029_dp*x) + &
244 0.1144900915e-2_dp*exp(-0.2016_dp*x))
250 CALL compute_polinomial_5th(x1, v1, d1, dd1, x2, v2, d2, dd2, pot%zbl_poly)
266 SUBROUTINE compute_polinomial_5th(r1, v1, d1, dd1, r2, v2, d2, dd2, poly)
268 REAL(kind=
dp) :: r1, v1, d1, dd1, r2, v2, d2, dd2, &
271 REAL(kind=
dp) :: a0, a1, a2, a3, a4, a5
275 a0 = .5_dp*(2._dp*r1**5*v2 - 2._dp*v1*r2**5 + 10._dp*v1*r2**4*r1 - 20._dp*v1*r1**2*r2**3 - r1**2*dd1*r2**5 - &
276 r1**4*r2**3*dd1 + 20._dp*r1**3*r2**2*v2 + 2._dp*r1**3*r2**4*dd1 + r1**3*r2**4*dd2 - 8._dp*r1**3*r2**3*d2 - &
277 2._dp*r1**4*r2**3*dd2 + 10._dp*r1**4*r2**2*d2 - 10._dp*r1**4*r2*v2 + 2._dp*r1*d1*r2**5 - 10._dp*r1**2*d1*r2**4 + &
278 8._dp*r1**3*d1*r2**3 - 2._dp*r1**5*r2*d2 + r1**5*r2**2*dd2)/ &
279 (10.*r2**2*r1**3 - 5._dp*r2*r1**4 - 10._dp*r1**2*r2**3 + 5._dp*r2**4*r1 - r2**5 + r1**5)
281 a1 = -.5_dp*(-4._dp*r2**3*r1**3*dd2 + 24._dp*r2**2*r1**3*d1 + 4._dp*r2**3*r1**3*dd1 + 3._dp*r2**4*r1**2*dd2 + &
282 r2**4*r1**2*dd1 - 2._dp*r2**5*r1*dd1 - 10._dp*r2**4*r1*d1 + 10._dp*r1**4*r2*d2 - &
283 r1**4*r2**2*dd2 - 3._dp*r1**4*r2**2*dd1 + &
284 2._dp*r1**5*r2*dd2 - 24._dp*r2**3*r1**2*d2 - 16._dp*r2**3*r1**2*d1 + &
285 16._dp*r2**2*r1**3*d2 - 2._dp*r1**5*d2 + 2._dp*r2**5*d1 - &
286 60._dp*r1**2*r2**2*v1 + 60._dp*r1**2*r2**2*v2)/ &
287 (10._dp*r2**2*r1**3 - 5._dp*r2*r1**4 - 10._dp*r1**2*r2**3 + 5._dp*r2**4*r1 - r2**5 + r1**5)
289 a2 = .5_dp*(60._dp*r1**2*r2*v2 - 60._dp*v1*r1*r2**2 - 12._dp*r1**2*r2**2*d2 - 36._dp*r1*d1*r2**3 + 3._dp*r2**4*r1*dd2 - &
290 24._dp*r2**3*r1*d2 - 4._dp*r2**4*r1*dd1 + 12._dp*r1**2*r2**2*d1 - 8._dp*r1**3*r2**2*dd2 + 24._dp*r1**3*r2*d1 + &
291 4._dp*r1**4*r2*dd2 + 36._dp*r1**3*r2*d2 - 3._dp*r1**4*r2*dd1 + 8._dp*r2**3*r1**2*dd1 + 60._dp*r2**2*r1*v2 - &
292 60._dp*r1**2*v1*r2 + r1**5*dd2 - r2**5*dd1)/ &
293 (10._dp*r2**2*r1**3 - 5._dp*r2*r1**4 - 10._dp*r1**2*r2**3 + 5._dp*r2**4*r1 - r2**5 + r1**5)
295 a3 = -.5_dp*(3._dp*r1**4*dd2 - r1**4*dd1 + 8.*r1**3*d1 - 4.*r1**3*r2*dd1 + &
296 12._dp*r1**3*d2 + 32._dp*r1**2*r2*d1 - 8._dp*r1**2*r2**2*dd2 - &
297 20._dp*r1**2*v1 + 8._dp*r1**2*r2**2*dd1 + 28._dp*r1**2*r2*d2 + &
298 20._dp*r1**2*v2 + 80._dp*r1*r2*v2 - 28._dp*r2**2*r1*d1 - 80._dp*r1*v1*r2 - &
299 32._dp*r2**2*r1*d2 + 4._dp*r1*r2**3*dd2 - 8._dp*r2**3*d2 - 12._dp*r2**3*d1 + &
300 r2**4*dd2 - 3._dp*r2**4*dd1 + 20._dp*r2**2*v2 - 20._dp*r2**2*v1)/ &
301 (10._dp*r2**2*r1**3 - 5._dp*r2*r1**4 - 10._dp*r1**2*r2**3 + 5._dp*r2**4*r1 - r2**5 + r1**5)
303 a4 = .5_dp*(3._dp*r1**3*dd2 - 2._dp*r1**3*dd1 + r1**2*r2*dd1 + 14.*r1**2*d1 - 4._dp*r1**2*r2*dd2 + &
304 16._dp*r1**2*d2 - 2._dp*r1*r2*d2 - r1*r2**2*dd2 - &
305 30._dp*r1*v1 + 30.*r1*v2 + 2._dp*r1*r2*d1 + 4._dp*r1*r2**2*dd1 - 16._dp*r2**2*d1 + &
306 2._dp*r2**3*dd2 - 14._dp*r2**2*d2 + 30._dp*r2*v2 - 30._dp*v1*r2 - &
307 3._dp*r2**3*dd1)/(10._dp*r2**2*r1**3 - 5._dp*r2*r1**4 - &
308 10._dp*r1**2*r2**3 + 5._dp*r2**4*r1 - r2**5 + r1**5)
310 a5 = -.5_dp*(6._dp*r1*d1 + 2._dp*r2*r1*dd1 + 6._dp*r1*d2 - 2.*r2*r1*dd2 - &
311 r2**2*dd1 - r1**2*dd1 - 12.*v1 + 12._dp*v2 + r1**2*dd2 - &
312 6._dp*r2*d1 + r2**2*dd2 - 6._dp*r2*d2)/ &
313 (10._dp*r2**2*r1**3 - 5._dp*r2*r1**4 - 10._dp*r1**2*r2**3 + 5._dp*r2**4*r1 - r2**5 + r1**5)
322 END SUBROUTINE compute_polinomial_5th
static GRID_HOST_DEVICE double fac(const int i)
Factorial function, e.g. fac(5) = 5! = 120.
This public domain function parser module is intended for applications where a set of mathematical ex...
real(rn) function, public evalf(i, Val)
...
integer, public evalerrtype
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), dimension(0:maxfac), parameter, public ifac
integer, parameter, public lj_charmm_type
integer, parameter, public bm_type
integer, parameter, public wl_type
integer, parameter, public ft_type
integer, parameter, public tab_type
integer, parameter, public ftd_type
integer, parameter, public ip_type
integer, parameter, public lj_type
integer, parameter, public gp_type
integer, parameter, public gw_type
real(kind=dp), parameter, public not_initialized
integer, parameter, public b4_type
integer, parameter, public ea_type
real(kind=dp) function, public ener_zbl(pot, r)
Evaluates the ZBL scattering potential, very short range Only shell-model for interactions among pair...
real(kind=dp) function, public ener_pot(pot, r, energy_cutoff)
Evaluates the nonbond potential energy for the implemented FF kinds.
subroutine, public zbl_matching_polinomial(pot, rcov1, rcov2, z1, z2)
Determine the polinomial coefficients used to set to zero the zbl potential at the cutoff radius,...
Definition of physical constants:
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public bohr