Tersoff Calculator
The Tersoff potential is a three-body empirical potential that can model covalently bonded solids like silicon or carbon. This implementation provides a native ASE calculator that follows the LAMMPS-style Tersoff parameterization.
Note
The performance of the routines for this calculator have not been optimized for speed nor benchmarked with the LAMMPS implementation.
Theory
The many-body interaction is based on bond-order concept that includes both two-body and three-body terms. The total energy is given by:
where the repulsive and attractive pair terms are:
The cutoff function \(f_C(r)\) ensures smooth decay of interactions:
The bond order term \(b_{ij}\) captures the short-range local atomic environment:
where \(\theta_{ijk}\) is the angle between bonds \(ij\) and \(ik\). The angular function \(g(\theta)\) is:
where \(h = \cos \theta_0\) defines the preferred angle \(\theta_0\).
The parameters \(A\), \(B\), \(\lambda_1\), \(\lambda_2\), \(\lambda_3\), \(\beta\), \(n\), \(c\), \(d\), \(h\), \(\gamma\), \(m\), \(R\), and \(D\) define the potential for each interaction type.
For a complete description of the functional forms and parameters, see the
ase.calculators.tersoff
module documentation.
Parameters
The Tersoff potential is defined by 14 parameters for each three-body interaction:
Parameter |
Description |
---|---|
A |
Repulsive pair potential prefactor |
B |
Attractive pair potential prefactor |
lambda1 |
Decay length for repulsive term |
lambda2 |
Decay length for attractive term |
lambda3 |
Decay length for angular term |
beta |
Angular strength parameter |
n |
Angular exponent |
c |
Angular coefficient |
d |
Angular parameter |
h |
Cosine of angle parameter |
gamma |
Angular scaling |
m |
Bond order exponent |
R |
Cutoff distance |
D |
Cutoff width |
See ase.calculators.tersoff.TersoffParameters
for details.
Examples
Silicon Diamond Structure
Using calculator on silicon crystal in the diamond structure:
from ase.build import bulk
from ase.calculators.tersoff import Tersoff, TersoffParameters
# Create silicon diamond structure
si = bulk("Si", "diamond", a=5.43)
# Define Tersoff parameters for Si
si_params = {
("Si", "Si", "Si"): TersoffParameters(
A=3264.7,
B=95.373,
lambda1=3.2394,
lambda2=1.3258,
lambda3=1.3258,
beta=0.33675,
gamma=1.00,
m=3.00,
n=22.956,
c=4.8381,
d=2.0417,
h=0.0000,
R=3.00,
D=0.20,
)
}
# Set up calculator
calc = Tersoff(si_params)
si.calc = calc
# Calculate properties
energy = si.get_potential_energy()
forces = si.get_forces()
stress = si.get_stress()
Parameter Updates
The calculator parameters can be updated after initialization:
# Update single parameters
calc.set_parameters(("Si", "Si", "Si"), R=2.9, D=0.25)
# Or replace entire parameter set
new_params = TersoffParameters(...)
calc.set_parameters(("Si", "Si", "Si"), params=new_params)
Interface to LAMMPS Files
Warning
This interface has only been tested with Si.tersoff and SiC.tersoff LAMMPS files so it is not necessarily guaranteed to parse all LAMMPS Tersoff files. Therefore, it is recommended to format the LAMMPS Tersoff file using similar to the Si.tersoff or SiC.tersoff files.
Read parameters from a LAMMPS-style Tersoff file:
# Initialize from LAMMPS file
calc = Tersoff.from_lammps("SiC.tersoff")
Tersoff Calculator Class
- class ase.calculators.tersoff.TersoffParameters(m: float, gamma: float, lambda3: float, c: float, d: float, h: float, n: float, beta: float, lambda2: float, B: float, R: float, D: float, lambda1: float, A: float)[source]
Parameters for 3 element Tersoff potential interaction.
- Can be instantiated with either positional or keyword arguments:
TersoffParameters(1.0, 2.0, …) or TersoffParameters(m=1.0, gamma=2.0, …)
- class ase.calculators.tersoff.Tersoff(parameters: Dict[Tuple[str, str, str], TersoffParameters], skin: float = 0.3, **kwargs)[source]
ASE Calculator for Tersoff interatomic potential.
Added in version 3.25.0.
- Parameters:
parameters (dict) –
Mapping element combinations to TersoffParameters objects:
{ ('A', 'B', 'C'): TersoffParameters( m, gamma, lambda3, c, d, h, n, beta, lambda2, B, R, D, lambda1, A), ... }
where (‘A’, ‘B’, ‘C’) are the elements involved in the interaction.
skin (float, default 0.3) – The skin distance for neighbor list calculations.
**kwargs (dict) – Additional parameters to be passed to
Calculator
.
- classmethod from_lammps(potential_file: str | Path, skin: float = 0.3, **kwargs) Tersoff [source]
Make
Tersoff
from a LAMMPS-style Tersoff potential file.- Parameters:
- Returns:
Initialized Tersoff calculator with parameters from the file.
- Return type:
- static read_lammps_format(potential_file: str | Path) Dict[Tuple[str, str, str], TersoffParameters] [source]
Read the Tersoff potential parameters from a LAMMPS-style file.
- set_parameters(key: Tuple[str, str, str], params: TersoffParameters = None, **kwargs) None [source]
Update parameters for a specific element combination.
- Parameters:
key (Tuple[str, str, str]) – The element combination key of the parameters to be updated
params (TersoffParameters, optional) – A TersoffParameters instance to completely replace the parameters
**kwargs – Individual parameter values to update, e.g. R=2.9
References
Tersoff, “New empirical approach for the structure and energy of covalent systems”, Phys. Rev. B 37, 6991 (1988)
Tersoff, “Modeling solid-state chemistry: Interatomic potentials for multicomponent systems”, Phys. Rev. B 39, 5566(R) (1989)
Plimpton, A. Kohlmeyer, A. P. Thompson, et al., “LAMMPS: Large-scale Atomic/Molecular Massively Parallel Simulator”. Zenodo, Aug. 02, 2023. doi:10.5281/zenodo.10806852.