.. _user-guide-units:
|pyretis| units
===============
|pyretis| simulations are always carried out with a consistent
set of units. A system of units is defined by specifying
the energy scale, :math:`E`, the length scale, :math:`L`, and the
mass scale, :math:`M`.
This implicitly defines the time scale, :math:`T`, as
.. math::
T = \sqrt{\frac{M L^2}{E}}.
The charges are typically specified in units of electron charges or in
Coulombs. In |pyretis| the charges are internally scaled with the factor
:math:`\frac{1}{\sqrt{4 \pi \varepsilon_0}}` (where the units
of :math:`\varepsilon_0` is consistent with the defined
:math:`E`, :math:`L` and :math:`M`).
This means
that the Coulomb constant is implicitly contained within the charges in
the internal computations.
In |pyretis|, several systems of units are defined and you may also
define your own units. The choice of a system of units will define the units
used for input parameters.
The different systems of units defined in |pyretis| are described in the
following :ref:`section ` and the creation of custom
systems are :ref:`also described `.
In the |pyretis| library, the units are defined in
the :py:mod:`pyretis.core.units` module.
The defined constants can be displayed by,
.. code-block:: python
from pyretis.core.units import CONSTANTS
print('All constants':)
print(CONSTANTS)
print('The Boltzmann constant:')
print(CONSTANTS['kB'])
.. _user-units-system:
System of units in |pyretis|
----------------------------
The systems of units that are defined in |pyretis| are:
- ``lj``: A Lennard-Jones type of units.
- ``real``: A system of units similar to the LAMMPS [1]_ unit real.
- ``metal``: A system of units similar to the LAMMPS [1]_ unit metal.
- ``au``: Atomic units. [2]_
- ``electron``: A system of units similar to the LAMMPS [1]_ unit electron.
- ``si``: A system of units similar to the LAMMPS [1]_ unit si.
- ``gromacs``: A system of units similar to the units used by GROMACS. [3]_
The different bases for the different units are given in the
:ref:`table of definitions ` below.
The system of units is defined by setting the ``units`` keyword to
any of these units, e.g.
.. code-block:: python
units = real
# or perhaps:
units = metal
# or even Lennard-Jones units:
units = lj
Setting the unit system will define the units used for input to
|pyretis|. The units for the different systems are given in
the :ref:`table of input units ` below. Note
that the time unit is determined by the energy, length and
mass scale and that **the input time step will be assumed
to be given in internal units**. Conversion factors to more
familiar units are given in the
:ref:`table on time units `.
If the initial configuration is given as a file (for instance
in xyz format), then the system of units will be used to
convert the configuration. That is, |pyretis| will assume that
the configuration is given in the units specified by
the file format
(e.g. Ångström for positions in a xyz file).
The coordinates read from initial configuration fill will be
converted internally to the selected system of units.
.. _table_unit_input:
.. table:: Input units for different systems
:class: table-striped table-hover
+--------------+----------+---------+---------------+
| Unit system | Energy | Length | Mass |
+==============+==========+=========+===============+
| ``lj`` | reduced | reduced | reduced |
+--------------+----------+---------+---------------+
| ``real`` | kcal/mol | Å | g/mol |
+--------------+----------+---------+---------------+
| ``gromacs`` | kJ/mol | nm | g/mol |
+--------------+----------+---------+---------------+
| ``metal`` | eV | Å | g/mol |
+--------------+----------+---------+---------------+
| ``au`` | hartree | bohr | electron mass |
+--------------+----------+---------+---------------+
| ``electron`` | hartree | bohr | g/mol (amu) |
+--------------+----------+---------+---------------+
| ``si`` | J | m | kg |
+--------------+----------+---------+---------------+
For the ``lj`` system, the energy, length, mass, etc. are all
given in reduced units. However, it still might be useful (for instance
for trajectory output) to convert to other units.
By default, the scales
for the Lennard-Jones system of units corresponds to values for Argon. [4]_
These default units can be overridden explicitly by defining the length scale,
mass scale and energy scale:
.. code-block:: python
units = lj
units-base = {'length': (3.405, 'A'), 'mass': (39.948, 'g/mol'),
'energy': (119.8, 'kB')}
However, again note that this will only influence how we interpret input and output
configurations: all other output units for this system will still be in reduced
Lennard-Jones units. The syntax for overriding and creating your own units are
further described in the :ref:`next section `.
.. _table_unit_systems:
.. table:: Defining units for energy systems
:class: table-striped table-hover
+--------------+----------------+-------------+--------------------+
| Unit system | Energy unit | Length unit | Mass unit |
+==============+================+=============+====================+
| ``lj`` | 0.238 kcal/mol | 0.3405 nm | 39.948 g/mol |
+--------------+----------------+-------------+--------------------+
| ``real`` | 1 kcal/mol | 1 Å | 1 g/mol |
+--------------+----------------+-------------+--------------------+
| ``gromacs`` | 1 kJ/mol | 1 nm | 1 g/mol |
+--------------+----------------+-------------+--------------------+
| ``metal`` | 1 eV | 1 Å | 1 g/mol |
+--------------+----------------+-------------+--------------------+
| ``au`` | 1 hartree | 1 bohr | 9.10938291e-31 kg |
+--------------+----------------+-------------+--------------------+
| ``electron`` | 1 hartree | 1 bohr | 1 g/mol |
+--------------+----------------+-------------+--------------------+
| ``si`` | 1 J | 1 m | 1 kg |
+--------------+----------------+-------------+--------------------+
These units are also used for the input and define the time unit.
The time units are shown in :ref:`the table below `.
Further, all system of units expect an input temperature in Kelvin
(``K``) and all systems, except for ``si``, expects a
charge in units of electron charges. The ``si`` system uses here
Coulomb as the unit of charge. The time units for the different
energy systems are given in the table below.
.. _table_unit_systems_time:
.. table:: Time units and velocity conversions for energy systems
:class: table-striped table-hover
+--------------+--------------------+
| Unit system | Time unit |
+==============+====================+
| ``lj`` | 2.15634977232 ps |
+--------------+--------------------+
| ``real`` | 48.8882129084 fs |
+--------------+--------------------+
| ``gromacs`` | 1.0 ps |
+--------------+--------------------+
| ``metal`` | 10.1805056505 fs |
+--------------+--------------------+
| ``au`` | 0.0241888423521 fs |
+--------------+--------------------+
| ``electron`` | 1.03274987345 fs |
+--------------+--------------------+
| ``si`` | 1.0 s |
+--------------+--------------------+
The interpretation here is that if you are for instance using the system
``real`` and would like to have a time step equal to ``0.5 fs``, then the
input time step should be ``0.5 fs / 48.8882129084 fs`` which is
approximately ``0.010227``. Another example: If you are using the system
``metal`` and set your time step to ``0.1``, then the time step will be
approximately ``1.018 fs``.
.. _user-units-custom:
Defining your own system of units
---------------------------------
Defining your own system of units is basically just a matter of choosing
the energy, length and mass scales. Typically, this is done by setting the
units keyword and defining the base units in the
section :ref:`Unit-system `:
.. code-block:: rst
System
------
units = new-system
Unit-system
-----------
name = new-system
length = (1.0, 'bohr')
mass = (9.81e-31, 'kg')
energy = (1.0, 'kcal/mol')
charge = e
Note again that this will influence how the input parameters are
interpreted and that the input configuration files will be
converted to the internal unit system. In the example above, a
configuration read from a xyz-file will be converted from
Ångström to Bohr for internal calculations.
The syntax for specifying a new scale for a dimension is of form
.. code-block:: python
'dimension' = (value, unit)
Where the ``value`` is a number defining the scale and ``unit`` a text string
which defines the unit to use. This text string is case-sensitive.
For each dimension, |pyretis| defines a set of
"known" units to choose from:
Length:
* ``A``: Ångström.
* ``nm``: Nanometre.
* ``bohr``: Bohr radius.
* ``m``: Meter.
Energy:
* ``kcal``: Kilocalorie.
* ``kcal/mol``: Kilocalorie per mol.
* ``J``: Joule.
* ``J/mol``: Joule per mol.
* ``kJ/mol``: Kilojoule per mol.
* ``eV``: Electronvolt.
* ``hartree``: Hartree (atomic unit of energy).
Mass:
* ``g/mol``: Grams per mol, numerically equal to the atomic mass unit.
* ``g``: Gram.
* ``kg``: Kilogram.
For the ``charge`` setting, there it is currently only possible to define the
unit as either ``e`` (for the electron charge) or ``C`` (for Coulomb).
References
----------
.. [1] The LAMMPS manual, http://lammps.sandia.gov/doc/units.html
.. [2] https://en.wikipedia.org/wiki/Atomic_units
.. [3] The GROMACS manual, tables 2.1 and 2.2 on page. 8,
http://manual.gromacs.org/documentation/5.1.1/manual-5.1.1.pdf
.. [4] Rowley et al., J. Comput. Phys., vol. 17, pp. 401-414, 1975,
doi: http://dx.doi.org/10.1016/0021-9991