\(\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.