Resolving merge conflicts
This commit is contained in:
@ -352,7 +352,7 @@ KIM Extra unit tests (CMake only)
|
||||
During development, testing, or debugging, if
|
||||
:doc:`unit testing <Build_development>` is enabled in LAMMPS, one can also
|
||||
enable extra tests on :doc:`KIM commands <kim_commands>` by setting the
|
||||
``KIM_EXTRA_UNITTESTS`` to *yes* (or *on*).
|
||||
``KIM_EXTRA_UNITTESTS`` to *yes* (or *on*).
|
||||
|
||||
Enabling the extra unit tests have some requirements,
|
||||
|
||||
@ -367,9 +367,9 @@ Enabling the extra unit tests have some requirements,
|
||||
*conda-forge* channel as ``conda install kim-property`` if LAMMPS is built in
|
||||
Conda. More detailed information is available at:
|
||||
`kim-property installation <https://github.com/openkim/kim-property#installing-kim-property>`_.
|
||||
* It is also necessary to install
|
||||
``EAM_Dynamo_Mendelev_2007_Zr__MO_848899341753_000``, and
|
||||
``EAM_Dynamo_ErcolessiAdams_1994_Al__MO_123629422045_005`` KIM models.
|
||||
* It is also necessary to install
|
||||
``EAM_Dynamo_Mendelev_2007_Zr__MO_848899341753_000``, and
|
||||
``EAM_Dynamo_ErcolessiAdams_1994_Al__MO_123629422045_005`` KIM models.
|
||||
See `Obtaining KIM Models <http://openkim.org/doc/usage/obtaining-models>`_
|
||||
to learn how to install a pre-build binary of the OpenKIM Repository of
|
||||
Models or see
|
||||
|
||||
@ -221,6 +221,8 @@ OPT.
|
||||
* :doc:`temp/rescale <fix_temp_rescale>`
|
||||
* :doc:`temp/rescale/eff <fix_temp_rescale_eff>`
|
||||
* :doc:`tfmc <fix_tfmc>`
|
||||
* :doc:`tgnpt/drude <fix_tgnh_drude>`
|
||||
* :doc:`tgnvt/drude <fix_tgnh_drude>`
|
||||
* :doc:`thermal/conductivity <fix_thermal_conductivity>`
|
||||
* :doc:`ti/spring <fix_ti_spring>`
|
||||
* :doc:`tmd <fix_tmd>`
|
||||
|
||||
@ -13,6 +13,7 @@ of time and requests from the LAMMPS user community.
|
||||
Developer_org
|
||||
Developer_flow
|
||||
Developer_write
|
||||
Developer_notes
|
||||
Developer_unittest
|
||||
Classes
|
||||
Developer_utils
|
||||
|
||||
105
doc/src/Developer_notes.rst
Normal file
105
doc/src/Developer_notes.rst
Normal file
@ -0,0 +1,105 @@
|
||||
Notes for Developers and Code Maintainers
|
||||
-----------------------------------------
|
||||
|
||||
This section documents how a few large sections of code with LAMMPS
|
||||
work at a conceptual level. Comments on code in source files
|
||||
typically document what a variable stores, what a small section of
|
||||
code does, or what a function does or its input/outputs. The topics
|
||||
on this page are intended to document code at a higher level.
|
||||
|
||||
KSpace PPPM FFT grids
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The various :doc:`KSpace PPPM <kspace_style>` styles in LAMMPS use
|
||||
FFTs to solve Poisson's equation. This subsection describes:
|
||||
|
||||
* how FFT grids are defined
|
||||
* how they are decomposed across processors
|
||||
* how they are indexed by each processor
|
||||
* how particle charge and electric field values are mapped to/from
|
||||
the grid
|
||||
|
||||
An FFT grid cell is a 3d volume; grid points are corners of a grid
|
||||
cell and the code stores values assigned to grid points in vectors or
|
||||
3d arrays. A global 3d FFT grid has points indexed 0 to N-1 inclusive
|
||||
in each dimension.
|
||||
|
||||
Each processor owns two subsets of the grid, each subset is
|
||||
brick-shaped. Depending on how it is used, these subsets are
|
||||
allocated as a 1d vector or 3d array. Either way, the ordering of
|
||||
values within contiguous memory x fastest, then y, z slowest.
|
||||
|
||||
For the ``3d decomposition`` of the grid, the global grid is
|
||||
partitioned into bricks that correspond to the sub-domains of the
|
||||
simulation box that each processor owns. Often, this is a regular 3d
|
||||
array (Px by Py by Pz) of bricks, where P = number of processors =
|
||||
Px * Py * Pz. More generally it can be a tiled decomposition, where
|
||||
each processor owns a brick and the union of all the bricks is the
|
||||
global grid. Tiled decompositions are produced by load balancing with
|
||||
the RCB algorithm; see the :doc:`balance rcb <balance>` command.
|
||||
|
||||
For the ``FFT decompostion`` of the grid, each processor owns a brick
|
||||
that spans the entire x dimension of the grid while the y and z
|
||||
dimensions are partitioned as a regular 2d array (P1 by P2), where P =
|
||||
P1 * P2.
|
||||
|
||||
The following indices store the inclusive bounds of the brick a
|
||||
processor owns, within the global grid:
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in = 3d decomposition brick
|
||||
nxlo_fft,nxhi_fft,nylo_fft,nyhi_fft,nzlo_fft,nzhi_fft = FFT decomposition brick
|
||||
nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out = 3d decomposition brick + ghost cells
|
||||
|
||||
The ``in`` and ``fft`` indices are from 0 to N-1 inclusive in each
|
||||
dimension, where N is the grid size.
|
||||
|
||||
The ``out`` indices index an array which stores the ``in`` subset of
|
||||
the grid plus ghost cells that surround it. These indices can thus be
|
||||
< 0 or >= N.
|
||||
|
||||
The number of ghost cells a processor owns in each of the 6 directions
|
||||
is a function of:
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
neighbor skin distance (since atoms can move outside a proc subdomain)
|
||||
qdist = offset or charge from atom due to TIP4P fictitious charge
|
||||
order = mapping stencil size
|
||||
shift = factor used when order is an even number (see below)
|
||||
|
||||
Here is an explanation of how the PPPM variables ``order``,
|
||||
``nlower`` / ``nupper``, ``shift``, and ``OFFSET`` work. They are the
|
||||
relevant variables that determine how atom charge is mapped to grid
|
||||
points and how field values are mapped from grid points to atoms:
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
order = # of nearby grid points in each dim that atom charge/field are mapped to/from
|
||||
nlower,nupper = extent of stencil around the grid point an atom is assigned to
|
||||
OFFSET = large integer added/subtracted when mapping to avoid int(-0.75) = 0 when -1 is the desired result
|
||||
|
||||
The particle_map() method assigns each atom to a grid point.
|
||||
|
||||
If order is even, say 4:
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
atom is assigned to grid point to its left (in each dim)
|
||||
shift = OFFSET
|
||||
nlower = -1, nupper = 2, which are offsets from assigned grid point
|
||||
window of mapping grid pts is thus 2 grid points to left of atom, 2 to right
|
||||
|
||||
If order is odd, say 5:
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
atom is assigned to left/right grid pt it is closest to (in each dim)
|
||||
shift = OFFSET + 0.5
|
||||
nlower = 2, nupper = 2
|
||||
if point is in left half of cell, then window of affected grid pts is 3 grid points to left of atom, 2 to right
|
||||
if point is in right half of cell, then window of affected grid pts is 2 grid points to left of atom, 3 to right
|
||||
|
||||
These settings apply to each dimension, so that if order = 5, an
|
||||
atom's charge is mapped to 125 grid points that surround the atom.
|
||||
@ -42,10 +42,11 @@ screening. It may be necessary to use the *extra/special/per/atom*
|
||||
keyword of the :doc:`read_data <read_data>` command. If using :doc:`fix shake <fix_shake>`, make sure no Drude particle is in this fix
|
||||
group.
|
||||
|
||||
There are two ways to thermostat the Drude particles at a low
|
||||
There are three ways to thermostat the Drude particles at a low
|
||||
temperature: use either :doc:`fix langevin/drude <fix_langevin_drude>`
|
||||
for a Langevin thermostat, or :doc:`fix drude/transform/\* <fix_drude_transform>` for a Nose-Hoover
|
||||
thermostat. The former requires use of the command :doc:`comm_modify vel yes <comm_modify>`. The latter requires two separate integration
|
||||
thermostat, or :doc:`fix tgnvt/drude <fix_tgnh_drude>` for a temperature-grouped Nose-Hoover thermostat.
|
||||
The first and third require use of the command :doc:`comm_modify vel yes <comm_modify>`. The second requires two separate integration
|
||||
fixes like *nvt* or *npt*\ . The correct temperatures of the reduced
|
||||
degrees of freedom can be calculated using the :doc:`compute temp/drude <compute_temp_drude>`. This requires also to use the
|
||||
command *comm_modify vel yes*.
|
||||
|
||||
@ -221,6 +221,14 @@ modification of forces but no position/velocity updates), the fix
|
||||
|
||||
fix NVE all nve
|
||||
|
||||
To avoid the flying ice cube artifact, where the atoms progressively freeze and the
|
||||
center of mass of the whole system drifts faster and faster, the *fix momentum*
|
||||
can be used. For instance:
|
||||
|
||||
.. code-block:: LAMMPS
|
||||
|
||||
fix MOMENTUM all momentum 100 linear 1 1 1
|
||||
|
||||
Finally, do not forget to update the atom type elements if you use
|
||||
them in a *dump_modify ... element ...* command, by adding the element
|
||||
type of the DPs. Here for instance
|
||||
@ -376,14 +384,7 @@ For our phenol example, the groups would be defined as
|
||||
|
||||
Note that with the fixes *drude/transform*\ , it is not required to
|
||||
specify *comm_modify vel yes* because the fixes do it anyway (several
|
||||
times and for the forces also). To avoid the flying ice cube artifact
|
||||
:ref:`(Lamoureux and Roux) <Lamoureux2>`, where the atoms progressively freeze and the
|
||||
center of mass of the whole system drifts faster and faster, the *fix
|
||||
momentum* can be used. For instance:
|
||||
|
||||
.. code-block:: LAMMPS
|
||||
|
||||
fix MOMENTUM all momentum 100 linear 1 1 1
|
||||
times and for the forces also).
|
||||
|
||||
It is a bit more tricky to run a NPT simulation with Nose-Hoover
|
||||
barostat and thermostat. First, the volume should be integrated only
|
||||
@ -404,6 +405,31 @@ instructions for thermostatting and barostatting will look like
|
||||
fix NVT DRUDES nvt temp 1. 1. 20
|
||||
fix INVERSE all drude/transform/inverse
|
||||
|
||||
Another option for thermalizing the Drude model is to use the
|
||||
temperature-grouped Nose-Hoover (TGNH) thermostat proposed by :ref:`(Son) <TGNH-SON>`.
|
||||
This is implemented as :doc:`fix tgnvt/drude <fix_tgnh_drude>` and :doc:`fix tgnpt/drude <fix_tgnh_drude>`.
|
||||
It separates the kinetic energy into three contributions:
|
||||
the molecular center of mass (COM) motion, the motion of atoms or atom-Drude pairs relative to molecular COMs,
|
||||
and the relative motion of atom-Drude pairs.
|
||||
An independent Nose-Hoover chain is applied to each type of motion.
|
||||
When TGNH is used, the temperatures of molecular, atomic and Drude motion can be printed out with :doc:`thermo_style` command.
|
||||
|
||||
NVT simulation with TGNH thermostat
|
||||
|
||||
.. code-block:: LAMMPS
|
||||
|
||||
comm_modify vel yes
|
||||
fix TGNVT all tgnvt/drude temp 300. 300. 100 1. 20
|
||||
thermo_style custom f_TGNVT[1] f_TGNVT[2] f_TGNVT[3]
|
||||
|
||||
NPT simulation with TGNH thermostat
|
||||
|
||||
.. code-block:: LAMMPS
|
||||
|
||||
comm_modify vel yes
|
||||
fix TGNPT all tgnpt/drude temp 300. 300. 100 1. 20 iso 1. 1. 500
|
||||
thermo_style custom f_TGNPT[1] f_TGNPT[2] f_TGNPT[3]
|
||||
|
||||
----------
|
||||
|
||||
**Rigid bodies**
|
||||
@ -480,3 +506,7 @@ NPT ensemble using Nose-Hoover thermostat:
|
||||
|
||||
**(SWM4-NDP)** Lamoureux, Harder, Vorobyov, Roux, MacKerell, Chem Phys
|
||||
Let, 418, 245-249 (2006)
|
||||
|
||||
.. _TGNH-Son:
|
||||
|
||||
**(Son)** Son, McDaniel, Cui and Yethiraj, J Phys Chem Lett, 10, 7523 (2019).
|
||||
|
||||
@ -85,15 +85,15 @@ information is available, then also a heuristic based on that bond length
|
||||
is computed. It is used as communication cutoff, if there is no pair
|
||||
style present and no *comm_modify cutoff* command used. Otherwise a
|
||||
warning is printed, if this bond based estimate is larger than the
|
||||
communication cutoff used.
|
||||
communication cutoff used.
|
||||
|
||||
The *cutoff/multi* option is equivalent to *cutoff*\ , but applies to
|
||||
communication mode *multi* instead. Since in this case the communication
|
||||
cutoffs are determined per atom type, a type specifier is needed and
|
||||
cutoff for one or multiple types can be extended. Also ranges of types
|
||||
using the usual asterisk notation can be given. For granular pairstyles,
|
||||
using the usual asterisk notation can be given. For granular pair styles,
|
||||
the default cutoff is set to the sum of the current maximum atomic radii
|
||||
for each type.
|
||||
for each type.
|
||||
|
||||
The *cutoff/bytype* option applies to *multi* and automtically sets communication
|
||||
cutoffs for each particle type based on the largest interaction distance
|
||||
|
||||
@ -364,6 +364,8 @@ accelerated styles exist.
|
||||
* :doc:`temp/rescale <fix_temp_rescale>` - temperature control by velocity rescaling
|
||||
* :doc:`temp/rescale/eff <fix_temp_rescale_eff>` - temperature control by velocity rescaling in the electron force field model
|
||||
* :doc:`tfmc <fix_tfmc>` - perform force-bias Monte Carlo with time-stamped method
|
||||
* :doc:`tgnvt/drude <fix_tgnh_drude>` - NVT time integration for Drude polarizable model via temperature-grouped Nose-Hoover
|
||||
* :doc:`tgnpt/drude <fix_tgnh_drude>` - NPT time integration for Drude polarizable model via temperature-grouped Nose-Hoover
|
||||
* :doc:`thermal/conductivity <fix_thermal_conductivity>` - Muller-Plathe kinetic energy exchange for thermal conductivity calculation
|
||||
* :doc:`ti/spring <fix_ti_spring>` -
|
||||
* :doc:`tmd <fix_tmd>` - guide a group of atoms to a new configuration
|
||||
|
||||
@ -457,6 +457,23 @@ example, the molecule fragment could consist of only the backbone
|
||||
atoms of a polymer chain. This constraint can be used to enforce a
|
||||
specific relative position and orientation between reacting molecules.
|
||||
|
||||
By default, all constraints must be satisfied for the reaction to
|
||||
occur. In other words, constraints are evaluated as a series of
|
||||
logical values using the logical AND operator "&&". More complex logic
|
||||
can be achieved by explicitly adding the logical AND operator "&&" or
|
||||
the logical OR operator "||" after a given constraint command. If a
|
||||
logical operator is specified after a constraint, it must be placed
|
||||
after all constraint parameters, on the same line as the constraint
|
||||
(one per line). Similarly, parentheses can be used to group
|
||||
constraints. The expression that results from concatenating all
|
||||
constraints should be a valid logical expression that can be read by
|
||||
the :doc:`variable <variable>` command after converting each
|
||||
constraint to a logical value. Because exactly one constraint is
|
||||
allowed per line, having a valid logical expression implies that left
|
||||
parentheses "(" should only appear before a constraint, and right
|
||||
parentheses ")" should only appear after a constraint and before any
|
||||
logical operator.
|
||||
|
||||
Once a reaction site has been successfully identified, data structures
|
||||
within LAMMPS that store bond topology are updated to reflect the
|
||||
post-reacted molecule template. All force fields with fixed bonds,
|
||||
@ -599,8 +616,8 @@ reset_mol_ids = yes, custom_charges = no, molecule = off
|
||||
|
||||
.. _Gissinger:
|
||||
|
||||
**(Gissinger)** Gissinger, Jensen and Wise, Polymer, 128, 211 (2017).
|
||||
**(Gissinger)** Gissinger, Jensen and Wise, Polymer, 128, 211-217 (2017).
|
||||
|
||||
.. _Gissinger2020:
|
||||
|
||||
**(Gissinger)** Gissinger, Jensen and Wise, Macromolecules (2020, in press).
|
||||
**(Gissinger)** Gissinger, Jensen and Wise, Macromolecules, 53, 22, 9953–9961 (2020).
|
||||
|
||||
@ -41,12 +41,12 @@ Restrictions
|
||||
""""""""""""
|
||||
|
||||
This fix should be invoked before any other commands that implement
|
||||
the Drude oscillator model, such as :doc:`fix langevin/drude <fix_langevin_drude>`, :doc:`fix drude/transform <fix_drude_transform>`, :doc:`compute temp/drude <compute_temp_drude>`, :doc:`pair_style thole <pair_thole>`.
|
||||
the Drude oscillator model, such as :doc:`fix langevin/drude <fix_langevin_drude>`, :doc:`fix tgnvt/drude <fix_tgnh_drude>`, :doc:`fix drude/transform <fix_drude_transform>`, :doc:`compute temp/drude <compute_temp_drude>`, :doc:`pair_style thole <pair_thole>`.
|
||||
|
||||
Related commands
|
||||
""""""""""""""""
|
||||
|
||||
:doc:`fix langevin/drude <fix_langevin_drude>`, :doc:`fix drude/transform <fix_drude_transform>`, :doc:`compute temp/drude <compute_temp_drude>`, :doc:`pair_style thole <pair_thole>`
|
||||
:doc:`fix langevin/drude <fix_langevin_drude>`, :doc:`fix tgnvt/drude <fix_tgnh_drude>`, :doc:`fix drude/transform <fix_drude_transform>`, :doc:`compute temp/drude <compute_temp_drude>`, :doc:`pair_style thole <pair_thole>`
|
||||
|
||||
Default
|
||||
"""""""
|
||||
|
||||
@ -124,16 +124,16 @@ temperature is calculated taking the bias into account, bias is
|
||||
removed from each atom, thermostatting is performed on the remaining
|
||||
thermal degrees of freedom, and the bias is added back in.
|
||||
|
||||
An important feature of these thermostats is that they have an
|
||||
An important feature of these thermostats is that they have an
|
||||
associated effective energy that is a constant of motion.
|
||||
The effective energy is the total energy (kinetic + potential) plus
|
||||
the accumulated kinetic energy changes due to the thermostat. The
|
||||
latter quantity is the global scalar computed by these fixes. This
|
||||
feature is useful to check the integration of the equations of motion
|
||||
against discretization errors. In other words, the conservation of
|
||||
the effective energy can be used to choose an appropriate integration
|
||||
:doc:`timestep <timestep>`. This is similar to the usual paradigm of
|
||||
checking the conservation of the total energy in the microcanonical
|
||||
The effective energy is the total energy (kinetic + potential) plus
|
||||
the accumulated kinetic energy changes due to the thermostat. The
|
||||
latter quantity is the global scalar computed by these fixes. This
|
||||
feature is useful to check the integration of the equations of motion
|
||||
against discretization errors. In other words, the conservation of
|
||||
the effective energy can be used to choose an appropriate integration
|
||||
:doc:`timestep <timestep>`. This is similar to the usual paradigm of
|
||||
checking the conservation of the total energy in the microcanonical
|
||||
ensemble.
|
||||
|
||||
|
||||
|
||||
305
doc/src/fix_tgnh_drude.rst
Normal file
305
doc/src/fix_tgnh_drude.rst
Normal file
@ -0,0 +1,305 @@
|
||||
.. index:: fix tgnvt/drude
|
||||
.. index:: fix tgnpt/drude
|
||||
|
||||
fix tgnvt/drude command
|
||||
=======================
|
||||
|
||||
fix tgnpt/drude command
|
||||
=======================
|
||||
|
||||
|
||||
Syntax
|
||||
""""""
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
fix ID group-ID style_name keyword values ...
|
||||
|
||||
* ID, group-ID are documented in :doc:`fix <fix>` command
|
||||
* style_name = *tgnvt/drude* or *tgnpt/drude*
|
||||
* one or more keyword/values pairs may be appended
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
keyword = *temp* *iso* or *aniso* or *tri* or *x* or *y* or *z* or *xy* or *yz* or *xz* or *couple* or *tchain* or *pchain* or *mtk* or *tloop* or *ploop* or *nreset* or *scalexy* or *scaleyz* or *scalexz* or *flip* or *fixedpoint*
|
||||
*temp* values = Tstart Tstop Tdamp Tdrude Tdamp_drude
|
||||
Tstart, Tstop = external temperature at start/end of run (temperature units)
|
||||
Tdamp = temperature damping parameter (time units)
|
||||
Tdrude = desired temperature of Drude oscillators (temperature units)
|
||||
Tdamp_drude = temperature damping parameter for Drude oscillators (time units)
|
||||
*iso* or *aniso* or *tri* values = Pstart Pstop Pdamp
|
||||
Pstart,Pstop = scalar external pressure at start/end of run (pressure units)
|
||||
Pdamp = pressure damping parameter (time units)
|
||||
*x* or *y* or *z* or *xy* or *yz* or *xz* values = Pstart Pstop Pdamp
|
||||
Pstart,Pstop = external stress tensor component at start/end of run (pressure units)
|
||||
Pdamp = stress damping parameter (time units)
|
||||
*couple* = *none* or *xyz* or *xy* or *yz* or *xz*
|
||||
*tchain* value = N
|
||||
N = length of thermostat chain (1 = single thermostat)
|
||||
*pchain* value = N
|
||||
N length of thermostat chain on barostat (0 = no thermostat)
|
||||
*mtk* value = *yes* or *no* = add in MTK adjustment term or not
|
||||
*tloop* value = M
|
||||
M = number of sub-cycles to perform on thermostat
|
||||
*ploop* value = M
|
||||
M = number of sub-cycles to perform on barostat thermostat
|
||||
*nreset* value = reset reference cell every this many timesteps
|
||||
*scalexy* value = *yes* or *no* = scale xy with ly
|
||||
*scaleyz* value = *yes* or *no* = scale yz with lz
|
||||
*scalexz* value = *yes* or *no* = scale xz with lz
|
||||
*flip* value = *yes* or *no* = allow or disallow box flips when it becomes highly skewed
|
||||
*fixedpoint* values = x y z
|
||||
x,y,z = perform barostat dilation/contraction around this point (distance units)
|
||||
|
||||
Examples
|
||||
""""""""
|
||||
|
||||
.. code-block:: LAMMPS
|
||||
|
||||
comm_modify vel yes
|
||||
fix 1 all tgnvt/drude temp 300.0 300.0 100.0 1.0 20.0
|
||||
fix 1 water tgnpt/drude temp 300.0 300.0 100.0 1.0 20.0 iso 0.0 0.0 1000.0
|
||||
fix 2 jello tgnpt/drude temp 300.0 300.0 100.0 1.0 20.0 tri 5.0 5.0 1000.0
|
||||
fix 2 ice tgnpt/drude temp 250.0 250.0 100.0 1.0 20.0 x 1.0 1.0 0.5 y 2.0 2.0 0.5 z 3.0 3.0 0.5 yz 0.1 0.1 0.5 xz 0.2 0.2 0.5 xy 0.3 0.3 0.5 nreset 1000
|
||||
|
||||
Description
|
||||
"""""""""""
|
||||
|
||||
These commands are variants of the Nose-Hoover fix styles :doc:`fix nvt
|
||||
<fix_nh>` and :doc:`fix npt <fix_nh>` for thermalized Drude polarizable
|
||||
models. They apply temperature-grouped Nose-Hoover thermostat (TGNH)
|
||||
proposed by :ref:`(Son) <tgnh-Son>`. When there are fast vibrational
|
||||
modes with frequencies close to Drude oscillators (e.g. double bonds or
|
||||
out-of-plane torsions), this thermostat can provide better kinetic
|
||||
energy equipartitioning.
|
||||
|
||||
The difference between TGNH and the original Nose-Hoover thermostat is that,
|
||||
TGNH separates the kinetic energy of the group into three contributions:
|
||||
molecular center of mass (COM) motion,
|
||||
motion of COM of atom-Drude pairs or non-polarizable atoms relative to molecular COM,
|
||||
and relative motion of atom-Drude pairs.
|
||||
An independent Nose-Hoover chain is applied to each type of motion.
|
||||
The temperatures for these three types of motion are denoted as
|
||||
molecular translational temperature (:math:`T_\mathrm{M}`), real atomic temperature (:math:`T_\mathrm{R}`) and Drude temperature (:math:`T_\mathrm{D}`),
|
||||
which are defined in terms of their associated degrees of freedom (DOF):
|
||||
|
||||
.. math::
|
||||
|
||||
T_\mathrm{M}=\frac{\Sigma_{i}^{N_\mathrm{mol}} M_i V_i^2}{3 \left ( N_\mathrm{mol} - \frac{N_\mathrm{mol}}{N_\mathrm{mol,sys}} \right ) k_\mathrm{B}}
|
||||
|
||||
.. math::
|
||||
|
||||
T_\mathrm{R}=\frac{\Sigma_{i}^{N_\mathrm{real}} m_i (v_i-v_{M,i})^2}{(N_\mathrm{DOF} - 3 N_\mathrm{mol} + 3 \frac{N_\mathrm{mol}}{N_\mathrm{mol,sys}} - 3 N_\mathrm{drude}) k_\mathrm{B}}
|
||||
|
||||
.. math::
|
||||
|
||||
T_\mathrm{D}=\frac{\Sigma_{i}^{N_\mathrm{drude}} m_i^{\prime} v_i^{\prime 2}}{3 N_\mathrm{drude} k_\mathrm{B}}
|
||||
|
||||
Here :math:`N_\mathrm{mol}` and :math:`N_\mathrm{mol,sys}` are the numbers of molecules in the group and in the whole system, respectively.
|
||||
:math:`N_\mathrm{real}` is the number of atom-Drude pairs and non-polarizable atoms in the group.
|
||||
:math:`N_\mathrm{drude}` is the number of Drude particles in the group.
|
||||
:math:`N_\mathrm{DOF}` is the DOF of the group.
|
||||
:math:`M_i` and :math:`V_i` are the mass and the COM velocity of the i-th molecule.
|
||||
:math:`m_i` is the mass of the i-th atom-Drude pair or non-polarizable atom.
|
||||
:math:`v_i` is the velocity of COM of i-th atom-Drude pair or non-polarizable atom.
|
||||
:math:`v_{M,i}` is the COM velocity of the molecule the i-th atom-Drude pair or non-polarizable atom belongs to.
|
||||
:math:`m_i^\prime` and :math:`v_i^\prime` are the reduced mass and the relative velocity of the i-th atom-Drude pair.
|
||||
|
||||
.. note::
|
||||
|
||||
These fixes require that each atom knows whether it is a Drude particle or
|
||||
not. You must therefore use the :doc:`fix drude <fix_drude>` command to
|
||||
specify the Drude status of each atom type.
|
||||
|
||||
Because the TGNH thermostat thermostats the molecular COM motion,
|
||||
all atoms belonging to the same molecule must be in the same group.
|
||||
That is, these fixes can not be applied to a subset of a molecule.
|
||||
|
||||
For this fix to act correctly, ghost atoms need to know their velocity.
|
||||
You must use the :doc:`comm_modify <comm_modify>` command to enable this.
|
||||
|
||||
These fixes assume that the translational DOF of the whole system is removed.
|
||||
It is therefore recommended to invoke :doc:`fix momentum <fix_momentum>` command so that the :math:`T_\mathrm{M}` is calculated correctly.
|
||||
|
||||
----------
|
||||
|
||||
The thermostat parameters are specified using the *temp* keyword.
|
||||
The thermostat is applied to only the translational DOF
|
||||
for the particles. The translational DOF can also have
|
||||
a bias velocity removed before thermostatting takes place; see the
|
||||
description below. The desired temperature for molecular and real atomic motion is a
|
||||
ramped value during the run from *Tstart* to *Tstop*\ . The *Tdamp*
|
||||
parameter is specified in time units and determines how rapidly the
|
||||
temperature is relaxed. For example, a value of 10.0 means to relax
|
||||
the temperature in a timespan of (roughly) 10 time units (e.g. :math:`\tau`
|
||||
or fs or ps - see the :doc:`units <units>` command).
|
||||
The parameter *Tdrude* is the desired temperature for Drude motion at each timestep.
|
||||
Similar to *Tdamp*, the *Tdamp_drude* parameter determines the relaxation speed for Drude motion.
|
||||
Fix group are the only ones whose velocities and positions are updated
|
||||
by the velocity/position update portion of the integration.
|
||||
Other thermostat-related keywords are *tchain*\ and *tloop*\ ,
|
||||
which are detailed in :doc:`fix nvt <fix_nh>`.
|
||||
|
||||
.. note::
|
||||
|
||||
A Nose-Hoover thermostat will not work well for arbitrary values
|
||||
of *Tdamp*\ . If *Tdamp* is too small, the temperature can fluctuate
|
||||
wildly; if it is too large, the temperature will take a very long time
|
||||
to equilibrate. A good choice for many models is a *Tdamp* of around
|
||||
100 timesteps. A smaller *Tdamp_drude* value would be required
|
||||
to maintain Drude motion at low temperature.
|
||||
|
||||
.. code-block:: LAMMPS
|
||||
|
||||
fix 1 all nvt temp 300.0 300.0 $(100.0*dt) 1.0 $(20.0*dt)
|
||||
|
||||
----------
|
||||
|
||||
The barostat parameters for fix style *tgnpt/drude* is specified
|
||||
using one or more of the *iso*\ , *aniso*\ , *tri*\ , *x*\ , *y*\ , *z*\ , *xy*\ ,
|
||||
*xz*\ , *yz*\ , and *couple* keywords. These keywords give you the
|
||||
ability to specify all 6 components of an external stress tensor, and
|
||||
to couple various of these components together so that the dimensions
|
||||
they represent are varied together during a constant-pressure
|
||||
simulation. Other barostat-related keywords are *pchain*\ , *mtk*\ , *ploop*\ ,
|
||||
*nreset*\ , *scalexy*\ , *scaleyz*\ , *scalexz*\ , *flip*\ and *fixedpoint*.
|
||||
The meaning of barostat parameters are detailed in :doc:`fix npt <fix_nh>`.
|
||||
|
||||
Regardless of what atoms are in the fix group (the only atoms which
|
||||
are time integrated), a global pressure or stress tensor is computed
|
||||
for all atoms. Similarly, when the size of the simulation box is
|
||||
changed, all atoms are re-scaled to new positions.
|
||||
|
||||
.. note::
|
||||
|
||||
Unlike the :doc:`fix temp/berendsen <fix_temp_berendsen>` command
|
||||
which performs thermostatting but NO time integration, these fixes
|
||||
perform thermostatting/barostatting AND time integration. Thus you
|
||||
should not use any other time integration fix, such as :doc:`fix nve <fix_nve>` on atoms to which this fix is applied.
|
||||
Likewise, these fixes should not be used on atoms that also
|
||||
have their temperature controlled by another fix - e.g. by :doc:`fix langevin/drude <fix_langevin_drude>` command.
|
||||
|
||||
See the :doc:`Howto thermostat <Howto_thermostat>` and :doc:`Howto barostat <Howto_barostat>` doc pages for a discussion of different
|
||||
ways to compute temperature and perform thermostatting and
|
||||
barostatting.
|
||||
|
||||
----------
|
||||
|
||||
Like other fixes that perform thermostatting, these fixes can
|
||||
be used with :doc:`compute commands <compute>` that calculate a
|
||||
temperature after removing a "bias" from the atom velocities.
|
||||
This is not done by default, but only if the :doc:`fix_modify <fix_modify>` command
|
||||
is used to assign a temperature compute to this fix that includes such
|
||||
a bias term. See the doc pages for individual :doc:`compute commands <compute>` to determine which ones include a bias. In
|
||||
this case, the thermostat works in the following manner: the current
|
||||
temperature is calculated taking the bias into account, bias is
|
||||
removed from each atom, thermostatting is performed on the remaining
|
||||
thermal DOF, and the bias is added back in.
|
||||
|
||||
.. note::
|
||||
|
||||
However, not all temperature compute commands are valid to be used with these fixes.
|
||||
Precisely, only temperature compute that does not modify the DOF of the group can be used.
|
||||
E.g. :doc:`compute temp/ramp <compute_temp_ramp>` and :doc:`compute viscosity/cos <compute_viscosity_cos>`
|
||||
compute the kinetic energy after remove a velocity gradient without affecting the DOF of the group,
|
||||
then they can be invoked in this way.
|
||||
In contrast, :doc:`compute temp/partial <compute_temp_partial>` may remove the DOF at one or more dimensions,
|
||||
therefore it cannot be used with these fixes.
|
||||
|
||||
----------
|
||||
|
||||
Restart, fix_modify, output, run start/stop, minimize info
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
These fixes writes the state of all the thermostat and barostat
|
||||
variables to :doc:`binary restart files <restart>`. See the
|
||||
:doc:`read_restart <read_restart>` command for info on how to re-specify
|
||||
a fix in an input script that reads a restart file, so that the
|
||||
operation of the fix continues in an uninterrupted fashion.
|
||||
|
||||
The :doc:`fix_modify <fix_modify>` *temp* and *press* options are
|
||||
supported by these fixes. You can use them to assign a
|
||||
:doc:`compute <compute>` you have defined to this fix which will be used
|
||||
in its thermostatting or barostatting procedure, as described above.
|
||||
If you do this, note that the kinetic energy derived from the compute
|
||||
temperature should be consistent with the virial term computed using
|
||||
all atoms for the pressure. LAMMPS will warn you if you choose to
|
||||
compute temperature on a subset of atoms.
|
||||
|
||||
.. note::
|
||||
|
||||
If both the *temp* and *press* keywords are used in a single
|
||||
thermo_modify command (or in two separate commands), then the order in
|
||||
which the keywords are specified is important. Note that a :doc:`pressure compute <compute_pressure>` defines its own temperature compute as
|
||||
an argument when it is specified. The *temp* keyword will override
|
||||
this (for the pressure compute being used by fix npt), but only if the
|
||||
*temp* keyword comes after the *press* keyword. If the *temp* keyword
|
||||
comes before the *press* keyword, then the new pressure compute
|
||||
specified by the *press* keyword will be unaffected by the *temp*
|
||||
setting.
|
||||
|
||||
The :doc:`fix_modify <fix_modify>` *energy* option is supported by these
|
||||
fixes to add the energy change induced by Nose/Hoover thermostatting
|
||||
and barostatting to the system's potential energy as part of
|
||||
:doc:`thermodynamic output <thermo_style>`.
|
||||
|
||||
These fixes compute a global scalar and a global vector of quantities,
|
||||
which can be accessed by various :doc:`output commands <Howto_output>`.
|
||||
The scalar value calculated by these fixes is "extensive"; the vector
|
||||
values are "intensive".
|
||||
The scalar is the cumulative energy change due to the fix.
|
||||
The vector stores the three temperatures :math:`T_\mathrm{M}`, :math:`T_\mathrm{R}` and :math:`T_\mathrm{D}`.
|
||||
|
||||
These fixes can ramp their external temperature and pressure over
|
||||
multiple runs, using the *start* and *stop* keywords of the
|
||||
:doc:`run <run>` command. See the :doc:`run <run>` command for details of
|
||||
how to do this.
|
||||
|
||||
These fixes are not invoked during :doc:`energy minimization <minimize>`.
|
||||
|
||||
----------
|
||||
|
||||
Restrictions
|
||||
""""""""""""
|
||||
|
||||
These fixes are only available when LAMMPS was built with the USER-DRUDE package.
|
||||
These fixes cannot be used with dynamic groups as defined by the :doc:`group <group>` command.
|
||||
These fixes cannot be used in 2D simulations.
|
||||
|
||||
*X*\ , *y*\ , *z* cannot be barostatted if the associated dimension is not
|
||||
periodic. *Xy*\ , *xz*\ , and *yz* can only be barostatted if the
|
||||
simulation domain is triclinic and the second dimension in the keyword
|
||||
(\ *y* dimension in *xy*\ ) is periodic. The :doc:`create_box <create_box>`,
|
||||
:doc:`read data <read_data>`, and :doc:`read_restart <read_restart>`
|
||||
commands specify whether the simulation box is orthogonal or
|
||||
non-orthogonal (triclinic) and explain the meaning of the xy,xz,yz
|
||||
tilt factors.
|
||||
|
||||
For the *temp* keyword, the final *Tstop* cannot be 0.0 since it would
|
||||
make the external T = 0.0 at some timestep during the simulation which
|
||||
is not allowed in the Nose/Hoover formulation.
|
||||
|
||||
The *scaleyz yes*\ , *scalexz yes*\ , and *scalexy yes* options
|
||||
can only be used if the second dimension in the keyword is periodic,
|
||||
and if the tilt factor is not coupled to the barostat via keywords
|
||||
*tri*\ , *yz*\ , *xz*\ , and *xy*\ .
|
||||
|
||||
Related commands
|
||||
""""""""""""""""
|
||||
|
||||
:doc:`fix drude <fix_drude>`, :doc:`fix nvt <fix_nh>`, :doc:`fix_npt <fix_nh>`,
|
||||
:doc:`fix_modify <fix_modify>`
|
||||
|
||||
Default
|
||||
"""""""
|
||||
|
||||
The keyword defaults are tchain = 3, pchain = 3, mtk = yes, tloop = 1,
|
||||
ploop = 1, nreset = 0, couple = none,
|
||||
flip = yes, scaleyz = scalexz = scalexy = yes if periodic in second
|
||||
dimension and not coupled to barostat, otherwise no.
|
||||
|
||||
----------
|
||||
|
||||
.. _tgnh-Son:
|
||||
|
||||
**(Son)** Son, McDaniel, Cui and Yethiraj, J Phys Chem Lett, 10, 7523 (2019).
|
||||
@ -49,7 +49,7 @@ sometimes be faster. Either style should give the same answers.
|
||||
|
||||
The *multi* style is a modified binning algorithm that is useful for
|
||||
systems with a wide range of cutoff distances, e.g. due to different
|
||||
size particles. For granular pairstyles, cutoffs are set to the
|
||||
size particles. For granular pair styles, cutoffs are set to the
|
||||
sum of the maximum atomic radii for each atom type.
|
||||
For the *bin* style, the bin size is set to 1/2 of
|
||||
the largest cutoff distance between any pair of atom types and a
|
||||
@ -59,8 +59,10 @@ other type pairs have a much shorter cutoff. For style *multi* the
|
||||
bin size is set to 1/2 of the shortest cutoff distance and multiple
|
||||
sets of bins are defined to search over for different atom types.
|
||||
This imposes some extra setup overhead, but the searches themselves
|
||||
may be much faster for the short-cutoff cases. See the :doc:`comm_modify mode multi <comm_modify>` command for a communication option
|
||||
that may also be beneficial for simulations of this kind.
|
||||
may be much faster for the short-cutoff cases.
|
||||
See the :doc:`comm_modify mode multi <comm_modify>` command for a
|
||||
communication option that may also be beneficial for simulations of
|
||||
this kind.
|
||||
|
||||
The *bytype* style is an extension of the *multi* style that was
|
||||
presented by Shire, Hanley, and Stratford :ref:`(Shire) <bytype-Shire>`.
|
||||
|
||||
@ -18,13 +18,16 @@ Syntax
|
||||
*gpu* args = Ngpu keyword value ...
|
||||
Ngpu = # of GPUs per node
|
||||
zero or more keyword/value pairs may be appended
|
||||
keywords = *neigh* or *newton* or *binsize* or *split* or *gpuID* or *tpa* or *device* or *blocksize*
|
||||
keywords = *neigh* or *newton* or *pair/only* or *binsize* or *split* or *gpuID* or *tpa* or *device* or *blocksize*
|
||||
*neigh* value = *yes* or *no*
|
||||
yes = neighbor list build on GPU (default)
|
||||
no = neighbor list build on CPU
|
||||
*newton* = *off* or *on*
|
||||
off = set Newton pairwise flag off (default and required)
|
||||
on = set Newton pairwise flag on (currently not allowed)
|
||||
*pair/only* = *off* or *on*
|
||||
off = apply "gpu" suffix to all available styles in the GPU package (default)
|
||||
on - apply "gpu" suffix only pair styles
|
||||
*binsize* value = size
|
||||
size = bin size for neighbor list construction (distance units)
|
||||
*split* = fraction
|
||||
@ -65,7 +68,7 @@ Syntax
|
||||
*no_affinity* values = none
|
||||
*kokkos* args = keyword value ...
|
||||
zero or more keyword/value pairs may be appended
|
||||
keywords = *neigh* or *neigh/qeq* or *neigh/thread* or *newton* or *binsize* or *comm* or *comm/exchange* or *comm/forward* or *comm/reverse* or *cuda/aware*
|
||||
keywords = *neigh* or *neigh/qeq* or *neigh/thread* or *newton* or *binsize* or *comm* or *comm/exchange* or *comm/forward* or *comm/reverse* or *cuda/aware* or *pair/only*
|
||||
*neigh* value = *full* or *half*
|
||||
full = full neighbor list
|
||||
half = half neighbor list built in thread-safe manner
|
||||
@ -91,6 +94,9 @@ Syntax
|
||||
*cuda/aware* = *off* or *on*
|
||||
off = do not use CUDA-aware MPI
|
||||
on = use CUDA-aware MPI (default)
|
||||
*pair/only* = *off* or *on*
|
||||
off = use device acceleration (e.g. GPU) for all available styles in the KOKKOS package (default)
|
||||
on = use device acceleration only for pair styles (and host acceleration for others)
|
||||
*omp* args = Nthreads keyword value ...
|
||||
Nthread = # of OpenMP threads to associate with each MPI process
|
||||
zero or more keyword/value pairs may be appended
|
||||
@ -194,6 +200,14 @@ for compatibility with the package command for other accelerator
|
||||
styles. Note that the newton setting for bonded interactions is not
|
||||
affected by this keyword.
|
||||
|
||||
The *pair/only* keyword can change how any "gpu" suffix is applied.
|
||||
By default a suffix is applied to all styles for which an accelerated
|
||||
variant is available. However, that is not always the most effective
|
||||
way to use an accelerator. With *pair/only* set to *on* the suffix
|
||||
will only by applied to supported pair styles, which tend to be the
|
||||
most effective in using an accelerator and their operation can be
|
||||
overlapped with all other computations on the CPU.
|
||||
|
||||
The *binsize* keyword sets the size of bins used to bin atoms in
|
||||
neighbor list builds performed on the GPU, if *neigh* = *yes* is set.
|
||||
If *binsize* is set to 0.0 (the default), then bins = the size of the
|
||||
@ -534,12 +548,20 @@ available (currently only possible with OpenMPI v2.0.0 or later), then
|
||||
the *cuda/aware* keyword is automatically set to *off* by default. When
|
||||
the *cuda/aware* keyword is set to *off* while any of the *comm*
|
||||
keywords are set to *device*\ , the value for these *comm* keywords will
|
||||
be automatically changed to *host*\ . This setting has no effect if not
|
||||
be automatically changed to *no*\ . This setting has no effect if not
|
||||
running on GPUs or if using only one MPI rank. CUDA-aware MPI is available
|
||||
for OpenMPI 1.8 (or later versions), Mvapich2 1.9 (or later) when the
|
||||
"MV2_USE_CUDA" environment variable is set to "1", CrayMPI, and IBM
|
||||
Spectrum MPI when the "-gpu" flag is used.
|
||||
|
||||
The *pair/only* keyword can change how the KOKKOS suffix "kk" is applied
|
||||
when using an accelerator device. By default device acceleration is
|
||||
always used for all available styles. With *pair/only* set to *on* the
|
||||
suffix setting will choose device acceleration only for pair styles and
|
||||
run all other force computations concurrently on the host CPU.
|
||||
The *comm* flags will also automatically be changed to *no*\ . This can
|
||||
result in better performance for certain configurations and system sizes.
|
||||
|
||||
----------
|
||||
|
||||
The *omp* style invokes settings associated with the use of the
|
||||
|
||||
Reference in New Issue
Block a user