class TersoffBrennerCorrectionPotential(particleType1, particleType2, activeTypes, L, U, x, z, f)

Constructor of the potential.

To construct this potential it is necessary to specify a threedimensional function. This is done by passing the function values of this function at some grid points. For all other points, tricubic interpolation is used. At the border of the grid, all derivatives are assumed to be zero.

  • particleType1 (ParticleType or ParticleIdentifier) – Identifier of the first particle type.
  • particleType2 (ParticleType or ParticleIdentifier) – Identifier of the second particle type.
  • activeTypes (sequence of ParticleType or ParticleIdentifier) – List of particle types that are involved in the calculation of the so-called conjugated part of the potential.
  • x (sequence of float) – The x-coordinates of the grid. It must have uniform spacing. The same coordinates are also used for the y-coordinates.
  • z (sequence of float) – The z-coordinates of the grid. It must have uniform spacing.
  • f (3D numpy.array) – The function values at the given grid points. f should be a threedimensional array of size (len(x), len(y), len(z)). f[i, j, k] should be the function value at (x[i], y[j], z[k]) and f must be symmetric with respect to its to first components, i.e. f[i, j, k] = f[j, i, k].

Return the names of all used parameters as a list.


Return all parameters of this potential and their current values as a <parameterName / parameterValue> dictionary.

static getDefaults()

Get the default parameters of this potential and return them in form of a dictionary of <parameter name, default value> key-value pairs.


Get the current value of the parameter parameterName.


Set the cutoff radius for this potential.

Parameters:r_cut (PhysicalQuantity of type length) – The cutoff radius of this potential.
setParameter(parameterName, value)

Set the parameter parameterName to the given value.

  • parameterName (str) – The name of the parameter that will be modified.
  • value – The new value that will be assigned to the parameter parameterName.

Usage Examples

Define Tersoff-Brenner correction potentials for carbon.

