\(\renewcommand{\AA}{\text{Å}}\)
Lepton expression syntax and features
Lepton supports the following operators in expressions:
| + | Add | - | Subtract | * | Multiply | / | Divide | ^ | Power | 
The following mathematical functions are available:
| sqrt(x) | Square root | exp(x) | Exponential | 
| log(x) | Natural logarithm | sin(x) | Sine (angle in radians) | 
| cos(x) | Cosine (angle in radians) | sec(x) | Secant (angle in radians) | 
| csc(x) | Cosecant (angle in radians) | tan(x) | Tangent (angle in radians) | 
| cot(x) | Cotangent (angle in radians) | asin(x) | Inverse sine (in radians) | 
| acos(x) | Inverse cosine (in radians) | atan(x) | Inverse tangent (in radians) | 
| sinh(x) | Hyperbolic sine | cosh(x) | Hyperbolic cosine | 
| tanh(x) | Hyperbolic tangent | erf(x) | Error function | 
| erfc(x) | Complementary Error function | abs(x) | Absolute value | 
| min(x,y) | Minimum of two values | max(x,y) | Maximum of two values | 
| delta(x) | delta(x) is 1 for x = 0, otherwise 0 | step(x) | step(x) is 0 for x < 0, otherwise 1 | 
Numbers may be given in either decimal or exponential form. All of the following are valid numbers: 5, -3.1, 1e6, and 3.12e-2.
As an extension to the standard Lepton syntax, it is also possible to use LAMMPS variables in the format “v_name”. Before evaluating the expression, “v_name” will be replaced with the value of the variable “name”. This is compatible with all kinds of scalar variables, but not with vectors, arrays, local, or per-atom variables. If necessary, a custom scalar variable needs to be defined that can access the desired (single) item from a non-scalar variable. As an example, the following lines will instruct LAMMPS to ramp the force constant for a harmonic bond from 100.0 to 200.0 during the next run:
variable fconst equal ramp(100.0, 200)
bond_style lepton
bond_coeff 1 1.5 "v_fconst * (r^2)"
An expression may be followed by definitions for intermediate values that appear in the expression. A semicolon “;” is used as a delimiter between value definitions. For example, the expression:
a^2+a*b+b^2; a=a1+a2; b=b1+b2
is exactly equivalent to
(a1+a2)^2+(a1+a2)*(b1+b2)+(b1+b2)^2
The definition of an intermediate value may itself involve other intermediate values. Whitespace and quotation characters (’'’ and ‘”’) are ignored. All uses of a value must appear before that value’s definition. For efficiency reasons, the expression string is parsed, optimized, and then stored in an internal, pre-parsed representation for evaluation.
Evaluating a Lepton expression is typically between 2.5 and 5 times slower than the corresponding compiled and optimized C++ code. If additional speed or GPU acceleration (via GPU or KOKKOS) is required, the interaction can be represented as a table. Suitable table files can be created either internally using the pair_write or bond_write command or through the Python scripts in the tools/tabulate folder.
