400 lines
19 KiB
ReStructuredText
400 lines
19 KiB
ReStructuredText
.. index:: fix ave/correlate
|
|
|
|
fix ave/correlate command
|
|
=========================
|
|
|
|
Syntax
|
|
""""""
|
|
|
|
.. code-block:: LAMMPS
|
|
|
|
fix ID group-ID ave/correlate Nevery Nrepeat Nfreq value1 value2 ... keyword args ...
|
|
|
|
* ID, group-ID are documented in :doc:`fix <fix>` command
|
|
* ave/correlate = style name of this fix command
|
|
* Nevery = use input values every this many timesteps
|
|
* Nrepeat = # of correlation time windows to accumulate
|
|
* Nfreq = calculate time window averages every this many timesteps
|
|
* one or more input values can be listed
|
|
* value = c_ID, c_ID[N], f_ID, f_ID[N], v_name
|
|
|
|
.. parsed-literal::
|
|
|
|
c_ID = global scalar calculated by a compute with ID
|
|
c_ID[I] = Ith component of global vector calculated by a compute with ID, I can include wildcard (see below)
|
|
f_ID = global scalar calculated by a fix with ID
|
|
f_ID[I] = Ith component of global vector calculated by a fix with ID, I can include wildcard (see below)
|
|
v_name = global value calculated by an equal-style variable with name
|
|
v_name[I] = Ith component of a vector-style variable with name, I can include wildcard (see below)
|
|
|
|
* zero or more keyword/arg pairs may be appended
|
|
* keyword = *type* or *ave* or *start* or *prefactor* or *file* or *overwrite* or *title1* or *title2* or *title3*
|
|
|
|
.. parsed-literal::
|
|
|
|
*type* arg = *auto* or *upper* or *lower* or *auto/upper* or *auto/lower* or *full*
|
|
auto = correlate each value with itself
|
|
upper = correlate each value with each succeeding value
|
|
lower = correlate each value with each preceding value
|
|
auto/upper = auto + upper
|
|
auto/lower = auto + lower
|
|
full = correlate each value with every other value, including itself = auto + upper + lower
|
|
*ave* args = *one* or *running*
|
|
one = zero the correlation accumulation every Nfreq steps
|
|
running = accumulate correlations continuously
|
|
*start* args = Nstart
|
|
Nstart = start accumulating correlations on this timestep
|
|
*prefactor* args = value
|
|
value = prefactor to scale all the correlation data by
|
|
*file* arg = filename
|
|
filename = name of file to output correlation data to
|
|
*overwrite* arg = none = overwrite output file with only latest output
|
|
*title1* arg = string
|
|
string = text to print as 1st line of output file
|
|
*title2* arg = string
|
|
string = text to print as 2nd line of output file
|
|
*title3* arg = string
|
|
string = text to print as 3rd line of output file
|
|
|
|
Examples
|
|
""""""""
|
|
|
|
.. code-block:: LAMMPS
|
|
|
|
fix 1 all ave/correlate 5 100 1000 c_myTemp file temp.correlate
|
|
fix 1 all ave/correlate 1 50 10000 &
|
|
c_thermo_press[1] c_thermo_press[2] c_thermo_press[3] &
|
|
type upper ave running title1 "My correlation data"
|
|
|
|
fix 1 all ave/correlate 1 50 10000 c_thermo_press[*]
|
|
|
|
Description
|
|
"""""""""""
|
|
|
|
Use one or more global scalar values as inputs every few timesteps,
|
|
calculate time correlations between them at varying time intervals,
|
|
and average the correlation data over longer timescales. The resulting
|
|
correlation values can be time integrated by
|
|
:doc:`variables <variable>` or used by other
|
|
:doc:`output commands <Howto_output>` such as
|
|
:doc:`thermo_style custom <thermo_style>`, and can also be written to a file.
|
|
See the :doc:`fix ave/correlate/long <fix_ave_correlate_long>` command for an
|
|
alternate method for computing correlation functions efficiently over
|
|
very long time windows.
|
|
|
|
The group specified with this command is ignored. However, note that
|
|
specified values may represent calculations performed by computes and
|
|
fixes which store their own "group" definitions.
|
|
|
|
Each listed value can be the result of a :doc:`compute <compute>` or
|
|
:doc:`fix <fix>` or the evaluation of an equal-style or vector-style
|
|
:doc:`variable <variable>`. In each case, the compute, fix, or variable
|
|
must produce a global quantity, not a per-atom or local quantity. If
|
|
you wish to spatial- or time-average or histogram per-atom quantities
|
|
from a compute, fix, or variable, then see the
|
|
:doc:`fix ave/chunk <fix_ave_chunk>`, :doc:`fix ave/atom <fix_ave_atom>`, or
|
|
:doc:`fix ave/histo <fix_ave_histo>` commands. If you wish to convert a
|
|
per-atom quantity into a single global value, see the
|
|
:doc:`compute reduce <compute_reduce>` command.
|
|
|
|
The input values must be all scalars. What kinds of
|
|
correlations between input values are calculated is determined by the
|
|
*type* keyword as discussed below.
|
|
|
|
:doc:`Computes <compute>` that produce global quantities are those which
|
|
do not have the word *atom* in their style name. Only a few
|
|
:doc:`fixes <fix>` produce global quantities. See the doc pages for
|
|
individual fixes for info on which ones produce such values.
|
|
:doc:`Variables <variable>` of style *equal* and *vector* are the only
|
|
ones that can be used with this fix. Variables of style *atom* cannot
|
|
be used, since they produce per-atom values.
|
|
|
|
----------
|
|
|
|
For input values from a compute or fix or variable , the bracketed
|
|
index I can be specified using a wildcard asterisk with the index to
|
|
effectively specify multiple values. This takes the form "\*" or
|
|
"\*n" or "m\*" or "m\*n". If :math:`N` is the size of the vector, then an
|
|
asterisk with no numeric values means all indices from 1 to :math:`N`. A
|
|
leading asterisk means all indices from 1 to n (inclusive). A
|
|
trailing asterisk means all indices from m to :math:`N` (inclusive).
|
|
A middle asterisk means all indices from m to n (inclusive).
|
|
|
|
Using a wildcard is the same as if the individual elements of the
|
|
vector had been listed one by one. For example, the following two fix
|
|
ave/correlate commands are equivalent, since the :doc:`compute pressure
|
|
<compute_pressure>` command creates a global vector with six values:
|
|
|
|
.. code-block:: LAMMPS
|
|
|
|
compute myPress all pressure NULL
|
|
fix 1 all ave/correlate 1 50 10000 c_myPress[*]
|
|
fix 1 all ave/correlate 1 50 10000 &
|
|
c_myPress[1] c_myPress[2] c_myPress[3] &
|
|
c_myPress[4] c_myPress[5] c_myPress[6]
|
|
|
|
.. note::
|
|
|
|
For a vector-style variable, only the wildcard forms "\*n" or
|
|
"m\*n" are allowed. You must specify the upper bound, because
|
|
vector-style variable lengths are not determined until the variable
|
|
is evaluated. If n is specified larger than the vector length
|
|
turns out to be, zeroes are output for missing vector values.
|
|
|
|
----------
|
|
|
|
The :math:`N_\text{every}`, :math:`N_\text{repeat}`, and :math:`N_\text{freq}`
|
|
arguments specify on what timesteps the input values will be used to calculate
|
|
correlation data. The input values are sampled every :math:`N_\text{every}`
|
|
time steps. The correlation data for the preceding samples is computed on
|
|
time steps that are a multiple of :math:`N_\text{freq}`\ . Consider a set of
|
|
samples from some initial time up to an output timestep. The initial time
|
|
could be the beginning of the simulation or the last output time; see the *ave*
|
|
keyword for options. For the set of samples, the correlation value
|
|
:math:`C_{ij}` is calculated as:
|
|
|
|
.. math::
|
|
|
|
C_{ij}(\Delta t) = \left\langle V_i(t) V_j(t+\Delta t)\right\rangle,
|
|
|
|
which is the correlation value between input values :math:`V_i` and
|
|
:math:`V_j`, separated by time :math:`\Delta t`. Note that the second value
|
|
:math:`V_j` in the pair is always the one sampled at the later time. The
|
|
average is an average over every pair of samples in the set that are separated
|
|
by time :math:`\Delta t`. The maximum :math:`\Delta t` used is of size
|
|
:math:`(N_\text{repeat} - 1) N_\text{every}`\ .
|
|
Thus the correlation between a pair of input values yields
|
|
:math:`N_\text{repeat}` correlation data:
|
|
|
|
.. math::
|
|
|
|
C_{ij}(0), C_{ij}(N_\text{every}), C_{ij}(2N_\text{every}), \dotsc,
|
|
C_{ij}\bigl((N_\text{repeat}-1) N_\text{every}\bigr)
|
|
|
|
For example, if :math:`N_\text{every}=5`, :math:`N_\text{repeat}=6`, and
|
|
:math:`N_\text{freq}=100`, then values on time steps
|
|
:math:`0, 5, 10, 15,\dotsc,100` will be used to compute the final averages
|
|
on time step 100. Six averages will be computed: :math:`C_{ij}(0)`,
|
|
:math:`C_{ij}(5)`, :math:`C_{ij}(10)`, :math:`C_{ij}(15)`, :math:`C_{ij}(20)`,
|
|
and :math:`C_{ij}(25)`. :math:`C_{ij}(10)` on time step 100 will
|
|
be the average of 19 samples, namely :math:`V_i(0) V_j(10)`,
|
|
:math:`V_i(5) V_j(15)`, :math:`V_i(10) V_j(20)`,
|
|
:math:`V_i(15) V_j(25), \dotsc,`
|
|
:math:`V_i(85) V_j(95)`, and :math:`V_i(90) V_j(100)`.
|
|
|
|
:math:`N_\text{freq}` must be a multiple of :math:`N_\text{every}`;
|
|
:math:`N_\text{every}` and :math:`N_\text{repeat}` must be non-zero.
|
|
Also, if the *ave* keyword is set to *one* which is the default, then
|
|
:math:`N_\text{freq} \ge (N_\text{repeat} -1) N_\text{every}` is required.
|
|
|
|
----------
|
|
|
|
If a value begins with "c\_", a compute ID must follow which has been
|
|
previously defined in the input script. If no bracketed term is
|
|
appended, the global scalar calculated by the compute is used. If a
|
|
bracketed term is appended, the :math:`I^\text{th}` element of the global
|
|
vector calculated by the compute is used. See the discussion above for how
|
|
:math:`I` can be specified with a wildcard asterisk to effectively specify
|
|
multiple values.
|
|
|
|
Note that there is a :doc:`compute reduce <compute_reduce>` command
|
|
that can sum per-atom quantities into a global scalar or vector which
|
|
can then be accessed by fix ave/correlate. It can also be a compute defined
|
|
not in your input script, but by :doc:`thermodynamic output <thermo_style>`
|
|
or other fixes such as :doc:`fix nvt <fix_nh>`
|
|
or :doc:`fix temp/rescale <fix_temp_rescale>`. See the doc pages for
|
|
these commands which give the IDs of these computes. Users can also
|
|
write code for their own compute styles and :doc:`add them to LAMMPS <Modify>`.
|
|
|
|
If a value begins with "f\_", a fix ID must follow which has been
|
|
previously defined in the input script. If no bracketed term is
|
|
appended, the global scalar calculated by the fix is used. If a
|
|
bracketed term is appended, the :math:`I^\text{th}` element of the global
|
|
vector calculated by the fix is used. See the discussion above for how
|
|
:math:`I` can be specified with a wildcard asterisk to effectively specify
|
|
multiple values.
|
|
|
|
Note that some fixes only produce their values on certain timesteps,
|
|
which must be compatible with :math:`N_\text{every}`, else an error will
|
|
result. Users can also write code for their own fix styles and
|
|
:doc:`add them to LAMMPS <Modify>`.
|
|
|
|
If a value begins with "v\_", a variable name must follow which has been
|
|
previously defined in the input script. Only equal-style or vector-style
|
|
variables can be referenced; the latter requires a bracketed term to specify
|
|
the :math:`I^\text{th}` element of the vector calculated by the variable.
|
|
See the :doc:`variable <variable>` command for details. Note that variables of
|
|
style *equal* or *vector* define a formula which can reference individual atom
|
|
properties or thermodynamic keywords, or they can invoke other computes, fixes,
|
|
or variables when they are evaluated, so this is a very general means of
|
|
specifying quantities to time correlate.
|
|
|
|
----------
|
|
|
|
Additional optional keywords also affect the operation of this fix.
|
|
|
|
The *type* keyword determines which pairs of input values are
|
|
correlated with each other. For :math:`N` input values :math:`V_i`,
|
|
with :math:`i \in \{1,\dotsc,N\}`, let the number of pairs be
|
|
:math:`N_\text{pair}`. Note that the second value in the
|
|
pair, :math:`V_i(t) V_j(t+\Delta t)`, is always the one sampled at the later
|
|
time.
|
|
|
|
* If *type* is set to *auto* then each input value is correlated with
|
|
itself (i.e., :math:`C_{ii} = V_i^2` for :math:`i \in \{1,\dotsc,N\}`,
|
|
so :math:`N_\text{pair} = N`).
|
|
* If *type* is set to *upper* then each input value is correlated with every
|
|
succeeding value (i.e., :math:`C_{ij} = V_i V_j` for :math:`i < j`, so
|
|
:math:`N_\text{pair} = N (N-1)/2`).
|
|
* If *type* is set to *lower* then each input value is correlated with every
|
|
preceding value (i.e., :math:`C_{ij} = V_i V_j` for :math:`i > j`, so
|
|
:math:`N_\text{pair} = N(N-1)/2`).
|
|
* If *type* is set to *auto/upper* then each input value is correlated
|
|
with itself and every succeeding value (i.e., :math:`C_{ij} = V_i V_j`
|
|
for :math:`i \ge j`, so :math:`N_\text{pair} = N(N+1)/2`).
|
|
* If *type* is set to *auto/lower* then each input value is correlated
|
|
with itself and every preceding value (i.e., :math:`C_{ij} = V_i V_j`
|
|
for :math:`i \le j`, so :math:`N_\text{pair} = N(N+1)/2`).
|
|
* If *type* is set to *full* then each input value is correlated with
|
|
itself and every other value (i.e., :math:`C_{ij} = V_i V_j` for
|
|
:math:`\{i,j\} = \{1,N\}`, so :math:`N_\text{pair} = N^2`).
|
|
|
|
The *ave* keyword determines what happens to the accumulation of correlation
|
|
samples every :math:`N_\text{freq}` timesteps. If the *ave* setting is *one*,
|
|
then the accumulation is restarted or zeroed every :math:`N_\text{freq}`
|
|
timesteps. Thus the outputs on successive :math:`N_\text{freq}` timesteps are
|
|
essentially independent of each other. The exception is that the
|
|
:math:`C_{ij}(0) = V_i(t) V_j(t)` value at a time step :math:`t,` where
|
|
:math:`t` is a multiple of :math:`N_\text{freq}`, contributes to the
|
|
correlation output both at time :math:`t` and at time :math:`t+N_\text{freq}`.
|
|
|
|
If the *ave* setting is *running*, then the accumulation is never zeroed.
|
|
Thus the output of correlation data at any timestep is the average over samples
|
|
accumulated every :math:`N_\text{every}` steps since the fix was defined.
|
|
It can only be restarted by deleting the fix via the :doc:`unfix <unfix>`
|
|
command, or by re-defining the fix by re-specifying it.
|
|
|
|
The *start* keyword specifies what time step the accumulation of
|
|
correlation samples will begin on. The default is step 0. Setting it
|
|
to a larger value can avoid adding non-equilibrated data to the
|
|
correlation averages.
|
|
|
|
The *prefactor* keyword specifies a constant which will be used as a multiplier
|
|
on the correlation data after it is averaged. It is effectively a scale factor
|
|
on :math:`V_i V_j`, which can be used to account for the size of the time
|
|
window or other unit conversions.
|
|
|
|
The *file* keyword allows a filename to be specified. Every
|
|
:math:`N_\text{freq}` steps, an array of correlation data is written to the
|
|
file. The number of rows is :math:`N_\text{repeat}`, as described above.
|
|
The number of columns is :math:`N_\text{pair}+2`, also as described above.
|
|
Thus the file ends up to be a series of these array sections.
|
|
|
|
The *overwrite* keyword will continuously overwrite the output file
|
|
with the latest output, so that it only contains one timestep worth of
|
|
output. This option can only be used with the *ave running* setting.
|
|
|
|
The *title1*, *title2*, and *title3* keywords allow specification of
|
|
the strings that will be printed as the first three lines of the output file,
|
|
assuming the *file* keyword was used. LAMMPS uses default values for each of
|
|
these, so they do not need to be specified.
|
|
|
|
By default, these header lines are as follows:
|
|
|
|
.. parsed-literal::
|
|
|
|
# Time-correlated data for fix ID
|
|
# TimeStep Number-of-time-windows
|
|
# Index TimeDelta Ncount valueI\*valueJ valueI\*valueJ ...
|
|
|
|
In the first line, ID is replaced with the fix-ID. The second line
|
|
describes the two values that are printed at the first of each section
|
|
of output. In the third line the value pairs are replaced with the
|
|
appropriate fields from the fix ave/correlate command.
|
|
|
|
----------
|
|
|
|
Let :math:`S_{ij}` be a set of time correlation data for input values
|
|
:math:`I` and :math:`J`, namely the :math:`N_\text{repeat}` values:
|
|
|
|
.. math::
|
|
|
|
S_{ij} = C_{ij}(0), C_{ij}(N_\text{every}), C_{ij}(2N_\text{every}),
|
|
\dotsc, C_{ijI}\bigl((N_\text{repeat}-1) N_\text{every}\bigr)
|
|
|
|
As explained below, these data are output as one column of a global
|
|
array, which is effectively the correlation matrix.
|
|
|
|
The *trap* function defined for :doc:`equal-style variables <variable>`
|
|
can be used to perform a time integration of this vector of data,
|
|
using a trapezoidal rule. This is useful for calculating various
|
|
quantities which can be derived from time correlation data. If a
|
|
normalization factor is needed for the time integration, it can be
|
|
included in the variable formula or via the *prefactor* keyword.
|
|
|
|
----------
|
|
|
|
Restart, fix_modify, output, run start/stop, minimize info
|
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
|
|
No information about this fix is written to
|
|
:doc:`binary restart files <restart>`. None of the
|
|
:doc:`fix_modify <fix_modify>` options are relevant to this fix.
|
|
|
|
This fix computes a global array of values which can be accessed by
|
|
various :doc:`output commands <Howto_output>`. The values can only be
|
|
accessed on timesteps that are multiples of :math:`N_\text{freq}` since that is
|
|
when averaging is performed. The global array has # of rows
|
|
:math:`N_\text{repeat}` and # of columns :math:`N_\text{pair}+2`. The first
|
|
column has the time :math:`\Delta t` (in time steps) between the pairs of input
|
|
values used to calculate the correlation, as described above. The second
|
|
column has the number of samples contributing to the correlation average, as
|
|
described above. The remaining Npair columns are for :math:`I,J` pairs of the
|
|
:math:`N` input values, as determined by the *type* keyword, as described
|
|
above.
|
|
|
|
* For *type* = *auto*, the :math:`N_\text{pair} = N` columns are ordered:
|
|
:math:`C_{11}, C_{22}, \dotsc, C_{NN}`
|
|
* For *type* = *upper*, the :math:`N_\text{pair} = N(N-1)/2` columns are
|
|
ordered: :math:`C_{12}, C_{13}, \dotsc, C_{1N}, C_{23}, \dotsc, C_{2N},
|
|
C_{34}, \dotsc, C_{N-1,N}`
|
|
* For *type* = *lower*, the :math:`N_\text{pair} = N(N-1)/2` columns are
|
|
ordered: :math:`C_{21}, C_{31}, C_{32}, C_{41}, C_{42}, C_{43I}, \dotsc,
|
|
C_{N1}, C_{N2}, \dotsc, C_{N,N-1}`
|
|
* For *type* = *auto/upper*, the :math:`N_\text{pair} = N(N+1)/2` columns are
|
|
ordered: :math:`C_{11}, C_{12}, C_{13}, \dotsc, C_{1N}, C_{22}, C_{23},
|
|
\dotsc, C_{2N}, C_{33}, C_{34}, \dotsc, C_{N-1,N}, C_{NN}`
|
|
* For *type* = *auto/lower*, the :math:`N_\text{pair} = N(N+1)/2` columns are
|
|
ordered: :math:`C_{11}, C_{21}, C_{22}, C_{31}, C_{32}, C_{33}, C_{41},
|
|
\dotsc, C_{44}, C_{N1}, C_{N2}, \dotsc, C_{N,N-1}, C_{NN}`
|
|
* For *type* = *full*, the :math:`N_\text{pair} = N^2` columns are ordered:
|
|
:math:`C_{11}, C_{12}, \dotsc, C_{1N}, C_{21}, C_{22}, \dotsc, C_{2N},
|
|
C_{31}, \dotsc, C_{3N}, \dotsc, C_{N1}, \dotsc, C_{N,N-1}, C_{NN}`
|
|
|
|
The array values calculated by this fix are treated as extensive. If
|
|
you need to divide them by the number of atoms, you must do this in a
|
|
later processing step (e.g., when using them in a :doc:`variable <variable>`).
|
|
|
|
No parameter of this fix can be used with the *start/stop* keywords of
|
|
the :doc:`run <run>` command. This fix is not invoked during :doc:`energy minimization <minimize>`.
|
|
|
|
Restrictions
|
|
""""""""""""
|
|
none
|
|
|
|
Related commands
|
|
""""""""""""""""
|
|
|
|
:doc:`fix ave/correlate/long <fix_ave_correlate_long>`,
|
|
:doc:`compute <compute>`, :doc:`fix ave/time <fix_ave_time>`,
|
|
:doc:`fix ave/atom <fix_ave_atom>`, :doc:`fix ave/chunk <fix_ave_chunk>`,
|
|
:doc:`fix ave/histo <fix_ave_histo>`, :doc:`variable <variable>`
|
|
|
|
Default
|
|
"""""""
|
|
|
|
none
|
|
|
|
The option defaults are ave = one, type = auto, start = 0, no file
|
|
output, title 1,2,3 = strings as described above, and prefactor = 1.0.
|