Source code for gamdpy.interactions.potential_functions.SAAP

import numba
from math import exp

[docs] def SAAP(dist, params): """ The SAAP potential is a pair potential for noble elements, its parameters are derived from fitting on data obtained from ab initio methods (coupled cluster): .. math:: u(x=r/\\sigma)/\\epsilon = (a_0\\exp(a_1 x)/x + a_2\\exp(a_3 x) + a_4) / (1+a_5 x^6) The six :math:`a_i` parameters are given in units of eps and sigma. Reference: https://doi.org/10.1063/1.5085420 Parameters ---------- dist : float Distance between particles params : array-like a₀, a₁, a₂, a₃, a₄, a₅, σ, ε """ # Extract parameters compatibly with numba, in float32 precision a0 = numba.float32(params[0]) a1 = numba.float32(params[1]) a2 = numba.float32(params[2]) a3 = numba.float32(params[3]) a4 = numba.float32(params[4]) a5 = numba.float32(params[5]) sigma = numba.float32(params[6]) eps = numba.float32(params[7]) # Definition of a reduced distance to make all consistent with the fact that # the various a parameters are given in units of eps and sigma r = dist / sigma # Compute helper variables one = numba.float32(1.0) inv_r = one/r exp_a1_r = exp(a1 * r) a0_exp_r = a0 * exp_a1_r * inv_r # a0 exp(a1 r)/r a2_exp = a2 * exp(a3 * r) inverse_one_a5 = one / (one + a5 * r**6) # Compute pair potential energy, pair force and pair curvature # SAAP computation for r u = eps * (a0_exp_r + a2_exp + a4) * inverse_one_a5 # Compute helper variables for s s1 = -6*a5*r**5*(a0*exp(a1*r)/r + a2*exp(a3*r) + a4)/(a5*r**6 + one)**2 s2 = (a0*a1*exp(a1*r)/r - a0*exp(a1*r)/r**2 + a2*a3*exp(a3*r))/(a5*r**6 + one) # First derivative of SAAP divided by r with a minus sign s = - eps * (s1 + s2) / (r * sigma**2) # sigma² because of chain rule (CR) and 1/dist = 1/(r sigma) # Compute helper variables for u''(r) d2u_dr2_1 = numba.float32(72.0)*a5**2*r**10*(a0*exp(a1*r)/r + a2*exp(a3*r) + a4)/(a5*r**6 + one)**3 d2u_dr2_2 = -numba.float32(12.0)*a5*r**5*(a0*a1*exp(a1*r)/r - a0*exp(a1*r)/r**2 + a2*a3*exp(a3*r))/(a5*r**6 + one)**2 d2u_dr2_3 = -numba.float32(30.0)*a5*r**4*(a0*exp(a1*r)/r + a2*exp(a3*r) + a4)/(a5*r**6 + one)**2 d2u_dr2_4 = (a0*a1**2*exp(a1*r)/r - numba.float32(2.0)*a0*a1*exp(a1*r)/r**2 + numba.float32(2.0)*a0*exp(a1*r)/r**3 + a2*a3**2*exp(a3*r))/(a5*r**6 + one) # Second derivative of SAAP d2u_dr2 = eps * (d2u_dr2_1 + d2u_dr2_2 + d2u_dr2_3 + d2u_dr2_4) / sigma**2 # sigma² because of double CR return u, s, d2u_dr2 # u(r), -u'(r)/r, u''(r)