potentialSet = TremoloXPotentialSet(name = 'TersoffBrenner_CSiF_1999')
_potential = TersoffBrennerCorrectionPotential(
    particleType1 = ParticleIdentifier('C', []),
    particleType2 = ParticleIdentifier('C', []),
    activeTypes = [ParticleIdentifier('C', []), ],
    L = 2.0,
    U = 3.0,
    x = numpy.array([0., 1., 2., 3.]),
    z = numpy.array([0., 1., 2., 3.]),
    f = numpy.array([[
        [ 0.     ,  0.     ,  0.     ,  0.     ],
        [ 0.     , -0.02882,  0.     ,  0.     ],
        [ 0.     ,  0.     ,  0.     ,  0.     ],
        [ 0.     ,  0.     ,  0.     ,  0.     ]],

       [[ 0.     , -0.02882,  0.     ,  0.     ],
        [ 0.     , -0.0288 ,  0.     ,  0.     ],
        [ 0.     , -0.09   , -0.0243 , -0.0243 ],
        [ 0.     ,  0.     ,  0.     ,  0.     ]],

       [[ 0.     ,  0.     ,  0.     ,  0.     ],
        [ 0.     , -0.09   , -0.0243 , -0.0243 ],
        [ 0.     ,  0.0415 ,  0.     ,  0.     ],
        [ 0.     , -0.0363 , -0.0363 , -0.0363 ]],

       [[ 0.     ,  0.     ,  0.     ,  0.     ],
        [ 0.     ,  0.     ,  0.     ,  0.     ],
        [ 0.     , -0.0363 , -0.0363 , -0.0363 ],
        [ 0.     ,  0.     ,  0.     ,  0.     ]]]),


Several modifications of the original Tersoff potential have been proposed. One of them was introduced in [AG99] and is a combination of the Tersoff, Brenner and Tanaka potentials. For the sake of brevity we call it the Tersoff-Brenner potential.

The potential energy of the Tersoff-Brenner potential is given as the sum of attractive and repulsive potentials:

\[\begin{split}U^{TB} =\sum_i \sum_{i < j} U_{ij}^{rep} - U_{ij}^{att}.\end{split}\]

The repulsive interactions are the same as in the Tersoff potential

\[U_{ij}^{rep} = f^{TB}_{ij}(r_{ij}) A_{ij} \exp(-\lambda_{ij} r_{ij})\]

but a different tapering function \(f^{TB}_{ij}\) is used:

(1)\[\begin{split}f^{TB}_{ij} = \begin{cases} 1 & r_{ij}\leq R_{ij} \\ \frac{1}{2} - \frac{9}{16}\sin\left(\pi\frac{r_{ij} - 0.5(S_{ij} + R_{ij})}{S_{ij} - R_{ij}}\right) - \frac{1}{16}\sin\left(3\pi\frac{r_{ij} - 0.5(S_{ij} + R_{ij})}{S_{ij} - R_{ij}} \right) & R_{ij} < r_{ij} < S_{ij} \\ 0 & r_{ij}\geq S_{ij}. \end{cases}\end{split}\]

The attractive potential \(U^{att}_{ij}\) is given by the term

(2)\[\begin{split}\begin{align} U_{ij}^{att} &= \bar{b}_{ij} f^{TB}_{ij}(r_{ij}) B_{ij} \exp(-\mu_{ij} r_{ij}) \\ \bar{b}_{ij} &= \frac{1}{2} \left(b_{ij} + b_{ji} \right)\\ b_{ij} &= \left(1 + \left[\zeta_{ij}\right]^{\eta_{ij}} \right)^{-\delta_{ij}} \label{eq:TB:bij} \\ \zeta_{ij} &= \sum_{k\neq i,j} f_{ik}^{TB}(r_{ik}) g(\theta_{ijk}) \exp\left(\alpha_{ijk}\left[ (r_{ij} - R_{ij}^{(e)}) - (r_{ik} - R_{ik}^{(e)})\right]^{\beta_{ijk}} \right) \\ \end{align}\end{split}\]

The function \(g(\theta_{ijk})\), where \(\theta_{ijk}\) is the angle between the particles i-j and i-k, is either

(3)\[g(\theta_{ijk}) = c_{ijk} + d_{ijk}(h_{ijk} - \cos(\theta_{ijk}))^2\]


(4)\[g(\theta_{ijk}) = a_{ijk} \left(1 + \frac{c_{ijk}^2}{d_{ijk}^2} - \frac{c_{ijk}^2}{d_{ijk}^2 + (h_{ijk} - \cos(\theta_{ijk}))^2}\right).\]

The potential is activated in several steps.

To begin with, the pair-dependent parameters must be set by adding a TersoffBrennerPairPotential for each particle pair.

The parameters in the constructor of TersoffBrennerPairPotential map the the potential parameters as follows:

a The parameter \(A_{ij}\)
b The parameter \(B_{ij}\)
lambda The parameter \(\lambda_{ij}\)
mu The parameter \(\mu_{ij}\)
re The parameter \(R^{(e)}_{ij}\) that is only used if additional bond-order terms are activated
r1 The parameter \(R_{ij}\) in the taper function
r2 The parameter \(S_{ij}\) in the taper function

This sets all pairwise parameters except \(\eta_{ij}\) and \(\delta_{ij}\) which are set to 0, thereby deactivating all three-body interactions.

These parameters can be set by the TersoffBrennerBOPairPotential. Not that these parameters are used in a non-symmetric way, which means a TersoffBrennerBOPairPotential should be specified for each ij and ji.

The three-body parameters are set in a similar way. To use \(g(\theta)\) from equation (3) you need to set up a TersoffBrennerTriplePotential. For the alternative form (4) the TersoffBrennerTriplePotential2 should be used. Note that particle_type1 denotes the type of the central particle during the angle calculation. The remaining parameters are the following:

alpha The parameter \(\alpha_{ijk}\)
beta The parameter \(\beta_{ijk}\)
g_a The parameter \(a_{ijk}\) (TersoffBrennerTriplePotential2 only)
g_c The parameter \(c_{ijk}\)
g_d The parameter \(d_{ijk}\)
g_h The parameter \(h_{ij}\)

Another correction modifies the term \(b_{ij}\) in equation (2) as follows:

\[b_{ij} = \left(1 + [\zeta_{ij}]^{\eta_{ij}} + H_{ij}(N^{(1)}_{ij}, N^{(2)}_{ij}) \right)^{-\delta_{ij}}.\]

\(H_{ij}\) is an arbitrary 2D-function that is given as a bicubic spline. \(N^{(1)}_{ij}\) and \(N^{(2)}_{ij}\) are given by

\[\begin{split}\begin{align} N^{(1)}_{ij} &= \sum_{k\neq i,j\atop\textrm{type of }k\in P^{(1)}_{ij} } f_{ik}^{TB} \\ N^{(2)}_{ij} &= \sum_{k\neq i,j\atop\textrm{type of }k\in P^{(2)}_{ij} } f_{ik}^{TB}. \end{align}\end{split}\]

\(P^{(1)}_{ij}\) and \(P^{(2)}_{ij}\) are two lists of particle types that specify which interactions are taken into account for the calculation of \(N^{(1)}_{ij}\) and \(N^{(2)}_{ij}\). To enable this correction, a TersoffBrennerSplinePotential can be used where the parameters are defined as follows.

particleType1 The particle type referred to as i
particleType2 The particle type referred to as j
activeTypes1 The type list \(P^{(1)}_{ij}\)
activeTypes2 The type list \(P^{(2)}_{ij}\)
x The x-coordinates of the grid of the spline function
y The y-coordinates of the grid of the spline function
f The spline values on the x-y-grid

Note that this potential acts in a non-symmetric way, meaning that it will only act on ij type pairs, but not on ji type pairs.

Finally, the term \(\bar{b }_{ij}\) in equation (2) can be modified in the following way:

\[\bar{b}_{ij} = \frac{1}{2} \left(b_{ij} + b_{ji}\right) + F_{corr}(N^{(t)}_{ij}, N^{(t)}_{ji}, N^{(conj)}_{ij}).\]

The function \(F_{corr}\) is an arbitrary 3D-function that is given as a tricubic spline. \(N^{(t)}_{ij}\) is the coordination number of particle \(i\), excluding \(j\), i.e.

\[\begin{split}N^{(t)}_{ij} = \sum_{k\neq i,j} f_{ik}^{TB}. \\\end{split}\]

\(N^{(conj)}_{ij}\) is defined as follows:

\[N^{(conj)}_{ij} = 1 + \sum_{k\neq i,j\atop\textrm{type of }k\in P^{(conj)}_{ij} } f_{ik}^{TB} T_{ij}(N_{ki}^{(t)}) + \sum_{l\neq i,j\atop\textrm{type of }k\in P^{(conj)}_{ij} } f_{jl}^{TB} T_{ij}(N_{lj}^{(t)}).\]

\(T_{ij}\) is a new type of tapering function given by

\[\begin{split}T_{ij}(x) = \begin{cases} 1, & x\leq L_{ij} \\ \frac{1}{2} + \frac{1}{2}\cos\left(\frac{\pi(x - L_{ij})}{U_{ij} - L_{ij}} \right), & L_{ij} < x < U_{ij} \\ 0, & x\geq U_{ij}. \end{cases}\end{split}\]

\(P^{(conj)}_{ij}\) is a list of particle types that specify which interactions are taken into account for the calculation of \(N^{(conj)}_{ij}\). For this correction the TersoffBrennerCorrectionPotential can be used.

particleType1 The particle type referred to as i
particleType2 The particle type referred to as j
activeTypes The type list among which neighbors of atoms i and j should be searched for.
L The lower cutoff in \(T_{ij}\)
U The upper cutoff in \(T_{ij}\)
x The x-coordinates of the grid of the spline function. The same values are used for the y-coordinates
z The z-coordinates of the grid of the spline function
f The spline values on the x-y-z-grid

In contrast to the TersoffBrennerSplinePotential, this correction acts in a symmetric way between the types ij.

[AG99]Cameron F Abrams and David B Graves. Molecular dynamics simulations of si etching by energetic cf 3+. Journal of applied physics, 86(11):5938–5948, 1999. URL: https://doi.org/10.1063/1.371637, doi:10.1063/1.371637.