forked from lijiext/lammps
854 lines
40 KiB
Plaintext
854 lines
40 KiB
Plaintext
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
|
|
|
|
:link(lws,http://lammps.sandia.gov)
|
|
:link(ld,Manual.html)
|
|
:link(lc,Section_commands.html#comm)
|
|
|
|
:line
|
|
|
|
variable command :h3
|
|
|
|
[Syntax:]
|
|
|
|
variable name style args ... :pre
|
|
|
|
name = name of variable to define :ulb,l
|
|
style = {delete} or {index} or {loop} or {world} or {universe} or {uloop} or {string} or {equal} or {atom} :l
|
|
{delete} = no args
|
|
{index} args = one or more strings
|
|
{loop} args = N
|
|
N = integer size of loop, loop from 1 to N inclusive
|
|
{loop} args = N pad
|
|
N = integer size of loop, loop from 1 to N inclusive
|
|
pad = all values will be same length, e.g. 001, 002, ..., 100
|
|
{loop} args = N1 N2
|
|
N1,N2 = loop from N1 to N2 inclusive
|
|
{loop} args = N1 N2 pad
|
|
N1,N2 = loop from N1 to N2 inclusive
|
|
pad = all values will be same length, e.g. 050, 051, ..., 100
|
|
{world} args = one string for each partition of processors
|
|
{universe} args = one or more strings
|
|
{uloop} args = N
|
|
N = integer size of loop
|
|
{uloop} args = N pad
|
|
N = integer size of loop
|
|
pad = all values will be same length, e.g. 001, 002, ..., 100
|
|
{string} arg = one string
|
|
{equal} or {atom} args = one formula containing numbers, thermo keywords, math operations, group functions, atom values and vectors, compute/fix/variable references
|
|
numbers = 0.0, 100, -5.4, 2.8e-4, etc
|
|
constants = PI
|
|
thermo keywords = vol, ke, press, etc from "thermo_style"_thermo_style.html
|
|
math operators = (), -x, x+y, x-y, x*y, x/y, x^y,
|
|
x==y, x!=y, x<y, x<=y, x>y, x>=y, x&&y, x||y, !x
|
|
math functions = sqrt(x), exp(x), ln(x), log(x),
|
|
sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), atan2(y,x),
|
|
random(x,y,z), normal(x,y,z), ceil(x), floor(x), round(x)
|
|
ramp(x,y), stagger(x,y), logfreq(x,y,z), vdisplace(x,y), swiggle(x,y,z), cwiggle(x,y,z)
|
|
group functions = count(group), mass(group), charge(group),
|
|
xcm(group,dim), vcm(group,dim), fcm(group,dim),
|
|
bound(group,xmin), gyration(group), ke(group),
|
|
angmom(group,dim), torque(group,dim),
|
|
inertia(group,dimdim), omega(group,dim)
|
|
region functions = count(group,region), mass(group,region), charge(group,region),
|
|
xcm(group,dim,region), vcm(group,dim,region), fcm(group,dim,region),
|
|
bound(group,xmin,region), gyration(group,region), ke(group,reigon),
|
|
angmom(group,dim,region), torque(group,dim,region),
|
|
inertia(group,dimdim,region), omega(group,dim,region)
|
|
special functions = sum(x), min(x), max(x), ave(x), trap(x), gmask(x), rmask(x), grmask(x,y)
|
|
atom value = mass\[i\], type\[i\], x\[i\], y\[i\], z\[i\], vx\[i\], vy\[i\], vz\[i\], fx\[i\], fy\[i\], fz\[i\]
|
|
atom vector = mass, type, x, y, z, vx, vy, vz, fx, fy, fz
|
|
compute references = c_ID, c_ID\[i\], c_ID\[i\]\[j\]
|
|
fix references = f_ID, f_ID\[i\], f_ID\[i\]\[j\]
|
|
variable references = v_name, v_name\[i\] :pre
|
|
:ule
|
|
|
|
[Examples:]
|
|
|
|
variable x index run1 run2 run3 run4 run5 run6 run7 run8
|
|
variable LoopVar loop $n
|
|
variable beta equal temp/3.0
|
|
variable b1 equal x\[234\]+0.5*vol
|
|
variable b1 equal "x\[234\] + 0.5*vol"
|
|
variable b equal xcm(mol1,x)/2.0
|
|
variable b equal c_myTemp
|
|
variable b atom x*y/vol
|
|
variable foo string myfile
|
|
variable temp world 300.0 310.0 320.0 $\{Tfinal\}
|
|
variable x universe 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
|
variable x uloop 15 pad
|
|
variable x delete :pre
|
|
|
|
[Description:]
|
|
|
|
This command assigns one or more strings to a variable name for
|
|
evaluation later in the input script or during a simulation.
|
|
|
|
Variables can be used in several ways in LAMMPS. A variable can be
|
|
referenced elsewhere in an input script to become part of a new input
|
|
command. For variable styles that store multiple strings, the
|
|
"next"_next.html command can be used to increment which string is
|
|
assigned to the variable. Variables of style {equal} store a formula
|
|
which when evaluated produces a single numeric value which can be
|
|
output either directly (see the "print"_print.html, "fix
|
|
print"_fix_print.html, and "run every"_run.html commands) or as part
|
|
of thermodynamic output (see the "thermo_style"_thermo_style.html
|
|
command), or used as input to an averaging fix (see the "fix
|
|
ave/time"_fix_ave_time.html command). Variables of style {atom} store
|
|
a formula which when evaluated produces one numeric value per atom
|
|
which can be output to a dump file (see the "dump custom"_dump.html
|
|
command) or used as input to an averaging fix (see the "fix
|
|
ave/spatial"_fix_ave_spatial.html and "fix ave/atom"_fix_ave_atom.html
|
|
commands).
|
|
|
|
In the discussion that follows, the "name" of the variable is the
|
|
arbitrary string that is the 1st argument in the variable command.
|
|
This name can only contain alphanumeric characters and underscores.
|
|
The "string" is one or more of the subsequent arguments. The "string"
|
|
can be simple text as in the 1st example above, it can contain other
|
|
variables as in the 2nd example, or it can be a formula as in the 3rd
|
|
example. The "value" is the numeric quantity resulting from
|
|
evaluation of the string. Note that the same string can generate
|
|
different values when it is evaluated at different times during a
|
|
simulation.
|
|
|
|
IMPORTANT NOTE: When the input script line that defines a variable of
|
|
style {equal} or {atom} that contain a formula is encountered, the
|
|
formula is NOT immediately evaluated and the result stored. See the
|
|
discussion below about "Immediate Evaluation of Variables" if you want
|
|
to do this.
|
|
|
|
IMPORTANT NOTE: When a variable command is encountered in the input
|
|
script and the variable name has already been specified, the command
|
|
is ignored. This means variables can NOT be re-defined in an input
|
|
script (with 2 exceptions, read further). This is to allow an input
|
|
script to be processed multiple times without resetting the variables;
|
|
see the "jump"_jump.html or "include"_include.html commands. It also
|
|
means that using the "command-line switch"_Section_start.html#2_6 -var
|
|
will override a corresponding index variable setting in the input
|
|
script.
|
|
|
|
There are two exceptions to this rule. First, variables of style
|
|
{string} and {equal} and {atom} ARE redefined each time the command is
|
|
encountered. This allows these style of variables to be redefined
|
|
multiple times in an input script. In a loop, this means the formula
|
|
associated with an {equal} or {atom} style variable can change if it
|
|
contains a substitution for another variable, e.g. $x.
|
|
|
|
Second, as described below, if a variable is iterated on to the end of
|
|
its list of strings via the "next"_next.html command, it is removed
|
|
from the list of active variables, and is thus available to be
|
|
re-defined in a subsequent variable command. The {delete} style does
|
|
the same thing.
|
|
|
|
:line
|
|
|
|
"This section"_Section_commands.html#3_2 of the manual explains how
|
|
occurrences of a variable name in an input script line are replaced by
|
|
the variable's string. The variable name can be referenced as $x if
|
|
the name "x" is a single character, or as $\{LoopVar\} if the name
|
|
"LoopVar" is one or more characters.
|
|
|
|
As described below, for variable styles {index}, {loop}, {universe},
|
|
and {uloop}, which string is assigned to a variable can be incremented
|
|
via the "next"_next.html command. When there are no more strings to
|
|
assign, the variable is exhausted and a flag is set that causes the
|
|
next "jump"_jump.html command encountered in the input script to be
|
|
skipped. This enables the construction of simple loops in the input
|
|
script that are iterated over and then exited from.
|
|
|
|
As explained above, an exhausted variable can be re-used in an input
|
|
script. The {delete} style also removes the variable, the same as if
|
|
it were exhausted, allowing it to be redefined later in the input
|
|
script or when the input script is looped over. This can be useful
|
|
when breaking out of a loop via the "if"_if.html and "jump"_jump.html
|
|
commands before the variable would become exhausted. For example,
|
|
|
|
label loop
|
|
variable a loop 5
|
|
print "A = $a"
|
|
if "$a > 2" then "jump in.script break"
|
|
next a
|
|
jump in.script loop
|
|
label break
|
|
variable a delete :pre
|
|
|
|
:line
|
|
|
|
For the {index} style, one or more strings are specified. Initially,
|
|
the 1st string is assigned to the variable. Each time a
|
|
"next"_next.html command is used with the variable name, the next
|
|
string is assigned. All processors assign the same string to the
|
|
variable.
|
|
|
|
{Index} style variables with a single string value can also be set by
|
|
using the command-line switch -var; see "this
|
|
section"_Section_start.html#2_6 for details.
|
|
|
|
The {loop} style is identical to the {index} style except that the
|
|
strings are the integers from 1 to N inclusive, if only one argument N
|
|
is specified. This allows generation of a long list of runs
|
|
(e.g. 1000) without having to list N strings in the input script.
|
|
Initially, the string "1" is assigned to the variable. Each time a
|
|
"next"_next.html command is used with the variable name, the next
|
|
string ("2", "3", etc) is assigned. All processors assign the same
|
|
string to the variable. The {loop} style can also be specified with
|
|
two arguments N1 and N2. In this case the loop runs from N1 to N2
|
|
inclusive, and the string N1 is initially assigned to the variable.
|
|
|
|
For the {world} style, one or more strings are specified. There must
|
|
be one string for each processor partition or "world". See "this
|
|
section"_Section_start.html#2_6 of the manual for information on
|
|
running LAMMPS with multiple partitions via the "-partition"
|
|
command-line switch. This variable command assigns one string to each
|
|
world. All processors in the world are assigned the same string. The
|
|
next command cannot be used with {equal} style variables, since there
|
|
is only one value per world. This style of variable is useful when
|
|
you wish to run different simulations on different partitions, or when
|
|
performing a parallel tempering simulation (see the
|
|
"temper"_temper.html command), to assign different temperatures to
|
|
different partitions.
|
|
|
|
For the {universe} style, one or more strings are specified. There
|
|
must be at least as many strings as there are processor partitions or
|
|
"worlds". See "this page"_Section_start.html#2_6 for information on
|
|
running LAMMPS with multiple partitions via the "-partition"
|
|
command-line switch. This variable command initially assigns one
|
|
string to each world. When a "next"_next.html command is encountered
|
|
using this variable, the first processor partition to encounter it, is
|
|
assigned the next available string. This continues until all the
|
|
variable strings are consumed. Thus, this command can be used to run
|
|
50 simulations on 8 processor partitions. The simulations will be run
|
|
one after the other on whatever partition becomes available, until
|
|
they are all finished. {Universe} style variables are incremented
|
|
using the files "tmp.lammps.variable" and "tmp.lammps.variable.lock"
|
|
which you will see in your directory during such a LAMMPS run.
|
|
|
|
The {uloop} style is identical to the {universe} style except that the
|
|
strings are the integers from 1 to N. This allows generation of long
|
|
list of runs (e.g. 1000) without having to list N strings in the input
|
|
script.
|
|
|
|
:line
|
|
|
|
For the {equal} and {atom} styles, a single string is specified which
|
|
represents a formula that will be evaluated afresh each time the
|
|
variable is used. If you want spaces in the string, enclose it in
|
|
double quotes so the parser will treat it as a single argument. For
|
|
{equal} style variables the formula computes a scalar quantity, which
|
|
becomes the value of the variable whenever it is evaluated. For
|
|
{atom} style variables the formula computes one quantity for each
|
|
atom whenever it is evaluated.
|
|
|
|
Note that {equal} and {atom} variables can produce different values at
|
|
different stages of the input script or at different times during a
|
|
run. For example, if an {equal} variable is used in a "fix
|
|
print"_fix_print.html command, different values could be printed each
|
|
timestep it was invoked. If you want a variable to be evaluated
|
|
immediately, so that the result is stored by the variable instead of
|
|
the string, see the section below on "Immediate Evaluation of
|
|
Variables".
|
|
|
|
The next command cannot be used with {equal} or {atom} style
|
|
variables, since there is only one string.
|
|
|
|
The formula for an {equal} or {atom} variable can contain a variety
|
|
of quantities. The syntax for each kind of quantity is simple, but
|
|
multiple quantities can be nested and combined in various ways to
|
|
build up formulas of arbitrary complexity. For example, this is a
|
|
valid (though strange) variable formula:
|
|
|
|
variable x equal "pe + c_MyTemp / vol^(1/3)" :pre
|
|
|
|
Specifically, an formula can contain numbers, thermo keywords, math
|
|
operators, math functions, group functions, region functions, atom
|
|
values, atom vectors, compute references, fix references, and
|
|
references to other variables.
|
|
|
|
Number: 0.2, 100, 1.0e20, -15.4, etc
|
|
Constant: PI
|
|
Thermo keywords: vol, pe, ebond, etc
|
|
Math operators: (), -x, x+y, x-y, x*y, x/y, x^y, x==y, x!=y, x<y, x<=y, x>y, x>=y, x&&y, x||y, !x
|
|
Math functions: sqrt(x), exp(x), ln(x), log(x), sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), atan2(y,x), random(x,y,z), normal(x,y,z), ceil(x), floor(x), round(x), ramp(x,y), stagger(x,y), logfreq(x,y,z), vdisplace(x,y), swiggle(x,y,z), cwiggle(x,y,z)
|
|
Group functions: count(ID), mass(ID), charge(ID), xcm(ID,dim), \
|
|
vcm(ID,dim), fcm(ID,dim), bound(ID,dir), \
|
|
gyration(ID), ke(ID), angmom(ID,dim), torque(ID,dim), \
|
|
inertia(ID,dimdim), omega(ID,dim)
|
|
Region functions: count(ID,IDR), mass(ID,IDR), charge(ID,IDR), \
|
|
xcm(ID,dim,IDR), vcm(ID,dim,IDR), fcm(ID,dim,IDR), \
|
|
bound(ID,dir,IDR), gyration(ID,IDR), ke(ID,IDR), \
|
|
angmom(ID,dim,IDR), torque(ID,dim,IDR), \
|
|
inertia(ID,dimdim,IDR), omega(ID,dim,IDR)
|
|
Special functions: sum(x), min(x), max(x), ave(x), trap(x), gmask(x), rmask(x), grmask(x,y)
|
|
Atom values: mass\[i\], type\[i\], x\[i\], y\[i\], z\[i\], \
|
|
vx\[i\], vy\[i\], vz\[i\], fx\[i\], fy\[i\], fz\[i\]
|
|
Atom vectors: mass, type, x, y, z, vx, vy, vz, fx, fy, fz
|
|
Compute references: c_ID, c_ID\[i\], c_ID\[i\]\[j\]
|
|
Fix references: f_ID, f_ID\[i\], f_ID\[i\]\[j\]
|
|
Other variables: v_name, v_name\[i\] :tb(s=:)
|
|
|
|
:line
|
|
|
|
Most of the formula elements produce a scalar value. A few produce a
|
|
per-atom vector of values. These are the atom vectors, compute
|
|
references that represent a per-atom vector, fix references that
|
|
represent a per-atom vector, and variables that are atom-style
|
|
variables. Math functions that operate on scalar values produce a
|
|
scalar value; math function that operate on per-atom vectors do so
|
|
element-by-element and produce a per-atom vector.
|
|
|
|
A formula for equal-style variables cannot use any formula element
|
|
that produces a per-atom vector. A formula for an atom-style variable
|
|
can use formula elements that produce either a scalar value or a
|
|
per-atom vector.
|
|
|
|
The thermo keywords allowed in a formula are those defined by the
|
|
"thermo_style custom"_thermo_style.html command. Thermo keywords that
|
|
require a "compute"_compute.html to calculate their values such as
|
|
"temp" or "press", use computes stored and invoked by the
|
|
"thermo_style"_thermo_style.html command. This means that you can
|
|
only use those keywords in a variable if the style you are using with
|
|
the thermo_style command (and the thermo keywords associated with that
|
|
style) also define and use the needed compute. Note that some thermo
|
|
keywords use a compute indirectly to calculate their value (e.g. the
|
|
enthalpy keyword uses temp, pe, and pressure). If a variable is
|
|
evaluated directly in an input script (not during a run), then the
|
|
values accessed by the thermo keyword must be current. See the
|
|
discussion below about "Variable Accuracy".
|
|
|
|
:line
|
|
|
|
Math Operators :h4
|
|
|
|
Math operators are written in the usual way, where the "x" and "y" in
|
|
the examples can themselves be arbitrarily complex formulas, as in the
|
|
examples above. In this syntax, "x" and "y" can be scalar values or
|
|
per-atom vectors. For example, "ke/natoms" is the division of two
|
|
scalars, where "vy+vz" is the element-by-element sum of two per-atom
|
|
vectors of y and z velocities.
|
|
|
|
Operators are evaluated left to right and have the usual C-style
|
|
precedence: unary minus and unary logical NOT operator "!" have the
|
|
highest precedence, exponentiation "^" is next; multiplication and
|
|
division are next; addition and subtraction are next; the 4 relational
|
|
operators "<", "<=", ">", and ">=" are next; the two remaining
|
|
relational operators "==" and "!=" are next; then the logical AND
|
|
operator "&&"; and finally the logical OR operator "||" has the lowest
|
|
precedence. Parenthesis can be used to group one or more portions of
|
|
a formula and/or enforce a different order of evaluation than what
|
|
would occur with the default precedence.
|
|
|
|
The 6 relational operators return either a 1.0 or 0.0 depending on
|
|
whether the relationship between x and y is TRUE or FALSE. For
|
|
example the expression x<10.0 in an atom-style variable formula will
|
|
return 1.0 for all atoms whose x-coordinate is less than 10.0, and 0.0
|
|
for the others. The logical AND operator will return 1.0 if both its
|
|
arguments are non-zero, else it returns 0.0. The logical OR operator
|
|
will return 1.0 if either of its arguments is non-zero, else it
|
|
returns 0.0. The logical NOT operator returns 1.0 if its argument is
|
|
0.0, else it returns 0.0.
|
|
|
|
These relational and logical operators can be used as a masking or
|
|
selection operation in a formula. For example, the number of atoms
|
|
whose properties satifsy one or more criteria could be calculated by
|
|
taking the returned per-atom vector of ones and zeroes and passing it
|
|
to the "compute reduce"_compute_reduce.html command.
|
|
|
|
:line
|
|
|
|
Math Functions :h4
|
|
|
|
Math functions are specified as keywords followed by one or more
|
|
parenthesized arguments "x", "y", "z", each of which can themselves be
|
|
arbitrarily complex formulas. In this syntax, the arguments can
|
|
represent scalar values or per-atom vectors. In the latter case, the
|
|
math operation is performed on each element of the vector. For
|
|
example, "sqrt(natoms)" is the sqrt() of a scalar, where "sqrt(y*z)"
|
|
yields a per-atom vector with each element being the sqrt() of the
|
|
product of one atom's y and z coordinates.
|
|
|
|
Most of the math functions perform obvious operations. The ln() is
|
|
the natural log; log() is the base 10 log.
|
|
|
|
The random(x,y,z) function takes 3 arguments: x = lo, y = hi, and z =
|
|
seed. It generates a uniform random number between lo and hi. The
|
|
normal(x,y,z) function also takes 3 arguments: x = mu, y = sigma, and
|
|
z = seed. It generates a Gaussian variate centered on mu with
|
|
variance sigma^2. In both cases the seed is used the first time the
|
|
internal random number generator is invoked, to initialize it. For
|
|
equal-style variables, every processor uses the same seed so that they
|
|
each generate the same sequence of random numbers. For atom-style
|
|
variables, a unique seed is created for each processor, based on the
|
|
specified seed. This effectively generates a different random number
|
|
for each atom being looped over in the atom-style variable.
|
|
|
|
IMPORTANT NOTE: Internally, there is just one random number generator
|
|
for all equal-style variables and one for all atom-style variables.
|
|
If you define multiple variables (of each style) which use the
|
|
random() or normal() math functions, then the internal random number
|
|
generators will only be initialized once, which means only one of the
|
|
specified seeds will determine the sequence of generated random
|
|
numbers.
|
|
|
|
The ceil(), floor(), and round() functions are those in the C math
|
|
library. Ceil() is the smallest integer not less than its argument.
|
|
Floor() if the largest integer not greater than its argument. Round()
|
|
is the nearest integer to its argument.
|
|
|
|
The ramp(x,y) function uses the current timestep to generate a value
|
|
linearly intepolated between the specified x,y values over the course
|
|
of a run, according to this formula:
|
|
|
|
value = x + (y-x) * (timestep-startstep) / (stopstep-startstep) :pre
|
|
|
|
The run begins on startstep and ends on stopstep. Startstep and
|
|
stopstep can span multiple runs, using the {start} and {stop} keywords
|
|
of the "run"_run.html command. See the "run"_run.html command for
|
|
details of how to do this.
|
|
|
|
The stagger(x,y) function uses the current timestep to generate a new
|
|
timestep. X,y > 0 and x > y is required. The generated timesteps
|
|
increase in a staggered fashion, as the sequence
|
|
x,x+y,2x,2x+y,3x,3x+y,etc. For any current timestep, the next
|
|
timestep in the sequence is returned. Thus if stagger(1000,100) is
|
|
used in a variable by the "dump_modify every"_dump_modify.html
|
|
command, it will generate the sequence of output timesteps:
|
|
|
|
100,1000,1100,2000,2100,3000,etc :pre
|
|
|
|
The logfreq(x,y,z) function uses the current timestep to generate a
|
|
new timestep. X,y,z > 0 and y < z is required. The generated
|
|
timesteps increase in a logarithmic fashion, as the sequence
|
|
x,2x,3x,...y*x,z*x,2*z*x,3*z*x,...y*z*x,z*z*x,2*z*x*x,etc. For any
|
|
current timestep, the next timestep in the sequence is returned. Thus
|
|
if logfreq(100,4,10) is used in a variable by the "dump_modify
|
|
every"_dump_modify.html command, it will generate the sequence of
|
|
output timesteps:
|
|
|
|
100,200,300,400,1000,2000,3000,4000,10000,20000,etc :pre
|
|
|
|
The vdisplace(x,y) function takes 2 arguments: x = coord0 and y =
|
|
velocity, and uses the elapsed time to change the coordinate value by
|
|
a linear displacement due to the applied velocity over the course of a
|
|
run, according to this formula:
|
|
|
|
value = coord0 + velocity*(timestep-startstep)*dt :pre
|
|
|
|
where dt = the timestep size.
|
|
|
|
The run begins on startstep. Startstep can span multiple runs, using
|
|
the {start} keyword of the "run"_run.html command. See the
|
|
"run"_run.html command for details of how to do this. Note that the
|
|
"thermo_style"_thermo_style.html keyword elaplong =
|
|
timestep-startstep.
|
|
|
|
The swiggle(x,y,z) and cwiggle(x,y,z) functions each take 3 arguments:
|
|
x = coord0, y = amplitude, z = period. They use the elapsed time to
|
|
oscillate the coordinate value by a sin() or cos() function over the
|
|
course of a run, according to one of these formulas, where
|
|
omega = 2 PI / period:
|
|
|
|
value = coord0 + Amplitude * sin(omega*(timestep-startstep)*dt)
|
|
value = coord0 + Amplitude * (1 - cos(omega*(timestep-startstep)*dt)) :pre
|
|
|
|
where dt = the timestep size.
|
|
|
|
The run begins on startstep. Startstep can span multiple runs, using
|
|
the {start} keyword of the "run"_run.html command. See the
|
|
"run"_run.html command for details of how to do this. Note that the
|
|
"thermo_style"_thermo_style.html keyword elaplong =
|
|
timestep-startstep.
|
|
|
|
:line
|
|
|
|
Group and Region Functions :h4
|
|
|
|
Group functions are specified as keywords followed by one or two
|
|
parenthesized arguments. The first argument is the group-ID. The
|
|
{dim} argument, if it exists, is {x} or {y} or {z}. The {dir}
|
|
argument, if it exists, is {xmin}, {xmax}, {ymin}, {ymax}, {zmin}, or
|
|
{zmax}. The {dimdim} argument, if it exists, is {xx} or {yy} or {zz}
|
|
or {xy} or {yz} or {xz}.
|
|
|
|
The group function count() is the number of atoms in the group. The
|
|
group functions mass() and charge() are the total mass and charge of
|
|
the group. Xcm() and vcm() return components of the position and
|
|
velocity of the center of mass of the group. Fcm() returns a
|
|
component of the total force on the group of atoms. Bound() returns
|
|
the min/max of a particular coordinate for all atoms in the group.
|
|
Gyration() computes the radius-of-gyration of the group of atoms. See
|
|
the "compute gyration"_compute_gyration.html command for a definition
|
|
of the formula. Angmom() returns components of the angular momentum
|
|
of the group of atoms around its center of mass. Torque() returns
|
|
components of the torque on the group of atoms around its center of
|
|
mass, based on current forces on the atoms. Inertia() returns one of
|
|
6 components of the inertia tensor of the group of atoms around its
|
|
center of mass. Omega() returns components of the angular velocity of
|
|
the group of atoms around its center of mass.
|
|
|
|
Region functions are specified exactly the same way as group functions
|
|
except they take an extra argument which is the region ID. The
|
|
function is computed for all atoms that are in both the group and the
|
|
region. If the group is "all", then the only criteria for atom
|
|
inclusion is that it be in the region.
|
|
|
|
:line
|
|
|
|
Special Functions :h4
|
|
|
|
Special functions take specific kinds of arguments, meaning their
|
|
arguments cannot be formulas themselves.
|
|
|
|
The sum(x), min(x), max(x), ave(x), and trap(x) functions each take 1
|
|
argument which is of the form "c_ID" or "c_ID\[N\]" or "f_ID" or
|
|
"f_ID\[N\]". The first two are computes and the second two are fixes;
|
|
the ID in the reference should be replaced by the ID of a compute or
|
|
fix defined elsewhere in the input script. The compute or fix must
|
|
produce either a global vector or array. If it produces a global
|
|
vector, then the notation without "\[N\]" should be used. If it
|
|
produces a global array, then the notation with "\[N\]" should be
|
|
used, when N is an integer, to specify which column of the global
|
|
array is being referenced.
|
|
|
|
These functions operate on the global vector of inputs and reduce it
|
|
to a single scalar value. This is analagous to the operation of the
|
|
"compute reduce"_compute_reduce.html command, which invokes the same
|
|
functions on per-atom and local vectors.
|
|
|
|
The sum() function calculates the sum of all the vector elements. The
|
|
min() and max() functions find the minimum and maximum element
|
|
respectively. The ave() function is the same as sum() except that it
|
|
divides the result by the length of the vector. The trap() function
|
|
is the same as sum() except the first and last elements are multiplied
|
|
by a weighting factor of 1/2 when performing the sum. This
|
|
effectively implements an integratiion via the trapezoidal rule on the
|
|
global vector of data. I.e. consider a set of points, equally spaced
|
|
by 1 in their x coordinate: (1,V1), (2,V2), ..., (N,VN), where the Vi
|
|
are the values in the global vector of length N. The integral from 1
|
|
to N of these points is trap(). When appropriately normalized by the
|
|
timestep size, this function is useful for calculating integrals of
|
|
time-series data, like that generated by the "fix
|
|
ave/correlate"_fix_ave_correlate.html command.
|
|
|
|
The gmask(x) function takes 1 argument which is a group ID. It
|
|
can only be used in atom-style variables. It returns a 1 for
|
|
atoms that are in the group, and a 0 for atoms that are not.
|
|
|
|
The rmask(x) function takes 1 argument which is a region ID. It can
|
|
only be used in atom-style variables. It returns a 1 for atoms that
|
|
are in the geometric region, and a 0 for atoms that are not.
|
|
|
|
The grmask(x,y) function takes 2 arguments. The first is a group ID,
|
|
and the second is a region ID. It can only be used in atom-style
|
|
variables. It returns a 1 for atoms that are in both the group and
|
|
region, and a 0 for atoms that are not in both.
|
|
|
|
:line
|
|
|
|
Atom Values and Vectors :h4
|
|
|
|
Atom values take a single integer argument I from 1 to N, where I is
|
|
the an atom-ID, e.g. x\[243\], which means use the x coordinate of the
|
|
atom with ID = 243.
|
|
|
|
Atom vectors generate one value per atom, so that a reference like
|
|
"vx" means the x-component of each atom's velocity will be used when
|
|
evaluating the variable. Note that other atom attributes can be used
|
|
as inputs to a variable by using the "compute
|
|
property/atom"_compute_property_atom.html command and then specifying
|
|
a quantity from that compute.
|
|
|
|
:line
|
|
|
|
Compute References :h4
|
|
|
|
Compute references access quantities calculated by a
|
|
"compute"_compute.html. The ID in the reference should be replaced by
|
|
the ID of a compute defined elsewhere in the input script. As
|
|
discussed in the doc page for the "compute"_compute.html command,
|
|
computes can produce global, per-atom, or local values. Only global
|
|
and per-atom values can be used in a variable. Computes can also
|
|
produce a scalar, vector, or array. An equal-style variable can only
|
|
use scalar values, which means a global scalar, or an element of a
|
|
global or per-atom vector or array. Atom-style variables can use the
|
|
same scalar values. They can also use per-atom vector values. A
|
|
vector value can be a per-atom vector itself, or a column of an
|
|
per-atom array. See the doc pages for individual computes to see what
|
|
kind of values they produce.
|
|
|
|
Examples of different kinds of compute references are as follows.
|
|
There is no ambiguity as to what a reference means, since computes
|
|
only produce global or per-atom quantities, never both.
|
|
|
|
c_ID: global scalar, or per-atom vector
|
|
c_ID\[I\]: Ith element of global vector, or atom I's value in per-atom vector, or Ith column from per-atom array
|
|
c_ID\[I\]\[J\]: I,J element of global array, or atom I's Jth value in per-atom array :tb(s=:)
|
|
|
|
If a variable containing a compute is evaluated
|
|
directly in an input script (not during a run), then the values
|
|
accessed by the compute must be current. See the discussion below
|
|
about "Variable Accuracy".
|
|
|
|
:line
|
|
|
|
Fix References :h4
|
|
|
|
Fix references access quantities calculated by a "fix"_compute.html.
|
|
The ID in the reference should be replaced by the ID of a fix defined
|
|
elsewhere in the input script. As discussed in the doc page for the
|
|
"fix"_fix.html command, fixes can produce global, per-atom, or local
|
|
values. Only global and per-atom values can be used in a variable.
|
|
Fixes can also produce a scalar, vector, or array. An equal-style
|
|
variable can only use scalar values, which means a global scalar, or
|
|
an element of a global or per-atom vector or array. Atom-style
|
|
variables can use the same scalar values. They can also use per-atom
|
|
vector values. A vector value can be a per-atom vector itself, or a
|
|
column of an per-atom array. See the doc pages for individual fixes
|
|
to see what kind of values they produce.
|
|
|
|
The different kinds of fix references are exactly the same as the
|
|
compute references listed in the above table, where "c_" is replaced
|
|
by "f_". Again, there is no ambiguity as to what a reference means,
|
|
since fixes only produce global or per-atom quantities, never both.
|
|
|
|
f_ID: global scalar, or per-atom vector
|
|
f_ID\[I\]: Ith element of global vector, or atom I's value in per-atom vector, or Ith column from per-atom array
|
|
f_ID\[I\]\[J\]: I,J element of global array, or atom I's Jth value in per-atom array :tb(s=:)
|
|
|
|
If a variable containing a fix is evaluated directly in an input
|
|
script (not during a run), then the values accessed by the fix should
|
|
be current. See the discussion below about "Variable Accuracy".
|
|
|
|
Note that some fixes only generate quantities on certain timesteps.
|
|
If a variable attempts to access the fix on non-allowed timesteps, an
|
|
error is generated. For example, the "fix ave/time"_fix_ave_time.html
|
|
command may only generate averaged quantities every 100 steps. See
|
|
the doc pages for individual fix commands for details.
|
|
|
|
:line
|
|
|
|
Variable References :h4
|
|
|
|
Variable references access quantities calulated by other variables,
|
|
which will cause those variables to be evaluated. The name in the
|
|
reference should be replaced by the name of a variable defined
|
|
elsewhere in the input script. As discussed on this doc page,
|
|
atom-style variables generate a per-atom vector of values; all other
|
|
variable styles generate a global scalar value. An equal-style
|
|
variable can reference a global scalar value produced by another
|
|
variable, but not a per-atom vector produced by an atom-style
|
|
variable. Atom-style variables can reference either global scalar or
|
|
per-atom vector values produced by kind of variable.
|
|
|
|
Examples of different kinds of variable references are as follows.
|
|
There is no ambiguity as to what a reference means, since variables
|
|
produce only a global scalar or a per-atom vectors, never both.
|
|
|
|
v_name: scalar, or per-atom vector
|
|
v_name\[I\]: atom I's value in per-atom vector :tb(s=:)
|
|
|
|
IMPORTANT NOTE: If you define variables in circular manner like this:
|
|
|
|
variable a equal v_b
|
|
variable b equal v_a
|
|
print $a :pre
|
|
|
|
then LAMMPS may run for a while when the print statement is invoked!
|
|
|
|
:line
|
|
|
|
[Immediate Evaluation of Variables:]
|
|
|
|
There is a difference between referencing a variable with a leading $
|
|
sign (e.g. $x or $\{abc\}) versus with a leading "v_" (e.g. v_x or
|
|
v_abc). The former can be used in any command, including a variable
|
|
command, to force the immediate evaluation of the referenced variable
|
|
and the substitution of its value into the command. The latter is a
|
|
required kind of argument to some commands (e.g. the "fix
|
|
ave/spatial"_fix_ave_spatial.html or "dump custom"_dump.html or
|
|
"thermo_style"_thermo_style.html commands) if you wish it to evaluate
|
|
a variable periodically during a run. It can also be used in a
|
|
variable formula if you wish to reference a second variable. The
|
|
second variable will be evaluated whenever the first variable is
|
|
evaluated.
|
|
|
|
As an example, suppose you use this command in your input script to
|
|
define the variable "v" as
|
|
|
|
variable v equal vol :pre
|
|
|
|
before a run where the simulation box size changes. You might think
|
|
this will assign the initial volume to the variable "v". That is not
|
|
the case. Rather it assigns a formula which evaluates the volume
|
|
(using the thermo_style keyword "vol") to the variable "v". If you
|
|
use the variable "v" in some other command like "fix
|
|
ave/time"_fix_ave_time.html then the current volume of the box will be
|
|
evaluated continuously during the run.
|
|
|
|
If you want to store the initial volume of the system, you can do it
|
|
this way:
|
|
|
|
variable v equal vol
|
|
variable v0 equal $v :pre
|
|
|
|
The second command will force "v" to be evaluated (yielding the
|
|
initial volume) and assign that value to the variable "v0". Thus the
|
|
command
|
|
|
|
thermo_style custom step v_v v_v0 :pre
|
|
|
|
would print out both the current and initial volume periodically
|
|
during the run.
|
|
|
|
Note that it is a mistake to enclose a variable formula in double
|
|
quotes if it contains variables preceeded by $ signs. For example,
|
|
|
|
variable vratio equal "$\{vfinal\}/$\{v0\}" :pre
|
|
|
|
This is because the quotes prevent variable substitution (see "this
|
|
section"_Section_commands.html#3_2 on parsing input script commands),
|
|
and thus an error will occur when the formula for "vratio" is
|
|
evaluated later.
|
|
|
|
:line
|
|
|
|
[Variable Accuracy:]
|
|
|
|
Obviously, LAMMPS attempts to evaluate variables containing formulas
|
|
({equal} and {atom} style variables) accurately whenever the
|
|
evaluation is performed. Depending on what is included in the
|
|
formula, this may require invoking a "compute"_compute.html, either
|
|
directly or indirectly via a thermo keyword, or accessing a value
|
|
previously calculated by a compute, or accessing a value calculated
|
|
and stored by a "fix"_fix.html. If the compute is one that calculates
|
|
the pressure or energy of the system, then these quantities need to be
|
|
tallied during the evaluation of the interatomic potentials (pair,
|
|
bond, etc) on timesteps that the variable will need the values.
|
|
|
|
LAMMPS keeps track of all of this during a "run"_run.html or "energy
|
|
minimization"_minimize.html. An error will be generated if you
|
|
attempt to evaluate a variable on timesteps when it cannot produce
|
|
accurate values. For example, if a "thermo_style
|
|
custom"_thermo_style.html command prints a variable which accesses
|
|
values stored by a "fix ave/time"_fix_ave_time.html command and the
|
|
timesteps on which thermo output is generated are not multiples of the
|
|
averaging frequency used in the fix command, then an error will occur.
|
|
|
|
An input script can also request variables be evaluated before or
|
|
after or in between runs, e.g. by including them in a
|
|
"print"_print.html command. In this case, if a compute is needed to
|
|
evaluate a variable (either directly or indirectly), LAMMPS will not
|
|
invoke the compute, but it will use a value previously calculated by
|
|
the compute, and can do this only if it is current. Fixes will always
|
|
provide a quantity needed by a variable, but the quantity may or may
|
|
not be current. This leads to one of three kinds of behavior:
|
|
|
|
(1) The variable may be evaluated accurately. If it contains
|
|
references to a compute or fix, and these values were calculated on
|
|
the last timestep of a preceeding run, then they will be accessed and
|
|
used by the variable and the result will be accurate.
|
|
|
|
(2) LAMMPS may not be able to evaluate the variable and generate an
|
|
error. For example, if the variable requires a quantity from a
|
|
"compute"_compute.html that is not current, LAMMPS will generate an
|
|
error. This means, for example, that such a variable cannot be
|
|
evaluated before the first run has occurred. Likewise, in between
|
|
runs, such a variable cannot be accessed unless it was evaluated on
|
|
the last timestep of the preceding run, e.g. by thermodynamic output.
|
|
|
|
One way to get around this problem is to perform a 0-timestep run
|
|
before using the variable. For example, these commands
|
|
|
|
variable t equal temp
|
|
print "Initial temperature = $t"
|
|
run 1000 :pre
|
|
|
|
will generate an error if the run is the first run specified in the
|
|
input script, because generating a value for the "t" variable requires
|
|
a compute for calculating the temperature to be invoked.
|
|
|
|
However, this sequence of commands would be fine:
|
|
|
|
run 0
|
|
variable t equal temp
|
|
print "Initial temperature = $t"
|
|
run 1000 :pre
|
|
|
|
The 0-timestep run initializes and invokes various computes, including
|
|
the one for temperature, so that the value it stores is current and
|
|
can be accessed by the variable "t" after the run has completed. Note
|
|
that a 0-timestep run does not alter the state of the system, so it
|
|
does not change the input state for the 1000-timestep run that
|
|
follows. Also note that the 0-timestep run must actually use and
|
|
invoke the compute in question (e.g. via "thermo"_thermo_style.html or
|
|
"dump"_dump.html output) in order for it to enable the compute to be
|
|
used in a variable after the run. Thus if you are trying to print a
|
|
variable that uses a compute you have defined, you could insure it was
|
|
invoked on the last timestep of the preceding run by including it in
|
|
thermodynamic output.
|
|
|
|
Unlike computes, "fixes"_fix.html will never generate an error if
|
|
their values are accessed by a variable in between runs. They always
|
|
return some value to the variable. However, the value may not be what
|
|
you expect if the fix has not yet calculated the quantity of interest
|
|
or it is not current. For example, the "fix indent"_fix_indent.html
|
|
command stores the force on the indenter. But this is not computed
|
|
until a run is performed. Thus if a variable attempts to print this
|
|
value before the first run, zeroes will be output. Again, performing
|
|
a 0-timestep run before printing the variable has the desired effect.
|
|
|
|
(3) The variable may be evaluated incorrectly. And LAMMPS may have
|
|
no way to detect this has occurred. Consider the following sequence
|
|
of commands:
|
|
|
|
pair_coeff 1 1 1.0 1.0
|
|
run 1000
|
|
pair_coeff 1 1 1.5 1.0
|
|
variable e equal pe
|
|
print "Final potential energy = $e" :pre
|
|
|
|
The first run is performed using one setting for the pairwise
|
|
potential defined by the "pair_style"_pair_style.html and
|
|
"pair_coeff"_pair_coeff.html commands. The potential energy is
|
|
evaluated on the final timestep and stored by the "compute
|
|
pe"_compute_pe.html compute (this is done by the
|
|
"thermo_style"_thermo_style.html command). Then a pair coefficient is
|
|
changed, altering the potential energy of the system. When the
|
|
potential energy is printed via the "e" variable, LAMMPS will use the
|
|
potential energy value stored by the "compute pe"_compute_pe.html
|
|
compute, thinking it is current. There are many other commands which
|
|
could alter the state of the system between runs, causing a variable
|
|
to evaluate incorrectly.
|
|
|
|
The solution to this issue is the same as for case (2) above, namely
|
|
perform a 0-timestep run before the variable is evaluated to insure
|
|
the system is up-to-date. For example, this sequence of commands
|
|
would print a potential energy that reflected the changed pairwise
|
|
coefficient:
|
|
|
|
pair_coeff 1 1 1.0 1.0
|
|
run 1000
|
|
pair_coeff 1 1 1.5 1.0
|
|
run 0
|
|
variable e equal pe
|
|
print "Final potential energy = $e" :pre
|
|
|
|
:line
|
|
|
|
[Restrictions:]
|
|
|
|
Indexing any formula element by global atom ID, such as an atom value,
|
|
requires the atom style to use a global mapping in order to look up
|
|
the vector indices. By default, only atom styles with molecular
|
|
information create global maps. The "atom_modify
|
|
map"_atom_modify.html command can override the default.
|
|
|
|
All {universe}- and {uloop}-style variables defined in an input script
|
|
must have the same number of values.
|
|
|
|
[Related commands:]
|
|
|
|
"next"_next.html, "jump"_jump.html, "include"_include.html,
|
|
"temper"_temper.html, "fix print"_fix_print.html, "print"_print.html
|
|
|
|
[Default:] none
|