Files
lammps/doc/src/lepton_expression.rst

123 lines
3.3 KiB
ReStructuredText

Lepton expression syntax and features
"""""""""""""""""""""""""""""""""""""
Lepton supports the following operators in expressions:
.. table_from_list::
:columns: 14
* \+
* Add
*
* \-
* Subtract
*
* \*
* Multiply
*
* \/
* Divide
*
* \^
* Power
The following mathematical functions are available:
.. table_from_list::
:columns: 4
* 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 :doc:`variables <variable>` 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:
.. code-block:: LAMMPS
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:
.. code-block:: C
a^2+a*b+b^2; a=a1+a2; b=b1+b2
is exactly equivalent to
.. code-block:: C
(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 :doc:`pair_write <pair_write>`
or :doc:`bond_write <bond_write>` command or through the Python scripts
in the :ref:`tools/tabulate <tabulate>` folder.