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