Merge branch 'lammps:develop' into fortran-tinkering

This commit is contained in:
hammondkd
2022-09-09 21:23:26 -05:00
committed by GitHub
130 changed files with 54742 additions and 2169 deletions

View File

@ -6,10 +6,13 @@ else()
endif()
option(DOWNLOAD_MDI "Download and compile the MDI library instead of using an already installed one" ${DOWNLOAD_MDI_DEFAULT})
if(DOWNLOAD_MDI)
message(STATUS "MDI download requested - we will build our own")
set(MDI_URL "https://github.com/MolSSI-MDI/MDI_Library/archive/v1.4.1.tar.gz" CACHE STRING "URL for MDI tarball")
set(MDI_MD5 "f9505fccd4c79301a619f6452dad4ad9" CACHE STRING "MD5 checksum for MDI tarball")
set(MDI_URL "https://github.com/MolSSI-MDI/MDI_Library/archive/v1.4.10.tar.gz" CACHE STRING "URL for MDI tarball")
set(MDI_MD5 "1c203b7fd462d9934834f643f09f3c06" CACHE STRING "MD5 checksum for MDI tarball")
mark_as_advanced(MDI_URL)
mark_as_advanced(MDI_MD5)
enable_language(C)

View File

@ -61,6 +61,7 @@ An alphabetic list of general LAMMPS commands.
* :doc:`kspace_modify <kspace_modify>`
* :doc:`kspace_style <kspace_style>`
* :doc:`label <label>`
* :doc:`labelmap <labelmap>`
* :doc:`lattice <lattice>`
* :doc:`log <log>`
* :doc:`mass <mass>`

View File

@ -175,6 +175,12 @@ and parsing files or arguments.
.. doxygenfunction:: is_double
:project: progguide
.. doxygenfunction:: is_id
:project: progguide
.. doxygenfunction:: is_type
:project: progguide
Potential file functions
^^^^^^^^^^^^^^^^^^^^^^^^
@ -205,6 +211,9 @@ Argument processing
.. doxygenfunction:: expand_args
:project: progguide
.. doxygenfunction:: expand_type
:project: progguide
Convenience functions
^^^^^^^^^^^^^^^^^^^^^

View File

@ -5453,6 +5453,11 @@ Doc page with :doc:`WARNING messages <Errors_warnings>`
Mass command must set a type from 1-N where N is the number of atom
types.
*Invalid label2type() function syntax in variable formula*
The first argument must be a label map kind (atom, bond, angle,
dihedral, or improper) and the second argument must be a valid type
label that has been assigned to a numeric type.
*Invalid use of library file() function*
This function is called through the library interface. This
error should not occur. Contact the developers if it does.
@ -5585,9 +5590,18 @@ Doc page with :doc:`WARNING messages <Errors_warnings>`
*LJ6 off not supported in pair_style buck/long/coul/long*
Self-explanatory.
*Label map is incomplete: all types must be assigned a unique type label*
For a given type-kind (atom types, bond types, etc.) to be written to
the data file, all associated types must be assigned a type label, and
each type label can be assigned to only one numeric type.
*Label wasn't found in input script*
Self-explanatory.
*Labelmap command before simulation box is defined*
The labelmap command cannot be used before a read_data,
read_restart, or create_box command.
*Lattice orient vectors are not orthogonal*
The three specified lattice orientation vectors must be mutually
orthogonal.
@ -5863,6 +5877,12 @@ Doc page with :doc:`WARNING messages <Errors_warnings>`
*Must not have multiple fixes change box parameter ...*
Self-explanatory.
*Must read Angle Type Labels before Angles*
An Angle Type Labels section of a data file must come before the Angles section.
*Must read Atom Type Labels before Atoms*
An Atom Type Labels section of a data file must come before the Atoms section.
*Must read Atoms before Angles*
The Atoms section of a data file must come before an Angles section.
@ -5893,6 +5913,15 @@ Doc page with :doc:`WARNING messages <Errors_warnings>`
The Atoms section of a data file must come before a Velocities
section.
*Must read Bond Type Labels before Bonds*
A Bond Type Labels section of a data file must come before the Bonds section.
*Must read Dihedral Type Labels before Dihedrals*
An Dihedral Type Labels section of a data file must come before the Dihedrals section.
*Must read Improper Type Labels before Impropers*
An Improper Type Labels section of a data file must come before the Impropers section.
*Must re-specify non-restarted pair style (xxx) after read_restart*
For pair styles, that do not store their settings in a restart file,
it must be defined with a new 'pair_style' command after read_restart.
@ -7849,6 +7878,10 @@ keyword to allow for additional bonds to be formed
Number of local atoms times number of columns must fit in a 32-bit
integer for dump.
*Topology type exceeds system topology type*
The number of bond, angle, etc types exceeds the system setting. See
the create_box or read_data command for how to specify these values.
*Tree structure in joint connections*
Fix poems cannot (yet) work with coupled bodies whose joints connect
the bodies in a tree structure.
@ -7873,6 +7906,13 @@ keyword to allow for additional bonds to be formed
*Two groups cannot be the same in fix spring couple*
Self-explanatory.
*The %s type label %s is already in use for type %s*
For a given type-kind (atom types, bond types, etc.), a given type
label can be assigned to only one numeric type.
*Type label string %s for %s type %s is invalid*
See the labelmap command documentation for valid type labels.
*Unable to initialize accelerator for use*
There was a problem initializing an accelerator for the gpu package

View File

@ -34,6 +34,7 @@ Settings howto
:maxdepth: 1
Howto_2d
Howto_type_labels
Howto_triclinic
Howto_thermostat
Howto_barostat

View File

@ -0,0 +1,126 @@
Type labels
===========
.. versionadded:: TBD
Each atom in LAMMPS has an associated numeric atom type. Similarly,
each bond, angle, dihedral, and improper is assigned a bond type,
angle type, and so on. The primary use of these types is to map
potential (force field) parameters to the interactions of the atom,
bond, angle, dihedral, and improper.
By default, type values are entered as integers from 1 to Ntypes
wherever they appear in LAMMPS input or output files. The total number
Ntypes for each interaction is "locked in" when the simulation box
is created.
A recent addition to LAMMPS is the option to use strings - referred
to as type labels - as an alternative. Using type labels instead of
numeric types can be advantageous in various scenarios. For example,
type labels can make inputs more readable and generic (i.e. usable through
the :doc:`include command <include>` for different systems with different
numerical values assigned to types. This generality also applies to
other inputs like data files read by :doc:`read_data <read_data>` or
molecule template files read by the :doc:`molecule <molecule>`
command. See below for a list of other commands that can use
type labels in different ways.
LAMMPS will *internally* continue to use numeric types, which means
that many previous restrictions still apply. For example, the total
number of types is locked in when creating the simulation box, and
potential parameters for each type must be provided even if not used
by any interactions.
A collection of type labels for all type-kinds (atom types, bond types,
etc.) is stored as a "label map" which is simply a list of numeric types
and their associated type labels. Within a type-kind, each type label
must be unique. It can be assigned to only one numeric type. To read
and write type labels to data files for a given type-kind, *all*
associated numeric types need have a type label assigned. Partial
maps can be saved with the :doc:`labelmap write <labelmap>` command
and read back with the :doc:`include <include>` command.
Valid type labels can contain most ASCII characters, but cannot start
with a number, a '#', or a '*'. Also, labels must not contain whitespace
characters. When using the :doc:`labelmap command <labelmap>` in the
LAMMPS input, if certain characters appear in the type label, such as
the single (') or double (") quote or the '#' character, the label
must be put in either double, single, or triple (""") quotes. Triple
quotes allow for the most generic type label strings, but they require
to have a leading and trailing blank space. When defining type labels
the blanks will be ignored. Example:
.. code-block:: LAMMPS
labelmap angle 1 """ C1'-C2"-C3# """
This command will map the string ```C1'-C2"-C3#``` to the angle type 1.
There are two ways to define label maps. One is via the :doc:`labelmap
<labelmap>` command. The other is via the :doc:`read_data <read_data>`
command. A data file can have sections such as *Atom Type Labels*, *Bond
Type Labels*, etc., which assign type labels to numeric types. The
label map can be written out to data files by the :doc:`write_data
<write_data>` command. This map is also written to and read from
restart files, by the :doc:`write_restart <write_restart>` and
:doc:`read_restart <read_restart>` commands.
----------
Use of type labels in LAMMPS input or output
""""""""""""""""""""""""""""""""""""""""""""
Many LAMMPS input script commands that take a numeric type as an
argument can use the associated type label instead. If a type label
is not defined for a particular numeric type, only its numeric type
can be used.
This example assigns labels to the atom types, and then uses the type
labels to redefine the pair coefficients.
.. code-block:: LAMMPS
pair_coeff 1 2 1.0 1.0 # numeric types
labelmap atom 1 C 2 H
pair_coeff C H 1.0 1.0 # type labels
Adding support for type labels to various commands is an ongoing
project. If an input script command (or a section in a file read by a
command) allows substituting a type label for a numeric type argument,
it will be explicitly mentioned in that command's documentation page.
As a temporary measure, input script commands can take advantage of
variables and how they can be expanded during processing of the input.
The variables can use functions that will translate type label strings
to their respective number as defined in the current label map. See the
:doc:`variable <variable>` command for details.
For example, here is how the pair_coeff command could be used with
type labels if it did not yet support them, either with an explicit
variable command or an implicit variable used in the pair_coeff
command.
.. code-block:: LAMMPS
labelmap atom 1 C 2 H
variable atom1 equal label2type(atom,C)
variable atom2 equal label2type(atom,H)
pair_coeff ${atom1} ${atom2} 1.0 1.0
.. code-block:: LAMMPS
labelmap atom 1 C 2 H
pair_coeff $(label2type(atom,C)) $(label2type(atom,H)) 80.0 1.2
----------
Commands that can use label types
"""""""""""""""""""""""""""""""""
Any workflow that involves reading multiple data files, molecule
templates or a combination of the two can be streamlined by using type
labels instead of numeric types, because types are automatically synced
between the files. The creation of simulation-ready reaction templates
for :doc:`fix bond/react <fix_bond_react>` is much simpler when using
type labels, and results in templates that can be used without
modification in multiple simulations or different systems.

View File

@ -10,7 +10,7 @@ Syntax
angle_coeff N args
* N = angle type (see asterisk form below)
* N = numeric angle type (see asterisk form below), or type label
* args = coefficients for one or more angle types
Examples
@ -22,6 +22,9 @@ Examples
angle_coeff * 5.0
angle_coeff 2*10 5.0
labelmap angle 1 hydroxyl
angle_coeff hydroxyl 300.0 107.0
Description
"""""""""""
@ -30,18 +33,24 @@ The number and meaning of the coefficients depends on the angle style.
Angle coefficients can also be set in the data file read by the
:doc:`read_data <read_data>` command or in a restart file.
N can be specified in one of two ways. An explicit numeric value can
be used, as in the first example above. Or a wild-card asterisk can be
used to set the coefficients for multiple angle types. This takes the
form "\*" or "\*n" or "n\*" or "m\*n". If N = the number of angle types,
then an asterisk with no numeric values means all types from 1 to N. A
leading asterisk means all types from 1 to n (inclusive). A trailing
asterisk means all types from n to N (inclusive). A middle asterisk
means all types from m to n (inclusive).
:math:`N` can be specified in one of two ways. An explicit numeric
value can be used, as in the first example above. Or :math:`N` can be a
type label, which is an alphanumeric string defined by the
:doc:`labelmap <labelmap>` command or in a section of a data file read
by the :doc:`read_data <read_data>` command.
Note that using an :doc:`angle_coeff <angle_coeff>` command can override a previous setting
for the same angle type. For example, these commands set the coeffs
for all angle types, then overwrite the coeffs for just angle type 2:
For numeric values only, a wild-card asterisk can be used to set the
coefficients for multiple angle types. This takes the form "\*" or
"\*n" or "n\*" or "m\*n". If :math:`N` is the number of angle types,
then an asterisk with no numeric values means all types from 1 to
:math:`N`. A leading asterisk means all types from 1 to n (inclusive).
A trailing asterisk means all types from n to :math:`N` (inclusive). A
middle asterisk means all types from m to n (inclusive).
Note that using an :doc:`angle_coeff <angle_coeff>` command can
override a previous setting for the same angle type. For example,
these commands set the coeffs for all angle types, then overwrite the
coeffs for just angle type 2:
.. code-block:: LAMMPS
@ -49,11 +58,11 @@ for all angle types, then overwrite the coeffs for just angle type 2:
angle_coeff 2 50.0 107.0
A line in a data file that specifies angle coefficients uses the exact
same format as the arguments of the :doc:`angle_coeff <angle_coeff>` command in an input
script, except that wild-card asterisks should not be used since
coefficients for all N types must be listed in the file. For example,
under the "Angle Coeffs" section of a data file, the line that
corresponds to the first example above would be listed as
same format as the arguments of the :doc:`angle_coeff <angle_coeff>`
command in an input script, except that wild-card asterisks should not
be used since coefficients for all :math:`N` types must be listed in the
file. For example, under the "Angle Coeffs" section of a data file, the
line that corresponds to the first example above would be listed as
.. parsed-literal::
@ -61,15 +70,14 @@ corresponds to the first example above would be listed as
The :doc:`angle_style class2 <angle_class2>` is an exception to this
rule, in that an additional argument is used in the input script to
allow specification of the cross-term coefficients. See its
doc page for details.
allow specification of the cross-term coefficients. See its doc page
for details.
----------
The list of all angle styles defined in LAMMPS is given on the
:doc:`angle_style <angle_style>` doc page. They are also listed in more
compact form on the :ref:`Commands angle <angle>` doc
page.
compact form on the :ref:`Commands angle <angle>` doc page.
On either of those pages, click on the style to display the formula it
computes and its coefficients as specified by the associated

View File

@ -10,7 +10,7 @@ Syntax
bond_coeff N args
* N = bond type (see asterisk form below)
* N = numeric bond type (see asterisk form below), or type label
* args = coefficients for one or more bond types
Examples
@ -21,7 +21,10 @@ Examples
bond_coeff 5 80.0 1.2
bond_coeff * 30.0 1.5 1.0 1.0
bond_coeff 1*4 30.0 1.5 1.0 1.0
bond_coeff 1 harmonic 200.0 1.0
bond_coeff 1 harmonic 200.0 1.0 (for bond_style hybrid)
labelmap bond 5 carbonyl
bond_coeff carbonyl 80.0 1.2
Description
"""""""""""
@ -31,14 +34,19 @@ The number and meaning of the coefficients depends on the bond style.
Bond coefficients can also be set in the data file read by the
:doc:`read_data <read_data>` command or in a restart file.
N can be specified in one of two ways. An explicit numeric value can
be used, as in the first example above. Or a wild-card asterisk can be
used to set the coefficients for multiple bond types. This takes the
form "\*" or "\*n" or "n\*" or "m\*n". If N = the number of bond types,
then an asterisk with no numeric values means all types from 1 to N. A
:math:`N` can be specified in one of several ways. An explicit numeric
value can be used, as in the first example above. Or :math:`N` can be a
type label, which is an alphanumeric string defined by the
:doc:`labelmap <labelmap>` command or in a section of a data file read
by the :doc:`read_data <read_data>` command.
For numeric values only, a wild-card asterisk can be used to set the
coefficients for multiple bond types. This takes the form "\*" or "\*n"
or "n\*" or "m\*n". If :math:`N` is the number of bond types, then an
asterisk with no numeric values means all types from 1 to :math:`N`. A
leading asterisk means all types from 1 to n (inclusive). A trailing
asterisk means all types from n to N (inclusive). A middle asterisk
means all types from m to n (inclusive).
asterisk means all types from n to :math:`N` (inclusive). A middle
asterisk means all types from m to n (inclusive).
Note that using a bond_coeff command can override a previous setting
for the same bond type. For example, these commands set the coeffs
@ -52,8 +60,8 @@ for all bond types, then overwrite the coeffs for just bond type 2:
A line in a data file that specifies bond coefficients uses the exact
same format as the arguments of the bond_coeff command in an input
script, except that wild-card asterisks should not be used since
coefficients for all N types must be listed in the file. For example,
under the "Bond Coeffs" section of a data file, the line that
coefficients for all :math:`N` types must be listed in the file. For
example, under the "Bond Coeffs" section of a data file, the line that
corresponds to the first example above would be listed as
.. parsed-literal::

View File

@ -56,6 +56,7 @@ Commands
kspace_modify
kspace_style
label
labelmap
lattice
log
mass

View File

@ -10,7 +10,7 @@ Syntax
dihedral_coeff N args
* N = dihedral type (see asterisk form below)
* N = numeric dihedral type (see asterisk form below) or alphanumeric type label
* args = coefficients for one or more dihedral types
Examples
@ -22,26 +22,35 @@ Examples
dihedral_coeff * 80.0 1 3 0.5
dihedral_coeff 2* 80.0 1 3 0.5
labelmap dihedral 1 backbone
dihedral_coeff backbone 80.0 1 3
Description
"""""""""""
Specify the dihedral force field coefficients for one or more dihedral types.
The number and meaning of the coefficients depends on the dihedral style.
Dihedral coefficients can also be set in the data file read by the
:doc:`read_data <read_data>` command or in a restart file.
Specify the dihedral force field coefficients for one or more dihedral
types. The number and meaning of the coefficients depends on the
dihedral style. Dihedral coefficients can also be set in the data file
read by the :doc:`read_data <read_data>` command or in a restart file.
N can be specified in one of two ways. An explicit numeric value can
be used, as in the first example above. Or a wild-card asterisk can be
used to set the coefficients for multiple dihedral types. This takes the
form "\*" or "\*n" or "m\*" or "m\*n". If :math:`N` is the number of dihedral
types, then an asterisk with no numeric values means all types from 1 to
:math:`N`. A leading asterisk means all types from 1 to n (inclusive). A
trailing asterisk means all types from m to N (inclusive). A middle asterisk
means all types from m to n (inclusive).
:math:`N` can be specified in one of two ways. An explicit numeric
value can be used, as in the first example above. Or :math:`N` can be
an alphanumeric type label, which is a string defined by the
:doc:`labelmap <labelmap>` command or in a corresponding section of a
data file read by the :doc:`read_data <read_data>` command.
For numeric values only, a wild-card asterisk can be used to set the
coefficients for multiple dihedral types. This takes the form "\*" or
"\*n" or "n\*" or "m\*n". If :math:`N` is the number of dihedral types,
then an asterisk with no numeric values means all types from 1 to
:math:`N`. A leading asterisk means all types from 1 to n (inclusive).
A trailing asterisk means all types from n to :math:`N` (inclusive). A
middle asterisk means all types from m to n (inclusive).
Note that using a dihedral_coeff command can override a previous setting
for the same dihedral type. For example, these commands set the coeffs
for all dihedral types, then overwrite the coeffs for just dihedral type 2:
for all dihedral types, then overwrite the coeffs for just dihedral type
2:
.. code-block:: LAMMPS

View File

@ -125,13 +125,14 @@ LAMMPS atom type corresponds to. This is specified by the atomic
number of the element, e.g. 13 for Al. An atomic number must be
specified for each of the ntypes LAMMPS atom types. Ntypes is
typically specified via the create_box command or in the data file
read by the read_data command. If this keyword is not specified, then
this fix will send the LAMMPS atom type for each atom to the MDI
engine. If both the LAMMPS driver and the MDI engine are initialized
so that atom type values are consistent in both codes, then the
*elements* keyword is not needed. Otherwise the keyword can be used
to insure the two codes are consistent in their definition of atomic
species.
read by the read_data command.
If this keyword is specified, then this fix will send the MDI
">ELEMENTS" command to the engine, to insure the two codes are
consistent in their definition of atomic species. If this keyword is
not specified, then this fix will send the MDI >TYPES command to the
engine. This is fine if both the LAMMPS driver and the MDI engine are
initialized so that the atom type values are consistent in both codes.
----------

View File

@ -10,7 +10,7 @@ Syntax
improper_coeff N args
* N = improper type (see asterisk form below)
* N = numeric improper type (see asterisk form below), or type label
* args = coefficients for one or more improper types
Examples
@ -22,27 +22,34 @@ Examples
improper_coeff * 80.2 -1 2
improper_coeff *4 80.2 -1 2
labelmap improper 1 benzene
improper_coeff benzene 300.0 0.0
Description
"""""""""""
Specify the improper force field coefficients for one or more improper
types. The number and meaning of the coefficients depends on the
improper style. Improper coefficients can also be set in the data
file read by the :doc:`read_data <read_data>` command or in a restart
file.
improper style. Improper coefficients can also be set in the data file
read by the :doc:`read_data <read_data>` command or in a restart file.
N can be specified in one of two ways. An explicit numeric value can
be used, as in the first example above. Or a wild-card asterisk can be
used to set the coefficients for multiple improper types. This takes
the form "\*" or "\*n" or "n\*" or "m\*n". If N = the number of improper
types, then an asterisk with no numeric values means all types from 1
to N. A leading asterisk means all types from 1 to n (inclusive). A
trailing asterisk means all types from n to N (inclusive). A middle
asterisk means all types from m to n (inclusive).
:math:`N` can be specified in one of two ways. An explicit numeric
value can be used, as in the first example above. Or :math:`N` can be a
type label, which is an alphanumeric string defined by the
:doc:`labelmap <labelmap>` command or in a section of a data file read
by the :doc:`read_data <read_data>` command.
For numeric values only, a wild-card asterisk can be used to set the
coefficients for multiple improper types. This takes the form "\*" or
"\*n" or "n\*" or "m\*n". If :math:`N` = the number of improper types,
then an asterisk with no numeric values means all types from 1 to
:math:`N`. A leading asterisk means all types from 1 to n (inclusive).
A trailing asterisk means all types from n to :math:`N` (inclusive). A
middle asterisk means all types from m to n (inclusive).
Note that using an improper_coeff command can override a previous
setting for the same improper type. For example, these commands set
the coeffs for all improper types, then overwrite the coeffs for just
setting for the same improper type. For example, these commands set the
coeffs for all improper types, then overwrite the coeffs for just
improper type 2:
.. code-block:: LAMMPS
@ -53,9 +60,9 @@ improper type 2:
A line in a data file that specifies improper coefficients uses the
exact same format as the arguments of the improper_coeff command in an
input script, except that wild-card asterisks should not be used since
coefficients for all N types must be listed in the file. For example,
under the "Improper Coeffs" section of a data file, the line that
corresponds to the first example above would be listed as
coefficients for all :math:`N` types must be listed in the file. For
example, under the "Improper Coeffs" section of a data file, the line
that corresponds to the first example above would be listed as
.. parsed-literal::

98
doc/src/labelmap.rst Normal file
View File

@ -0,0 +1,98 @@
.. index:: labelmap
labelmap command
==================
Syntax
""""""
.. code-block:: LAMMPS
labelmap option args
* *option* = *atom* or *bond* or *angle* or *dihedral* or *improper* or *clear* or *write*
.. parsed-literal::
*clear* = no args
*write* arg = filename
*atom* or *bond* or *angle* or *dihedral* or *improper*
args = list of one or more numeric-type/type-label pairs
Examples
""""""""
.. code-block:: LAMMPS
labelmap atom 3 carbon 4 'c3"' 5 "c1'" 6 "c#"
labelmap bond 1 carbonyl 2 nitrile 3 """ c1'-c2" """
labelmap atom $(label2type(atom,carbon)) C # change type label from 'carbon' to 'C'
labelmap clear
labelmap write mymap.include
Description
"""""""""""
.. versionadded:: TBD
Define alphanumeric type labels to associate with one or more numeric
atom, bond, angle, dihedral or improper types. A collection of type
labels for all atom types, bond types, etc. is stored as a label map.
The label map can also be defined by the :doc:`read_data <read_data>`
command when it reads these sections in a data file: Atom Type Labels,
Bond Type Labels, etc. See the :doc:`Howto type labels
<Howto_type_labels>` doc page for a general discussion of how type
labels can be used.
Valid type labels can contain any alphanumeric character, but must not
start with a number, a '#', or a '*' character. They can contain other
standard ASCII characters such as angular or square brackets '<' and '>'
or '[' and ']', parenthesis '(' and ')', dash '-', underscore '_', plus
'+' and equals '=' signs and more. They must not contain blanks or any
other whitespace. Note that type labels must be put in single or double
quotation marks if they contain the '#' character or if they contain a
double (") or single quotation mark ('). If the label contains both
a single and a double quotation mark, then triple quotation (""") must
be used. When enclosing a type label with quotation marks, the
LAMMPS input parser may require adding leading or trailing blanks
around the type label so it can identify the enclosing quotation
marks. Those blanks will be removed when defining the label.
A *labelmap* command can only modify the label map for one type-kind
(atom types, bond types, etc). Any number of numeric-type/type-label
pairs may follow. If a type label already exists for the same numeric
type, it will be overwritten. Type labels must be unique; assigning the
same type label to multiple numeric types within the same type-kind is
not allowed. When reading and writing data files, it is required that
there is a label defined for *every* numeric type within a given
type-kind in order to write out the type label section for that
type-kind.
The *clear* option resets the labelmap and thus discards all previous
settings.
The *write* option takes a filename as argument and writes the current
label mappings to a file as labelmap commands, so the file can be copied
into a new LAMMPS input file or read in using the :doc:`include
<include>` command.
----------
Restrictions
""""""""""""
This command must come after the simulation box is defined by a
:doc:`read_data <read_data>`, :doc:`read_restart <read_restart>`, or
:doc:`create_box <create_box>` command.
Related commands
""""""""""""""""
:doc:`read_data <read_data>`, :doc:`write_data <write_data>`,
:doc:`molecule <molecule>`, :doc:`fix bond/react <fix_bond_react>`
Default
"""""""
none

View File

@ -10,7 +10,7 @@ Syntax
mass I value
* I = atom type (see asterisk form below)
* I = atom type (see asterisk form below), or type label
* value = mass
Examples
@ -22,6 +22,9 @@ Examples
mass * 62.5
mass 2* 62.5
labelmap atom 1 C
mass C 12.01
Description
"""""""""""
@ -30,12 +33,16 @@ values can also be set in the :doc:`read_data <read_data>` data file
using the "Masses" keyword. See the :doc:`units <units>` command for
what mass units to use.
The I index can be specified in one of two ways. An explicit numeric
value can be used, as in the first example above. Or a wild-card
asterisk can be used to set the mass for multiple atom types. This
takes the form "\*" or "\*n" or "n\*" or "m\*n". If N = the number of
atom types, then an asterisk with no numeric values means all types
from 1 to N. A leading asterisk means all types from 1 to n
The I index can be specified in one of several ways. An explicit
numeric value can be used, as in the first example above. Or I can be
a type label, which is an alphanumeric string defined by the
:doc:`labelmap <labelmap>` command or in a section of a data file read
by the :doc:`read_data <read_data>` command, and which converts
internally to a numeric type. Or a wild-card asterisk can be used to
set the mass for multiple atom types. This takes the form "\*" or
"\*n" or "n\*" or "m\*n", where m and n are numbers. If N = the
number of atom types, then an asterisk with no numeric values means
all types from 1 to N. A leading asterisk means all types from 1 to n
(inclusive). A trailing asterisk means all types from n to N
(inclusive). A middle asterisk means all types from m to n
(inclusive).

View File

@ -14,7 +14,7 @@ Syntax
.. parsed-literal::
*engine* args = zero or more keyword arg pairs
*engine* args = zero or more keyword/args pairs
keywords = *elements*
*elements* args = N_1 N_2 ... N_ntypes
N_1,N_2,...N_ntypes = atomic number for each of ntypes LAMMPS atom types
@ -24,7 +24,7 @@ Syntax
keywords = *mdi* or *infile* or *extra* or *command*
*mdi* value = args passed to MDI for driver to operate with plugins (required)
*infile* value = filename the engine will read at start-up (optional)
*extra* value = aditional command-line args to pass to engine library when loaded
*extra* value = aditional command-line args to pass to engine library when loaded (optional)
*command* value = a LAMMPS input script command to execute (required)
*connect* args = none
*exit* args = none
@ -289,11 +289,11 @@ are required. The -name setting can be anything you choose. MDI
drivers and engines can query their names to verify they are values
they expect.
The *infile* keyword is also required. It is the name of an input
script which the engine will open and process. MDI will pass it as a
The *infile* keyword is optional. It sets the name of an input script
which the engine will open and process. MDI will pass it as a
command-line argument to the library when it is launched. The file
typically contains settings that an MD or QM code will use for its
subsequent calculations.
calculations.
The *extra* keyword is optional. It contains additional command-line
arguments which MDI will pass to the library when it is launched.
@ -309,12 +309,12 @@ could specify a filename with multiple LAMMPS commands.
.. note::
When the single *command* is complete, LAMMPS will send an MDI
EXIT command to the plugin engine and the plugin will be removed.
The "mdi plugin" command will then exit and the next command
(if any) in the LAMMPS input script will be processed. A subsequent
"mdi plugin" command could then load the same library plugin or
a different one if desired.
When the *command* is complete, LAMMPS will send an MDI EXIT
command to the plugin engine and the plugin will be removed. The
"mdi plugin" command will then exit and the next command (if any)
in the LAMMPS input script will be processed. A subsequent "mdi
plugin" command could then load the same or a different MDI
plugin if desired.
----------

View File

@ -70,8 +70,9 @@ and underscores.
A single template can contain multiple molecules, listed one per file.
Some of the commands listed above currently use only the first
molecule in the template, and will issue a warning if the template
contains multiple molecules. The :doc:`atom_style template <atom_style>` command allows multiple-molecule templates
to define a system with more than one templated molecule.
contains multiple molecules. The :doc:`atom_style template
<atom_style>` command allows multiple-molecule templates to define a
system with more than one templated molecule.
Each filename can be followed by optional keywords which are applied
only to the molecule in the file as used in this template. This is to
@ -88,6 +89,12 @@ molecule file. E.g. if *toff* = 2, and the file uses atom types
individual values will be ignored if the molecule template does not
use that attribute (e.g. no bonds).
.. note::
Offsets are **ignored** on lines using type labels, as the type
labels will determine the actual types directly depending on the
current :doc:`labelmap <labelmap>` settings.
The *scale* keyword scales the size of the molecule. This can be
useful for modeling polydisperse granular rigid bodies. The scale
factor is applied to each of these properties in the molecule file, if
@ -118,14 +125,18 @@ The format of an individual molecule file is similar but
(not identical) to the data file read by the :doc:`read_data <read_data>`
commands, and is as follows.
A molecule file has a header and a body. The header appears first.
The first line of the header is always skipped; it typically contains
a description of the file. Then lines are read one at a time. Lines
can have a trailing comment starting with '#' that is ignored. If the
line is blank (only white-space after comment is deleted), it is
A molecule file has a header and a body. The header appears first. The
first line of the header and thus of the molecule file is *always* skipped;
it typically contains a description of the file or a comment from the software
that created the file.
Then lines are read one line at a time. Lines can have a trailing
comment starting with '#' that is ignored. There *must* be at least one
blank between any valid content and the comment. If the line is blank
(i.e. contains only white-space after comments are deleted), it is
skipped. If the line contains a header keyword, the corresponding
value(s) is read from the line. If it does not contain a header
keyword, the line begins the body of the file.
value(s) is/are read from the line. A line that is *not* blank and does
*not* contains a header keyword begins the body of the file.
The body of the file contains zero or more sections. The first line
of a section has only a keyword. The next line is skipped. The
@ -173,31 +184,43 @@ These are the allowed section keywords for the body of the file.
* *Special Bond Counts, Special Bonds* = special neighbor info
* *Shake Flags, Shake Atoms, Shake Bond Types* = SHAKE info
For the Types, Bonds, Angles, Dihedrals, and Impropers sections, each
atom/bond/angle/etc type can be specified either as a number (numeric
type) or as an alphanumeric type label. The latter is only allowed if
type labels have been defined, either by the :doc:`labelmap
<labelmap>` command or in data files read by the :doc:`read_data
<read_data>` command which have sections for Atom Type Labels, Bond
Type Labels, Angle Type Labels, etc. See the :doc:`Howto type labels
<Howto_type_labels>` doc page for the allowed syntax of type labels
and a general discussion of how type labels can be used.
When using type labels, any values specified as *offset* are ignored.
If a Bonds section is specified then the Special Bond Counts and
Special Bonds sections can also be used, if desired, to explicitly
list the 1-2, 1-3, 1-4 neighbors within the molecule topology (see
details below). This is optional since if these sections are not
included, LAMMPS will auto-generate this information. Note that
LAMMPS uses this info to properly exclude or weight bonded pairwise
interactions between bonded atoms. See the
:doc:`special_bonds <special_bonds>` command for more details. One
reason to list the special bond info explicitly is for the
:doc:`thermalized Drude oscillator model <Howto_drude>` which treats the
bonds between nuclear cores and Drude electrons in a different manner.
interactions between bonded atoms. See the :doc:`special_bonds
<special_bonds>` command for more details. One reason to list the
special bond info explicitly is for the :doc:`thermalized Drude
oscillator model <Howto_drude>` which treats the bonds between nuclear
cores and Drude electrons in a different manner.
.. note::
Whether a section is required depends on how the molecule
template is used by other LAMMPS commands. For example, to add a
molecule via the :doc:`fix deposit <fix_deposit>` command, the Coords
and Types sections are required. To add a rigid body via the :doc:`fix pour <fix_pour>` command, the Bonds (Angles, etc) sections are not
Whether a section is required depends on how the molecule template
is used by other LAMMPS commands. For example, to add a molecule
via the :doc:`fix deposit <fix_deposit>` command, the Coords and
Types sections are required. To add a rigid body via the :doc:`fix
pour <fix_pour>` command, the Bonds (Angles, etc) sections are not
required, since the molecule will be treated as a rigid body. Some
sections are optional. For example, the :doc:`fix pour <fix_pour>`
command can be used to add "molecules" which are clusters of
finite-size granular particles. If the Diameters section is not
specified, each particle in the molecule will have a default diameter
of 1.0. See the doc pages for LAMMPS commands that use molecule
templates for more details.
specified, each particle in the molecule will have a default
diameter of 1.0. See the doc pages for LAMMPS commands that use
molecule templates for more details.
Each section is listed below in alphabetic order. The format of each
section is described including the number of lines it must contain and
@ -222,7 +245,7 @@ order.
* one line per atom
* line syntax: ID type
* type = atom type of atom
* type = atom type of atom (1-Natomtype, or type label)
----------
@ -289,7 +312,7 @@ included, the default mass for each atom is derived from its volume
* one line per bond
* line syntax: ID type atom1 atom2
* type = bond type (1-Nbondtype)
* type = bond type (1-Nbondtype, or type label)
* atom1,atom2 = IDs of atoms in bond
The IDs for the two atoms in each bond should be values
@ -301,7 +324,7 @@ from 1 to Natoms, where Natoms = # of atoms in the molecule.
* one line per angle
* line syntax: ID type atom1 atom2 atom3
* type = angle type (1-Nangletype)
* type = angle type (1-Nangletype, or type label)
* atom1,atom2,atom3 = IDs of atoms in angle
The IDs for the three atoms in each angle should be values from 1 to
@ -315,7 +338,7 @@ which the angle is computed) is the atom2 in the list.
* one line per dihedral
* line syntax: ID type atom1 atom2 atom3 atom4
* type = dihedral type (1-Ndihedraltype)
* type = dihedral type (1-Ndihedraltype, or type label)
* atom1,atom2,atom3,atom4 = IDs of atoms in dihedral
The IDs for the four atoms in each dihedral should be values from 1 to
@ -328,7 +351,7 @@ ordered linearly within the dihedral.
* one line per improper
* line syntax: ID type atom1 atom2 atom3 atom4
* type = improper type (1-Nimpropertype)
* type = improper type (1-Nimpropertype, or type label)
* atom1,atom2,atom3,atom4 = IDs of atoms in improper
The IDs for the four atoms in each improper should be values from 1 to
@ -447,11 +470,15 @@ This section is only needed when molecules created using the template
will be constrained by SHAKE via the "fix shake" command. The other
two Shake sections must also appear in the file.
The a,b,c values are bond types (from 1 to Nbondtypes) for all bonds
in the SHAKE cluster that this atom belongs to. The number of values
that must appear is determined by the shake flag for the atom (see the
Shake Flags section above). All atoms in a particular cluster should
list their a,b,c values identically.
The a,b,c values are bond types for all bonds in the SHAKE cluster that
this atom belongs to. Bond types may be either numbers (from 1 to Nbondtypes)
or bond type labels as defined by the :doc:`labelmap <labelmap>` command
or a "Bond Type Labels" section of a data file.
The number of values that must appear is determined by the shake flag
for the atom (see the Shake Flags section above). All atoms in a
particular cluster should list their a,b,c values identically.
If flag = 0, no a,b,c values are listed on the line, just the
(ignored) ID.
@ -459,8 +486,9 @@ If flag = 0, no a,b,c values are listed on the line, just the
If flag = 1, a,b,c are listed, where a = bondtype of the bond between
the central atom and the first non-central atom (value b in the Shake
Atoms section), b = bondtype of the bond between the central atom and
the second non-central atom (value c in the Shake Atoms section), and c =
the angle type (1 to Nangletypes) of the angle between the 3 atoms.
the second non-central atom (value c in the Shake Atoms section), and c
= the angle type (1 to Nangletypes, or angle type label) of the angle
between the 3 atoms.
If flag = 2, only a is listed, where a = bondtype of the bond between
the 2 atoms in the cluster.
@ -473,9 +501,9 @@ and the second non-central atom (value c in the Shake Atoms section).
If flag = 4, a,b,c are listed, where a = bondtype of the bond between
the central atom and the first non-central atom (value b in the Shake
Atoms section), b = bondtype of the bond between the central atom and
the second non-central atom (value c in the Shake Atoms section), and c =
bondtype of the bond between the central atom and the third non-central
atom (value d in the Shake Atoms section).
the second non-central atom (value c in the Shake Atoms section), and c
= bondtype of the bond between the central atom and the third
non-central atom (value d in the Shake Atoms section).
See the :doc:`fix shake <fix_shake>` page for a further description
of SHAKE clusters.

View File

@ -10,7 +10,7 @@ Syntax
pair_coeff I J args
* I,J = atom types (see asterisk form below)
* I,J = numeric atom types (see asterisk form below), or type labels
* args = coefficients for one or more pairs of atom types
Examples
@ -26,6 +26,10 @@ Examples
pair_coeff * 3 morse.table ENTRY1
pair_coeff 1 2 lj/cut 1.0 1.0 2.5 # (for pair_style hybrid)
labelmap atom 1 C
labelmap atom 2 H
pair_coeff C H 1.0 1.0 2.5
Description
"""""""""""
@ -34,20 +38,27 @@ atom types. The number and meaning of the coefficients depends on the
pair style. Pair coefficients can also be set in the data file read
by the :doc:`read_data <read_data>` command or in a restart file.
I and J can be specified in one of two ways. Explicit numeric values
can be used for each, as in the first example above. I <= J is
required. LAMMPS sets the coefficients for the symmetric J,I
interaction to the same values.
I and J can be specified in one of several ways. Explicit numeric
values can be used for each, as in the first example above. Or, one
or both of the types in the I,J pair can be a type label, which is an
alphanumeric string defined by the :doc:`labelmap <labelmap>` command
or in a section of a data file read by the :doc:`read_data
<read_data>` command, and which converts internally to a numeric type.
Internally, LAMMPS will set coefficients for the symmetric J,I
interaction to the same values as the I,J interaction.
A wildcard asterisk can be used in place of or in conjunction with the
I,J arguments to set the coefficients for multiple pairs of atom
types. This takes the form "\*" or "\*n" or "n\*" or "m\*n". If N = the
number of atom types, then an asterisk with no numeric values means all
types from 1 to N. A leading asterisk means all types from 1 to n
(inclusive). A trailing asterisk means all types from n to N
(inclusive). A middle asterisk means all types from m to n
(inclusive). Note that only type pairs with I <= J are considered; if
asterisks imply type pairs where J < I, they are ignored.
For numeric values only, a wildcard asterisk can be used in place of or
in conjunction with the I,J arguments to set the coefficients for
multiple pairs of atom types. This takes the form "\*" or "\*n" or
"n\*" or "m\*n". If :math:`N` is the number of atom types, then an
asterisk with no numeric values means all types from 1 to :math:`N`. A
leading asterisk means all types from 1 to n (inclusive). A trailing
asterisk means all types from n to :math:`N` (inclusive). A middle
asterisk means all types from m to n (inclusive). For the asterisk
syntax, only type pairs with I <= J are considered; if asterisks imply
type pairs where J < I, they are ignored. Again internally, LAMMPS will
set the coefficients for the symmetric J,I interactions to the same
values as the I <= J interactions.
Note that a pair_coeff command can override a previous setting for the
same I,J pair. For example, these commands set the coeffs for all I,J
@ -63,11 +74,11 @@ same format as the arguments of the pair_coeff command in an input
script, with the exception of the I,J type arguments. In each line of
the "Pair Coeffs" section of a data file, only a single type I is
specified, which sets the coefficients for type I interacting with
type I. This is because the section has exactly N lines, where N =
the number of atom types. For this reason, the wild-card asterisk
should also not be used as part of the I argument. Thus in a data
file, the line corresponding to the first example above would be listed
as
type I. This is because the section has exactly :math:`N` lines, where
:math:`N` is the number of atom types. For this reason, the wild-card
asterisk should also not be used as part of the I argument. Thus in a
data file, the line corresponding to the first example above would be
listed as
.. parsed-literal::

View File

@ -164,6 +164,12 @@ other types already exist. All five offset values must be specified,
but individual values will be ignored if the data file does not use
that attribute (e.g. no bonds).
.. note::
Offsets are **ignored** on lines using type labels, as the type
labels will determine the actual types directly depending on the
current :doc:`labelmap <labelmap>` settings.
The *shift* keyword can be used to specify an (Sx, Sy, Sz)
displacement applied to the coordinates of each atom. Sz must be 0.0
for a 2d simulation. This is a mechanism for adding structured
@ -227,22 +233,27 @@ The file will be read line by line, but there is a limit of 254
characters per line and characters beyond that limit will be ignored.
A data file has a header and a body. The header appears first. The
first line of the header is always skipped; it typically contains a
description of the file. Then lines are read one at a time. Lines
can have a trailing comment starting with '#' that is ignored. If the
line is blank (only white-space after comment is deleted), it is
skipped. If the line contains a header keyword, the corresponding
value(s) is read from the line. If it does not contain a header
keyword, the line begins the body of the file.
first line of the header and thus of the data file is *always* skipped;
it typically contains a description of the file or a comment from the
software that created the file.
The body of the file contains zero or more sections. The first line
of a section has only a keyword. This line can have a trailing
comment starting with '#' that is either ignored or can be used to
check for a style match, as described below. The next line is
skipped. The remaining lines of the section contain values. The
number of lines depends on the section keyword as described below.
Zero or more blank lines can be used between sections. Sections can
appear in any order, with a few exceptions as noted below.
Then lines are read one line at a time. Lines can have a trailing
comment starting with '#' that is ignored. There *must* be at least one
blank between any valid content and the comment. If a line is blank
(i.e. contains only white-space after comments are deleted), it is
skipped. If the line contains a header keyword, the corresponding
value(s) is/are read from the line. A line that is *not* blank and does
*not* contain a header keyword begins the body of the file.
The body of the file contains zero or more sections. The first line of
a section has only a keyword. This line can have a trailing comment
starting with '#' that is either ignored or can be used to check for a
style match, as described below. There must be a blank between the
keyword and any comment. The *next* line is *always* skipped. The
remaining lines of the section contain values. The number of lines
depends on the section keyword as described below. Zero or more blank
lines can be used *between* sections. Sections can appear in any order,
with a few exceptions as noted below.
The keyword *fix* can be used one or more times. Each usage specifies
a fix that will be used to process a specific portion of the data
@ -477,6 +488,7 @@ These are the section keywords for the body of the file.
* *Atoms, Velocities, Masses, Ellipsoids, Lines, Triangles, Bodies* = atom-property sections
* *Bonds, Angles, Dihedrals, Impropers* = molecular topology sections
* *Atom Type Labels, Bond Type Labels, Angle Type Labels, Dihedral Type Labels, Improper Type Labels* = type label maps
* *Pair Coeffs, PairIJ Coeffs, Bond Coeffs, Angle Coeffs, Dihedral Coeffs, Improper Coeffs* = force field sections
* *BondBond Coeffs, BondAngle Coeffs, MiddleBondTorsion Coeffs, EndBondTorsion Coeffs, AngleTorsion Coeffs, AngleAngleTorsion Coeffs, BondBond13 Coeffs, AngleAngle Coeffs* = class 2 force field sections
@ -503,7 +515,8 @@ section is described including the number of lines it must contain and
rules (if any) for where it can appear in the data file.
Any individual line in the various sections can have a trailing
comment starting with "#" for annotation purposes. E.g. in the
comment starting with "#" for annotation purposes. There must be at least
one blank between valid content and the comment. E.g. in the
Atoms section:
.. parsed-literal::
@ -536,6 +549,26 @@ input script.
----------
*Angle Type Labels* section:
* one line per angle type
* line syntax: ID label
.. parsed-literal::
ID = angle type (1-N)
label = alphanumeric type label
Define alphanumeric type labels for each numeric angle type. These
can be used in the Angles section in place of a numeric type, but only
if the this section appears before the Angles section.
See the :doc:`Howto type labels <Howto_type_labels>` doc page for the
allowed syntax of type labels and a general discussion of how type
labels can be used.
----------
*AngleAngle Coeffs* section:
* one line per improper type
@ -568,7 +601,7 @@ input script.
.. parsed-literal::
ID = number of angle (1-Nangles)
type = angle type (1-Nangletype)
type = angle type (1-Nangletype, or type label)
atom1,atom2,atom3 = IDs of 1st,2nd,3rd atom in angle
example:
@ -580,8 +613,15 @@ example:
The 3 atoms are ordered linearly within the angle. Thus the central
atom (around which the angle is computed) is the atom2 in the list.
E.g. H,O,H for a water molecule. The *Angles* section must appear
after the *Atoms* section. All values in this section must be
integers (1, not 1.0).
after the *Atoms* section.
All values in this section must be integers (1, not 1.0). However,
the type can be a numeric value or an alphanumeric label. The latter
is only allowed if the type label has been defined by the
:doc:`labelmap <labelmap>` command or an Angle Type Labels section
earlier in the data file. See the :doc:`Howto type labels
<Howto_type_labels>` doc page for the allowed syntax of type labels
and a general discussion of how type labels can be used.
----------
@ -597,6 +637,26 @@ integers (1, not 1.0).
----------
*Atom Type Labels* section:
* one line per atom type
* line syntax: ID label
.. parsed-literal::
ID = numeric atom type (1-N)
label = alphanumeric type label
Define alphanumeric type labels for each numeric atom type. These
can be used in the Atoms section in place of a numeric type, but only
if the Atom Type Labels section appears before the Atoms section.
See the :doc:`Howto type labels <Howto_type_labels>` doc page for the
allowed syntax of type labels and a general discussion of how type
labels can be used.
----------
*Atoms* section:
* one line per atom
@ -670,7 +730,7 @@ of analysis.
The per-atom values have these meanings and units, listed alphabetically:
* atom-ID = integer ID of atom
* atom-type = type of atom (1-Ntype)
* atom-type = type of atom (1-Ntype, or type label)
* bodyflag = 1 for body particles, 0 for point particles
* bond_nt = bond NT factor for MESONT particles (?? units)
* buckling = buckling factor for MESONT particles (?? units)
@ -722,6 +782,13 @@ not used (e.g. an atomic system with no bonds), and you don't care if
unique atom IDs appear in dump files, then the atom-IDs can all be set
to 0.
The atom-type can be a numeric value or an alphanumeric label. The
latter is only allowed if the type label has been defined by the
:doc:`labelmap <labelmap>` command or an Atom Type Labels section
earlier in the data file. See the :doc:`Howto type labels
<Howto_type_labels>` doc page for the allowed syntax of type labels
and a general discussion of how type labels can be used.
The molecule ID is a second identifier attached to an atom. Normally, it
is a number from 1 to N, identifying which molecule the atom belongs
to. It can be 0 if it is a non-bonded atom or if you don't care to
@ -932,6 +999,26 @@ script.
----------
*Bond Type Labels* section:
* one line per bond type
* line syntax: ID label
.. parsed-literal::
ID = bond type (1-N)
label = alphanumeric type label
Define alphanumeric type labels for each numeric bond type. These can
be used in the Bonds section in place of a numeric type, but only if
the this section appears before the Angles section.
See the :doc:`Howto type labels <Howto_type_labels>` doc page for the
allowed syntax of type labels and a general discussion of how type
labels can be used.
----------
*BondAngle Coeffs* section:
* one line per angle type
@ -976,7 +1063,7 @@ script.
.. parsed-literal::
ID = bond number (1-Nbonds)
type = bond type (1-Nbondtype)
type = bond type (1-Nbondtype, or type label)
atom1,atom2 = IDs of 1st,2nd atom in bond
* example:
@ -985,8 +1072,15 @@ script.
12 3 17 29
The *Bonds* section must appear after the *Atoms* section. All values
in this section must be integers (1, not 1.0).
The *Bonds* section must appear after the *Atoms* section.
All values in this section must be integers (1, not 1.0). However,
the type can be a numeric value or an alphanumeric label. The latter
is only allowed if the type label has been defined by the
:doc:`labelmap <labelmap>` command or a Bond Type Labels section
earlier in the data file. See the :doc:`Howto type labels
<Howto_type_labels>` doc page for the allowed syntax of type labels
and a general discussion of how type labels can be used.
----------
@ -1014,6 +1108,26 @@ Coefficients can also be set via the
----------
*Dihedral Type Labels* section:
* one line per dihedral type
* line syntax: ID label
.. parsed-literal::
ID = dihedral type (1-N)
label = alphanumeric type label
Define alphanumeric type labels for each numeric dihedral type. These
can be used in the Dihedrals section in place of a numeric type, but
only if the this section appears before the Dihedrals section.
See the :doc:`Howto type labels <Howto_type_labels>` doc page for the
allowed syntax of type labels and a general discussion of how type
labels can be used.
----------
*Dihedrals* section:
* one line per dihedral
@ -1022,7 +1136,7 @@ Coefficients can also be set via the
.. parsed-literal::
ID = number of dihedral (1-Ndihedrals)
type = dihedral type (1-Ndihedraltype)
type = dihedral type (1-Ndihedraltype, or type label)
atom1,atom2,atom3,atom4 = IDs of 1st,2nd,3rd,4th atom in dihedral
* example:
@ -1032,8 +1146,15 @@ Coefficients can also be set via the
12 4 17 29 30 21
The 4 atoms are ordered linearly within the dihedral. The *Dihedrals*
section must appear after the *Atoms* section. All values in this
section must be integers (1, not 1.0).
section must appear after the *Atoms* section.
All values in this section must be integers (1, not 1.0). However,
the type can be a numeric value or an alphanumeric label. The latter
is only allowed if the type label has been defined by the
:doc:`labelmap <labelmap>` command or a Dihedral Type Labels section
earlier in the data file. See the :doc:`Howto type labels
<Howto_type_labels>` doc page for the allowed syntax of type labels
and a general discussion of how type labels can be used.
----------
@ -1115,6 +1236,26 @@ Coefficients can also be set via the
----------
*Improper Type Labels* section:
* one line per improper type
* line syntax: ID label
.. parsed-literal::
ID = improper type (1-N)
label = alphanumeric type label
Define alphanumeric type labels for each numeric improper type. These
can be used in the Impropers section in place of a numeric type, but
only if the this section appears before the Impropers section.
See the :doc:`Howto type labels <Howto_type_labels>` doc page for the
allowed syntax of type labels and a general discussion of how type
labels can be used.
----------
*Impropers* section:
* one line per improper
@ -1123,7 +1264,7 @@ Coefficients can also be set via the
.. parsed-literal::
ID = number of improper (1-Nimpropers)
type = improper type (1-Nimpropertype)
type = improper type (1-Nimpropertype, or type label)
atom1,atom2,atom3,atom4 = IDs of 1st,2nd,3rd,4th atom in improper
* example:
@ -1133,11 +1274,19 @@ Coefficients can also be set via the
12 3 17 29 13 100
The ordering of the 4 atoms determines the definition of the improper
angle used in the formula for each :doc:`improper style <improper_style>`. See the doc pages for individual styles
for details.
angle used in the formula for each :doc:`improper style
<improper_style>`. See the doc pages for individual styles for
details.
The *Impropers* section must appear after the *Atoms* section. All
values in this section must be integers (1, not 1.0).
The *Impropers* section must appear after the *Atoms* section.
All values in this section must be integers (1, not 1.0). However,
the type can be a numeric value or an alphanumeric label. The latter
is only allowed if the type label has been defined by the
:doc:`labelmap <labelmap>` command or a Improper Type Labels section
earlier in the data file. See the :doc:`Howto type labels
<Howto_type_labels>` doc page for the allowed syntax of type labels
and a general discussion of how type labels can be used.
----------
@ -1181,7 +1330,7 @@ The *Lines* section must appear after the *Atoms* section.
.. parsed-literal::
ID = atom type (1-N)
ID = atom type (1-N or atom type label)
mass = mass value
* example:
@ -1195,6 +1344,13 @@ This defines the mass of each atom type. This can also be set via the
used for atom styles that define a mass for individual atoms -
e.g. :doc:`atom_style sphere <atom_style>`.
Using type labels instead of atom type numbers is only allowed if the
type label has been defined by the :doc:`labelmap <labelmap>` command or
a Atom Type Labels section earlier in the data file. See the
:doc:`Howto type labels <Howto_type_labels>` doc page for the allowed
syntax of type labels and a general discussion of how type labels can be
used.
----------
*MiddleBondTorsion Coeffs* section:

View File

@ -12,7 +12,7 @@ Syntax
restart N root keyword value ...
restart N file1 file2 keyword value ...
* N = write a restart file every this many timesteps
* N = write a restart file on timesteps which are multipls of N
* N can be a variable (see below)
* root = filename to which timestep # is appended
* file1,file2 = two full filenames, toggle between them when writing file
@ -42,13 +42,14 @@ Description
"""""""""""
Write out a binary restart file with the current state of the
simulation every so many timesteps, in either or both of two modes, as
a run proceeds. A value of 0 means do not write out any restart
files. The two modes are as follows. If one filename is specified, a
series of filenames will be created which include the timestep in the
filename. If two filenames are specified, only 2 restart files will
be created, with those names. LAMMPS will toggle between the 2 names
as it writes successive restart files.
simulation on timesteps which are a multiple of N. A value of N = 0
means do not write out any restart files, which is the default.
Restart files are written in one (or both) of two modes as a run
proceeds. If one filename is specified, a series of filenames will be
created which include the timestep in the filename. If two filenames
are specified, only 2 restart files will be created, with those names.
LAMMPS will toggle between the 2 names as it writes successive restart
files.
Note that you can specify the restart command twice, once with a
single filename and once with two filenames. This would allow you,

View File

@ -66,7 +66,7 @@ Syntax
bound(group,dir,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), slope(x), gmask(x), rmask(x), grmask(x,y), next(x), is_file(name), is_os(name), extract_setting(name)
special functions = sum(x), min(x), max(x), ave(x), trap(x), slope(x), gmask(x), rmask(x), grmask(x,y), next(x), is_file(name), is_os(name), extract_setting(name), label2type(kind,label)
feature functions = is_active(category,feature), is_available(category,feature), is_defined(category,id)
atom value = id[i], mass[i], type[i], mol[i], x[i], y[i], z[i], vx[i], vy[i], vz[i], fx[i], fy[i], fz[i], q[i]
atom vector = id, mass, type, mol, x, y, z, vx, vy, vz, fx, fy, fz, q
@ -505,7 +505,7 @@ references, and references to other variables.
+--------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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), slope(x), gmask(x), rmask(x), grmask(x,y), next(x) |
| Special functions | sum(x), min(x), max(x), ave(x), trap(x), slope(x), gmask(x), rmask(x), grmask(x,y), next(x), label2type(kind,label) |
+--------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Atom values | id[i], mass[i], type[i], mol[i], x[i], y[i], z[i], vx[i], vy[i], vz[i], fx[i], fy[i], fz[i], q[i] |
+--------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@ -962,6 +962,12 @@ types, bond types and so on. For the full list of available keywords
*name* and their meaning, see the documentation for extract_setting()
via the link in this paragraph.
The label2type() function converts type labels into numeric types, using label
maps created by the :doc:`labelmap <labelmap>` or :doc:`read_data <read_data>`
commands. The first argument is the label map kind (atom, bond, angle,
dihedral, or improper) and the second argument is the label. The function
returns the corresponding numeric type.
----------
Feature Functions

View File

@ -12,12 +12,14 @@ Syntax
* file = name of data file to write out
* zero or more keyword/value pairs may be appended
* keyword = *pair* or *nocoeff*
* keyword = *pair* or *nocoeff* or *nofix* or *nolabelmap*
.. parsed-literal::
*nocoeff* = do not write out force field info
*nofix* = do not write out extra sections read by fixes
*nolabelmap* = do not write out type labels
*types* value = *numeric* or *labels*
*pair* value = *ii* or *ij*
*ii* = write one line of pair coefficient info per atom type
*ij* = write one line of pair coefficient info per IJ atom type pair
@ -94,16 +96,39 @@ data file is read.
----------
The *nocoeff* keyword requests that no force field parameters should
be written to the data file. This can be very helpful, if one wants
to make significant changes to the force field or if the parameters
are read in separately anyway, e.g. from an include file.
Use of the *nocoeff* keyword means no force field parameters are
written to the data file. This can be helpful, for example, if you
want to make significant changes to the force field or if the force
field parameters are read in separately, e.g. from an include file.
The *nofix* keyword requests that no extra sections read by fixes
should be written to the data file (see the *fix* option of the
:doc:`read_data <read_data>` command for details). For example, this
option excludes sections for user-created per-atom properties
from :doc:`fix property/atom <fix_property_atom>`.
Use of the *nofix* keyword means no extra sections read by fixes are
written to the data file (see the *fix* option of the :doc:`read_data
<read_data>` command for details). For example, this option excludes
sections for user-created per-atom properties from :doc:`fix
property/atom <fix_property_atom>`.
The *nolabelmap* and *types* keywords refer to type labels that may be
defined for numeric atom types, bond types, angle types, etc. The
label map can be defined in two ways, either by the :doc:`labelmap
<labelmap>` command or in data files read by the :doc:`read_data
<read_data>` command which have sections for Atom Type Labels, Bond
Type Labels, Angle Type Labels, etc. See the :doc:`Howto type labels
<Howto_type_labels>` doc page for the allowed syntax of type labels
and a general discussion of how type labels can be used.
Use of the *nolabelmap* keyword means that even if type labels exist
for a given type-kind (Atoms, Bonds, Angles, etc.), type labels are
not written to the data file. By default, they are written if they
exist. A type label must be defined for every numeric type (within a
given type-kind) to be written to the data file.
The *types* keyword determines how atom types, bond types, angle
types, etc are written into these data file sections: Atoms, Bonds,
Angles, etc. The default is the *numeric* setting, even if type label
maps exist. If the *labels* setting is used, type labels will be
written to the data file, if the corresponding label map exists. Note
that when using *types labels*, the *nolabelmap* keyword cannot be
used.
The *pair* keyword lets you specify in what format the pair
coefficient information is written into the data file. If the value
@ -144,4 +169,4 @@ Related commands
Default
"""""""
The option defaults are pair = ii.
The option defaults are pair = ii and types_style = numeric.

View File

@ -61,6 +61,7 @@ ajs
akohlmey
Aktulga
al
alabel
alain
Alain
Alamos
@ -287,6 +288,7 @@ bitrates
Bitzek
Bjerrum
Bkappa
blabel
Blaise
blanchedalmond
blocksize
@ -750,6 +752,7 @@ dissipative
Dissipative
distharm
dl
dlabel
dlambda
DLAMMPS
dll
@ -1425,6 +1428,7 @@ ijk
ijkl
ik
Ikeshoji
ilabel
Ilie
ilmenau
Ilmenau
@ -1714,6 +1718,8 @@ Kusters
Kutta
Kuznetsov
kx
labelmap
Labelmap
Lachet
Lackmann
Ladd
@ -1937,6 +1943,8 @@ Manolopoulos
manpages
manybody
MANYBODY
mapID
mapIDs
Maras
Marchetti
Marchi
@ -2258,6 +2266,7 @@ natively
Natoli
natoms
Natoms
Natomtype
Nattempt
navajowhite
Navier
@ -3554,6 +3563,7 @@ typeargs
typedefs
typeI
typeJ
typelabel
typeN
typesafe
Tz

View File

@ -13,7 +13,7 @@ Masses
2 1
3 1
Atoms # dielectric: id mol type q x y z normx normy normz area_per_patch ed em epsilon curvature
Atoms # dielectric : id mol type q x y z normx normy normz area_per_patch ed em epsilon curvature
1 0 1 0 0 0 9.99798 0 0 1 0.866 8 6 6 0
2 0 1 0 0.500101 0.866201 9.99798 0 0 1 0.866 8 6 6 0

View File

@ -0,0 +1,24 @@
LAMMPS Description
6 atoms
2 atom types
0.0000000000000000 10.800000000000001 xlo xhi
0.0000000000000000 5.4000000000000004 ylo yhi
0.0000000000000000 5.4000000000000004 zlo zhi
3.3065463576978537E-016 3.3065463576978537E-016 3.3065463576978537E-016 xy xz yz
Masses
1 238.05078125000000
2 15.994915008544922
Atoms
1 1 1 0.0 2.70000 8.10000 0.00000
2 1 2 0.0 1.35000 9.45000 1.35000
3 1 2 0.0 4.05000 9.45000 1.35000
4 1 1 0.0 2.70000 10.80000 2.70000
5 1 2 0.0 1.35000 12.15000 4.05000
6 1 2 0.0 4.05000 12.15000 4.05000

View File

@ -0,0 +1,27 @@
LAMMPS Description
9 atoms
2 atom types
0.0000000000000000 16.199999999999999 xlo xhi
0.0000000000000000 5.4000000000000004 ylo yhi
0.0000000000000000 5.4000000000000004 zlo zhi
3.3065463576978537E-016 3.3065463576978537E-016 3.3065463576978537E-016 xy xz yz
Masses
1 238.05078125000000
2 15.994915008544922
Atoms
1 1 1 0.0 2.70000 8.10000 0.00000
2 1 2 0.0 1.35000 9.45000 1.35000
3 1 2 0.0 4.05000 9.45000 1.35000
4 1 1 0.0 2.70000 10.80000 2.70000
5 1 2 0.0 1.35000 12.15000 4.05000
6 1 2 0.0 4.05000 12.15000 4.05000
7 1 1 0.0 2.70000 13.50000 5.40000
8 1 2 0.0 1.35000 14.85000 6.75000
9 1 2 0.0 4.05000 14.85000 6.75000

View File

@ -0,0 +1,30 @@
LAMMPS Description
12 atoms
2 atom types
0.0000000000000000 10.800000000000001 xlo xhi
0.0000000000000000 10.800000000000001 ylo yhi
0.0000000000000000 5.4000000000000004 zlo zhi
6.6130927153957075E-016 3.3065463576978537E-016 3.3065463576978537E-016 xy xz yz
Masses
1 238.05078125000000
2 15.994915008544922
Atoms
1 1 1 0.0 2.70000 8.10000 0.00000
2 1 2 0.0 1.35000 9.45000 1.35000
3 1 2 0.0 4.05000 9.45000 1.35000
4 1 1 0.0 5.40000 8.10000 2.70000
5 1 2 0.0 4.05000 9.45000 4.05000
6 1 2 0.0 6.75000 9.45000 4.05000
7 1 1 0.0 2.70000 10.80000 2.70000
8 1 2 0.0 1.35000 12.15000 4.05000
9 1 2 0.0 4.05000 12.15000 4.05000
10 1 1 0.0 5.40000 10.80000 5.40000
11 1 2 0.0 4.05000 12.15000 6.75000
12 1 2 0.0 6.75000 12.15000 6.75000

149
examples/QM/LATTE/README Normal file
View File

@ -0,0 +1,149 @@
LATTE is a semi-empirical tight-binding quantum code, developed
primarily at Los Alamos National Labs.
See these links:
https://www.osti.gov/biblio/1526907-los-alamos-transferable-tight-binding-energetics-latte-version
https://github.com/lanl/LATTE
LAMMPS has 2 ways of working with LATTE:
(1) Via its LATTE package and the fix latte command
must run LAMMPS on a single processor, it calls LATTE as a library
(2) Via its MDI package and the code-coupling MDI library
(a) can run LAMMPS and LATTE as stand-alone codes
LAMMPS can be run on any number of procs
LATTE must run on a single proc, but can use OpenMP
(b) can run LAMMPS with LATTE as a plug-in library
must run LAMMPS on a single processor
Examples for use case (1) are in the examples/latte dir. Use case (2)
is illustrated in this dir.
NOTE: If you compare MDI runs in this dir to similar fix latte runs in
examples/latte, the answers for energy and virial will be differnt.
This is b/c the version of LATTE used by the fix latte command within
the LATTE package is older than the version of LATTE used here.
------------------
Building 3 codes needed to run these examples
(1) Download and build MDI
% git clone git@github.com:MolSSI-MDI/MDI_Library.git mdi
% cd mdi
% mkdir build; cd build
% cmake .. # includes support for all langauges (incl Fortran, Python)
% make
(2) Download and build LATTE with MDI support
% git clone git@github.com:lanl/LATTE.git latte
% cd latte
% git checkout skimLATTE-progress # goto branch with MDI support
% cp makefiles/makefile.CHOICES.mdi makefile.CHOICES # so can now edit
% edit makefile.CHOICES settings to have these settings:
MAKELIB = OFF, SHARED = ON, MDI = ON
MDI_PATH must point to CMake build of MDI in (1),
e.g. /home/sjplimp/mdi/build/MDI_Library
comment out 2 LIB lines with CUDA-CUDART_LIBRARY
% make clean
% make # creates liblatte.so and LATTE_DOUBLE with support for MDI
(3) Build LAMMPS with its MDI package
also with the MOLECULE package for these example scripts
Build with CMake (NOTE: do not use traditional make for this use case)
% cd lammps
% mkdir build; cd build
% cmake -D PKG_MDI=yes -D PKG_MOLECULE=yes ../cmake
% make # creates lmp
(4) Copy LAMMPS and LATTE executables into this dir
Copy the LAMMPS executable into this dir as lmp_mpi.
Copy the LATTE executable LATTE_DOUBLE into this dir.
The run commands below assume you have done this.
(5) Insure LD_LIBRARY_PATH includes the dir where MDI was built in (1)
with its libmdi.so file, e.g. mdi/build/MDI_Library. This is needed
so when LATTE_DOUBLE runs as an executable it will able to find
libmdi.so.
------------------
Notes on LATTE usage
You must run this version of LATTE on a single MPI processor.
However, you can use OpenMP with LATTE. To do this you need to build
LATTE with OpenMP support by editing the makefile.CHOICES file to
include -fopenmp with FFLAGS and LINKFLAGS. Also -lapack and -lblas
need to be added to LIB, and those libraries must be available on your
system. For best performance you should also build LATTE with its
PROGRESS and BML libraries. Building those libs is more complex,
see details here:
https://github.com/lanl/LATTE_SUPER/tree/allMachines/Laptop
At run time, you need to also first set an environment variable for
the number of OpenMP threads to use, e.g.
% export OMP_NUM_THREADS=12
By default LATTE reads the latte.in file for its parameters. That
file specifies other files LATTE will read. With MDI, the driver code
(e.g. LAMMPS) can use the >FNAME command to specify an alternate
filename to use instead of latte.in.
By default LATTE writes out a log.latte file with info about its
calculations. An "OUTFILE= logfile" setting in latte.in can rename
this file.
---------
Run example #1: AIMD
* Run with MPI: 1 proc each
mpirun -np 1 lmp_mpi -mdi "-name LMP -role DRIVER -method MPI" \
-in in.aimd -log log.aimd.lammps.mpi : \
-np 1 LATTE_DOUBLE -mdi "-name LATTE -role ENGINE -method MPI"
* Run with MPI: 2 procs for LAMMPS, 1 for LATTE
mpirun -np 2 lmp_mpi -mdi "-name LMP -role DRIVER -method MPI" \
-in in.aimd -log log.aimd.lammps.mpi : \
-np 1 LATTE_DOUBLE -mdi "-name LATTE -role ENGINE -method MPI"
* Run in plugin mode: 1 proc
lmp_mpi -mdi \
"-name LMP -role DRIVER -method LINK -plugin_path /home/sjplimp/latte/git" \
-in in.aimd.plugin -log log.aimd.lammps.plugin
NOTE: The -plugin_path needs to point to where LATTE was built in step
(2).
---------
Run example #2: sequence of configurations
* Run with MPI: 1 proc each
mpirun -np 1 lmp_mpi -mdi "-name LMP -role DRIVER -method MPI" \
-in in.series -log log.series.lammps.mpi : \
-np 1 LATTE_DOUBLE -mdi "-name LATTE -role ENGINE -method MPI"
* Run with MPI: 2 procs for LAMMPS, 1 for LATTE
mpirun -np 2 lmp_mpi -mdi "-name LMP -role DRIVER -method MPI" \
-in in.series -log log.series.lammps.mpi : \
-np 1 LATTE_DOUBLE -mdi "-name LATTE -role ENGINE -method MPI"
* Run in plugin mode: 1 proc
lmp_mpi -mdi \
"-name LMP -role DRIVER -method LINK -plugin_path /home/sjplimp/latte/git" \
-in in.series.plugin -log log.series.lammps.plugin
NOTE: The -plugin_path needs to point to where LATTE was built in step
(2).

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,315 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.7 2.7 0 -0.601491 0.335597 -0.87242 -2.27066e-14 -1.33391e-14 2.31141e-14
2 2 1.35 4.05 1.35 8.2897 4.55901 5.97376 2.35473 2.21578e-14 7.40069e-15
3 2 4.05 4.05 1.35 1.7742 6.51885 0.385522 -2.35473 2.97071e-15 -2.01341e-14
4 1 2.7 1.65327e-16 2.7 -0.325605 -1.03244 0.724324 -2.90278e-14 6.77422e-15 2.86766e-15
5 2 1.35 1.35 4.05 2.42711 -1.49109 -2.41596 2.35473 5.79901e-15 -1.19594e-14
6 2 4.05 1.35 4.05 1.30688 0.784281 -1.73922 -2.35473 -1.38761e-14 1.09382e-14
ITEM: TIMESTEP
1
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69985 2.70008 -0.000218105 -0.601467 0.335616 -0.872428 0.00470101 0.00380515 -0.00141625
2 2 1.35212 4.05114 1.35149 8.64389 4.55886 5.97363 2.34251 -0.00209926 -0.00172976
3 2 4.0504 4.05163 1.3501 1.41949 6.51866 0.385561 -2.34936 -0.00247497 0.00051716
4 1 2.69992 -0.00025811 2.70018 -0.325581 -1.03243 0.724334 0.00481137 0.00249244 0.00195665
5 2 1.35065 1.34963 4.0494 2.78199 -1.49112 -2.4159 2.3517 -0.00043711 0.000874754
6 2 4.05028 1.3502 4.04957 0.951796 0.784184 -1.73923 -2.35436 -0.00128625 -0.00020256
ITEM: TIMESTEP
2
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6997 2.70017 -0.000436214 -0.601396 0.335673 -0.872449 0.00939888 0.00756163 -0.00288164
2 2 1.35432 4.05228 1.35299 8.99615 4.55837 5.97323 2.32921 -0.00431846 -0.00355855
3 2 4.05071 4.05326 1.35019 1.06567 6.5181 0.385678 -2.34304 -0.00494314 0.00103532
4 1 2.69984 -0.000516214 2.70036 -0.325507 -1.03239 0.724364 0.00976944 0.00512657 0.00403686
5 2 1.35139 1.34925 4.04879 3.13634 -1.49122 -2.4157 2.34776 -0.000851489 0.00177498
6 2 4.05048 1.35039 4.04913 0.596838 0.783892 -1.73928 -2.3531 -0.00257512 -0.000406965
ITEM: TIMESTEP
3
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69955 2.70025 -0.00065433 -0.601277 0.335769 -0.872486 0.0141006 0.0112702 -0.00439552
2 2 1.35661 4.05342 1.35448 9.34633 4.55754 5.97255 2.31482 -0.00666433 -0.00549143
3 2 4.05093 4.05489 1.35029 0.712875 6.51717 0.385873 -2.33577 -0.00740896 0.00154764
4 1 2.69976 -0.000774304 2.70054 -0.325382 -1.03232 0.724417 0.0148831 0.00790884 0.00624833
5 2 1.35222 1.34888 4.04819 3.49003 -1.49137 -2.41536 2.3429 -0.0012407 0.00270313
6 2 4.05058 1.35059 4.0487 0.242138 0.783407 -1.73935 -2.35094 -0.00386511 -0.000612161
ITEM: TIMESTEP
4
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6994 2.70034 -0.000872457 -0.60111 0.335902 -0.872539 0.0188131 0.0149318 -0.00595718
2 2 1.359 4.05456 1.35597 9.69425 4.55635 5.97156 2.29933 -0.00914346 -0.00753331
3 2 4.05107 4.05652 1.35039 0.361248 6.51586 0.386144 -2.32753 -0.00987687 0.00204727
4 1 2.69967 -0.00103238 2.70072 -0.325204 -1.03223 0.724492 0.020161 0.0108455 0.00859866
5 2 1.35314 1.34851 4.04758 3.84292 -1.49159 -2.41488 2.33711 -0.00160232 0.00366164
6 2 4.0506 1.35078 4.04826 -0.112168 0.782727 -1.73946 -2.34789 -0.00515472 -0.000817084
ITEM: TIMESTEP
5
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69925 2.70042 -0.0010906 -0.600896 0.336071 -0.872607 0.0235434 0.0185473 -0.00756588
2 2 1.36146 4.0557 1.35747 10.0397 4.55478 5.97026 2.2827 -0.0117623 -0.00968894
3 2 4.05111 4.05815 1.35048 0.0109366 6.51419 0.386489 -2.31832 -0.0123511 0.00252727
4 1 2.69959 -0.00129042 2.70091 -0.324972 -1.0321 0.724592 0.0256115 0.0139425 0.0110953
5 2 1.35414 1.34814 4.04698 4.19487 -1.49186 -2.41425 2.33039 -0.00193394 0.0046529
6 2 4.05052 1.35098 4.04783 -0.465946 0.781852 -1.7396 -2.34393 -0.00644244 -0.00102066
ITEM: TIMESTEP
6
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6991 2.7005 -0.00130876 -0.600633 0.336277 -0.872692 0.0282985 0.0221175 -0.00922083
2 2 1.36401 4.05684 1.35896 10.3827 4.55279 5.96863 2.26494 -0.0145272 -0.0119629
3 2 4.05107 4.05978 1.35058 -0.337913 6.51214 0.386904 -2.30814 -0.0148362 0.00298071
4 1 2.69951 -0.00154843 2.70109 -0.324684 -1.03194 0.724717 0.0312427 0.0172058 0.0137455
5 2 1.35523 1.34776 4.04638 4.54573 -1.49217 -2.41347 2.32273 -0.00223319 0.00567932
6 2 4.05036 1.35117 4.04739 -0.819058 0.780784 -1.73977 -2.33906 -0.00772673 -0.00122181
ITEM: TIMESTEP
7
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69895 2.70059 -0.00152695 -0.600322 0.336519 -0.872794 0.0330853 0.0256435 -0.0109212
2 2 1.36665 4.05797 1.36045 10.7228 4.55038 5.96665 2.24601 -0.0174443 -0.0143597
3 2 4.05094 4.0614 1.35068 -0.685154 6.50971 0.387385 -2.29698 -0.0173365 0.00340068
4 1 2.69943 -0.00180639 2.70127 -0.324338 -1.03175 0.724871 0.0370626 0.020641 0.0165564
5 2 1.35641 1.34739 4.04577 4.89536 -1.49253 -2.41254 2.31411 -0.0024977 0.00674323
6 2 4.05012 1.35137 4.04696 -1.17137 0.779522 -1.73997 -2.33329 -0.00900604 -0.00141944
ITEM: TIMESTEP
8
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6988 2.70067 -0.00174516 -0.599962 0.336797 -0.872914 0.0379108 0.0291262 -0.0126661
2 2 1.36938 4.05911 1.36194 11.06 4.54752 5.96429 2.2259 -0.0205196 -0.0168834
3 2 4.05073 4.06303 1.35077 -1.03064 6.50691 0.387927 -2.28482 -0.0198564 0.00378025
4 1 2.69935 -0.0020643 2.70145 -0.323932 -1.03153 0.725054 0.0430788 0.0242538 0.0195348
5 2 1.35768 1.34702 4.04517 5.24362 -1.49292 -2.41144 2.30452 -0.0027252 0.00784692
6 2 4.04978 1.35156 4.04652 -1.52274 0.778068 -1.7402 -2.32659 -0.0102788 -0.00161245
ITEM: TIMESTEP
9
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69865 2.70076 -0.0019634 -0.599553 0.337109 -0.873051 0.0427817 0.0325667 -0.0144547
2 2 1.37218 4.06025 1.36343 11.3941 4.54418 5.96155 2.20459 -0.023759 -0.019538
3 2 4.05043 4.06466 1.35087 -1.37421 6.50372 0.388522 -2.27166 -0.0224003 0.00411244
4 1 2.69927 -0.00232215 2.70163 -0.323464 -1.03126 0.725268 0.0492987 0.0280495 0.0226874
5 2 1.35904 1.34664 4.04457 5.59036 -1.49335 -2.41017 2.29396 -0.00291347 0.00899259
6 2 4.04935 1.35176 4.04609 -1.87303 0.776422 -1.74045 -2.31898 -0.0115434 -0.00179972
ITEM: TIMESTEP
10
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6985 2.70084 -0.00218168 -0.599095 0.337456 -0.873207 0.0477049 0.0359661 -0.0162858
2 2 1.37507 4.06138 1.36492 11.7248 4.54034 5.95839 2.18206 -0.0271682 -0.0223275
3 2 4.05004 4.06628 1.35097 -1.71572 6.50015 0.389163 -2.25748 -0.0249726 0.0043903
4 1 2.69919 -0.00257993 2.70181 -0.322932 -1.03096 0.725515 0.0557294 0.0320331 0.0260207
5 2 1.36048 1.34627 4.04397 5.93543 -1.4938 -2.40872 2.2824 -0.00306026 0.0101825
6 2 4.04884 1.35195 4.04565 -2.2221 0.774587 -1.74074 -2.31042 -0.0127983 -0.00198013
ITEM: TIMESTEP
11
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69835 2.70092 -0.00240001 -0.598586 0.337838 -0.873382 0.0526872 0.0393256 -0.0181586
2 2 1.37805 4.06252 1.36641 12.0521 4.53597 5.9548 2.15829 -0.0307526 -0.0252554
3 2 4.04957 4.06791 1.35106 -2.05501 6.49619 0.389841 -2.24228 -0.0275775 0.00460683
4 1 2.69911 -0.00283763 2.70199 -0.322334 -1.03061 0.725796 0.0623777 0.0362096 0.0295409
5 2 1.362 1.3459 4.04336 6.27868 -1.49427 -2.40709 2.26985 -0.00316333 0.0114188
6 2 4.04824 1.35215 4.04522 -2.56981 0.772563 -1.74105 -2.30093 -0.0140417 -0.00215255
ITEM: TIMESTEP
12
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6982 2.70101 -0.00261837 -0.598027 0.338253 -0.873575 0.0577351 0.0426463 -0.0200718
2 2 1.3811 4.06365 1.3679 12.3757 4.53105 5.95076 2.13326 -0.0345179 -0.0283253
3 2 4.04901 4.06953 1.35116 -2.39194 6.49183 0.390547 -2.22604 -0.0302194 0.00475506
4 1 2.69903 -0.00309524 2.70217 -0.321667 -1.03022 0.726114 0.06925 0.0405836 0.0332542
5 2 1.36362 1.34552 4.04276 6.61997 -1.49475 -2.40527 2.25627 -0.00322051 0.0127037
6 2 4.04756 1.35234 4.04478 -2.91602 0.770353 -1.74139 -2.29048 -0.0152721 -0.00231583
ITEM: TIMESTEP
13
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69805 2.70109 -0.00283679 -0.597416 0.338702 -0.873788 0.0628554 0.0459295 -0.0220243
2 2 1.38423 4.06478 1.36939 12.6954 4.52555 5.94625 2.10694 -0.0384688 -0.0315401
3 2 4.04837 4.07115 1.35126 -2.72634 6.48707 0.39127 -2.20874 -0.0329024 0.00482793
4 1 2.69895 -0.00335274 2.70236 -0.320929 -1.02979 0.726471 0.0763523 0.0451591 0.0371659
5 2 1.36531 1.34515 4.04216 6.95912 -1.49523 -2.40326 2.24165 -0.00322965 0.0140393
6 2 4.04678 1.35253 4.04434 -3.26057 0.767958 -1.74175 -2.27906 -0.0164877 -0.0024688
ITEM: TIMESTEP
14
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6979 2.70118 -0.00305527 -0.596753 0.339184 -0.874022 0.0680546 0.0491768 -0.0240145
2 2 1.38745 4.06591 1.37087 13.0111 4.51944 5.94124 2.07932 -0.0426096 -0.0349018
3 2 4.04765 4.07277 1.35136 -3.05804 6.4819 0.391997 -2.19038 -0.035631 0.00481829
4 1 2.69887 -0.00361013 2.70254 -0.320118 -1.0293 0.726868 0.0836894 0.0499393 0.0412807
5 2 1.3671 1.34478 4.04156 7.296 -1.49572 -2.40103 2.22598 -0.00318867 0.0154277
6 2 4.04593 1.35272 4.04391 -3.60334 0.765381 -1.74213 -2.26667 -0.0176868 -0.00261028
ITEM: TIMESTEP
15
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69775 2.70126 -0.0032738 -0.596036 0.339698 -0.874275 0.0733392 0.0523895 -0.0260413
2 2 1.39074 4.06704 1.37236 13.3225 4.51268 5.93571 2.05037 -0.0469451 -0.0384133
3 2 4.04685 4.07439 1.35146 -3.3869 6.47632 0.392716 -2.17093 -0.038409 0.00471919
4 1 2.69879 -0.00386739 2.70272 -0.319232 -1.02877 0.727309 0.0912666 0.0549279 0.0456036
5 2 1.36896 1.3444 4.04096 7.63043 -1.49619 -2.3986 2.20924 -0.00309551 0.0168709
6 2 4.04498 1.35291 4.04347 -3.94416 0.762625 -1.74253 -2.25329 -0.0188678 -0.0027391
ITEM: TIMESTEP
16
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6976 2.70135 -0.00349241 -0.595266 0.340245 -0.87455 0.0787153 0.055569 -0.0281032
2 2 1.39411 4.06817 1.37384 13.6294 4.50526 5.92964 2.02007 -0.0514799 -0.042077
3 2 4.04596 4.07601 1.35155 -3.71274 6.47031 0.393413 -2.15039 -0.0412405 0.00452364
4 1 2.69871 -0.00412452 2.7029 -0.318268 -1.02819 0.727794 0.0990893 0.0601283 0.0501398
5 2 1.37091 1.34403 4.04036 7.96225 -1.49665 -2.39594 2.19142 -0.00294819 0.0183708
6 2 4.04395 1.3531 4.04304 -4.28288 0.759692 -1.74296 -2.2389 -0.0200287 -0.00285406
ITEM: TIMESTEP
17
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69745 2.70143 -0.00371108 -0.594441 0.340824 -0.874845 0.0841889 0.0587168 -0.0301987
2 2 1.39755 4.0693 1.37532 13.9317 4.49714 5.92301 1.9884 -0.0562187 -0.0458954
3 2 4.04499 4.07763 1.35165 -4.0354 6.46388 0.394073 -2.12872 -0.0441293 0.0042247
4 1 2.69863 -0.00438149 2.70308 -0.317223 -1.02755 0.728326 0.107162 0.0655439 0.054894
5 2 1.37294 1.34365 4.03976 8.2913 -1.49708 -2.39305 2.17248 -0.00274479 0.0199293
6 2 4.04284 1.35329 4.0426 -4.61936 0.756586 -1.74339 -2.2235 -0.0211679 -0.00295392
ITEM: TIMESTEP
18
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69731 2.70152 -0.00392983 -0.593559 0.341435 -0.875162 0.0897661 0.0618346 -0.0323262
2 2 1.40107 4.07042 1.3768 14.229 4.48829 5.91578 1.95532 -0.0611659 -0.0498706
3 2 4.04394 4.07924 1.35175 -4.3547 6.457 0.394679 -2.10593 -0.0470792 0.0038154
4 1 2.69855 -0.00463829 2.70327 -0.316095 -1.02686 0.728907 0.11549 0.0711775 0.0598705
5 2 1.37506 1.34328 4.03916 8.61741 -1.49747 -2.38993 2.15241 -0.00248344 0.0215483
6 2 4.04164 1.35348 4.04217 -4.95344 0.753309 -1.74385 -2.20706 -0.0222835 -0.00303744
ITEM: TIMESTEP
19
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69716 2.7016 -0.00414866 -0.592621 0.342077 -0.8755 0.0954526 0.0649239 -0.0344841
2 2 1.40467 4.07154 1.37828 14.5213 4.47868 5.90795 1.92083 -0.0663258 -0.0540045
3 2 4.04281 4.08086 1.35185 -4.67049 6.44967 0.395215 -2.08198 -0.050094 0.00328881
4 1 2.69847 -0.00489492 2.70345 -0.314881 -1.02611 0.72954 0.124076 0.0770317 0.0650736
5 2 1.37725 1.3429 4.03857 8.94041 -1.49782 -2.38655 2.13119 -0.00216234 0.0232295
6 2 4.04036 1.35367 4.04173 -5.28496 0.749867 -1.74431 -2.18956 -0.0233735 -0.00310338
ITEM: TIMESTEP
20
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69701 2.70169 -0.00436758 -0.591624 0.342751 -0.875861 0.101254 0.0679866 -0.0366705
2 2 1.40833 4.07266 1.37976 14.8083 4.46827 5.89948 1.88489 -0.0717024 -0.0582989
3 2 4.0416 4.08247 1.35195 -4.98257 6.44189 0.395662 -2.05686 -0.0531772 0.00263798
4 1 2.69839 -0.00515135 2.70363 -0.313579 -1.0253 0.730227 0.132925 0.0831089 0.0705072
5 2 1.37953 1.34253 4.03797 9.26012 -1.49812 -2.38291 2.1088 -0.00177977 0.0249746
6 2 4.039 1.35386 4.04129 -5.61376 0.746262 -1.74478 -2.171 -0.0244362 -0.00315046

View File

@ -0,0 +1,315 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.7 2.7 0 -0.601491 0.335597 -0.87242 -2.27066e-14 -1.33391e-14 2.31141e-14
2 2 1.35 4.05 1.35 8.2897 4.55901 5.97376 2.35473 2.21578e-14 7.40069e-15
3 2 4.05 4.05 1.35 1.7742 6.51885 0.385522 -2.35473 2.97071e-15 -2.01341e-14
4 1 2.7 1.65327e-16 2.7 -0.325605 -1.03244 0.724324 -2.90278e-14 6.77422e-15 2.86766e-15
5 2 1.35 1.35 4.05 2.42711 -1.49109 -2.41596 2.35473 5.79901e-15 -1.19594e-14
6 2 4.05 1.35 4.05 1.30688 0.784281 -1.73922 -2.35473 -1.38761e-14 1.09382e-14
ITEM: TIMESTEP
1
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69985 2.70008 -0.000218105 -0.601467 0.335616 -0.872428 0.00470101 0.00380515 -0.00141625
2 2 1.35212 4.05114 1.35149 8.64389 4.55886 5.97363 2.34251 -0.00209926 -0.00172976
3 2 4.0504 4.05163 1.3501 1.41949 6.51866 0.385561 -2.34936 -0.00247497 0.00051716
4 1 2.69992 -0.00025811 2.70018 -0.325581 -1.03243 0.724334 0.00481137 0.00249244 0.00195665
5 2 1.35065 1.34963 4.0494 2.78199 -1.49112 -2.4159 2.3517 -0.00043711 0.000874754
6 2 4.05028 1.3502 4.04957 0.951796 0.784184 -1.73923 -2.35436 -0.00128625 -0.00020256
ITEM: TIMESTEP
2
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6997 2.70017 -0.000436214 -0.601396 0.335673 -0.872449 0.00939888 0.00756163 -0.00288164
2 2 1.35432 4.05228 1.35299 8.99615 4.55837 5.97323 2.32921 -0.00431846 -0.00355855
3 2 4.05071 4.05326 1.35019 1.06567 6.5181 0.385678 -2.34304 -0.00494314 0.00103532
4 1 2.69984 -0.000516214 2.70036 -0.325507 -1.03239 0.724364 0.00976944 0.00512657 0.00403686
5 2 1.35139 1.34925 4.04879 3.13634 -1.49122 -2.4157 2.34776 -0.000851489 0.00177498
6 2 4.05048 1.35039 4.04913 0.596838 0.783892 -1.73928 -2.3531 -0.00257512 -0.000406965
ITEM: TIMESTEP
3
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69955 2.70025 -0.00065433 -0.601277 0.335769 -0.872486 0.0141006 0.0112702 -0.00439552
2 2 1.35661 4.05342 1.35448 9.34633 4.55754 5.97255 2.31482 -0.00666433 -0.00549143
3 2 4.05093 4.05489 1.35029 0.712875 6.51717 0.385873 -2.33577 -0.00740896 0.00154764
4 1 2.69976 -0.000774304 2.70054 -0.325382 -1.03232 0.724417 0.0148831 0.00790884 0.00624833
5 2 1.35222 1.34888 4.04819 3.49003 -1.49137 -2.41536 2.3429 -0.0012407 0.00270313
6 2 4.05058 1.35059 4.0487 0.242138 0.783407 -1.73935 -2.35094 -0.00386511 -0.000612161
ITEM: TIMESTEP
4
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6994 2.70034 -0.000872457 -0.60111 0.335902 -0.872539 0.0188131 0.0149318 -0.00595718
2 2 1.359 4.05456 1.35597 9.69425 4.55635 5.97156 2.29933 -0.00914346 -0.00753331
3 2 4.05107 4.05652 1.35039 0.361248 6.51586 0.386144 -2.32753 -0.00987687 0.00204727
4 1 2.69967 -0.00103238 2.70072 -0.325204 -1.03223 0.724492 0.020161 0.0108455 0.00859866
5 2 1.35314 1.34851 4.04758 3.84292 -1.49159 -2.41488 2.33711 -0.00160232 0.00366164
6 2 4.0506 1.35078 4.04826 -0.112168 0.782727 -1.73946 -2.34789 -0.00515472 -0.000817084
ITEM: TIMESTEP
5
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69925 2.70042 -0.0010906 -0.600896 0.336071 -0.872607 0.0235434 0.0185473 -0.00756588
2 2 1.36146 4.0557 1.35747 10.0397 4.55478 5.97026 2.2827 -0.0117623 -0.00968894
3 2 4.05111 4.05815 1.35048 0.0109366 6.51419 0.386489 -2.31832 -0.0123511 0.00252727
4 1 2.69959 -0.00129042 2.70091 -0.324972 -1.0321 0.724592 0.0256115 0.0139425 0.0110953
5 2 1.35414 1.34814 4.04698 4.19487 -1.49186 -2.41425 2.33039 -0.00193394 0.0046529
6 2 4.05052 1.35098 4.04783 -0.465946 0.781852 -1.7396 -2.34393 -0.00644244 -0.00102066
ITEM: TIMESTEP
6
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6991 2.7005 -0.00130876 -0.600633 0.336277 -0.872692 0.0282985 0.0221175 -0.00922083
2 2 1.36401 4.05684 1.35896 10.3827 4.55279 5.96863 2.26494 -0.0145272 -0.0119629
3 2 4.05107 4.05978 1.35058 -0.337913 6.51214 0.386904 -2.30814 -0.0148362 0.00298071
4 1 2.69951 -0.00154843 2.70109 -0.324684 -1.03194 0.724717 0.0312427 0.0172058 0.0137455
5 2 1.35523 1.34776 4.04638 4.54573 -1.49217 -2.41347 2.32273 -0.00223319 0.00567932
6 2 4.05036 1.35117 4.04739 -0.819058 0.780784 -1.73977 -2.33906 -0.00772673 -0.00122181
ITEM: TIMESTEP
7
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69895 2.70059 -0.00152695 -0.600322 0.336519 -0.872794 0.0330853 0.0256435 -0.0109212
2 2 1.36665 4.05797 1.36045 10.7228 4.55038 5.96665 2.24601 -0.0174443 -0.0143597
3 2 4.05094 4.0614 1.35068 -0.685154 6.50971 0.387385 -2.29698 -0.0173365 0.00340068
4 1 2.69943 -0.00180639 2.70127 -0.324338 -1.03175 0.724871 0.0370626 0.020641 0.0165564
5 2 1.35641 1.34739 4.04577 4.89536 -1.49253 -2.41254 2.31411 -0.0024977 0.00674323
6 2 4.05012 1.35137 4.04696 -1.17137 0.779522 -1.73997 -2.33329 -0.00900604 -0.00141944
ITEM: TIMESTEP
8
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6988 2.70067 -0.00174516 -0.599962 0.336797 -0.872914 0.0379108 0.0291262 -0.0126661
2 2 1.36938 4.05911 1.36194 11.06 4.54752 5.96429 2.2259 -0.0205196 -0.0168834
3 2 4.05073 4.06303 1.35077 -1.03064 6.50691 0.387927 -2.28482 -0.0198564 0.00378025
4 1 2.69935 -0.0020643 2.70145 -0.323932 -1.03153 0.725054 0.0430788 0.0242538 0.0195348
5 2 1.35768 1.34702 4.04517 5.24362 -1.49292 -2.41144 2.30452 -0.0027252 0.00784692
6 2 4.04978 1.35156 4.04652 -1.52274 0.778068 -1.7402 -2.32659 -0.0102788 -0.00161245
ITEM: TIMESTEP
9
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69865 2.70076 -0.0019634 -0.599553 0.337109 -0.873051 0.0427817 0.0325667 -0.0144547
2 2 1.37218 4.06025 1.36343 11.3941 4.54418 5.96155 2.20459 -0.023759 -0.019538
3 2 4.05043 4.06466 1.35087 -1.37421 6.50372 0.388522 -2.27166 -0.0224003 0.00411244
4 1 2.69927 -0.00232215 2.70163 -0.323464 -1.03126 0.725268 0.0492987 0.0280495 0.0226874
5 2 1.35904 1.34664 4.04457 5.59036 -1.49335 -2.41017 2.29396 -0.00291347 0.00899259
6 2 4.04935 1.35176 4.04609 -1.87303 0.776422 -1.74045 -2.31898 -0.0115434 -0.00179972
ITEM: TIMESTEP
10
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6985 2.70084 -0.00218168 -0.599095 0.337456 -0.873207 0.0477049 0.0359661 -0.0162858
2 2 1.37507 4.06138 1.36492 11.7248 4.54034 5.95839 2.18206 -0.0271682 -0.0223275
3 2 4.05004 4.06628 1.35097 -1.71572 6.50015 0.389163 -2.25748 -0.0249726 0.0043903
4 1 2.69919 -0.00257993 2.70181 -0.322932 -1.03096 0.725515 0.0557294 0.0320331 0.0260207
5 2 1.36048 1.34627 4.04397 5.93543 -1.4938 -2.40872 2.2824 -0.00306026 0.0101825
6 2 4.04884 1.35195 4.04565 -2.2221 0.774587 -1.74074 -2.31042 -0.0127983 -0.00198013
ITEM: TIMESTEP
11
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69835 2.70092 -0.00240001 -0.598586 0.337838 -0.873382 0.0526872 0.0393256 -0.0181586
2 2 1.37805 4.06252 1.36641 12.0521 4.53597 5.9548 2.15829 -0.0307526 -0.0252554
3 2 4.04957 4.06791 1.35106 -2.05501 6.49619 0.389841 -2.24228 -0.0275775 0.00460683
4 1 2.69911 -0.00283763 2.70199 -0.322334 -1.03061 0.725796 0.0623777 0.0362096 0.0295409
5 2 1.362 1.3459 4.04336 6.27868 -1.49427 -2.40709 2.26985 -0.00316333 0.0114188
6 2 4.04824 1.35215 4.04522 -2.56981 0.772563 -1.74105 -2.30093 -0.0140417 -0.00215255
ITEM: TIMESTEP
12
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6982 2.70101 -0.00261837 -0.598027 0.338253 -0.873575 0.0577351 0.0426463 -0.0200718
2 2 1.3811 4.06365 1.3679 12.3757 4.53105 5.95076 2.13326 -0.0345179 -0.0283253
3 2 4.04901 4.06953 1.35116 -2.39194 6.49183 0.390547 -2.22604 -0.0302194 0.00475506
4 1 2.69903 -0.00309524 2.70217 -0.321667 -1.03022 0.726114 0.06925 0.0405836 0.0332542
5 2 1.36362 1.34552 4.04276 6.61997 -1.49475 -2.40527 2.25627 -0.00322051 0.0127037
6 2 4.04756 1.35234 4.04478 -2.91602 0.770353 -1.74139 -2.29048 -0.0152721 -0.00231583
ITEM: TIMESTEP
13
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69805 2.70109 -0.00283679 -0.597416 0.338702 -0.873788 0.0628554 0.0459295 -0.0220243
2 2 1.38423 4.06478 1.36939 12.6954 4.52555 5.94625 2.10694 -0.0384688 -0.0315401
3 2 4.04837 4.07115 1.35126 -2.72634 6.48707 0.39127 -2.20874 -0.0329024 0.00482793
4 1 2.69895 -0.00335274 2.70236 -0.320929 -1.02979 0.726471 0.0763523 0.0451591 0.0371659
5 2 1.36531 1.34515 4.04216 6.95912 -1.49523 -2.40326 2.24165 -0.00322965 0.0140393
6 2 4.04678 1.35253 4.04434 -3.26057 0.767958 -1.74175 -2.27906 -0.0164877 -0.0024688
ITEM: TIMESTEP
14
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6979 2.70118 -0.00305527 -0.596753 0.339184 -0.874022 0.0680546 0.0491768 -0.0240145
2 2 1.38745 4.06591 1.37087 13.0111 4.51944 5.94124 2.07932 -0.0426096 -0.0349018
3 2 4.04765 4.07277 1.35136 -3.05804 6.4819 0.391997 -2.19038 -0.035631 0.00481829
4 1 2.69887 -0.00361013 2.70254 -0.320118 -1.0293 0.726868 0.0836894 0.0499393 0.0412807
5 2 1.3671 1.34478 4.04156 7.296 -1.49572 -2.40103 2.22598 -0.00318867 0.0154277
6 2 4.04593 1.35272 4.04391 -3.60334 0.765381 -1.74213 -2.26667 -0.0176868 -0.00261028
ITEM: TIMESTEP
15
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69775 2.70126 -0.0032738 -0.596036 0.339698 -0.874275 0.0733392 0.0523895 -0.0260413
2 2 1.39074 4.06704 1.37236 13.3225 4.51268 5.93571 2.05037 -0.0469451 -0.0384133
3 2 4.04685 4.07439 1.35146 -3.3869 6.47632 0.392716 -2.17093 -0.038409 0.00471919
4 1 2.69879 -0.00386739 2.70272 -0.319232 -1.02877 0.727309 0.0912666 0.0549279 0.0456036
5 2 1.36896 1.3444 4.04096 7.63043 -1.49619 -2.3986 2.20924 -0.00309551 0.0168709
6 2 4.04498 1.35291 4.04347 -3.94416 0.762625 -1.74253 -2.25329 -0.0188678 -0.0027391
ITEM: TIMESTEP
16
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6976 2.70135 -0.00349241 -0.595266 0.340245 -0.87455 0.0787153 0.055569 -0.0281032
2 2 1.39411 4.06817 1.37384 13.6294 4.50526 5.92964 2.02007 -0.0514799 -0.042077
3 2 4.04596 4.07601 1.35155 -3.71274 6.47031 0.393413 -2.15039 -0.0412405 0.00452364
4 1 2.69871 -0.00412452 2.7029 -0.318268 -1.02819 0.727794 0.0990893 0.0601283 0.0501398
5 2 1.37091 1.34403 4.04036 7.96225 -1.49665 -2.39594 2.19142 -0.00294819 0.0183708
6 2 4.04395 1.3531 4.04304 -4.28288 0.759692 -1.74296 -2.2389 -0.0200287 -0.00285406
ITEM: TIMESTEP
17
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69745 2.70143 -0.00371108 -0.594441 0.340824 -0.874845 0.0841889 0.0587168 -0.0301987
2 2 1.39755 4.0693 1.37532 13.9317 4.49714 5.92301 1.9884 -0.0562187 -0.0458954
3 2 4.04499 4.07763 1.35165 -4.0354 6.46388 0.394073 -2.12872 -0.0441293 0.0042247
4 1 2.69863 -0.00438149 2.70308 -0.317223 -1.02755 0.728326 0.107162 0.0655439 0.054894
5 2 1.37294 1.34365 4.03976 8.2913 -1.49708 -2.39305 2.17248 -0.00274479 0.0199293
6 2 4.04284 1.35329 4.0426 -4.61936 0.756586 -1.74339 -2.2235 -0.0211679 -0.00295392
ITEM: TIMESTEP
18
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69731 2.70152 -0.00392983 -0.593559 0.341435 -0.875162 0.0897661 0.0618346 -0.0323262
2 2 1.40107 4.07042 1.3768 14.229 4.48829 5.91578 1.95532 -0.0611659 -0.0498706
3 2 4.04394 4.07924 1.35175 -4.3547 6.457 0.394679 -2.10593 -0.0470792 0.0038154
4 1 2.69855 -0.00463829 2.70327 -0.316095 -1.02686 0.728907 0.11549 0.0711775 0.0598705
5 2 1.37506 1.34328 4.03916 8.61741 -1.49747 -2.38993 2.15241 -0.00248344 0.0215483
6 2 4.04164 1.35348 4.04217 -4.95344 0.753309 -1.74385 -2.20706 -0.0222835 -0.00303744
ITEM: TIMESTEP
19
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69716 2.7016 -0.00414866 -0.592621 0.342077 -0.8755 0.0954526 0.0649239 -0.0344841
2 2 1.40467 4.07154 1.37828 14.5213 4.47868 5.90795 1.92083 -0.0663258 -0.0540045
3 2 4.04281 4.08086 1.35185 -4.67049 6.44967 0.395215 -2.08198 -0.050094 0.00328881
4 1 2.69847 -0.00489492 2.70345 -0.314881 -1.02611 0.72954 0.124076 0.0770317 0.0650736
5 2 1.37725 1.3429 4.03857 8.94041 -1.49782 -2.38655 2.13119 -0.00216234 0.0232295
6 2 4.04036 1.35367 4.04173 -5.28496 0.749867 -1.74431 -2.18956 -0.0233735 -0.00310338
ITEM: TIMESTEP
20
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69701 2.70169 -0.00436758 -0.591624 0.342751 -0.875861 0.101254 0.0679866 -0.0366705
2 2 1.40833 4.07266 1.37976 14.8083 4.46827 5.89948 1.88489 -0.0717024 -0.0582989
3 2 4.0416 4.08247 1.35195 -4.98257 6.44189 0.395662 -2.05686 -0.0531772 0.00263798
4 1 2.69839 -0.00515135 2.70363 -0.313579 -1.0253 0.730227 0.132925 0.0831089 0.0705072
5 2 1.37953 1.34253 4.03797 9.26012 -1.49812 -2.38291 2.1088 -0.00177977 0.0249746
6 2 4.039 1.35386 4.04129 -5.61376 0.746262 -1.74478 -2.171 -0.0244362 -0.00315046

View File

@ -0,0 +1,315 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.7 2.7 0 -0.601491 0.335597 -0.87242 -2.27066e-14 -1.33391e-14 2.31141e-14
2 2 1.35 4.05 1.35 8.2897 4.55901 5.97376 2.35473 2.21578e-14 7.40069e-15
3 2 4.05 4.05 1.35 1.7742 6.51885 0.385522 -2.35473 2.97071e-15 -2.01341e-14
4 1 2.7 1.65327e-16 2.7 -0.325605 -1.03244 0.724324 -2.90278e-14 6.77422e-15 2.86766e-15
5 2 1.35 1.35 4.05 2.42711 -1.49109 -2.41596 2.35473 5.79901e-15 -1.19594e-14
6 2 4.05 1.35 4.05 1.30688 0.784281 -1.73922 -2.35473 -1.38761e-14 1.09382e-14
ITEM: TIMESTEP
1
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69985 2.70008 -0.000218105 -0.601467 0.335616 -0.872428 0.00470101 0.00380515 -0.00141625
2 2 1.35212 4.05114 1.35149 8.64389 4.55886 5.97363 2.34251 -0.00209926 -0.00172976
3 2 4.0504 4.05163 1.3501 1.41949 6.51866 0.385561 -2.34936 -0.00247497 0.00051716
4 1 2.69992 -0.00025811 2.70018 -0.325581 -1.03243 0.724334 0.00481137 0.00249244 0.00195665
5 2 1.35065 1.34963 4.0494 2.78199 -1.49112 -2.4159 2.3517 -0.00043711 0.000874754
6 2 4.05028 1.3502 4.04957 0.951796 0.784184 -1.73923 -2.35436 -0.00128625 -0.00020256
ITEM: TIMESTEP
2
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6997 2.70017 -0.000436214 -0.601396 0.335673 -0.872449 0.00939888 0.00756163 -0.00288164
2 2 1.35432 4.05228 1.35299 8.99615 4.55837 5.97323 2.32921 -0.00431846 -0.00355855
3 2 4.05071 4.05326 1.35019 1.06567 6.5181 0.385678 -2.34304 -0.00494314 0.00103532
4 1 2.69984 -0.000516214 2.70036 -0.325507 -1.03239 0.724364 0.00976944 0.00512657 0.00403686
5 2 1.35139 1.34925 4.04879 3.13634 -1.49122 -2.4157 2.34776 -0.000851489 0.00177498
6 2 4.05048 1.35039 4.04913 0.596838 0.783892 -1.73928 -2.3531 -0.00257512 -0.000406965
ITEM: TIMESTEP
3
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69955 2.70025 -0.00065433 -0.601277 0.335769 -0.872486 0.0141006 0.0112702 -0.00439552
2 2 1.35661 4.05342 1.35448 9.34633 4.55754 5.97255 2.31482 -0.00666433 -0.00549143
3 2 4.05093 4.05489 1.35029 0.712875 6.51717 0.385873 -2.33577 -0.00740896 0.00154764
4 1 2.69976 -0.000774304 2.70054 -0.325382 -1.03232 0.724417 0.0148831 0.00790884 0.00624833
5 2 1.35222 1.34888 4.04819 3.49003 -1.49137 -2.41536 2.3429 -0.0012407 0.00270313
6 2 4.05058 1.35059 4.0487 0.242138 0.783407 -1.73935 -2.35094 -0.00386511 -0.000612161
ITEM: TIMESTEP
4
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6994 2.70034 -0.000872457 -0.60111 0.335902 -0.872539 0.0188131 0.0149318 -0.00595718
2 2 1.359 4.05456 1.35597 9.69425 4.55635 5.97156 2.29933 -0.00914346 -0.00753331
3 2 4.05107 4.05652 1.35039 0.361248 6.51586 0.386144 -2.32753 -0.00987687 0.00204727
4 1 2.69967 -0.00103238 2.70072 -0.325204 -1.03223 0.724492 0.020161 0.0108455 0.00859866
5 2 1.35314 1.34851 4.04758 3.84292 -1.49159 -2.41488 2.33711 -0.00160232 0.00366164
6 2 4.0506 1.35078 4.04826 -0.112168 0.782727 -1.73946 -2.34789 -0.00515472 -0.000817084
ITEM: TIMESTEP
5
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69925 2.70042 -0.0010906 -0.600896 0.336071 -0.872607 0.0235434 0.0185473 -0.00756588
2 2 1.36146 4.0557 1.35747 10.0397 4.55478 5.97026 2.2827 -0.0117623 -0.00968894
3 2 4.05111 4.05815 1.35048 0.0109366 6.51419 0.386489 -2.31832 -0.0123511 0.00252727
4 1 2.69959 -0.00129042 2.70091 -0.324972 -1.0321 0.724592 0.0256115 0.0139425 0.0110953
5 2 1.35414 1.34814 4.04698 4.19487 -1.49186 -2.41425 2.33039 -0.00193394 0.0046529
6 2 4.05052 1.35098 4.04783 -0.465946 0.781852 -1.7396 -2.34393 -0.00644244 -0.00102066
ITEM: TIMESTEP
6
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6991 2.7005 -0.00130876 -0.600633 0.336277 -0.872692 0.0282985 0.0221175 -0.00922083
2 2 1.36401 4.05684 1.35896 10.3827 4.55279 5.96863 2.26494 -0.0145272 -0.0119629
3 2 4.05107 4.05978 1.35058 -0.337913 6.51214 0.386904 -2.30814 -0.0148362 0.00298071
4 1 2.69951 -0.00154843 2.70109 -0.324684 -1.03194 0.724717 0.0312427 0.0172058 0.0137455
5 2 1.35523 1.34776 4.04638 4.54573 -1.49217 -2.41347 2.32273 -0.00223319 0.00567932
6 2 4.05036 1.35117 4.04739 -0.819058 0.780784 -1.73977 -2.33906 -0.00772673 -0.00122181
ITEM: TIMESTEP
7
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69895 2.70059 -0.00152695 -0.600322 0.336519 -0.872794 0.0330853 0.0256435 -0.0109212
2 2 1.36665 4.05797 1.36045 10.7228 4.55038 5.96665 2.24601 -0.0174443 -0.0143597
3 2 4.05094 4.0614 1.35068 -0.685154 6.50971 0.387385 -2.29698 -0.0173365 0.00340068
4 1 2.69943 -0.00180639 2.70127 -0.324338 -1.03175 0.724871 0.0370626 0.020641 0.0165564
5 2 1.35641 1.34739 4.04577 4.89536 -1.49253 -2.41254 2.31411 -0.0024977 0.00674323
6 2 4.05012 1.35137 4.04696 -1.17137 0.779522 -1.73997 -2.33329 -0.00900604 -0.00141944
ITEM: TIMESTEP
8
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6988 2.70067 -0.00174516 -0.599962 0.336797 -0.872914 0.0379108 0.0291262 -0.0126661
2 2 1.36938 4.05911 1.36194 11.06 4.54752 5.96429 2.2259 -0.0205196 -0.0168834
3 2 4.05073 4.06303 1.35077 -1.03064 6.50691 0.387927 -2.28482 -0.0198564 0.00378025
4 1 2.69935 -0.0020643 2.70145 -0.323932 -1.03153 0.725054 0.0430788 0.0242538 0.0195348
5 2 1.35768 1.34702 4.04517 5.24362 -1.49292 -2.41144 2.30452 -0.0027252 0.00784692
6 2 4.04978 1.35156 4.04652 -1.52274 0.778068 -1.7402 -2.32659 -0.0102788 -0.00161245
ITEM: TIMESTEP
9
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69865 2.70076 -0.0019634 -0.599553 0.337109 -0.873051 0.0427817 0.0325667 -0.0144547
2 2 1.37218 4.06025 1.36343 11.3941 4.54418 5.96155 2.20459 -0.023759 -0.019538
3 2 4.05043 4.06466 1.35087 -1.37421 6.50372 0.388522 -2.27166 -0.0224003 0.00411244
4 1 2.69927 -0.00232215 2.70163 -0.323464 -1.03126 0.725268 0.0492987 0.0280495 0.0226874
5 2 1.35904 1.34664 4.04457 5.59036 -1.49335 -2.41017 2.29396 -0.00291347 0.00899259
6 2 4.04935 1.35176 4.04609 -1.87303 0.776422 -1.74045 -2.31898 -0.0115434 -0.00179972
ITEM: TIMESTEP
10
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6985 2.70084 -0.00218168 -0.599095 0.337456 -0.873207 0.0477049 0.0359661 -0.0162858
2 2 1.37507 4.06138 1.36492 11.7248 4.54034 5.95839 2.18206 -0.0271682 -0.0223275
3 2 4.05004 4.06628 1.35097 -1.71572 6.50015 0.389163 -2.25748 -0.0249726 0.0043903
4 1 2.69919 -0.00257993 2.70181 -0.322932 -1.03096 0.725515 0.0557294 0.0320331 0.0260207
5 2 1.36048 1.34627 4.04397 5.93543 -1.4938 -2.40872 2.2824 -0.00306026 0.0101825
6 2 4.04884 1.35195 4.04565 -2.2221 0.774587 -1.74074 -2.31042 -0.0127983 -0.00198013
ITEM: TIMESTEP
11
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69835 2.70092 -0.00240001 -0.598586 0.337838 -0.873382 0.0526872 0.0393256 -0.0181586
2 2 1.37805 4.06252 1.36641 12.0521 4.53597 5.9548 2.15829 -0.0307526 -0.0252554
3 2 4.04957 4.06791 1.35106 -2.05501 6.49619 0.389841 -2.24228 -0.0275775 0.00460683
4 1 2.69911 -0.00283763 2.70199 -0.322334 -1.03061 0.725796 0.0623777 0.0362096 0.0295409
5 2 1.362 1.3459 4.04336 6.27868 -1.49427 -2.40709 2.26985 -0.00316333 0.0114188
6 2 4.04824 1.35215 4.04522 -2.56981 0.772563 -1.74105 -2.30093 -0.0140417 -0.00215255
ITEM: TIMESTEP
12
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6982 2.70101 -0.00261837 -0.598027 0.338253 -0.873575 0.0577351 0.0426463 -0.0200718
2 2 1.3811 4.06365 1.3679 12.3757 4.53105 5.95076 2.13326 -0.0345179 -0.0283253
3 2 4.04901 4.06953 1.35116 -2.39194 6.49183 0.390547 -2.22604 -0.0302194 0.00475506
4 1 2.69903 -0.00309524 2.70217 -0.321667 -1.03022 0.726114 0.06925 0.0405836 0.0332542
5 2 1.36362 1.34552 4.04276 6.61997 -1.49475 -2.40527 2.25627 -0.00322051 0.0127037
6 2 4.04756 1.35234 4.04478 -2.91602 0.770353 -1.74139 -2.29048 -0.0152721 -0.00231583
ITEM: TIMESTEP
13
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69805 2.70109 -0.00283679 -0.597416 0.338702 -0.873788 0.0628554 0.0459295 -0.0220243
2 2 1.38423 4.06478 1.36939 12.6954 4.52555 5.94625 2.10694 -0.0384688 -0.0315401
3 2 4.04837 4.07115 1.35126 -2.72634 6.48707 0.39127 -2.20874 -0.0329024 0.00482793
4 1 2.69895 -0.00335274 2.70236 -0.320929 -1.02979 0.726471 0.0763523 0.0451591 0.0371659
5 2 1.36531 1.34515 4.04216 6.95912 -1.49523 -2.40326 2.24165 -0.00322965 0.0140393
6 2 4.04678 1.35253 4.04434 -3.26057 0.767958 -1.74175 -2.27906 -0.0164877 -0.0024688
ITEM: TIMESTEP
14
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6979 2.70118 -0.00305527 -0.596753 0.339184 -0.874022 0.0680546 0.0491768 -0.0240145
2 2 1.38745 4.06591 1.37087 13.0111 4.51944 5.94124 2.07932 -0.0426096 -0.0349018
3 2 4.04765 4.07277 1.35136 -3.05804 6.4819 0.391997 -2.19038 -0.035631 0.00481829
4 1 2.69887 -0.00361013 2.70254 -0.320118 -1.0293 0.726868 0.0836894 0.0499393 0.0412807
5 2 1.3671 1.34478 4.04156 7.296 -1.49572 -2.40103 2.22598 -0.00318867 0.0154277
6 2 4.04593 1.35272 4.04391 -3.60334 0.765381 -1.74213 -2.26667 -0.0176868 -0.00261028
ITEM: TIMESTEP
15
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69775 2.70126 -0.0032738 -0.596036 0.339698 -0.874275 0.0733392 0.0523895 -0.0260413
2 2 1.39074 4.06704 1.37236 13.3225 4.51268 5.93571 2.05037 -0.0469451 -0.0384133
3 2 4.04685 4.07439 1.35146 -3.3869 6.47632 0.392716 -2.17093 -0.038409 0.00471919
4 1 2.69879 -0.00386739 2.70272 -0.319232 -1.02877 0.727309 0.0912666 0.0549279 0.0456036
5 2 1.36896 1.3444 4.04096 7.63043 -1.49619 -2.3986 2.20924 -0.00309551 0.0168709
6 2 4.04498 1.35291 4.04347 -3.94416 0.762625 -1.74253 -2.25329 -0.0188678 -0.0027391
ITEM: TIMESTEP
16
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.6976 2.70135 -0.00349241 -0.595266 0.340245 -0.87455 0.0787153 0.055569 -0.0281032
2 2 1.39411 4.06817 1.37384 13.6294 4.50526 5.92964 2.02007 -0.0514799 -0.042077
3 2 4.04596 4.07601 1.35155 -3.71274 6.47031 0.393413 -2.15039 -0.0412405 0.00452364
4 1 2.69871 -0.00412452 2.7029 -0.318268 -1.02819 0.727794 0.0990893 0.0601283 0.0501398
5 2 1.37091 1.34403 4.04036 7.96225 -1.49665 -2.39594 2.19142 -0.00294819 0.0183708
6 2 4.04395 1.3531 4.04304 -4.28288 0.759692 -1.74296 -2.2389 -0.0200287 -0.00285406
ITEM: TIMESTEP
17
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69745 2.70143 -0.00371108 -0.594441 0.340824 -0.874845 0.0841889 0.0587168 -0.0301987
2 2 1.39755 4.0693 1.37532 13.9317 4.49714 5.92301 1.9884 -0.0562187 -0.0458954
3 2 4.04499 4.07763 1.35165 -4.0354 6.46388 0.394073 -2.12872 -0.0441293 0.0042247
4 1 2.69863 -0.00438149 2.70308 -0.317223 -1.02755 0.728326 0.107162 0.0655439 0.054894
5 2 1.37294 1.34365 4.03976 8.2913 -1.49708 -2.39305 2.17248 -0.00274479 0.0199293
6 2 4.04284 1.35329 4.0426 -4.61936 0.756586 -1.74339 -2.2235 -0.0211679 -0.00295392
ITEM: TIMESTEP
18
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69731 2.70152 -0.00392983 -0.593559 0.341435 -0.875162 0.0897661 0.0618346 -0.0323262
2 2 1.40107 4.07042 1.3768 14.229 4.48829 5.91578 1.95532 -0.0611659 -0.0498706
3 2 4.04394 4.07924 1.35175 -4.3547 6.457 0.394679 -2.10593 -0.0470792 0.0038154
4 1 2.69855 -0.00463829 2.70327 -0.316095 -1.02686 0.728907 0.11549 0.0711775 0.0598705
5 2 1.37506 1.34328 4.03916 8.61741 -1.49747 -2.38993 2.15241 -0.00248344 0.0215483
6 2 4.04164 1.35348 4.04217 -4.95344 0.753309 -1.74385 -2.20706 -0.0222835 -0.00303744
ITEM: TIMESTEP
19
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69716 2.7016 -0.00414866 -0.592621 0.342077 -0.8755 0.0954526 0.0649239 -0.0344841
2 2 1.40467 4.07154 1.37828 14.5213 4.47868 5.90795 1.92083 -0.0663258 -0.0540045
3 2 4.04281 4.08086 1.35185 -4.67049 6.44967 0.395215 -2.08198 -0.050094 0.00328881
4 1 2.69847 -0.00489492 2.70345 -0.314881 -1.02611 0.72954 0.124076 0.0770317 0.0650736
5 2 1.37725 1.3429 4.03857 8.94041 -1.49782 -2.38655 2.13119 -0.00216234 0.0232295
6 2 4.04036 1.35367 4.04173 -5.28496 0.749867 -1.74431 -2.18956 -0.0233735 -0.00310338
ITEM: TIMESTEP
20
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z vx vy vz fx fy fz
1 1 2.69701 2.70169 -0.00436758 -0.591624 0.342751 -0.875861 0.101254 0.0679866 -0.0366705
2 2 1.40833 4.07266 1.37976 14.8083 4.46827 5.89948 1.88489 -0.0717024 -0.0582989
3 2 4.0416 4.08247 1.35195 -4.98257 6.44189 0.395662 -2.05686 -0.0531772 0.00263798
4 1 2.69839 -0.00515135 2.70363 -0.313579 -1.0253 0.730227 0.132925 0.0831089 0.0705072
5 2 1.37953 1.34253 4.03797 9.26012 -1.49812 -2.38291 2.1088 -0.00177977 0.0249746
6 2 4.039 1.35386 4.04129 -5.61376 0.746262 -1.74478 -2.171 -0.0244362 -0.00315046

View File

@ -0,0 +1,15 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z fx fy fz
1 1 2.7 2.7 0 -2.27066e-14 -1.33391e-14 2.31141e-14
2 2 1.35 4.05 1.35 2.35473 2.21578e-14 7.40069e-15
3 2 4.05 4.05 1.35 -2.35473 2.97071e-15 -2.01341e-14
4 1 2.7 1.65327e-16 2.7 -2.90278e-14 6.77422e-15 2.86766e-15
5 2 1.35 1.35 4.05 2.35473 5.79901e-15 -1.19594e-14
6 2 4.05 1.35 4.05 -2.35473 -1.38761e-14 1.09382e-14

View File

@ -0,0 +1,18 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
9
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.6199999999999999e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z fx fy fz
1 1 2.7 2.7 0 -1.27436e-13 0.760572 0.760572
2 2 1.35 4.05 1.35 0.682428 -0.329901 -0.329901
3 2 4.05 4.05 1.35 -0.682428 -0.329901 -0.329901
4 1 2.7 1.65327e-16 2.7 -8.06311e-14 -1.57101 -1.57101
5 2 1.35 1.35 4.05 2.79365 0.684734 0.684734
6 2 4.05 1.35 4.05 -2.79365 0.684734 0.684734
7 1 2.7 2.7 0 -1.30843e-13 0.760572 0.760572
8 2 1.35 4.05 1.35 0.682428 -0.329901 -0.329901
9 2 4.05 4.05 1.35 -0.682428 -0.329901 -0.329901

View File

@ -0,0 +1,21 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
12
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 6.6130927153957075e-16
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z fx fy fz
1 1 2.7 8.1 0 -0.433947 2.16479 1.55466
2 2 1.35 9.45 1.35 1.64718 -0.119006 0.375837
3 2 4.05 9.45 1.35 0.999862 -1.02573 0.037629
4 1 5.4 8.1 2.7 0.433947 2.16479 1.55466
5 2 4.05 9.45 4.05 -0.999862 -1.02573 0.037629
6 2 6.75 9.45 4.05 -1.64718 -0.119006 0.375837
7 1 2.7 1.65327e-16 2.7 -0.211437 1.63064 -0.0728897
8 2 1.35 1.35 4.05 0.461807 -1.3955 -1.94959
9 2 4.05 1.35 4.05 0.708573 -1.2552 0.0543549
10 1 5.4 0 0 0.211437 1.63064 -0.0728897
11 2 4.05 1.35 1.35 -0.708573 -1.2552 0.0543549
12 2 6.75 1.35 1.35 -0.461807 -1.3955 -1.94959

View File

@ -0,0 +1,15 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z fx fy fz
1 1 2.7 2.7 0 -2.27066e-14 -1.33391e-14 2.31141e-14
2 2 1.35 4.05 1.35 2.35473 2.21578e-14 7.40069e-15
3 2 4.05 4.05 1.35 -2.35473 2.97071e-15 -2.01341e-14
4 1 2.7 1.65327e-16 2.7 -2.90278e-14 6.77422e-15 2.86766e-15
5 2 1.35 1.35 4.05 2.35473 5.79901e-15 -1.19594e-14
6 2 4.05 1.35 4.05 -2.35473 -1.38761e-14 1.09382e-14

View File

@ -0,0 +1,18 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
9
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.6199999999999999e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z fx fy fz
1 1 2.7 2.7 0 -1.27436e-13 0.760572 0.760572
2 2 1.35 4.05 1.35 0.682428 -0.329901 -0.329901
3 2 4.05 4.05 1.35 -0.682428 -0.329901 -0.329901
4 1 2.7 1.65327e-16 2.7 -8.06311e-14 -1.57101 -1.57101
5 2 1.35 1.35 4.05 2.79365 0.684734 0.684734
6 2 4.05 1.35 4.05 -2.79365 0.684734 0.684734
7 1 2.7 2.7 0 -1.30843e-13 0.760572 0.760572
8 2 1.35 4.05 1.35 0.682428 -0.329901 -0.329901
9 2 4.05 4.05 1.35 -0.682428 -0.329901 -0.329901

View File

@ -0,0 +1,21 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
12
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 6.6130927153957075e-16
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z fx fy fz
1 1 2.7 8.1 0 -0.433947 2.16479 1.55466
2 2 1.35 9.45 1.35 1.64718 -0.119006 0.375837
3 2 4.05 9.45 1.35 0.999862 -1.02573 0.037629
4 1 5.4 8.1 2.7 0.433947 2.16479 1.55466
5 2 4.05 9.45 4.05 -0.999862 -1.02573 0.037629
6 2 6.75 9.45 4.05 -1.64718 -0.119006 0.375837
7 1 2.7 1.65327e-16 2.7 -0.211437 1.63064 -0.0728897
8 2 1.35 1.35 4.05 0.461807 -1.3955 -1.94959
9 2 4.05 1.35 4.05 0.708573 -1.2552 0.0543549
10 1 5.4 0 0 0.211437 1.63064 -0.0728897
11 2 4.05 1.35 1.35 -0.708573 -1.2552 0.0543549
12 2 6.75 1.35 1.35 -0.461807 -1.3955 -1.94959

View File

@ -0,0 +1,15 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
6
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z fx fy fz
1 1 2.7 2.7 0 -2.27066e-14 -1.33391e-14 2.31141e-14
2 2 1.35 4.05 1.35 2.35473 2.21578e-14 7.40069e-15
3 2 4.05 4.05 1.35 -2.35473 2.97071e-15 -2.01341e-14
4 1 2.7 1.65327e-16 2.7 -2.90278e-14 6.77422e-15 2.86766e-15
5 2 1.35 1.35 4.05 2.35473 5.79901e-15 -1.19594e-14
6 2 4.05 1.35 4.05 -2.35473 -1.38761e-14 1.09382e-14

View File

@ -0,0 +1,18 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
9
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.6199999999999999e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z fx fy fz
1 1 2.7 2.7 0 -1.27436e-13 0.760572 0.760572
2 2 1.35 4.05 1.35 0.682428 -0.329901 -0.329901
3 2 4.05 4.05 1.35 -0.682428 -0.329901 -0.329901
4 1 2.7 1.65327e-16 2.7 -8.06311e-14 -1.57101 -1.57101
5 2 1.35 1.35 4.05 2.79365 0.684734 0.684734
6 2 4.05 1.35 4.05 -2.79365 0.684734 0.684734
7 1 2.7 2.7 0 -1.30843e-13 0.760572 0.760572
8 2 1.35 4.05 1.35 0.682428 -0.329901 -0.329901
9 2 4.05 4.05 1.35 -0.682428 -0.329901 -0.329901

View File

@ -0,0 +1,21 @@
ITEM: TIMESTEP
0
ITEM: NUMBER OF ATOMS
12
ITEM: BOX BOUNDS xy xz yz pp pp pp
0.0000000000000000e+00 1.0800000000000001e+01 6.6130927153957075e-16
0.0000000000000000e+00 1.0800000000000001e+01 3.3065463576978537e-16
0.0000000000000000e+00 5.4000000000000004e+00 3.3065463576978537e-16
ITEM: ATOMS id type x y z fx fy fz
1 1 2.7 8.1 0 -0.433947 2.16479 1.55466
2 2 1.35 9.45 1.35 1.64718 -0.119006 0.375837
3 2 4.05 9.45 1.35 0.999862 -1.02573 0.037629
4 1 5.4 8.1 2.7 0.433947 2.16479 1.55466
5 2 4.05 9.45 4.05 -0.999862 -1.02573 0.037629
6 2 6.75 9.45 4.05 -1.64718 -0.119006 0.375837
7 1 2.7 1.65327e-16 2.7 -0.211437 1.63064 -0.0728897
8 2 1.35 1.35 4.05 0.461807 -1.3955 -1.94959
9 2 4.05 1.35 4.05 0.708573 -1.2552 0.0543549
10 1 5.4 0 0 0.211437 1.63064 -0.0728897
11 2 4.05 1.35 1.35 -0.708573 -1.2552 0.0543549
12 2 6.75 1.35 1.35 -0.461807 -1.3955 -1.94959

View File

@ -0,0 +1,15 @@
Noelem= 2
Element basis Numel Es Ep Ed Ef Mass HubbardU Wss Wpp Wdd Wff
U sdf 6.0 -4.08 0.0 0.816 -0.586 238.05078 9.0 0.0 0.0 0.0 0.0
O sp 6.0 -23.77 -8.85 0.0 0.0 15.994915 12.2 0.0 0.0 0.0 0.0
W spd 6.0 -4.52 0.53 -2.91 0.0 183.84 7.048 0.0 0.0 0.0 0.0
Mo sd 6.0 -3.29 0.0 -1.98 0.0 95.95 6.48 0.0 0.0 0.0 0.0
S sp 6.0 -14.00 -3.97 0.0 0.0 32.06 8.28 0.0 -0.4278 0.0 0.0
N sp 5.000000 -18.543798 -7.862407 0.000000 0.000000 14.006700 17.053958 0.000000 -0.6934 0.000000 0.000000
H s 1.000000 -6.237968 0.000000 0.000000 0.000000 1.007900 13.684855 -2.23400 0.000000 0.000000 0.000000
C sp 4.000000 -13.736556 -4.748938 0.000000 0.000000 12.010000 10.522540 0.000000 -0.618100 0.000000 0.000000
O sp 6.000000 -23.833752 -9.645001 0.000000 0.000000 15.999400 14.443874 0.000000 -0.757650 0.000000 0.000000

26
examples/QM/LATTE/in.aimd Normal file
View File

@ -0,0 +1,26 @@
# AIMD test of two UO2 molecules with LATTE in MDI stand-alone mode
units metal
atom_style full
atom_modify sort 0 0.0
read_data 2uo2.lmp
velocity all create 300.0 87287 loop geom
neighbor 1.0 bin
neigh_modify every 1 delay 0 check yes
timestep 0.00025
fix 1 all nve
fix 2 all mdi/qm virial yes elements 92 8
thermo_style custom step temp pe etotal press
thermo 1
dump 1 all custom 1 dump.aimd.mpi &
id type x y z vx vy vz fx fy fz
run 20

View File

@ -0,0 +1,27 @@
# AIMD test of two UO2 molecules with LATTE in MDI plugin mode
units metal
atom_style full
atom_modify sort 0 0.0
read_data 2uo2.lmp
velocity all create 300.0 87287 loop geom
neighbor 1.0 bin
neigh_modify every 1 delay 0 check yes
timestep 0.00025
fix 1 all nve
fix 2 all mdi/qm virial yes elements 92 8
thermo_style custom step temp pe etotal press
thermo 1
dump 1 all custom 1 dump.aimd.plugin &
id type x y z vx vy vz fx fy fz
mdi plugin latte_mdi mdi "-role ENGINE -name LATTE -method LINK" &
command "run 20"

View File

@ -0,0 +1,37 @@
# Series of single-point calcs of 2,3,4 UO2 molecules
# with LATTE in MDI stand-alone mode
variable files index 2uo2 3uo2 4uo2
mdi connect
label LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
timestep 0.001
fix 1 all mdi/qm virial yes elements 92 8 connect no
thermo_style custom step temp pe etotal press
thermo 1
run 0
write_dump all custom dump.series.mpi.${files} &
id type x y z fx fy fz modify sort id
clear
next files
jump SELF LOOP
mdi exit

View File

@ -0,0 +1,32 @@
# Series of single-point calcs of 2,3,4 UO2 molecules
# with LATTE in MDI plugin mode
variable files index 2uo2 3uo2 4uo2
label LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
fix 1 all mdi/qm virial yes elements 92 8
thermo_style custom step temp pe etotal press
thermo 1
mdi plugin latte_mdi mdi "-role ENGINE -name LATTE -method LINK" &
command "run 0"
write_dump all custom dump.series.plugin.${files} &
id type x y z fx fy fz modify sort id
clear
next files
jump SELF LOOP

67
examples/QM/LATTE/latte.in Executable file
View File

@ -0,0 +1,67 @@
#General controls
CONTROL{
XCONTROL= 1
BASISTYPE= NONORTHO
PARAMPATH= './'
SCLTYPE= TABLE
DEBUGON= 0
FERMIM= 6
CGORLIB= 1 CGTOL= 1.0e-6
KBT= 1.0
NORECS= 5
ENTROPYKIND= 1
PPOTON= 2 VDWON= 0
SPINON= 0 SPINTOL= 1.0e-4
ELECTRO= 1 ELECMETH= 0 ELEC_ETOL= 0.001 ELEC_QTOL= 1.0e-12
COULACC= 1.0e-6 COULCUT= -500.0 COULR1= 500.0
MAXSCF= 250
BREAKTOL= 1.0E-12 MINSP2ITER= 22 SP2CONV= REL
FULLQCONV= 1 QITER= 0
QMIX= 0.05 SPINMIX= 0.05 MDMIX= 0.05
#QMIX= 0.25 SPINMIX= 0.25 MDMIX= 0.25
ORDERNMOL= 0
SPARSEON= 0 THRESHOLDON= 1 NUMTHRESH= 1.0e-6 FILLINSTOP= 100 BLKSZ= 4
MSPARSE= 3000
LCNON= 0 LCNITER= 4 CHTOL= 0.01
SKIN= 1.0
RELAX= 0 RELAXTYPE= SD MAXITER= 100 RLXFTOL= 0.001
MDON= 1
PBCON= 1
RESTART= 0
CHARGE= 0
XBO= 1
XBODISON= 1
XBODISORDER= 5
NGPU= 2
KON= 0
COMPFORCE= 1
DOSFIT= 0 INTS2FIT= 1 BETA= 1000.0 NFITSTEP= 5000 QFIT= 0 MCSIGMA= 0.2
PPFITON= 0
ALLFITON= 0
PPSTEP= 500 BISTEP= 500 PP2FIT= 2 BINT2FIT= 6
PPBETA= 1000.0 PPSIGMA= 0.01 PPNMOL= 10 PPNGEOM= 200
PARREP= 0
ER= 1.0
#DOKERNEL= T
}
MDCONTROL{
MAXITER= 2000
UDNEIGH= 1
DT= 0.5
TEMPERATURE= 1.0e-10 RNDIST= GAUSSIAN SEEDINIT= UNIFORM
DUMPFREQ= 250
RSFREQ= 500
WRTFREQ= 1
TOINITTEMP5= 1
THERMPER= 500
THERMRUN= 50000
NVTON= 0 NPTON= 0 AVEPER= 1000 FRICTION= 1000.0 SEED= 54
PTARGET= 0.0 NPTTYPE= ISO
SHOCKON= 0
SHOCKSTART= 100000
SHOCKDIR= 1
UPARTICLE= 500.0 USHOCK= -4590.0 C0= 1300.0
MDADAPT= 0
GETHUG= 0 E0= -795.725 V0= 896.984864 P0= 0.083149
}

View File

@ -0,0 +1,102 @@
LAMMPS (23 Jun 2022)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
# AIMD test of two UO2 molecules with LATTE in MDI stand-alone mode
units metal
atom_style full
atom_modify sort 0 0.0
read_data 2uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (10.8 5.4 5.4) with tilt (3.3065464e-16 3.3065464e-16 3.3065464e-16)
1 by 1 by 1 MPI processor grid
reading atoms ...
6 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.003 seconds
velocity all create 300.0 87287 loop geom
neighbor 1.0 bin
neigh_modify every 1 delay 0 check yes
timestep 0.00025
fix 1 all nve
fix 2 all mdi/qm virial yes elements 92 8
thermo_style custom step temp pe etotal press
thermo 1
dump 1 all custom 1 dump.aimd.mpi id type x y z vx vy vz fx fy fz
run 20
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 10.8, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 6.489 | 6.489 | 6.489 Mbytes
Step Temp PotEng TotEng Press
0 300 -50.539035 -50.345145 -120197.6
1 307.57345 -50.544722 -50.345937 -120123.27
2 316.3757 -50.551342 -50.346868 -120035.12
3 326.39203 -50.558885 -50.347938 -119933.11
4 337.60559 -50.567341 -50.349146 -119817.17
5 349.99734 -50.576697 -50.350493 -119687.24
6 363.54606 -50.586939 -50.351979 -119543.23
7 378.22834 -50.598054 -50.353605 -119385.07
8 394.0186 -50.610024 -50.355369 -119212.67
9 410.88903 -50.622831 -50.357273 -119025.94
10 428.80963 -50.636457 -50.359317 -118824.77
11 447.74819 -50.65088 -50.3615 -118609.06
12 467.67027 -50.666079 -50.363823 -118378.7
13 488.53922 -50.68203 -50.366287 -118133.58
14 510.31617 -50.698708 -50.36889 -117873.58
15 532.96002 -50.716086 -50.371633 -117598.57
16 556.42747 -50.734137 -50.374517 -117308.44
17 580.67298 -50.75283 -50.377541 -117003.05
18 605.64879 -50.772136 -50.380705 -116682.27
19 631.30497 -50.792023 -50.38401 -116345.95
20 657.58937 -50.812455 -50.387454 -115993.97
Loop time of 3.40001 on 1 procs for 20 steps with 6 atoms
Performance: 0.127 ns/day, 188.889 hours/ns, 5.882 timesteps/s
100.0% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 1.2223e-05 | 1.2223e-05 | 1.2223e-05 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 6.0971e-05 | 6.0971e-05 | 6.0971e-05 | 0.0 | 0.00
Output | 0.0009257 | 0.0009257 | 0.0009257 | 0.0 | 0.03
Modify | 3.3989 | 3.3989 | 3.3989 | 0.0 | 99.97
Other | | 6.824e-05 | | | 0.00
Nlocal: 6 ave 6 max 6 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 2 ave 2 max 2 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
Total wall time: 0:00:03

View File

@ -0,0 +1,102 @@
LAMMPS (23 Jun 2022)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
# AIMD test of two UO2 molecules with LATTE in MDI stand-alone mode
units metal
atom_style full
atom_modify sort 0 0.0
read_data 2uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (10.8 5.4 5.4) with tilt (3.3065464e-16 3.3065464e-16 3.3065464e-16)
2 by 1 by 1 MPI processor grid
reading atoms ...
6 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.005 seconds
velocity all create 300.0 87287 loop geom
neighbor 1.0 bin
neigh_modify every 1 delay 0 check yes
timestep 0.00025
fix 1 all nve
fix 2 all mdi/qm virial yes elements 92 8
thermo_style custom step temp pe etotal press
thermo 1
dump 1 all custom 1 dump.aimd.mpi id type x y z vx vy vz fx fy fz
run 20
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 10.8, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 5.485 | 5.987 | 6.489 Mbytes
Step Temp PotEng TotEng Press
0 300 -50.539035 -50.345145 -120197.6
1 307.57345 -50.544722 -50.345937 -120123.27
2 316.3757 -50.551342 -50.346868 -120035.12
3 326.39203 -50.558885 -50.347938 -119933.11
4 337.60559 -50.567341 -50.349146 -119817.17
5 349.99734 -50.576697 -50.350493 -119687.24
6 363.54606 -50.586939 -50.351979 -119543.23
7 378.22834 -50.598054 -50.353605 -119385.07
8 394.0186 -50.610024 -50.355369 -119212.67
9 410.88903 -50.622831 -50.357273 -119025.94
10 428.80963 -50.636457 -50.359317 -118824.77
11 447.74819 -50.65088 -50.3615 -118609.06
12 467.67027 -50.666079 -50.363823 -118378.7
13 488.53922 -50.68203 -50.366287 -118133.58
14 510.31617 -50.698708 -50.36889 -117873.58
15 532.96002 -50.716086 -50.371633 -117598.57
16 556.42747 -50.734137 -50.374517 -117308.44
17 580.67298 -50.75283 -50.377541 -117003.05
18 605.64879 -50.772136 -50.380705 -116682.27
19 631.30497 -50.792023 -50.38401 -116345.95
20 657.58937 -50.812455 -50.387454 -115993.97
Loop time of 25.2055 on 2 procs for 20 steps with 6 atoms
Performance: 0.017 ns/day, 1400.306 hours/ns, 0.793 timesteps/s
99.9% CPU use with 2 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 1.746e-05 | 2.5213e-05 | 3.2966e-05 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 4.3862e-05 | 5.4267e-05 | 6.4671e-05 | 0.0 | 0.00
Output | 0.001642 | 0.0018189 | 0.0019957 | 0.4 | 0.01
Modify | 25.203 | 25.203 | 25.203 | 0.0 | 99.99
Other | | 0.000307 | | | 0.00
Nlocal: 3 ave 6 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 1
Nghost: 1 ave 2 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 1
Neighs: 0 ave 0 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
Total wall time: 0:00:26

View File

@ -0,0 +1,103 @@
LAMMPS (23 Jun 2022)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
# AIMD test of two UO2 molecules with LATTE in MDI plugin mode
units metal
atom_style full
atom_modify sort 0 0.0
read_data 2uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (10.8 5.4 5.4) with tilt (3.3065464e-16 3.3065464e-16 3.3065464e-16)
1 by 1 by 1 MPI processor grid
reading atoms ...
6 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.004 seconds
velocity all create 300.0 87287 loop geom
neighbor 1.0 bin
neigh_modify every 1 delay 0 check yes
timestep 0.00025
fix 1 all nve
fix 2 all mdi/qm virial yes elements 92 8
thermo_style custom step temp pe etotal press
thermo 1
dump 1 all custom 1 dump.aimd.plugin id type x y z vx vy vz fx fy fz
mdi plugin latte_mdi mdi "-role ENGINE -name LATTE -method LINK" command "run 20"
run 20
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 10.8, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 6.489 | 6.489 | 6.489 Mbytes
Step Temp PotEng TotEng Press
0 300 -50.539035 -50.345145 -120197.6
1 307.57345 -50.544722 -50.345937 -120123.27
2 316.3757 -50.551342 -50.346868 -120035.12
3 326.39203 -50.558885 -50.347938 -119933.11
4 337.60559 -50.567341 -50.349146 -119817.17
5 349.99734 -50.576697 -50.350493 -119687.24
6 363.54606 -50.586939 -50.351979 -119543.23
7 378.22834 -50.598054 -50.353605 -119385.07
8 394.0186 -50.610024 -50.355369 -119212.67
9 410.88903 -50.622831 -50.357273 -119025.94
10 428.80963 -50.636457 -50.359317 -118824.77
11 447.74819 -50.65088 -50.3615 -118609.06
12 467.67027 -50.666079 -50.363823 -118378.7
13 488.53922 -50.68203 -50.366287 -118133.58
14 510.31617 -50.698708 -50.36889 -117873.58
15 532.96002 -50.716086 -50.371633 -117598.57
16 556.42747 -50.734137 -50.374517 -117308.44
17 580.67298 -50.75283 -50.377541 -117003.05
18 605.64879 -50.772136 -50.380705 -116682.27
19 631.30497 -50.792023 -50.38401 -116345.95
20 657.58937 -50.812455 -50.387454 -115993.97
Loop time of 2.74435 on 1 procs for 20 steps with 6 atoms
Performance: 0.157 ns/day, 152.464 hours/ns, 7.288 timesteps/s
99.8% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 1.299e-05 | 1.299e-05 | 1.299e-05 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 7.9198e-05 | 7.9198e-05 | 7.9198e-05 | 0.0 | 0.00
Output | 0.001118 | 0.001118 | 0.001118 | 0.0 | 0.04
Modify | 2.743 | 2.743 | 2.743 | 0.0 | 99.95
Other | | 0.0001456 | | | 0.01
Nlocal: 6 ave 6 max 6 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 2 ave 2 max 2 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
Total wall time: 0:00:03

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,263 @@
LAMMPS (23 Jun 2022)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
# Series of single-point calcs of 2,3,4 UO2 molecules
# with LATTE in MDI stand-alone mode
variable files index 2uo2 3uo2 4uo2
mdi connect
label LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
read_data 2uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (10.8 5.4 5.4) with tilt (3.3065464e-16 3.3065464e-16 3.3065464e-16)
1 by 1 by 1 MPI processor grid
reading atoms ...
6 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.003 seconds
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
timestep 0.001
fix 1 all mdi/qm virial yes elements 92 8 connect no
thermo_style custom step temp pe etotal press
thermo 1
run 0
WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60)
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 10.8, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 5.238 | 5.238 | 5.238 Mbytes
Step Temp PotEng TotEng Press
0 0 -50.539035 -50.539035 -120855.2
Loop time of 1.397e-06 on 1 procs for 0 steps with 6 atoms
71.6% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 0 | 0 | 0 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0 | 0 | 0 | 0.0 | 0.00
Output | 0 | 0 | 0 | 0.0 | 0.00
Modify | 0 | 0 | 0 | 0.0 | 0.00
Other | | 1.397e-06 | | |100.00
Nlocal: 6 ave 6 max 6 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 2 ave 2 max 2 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
write_dump all custom dump.series.mpi.${files} id type x y z fx fy fz modify sort id
write_dump all custom dump.series.mpi.2uo2 id type x y z fx fy fz modify sort id
clear
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
next files
jump SELF LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
read_data 3uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (16.2 5.4 5.4) with tilt (3.3065464e-16 3.3065464e-16 3.3065464e-16)
1 by 1 by 1 MPI processor grid
reading atoms ...
9 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.002 seconds
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
timestep 0.001
fix 1 all mdi/qm virial yes elements 92 8 connect no
thermo_style custom step temp pe etotal press
thermo 1
run 0
WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60)
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 16.2, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 5.238 | 5.238 | 5.238 Mbytes
Step Temp PotEng TotEng Press
0 0 -78.155679 -78.155679 -99931.431
Loop time of 1.117e-06 on 1 procs for 0 steps with 9 atoms
89.5% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 0 | 0 | 0 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0 | 0 | 0 | 0.0 | 0.00
Output | 0 | 0 | 0 | 0.0 | 0.00
Modify | 0 | 0 | 0 | 0.0 | 0.00
Other | | 1.117e-06 | | |100.00
Nlocal: 9 ave 9 max 9 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 3 ave 3 max 3 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
write_dump all custom dump.series.mpi.${files} id type x y z fx fy fz modify sort id
write_dump all custom dump.series.mpi.3uo2 id type x y z fx fy fz modify sort id
clear
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
next files
jump SELF LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
read_data 4uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (10.8 10.8 5.4) with tilt (6.6130927e-16 3.3065464e-16 3.3065464e-16)
1 by 1 by 1 MPI processor grid
reading atoms ...
12 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.001 seconds
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
timestep 0.001
fix 1 all mdi/qm virial yes elements 92 8 connect no
thermo_style custom step temp pe etotal press
thermo 1
run 0
WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60)
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 10.8, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 5.238 | 5.238 | 5.238 Mbytes
Step Temp PotEng TotEng Press
0 0 -102.35713 -102.35713 -31036.168
Loop time of 1.466e-06 on 1 procs for 0 steps with 12 atoms
136.4% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 0 | 0 | 0 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0 | 0 | 0 | 0.0 | 0.00
Output | 0 | 0 | 0 | 0.0 | 0.00
Modify | 0 | 0 | 0 | 0.0 | 0.00
Other | | 1.466e-06 | | |100.00
Nlocal: 12 ave 12 max 12 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 5 ave 5 max 5 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
write_dump all custom dump.series.mpi.${files} id type x y z fx fy fz modify sort id
write_dump all custom dump.series.mpi.4uo2 id type x y z fx fy fz modify sort id
clear
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
next files
jump SELF LOOP
mdi exit
Total wall time: 0:00:02

View File

@ -0,0 +1,263 @@
LAMMPS (23 Jun 2022)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
# Series of single-point calcs of 2,3,4 UO2 molecules
# with LATTE in MDI stand-alone mode
variable files index 2uo2 3uo2 4uo2
mdi connect
label LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
read_data 2uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (10.8 5.4 5.4) with tilt (3.3065464e-16 3.3065464e-16 3.3065464e-16)
2 by 1 by 1 MPI processor grid
reading atoms ...
6 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.004 seconds
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
timestep 0.001
fix 1 all mdi/qm virial yes elements 92 8 connect no
thermo_style custom step temp pe etotal press
thermo 1
run 0
WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60)
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 10.8, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 5.234 | 5.236 | 5.238 Mbytes
Step Temp PotEng TotEng Press
0 0 -50.539035 -50.539035 -120855.2
Loop time of 1.956e-06 on 2 procs for 0 steps with 6 atoms
127.8% CPU use with 2 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 0 | 0 | 0 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0 | 0 | 0 | 0.0 | 0.00
Output | 0 | 0 | 0 | 0.0 | 0.00
Modify | 0 | 0 | 0 | 0.0 | 0.00
Other | | 1.956e-06 | | |100.00
Nlocal: 3 ave 6 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 1
Nghost: 1 ave 2 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 1
Neighs: 0 ave 0 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
write_dump all custom dump.series.mpi.${files} id type x y z fx fy fz modify sort id
write_dump all custom dump.series.mpi.2uo2 id type x y z fx fy fz modify sort id
clear
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
next files
jump SELF LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
read_data 3uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (16.2 5.4 5.4) with tilt (3.3065464e-16 3.3065464e-16 3.3065464e-16)
2 by 1 by 1 MPI processor grid
reading atoms ...
9 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.001 seconds
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
timestep 0.001
fix 1 all mdi/qm virial yes elements 92 8 connect no
thermo_style custom step temp pe etotal press
thermo 1
run 0
WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60)
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 16.2, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 5.234 | 5.236 | 5.238 Mbytes
Step Temp PotEng TotEng Press
0 0 -78.155679 -78.155679 -99931.431
Loop time of 2.375e-06 on 2 procs for 0 steps with 9 atoms
147.4% CPU use with 2 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 0 | 0 | 0 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0 | 0 | 0 | 0.0 | 0.00
Output | 0 | 0 | 0 | 0.0 | 0.00
Modify | 0 | 0 | 0 | 0.0 | 0.00
Other | | 2.375e-06 | | |100.00
Nlocal: 4.5 ave 9 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 1
Nghost: 1.5 ave 3 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 1
Neighs: 0 ave 0 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
write_dump all custom dump.series.mpi.${files} id type x y z fx fy fz modify sort id
write_dump all custom dump.series.mpi.3uo2 id type x y z fx fy fz modify sort id
clear
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
next files
jump SELF LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
read_data 4uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (10.8 10.8 5.4) with tilt (6.6130927e-16 3.3065464e-16 3.3065464e-16)
1 by 2 by 1 MPI processor grid
reading atoms ...
12 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.002 seconds
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
timestep 0.001
fix 1 all mdi/qm virial yes elements 92 8 connect no
thermo_style custom step temp pe etotal press
thermo 1
run 0
WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60)
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 10.8, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 5.238 | 5.238 | 5.238 Mbytes
Step Temp PotEng TotEng Press
0 0 -102.35713 -102.35713 -31036.168
Loop time of 2.4445e-06 on 2 procs for 0 steps with 12 atoms
122.7% CPU use with 2 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 0 | 0 | 0 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0 | 0 | 0 | 0.0 | 0.00
Output | 0 | 0 | 0 | 0.0 | 0.00
Modify | 0 | 0 | 0 | 0.0 | 0.00
Other | | 2.444e-06 | | |100.00
Nlocal: 6 ave 6 max 6 min
Histogram: 2 0 0 0 0 0 0 0 0 0
Nghost: 2.5 ave 4 max 1 min
Histogram: 1 0 0 0 0 0 0 0 0 1
Neighs: 0 ave 0 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
write_dump all custom dump.series.mpi.${files} id type x y z fx fy fz modify sort id
write_dump all custom dump.series.mpi.4uo2 id type x y z fx fy fz modify sort id
clear
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
next files
jump SELF LOOP
mdi exit
Total wall time: 0:00:08

View File

@ -0,0 +1,256 @@
LAMMPS (23 Jun 2022)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
# Series of single-point calcs of 2,3,4 UO2 molecules
# with LATTE in MDI plugin mode
variable files index 2uo2 3uo2 4uo2
label LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
read_data 2uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (10.8 5.4 5.4) with tilt (3.3065464e-16 3.3065464e-16 3.3065464e-16)
1 by 1 by 1 MPI processor grid
reading atoms ...
6 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.004 seconds
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
fix 1 all mdi/qm virial yes elements 92 8
thermo_style custom step temp pe etotal press
thermo 1
mdi plugin latte_mdi mdi "-role ENGINE -name LATTE -method LINK" command "run 0"
run 0
WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60)
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 10.8, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 5.238 | 5.238 | 5.238 Mbytes
Step Temp PotEng TotEng Press
0 0 -50.539035 -50.539035 -120855.2
Loop time of 1.396e-06 on 1 procs for 0 steps with 6 atoms
143.3% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 0 | 0 | 0 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0 | 0 | 0 | 0.0 | 0.00
Output | 0 | 0 | 0 | 0.0 | 0.00
Modify | 0 | 0 | 0 | 0.0 | 0.00
Other | | 1.396e-06 | | |100.00
Nlocal: 6 ave 6 max 6 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 2 ave 2 max 2 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
write_dump all custom dump.series.plugin.${files} id type x y z fx fy fz modify sort id
write_dump all custom dump.series.plugin.2uo2 id type x y z fx fy fz modify sort id
clear
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
next files
jump SELF LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
read_data 3uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (16.2 5.4 5.4) with tilt (3.3065464e-16 3.3065464e-16 3.3065464e-16)
1 by 1 by 1 MPI processor grid
reading atoms ...
9 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.002 seconds
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
fix 1 all mdi/qm virial yes elements 92 8
thermo_style custom step temp pe etotal press
thermo 1
mdi plugin latte_mdi mdi "-role ENGINE -name LATTE -method LINK" command "run 0"
run 0
WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60)
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 16.2, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 5.238 | 5.238 | 5.238 Mbytes
Step Temp PotEng TotEng Press
0 0 -78.155679 -78.155679 -99931.431
Loop time of 1.117e-06 on 1 procs for 0 steps with 9 atoms
89.5% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 0 | 0 | 0 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0 | 0 | 0 | 0.0 | 0.00
Output | 0 | 0 | 0 | 0.0 | 0.00
Modify | 0 | 0 | 0 | 0.0 | 0.00
Other | | 1.117e-06 | | |100.00
Nlocal: 9 ave 9 max 9 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 3 ave 3 max 3 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
write_dump all custom dump.series.plugin.${files} id type x y z fx fy fz modify sort id
write_dump all custom dump.series.plugin.3uo2 id type x y z fx fy fz modify sort id
clear
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
next files
jump SELF LOOP
units metal
atom_style full
atom_modify sort 0 0.0
read_data ${files}.lmp
read_data 4uo2.lmp
Reading data file ...
triclinic box = (0 0 0) to (10.8 10.8 5.4) with tilt (6.6130927e-16 3.3065464e-16 3.3065464e-16)
1 by 1 by 1 MPI processor grid
reading atoms ...
12 atoms
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.001 seconds
neighbor 0.3 bin
neigh_modify every 1 delay 0 check yes
fix 1 all mdi/qm virial yes elements 92 8
thermo_style custom step temp pe etotal press
thermo 1
mdi plugin latte_mdi mdi "-role ENGINE -name LATTE -method LINK" command "run 0"
run 0
WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60)
Neighbor list info ...
update every 1 steps, delay 0 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0
ghost atom cutoff = 0
binsize = 10.8, bins = 1 1 1
0 neighbor lists, perpetual/occasional/extra = 0 0 0
WARNING: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost. (src/comm_brick.cpp:210)
Per MPI rank memory allocation (min/avg/max) = 5.238 | 5.238 | 5.238 Mbytes
Step Temp PotEng TotEng Press
0 0 -102.35713 -102.35713 -31036.168
Loop time of 1.048e-06 on 1 procs for 0 steps with 12 atoms
190.8% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0 | 0 | 0 | 0.0 | 0.00
Bond | 0 | 0 | 0 | 0.0 | 0.00
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0 | 0 | 0 | 0.0 | 0.00
Output | 0 | 0 | 0 | 0.0 | 0.00
Modify | 0 | 0 | 0 | 0.0 | 0.00
Other | | 1.048e-06 | | |100.00
Nlocal: 12 ave 12 max 12 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 5 ave 5 max 5 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
write_dump all custom dump.series.plugin.${files} id type x y z fx fy fz modify sort id
write_dump all custom dump.series.plugin.4uo2 id type x y z fx fy fz modify sort id
clear
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
next files
jump SELF LOOP
Total wall time: 0:00:01

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,178 @@
3
U O
101
1.0000000000000000 53.452052832272599
1.0520000000000000 48.423668742582244
1.1040000000000001 43.721445018814535
1.1560000000000001 39.334296276283553
1.2080000000000000 35.251137130303420
1.2600000000000000 31.460882196188166
1.3120000000000001 27.952446089251964
1.3639999999999999 24.714743424808852
1.4159999999999999 21.736688818172937
1.4680000000000000 19.007196884658306
1.5200000000000000 16.515182239579076
1.5720000000000001 14.249559498249329
1.6240000000000001 12.199243275983154
1.6760000000000002 10.353148188094648
1.7280000000000000 8.7001888498979163
1.7800000000000000 7.2292798767070447
1.8320000000000001 5.9293358838361092
1.8839999999999999 4.7892714865992376
1.9359999999999999 3.7980013003104953
1.9880000000000000 2.9444399402839894
2.0400000000000000 2.2175020218338095
2.0920000000000001 1.6061021602740548
2.1440000000000001 1.0991549709188142
2.1960000000000002 0.68557506908218180
2.2480000000000002 0.35427707007825704
2.2999999999999998 9.4175589221130632E-002
2.3520000000000003 -0.10581475817510910
2.4039999999999999 -0.25677935679635860
2.4560000000000000 -0.36980359132853102
2.5080000000000000 -0.45596679597127698
2.5600000000000001 -0.52381995798172376
2.6120000000000001 -0.57548542297431915
2.6640000000000001 -0.61207888691334400
2.7160000000000002 -0.63471604576307783
2.7679999999999998 -0.64451259548780349
2.8200000000000003 -0.64258423205180126
2.8719999999999999 -0.63004665141935134
2.9240000000000004 -0.60801554955473625
2.9760000000000000 -0.57760662242223493
3.0280000000000000 -0.53993556598613002
3.0800000000000001 -0.49611807621070214
3.1320000000000001 -0.44726984906023193
3.1840000000000002 -0.39450658049900023
3.2359999999999998 -0.33894396649128961
3.2880000000000003 -0.28169770300137842
3.3399999999999999 -0.22388348599354982
3.3920000000000003 -0.16661701143208349
3.4440000000000000 -0.11101397528126161
3.4960000000000004 -5.8190073505363524E-002
3.5480000000000000 -9.2610020686722198E-003
3.6000000000000001 3.4657543064533058E-002
3.6519999999999997 7.2695102245010301E-002
3.7040000000000002 0.10496216108368017
3.7560000000000002 0.13181444150650151
3.8080000000000003 0.15360766543943441
3.8599999999999999 0.17069755480843840
3.9119999999999999 0.18343983153947352
3.9640000000000004 0.19219021755849935
4.0160000000000000 0.19730443479147558
4.0679999999999996 0.19913820516436204
4.1200000000000001 0.19804725060311840
4.1719999999999997 0.19438729303370450
4.2240000000000002 0.18851405438207983
4.2759999999999998 0.18078325657420447
4.3280000000000003 0.17155062153603778
4.3799999999999999 0.16117187119353987
4.4320000000000004 0.15000272747267010
4.4840000000000000 0.13839891229938861
4.5359999999999996 0.12671614759965491
4.5880000000000001 0.11531015529942858
4.6400000000000006 0.10450791010072910
4.6920000000000002 9.4401608127654982E-002
4.7439999999999998 8.4968801575229971E-002
4.7960000000000003 7.6186266463431560E-002
4.8480000000000008 6.8030778812237541E-002
4.9000000000000004 6.0479114641625663E-002
4.9520000000000000 5.3508049971573365E-002
5.0040000000000004 4.7094360822058187E-002
5.0560000000000000 4.1214823213057958E-002
5.1080000000000005 3.5846213164550077E-002
5.1600000000000001 3.0965306696512353E-002
5.2119999999999997 2.6548879828922314E-002
5.2640000000000002 2.2573708581757501E-002
5.3159999999999998 1.9016568974995669E-002
5.3680000000000003 1.5854237028614312E-002
5.4199999999999999 1.3063488762591162E-002
5.4719999999999995 1.0621100196903764E-002
5.5240000000000000 8.5038473515297100E-003
5.5760000000000005 6.6885062464466568E-003
5.6280000000000001 5.1518529016322447E-003
5.6799999999999997 3.8706633370640541E-003
5.7320000000000002 2.8217135727196876E-003
5.7840000000000007 1.9817796285767830E-003
5.8360000000000003 1.3276375246129659E-003
5.8879999999999999 8.3606328080583568E-004
5.9400000000000004 4.8383291713300426E-004
5.9920000000000009 2.4772245357209625E-004
6.0440000000000005 1.0450791010072858E-004
6.0960000000000001 3.0965306696512431E-005
6.1480000000000006 3.8706633370639547E-006
6.2000000000000002 0.0000000000000000
O O
20
0.59999999999999998 29923.073152218909
0.70000000000000007 4662.8666204588562
0.80000000000000004 849.06541460837946
0.90000000000000002 174.94775568214448
1.0000000000000000 39.499570511324919
1.1000000000000001 9.4630438308109763
1.2000000000000002 2.3294935751104737
1.3000000000000003 0.57058726754144162
1.4000000000000001 0.13466360499250576
1.5000000000000002 2.9654028763683022E-002
1.6000000000000001 5.9001110666872716E-003
1.7000000000000002 1.0271110256853976E-003
1.8000000000000003 1.5149315970664778E-004
1.9000000000000001 1.8332630772941197E-005
2.0000000000000000 1.7625863466525047E-006
2.1000000000000001 1.3037897449239816E-007
2.2000000000000002 7.1851191723432173E-009
2.3000000000000003 2.8567178835137876E-010
2.4000000000000004 7.9349720447872060E-012
2.5000000000000004 1.4910967552225071E-013
U U
50
0.10000000000000001 74348.981230147430
0.20000000000000001 40311.628875481227
0.30000000000000004 22512.215747793147
0.40000000000000002 12931.185562052075
0.50000000000000000 7629.3983056130000
0.59999999999999998 4617.1471175675460
0.70000000000000007 2862.1227331610016
0.80000000000000004 1814.8199558215895
0.90000000000000002 1175.4637167411634
1.0000000000000000 776.63138285251296
1.1000000000000001 522.69735907852555
1.2000000000000002 357.86149706462436
1.3000000000000003 248.89064787141209
1.4000000000000001 175.60252392080037
1.5000000000000002 125.51081146835013
1.6000000000000001 90.752660563379663
1.7000000000000002 66.292603562046978
1.8000000000000003 48.853749739571974
1.9000000000000001 36.270829284225563
2.0000000000000000 27.092149160250134
2.1000000000000001 20.330846347361575
2.2000000000000002 15.307107145388191
2.3000000000000003 11.546652254529212
2.4000000000000004 8.7145303726582952
2.5000000000000004 6.5713781993663156
2.6000000000000001 4.9441671799982290
2.7000000000000002 3.7064118746112378
2.8000000000000003 2.7646343058611356
2.9000000000000004 2.0490135318783476
3.0000000000000004 1.5068662861359490
3.1000000000000001 1.0980623443850352
3.2000000000000002 0.79177413418881881
3.3000000000000003 0.56415350027012756
3.4000000000000004 0.39665649152896415
3.5000000000000004 0.27482281511443302
3.6000000000000001 0.18737497023545538
3.7000000000000002 0.12554244470464804
3.8000000000000003 8.2544745767756542E-002
3.9000000000000004 5.3187278866042048E-002
4.0000000000000000 3.3538623216095062E-002
4.0999999999999996 2.0668142493140005E-002
4.2000000000000002 1.2430141080200409E-002
4.2999999999999998 7.2856566327403139E-003
4.3999999999999995 4.1560332011683883E-003
4.5000000000000000 2.3041281035584126E-003
4.5999999999999996 1.2397986929553748E-003
4.7000000000000002 6.4656516755885957E-004
4.7999999999999998 3.2635453161844339E-004
4.9000000000000004 1.5921458192287997E-004
5.0000000000000000 7.4970692168027886E-005

21
examples/QM/README Normal file
View File

@ -0,0 +1,21 @@
Each of the directories shows how to use LAMMPS in tandem with a
specific quantum code
LATTE = semi-empirical tight-binding code from LANL
https://www.osti.gov/biblio/1526907-los-alamos-transferable-tight-binding-energetics-latte-version
https://github.com/lanl/LATTE
To be added later (as of Aug 2022):
Quantum Espresso (QE) = DFT code for materials modeling
https://www.quantum-espresso.org/
DFT-FE = real-space DFT code from U Michigan
https://github.com/dftfeDevelopers/dftfe
INQ = DFT code from LLNL
https://github.com/LLNL/inq
NWChem = computational chemistry code from PNNL
focus here is on DFT portion of NWChem
https://www.nwchem-sw.org

View File

@ -189,6 +189,9 @@ corresponding doc page in the manual for more info. See the
https://docs.lammps.org/Build_package.html page for more info about
installing and building packages.
The QM directory has examples of how to use LAMMPS in tandem with
several quantum codes.
The TIP4P directory has an example for testing forces computed on a
GPU.

View File

@ -2,15 +2,17 @@ These are examples that work the MDI package in LAMMPS which uses the
MolSSI MDI library for coupling codes together and communicating
between them with MDI messages.
Within the MDI context, one code is the driver and another code is
the engine. The 2 codes can be written in any language; C++ (LAMMPS)
and Python are illustrated here. The 2 codes can each be stand-alone
codes, in which case they can be run on different numbers of processors.
The 2
codes can communicate either via TCP (sockets) or via MPI. For the
TCP case, the driver and engine need to be launched separately,
e.g. in 2 windows on your desktop machine. For the MPI case, a single
mpirun command launches both codes.
There are more examples of using LAMMPS with quantum codes via MDI in
the examples/QM directory.
Within the MDI context, one code is the driver and another code is the
engine. The 2 codes can be written in any language; C++ (LAMMPS) and
Python are illustrated here. The 2 codes can each be stand-alone
codes, in which case they can be run on different numbers of
processors. The 2 codes can communicate either via TCP (sockets) or
via MPI. For the TCP case, the driver and engine need to be launched
separately, e.g. in 2 windows on your desktop machine. For the MPI
case, a single mpirun command launches both codes.
Alternatively the engine code can be a plugin library which the driver
code loads, in which case the driver and engine run on the same
@ -19,17 +21,39 @@ processors.
LAMMPS supports operating in all these MDI modes. It can be an engine
operating either as a stand-alone code or as a plugin. It can also be
a driver and couple to an engine that is either a stand-alone code or
a plugin. Examples for all these use cases are in this directory.
The Run.sh file shows how run in all the modes. Type "sh Run.sh"
to try them all out.
a plugin.
To use LAMMPS as a plugin engine, you must build it as a shared
library. Something like this with make, which also builds the normal
LAMMPS executable lmp_mpi:
Examples for all these use cases, using LAMMPS as a driver and as an
engine are in this directory. The Run.sh file shows how run in all
the modes. Type "sh Run.sh" to try them all out.
cd src
make yes-mdi
make mode=shlib mpi
Examples for using LAMMPS as a driver with the tight-binding code
LATTE are in the examples/QM/LATTE sub-directory. See its README file
for more info.
-------------------------------------------------
Here is how to build LAMMPS with MDI support. Both as an executable
and a shared library. The former is needed to use LAMMPS as an MDI
driver or as an MDI engine in stand-alone mode. The latter is needed
to use LAMMPS as an MDI engine in plugin mode.
Build via regular make:
% cd lammps/src
% make lib-mdi args="-m mpi" # download, install MDI in lib/mdi w/ MPI support
% make yes-mdi # include MDI package in LAMMPS build
% make mode=shlib mpi # creates lmp_mpi and liblammps.so
Build via CMake:
cd lammps
mkdir build; cd build
cmake -D PKG_MDI=yes -D BUILD_SHARED_LIBS=yes ../cmake
make # creates lmp and liblammps.so
Both of these build procedures build LAMMPS both as an executable
(lmp_mpi) and as a shared library (liblammps.so).
-------------------------------------------------
@ -39,9 +63,9 @@ Python/mpi4py are using same the same version of MPI.
You will also need MDI installed in your Python. You cannot use the
LAMMPS build of the MDI library for this, b/c LAMMPS builds MDI as a
static library, not shared, which Python requires.
static library, while Python requires a shared library.
You can install MDI in your Python via conda:
Instead you can install MDI in your Python via conda:
% conda install -c conda-forge pymdi=1.4.1

View File

@ -316,6 +316,9 @@ class UCL_Device {
std::vector<CUstream> _cq;
CUdevice _cu_device;
CUcontext _context;
#if GERYON_NVD_PRIMARY_CONTEXT
CUcontext _old_context;
#endif
};
// Grabs the properties for all devices
@ -391,8 +394,14 @@ int UCL_Device::set_platform(const int pid) {
int UCL_Device::set(int num) {
clear();
_device=_properties[num].device_id;
#if GERYON_NVD_PRIMARY_CONTEXT
CU_SAFE_CALL_NS(cuCtxGetCurrent(&_old_context));
CU_SAFE_CALL_NS(cuDeviceGet(&_cu_device,_device));
CUresult err=cuDevicePrimaryCtxRetain(&_context,_cu_device);
#else
CU_SAFE_CALL_NS(cuDeviceGet(&_cu_device,_device));
CUresult err=cuCtxCreate(&_context,0,_cu_device);
#endif
if (err!=CUDA_SUCCESS) {
#ifndef UCL_NO_EXIT
std::cerr << "UCL Error: Could not access accelerator number " << num
@ -401,13 +410,23 @@ int UCL_Device::set(int num) {
#endif
return UCL_ERROR;
}
#if GERYON_NVD_PRIMARY_CONTEXT
if (_context != _old_context) {
CU_SAFE_CALL_NS(cuCtxSetCurrent(_context));
}
#endif
return UCL_SUCCESS;
}
void UCL_Device::clear() {
if (_device>-1) {
for (int i=1; i<num_queues(); i++) pop_command_queue();
cuCtxDestroy(_context);
#if GERYON_NVD_PRIMARY_CONTEXT
CU_SAFE_CALL_NS(cuCtxSetCurrent(_old_context));
CU_SAFE_CALL_NS(cuDevicePrimaryCtxRelease(_cu_device));
#else
cuCtxDestroy(_context));
#endif
}
_device=-1;
}

View File

@ -7,6 +7,13 @@
#define CUDA_INT_TYPE size_t
// Use the primary context for GPU access to enable compatibility with tools
// like OpenMPI accessing the GPU through the runtime interface.
// Set to 0 to revert to old behavior
#ifndef GERYON_NVD_PRIMARY_CONTEXT
#define GERYON_NVD_PRIMARY_CONTEXT 1
#endif
#ifdef MPI_GERYON
#include "mpi.h"
#define NVD_GERYON_EXIT do { \

View File

@ -27,19 +27,17 @@ specify -m and optionally -e, order does not matter
Examples:
make lib-poems args="-m serial" # build POEMS lib with same settings as in the serial Makefile in src
make lib-colvars args="-m mpi" # build COLVARS lib with same settings as in the mpi Makefile in src
make lib-meam args="-m ifort" # build MEAM lib with custom Makefile.ifort (using Intel Fortran)
make lib-mdi args="-m mpi" # build MDI lib with same settings as in the mpi Makefile in src
"""
# settings
version = "1.4.1"
version = "1.4.10"
url = "https://github.com/MolSSI-MDI/MDI_Library/archive/v%s.tar.gz" % version
# known checksums for different MDI versions. used to validate the download.
checksums = { \
'1.4.1' : 'f9505fccd4c79301a619f6452dad4ad9', \
'1.4.10' : '1c203b7fd462d9934834f643f09f3c06', \
}
# print error message or help

View File

@ -15,6 +15,10 @@
#include "atom.h"
#include "citeme.h"
#include "error.h"
#include "force.h"
#include "pair.h"
#include "pair_hybrid.h"
#include <cmath>
@ -87,6 +91,42 @@ AtomVecDielectric::AtomVecDielectric(LAMMPS *_lmp) : AtomVec(_lmp)
bond_per_atom = angle_per_atom = dihedral_per_atom = improper_per_atom = 0;
}
/* ---------------------------------------------------------------------- */
void AtomVecDielectric::init()
{
AtomVec::init();
// since atom style dielectric modifies the charge q, it will produce incorrect results
// with pair styles using coulomb without dielectric support.
std::string pair_style(force->pair_style);
if ((pair_style != "none") && (pair_style != "zero") && !utils::strmatch(force->pair_style,"/dielectric")) {
bool mismatch = false;
if (utils::strmatch(force->pair_style,"^reaxff")) mismatch = true;
if (utils::strmatch(force->pair_style,"^comb")) mismatch = true;
if (utils::strmatch(force->pair_style,"coul")) mismatch = true;
if (utils::strmatch(force->pair_style,"tip4p")) mismatch = true;
if (utils::strmatch(force->pair_style,"dipole")) mismatch = true;
if (utils::strmatch(force->pair_style,"^hybrid")) {
auto hybrid = dynamic_cast<PairHybrid *>(force->pair);
if (hybrid) {
for (int i = 0; i < hybrid->nstyles; i++) {
if (utils::strmatch(hybrid->keywords[i],"^reaxff")) mismatch = true;
if (utils::strmatch(hybrid->keywords[i],"^comb")) mismatch = true;
if (utils::strmatch(hybrid->keywords[i],"coul")) mismatch = true;
if (utils::strmatch(hybrid->keywords[i],"tip4p")) mismatch = true;
if (utils::strmatch(hybrid->keywords[i],"dipole")) mismatch = true;
}
}
}
if (mismatch)
error->all(FLERR, "Pair style {} is not compatible with atom style {}",
pair_style, atom->get_style());
}
}
/* ----------------------------------------------------------------------
set local copies of all grow ptrs used by this class, except defaults
needed in replicate when 2 atom classes exist and it calls pack_restart()

View File

@ -31,6 +31,7 @@ class AtomVecDielectric : public AtomVec {
public:
AtomVecDielectric(class LAMMPS *);
void init() override;
void grow_pointers() override;
void create_atom_post(int) override;
void data_atom_post(int) override;

View File

@ -38,6 +38,7 @@ static constexpr double EPSILON = 1.0e-6;
PairCoulCutDielectric::PairCoulCutDielectric(LAMMPS *_lmp) : PairCoulCut(_lmp), efield(nullptr)
{
nmax = 0;
no_virial_fdotr_compute = 1;
}
/* ---------------------------------------------------------------------- */

View File

@ -41,6 +41,7 @@ PairCoulLongDielectric::PairCoulLongDielectric(LAMMPS *_lmp) :
{
nmax = 0;
single_enable = 0;
no_virial_fdotr_compute = 1;
}
/* ---------------------------------------------------------------------- */

View File

@ -40,6 +40,7 @@ PairLJCutCoulCutDielectric::PairLJCutCoulCutDielectric(LAMMPS *_lmp) : PairLJCut
efield = nullptr;
epot = nullptr;
nmax = 0;
no_virial_fdotr_compute = 1;
}
/* ---------------------------------------------------------------------- */
@ -93,15 +94,16 @@ void PairLJCutCoulCutDielectric::compute(int eflag, int vflag)
for (ii = 0; ii < inum; ii++) {
i = ilist[ii];
qtmp = q[i];
etmp = eps[i];
xtmp = x[i][0];
ytmp = x[i][1];
ztmp = x[i][2];
etmp = eps[i];
itype = type[i];
jlist = firstneigh[i];
jnum = numneigh[i];
// self term Eq. (55) for I_{ii} and Eq. (52) and in Barros et al
double curvature_threshold = sqrt(area[i]);
if (curvature[i] < curvature_threshold) {
double sf = curvature[i] / (4.0 * MY_PIS * curvature_threshold) * area[i] * q[i];

View File

@ -40,6 +40,7 @@ PairLJCutCoulDebyeDielectric::PairLJCutCoulDebyeDielectric(LAMMPS *_lmp) : PairL
efield = nullptr;
epot = nullptr;
nmax = 0;
no_virial_fdotr_compute = 1;
}
/* ---------------------------------------------------------------------- */

View File

@ -45,6 +45,7 @@ PairLJCutCoulLongDielectric::PairLJCutCoulLongDielectric(LAMMPS *_lmp) : PairLJC
efield = nullptr;
epot = nullptr;
nmax = 0;
no_virial_fdotr_compute = 1;
}
/* ---------------------------------------------------------------------- */

View File

@ -47,6 +47,7 @@ PairLJCutCoulMSMDielectric::PairLJCutCoulMSMDielectric(LAMMPS *_lmp) : PairLJCut
nmax = 0;
ftmp = nullptr;
efield = nullptr;
no_virial_fdotr_compute = 1;
}
/* ---------------------------------------------------------------------- */

View File

@ -45,6 +45,7 @@ PairLJLongCoulLongDielectric::PairLJLongCoulLongDielectric(LAMMPS *_lmp) : PairL
efield = nullptr;
epot = nullptr;
nmax = 0;
no_virial_fdotr_compute = 1;
}
/* ----------------------------------------------------------------------

View File

@ -25,7 +25,7 @@ using namespace FixConst;
enum { NATIVE, REAL, METAL }; // LAMMPS units which MDI supports
#define MAXELEMENT 103 // used elsewhere in MDI package
#define MAXELEMENT 103 // used elsewhere in MDI package
/* ---------------------------------------------------------------------- */
@ -33,8 +33,7 @@ FixMDIQM::FixMDIQM(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg)
{
// check requirements for LAMMPS to work with MDI as an engine
if (atom->tag_enable == 0)
error->all(FLERR, "Cannot use MDI engine without atom IDs");
if (atom->tag_enable == 0) error->all(FLERR, "Cannot use MDI engine without atom IDs");
if (atom->natoms && atom->tag_consecutive() == 0)
error->all(FLERR, "MDI engine requires consecutive atom IDs");
@ -55,41 +54,51 @@ FixMDIQM::FixMDIQM(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg)
int iarg = 3;
while (iarg < narg) {
if (strcmp(arg[iarg],"virial") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix mdi/qm command");
if (strcmp(arg[iarg+1],"yes") == 0) virialflag = 1;
else if (strcmp(arg[iarg+1],"no") == 0) virialflag = 0;
else error->all(FLERR,"Illegal fix mdi/qm command");
if (strcmp(arg[iarg], "virial") == 0) {
if (iarg + 2 > narg) error->all(FLERR, "Illegal fix mdi/qm command");
if (strcmp(arg[iarg + 1], "yes") == 0)
virialflag = 1;
else if (strcmp(arg[iarg + 1], "no") == 0)
virialflag = 0;
else
error->all(FLERR, "Illegal fix mdi/qm command");
iarg += 2;
} else if (strcmp(arg[iarg],"add") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix mdi/qm command");
if (strcmp(arg[iarg+1],"yes") == 0) addflag = 1;
else if (strcmp(arg[iarg+1],"no") == 0) addflag = 0;
else error->all(FLERR,"Illegal fix mdi/qm command");
} else if (strcmp(arg[iarg], "add") == 0) {
if (iarg + 2 > narg) error->all(FLERR, "Illegal fix mdi/qm command");
if (strcmp(arg[iarg + 1], "yes") == 0)
addflag = 1;
else if (strcmp(arg[iarg + 1], "no") == 0)
addflag = 0;
else
error->all(FLERR, "Illegal fix mdi/qm command");
iarg += 2;
} else if (strcmp(arg[iarg],"every") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix mdi/qm command");
every = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
if (every <= 0) error->all(FLERR,"Illegal fix mdi/qm command");
} else if (strcmp(arg[iarg], "every") == 0) {
if (iarg + 2 > narg) error->all(FLERR, "Illegal fix mdi/qm command");
every = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
if (every <= 0) error->all(FLERR, "Illegal fix mdi/qm command");
iarg += 2;
} else if (strcmp(arg[iarg],"connect") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix mdi/qm command");
if (strcmp(arg[iarg+1],"yes") == 0) connectflag = 1;
else if (strcmp(arg[iarg+1],"no") == 0) connectflag = 0;
else error->all(FLERR,"Illegal fix mdi/qm command");
} else if (strcmp(arg[iarg], "connect") == 0) {
if (iarg + 2 > narg) error->all(FLERR, "Illegal fix mdi/qm command");
if (strcmp(arg[iarg + 1], "yes") == 0)
connectflag = 1;
else if (strcmp(arg[iarg + 1], "no") == 0)
connectflag = 0;
else
error->all(FLERR, "Illegal fix mdi/qm command");
iarg += 2;
} else if (strcmp(arg[iarg],"elements") == 0) {
} else if (strcmp(arg[iarg], "elements") == 0) {
int ntypes = atom->ntypes;
if (iarg+ntypes+1 > narg) error->all(FLERR,"Illegal fix mdi/qm command");
delete [] elements;
elements = new int[ntypes+1];
if (iarg + ntypes + 1 > narg) error->all(FLERR, "Illegal fix mdi/qm command");
delete[] elements;
elements = new int[ntypes + 1];
for (int i = 1; i <= ntypes; i++) {
elements[i] = utils::inumeric(FLERR,arg[iarg+i],false,lmp);
elements[i] = utils::inumeric(FLERR, arg[iarg + i], false, lmp);
if (elements[i] < 1 || elements[i] > MAXELEMENT)
error->all(FLERR,"Illegal fix mdi/qm command");
error->all(FLERR, "Illegal fix mdi/qm command");
}
iarg += ntypes+1;
} else error->all(FLERR,"Illegal fix mdi/qm command");
iarg += ntypes + 1;
} else
error->all(FLERR, "Illegal fix mdi/qm command");
}
// fix output settings are based on optional keywords
@ -217,26 +226,26 @@ void FixMDIQM::init()
plugin = 1;
int method;
MDI_Get_method(&method, mdicomm);
if (method != MDI_PLUGIN)
error->all(FLERR, "MDI internal error for plugin engine");
if (method != MDI_PLUGIN) error->all(FLERR, "MDI internal error for plugin engine");
}
// connection should have been already made by "mdi connect" command
// only works for stand-alone engines
// connection should have been already made by "mdi connect" command
// only works for stand-alone engines
} else {
plugin = 0;
if (lmp->mdicomm == nullptr)
error->all(FLERR,"Fix mdi/qm is not connected to engine via mdi connect");
error->all(FLERR, "Fix mdi/qm is not connected to engine via mdi connect");
int nbytes = sizeof(MDI_Comm);
char *ptrcomm = (char *) lmp->mdicomm;
memcpy(&mdicomm,ptrcomm,nbytes);
memcpy(&mdicomm, ptrcomm, nbytes);
}
}
// send natoms, atom types or elements, and simulation box to engine
// confirm engine count of NATOMS is correct
// this will trigger setup of a new system
// subsequent calls in post_force() will be for same system until new init()
@ -245,36 +254,41 @@ void FixMDIQM::init()
int natoms_exists;
int ierr = MDI_Check_command_exists("@DEFAULT", ">NATOMS", mdicomm, &natoms_exists);
if (ierr) error->all(FLERR, "MDI: >NATOMS command check");
if ( natoms_exists ) {
MPI_Bcast(&natoms_exists, 1, MPI_INT, 0, world);
if (natoms_exists) {
ierr = MDI_Send_command(">NATOMS", mdicomm);
if (ierr) error->all(FLERR, "MDI: >NATOMS command");
int n = static_cast<int> (atom->natoms);
int n = static_cast<int>(atom->natoms);
ierr = MDI_Send(&n, 1, MDI_INT, mdicomm);
if (ierr) error->all(FLERR, "MDI: >NATOMS data");
} else { // confirm that the engine's NATOMS is correct
} else {
ierr = MDI_Send_command("<NATOMS", mdicomm);
if (ierr) error->all(FLERR, "MDI: <NATOMS command");
int n;
ierr = MDI_Recv(&n, 1, MDI_INT, mdicomm);
if (ierr) error->all(FLERR, "MDI: <NATOMS data");
if ( n != atom->natoms ) error->all(FLERR, "MDI: Engine has the wrong number of atoms, and does not support the >NATOMS command.");
MPI_Bcast(&n, 1, MPI_INT, 0, world);
if (n != atom->natoms)
error->all(FLERR, "MDI: Engine has wrong atom count and does not support >NATOMS command");
}
int elements_exists;
int types_exists;
ierr = MDI_Check_command_exists("@DEFAULT", ">ELEMENTS", mdicomm, &elements_exists);
if (ierr) error->all(FLERR, "MDI: >ELEMENTS command check");
MPI_Bcast(&elements_exists, 1, MPI_INT, 0, world);
ierr = MDI_Check_command_exists("@DEFAULT", ">TYPES", mdicomm, &types_exists);
if (ierr) error->all(FLERR, "MDI: >TYPES command check");
if ( elements && elements_exists ) {
send_elements();
} else if ( types_exists ) {
send_types();
}
MPI_Bcast(&types_exists, 1, MPI_INT, 0, world);
if (elements && elements_exists)
send_elements();
else if (types_exists)
send_types();
send_box();
}
@ -301,8 +315,7 @@ void FixMDIQM::post_force(int vflag)
// if simulation box dynamically changes, send current box to MDI engine
if (domain->box_change_size || domain->box_change_shape)
send_box();
if (domain->box_change_size || domain->box_change_shape) send_box();
// gather all coords, ordered by atomID
@ -319,7 +332,7 @@ void FixMDIQM::post_force(int vflag)
buf3[3 * index + 2] = x[i][2] * lmp2mdi_length;
}
int n = static_cast<int> (atom->natoms);
int n = static_cast<int>(atom->natoms);
MPI_Reduce(buf3, buf3all, 3 * n, MPI_DOUBLE, MPI_SUM, 0, world);
// send current coords to MDI engine
@ -358,7 +371,6 @@ void FixMDIQM::post_force(int vflag)
fqm[i][2] = buf3[3 * index + 2] * mdi2lmp_force;
}
// optionally add forces to owned atoms
// use atomID of local atoms to index into ordered buf3
@ -372,7 +384,8 @@ void FixMDIQM::post_force(int vflag)
}
}
// optionally request stress tensor from MDI engine, convert to virial
// optionally request stress tensor from MDI engine, convert to 6-value virial
// MDI defines virial tensor as intensive (divided by volume), LAMMPS does not
// qm_virial = fix output for global QM virial
if (virialflag) {
@ -385,9 +398,9 @@ void FixMDIQM::post_force(int vflag)
qm_virial_symmetric[0] = qm_virial[0] * mdi2lmp_pressure;
qm_virial_symmetric[1] = qm_virial[4] * mdi2lmp_pressure;
qm_virial_symmetric[2] = qm_virial[8] * mdi2lmp_pressure;
qm_virial_symmetric[3] = 0.5*(qm_virial[1]+qm_virial[3]) * mdi2lmp_pressure;
qm_virial_symmetric[4] = 0.5*(qm_virial[2]+qm_virial[6]) * mdi2lmp_pressure;
qm_virial_symmetric[5] = 0.5*(qm_virial[5]+qm_virial[7]) * mdi2lmp_pressure;
qm_virial_symmetric[3] = 0.5 * (qm_virial[1] + qm_virial[3]) * mdi2lmp_pressure;
qm_virial_symmetric[4] = 0.5 * (qm_virial[2] + qm_virial[6]) * mdi2lmp_pressure;
qm_virial_symmetric[5] = 0.5 * (qm_virial[5] + qm_virial[7]) * mdi2lmp_pressure;
}
// optionally set fix->virial
@ -402,8 +415,7 @@ void FixMDIQM::post_force(int vflag)
volume = domain->xprd * domain->yprd;
else if (domain->dimension == 3)
volume = domain->xprd * domain->yprd * domain->zprd;
for (int i = 0; i < 6; i++)
virial[i] = qm_virial_symmetric[i]*volume/nprocs;
for (int i = 0; i < 6; i++) virial[i] = qm_virial_symmetric[i] * volume / nprocs;
}
}
@ -447,10 +459,9 @@ void FixMDIQM::reallocate()
if (atom->natoms > maxbuf) {
bigint nsize = atom->natoms * 3;
if (nsize > MAXSMALLINT)
error->all(FLERR, "Natoms too large to use with fix mdi/qm");
if (nsize > MAXSMALLINT) error->all(FLERR, "Natoms too large to use with fix mdi/qm");
maxbuf = static_cast<int> (atom->natoms);
maxbuf = static_cast<int>(atom->natoms);
memory->destroy(ibuf1);
memory->destroy(buf3);
memory->destroy(buf3all);
@ -467,7 +478,7 @@ void FixMDIQM::reallocate()
void FixMDIQM::send_types()
{
int n = static_cast<int> (atom->natoms);
int n = static_cast<int>(atom->natoms);
memset(ibuf1, 0, n * sizeof(int));
// use local atomID to index into ordered ibuf1
@ -496,7 +507,7 @@ void FixMDIQM::send_types()
void FixMDIQM::send_elements()
{
int n = static_cast<int> (atom->natoms);
int n = static_cast<int>(atom->natoms);
memset(ibuf1, 0, n * sizeof(int));
// use local atomID to index into ordered ibuf1
@ -530,7 +541,9 @@ void FixMDIQM::send_box()
int celldispl_exists;
int ierr = MDI_Check_command_exists("@DEFAULT", ">NATOMS", mdicomm, &celldispl_exists);
if (ierr) error->all(FLERR, "MDI: >CELL_DISPL command check");
if ( celldispl_exists ) {
MPI_Bcast(&celldispl_exists, 1, MPI_INT, 0, world);
if (celldispl_exists) {
ierr = MDI_Send_command(">CELL_DISPL", mdicomm);
if (ierr) error->all(FLERR, "MDI: >CELL_DISPL command");
cell[0] = domain->boxlo[0] * lmp2mdi_length;
@ -608,18 +621,17 @@ void FixMDIQM::unit_conversions()
mdi2lmp_force = angstrom_to_bohr / ev_to_hartree;
}
// pressure or stress units = force/area = energy/volume
// stress units = force/area = energy/volume
mdi2lmp_pressure = 1.0;
lmp2mdi_pressure = 1.0;
if (lmpunits == REAL) {
lmp2mdi_pressure = (kelvin_to_hartree / force->boltz) /
(angstrom_to_bohr * angstrom_to_bohr * angstrom_to_bohr) / force->nktv2p;
(angstrom_to_bohr * angstrom_to_bohr * angstrom_to_bohr);
mdi2lmp_pressure = 1.0 / lmp2mdi_pressure;
} else if (lmpunits == METAL) {
lmp2mdi_pressure =
ev_to_hartree / (angstrom_to_bohr * angstrom_to_bohr * angstrom_to_bohr) / force->nktv2p;
lmp2mdi_pressure = ev_to_hartree / (angstrom_to_bohr * angstrom_to_bohr * angstrom_to_bohr);
mdi2lmp_pressure = 1.0 / lmp2mdi_pressure;
}
}

View File

@ -40,7 +40,7 @@ class FixMDIQM : public Fix {
private:
int nprocs;
int every,virialflag,addflag,connectflag;
int every, virialflag, addflag, connectflag;
int plugin;
int maxlocal;
int sumflag;
@ -48,7 +48,7 @@ class FixMDIQM : public Fix {
double qm_energy;
int lmpunits;
double qm_virial[9],qm_virial_symmetric[6];
double qm_virial[9], qm_virial_symmetric[6];
double **fqm;
MDI_Comm mdicomm;

View File

@ -23,12 +23,8 @@
#define LAMMPS_LIB_MPI 1
#include "library.h"
#include "mdi_engine.h"
#include <cstring>
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
/** Initialize an instance of LAMMPS as an MDI plugin
@ -52,15 +48,16 @@ command-line argument, which must be provided by the MDI driver.
* \param class_obj pointer to an instance of an mdi/engine fix cast to ``void *``.
* \return 0 on no error. */
int MDI_Plugin_init_lammps()
int MDI_Plugin_init_lammps(void *plugin_state)
{
// initialize MDI
int mdi_argc;
char **mdi_argv;
if (MDI_Set_plugin_state(plugin_state)) MPI_Abort(MPI_COMM_WORLD, 1);
if (MDI_Plugin_get_argc(&mdi_argc)) MPI_Abort(MPI_COMM_WORLD, 1);
if (MDI_Plugin_get_argv(&mdi_argv)) MPI_Abort(MPI_COMM_WORLD, 1);
if (MDI_Init(&mdi_argc, &mdi_argv)) MPI_Abort(MPI_COMM_WORLD, 1);
// get the MPI intra-communicator for this code
@ -90,14 +87,23 @@ int MDI_Plugin_init_lammps()
if (!found_filename) MPI_Abort(MPI_COMM_WORLD, 1);
// create and run a LAMMPS instance
// lammps_open() expects a first arg (not used) which is executable name
// same as if called from main.cpp
// need to add an initial pseudo arg to mdi_argc & mdi_argv
// b/c lammps_open() expects first arg to be an executable name
// same as if it were called from main.cpp
int mdi_argc_extra = mdi_argc + 1;
char **mdi_argv_extra = new char *[mdi_argc_extra];
mdi_argv_extra[0] = (char *) "MDI_plugin_engine";
for (int i = 0; i < mdi_argc; i++) mdi_argv_extra[i + 1] = mdi_argv[i];
void *lmp = nullptr;
if (lammps_config_has_mpi_support() > 0)
lmp = lammps_open(mdi_argc + 1, &mdi_argv[-1], mpi_world_comm, nullptr);
lmp = lammps_open(mdi_argc_extra, mdi_argv_extra, mpi_world_comm, nullptr);
else
lmp = lammps_open_no_mpi(mdi_argc + 1, &mdi_argv[-1], nullptr);
lmp = lammps_open_no_mpi(mdi_argc_extra, mdi_argv_extra, nullptr);
delete[] mdi_argv_extra;
// process the specified input script
// must contain "mdi engine" command
@ -110,25 +116,3 @@ int MDI_Plugin_init_lammps()
return 0;
}
/* ---------------------------------------------------------------------- */
/** Execute an MDI command
*
\verbatim embed:rst
This function is called by the MolSSI Driver Interface Library (MDI)
when LAMMPS is run as a plugin, and should not otherwise be used.
The function executes a single command from an external MDI driver.
\endverbatim
* \param command string buffer corresponding to the command to be executed
* \param comm MDI communicator that can be used to communicated with the driver.
* \param class_obj pointer to an instance of an mdi/engine fix cast to ``void *``.
* \return 0 on no error, 1 on error. */
int lammps_execute_mdi_command(const char *command, MDI_Comm comm, void *class_obj)
{
auto mdi_engine = (MDIEngine *) class_obj;
return mdi_engine->execute_command(command, comm);
}

View File

@ -14,13 +14,12 @@
#ifndef LAMMPS_LIBRARY_MDI_H
#define LAMMPS_LIBRARY_MDI_H
/* C style library calls to LAMMPS when a LAMMPS shared library is
* used as a plugin through MolSSI Driver Interface (MDI). */
/* C style library call to LAMMPS when a LAMMPS shared library is
* used as a plugin through MolSSI Driver Interface (MDI) */
#include <mdi.h>
extern "C" {
int MDI_Plugin_init_lammps();
int lammps_execute_mdi_command(const char *, MDI_Comm, void *);
int MDI_Plugin_init_lammps(void *plugin_state);
}
#endif

View File

@ -44,7 +44,7 @@ void MDICommand::command(int narg, char **arg)
} else if (strcmp(arg[0], "connect") == 0) {
if (lmp->mdicomm != nullptr)
error->all(FLERR,"MDI cannot connect to already connected engine");
error->all(FLERR, "MDI cannot connect to already connected engine");
MDI_Comm mdicomm;
MDI_Get_communicator(&mdicomm, 0);
@ -53,23 +53,23 @@ void MDICommand::command(int narg, char **arg)
MDI_Accept_communicator(&mdicomm);
if (mdicomm == MDI_COMM_NULL)
error->all(FLERR, "MDI unable to connect to stand-alone engine");
} else error->all(FLERR, "Cannot use mdi connect with plugin engine");
} else
error->all(FLERR, "Cannot use mdi connect with plugin engine");
int nbytes = sizeof(MDI_Comm);
char *ptrcomm = (char *) memory->smalloc(nbytes,"mdi:mdicomm");
memcpy(ptrcomm,&mdicomm,nbytes);
char *ptrcomm = (char *) memory->smalloc(nbytes, "mdi:mdicomm");
memcpy(ptrcomm, &mdicomm, nbytes);
lmp->mdicomm = (void *) ptrcomm;
} else if (strcmp(arg[0], "exit") == 0) {
if (lmp->mdicomm == nullptr)
error->all(FLERR,"MDI cannot send exit to unconnected engine");
if (lmp->mdicomm == nullptr) error->all(FLERR, "MDI cannot send exit to unconnected engine");
MDI_Comm mdicomm;
int nbytes = sizeof(MDI_Comm);
char *ptrcomm = (char *) lmp->mdicomm;
memcpy(&mdicomm,ptrcomm,nbytes);
memcpy(&mdicomm, ptrcomm, nbytes);
int ierr = MDI_Send_command("EXIT", mdicomm);
if (ierr) error->all(FLERR, "MDI: EXIT command");
@ -77,5 +77,6 @@ void MDICommand::command(int narg, char **arg)
memory->sfree(ptrcomm);
lmp->mdicomm = nullptr;
} else error->all(FLERR, "Illegal mdi command");
} else
error->all(FLERR, "Illegal mdi command");
}

View File

@ -54,7 +54,7 @@ enum { DEFAULT, MD, OPT }; // top-level MDI engine modes
enum { TYPE, CHARGE, MASS, COORD, VELOCITY, FORCE, ADDFORCE };
#define MAXELEMENT 103 // used elsewhere in MDI package
#define MAXELEMENT 103 // used elsewhere in MDI package
/* ----------------------------------------------------------------------
trigger LAMMPS to start acting as an MDI engine
@ -65,7 +65,7 @@ enum { TYPE, CHARGE, MASS, COORD, VELOCITY, FORCE, ADDFORCE };
when EXIT command is received, mdi engine command exits
---------------------------------------------------------------------- */
MDIEngine::MDIEngine(LAMMPS *_lmp, int narg, char ** arg) : Pointers(_lmp)
MDIEngine::MDIEngine(LAMMPS *_lmp, int narg, char **arg) : Pointers(_lmp)
{
// check requirements for LAMMPS to work with MDI as an engine
@ -80,18 +80,19 @@ MDIEngine::MDIEngine(LAMMPS *_lmp, int narg, char ** arg) : Pointers(_lmp)
int iarg = 0;
while (iarg < narg) {
if (strcmp(arg[iarg],"elements") == 0) {
if (strcmp(arg[iarg], "elements") == 0) {
int ntypes = atom->ntypes;
delete [] elements;
elements = new int[ntypes+1];
if (iarg+ntypes+1 > narg) error->all(FLERR,"Illegal mdi engine command");
delete[] elements;
elements = new int[ntypes + 1];
if (iarg + ntypes + 1 > narg) error->all(FLERR, "Illegal mdi engine command");
for (int i = 1; i <= ntypes; i++) {
elements[i] = utils::inumeric(FLERR,arg[iarg+i],false,lmp);
elements[i] = utils::inumeric(FLERR, arg[iarg + i], false, lmp);
if (elements[i] < 0 || elements[i] > MAXELEMENT)
error->all(FLERR,"Illegal mdi engine command");
error->all(FLERR, "Illegal mdi engine command");
}
iarg += ntypes+1;
} else error->all(FLERR,"Illegal mdi engine command");
iarg += ntypes + 1;
} else
error->all(FLERR, "Illegal mdi engine command");
}
// error check an MDI element does not map to multiple atom types
@ -99,10 +100,10 @@ MDIEngine::MDIEngine(LAMMPS *_lmp, int narg, char ** arg) : Pointers(_lmp)
if (elements) {
int ntypes = atom->ntypes;
for (int i = 1; i < ntypes; i++)
for (int j = i+1; j <= ntypes; j++) {
for (int j = i + 1; j <= ntypes; j++) {
if (elements[i] == 0 || elements[j] == 0) continue;
if (elements[i] == elements[j])
error->all(FLERR,"MDI engine element cannot map to multiple types");
error->all(FLERR, "MDI engine element cannot map to multiple types");
}
}
@ -167,7 +168,7 @@ MDIEngine::MDIEngine(LAMMPS *_lmp, int narg, char ** arg) : Pointers(_lmp)
ibuf1 = ibuf1all = nullptr;
maxatom = 0;
sys_natoms = static_cast<int> (atom->natoms);
sys_natoms = static_cast<int>(atom->natoms);
reallocate();
nsteps = 0;
@ -184,10 +185,10 @@ MDIEngine::MDIEngine(LAMMPS *_lmp, int narg, char ** arg) : Pointers(_lmp)
mdi_commands();
// register the execute_command function with MDI
// only used when engine runs in plugin mode
// register a callback function with MDI used when engine runs in plugin mode
// execute_command_plugin_wrapper() must be a static method
MDI_Set_execute_command_func(lammps_execute_mdi_command, this);
MDI_Set_execute_command_func(execute_command_plugin_wrapper, this);
// one-time operation to establish a connection with the driver
@ -291,11 +292,22 @@ void MDIEngine::engine_node(const char *node)
node_match = true;
}
/* ----------------------------------------------------------------------
wrapper function on execute_command()
invoked as callback by MDI when engine operates in plugin mode
this is a static method in mdi_engine.h
---------------------------------------------------------------------- */
int MDIEngine::execute_command_plugin_wrapper(const char *command, MDI_Comm comm, void *class_obj)
{
auto mdi_engine = (MDIEngine *) class_obj;
return mdi_engine->execute_command(command, comm);
}
/* ----------------------------------------------------------------------
process a single driver command
called by engine_node() in loop
also called by MDI itself via lib::lammps_execute_mdi_command()
when LAMMPS is running as a plugin
called by engine_node() in loop when engine runs as stand-alone code
called by execute_command_plugin_wrapper() when engine runs as plugin lib
---------------------------------------------------------------------- */
int MDIEngine::execute_command(const char *command, MDI_Comm mdicomm)
@ -334,8 +346,7 @@ int MDIEngine::execute_command(const char *command, MDI_Comm mdicomm)
receive_coords();
} else if (strcmp(command, ">ELEMENTS") == 0) {
if (!elements)
error->all(FLERR,"MDI engine command did not define element list");
if (!elements) error->all(FLERR, "MDI engine command did not define element list");
receive_elements();
} else if (strcmp(command, ">FORCES") == 0) {
@ -362,7 +373,7 @@ int MDIEngine::execute_command(const char *command, MDI_Comm mdicomm)
else
receive_double3(VELOCITY);
// -----------------------------------------------
// -----------------------------------------------
} else if (strcmp(command, "<@") == 0) {
ierr = MDI_Send(node_engine, MDI_NAME_LENGTH, MDI_CHAR, mdicomm);
@ -411,9 +422,9 @@ int MDIEngine::execute_command(const char *command, MDI_Comm mdicomm)
} else if (strcmp(command, "<VELOCITIES") == 0) {
send_double3(VELOCITY);
// -----------------------------------------------
// -----------------------------------------------
// MDI action commands at @DEFAULT node
// MDI action commands at @DEFAULT node
} else if (strcmp(command, "MD") == 0) {
md();
@ -421,9 +432,9 @@ int MDIEngine::execute_command(const char *command, MDI_Comm mdicomm)
} else if (strcmp(command, "OPTG") == 0) {
optg();
// -----------------------------------------------
// -----------------------------------------------
// MDI node commands
// MDI node commands
} else if (strcmp(command, "@INIT_MD") == 0) {
if (mode != DEFAULT) error->all(FLERR, "MDI: MDI engine is already performing a simulation");
@ -458,14 +469,14 @@ int MDIEngine::execute_command(const char *command, MDI_Comm mdicomm)
strncpy(node_driver, command, MDI_COMMAND_LENGTH);
node_match = false;
// exit command
// exit command
} else if (strcmp(command, "EXIT") == 0) {
exit_command = true;
// -------------------------------------------------------
// custom LAMMPS commands
// -------------------------------------------------------
// -------------------------------------------------------
// custom LAMMPS commands
// -------------------------------------------------------
} else if (strcmp(command, "NBYTES") == 0) {
nbytes_command();
@ -478,9 +489,9 @@ int MDIEngine::execute_command(const char *command, MDI_Comm mdicomm)
} else if (strcmp(command, "<KE") == 0) {
send_ke();
// -------------------------------------------------------
// unknown command
// -------------------------------------------------------
// -------------------------------------------------------
// unknown command
// -------------------------------------------------------
} else {
error->all(FLERR, "MDI: Unknown command {} received from driver", command);
@ -998,9 +1009,9 @@ void MDIEngine::create_system()
// create list of 1 to sys_natoms IDs
// optionally set charges if specified by ">CHARGES"
tagint* sys_ids;
tagint *sys_ids;
memory->create(sys_ids, sys_natoms, "mdi:sys_ids");
for (int i = 0; i < sys_natoms; i++) sys_ids[i] = i+1;
for (int i = 0; i < sys_natoms; i++) sys_ids[i] = i + 1;
if (flag_velocities)
lammps_create_atoms(lmp, sys_natoms, sys_ids, sys_types, sys_coords, sys_velocities, nullptr,
@ -1148,9 +1159,16 @@ void MDIEngine::receive_cell()
for (int icell = 0; icell < 9; icell++) sys_cell[icell] *= mdi2lmp_length;
// error check that edge vectors match LAMMPS triclinic requirement
// 3,7,6 = xy, yz, xz tilt factors
if (sys_cell[1] != 0.0 || sys_cell[2] != 0.0 || sys_cell[5] != 0.0)
error->all(FLERR, "MDI: Received cell edges are not LAMMPS compatible");
error->all(FLERR, "MDI: Received cell edges are not an upper triangular matrix");
if (sys_cell[3] != 0.0 || sys_cell[7] != 0.0 || sys_cell[6] != 0.0)
if (!domain->triclinic)
error->all(FLERR,
"MDI: Received cell edges are for a triclinic box, "
"but LAMMPS is using an orthogonal box");
}
/* ----------------------------------------------------------------------
@ -1227,8 +1245,7 @@ void MDIEngine::receive_elements()
break;
}
}
if (itype > ntypes)
error->all(FLERR,"MDI element not found in element list");
if (itype > ntypes) error->all(FLERR, "MDI element not found in element list");
}
}
@ -1493,6 +1510,9 @@ void MDIEngine::send_pe()
/* ----------------------------------------------------------------------
<STRESS command
send 9-component stress tensor (no kinetic energy term)
should be intensive quantity (divided by volume in pressure compute)
MDI stress tensor units are energy/volume,
so conversion factor includes nktv2p to convert pressure back to virial
---------------------------------------------------------------------- */
void MDIEngine::send_stress()
@ -1837,6 +1857,8 @@ void MDIEngine::unit_conversions()
}
// pressure or stress units = force/area = energy/volume
// MDI energy/volume = Hartree/Bohr^3,
// so need to remove LAMMPS nktv2p from pressure
mdi2lmp_pressure = 1.0;
lmp2mdi_pressure = 1.0;

View File

@ -22,8 +22,6 @@ namespace LAMMPS_NS {
class MDIEngine : protected Pointers {
public:
MDIEngine(class LAMMPS *, int, char **);
int execute_command(const char *command, MDI_Comm mdicomm);
void engine_node(const char *node);
private:
@ -87,9 +85,13 @@ class MDIEngine : protected Pointers {
class Irregular *irregular; // irregular comm if new COORDS
// are highly displaced
// static method for MDI to callback to, when LAMMPS used as plugin engine
static int execute_command_plugin_wrapper(const char *, MDI_Comm, void *);
// class methods
void mdi_engine(int, char **);
int execute_command(const char *, MDI_Comm);
void mdi_commands();
void mdi_md();

View File

@ -72,18 +72,23 @@ MDIPlugin::MDIPlugin(LAMMPS *_lmp, int narg, char **arg) : Pointers(_lmp)
// error checks
if (!mdi_arg || !infile_arg || !lammps_command)
error->all(FLERR, "MDI plugin must specify mdi, infile, command keywords");
if (!mdi_arg || !lammps_command)
error->all(FLERR, "MDI plugin must specify mdi and command keywords");
// build full plugin_args string for args to plugin library
int n = strlen(mdi_arg) + strlen(infile_arg) + strlen(extra_arg) + 16;
int n = strlen(mdi_arg) + 16;
if (infile_arg) n += strlen(infile_arg);
if (extra_arg) n += strlen(extra_arg);
auto plugin_args = new char[n];
plugin_args[0] = 0;
strcat(plugin_args, "-mdi \"");
strcat(plugin_args, mdi_arg);
strcat(plugin_args, "\" -in ");
strcat(plugin_args, infile_arg);
strcat(plugin_args, "\"");
if (infile_arg) {
strcat(plugin_args, " -in ");
strcat(plugin_args, infile_arg);
}
if (extra_arg) {
strcat(plugin_args, " ");
strcat(plugin_args, extra_arg);
@ -91,7 +96,8 @@ MDIPlugin::MDIPlugin(LAMMPS *_lmp, int narg, char **arg) : Pointers(_lmp)
// launch the MDI plugin library
// path for lib was specified in -mdi command-line arg when LAMMPS started
// this calls back to plugin_wrapper, which must issue MDI EXIT at end
// this calls back to plugin_wrapper(), which issues MDI EXIT at end & returns
// plugin_wrapper() must be a static method
MDI_Launch_plugin(plugin_name, plugin_args, &world, plugin_wrapper, (void *) this);
@ -99,8 +105,9 @@ MDIPlugin::MDIPlugin(LAMMPS *_lmp, int narg, char **arg) : Pointers(_lmp)
}
/* ----------------------------------------------------------------------
callback function from MDI_Launch_plugin()
this function wraps entire interaction of LAMMPS driver with the plugin
wrapper on entire interaction of LAMMPS as a driver with the plugin engine
invoked as a callback by MDI once plugin library engine is launched
this is a static method in mdi_plugin.h
---------------------------------------------------------------------- */
int MDIPlugin::plugin_wrapper(void * /*pmpicomm*/, MDI_Comm mdicomm, void *vptr)

View File

@ -26,6 +26,9 @@ class MDIPlugin : protected Pointers {
private:
char *lammps_command;
// static method for MDI to callback to
// when LAMMPS is a driver which launches a plugin engine
static int plugin_wrapper(void *, MDI_Comm, void *);
};

View File

@ -23,6 +23,7 @@
#include "math_const.h"
#include "memory.h"
#include "neigh_list.h"
#include "suffix.h"
#include <cmath>
@ -37,6 +38,7 @@ static constexpr double EPSILON = 1.0e-6;
PairLJCutCoulCutDielectricOMP::PairLJCutCoulCutDielectricOMP(LAMMPS *_lmp) :
PairLJCutCoulCutDielectric(_lmp), ThrOMP(_lmp, THR_PAIR)
{
suffix_flag |= Suffix::OMP;
}
/* ---------------------------------------------------------------------- */
@ -99,7 +101,7 @@ void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const th
{
int i, j, ii, jj, jnum, itype, jtype;
double qtmp, etmp, xtmp, ytmp, ztmp, delx, dely, delz, evdwl, ecoul;
double fpair_i, fpair_j;
double fpair_i;
double rsq, r2inv, r6inv, forcecoul, forcelj, factor_coul, factor_lj;
double efield_i, epot_i;
int *ilist, *jlist, *numneigh, **firstneigh;
@ -130,10 +132,10 @@ void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const th
i = ilist[ii];
qtmp = q[i];
etmp = eps[i];
xtmp = x[i].x;
ytmp = x[i].y;
ztmp = x[i].z;
etmp = eps[i];
itype = type[i];
jlist = firstneigh[i];
jnum = numneigh[i];
@ -141,6 +143,7 @@ void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const th
extmp = eytmp = eztmp = 0.0;
// self term Eq. (55) for I_{ii} and Eq. (52) and in Barros et al
double curvature_threshold = sqrt(area[i]);
if (curvature[i] < curvature_threshold) {
double sf = curvature[i] / (4.0 * MY_PIS * curvature_threshold) * area[i] * q[i];
@ -151,7 +154,7 @@ void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const th
efield[i][0] = efield[i][1] = efield[i][2] = 0;
}
epot[i] = 0;
epot[i] = 0.0;
for (jj = 0; jj < jnum; jj++) {
j = jlist[jj];
@ -167,9 +170,10 @@ void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const th
if (rsq < cutsq[itype][jtype]) {
r2inv = 1.0 / rsq;
const double rinv = sqrt(r2inv);
if (rsq < cut_coulsq[itype][jtype] && rsq > EPSILON) {
efield_i = qqrd2e * q[j] * sqrt(r2inv);
efield_i = qqrd2e * q[j] * rinv;
forcecoul = qtmp * efield_i;
epot_i = efield_i;
} else
@ -182,7 +186,6 @@ void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const th
forcelj = 0.0;
fpair_i = (factor_coul * etmp * forcecoul + factor_lj * forcelj) * r2inv;
fxtmp += delx * fpair_i;
fytmp += dely * fpair_i;
fztmp += delz * fpair_i;
@ -193,29 +196,18 @@ void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const th
eztmp += delz * efield_i;
epot[i] += epot_i;
if (NEWTON_PAIR || j >= nlocal) {
fpair_j = (factor_coul * eps[j] * forcecoul + factor_lj * forcelj) * r2inv;
f[j].x -= delx * fpair_j;
f[j].y -= dely * fpair_j;
f[j].z -= delz * fpair_j;
}
if (EFLAG) {
if (rsq < cut_coulsq[itype][jtype]) {
ecoul = factor_coul * qqrd2e * qtmp * q[j] * (etmp + eps[j]) * sqrt(r2inv);
ecoul = factor_coul * qqrd2e * qtmp * q[j] * 0.5 * (etmp + eps[j]) * rinv;
} else
ecoul = 0.0;
ecoul *= 0.5;
if (rsq < cut_ljsq[itype][jtype]) {
evdwl = r6inv * (lj3[itype][jtype] * r6inv - lj4[itype][jtype]) - offset[itype][jtype];
evdwl *= factor_lj;
} else
evdwl = 0.0;
}
if (EVFLAG)
ev_tally_thr(this, i, j, nlocal, NEWTON_PAIR, evdwl, ecoul, fpair_i, delx, dely, delz,
thr);
if (EVFLAG) ev_tally_full_thr(this, i, evdwl, ecoul, fpair_i, delx, dely, delz, thr);
}
}
f[i].x += fxtmp;

View File

@ -23,6 +23,7 @@
#include "math_const.h"
#include "memory.h"
#include "neigh_list.h"
#include "suffix.h"
#include <cmath>
@ -37,6 +38,7 @@ static constexpr double EPSILON = 1.0e-6;
PairLJCutCoulDebyeDielectricOMP::PairLJCutCoulDebyeDielectricOMP(LAMMPS *_lmp) :
PairLJCutCoulDebyeDielectric(_lmp), ThrOMP(_lmp, THR_PAIR)
{
suffix_flag |= Suffix::OMP;
}
/* ---------------------------------------------------------------------- */
@ -99,7 +101,7 @@ void PairLJCutCoulDebyeDielectricOMP::eval(int iifrom, int iito, ThrData *const
{
int i, j, ii, jj, jnum, itype, jtype;
double qtmp, etmp, xtmp, ytmp, ztmp, delx, dely, delz, evdwl, ecoul;
double fpair_i, fpair_j;
double fpair_i;
double rsq, r2inv, r6inv, forcecoul, forcelj, factor_coul, factor_lj, efield_i, epot_i;
double r, rinv, screening;
int *ilist, *jlist, *numneigh, **firstneigh;
@ -185,7 +187,6 @@ void PairLJCutCoulDebyeDielectricOMP::eval(int iifrom, int iito, ThrData *const
forcelj = 0.0;
fpair_i = (factor_coul * etmp * forcecoul + factor_lj * forcelj) * r2inv;
fxtmp += delx * fpair_i;
fytmp += dely * fpair_i;
fztmp += delz * fpair_i;
@ -196,19 +197,11 @@ void PairLJCutCoulDebyeDielectricOMP::eval(int iifrom, int iito, ThrData *const
eztmp += delz * efield_i;
epot[i] += epot_i;
if (NEWTON_PAIR || j >= nlocal) {
fpair_j = (factor_coul * eps[j] * forcecoul + factor_lj * forcelj) * r2inv;
f[j].x -= delx * fpair_j;
f[j].y -= dely * fpair_j;
f[j].z -= delz * fpair_j;
}
if (EFLAG) {
if (rsq < cut_coulsq[itype][jtype]) {
ecoul = factor_coul * qqrd2e * qtmp * q[j] * (etmp + eps[j]) * rinv * screening;
ecoul = factor_coul * qqrd2e * qtmp * q[j] * 0.5 * (etmp + eps[j]) * rinv * screening;
} else
ecoul = 0.0;
ecoul *= 0.5;
if (rsq < cut_ljsq[itype][jtype]) {
evdwl = r6inv * (lj3[itype][jtype] * r6inv - lj4[itype][jtype]) - offset[itype][jtype];
evdwl *= factor_lj;
@ -216,9 +209,7 @@ void PairLJCutCoulDebyeDielectricOMP::eval(int iifrom, int iito, ThrData *const
evdwl = 0.0;
}
if (EVFLAG)
ev_tally_thr(this, i, j, nlocal, NEWTON_PAIR, evdwl, ecoul, fpair_i, delx, dely, delz,
thr);
if (EVFLAG) ev_tally_full_thr(this, i, evdwl, ecoul, fpair_i, delx, dely, delz, thr);
}
}
f[i].x += fxtmp;

View File

@ -24,6 +24,7 @@
#include "math_const.h"
#include "memory.h"
#include "neigh_list.h"
#include "suffix.h"
#include <cmath>
@ -39,6 +40,7 @@ static constexpr double EPSILON = 1.0e-6;
PairLJCutCoulLongDielectricOMP::PairLJCutCoulLongDielectricOMP(LAMMPS *_lmp) :
PairLJCutCoulLongDielectric(_lmp), ThrOMP(_lmp, THR_PAIR)
{
suffix_flag |= Suffix::OMP;
}
/* ---------------------------------------------------------------------- */
@ -229,10 +231,10 @@ void PairLJCutCoulLongDielectricOMP::eval(int iifrom, int iito, ThrData *const t
if (EFLAG) {
if (rsq < cut_coulsq) {
if (!ncoultablebits || rsq <= tabinnersq)
ecoul = prefactor * (etmp + eps[j]) * erfc;
ecoul = prefactor * 0.5 * (etmp + eps[j]) * erfc;
else {
table = etable[itable] + fraction * detable[itable];
ecoul = qtmp * q[j] * (etmp + eps[j]) * table;
ecoul = qtmp * q[j] * 0.5 * (etmp + eps[j]) * table;
}
if (factor_coul < 1.0) ecoul -= (1.0 - factor_coul) * prefactor;
} else

View File

@ -597,9 +597,8 @@ void ThrOMP::ev_tally_full_thr(Pair * const pair, const int i, const double evdw
const double ecoul, const double fpair, const double delx,
const double dely, const double delz, ThrData * const thr)
{
if (pair->eflag_either)
e_tally_thr(pair, i, i+1, i, 0, evdwl, ecoul, thr);
e_tally_thr(pair, i, /*j*/ i+1, /*nlocal*/ i+1, /*newton_pair*/ 0, evdwl, ecoul, thr);
if (pair->vflag_either) {
double v[6];
@ -610,7 +609,7 @@ void ThrOMP::ev_tally_full_thr(Pair * const pair, const int i, const double evdw
v[4] = delx*delz*fpair;
v[5] = dely*delz*fpair;
v_tally_thr(pair, i, i+1, i, 0, v, thr);
v_tally_thr(pair, i, /*j*/ i+1, /*nlocal*/ i+1, /*newton_pair*/ 0, v, thr);
}
if (pair->num_tally_compute > 0) {

View File

@ -24,6 +24,7 @@
#include "force.h"
#include "group.h"
#include "input.h"
#include "label_map.h"
#include "math_const.h"
#include "memory.h"
#include "modify.h"
@ -48,14 +49,15 @@ using namespace MathConst;
#define DELTA 1
#define EPSILON 1.0e-6
#define MAXLINE 256
/* ----------------------------------------------------------------------
one instance per AtomVec style in style_atom.h
------------------------------------------------------------------------- */
template <typename T> static AtomVec *avec_creator(LAMMPS *lmp)
template <typename T> static AtomVec *avec_creator(LAMMPS *_lmp)
{
return new T(lmp);
return new T(_lmp);
}
/* ---------------------------------------------------------------------- */
@ -85,9 +87,9 @@ are updated by the AtomVec class as needed.
* instances of classes derived from the AtomVec base
* class, which correspond to the selected atom style.
*
* \param lmp pointer to the base LAMMPS class */
* \param _lmp pointer to the base LAMMPS class */
Atom::Atom(LAMMPS *lmp) : Pointers(lmp)
Atom::Atom(LAMMPS *_lmp) : Pointers(_lmp)
{
natoms = 0;
nlocal = nghost = nmax = 0;
@ -222,6 +224,10 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp)
nmolecule = 0;
molecules = nullptr;
// type labels
lmap = nullptr;
// custom atom arrays
nivector = ndvector = niarray = ndarray = 0;
@ -339,6 +345,10 @@ Atom::~Atom()
for (int i = 0; i < nmolecule; i++) delete molecules[i];
memory->sfree(molecules);
// delete label map
delete lmap;
// delete per-type arrays
delete[] mass;
@ -616,6 +626,7 @@ void Atom::set_atomflag_defaults()
// 3rd customization section: customize by adding new flag
// identical list as 2nd customization in atom.h
labelmapflag = 0;
sphere_flag = ellipsoid_flag = line_flag = tri_flag = body_flag = 0;
quat_flag = 0;
peri_flag = electron_flag = 0;
@ -1032,24 +1043,34 @@ void Atom::deallocate_topology()
------------------------------------------------------------------------- */
void Atom::data_atoms(int n, char *buf, tagint id_offset, tagint mol_offset,
int type_offset, int shiftflag, double *shift)
int type_offset, int shiftflag, double *shift,
int labelflag, int *ilabel)
{
int xptr,iptr;
imageint imagedata;
double xdata[3],lamda[3];
double *coord;
char *next;
std::string typestr;
auto location = "Atoms section of data file";
// use the first line to detect and validate the number of words/tokens per line
next = strchr(buf,'\n');
if (!next) error->all(FLERR, "Missing data in Atoms section of data file");
if (!next) error->all(FLERR, "Missing data in {}", location);
*next = '\0';
int nwords = utils::trim_and_count_words(buf);
*next = '\n';
auto values = Tokenizer(buf).as_vector();
int nwords = values.size();
for (std::size_t i = 0; i < values.size(); ++i) {
if (utils::strmatch(values[i], "^#")) {
nwords = i;
break;
}
}
if ((nwords != avec->size_data_atom) && (nwords != avec->size_data_atom + 3))
error->all(FLERR,"Incorrect atom format in data file: {}", utils::trim(buf));
error->all(FLERR,"Incorrect format in {}: {}", location, utils::trim(buf));
*next = '\n';
// set bounds for my proc
// if periodic and I am lo/hi proc, adjust bounds by EPSILON
// insures all data atoms will be owned even with round-off
@ -1120,13 +1141,15 @@ void Atom::data_atoms(int n, char *buf, tagint id_offset, tagint mol_offset,
for (int i = 0; i < n; i++) {
next = strchr(buf,'\n');
if (!next) error->all(FLERR, "Missing data in Atoms section of data file");
if (!next) error->all(FLERR, "Missing data in {}", location);
*next = '\0';
auto values = Tokenizer(utils::trim_comment(buf)).as_vector();
if (values.size() == 0) {
auto values = Tokenizer(buf).as_vector();
int nvalues = values.size();
if ((nvalues == 0) || (utils::strmatch(values[0],"^#.*"))) {
// skip over empty or comment lines
} else if ((int)values.size() != nwords) {
error->all(FLERR, "Incorrect atom format in data file: {}", utils::trim(buf));
} else if ((nvalues < nwords) ||
((nvalues > nwords) && (!utils::strmatch(values[nwords],"^#")))) {
error->all(FLERR, "Incorrect format in {}: {}", location, utils::trim(buf));
} else {
int imx = 0, imy = 0, imz = 0;
if (imageflag) {
@ -1161,14 +1184,36 @@ void Atom::data_atoms(int n, char *buf, tagint id_offset, tagint mol_offset,
if (coord[0] >= sublo[0] && coord[0] < subhi[0] &&
coord[1] >= sublo[1] && coord[1] < subhi[1] &&
coord[2] >= sublo[2] && coord[2] < subhi[2]) {
avec->data_atom(xdata,imagedata,values);
avec->data_atom(xdata,imagedata,values,typestr);
typestr = utils::utf8_subst(typestr);
if (id_offset) tag[nlocal-1] += id_offset;
if (mol_offset) molecule[nlocal-1] += mol_offset;
if (type_offset) {
type[nlocal-1] += type_offset;
if (type[nlocal-1] > ntypes)
error->one(FLERR,"Invalid atom type in Atoms section of data file");
switch (utils::is_type(typestr)) {
case 0: { // numeric
int itype = utils::inumeric(FLERR, typestr, true, lmp) + type_offset;
if ((itype < 1) || (itype > ntypes))
error->one(FLERR, "Invalid atom type {} in {}: {}", itype, location,
utils::trim(buf));
type[nlocal - 1] = itype;
if (labelflag) type[nlocal - 1] = ilabel[itype - 1];
break;
}
case 1: { // type label
if (!atom->labelmapflag)
error->one(FLERR, "Invalid line in {}: {}", location, utils::trim(buf));
type[nlocal - 1] = lmap->find(typestr, Atom::ATOM);
if (type[nlocal - 1] == -1)
error->one(FLERR, "Invalid line in {}: {}", location, utils::trim(buf));
break;
}
default: // invalid
error->one(FLERR, "Invalid line in {}: {}", location, utils::trim(buf));
break;
}
if (type[nlocal-1] <= 0 || type[nlocal-1] > ntypes)
error->one(FLERR,"Invalid atom type {} in {}", location, typestr);
}
}
buf = next + 1;
@ -1217,41 +1262,64 @@ void Atom::data_vels(int n, char *buf, tagint id_offset)
------------------------------------------------------------------------- */
void Atom::data_bonds(int n, char *buf, int *count, tagint id_offset,
int type_offset)
int type_offset, int labelflag, int *ilabel)
{
int m,itype;
tagint atom1,atom2;
char *next;
std::string typestr;
int newton_bond = force->newton_bond;
auto location = "Bonds section of data file";
for (int i = 0; i < n; i++) {
next = strchr(buf,'\n');
if (!next) error->all(FLERR, "Missing data in Bonds section of data file");
if (!next) error->all(FLERR, "Missing data in {}", location);
*next = '\0';
ValueTokenizer values(utils::trim_comment(buf));
// skip over empty of comment lines
if (values.has_next()) {
try {
values.next_int();
itype = values.next_int();
atom1 = values.next_tagint();
atom2 = values.next_tagint();
if (values.has_next()) throw TokenizerException("Too many tokens","");
} catch (TokenizerException &e) {
error->one(FLERR,"{} in {}: {}", e.what(), location, utils::trim(buf));
auto values = Tokenizer(buf).as_vector();
int nwords = values.size();
for (std::size_t i = 0; i < values.size(); ++i) {
if (utils::strmatch(values[i], "^#")) {
nwords = i;
break;
}
}
// skip over empty or comment lines
// Bonds line is: number(ignored), bond type, atomID 1, atomID 2
if (nwords > 0) {
if (nwords != 4) error->all(FLERR, "Incorrect format in {}: {}", location, utils::trim(buf));
typestr = utils::utf8_subst(values[1]);
atom1 = utils::tnumeric(FLERR, values[2], false, lmp);
atom2 = utils::tnumeric(FLERR, values[3], false, lmp);
if (id_offset) {
atom1 += id_offset;
atom2 += id_offset;
}
itype += type_offset;
switch (utils::is_type(typestr)) {
case 0: { // numeric
itype = utils::inumeric(FLERR, typestr, false, lmp) + type_offset;
if ((itype < 1) || (itype > nbondtypes))
error->all(FLERR, "Invalid bond type {} in {}: {}", itype, location, utils::trim(buf));
if (labelflag) itype = ilabel[itype - 1];
break;
}
case 1: { // type label
if (!atom->labelmapflag) error->all(FLERR, "Invalid {}: {}", location, utils::trim(buf));
itype = lmap->find(typestr, Atom::BOND);
if (itype == -1) error->all(FLERR, "Invalid {}: {}", location, utils::trim(buf));
break;
}
default: // invalid
error->one(FLERR, "Invalid {}: {}", location, utils::trim(buf));
break;
}
if ((atom1 <= 0) || (atom1 > map_tag_max) ||
(atom2 <= 0) || (atom2 > map_tag_max) || (atom1 == atom2))
error->one(FLERR,"Invalid atom ID in {}: {}", location, utils::trim(buf));
if (itype <= 0 || itype > nbondtypes)
error->one(FLERR,"Invalid bond type in {}: {}", location, utils::trim(buf));
error->all(FLERR,"Invalid atom ID in {}: {}", location, utils::trim(buf));
if ((itype <= 0) || (itype > nbondtypes))
error->all(FLERR,"Invalid bond type {} in {}: {}", itype, location, utils::trim(buf));
if ((m = map(atom1)) >= 0) {
if (count) count[m]++;
else {
@ -1285,37 +1353,60 @@ void Atom::data_bonds(int n, char *buf, int *count, tagint id_offset,
------------------------------------------------------------------------- */
void Atom::data_angles(int n, char *buf, int *count, tagint id_offset,
int type_offset)
int type_offset, int labelflag, int *ilabel)
{
int m,itype;
tagint atom1,atom2,atom3;
char *next;
std::string typestr;
int newton_bond = force->newton_bond;
auto location = "Angles section of data file";
for (int i = 0; i < n; i++) {
next = strchr(buf,'\n');
if (!next) error->all(FLERR, "Missing data in Angles section of data file");
if (!next) error->all(FLERR, "Missing data in {}", location);
*next = '\0';
ValueTokenizer values(utils::trim_comment(buf));
// skip over empty or comment lines
if (values.has_next()) {
try {
values.next_int();
itype = values.next_int();
atom1 = values.next_tagint();
atom2 = values.next_tagint();
atom3 = values.next_tagint();
if (values.has_next()) throw TokenizerException("Too many tokens","");
} catch (TokenizerException &e) {
error->one(FLERR,"{} in {}: {}", e.what(), location, utils::trim(buf));
auto values = Tokenizer(buf).as_vector();
int nwords = values.size();
for (std::size_t i = 0; i < values.size(); ++i) {
if (utils::strmatch(values[i], "^#")) {
nwords = i;
break;
}
}
// skip over empty or comment lines
// Angles line is: number(ignored), angle type, atomID 1, atomID 2, atomID 3
if (nwords > 0) {
if (nwords != 5) error->all(FLERR, "Incorrect format in {}: {}", location, utils::trim(buf));
typestr = utils::utf8_subst(values[1]);
atom1 = utils::tnumeric(FLERR, values[2], false, lmp);
atom2 = utils::tnumeric(FLERR, values[3], false, lmp);
atom3 = utils::tnumeric(FLERR, values[4], false, lmp);
if (id_offset) {
atom1 += id_offset;
atom2 += id_offset;
atom3 += id_offset;
}
itype += type_offset;
switch (utils::is_type(typestr)) {
case 0: { // numeric
itype = utils::inumeric(FLERR, typestr, false, lmp) + type_offset;
if ((itype < 1) || (itype > nangletypes))
error->all(FLERR, "Invalid angle type {} in {}: {}", itype, location, utils::trim(buf));
if (labelflag) itype = ilabel[itype - 1];
break;
}
case 1: { // type label
if (!atom->labelmapflag) error->all(FLERR, "Invalid {}: {}", location, utils::trim(buf));
itype = lmap->find(typestr, Atom::ANGLE);
if (itype == -1) error->all(FLERR, "Invalid {}: {}", location, utils::trim(buf));
break;
}
default: // invalid
error->one(FLERR, "Invalid {}: {}", location, utils::trim(buf));
break;
}
if ((atom1 <= 0) || (atom1 > map_tag_max) ||
(atom2 <= 0) || (atom2 > map_tag_max) ||
@ -1323,7 +1414,7 @@ void Atom::data_angles(int n, char *buf, int *count, tagint id_offset,
(atom1 == atom2) || (atom1 == atom3) || (atom2 == atom3))
error->one(FLERR,"Invalid atom ID in {}: {}", location, utils::trim(buf));
if (itype <= 0 || itype > nangletypes)
error->one(FLERR,"Invalid angle type in {}: {}", location, utils::trim(buf));
error->one(FLERR,"Invalid angle type {} in {}: {}", itype, location, utils::trim(buf));
if ((m = map(atom2)) >= 0) {
if (count) count[m]++;
else {
@ -1369,39 +1460,63 @@ void Atom::data_angles(int n, char *buf, int *count, tagint id_offset,
------------------------------------------------------------------------- */
void Atom::data_dihedrals(int n, char *buf, int *count, tagint id_offset,
int type_offset)
int type_offset, int labelflag, int *ilabel)
{
int m,itype;
tagint atom1,atom2,atom3,atom4;
char *next;
std::string typestr;
int newton_bond = force->newton_bond;
auto location = "Dihedrals section of data file";
for (int i = 0; i < n; i++) {
next = strchr(buf,'\n');
if (!next) error->all(FLERR, "Missing data in Dihedrals section of data file");
if (!next) error->all(FLERR, "Missing data in {}", location);
*next = '\0';
ValueTokenizer values(utils::trim_comment(buf));
// skip over empty or comment lines
if (values.has_next()) {
try {
values.next_int();
itype = values.next_int();
atom1 = values.next_tagint();
atom2 = values.next_tagint();
atom3 = values.next_tagint();
atom4 = values.next_tagint();
if (values.has_next()) throw TokenizerException("Too many tokens","");
} catch (TokenizerException &e) {
error->one(FLERR,"{} in {}: {}", e.what(), location, utils::trim(buf));
auto values = Tokenizer(buf).as_vector();
int nwords = values.size();
for (std::size_t i = 0; i < values.size(); ++i) {
if (utils::strmatch(values[i], "^#")) {
nwords = i;
break;
}
}
// skip over empty or comment lines
// Dihedrals line is: number(ignored), bond type, atomID 1, atomID 2, atomID 3, atomID 4
if (nwords > 0) {
if (nwords != 6) error->all(FLERR, "Incorrect format in {}: {}", location, utils::trim(buf));
typestr = utils::utf8_subst(values[1]);
atom1 = utils::tnumeric(FLERR, values[2], false, lmp);
atom2 = utils::tnumeric(FLERR, values[3], false, lmp);
atom3 = utils::tnumeric(FLERR, values[4], false, lmp);
atom4 = utils::tnumeric(FLERR, values[5], false, lmp);
if (id_offset) {
atom1 += id_offset;
atom2 += id_offset;
atom3 += id_offset;
atom4 += id_offset;
}
itype += type_offset;
switch (utils::is_type(typestr)) {
case 0: { // numeric
itype = utils::inumeric(FLERR, typestr, false, lmp) + type_offset;
if ((itype < 1) || (itype > ndihedraltypes))
error->all(FLERR, "Invalid dihedral type {} in {}: {}", itype, location,
utils::trim(buf));
if (labelflag) itype = ilabel[itype - 1];
break;
}
case 1: { // type label
if (!atom->labelmapflag) error->all(FLERR, "Invalid {}: {}", location, utils::trim(buf));
itype = lmap->find(typestr, Atom::DIHEDRAL);
if (itype == -1) error->all(FLERR, "Invalid {}: {}", location, utils::trim(buf));
break;
}
default: // invalid
error->one(FLERR, "Invalid {}: {}", location, utils::trim(buf));
break;
}
if ((atom1 <= 0) || (atom1 > map_tag_max) ||
(atom2 <= 0) || (atom2 > map_tag_max) ||
@ -1411,7 +1526,7 @@ void Atom::data_dihedrals(int n, char *buf, int *count, tagint id_offset,
(atom2 == atom3) || (atom2 == atom4) || (atom3 == atom4))
error->one(FLERR, "Invalid atom ID in {}: {}", location, utils::trim(buf));
if (itype <= 0 || itype > ndihedraltypes)
error->one(FLERR, "Invalid dihedral type in {}: {}", location, utils::trim(buf));
error->one(FLERR, "Invalid dihedral type {} in {}: {}", itype, location, utils::trim(buf));
if ((m = map(atom2)) >= 0) {
if (count) count[m]++;
else {
@ -1471,39 +1586,63 @@ void Atom::data_dihedrals(int n, char *buf, int *count, tagint id_offset,
------------------------------------------------------------------------- */
void Atom::data_impropers(int n, char *buf, int *count, tagint id_offset,
int type_offset)
int type_offset, int labelflag, int *ilabel)
{
int m,itype;
tagint atom1,atom2,atom3,atom4;
char *next;
std::string typestr;
int newton_bond = force->newton_bond;
auto location = "Impropers section of data file";
for (int i = 0; i < n; i++) {
next = strchr(buf,'\n');
if (!next) error->all(FLERR, "Missing data in Impropers section of data file");
if (!next) error->all(FLERR, "Missing data in {}", location);
*next = '\0';
ValueTokenizer values(utils::trim_comment(buf));
// skip over empty or comment lines
if (values.has_next()) {
try {
values.next_int();
itype = values.next_int();
atom1 = values.next_tagint();
atom2 = values.next_tagint();
atom3 = values.next_tagint();
atom4 = values.next_tagint();
if (values.has_next()) throw TokenizerException("Too many tokens","");
} catch (TokenizerException &e) {
error->one(FLERR,"{} in {}: {}", e.what(), location, utils::trim(buf));
auto values = Tokenizer(buf).as_vector();
int nwords = values.size();
for (std::size_t i = 0; i < values.size(); ++i) {
if (utils::strmatch(values[i], "^#")) {
nwords = i;
break;
}
}
// skip over empty or comment lines
// Impropers line is: number(ignored), bond type, atomID 1, atomID 2, atomID 3, atomID 4
if (nwords > 0) {
if (nwords != 6) error->all(FLERR, "Incorrect format in {}: {}", location, utils::trim(buf));
typestr = utils::utf8_subst(values[1]);
atom1 = utils::tnumeric(FLERR, values[2], false, lmp);
atom2 = utils::tnumeric(FLERR, values[3], false, lmp);
atom3 = utils::tnumeric(FLERR, values[4], false, lmp);
atom4 = utils::tnumeric(FLERR, values[5], false, lmp);
if (id_offset) {
atom1 += id_offset;
atom2 += id_offset;
atom3 += id_offset;
atom4 += id_offset;
}
itype += type_offset;
switch (utils::is_type(typestr)) {
case 0: { // numeric
itype = utils::inumeric(FLERR, typestr, false, lmp) + type_offset;
if ((itype < 1) || (itype > nimpropertypes))
error->all(FLERR, "Invalid improper type {} in {}: {}", itype, location,
utils::trim(buf));
if (labelflag) itype = ilabel[itype - 1];
break;
}
case 1: { // type label
if (!atom->labelmapflag) error->all(FLERR, "Invalid {}: {}", location, utils::trim(buf));
itype = lmap->find(typestr, Atom::IMPROPER);
if (itype == -1) error->all(FLERR, "Invalid {}: {}", location, utils::trim(buf));
break;
}
default: // invalid
error->one(FLERR, "Invalid {}: {}", location, utils::trim(buf));
break;
}
if ((atom1 <= 0) || (atom1 > map_tag_max) ||
(atom2 <= 0) || (atom2 > map_tag_max) ||
@ -1513,7 +1652,7 @@ void Atom::data_impropers(int n, char *buf, int *count, tagint id_offset,
(atom2 == atom3) || (atom2 == atom4) || (atom3 == atom4))
error->one(FLERR, "Invalid atom ID in {}: {}", location, utils::trim(buf));
if (itype <= 0 || itype > nimpropertypes)
error->one(FLERR, "Invalid improper type in {}: {}", location, utils::trim(buf));
error->one(FLERR, "Invalid improper type {} in {}: {}", itype, location, utils::trim(buf));
if ((m = map(atom2)) >= 0) {
if (count) count[m]++;
else {
@ -1717,30 +1856,63 @@ void Atom::allocate_type_arrays()
called from reading of data file
type_offset may be used when reading multiple data files
------------------------------------------------------------------------- */
// clang-format on
void Atom::set_mass(const char *file, int line, const char *str, int type_offset)
void Atom::set_mass(const char *file, int line, const char *str, int type_offset, int labelflag,
int *ilabel)
{
if (mass == nullptr) error->all(file,line,"Cannot set mass for atom style {}", atom_style);
if (mass == nullptr) error->all(file, line, "Cannot set mass for atom style {}", atom_style);
int itype;
double mass_one;
ValueTokenizer values(utils::trim_comment(str));
if (values.has_next()) {
try {
itype = values.next_int() + type_offset;
mass_one = values.next_double();
if (values.has_next()) throw TokenizerException("Too many tokens", "");
auto location = "Masses section of data file";
auto values = Tokenizer(str).as_vector();
int nwords = values.size();
for (std::size_t i = 0; i < values.size(); ++i) {
if (utils::strmatch(values[i], "^#")) {
nwords = i;
break;
}
}
if (nwords != 2) error->all(file, line, "Invalid format in {}: {}", location, str);
auto typestr = utils::utf8_subst(values[0]);
if (itype < 1 || itype > ntypes) throw TokenizerException("Invalid atom type", "");
if (mass_one <= 0.0) throw TokenizerException("Invalid mass value", "");
} catch (TokenizerException &e) {
error->all(file,line,"{} in Masses section of data file: {}", e.what(), utils::trim(str));
switch (utils::is_type(typestr)) {
case 0: { // numeric
itype = utils::inumeric(file, line, typestr, false, lmp);
if ((itype < 1) || (itype > ntypes))
error->all(file, line, "Invalid atom type {} in {}: {}", itype, location, utils::trim(str));
if (labelflag) itype = ilabel[itype - 1];
break;
}
mass[itype] = mass_one;
mass_setflag[itype] = 1;
case 1: { // type label
if (!atom->labelmapflag)
error->all(file, line, "Invalid atom type in {}: {}", location, utils::trim(str));
itype = lmap->find(typestr, Atom::ATOM);
if (itype == -1)
error->all(file, line, "Unknown atom type {} in {}: {}", typestr, location,
utils::trim(str));
break;
}
default: // invalid
error->one(file, line, "Invalid {}: {}", location, utils::trim(str));
break;
}
itype += type_offset;
mass_one = utils::numeric(file, line, values[1], false, lmp);
if (itype < 1 || itype > ntypes)
error->all(file, line, "Invalid atom type {} in {}: {}", itype, location, utils::trim(str));
if (mass_one <= 0.0)
error->all(file, line, "Invalid mass value {} in {}: {}", mass_one, location, utils::trim(str));
mass[itype] = mass_one;
mass_setflag[itype] = 1;
}
// clang-format off
/* ----------------------------------------------------------------------
set a mass and flag it as set
@ -1765,15 +1937,20 @@ void Atom::set_mass(const char *file, int line, int itype, double value)
void Atom::set_mass(const char *file, int line, int /*narg*/, char **arg)
{
if (mass == nullptr) error->all(file,line, "Cannot set atom mass for atom style {}", atom_style);
if (mass == nullptr)
error->all(file,line, "Cannot set per-type atom mass for atom style {}", atom_style);
int lo,hi;
utils::bounds(file,line,arg[0],1,ntypes,lo,hi,error);
char *typestr = utils::expand_type(file, line, arg[0], Atom::ATOM, lmp);
if (typestr) arg[0] = typestr;
int lo, hi;
utils::bounds(file, line, arg[0], 1, ntypes, lo, hi, error);
if ((lo < 1) || (hi > ntypes))
error->all(file,line,"Invalid type {} for atom mass {}", arg[1]);
error->all(file, line, "Invalid atom type {} for atom mass", arg[0]);
const double value = utils::numeric(FLERR,arg[1],false,lmp);
if (value <= 0.0) error->all(file,line,"Invalid atom mass value {}", value);
const double value = utils::numeric(FLERR, arg[1], false, lmp);
if (value <= 0.0)
error->all(file, line, "Invalid atom mass value {} for type {}", value, arg[0]);
for (int itype = lo; itype <= hi; itype++) {
mass[itype] = value;
@ -2011,6 +2188,16 @@ void Atom::add_molecule_atom(Molecule *onemol, int iatom, int ilocal, tagint off
}
}
/* ----------------------------------------------------------------------
allocate space for type label map
------------------------------------------------------------------------- */
void Atom::add_label_map()
{
labelmapflag = 1;
lmap = new LabelMap(lmp,ntypes,nbondtypes,nangletypes,ndihedraltypes,nimpropertypes);
}
/* ----------------------------------------------------------------------
reorder owned atoms so those in firstgroup appear first
called by comm->exchange() if atom_modify first group is set

View File

@ -32,6 +32,8 @@ class Atom : protected Pointers {
enum { DOUBLE, INT, BIGINT };
enum { GROW = 0, RESTART = 1, BORDER = 2 };
enum { ATOMIC = 0, MOLECULAR = 1, TEMPLATE = 2 };
enum { ATOM = 0, BOND = 1, ANGLE = 2, DIHEDRAL = 3, IMPROPER = 4 };
enum { NUMERIC = 0, LABELS = 1};
enum { MAP_NONE = 0, MAP_ARRAY = 1, MAP_HASH = 2, MAP_YES = 3 };
// atom counts
@ -181,6 +183,7 @@ class Atom : protected Pointers {
// most are existence flags for per-atom vectors and arrays
// 1 if variable is used, 0 if not
int labelmapflag, types_style;
int sphere_flag, ellipsoid_flag, line_flag, tri_flag, body_flag;
int peri_flag, electron_flag;
int wavepacket_flag, sph_flag;
@ -251,6 +254,10 @@ class Atom : protected Pointers {
int nmolecule;
class Molecule **molecules;
// type label maps
class LabelMap *lmap;
// extra peratom info in restart file destined for fix & diag
double **extra;
@ -324,18 +331,19 @@ class Atom : protected Pointers {
void deallocate_topology();
void data_atoms(int, char *, tagint, tagint, int, int, double *);
void data_atoms(int, char *, tagint, tagint, int, int, double *,
int, int *);
void data_vels(int, char *, tagint);
void data_bonds(int, char *, int *, tagint, int);
void data_angles(int, char *, int *, tagint, int);
void data_dihedrals(int, char *, int *, tagint, int);
void data_impropers(int, char *, int *, tagint, int);
void data_bonds(int, char *, int *, tagint, int, int, int *);
void data_angles(int, char *, int *, tagint, int, int, int *);
void data_dihedrals(int, char *, int *, tagint, int, int, int *);
void data_impropers(int, char *, int *, tagint, int, int, int *);
void data_bonus(int, char *, AtomVec *, tagint);
void data_bodies(int, char *, AtomVec *, tagint);
void data_fix_compute_variable(int, int);
virtual void allocate_type_arrays();
void set_mass(const char *, int, const char *, int);
void set_mass(const char *, int, const char *, int, int, int *);
void set_mass(const char *, int, int, double);
void set_mass(const char *, int, int, char **);
void set_mass(double *);
@ -349,6 +357,8 @@ class Atom : protected Pointers {
std::vector<Molecule *>get_molecule_by_id(const std::string &);
void add_molecule_atom(class Molecule *, int, int, tagint);
void add_label_map();
void first_reorder();
virtual void sort();

View File

@ -19,6 +19,7 @@
#include "error.h"
#include "fix.h"
#include "force.h"
#include "label_map.h"
#include "math_const.h"
#include "memory.h"
#include "modify.h"
@ -1649,12 +1650,24 @@ void AtomVec::create_atom(int itype, double *coord)
atom->nlocal++;
}
/* ----------------------------------------------------------------------
version of data_atom without extract option
temporary fix for Kokkos compilation
------------------------------------------------------------------------- */
void AtomVec::data_atom(double *coord, imageint imagetmp, const std::vector<std::string> &values)
{
std::string strtmp;
data_atom(coord, imagetmp, values, strtmp);
}
/* ----------------------------------------------------------------------
unpack one line from Atoms section of data file
initialize other peratom quantities
------------------------------------------------------------------------- */
void AtomVec::data_atom(double *coord, imageint imagetmp, const std::vector<std::string> &values)
void AtomVec::data_atom(double *coord, imageint imagetmp, const std::vector<std::string> &values,
std::string &extract)
{
int m, n, datatype, cols;
void *pdata;
@ -1692,6 +1705,10 @@ void AtomVec::data_atom(double *coord, imageint imagetmp, const std::vector<std:
} else if (datatype == Atom::INT) {
if (cols == 0) {
int *vec = *((int **) pdata);
if (vec == atom->type) { // custom treatment of atom types
extract = values[ivalue++];
continue;
}
vec[nlocal] = utils::inumeric(FLERR, values[ivalue++], true, lmp);
} else {
int **array = *((int ***) pdata);
@ -1712,9 +1729,9 @@ void AtomVec::data_atom(double *coord, imageint imagetmp, const std::vector<std:
// error checks applicable to all styles
if (tag[nlocal] <= 0) error->one(FLERR, "Invalid atom ID in Atoms section of data file");
if (type[nlocal] <= 0 || type[nlocal] > atom->ntypes)
error->one(FLERR, "Invalid atom type in Atoms section of data file");
if (tag[nlocal] <= 0)
error->one(FLERR, "Invalid atom ID {} in line {} of Atoms section of data file",
tag[nlocal], nlocal+1);
// if needed, modify unpacked values or initialize other peratom values
@ -1806,7 +1823,10 @@ void AtomVec::write_data(FILE *fp, int n, double **buf)
}
} else if (datatype == Atom::INT) {
if (cols == 0) {
fmt::print(fp, " {}", ubuf(buf[i][j++]).i);
if (atom->types_style == Atom::LABELS &&
atom->peratom[mdata_atom.index[nn]].name == "type") {
fmt::print(fp," {}",atom->lmap->typelabel[ubuf(buf[i][j++]).i-1]);
} else fmt::print(fp, " {}", ubuf(buf[i][j++]).i);
} else {
for (m = 0; m < cols; m++) fmt::print(fp, " {}", ubuf(buf[i][j++]).i);
}
@ -2013,8 +2033,12 @@ int AtomVec::pack_bond(tagint **buf)
void AtomVec::write_bond(FILE *fp, int n, tagint **buf, int index)
{
std::string typestr;
for (int i = 0; i < n; i++) {
fmt::print(fp, "{} {} {} {}\n", index, buf[i][0], buf[i][1], buf[i][2]);
typestr = std::to_string(buf[i][0]);
if (atom->types_style == Atom::LABELS)
typestr = atom->lmap->btypelabel[buf[i][0]-1];
fmt::print(fp, "{} {} {} {}\n", index, typestr, buf[i][1], buf[i][2]);
index++;
}
}
@ -2075,8 +2099,13 @@ int AtomVec::pack_angle(tagint **buf)
void AtomVec::write_angle(FILE *fp, int n, tagint **buf, int index)
{
std::string typestr;
for (int i = 0; i < n; i++) {
fmt::print(fp, "{} {} {} {} {}\n", index, buf[i][0], buf[i][1], buf[i][2], buf[i][3]);
typestr = std::to_string(buf[i][0]);
if (atom->types_style == Atom::LABELS)
typestr = atom->lmap->atypelabel[buf[i][0]-1];
fmt::print(fp, "{} {} {} {} {}\n", index,
typestr, buf[i][1], buf[i][2], buf[i][3]);
index++;
}
}
@ -2135,9 +2164,13 @@ int AtomVec::pack_dihedral(tagint **buf)
void AtomVec::write_dihedral(FILE *fp, int n, tagint **buf, int index)
{
std::string typestr;
for (int i = 0; i < n; i++) {
fmt::print(fp, "{} {} {} {} {} {}\n", index, buf[i][0], buf[i][1], buf[i][2], buf[i][3],
buf[i][4]);
typestr = std::to_string(buf[i][0]);
if (atom->types_style == Atom::LABELS)
typestr = atom->lmap->dtypelabel[buf[i][0]-1];
fmt::print(fp, "{} {} {} {} {} {}\n", index, typestr,
buf[i][1], buf[i][2], buf[i][3], buf[i][4]);
index++;
}
}
@ -2196,9 +2229,13 @@ int AtomVec::pack_improper(tagint **buf)
void AtomVec::write_improper(FILE *fp, int n, tagint **buf, int index)
{
std::string typestr;
for (int i = 0; i < n; i++) {
fmt::print(fp, "{} {} {} {} {} {}\n", index, buf[i][0], buf[i][1], buf[i][2], buf[i][3],
buf[i][4]);
typestr = std::to_string(buf[i][0]);
if (atom->types_style == Atom::LABELS)
typestr = atom->lmap->itypelabel[buf[i][0]-1];
fmt::print(fp, "{} {} {} {} {} {}\n", index, typestr,
buf[i][1], buf[i][2], buf[i][3], buf[i][4]);
index++;
}
}

View File

@ -124,6 +124,7 @@ class AtomVec : protected Pointers {
virtual void create_atom_post(int) {}
virtual void data_atom(double *, imageint, const std::vector<std::string> &);
virtual void data_atom(double *, imageint, const std::vector<std::string> &, std::string &);
virtual void data_atom_post(int) {}
virtual void data_atom_bonus(int, const std::vector<std::string> &) {}
virtual void data_body(int, int, int, int *, double *) {}

View File

@ -108,46 +108,50 @@ void CreateBox::command(int narg, char **arg)
while (iarg < narg) {
if (strcmp(arg[iarg], "bond/types") == 0) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "create_box bond/type", error);
if (!atom->avec->bonds_allow) error->all(FLERR, "No bonds allowed with this atom style");
if (!atom->avec->bonds_allow)
error->all(FLERR, "No bonds allowed with atom style {}", atom->get_style());
atom->nbondtypes = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
iarg += 2;
} else if (strcmp(arg[iarg], "angle/types") == 0) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "create_box angle/types", error);
if (!atom->avec->angles_allow) error->all(FLERR, "No angles allowed with this atom style");
if (!atom->avec->angles_allow)
error->all(FLERR, "No angles allowed with atom style {}", atom->get_style());
atom->nangletypes = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
iarg += 2;
} else if (strcmp(arg[iarg], "dihedral/types") == 0) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "create_box dihedral/types", error);
if (!atom->avec->dihedrals_allow)
error->all(FLERR, "No dihedrals allowed with this atom style");
error->all(FLERR, "No dihedrals allowed with atom style {}", atom->get_style());
atom->ndihedraltypes = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
iarg += 2;
} else if (strcmp(arg[iarg], "improper/types") == 0) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "create_box improper/types", error);
if (!atom->avec->impropers_allow)
error->all(FLERR, "No impropers allowed with this atom style");
error->all(FLERR, "No impropers allowed with atom style {}", atom->get_style());
atom->nimpropertypes = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
iarg += 2;
} else if (strcmp(arg[iarg], "extra/bond/per/atom") == 0) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "create_box extra/bond/per/atom", error);
if (!atom->avec->bonds_allow) error->all(FLERR, "No bonds allowed with this atom style");
if (!atom->avec->bonds_allow)
error->all(FLERR, "No bonds allowed with atom style {}", atom->get_style());
atom->bond_per_atom = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
iarg += 2;
} else if (strcmp(arg[iarg], "extra/angle/per/atom") == 0) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "create_box extra/angle/per/atom", error);
if (!atom->avec->angles_allow) error->all(FLERR, "No angles allowed with this atom style");
if (!atom->avec->angles_allow)
error->all(FLERR, "No angles allowed with atom style {}", atom->get_style());
atom->angle_per_atom = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
iarg += 2;
} else if (strcmp(arg[iarg], "extra/dihedral/per/atom") == 0) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "create_box extra/dihedral/per/atom", error);
if (!atom->avec->dihedrals_allow)
error->all(FLERR, "No dihedrals allowed with this atom style");
error->all(FLERR, "No dihedrals allowed with atom style {}", atom->get_style());
atom->dihedral_per_atom = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
iarg += 2;
} else if (strcmp(arg[iarg], "extra/improper/per/atom") == 0) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "create_box extra/improper/per/atom", error);
if (!atom->avec->impropers_allow)
error->all(FLERR, "No impropers allowed with this atom style");
error->all(FLERR, "No impropers allowed with atom style {}", atom->get_style());
atom->improper_per_atom = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
iarg += 2;
} else if (strcmp(arg[iarg], "extra/special/per/atom") == 0) {

View File

@ -33,6 +33,7 @@
#include "improper.h"
#include "integrate.h"
#include "kspace.h"
#include "label_map.h"
#include "memory.h"
#include "min.h"
#include "modify.h"
@ -789,6 +790,7 @@ int Input::execute_command()
else if (!strcmp(command,"improper_style")) improper_style();
else if (!strcmp(command,"kspace_modify")) kspace_modify();
else if (!strcmp(command,"kspace_style")) kspace_style();
else if (!strcmp(command,"labelmap")) labelmap();
else if (!strcmp(command,"lattice")) lattice();
else if (!strcmp(command,"mass")) mass();
else if (!strcmp(command,"min_modify")) min_modify();
@ -1326,7 +1328,10 @@ void Input::angle_coeff()
error->all(FLERR,"Angle_coeff command before angle_style is defined");
if (atom->avec->angles_allow == 0)
error->all(FLERR,"Angle_coeff command when no angles allowed");
char *newarg = utils::expand_type(FLERR, arg[0], Atom::ANGLE, lmp);
if (newarg) arg[0] = newarg;
force->angle->coeff(narg,arg);
delete[] newarg;
}
/* ---------------------------------------------------------------------- */
@ -1367,7 +1372,10 @@ void Input::bond_coeff()
error->all(FLERR,"Bond_coeff command before bond_style is defined");
if (atom->avec->bonds_allow == 0)
error->all(FLERR,"Bond_coeff command when no bonds allowed");
char *newarg = utils::expand_type(FLERR, arg[0], Atom::BOND, lmp);
if (newarg) arg[0] = newarg;
force->bond->coeff(narg,arg);
delete[] newarg;
}
/* ---------------------------------------------------------------------- */
@ -1470,7 +1478,10 @@ void Input::dihedral_coeff()
error->all(FLERR,"Dihedral_coeff command before dihedral_style is defined");
if (atom->avec->dihedrals_allow == 0)
error->all(FLERR,"Dihedral_coeff command when no dihedrals allowed");
char *newarg = utils::expand_type(FLERR, arg[0], Atom::DIHEDRAL, lmp);
if (newarg) arg[0] = newarg;
force->dihedral->coeff(narg,arg);
delete[] newarg;
}
/* ---------------------------------------------------------------------- */
@ -1547,7 +1558,10 @@ void Input::improper_coeff()
error->all(FLERR,"Improper_coeff command before improper_style is defined");
if (atom->avec->impropers_allow == 0)
error->all(FLERR,"Improper_coeff command when no impropers allowed");
char *newarg = utils::expand_type(FLERR, arg[0], Atom::IMPROPER, lmp);
if (newarg) arg[0] = newarg;
force->improper->coeff(narg,arg);
delete[] newarg;
}
/* ---------------------------------------------------------------------- */
@ -1577,6 +1591,14 @@ void Input::kspace_style()
force->create_kspace(arg[0],1);
if (force->kspace) force->kspace->settings(narg-1,&arg[1]);
}
/* ---------------------------------------------------------------------- */
void Input::labelmap()
{
if (domain->box_exist == 0) error->all(FLERR,"Labelmap command before simulation box is defined");
if (!atom->labelmapflag) atom->add_label_map();
atom->lmap->modify_lmap(narg,arg);
}
/* ---------------------------------------------------------------------- */
@ -1676,14 +1698,12 @@ void Input::package()
} else if (strcmp(arg[0],"kokkos") == 0) {
if (lmp->kokkos == nullptr || lmp->kokkos->kokkos_exists == 0)
error->all(FLERR,
"Package kokkos command without KOKKOS package enabled");
error->all(FLERR, "Package kokkos command without KOKKOS package enabled");
lmp->kokkos->accelerator(narg-1,&arg[1]);
} else if (strcmp(arg[0],"omp") == 0) {
if (!modify->check_package("OMP"))
error->all(FLERR,
"Package omp command without OPENMP package installed");
error->all(FLERR, "Package omp command without OPENMP package installed");
std::string fixcmd = "package_omp all OMP";
for (int i = 1; i < narg; i++) fixcmd += std::string(" ") + arg[i];
@ -1691,14 +1711,13 @@ void Input::package()
} else if (strcmp(arg[0],"intel") == 0) {
if (!modify->check_package("INTEL"))
error->all(FLERR,
"Package intel command without INTEL package installed");
error->all(FLERR, "Package intel command without INTEL package installed");
std::string fixcmd = "package_intel all INTEL";
for (int i = 1; i < narg; i++) fixcmd += std::string(" ") + arg[i];
modify->add_fix(fixcmd);
} else error->all(FLERR,"Illegal package command");
} else error->all(FLERR,"Unknown package keyword: {}", arg[0]);
}
/* ---------------------------------------------------------------------- */
@ -1710,9 +1729,30 @@ void Input::pair_coeff()
if (force->pair == nullptr)
error->all(FLERR,"Pair_coeff command before pair_style is defined");
if ((narg < 2) || (force->pair->one_coeff && ((strcmp(arg[0],"*") != 0)
|| (strcmp(arg[1],"*") != 0))))
|| (strcmp(arg[1],"*") != 0))))
error->all(FLERR,"Incorrect args for pair coefficients");
char *newarg0 = utils::expand_type(FLERR, arg[0], Atom::ATOM, lmp);
if (newarg0) arg[0] = newarg0;
char *newarg1 = utils::expand_type(FLERR, arg[1], Atom::ATOM, lmp);
if (newarg1) arg[1] = newarg1;
// if arg[1] < arg[0], and neither contain a wildcard, reorder
int itype,jtype;
if (strchr(arg[0],'*') == nullptr && strchr(arg[1],'*') == nullptr) {
itype = utils::numeric(FLERR,arg[0],false,lmp);
jtype = utils::numeric(FLERR,arg[1],false,lmp);
if (jtype < itype) {
char *str = arg[0];
arg[0] = arg[1];
arg[1] = str;
}
}
force->pair->coeff(narg,arg);
delete[] newarg0;
delete[] newarg1;
}
/* ---------------------------------------------------------------------- */

View File

@ -34,12 +34,11 @@ class Input : protected Pointers {
Input(class LAMMPS *, int, char **);
~Input() override;
void file(); // process all input
void file(const char *); // process an input script
char *one(const std::string &); // process a single command
void substitute(char *&, char *&, int &, int &, int);
// substitute for variables in a string
void write_echo(const std::string &); // send text to active echo file pointers
void file(); // process all input
void file(const char *); // process an input script
char *one(const std::string &); // process a single command
void substitute(char *&, char *&, int &, int &, int); // substitute for variables in a string
void write_echo(const std::string &); // send text to active echo file pointers
protected:
char *command; // ptr to current command
@ -113,6 +112,7 @@ class Input : protected Pointers {
void improper_style();
void kspace_modify();
void kspace_style();
void labelmap();
void lattice();
void mass();
void min_modify();

489
src/label_map.cpp Normal file
View File

@ -0,0 +1,489 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "label_map.h"
#include "atom.h"
#include "comm.h"
#include "error.h"
#include "force.h"
#include "memory.h"
#include <cstring>
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
LabelMap::LabelMap(LAMMPS *_lmp, int _natomtypes, int _nbondtypes, int _nangletypes,
int _ndihedraltypes, int _nimpropertypes) :
Pointers(_lmp),
natomtypes(_natomtypes), nbondtypes(_nbondtypes), nangletypes(_nangletypes),
ndihedraltypes(_ndihedraltypes), nimpropertypes(_nimpropertypes)
{
lmap2lmap.atom = lmap2lmap.bond = lmap2lmap.angle = lmap2lmap.dihedral = lmap2lmap.improper =
nullptr;
reset_type_labels();
}
/* ---------------------------------------------------------------------- */
LabelMap::~LabelMap()
{
delete[] lmap2lmap.atom;
delete[] lmap2lmap.bond;
delete[] lmap2lmap.angle;
delete[] lmap2lmap.dihedral;
delete[] lmap2lmap.improper;
}
/* ----------------------------------------------------------------------
reset/allocate character-based type arrays (labels) of length ntypes
------------------------------------------------------------------------- */
void LabelMap::reset_type_labels()
{
typelabel_map.clear();
typelabel.resize(natomtypes);
delete[] lmap2lmap.atom;
lmap2lmap.atom = new int[natomtypes];
for (auto &i : typelabel) i.clear();
memset(lmap2lmap.atom, 0, natomtypes * sizeof(int));
btypelabel_map.clear();
btypelabel.resize(nbondtypes);
delete[] lmap2lmap.bond;
for (auto &i : btypelabel) i.clear();
lmap2lmap.bond = new int[nbondtypes];
memset(lmap2lmap.bond, 0, nbondtypes * sizeof(int));
atypelabel_map.clear();
atypelabel.resize(nangletypes);
delete[] lmap2lmap.angle;
for (auto &i : atypelabel) i.clear();
lmap2lmap.angle = new int[nangletypes];
memset(lmap2lmap.angle, 0, nangletypes * sizeof(int));
dtypelabel_map.clear();
dtypelabel.resize(ndihedraltypes);
delete[] lmap2lmap.dihedral;
for (auto &i : dtypelabel) i.clear();
lmap2lmap.dihedral = new int[ndihedraltypes];
memset(lmap2lmap.dihedral, 0, ndihedraltypes * sizeof(int));
itypelabel_map.clear();
itypelabel.resize(nimpropertypes);
delete[] lmap2lmap.improper;
for (auto &i : itypelabel) i.clear();
lmap2lmap.improper = new int[nimpropertypes];
memset(lmap2lmap.improper, 0, nimpropertypes * sizeof(int));
}
/* ----------------------------------------------------------------------
labelmap command in input script
------------------------------------------------------------------------- */
void LabelMap::modify_lmap(int narg, char **arg)
{
if ((narg < 1) || ((narg > 2) && ((narg % 2) == 0)))
error->all(FLERR, "Incorrect number of arguments for labelmap command");
int ntypes;
std::vector<std::string> *labels;
std::unordered_map<std::string, int> *labels_map;
const std::string tlabel(arg[0]);
if (tlabel == "atom") {
ntypes = natomtypes;
labels = &typelabel;
labels_map = &typelabel_map;
} else if (tlabel == "bond") {
ntypes = nbondtypes;
labels = &btypelabel;
labels_map = &btypelabel_map;
} else if (tlabel == "angle") {
ntypes = nangletypes;
labels = &atypelabel;
labels_map = &atypelabel_map;
} else if (tlabel == "dihedral") {
ntypes = ndihedraltypes;
labels = &dtypelabel;
labels_map = &dtypelabel_map;
} else if (tlabel == "improper") {
ntypes = nimpropertypes;
labels = &itypelabel;
labels_map = &itypelabel_map;
} else if (tlabel == "clear") {
if (narg != 1) error->all(FLERR, "Incorrect number of arguments for labelmap clear command");
reset_type_labels();
return;
} else if (tlabel == "write") {
if (narg != 2) error->all(FLERR, "Incorrect number of arguments for labelmap write command");
write_map(arg[1]);
return;
} else
error->all(FLERR, "Unknown labelmap keyword {}", tlabel);
int iarg = 1;
if (narg == 1) utils::missing_cmd_args(FLERR, "labelmap " + tlabel, error);
while (iarg < narg) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "labelmap " + tlabel, error);
if (ntypes < 1) error->all(FLERR, "No {} types allowed with current box settings", tlabel);
int itype = utils::inumeric(FLERR, arg[iarg++], false, lmp);
if ((itype < 1) || (itype > ntypes))
error->all(FLERR, "Labelmap {} type {} must be within 1-{}", tlabel, itype, ntypes);
std::string slabel = utils::utf8_subst(utils::trim(arg[iarg++]));
if (utils::is_type(slabel) != 1)
error->all(FLERR, "Type label string {} for {} type {} is invalid", slabel, tlabel, itype);
int found = search(slabel, (*labels_map));
if ((found != -1) && (found != itype))
error->all(FLERR, "The {} type label {} is already in use for type {}", tlabel, slabel,
(*labels_map)[slabel]);
std::string &str = (*labels)[itype - 1];
if (!str.empty()) (*labels_map).erase(str);
str = slabel;
(*labels_map)[slabel] = itype;
}
}
/* ----------------------------------------------------------------------
copy another map (lmap2) into this one
if label already exists, leave in place
else, put new label in next available slot
------------------------------------------------------------------------- */
void LabelMap::merge_lmap(LabelMap *lmap2, int mode)
{
switch (mode) {
case Atom::ATOM:
for (auto &it : lmap2->typelabel) find_or_create(it, typelabel, typelabel_map);
break;
case Atom::BOND:
for (auto &it : lmap2->btypelabel) find_or_create(it, btypelabel, btypelabel_map);
break;
case Atom::ANGLE:
for (auto &it : lmap2->atypelabel) find_or_create(it, atypelabel, atypelabel_map);
break;
case Atom::DIHEDRAL:
for (auto &it : lmap2->dtypelabel) find_or_create(it, dtypelabel, dtypelabel_map);
break;
case Atom::IMPROPER:
for (auto &it : lmap2->itypelabel) find_or_create(it, itypelabel, itypelabel_map);
break;
}
}
/* ----------------------------------------------------------------------
get mapping between this label map and another (lmap2)
values of lmap2lmap point to equivalent types in lmap2
------------------------------------------------------------------------- */
void LabelMap::create_lmap2lmap(LabelMap *lmap2, int mode)
{
switch (mode) {
case Atom::ATOM:
for (int i = 0; i < natomtypes; ++i)
lmap2lmap.atom[i] = search(typelabel[i], lmap2->typelabel_map);
break;
case Atom::BOND:
for (int i = 0; i < nbondtypes; ++i)
lmap2lmap.bond[i] = search(btypelabel[i], lmap2->btypelabel_map);
break;
case Atom::ANGLE:
for (int i = 0; i < nangletypes; ++i)
lmap2lmap.angle[i] = search(atypelabel[i], lmap2->atypelabel_map);
break;
case Atom::DIHEDRAL:
for (int i = 0; i < ndihedraltypes; ++i)
lmap2lmap.dihedral[i] = search(dtypelabel[i], lmap2->dtypelabel_map);
break;
case Atom::IMPROPER:
for (int i = 0; i < nimpropertypes; ++i)
lmap2lmap.improper[i] = search(itypelabel[i], lmap2->itypelabel_map);
break;
}
}
/* ----------------------------------------------------------------------
find type label with name or create type if it doesn't exist
return numeric type
------------------------------------------------------------------------- */
int LabelMap::find_or_create(const std::string &mylabel, std::vector<std::string> &labels,
std::unordered_map<std::string, int> &labels_map)
{
auto search = labels_map.find(mylabel);
if (search != labels_map.end()) return search->second;
// if no match found, create new label at next available index
// label map assumed to be intialized with numeric index
// user labels are assumed to be alphanumeric (not a number)
auto labels_map_size = labels_map.size();
if (labels_map_size < labels.size()) {
labels[labels_map_size] = mylabel;
int index = static_cast<int>(labels_map_size + 1);
labels_map[mylabel] = index;
return index;
}
// if label cannot be found or created, need more space reserved
error->all(FLERR, "Topology type exceeds system topology type");
// never reaches here, just to prevent compiler warning
return -1;
}
/* ----------------------------------------------------------------------
return numeric type given a type label
return -1 if type not yet defined
------------------------------------------------------------------------- */
int LabelMap::find(const std::string &mylabel, int mode) const
{
switch (mode) {
case Atom::ATOM:
return search(mylabel, typelabel_map);
break;
case Atom::BOND:
return search(mylabel, btypelabel_map);
break;
case Atom::ANGLE:
return search(mylabel, atypelabel_map);
break;
case Atom::DIHEDRAL:
return search(mylabel, dtypelabel_map);
break;
case Atom::IMPROPER:
return search(mylabel, itypelabel_map);
break;
default:
return -1;
}
}
/* ----------------------------------------------------------------------
get type given type labels map
return -1 if type not yet defined
------------------------------------------------------------------------- */
int LabelMap::search(const std::string &mylabel,
const std::unordered_map<std::string, int> &labels_map) const
{
auto search = labels_map.find(mylabel);
if (search == labels_map.end()) return -1;
return search->second;
}
/* ----------------------------------------------------------------------
check that all types have been assigned a unique type label
------------------------------------------------------------------------- */
bool LabelMap::is_complete(int mode) const
{
switch (mode) {
case Atom::ATOM:
return static_cast<int>(typelabel_map.size()) == natomtypes;
break;
case Atom::BOND:
return static_cast<int>(btypelabel_map.size()) == nbondtypes;
break;
case Atom::ANGLE:
return static_cast<int>(atypelabel_map.size()) == nangletypes;
break;
case Atom::DIHEDRAL:
return static_cast<int>(dtypelabel_map.size()) == ndihedraltypes;
break;
case Atom::IMPROPER:
return static_cast<int>(itypelabel_map.size()) == nimpropertypes;
break;
}
return false;
}
/* ----------------------------------------------------------------------
proc 0 writes to data file
------------------------------------------------------------------------- */
void LabelMap::write_data(FILE *fp)
{
if (is_complete(Atom::ATOM)) {
fmt::print(fp, "\nAtom Type Labels\n\n");
for (int i = 0; i < natomtypes; i++) fmt::print(fp, "{} {}\n", i + 1, typelabel[i]);
}
if (force->bond && is_complete(Atom::BOND)) {
fmt::print(fp, "\nBond Type Labels\n\n");
for (int i = 0; i < nbondtypes; i++) fmt::print(fp, "{} {}\n", i + 1, btypelabel[i]);
}
if (force->angle && is_complete(Atom::ANGLE)) {
fmt::print(fp, "\nAngle Type Labels\n\n");
for (int i = 0; i < nangletypes; i++) fmt::print(fp, "{} {}\n", i + 1, atypelabel[i]);
}
if (force->dihedral && is_complete(Atom::DIHEDRAL)) {
fmt::print(fp, "\nDihedral Type Labels\n\n");
for (int i = 0; i < ndihedraltypes; i++) fmt::print(fp, "{} {}\n", i + 1, dtypelabel[i]);
}
if (force->improper && is_complete(Atom::IMPROPER)) {
fmt::print(fp, "\nImproper Type Labels\n\n");
for (int i = 0; i < nimpropertypes; i++) fmt::print(fp, "{} {}\n", i + 1, itypelabel[i]);
}
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void LabelMap::read_restart(FILE *fp)
{
char *charlabel;
for (int i = 0; i < natomtypes; i++) {
charlabel = read_string(fp);
typelabel[i] = charlabel;
typelabel_map[charlabel] = i + 1;
delete[] charlabel;
}
for (int i = 0; i < nbondtypes; i++) {
charlabel = read_string(fp);
btypelabel[i] = charlabel;
btypelabel_map[charlabel] = i + 1;
delete[] charlabel;
}
for (int i = 0; i < nangletypes; i++) {
charlabel = read_string(fp);
atypelabel[i] = charlabel;
atypelabel_map[charlabel] = i + 1;
delete[] charlabel;
}
for (int i = 0; i < ndihedraltypes; i++) {
charlabel = read_string(fp);
dtypelabel[i] = charlabel;
dtypelabel_map[charlabel] = i + 1;
delete[] charlabel;
}
for (int i = 0; i < nimpropertypes; i++) {
charlabel = read_string(fp);
itypelabel[i] = charlabel;
itypelabel_map[charlabel] = i + 1;
delete[] charlabel;
}
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void LabelMap::write_restart(FILE *fp)
{
for (int i = 0; i < natomtypes; i++) write_string(typelabel[i], fp);
for (int i = 0; i < nbondtypes; i++) write_string(btypelabel[i], fp);
for (int i = 0; i < nangletypes; i++) write_string(atypelabel[i], fp);
for (int i = 0; i < ndihedraltypes; i++) write_string(dtypelabel[i], fp);
for (int i = 0; i < nimpropertypes; i++) write_string(itypelabel[i], fp);
}
/* ----------------------------------------------------------------------
read a char string (including nullptr) and bcast it
str is allocated here, ptr is returned, caller must deallocate
------------------------------------------------------------------------- */
char *LabelMap::read_string(FILE *fp)
{
int n = read_int(fp);
if (n < 0) error->all(FLERR, "Illegal size string or corrupt restart");
char *value = new char[n];
if (comm->me == 0) utils::sfread(FLERR, value, sizeof(char), n, fp, nullptr, error);
MPI_Bcast(value, n, MPI_CHAR, 0, world);
return value;
}
/* ----------------------------------------------------------------------
write a flag and a C-style char string (including the terminating null
byte) into the restart file
------------------------------------------------------------------------- */
void LabelMap::write_string(const std::string &str, FILE *fp)
{
const char *cstr = str.c_str();
int n = strlen(cstr) + 1;
fwrite(&n, sizeof(int), 1, fp);
fwrite(cstr, sizeof(char), n, fp);
}
/* ----------------------------------------------------------------------
read an int from restart file and bcast it
------------------------------------------------------------------------- */
int LabelMap::read_int(FILE *fp)
{
int value;
if ((comm->me == 0) && (fread(&value, sizeof(int), 1, fp) < 1)) value = -1;
MPI_Bcast(&value, 1, MPI_INT, 0, world);
return value;
}
/* ----------------------------------------------------------------------
write out all current label map values as labelmap commands
------------------------------------------------------------------------- */
void LabelMap::write_map(const std::string &filename)
{
if (comm->me == 0) {
FILE *fp = fopen(filename.c_str(), "w");
if (!fp) error->one(FLERR, "Cannot open label map file {}: {}", filename, utils::getsyserror());
if (typelabel_map.size() > 0) {
fputs("labelmap atom", fp);
for (int i = 0; i < natomtypes; ++i)
if (!typelabel[i].empty()) fmt::print(fp, " {} \"\"\" {} \"\"\"", i + 1, typelabel[i]);
fputc('\n', fp);
}
if (btypelabel_map.size() > 0) {
fputs("labelmap bond", fp);
for (int i = 0; i < nbondtypes; ++i)
if (!btypelabel[i].empty()) fmt::print(fp, " {} \"\"\" {} \"\"\"", i + 1, btypelabel[i]);
fputc('\n', fp);
}
if (atypelabel_map.size() > 0) {
fputs("labelmap angle", fp);
for (int i = 0; i < nangletypes; ++i)
if (!atypelabel[i].empty()) fmt::print(fp, " {} \"\"\" {} \"\"\"", i + 1, atypelabel[i]);
fputc('\n', fp);
}
if (dtypelabel_map.size() > 0) {
fputs("labelmap dihedral", fp);
for (int i = 0; i < ndihedraltypes; ++i)
if (!dtypelabel[i].empty()) fmt::print(fp, " {} \"\"\" {} \"\"\"", i + 1, dtypelabel[i]);
fputc('\n', fp);
}
if (itypelabel_map.size() > 0) {
fputs("labelmap improper", fp);
for (int i = 0; i < nimpropertypes; ++i)
if (!itypelabel[i].empty()) fmt::print(fp, " {} \"\"\" {} \"\"\"", i + 1, itypelabel[i]);
fputc('\n', fp);
}
fclose(fp);
}
}

78
src/label_map.h Normal file
View File

@ -0,0 +1,78 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifndef LMP_LABEL_MAP_H
#define LMP_LABEL_MAP_H
#include "pointers.h" // IWYU pragma: export
#include <unordered_map>
namespace LAMMPS_NS {
class LabelMap : protected Pointers {
friend class AtomVec;
friend class ReadData;
public:
LabelMap(LAMMPS *lmp, int, int, int, int, int);
~LabelMap();
void modify_lmap(int, char **); // labelmap command in the input script
void merge_lmap(LabelMap *, int); // copy another lmap into this one
void create_lmap2lmap(LabelMap *, int); // index mapping between two lmaps
int find(const std::string &, int) const; // find numeric type of type label
bool is_complete(int) const; // check if all types are assigned
// input/output for atom class label map
void write_data(FILE *);
void read_restart(FILE *fp);
void write_restart(FILE *);
protected:
int natomtypes, nbondtypes, nangletypes, ndihedraltypes, nimpropertypes;
std::vector<std::string> typelabel, btypelabel, atypelabel;
std::vector<std::string> dtypelabel, itypelabel;
std::unordered_map<std::string, int> typelabel_map;
std::unordered_map<std::string, int> btypelabel_map;
std::unordered_map<std::string, int> atypelabel_map;
std::unordered_map<std::string, int> dtypelabel_map;
std::unordered_map<std::string, int> itypelabel_map;
// per-type data struct mapping this label map to another
struct Lmap2Lmap {
int *atom;
int *bond;
int *angle;
int *dihedral;
int *improper;
};
Lmap2Lmap lmap2lmap;
void reset_type_labels();
int find_or_create(const std::string &, std::vector<std::string> &,
std::unordered_map<std::string, int> &); // look up type or create new type
int search(const std::string &,
const std::unordered_map<std::string, int> &) const; // look up type index
char *read_string(FILE *);
void write_string(const std::string &, FILE *);
int read_int(FILE *);
void write_map(const std::string &);
};
} // namespace LAMMPS_NS
#endif

View File

@ -37,8 +37,7 @@ enum{VERSION,SMALLINT,TAGINT,BIGINT,
COMM_MODE,COMM_CUTOFF,COMM_VEL,NO_PAIR,
EXTRA_BOND_PER_ATOM,EXTRA_ANGLE_PER_ATOM,EXTRA_DIHEDRAL_PER_ATOM,
EXTRA_IMPROPER_PER_ATOM,EXTRA_SPECIAL_PER_ATOM,ATOM_MAXSPECIAL,
NELLIPSOIDS,NLINES,NTRIS,NBODIES,
ATIME,ATIMESTEP};
NELLIPSOIDS,NLINES,NTRIS,NBODIES,ATIME,ATIMESTEP,LABELMAP};
#define LB_FACTOR 1.1

File diff suppressed because it is too large Load Diff

View File

@ -237,12 +237,10 @@ void Output::setup(int memflag)
last_dump[idump] = ntimestep;
}
// calculate timestep and/or time for next dump
// set next_dump and next_time_dump, 0 arg for setup()
// only do this if dump written or dump has not been written yet
// calculate timestep or time for next dump
// set next_dump and next_time_dump
if (writeflag || last_dump[idump] < 0)
calculate_next_dump(SETUP,idump,ntimestep);
calculate_next_dump(SETUP,idump,ntimestep);
// if dump not written now, use addstep_compute_all()
// since don't know what computes the dump will invoke
@ -261,322 +259,324 @@ void Output::setup(int memflag)
} else next_dump_any = update->laststep + 1;
// do not write restart files at start of run
// set next_restart values to multiple of every or variable value
// wrap variable eval with clear/add
// if no restarts, set next_restart to last+1 so will not influence next
// do not write restart files at start of run
// set next_restart values to multiple of every or variable value
// wrap variable eval with clear/add
// if no restarts, set next_restart to last+1 so will not influence next
if (restart_flag && update->restrict_output == 0) {
if (restart_flag_single) {
if (restart_every_single)
next_restart_single =
(ntimestep/restart_every_single)*restart_every_single +
restart_every_single;
else {
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_single));
if (nextrestart <= ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
next_restart_single = nextrestart;
}
} else next_restart_single = update->laststep + 1;
if (restart_flag_double) {
if (restart_every_double)
next_restart_double =
(ntimestep/restart_every_double)*restart_every_double +
restart_every_double;
else {
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_double));
if (nextrestart <= ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
next_restart_double = nextrestart;
}
} else next_restart_double = update->laststep + 1;
next_restart = MIN(next_restart_single,next_restart_double);
} else next_restart = update->laststep + 1;
if (restart_flag && update->restrict_output == 0) {
if (restart_flag_single) {
if (restart_every_single) {
next_restart_single =
(ntimestep/restart_every_single)*restart_every_single +
restart_every_single;
} else {
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_single));
if (nextrestart <= ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
next_restart_single = nextrestart;
}
} else next_restart_single = update->laststep + 1;
if (restart_flag_double) {
if (restart_every_double)
next_restart_double =
(ntimestep/restart_every_double)*restart_every_double +
restart_every_double;
else {
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_double));
if (nextrestart <= ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
next_restart_double = nextrestart;
}
} else next_restart_double = update->laststep + 1;
next_restart = MIN(next_restart_single,next_restart_double);
} else next_restart = update->laststep + 1;
// print memory usage unless being called between multiple runs
// print memory usage unless being called between multiple runs
if (memflag) memory_usage();
if (memflag) memory_usage();
// set next_thermo to multiple of every or variable eval if var defined
// insure thermo output on last step of run
// thermo may invoke computes so wrap with clear/add
modify->clearstep_compute();
modify->clearstep_compute();
thermo->header();
thermo->compute(0);
last_thermo = ntimestep;
thermo->header();
thermo->compute(0);
last_thermo = ntimestep;
if (var_thermo) {
next_thermo = static_cast<bigint>
(input->variable->compute_equal(ivar_thermo));
if (next_thermo <= ntimestep)
error->all(FLERR,"Thermo every variable returned a bad timestep");
} else if (thermo_every) {
next_thermo = (ntimestep/thermo_every)*thermo_every + thermo_every;
next_thermo = MIN(next_thermo,update->laststep);
} else next_thermo = update->laststep;
if (var_thermo) {
next_thermo = static_cast<bigint>
(input->variable->compute_equal(ivar_thermo));
if (next_thermo <= ntimestep)
error->all(FLERR,"Thermo every variable returned a bad timestep");
} else if (thermo_every) {
next_thermo = (ntimestep/thermo_every)*thermo_every + thermo_every;
next_thermo = MIN(next_thermo,update->laststep);
} else next_thermo = update->laststep;
modify->addstep_compute(next_thermo);
modify->addstep_compute(next_thermo);
// next = next timestep any output will be done
// next = next timestep any output will be done
next = MIN(next_dump_any,next_restart);
next = MIN(next,next_thermo);
}
next = MIN(next_dump_any,next_restart);
next = MIN(next,next_thermo);
}
/* ----------------------------------------------------------------------
perform all output for this timestep
only perform output if next matches current step and last output doesn't
do dump/restart before thermo so thermo CPU time will include them
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
perform all output for this timestep
only perform output if next matches current step and last output doesn't
do dump/restart before thermo so thermo CPU time will include them
------------------------------------------------------------------------- */
void Output::write(bigint ntimestep)
{
// perform dump if its next_dump = current ntimestep
// but not if it was already written on this step
// set next_dump and also next_time_dump for mode_dump = 1
// set next_dump_any to smallest next_dump
// wrap step dumps that invoke computes or do variable eval with clear/add
// NOTE:
// not wrapping time dumps means that Integrate::ev_set()
// needs to trigger all per-atom eng/virial computes
// on a timestep where any time dump will be output
// could wrap time dumps as well, if timestep size did not vary
// if wrap when timestep size varies frequently,
// then can do many unneeded addstep() --> inefficient
// hard to know if timestep varies, since run every could change it
// can't remove an uneeded addstep from a compute, b/c don't know
// what other command may have added it
void Output::write(bigint ntimestep)
{
// perform dump if its next_dump = current ntimestep
// but not if it was already written on this step
// set next_dump and also next_time_dump for mode_dump = 1
// set next_dump_any to smallest next_dump
// wrap step dumps that invoke computes or do variable eval with clear/add
// NOTE:
// not wrapping time dumps means that Integrate::ev_set()
// needs to trigger all per-atom eng/virial computes
// on a timestep where any time dump will be output
// could wrap time dumps as well, if timestep size did not vary
// if wrap when timestep size varies frequently,
// then can do many unneeded addstep() --> inefficient
// hard to know if timestep varies, since run every could change it
// can't remove an uneeded addstep from a compute, b/c don't know
// what other command may have added it
if (next_dump_any == ntimestep) {
next_dump_any = next_time_dump_any = MAXBIGINT;
if (next_dump_any == ntimestep) {
next_dump_any = next_time_dump_any = MAXBIGINT;
for (int idump = 0; idump < ndump; idump++) {
for (int idump = 0; idump < ndump; idump++) {
if (next_dump[idump] == ntimestep) {
if (last_dump[idump] == ntimestep) continue;
if (next_dump[idump] == ntimestep) {
if (last_dump[idump] == ntimestep) continue;
if (mode_dump[idump] == 0 &&
(dump[idump]->clearstep || var_dump[idump]))
modify->clearstep_compute();
if (mode_dump[idump] == 0 &&
(dump[idump]->clearstep || var_dump[idump]))
modify->clearstep_compute();
// perform dump
// reset next_dump and next_time_dump, 1 arg for write()
// perform dump
// set next_dump and next_time_dump
dump[idump]->write();
last_dump[idump] = ntimestep;
calculate_next_dump(WRITE,idump,ntimestep);
dump[idump]->write();
last_dump[idump] = ntimestep;
calculate_next_dump(WRITE,idump,ntimestep);
if (mode_dump[idump] == 0 &&
(dump[idump]->clearstep || var_dump[idump]))
modify->addstep_compute(next_dump[idump]);
}
if (mode_dump[idump] == 0 &&
(dump[idump]->clearstep || var_dump[idump]))
modify->addstep_compute(next_dump[idump]);
}
if (mode_dump[idump] && (dump[idump]->clearstep || var_dump[idump]))
next_time_dump_any = MIN(next_time_dump_any,next_dump[idump]);
next_dump_any = MIN(next_dump_any,next_dump[idump]);
}
}
if (mode_dump[idump] && (dump[idump]->clearstep || var_dump[idump]))
next_time_dump_any = MIN(next_time_dump_any,next_dump[idump]);
next_dump_any = MIN(next_dump_any,next_dump[idump]);
}
}
// next_restart does not force output on last step of run
// for toggle = 0, replace "*" with current timestep in restart filename
// next restart variable may invoke computes so wrap with clear/add
// next_restart does not force output on last step of run
// for toggle = 0, replace "*" with current timestep in restart filename
// next restart variable may invoke computes so wrap with clear/add
if (next_restart == ntimestep) {
if (next_restart_single == ntimestep) {
if (next_restart == ntimestep) {
if (next_restart_single == ntimestep) {
std::string file = restart1;
std::size_t found = file.find('*');
if (found != std::string::npos)
file.replace(found,1,fmt::format("{}",update->ntimestep));
std::string file = restart1;
std::size_t found = file.find('*');
if (found != std::string::npos)
file.replace(found,1,fmt::format("{}",update->ntimestep));
if (last_restart != ntimestep) restart->write(file);
if (last_restart != ntimestep) restart->write(file);
if (restart_every_single) next_restart_single += restart_every_single;
else {
modify->clearstep_compute();
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_single));
if (nextrestart <= ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
next_restart_single = nextrestart;
modify->addstep_compute(next_restart_single);
}
}
if (restart_every_single) next_restart_single += restart_every_single;
else {
modify->clearstep_compute();
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_single));
if (nextrestart <= ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
next_restart_single = nextrestart;
modify->addstep_compute(next_restart_single);
}
}
if (next_restart_double == ntimestep) {
if (last_restart != ntimestep) {
if (restart_toggle == 0) {
restart->write(restart2a);
restart_toggle = 1;
} else {
restart->write(restart2b);
restart_toggle = 0;
}
}
if (restart_every_double) next_restart_double += restart_every_double;
else {
modify->clearstep_compute();
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_double));
if (nextrestart <= ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
next_restart_double = nextrestart;
modify->addstep_compute(next_restart_double);
}
}
last_restart = ntimestep;
next_restart = MIN(next_restart_single,next_restart_double);
}
if (next_restart_double == ntimestep) {
if (last_restart != ntimestep) {
if (restart_toggle == 0) {
restart->write(restart2a);
restart_toggle = 1;
} else {
restart->write(restart2b);
restart_toggle = 0;
}
}
// insure next_thermo forces output on last step of run
// thermo may invoke computes so wrap with clear/add
if (restart_every_double) next_restart_double += restart_every_double;
else {
modify->clearstep_compute();
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_double));
if (nextrestart <= ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
next_restart_double = nextrestart;
modify->addstep_compute(next_restart_double);
}
}
last_restart = ntimestep;
next_restart = MIN(next_restart_single,next_restart_double);
}
if (next_thermo == ntimestep) {
modify->clearstep_compute();
if (last_thermo != ntimestep) thermo->compute(1);
last_thermo = ntimestep;
if (var_thermo) {
next_thermo = static_cast<bigint>
(input->variable->compute_equal(ivar_thermo));
if (next_thermo <= ntimestep)
error->all(FLERR,"Thermo every variable returned a bad timestep");
} else if (thermo_every) next_thermo += thermo_every;
else next_thermo = update->laststep;
next_thermo = MIN(next_thermo,update->laststep);
modify->addstep_compute(next_thermo);
}
// insure next_thermo forces output on last step of run
// thermo may invoke computes so wrap with clear/add
// next = next timestep any output will be done
if (next_thermo == ntimestep) {
modify->clearstep_compute();
if (last_thermo != ntimestep) thermo->compute(1);
last_thermo = ntimestep;
if (var_thermo) {
next_thermo = static_cast<bigint>
(input->variable->compute_equal(ivar_thermo));
if (next_thermo <= ntimestep)
error->all(FLERR,"Thermo every variable returned a bad timestep");
} else if (thermo_every) next_thermo += thermo_every;
else next_thermo = update->laststep;
next_thermo = MIN(next_thermo,update->laststep);
modify->addstep_compute(next_thermo);
}
next = MIN(next_dump_any,next_restart);
next = MIN(next,next_thermo);
}
// next = next timestep any output will be done
/* ----------------------------------------------------------------------
force a snapshot to be written for all dumps
called from PRD and TAD
------------------------------------------------------------------------- */
next = MIN(next_dump_any,next_restart);
next = MIN(next,next_thermo);
}
void Output::write_dump(bigint ntimestep)
{
for (int idump = 0; idump < ndump; idump++) {
dump[idump]->write();
last_dump[idump] = ntimestep;
}
}
/* ----------------------------------------------------------------------
force a snapshot to be written for all dumps
called from PRD and TAD
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
calculate when next dump occurs for Dump instance idump
operates in one of two modes, based on mode_dump flag
for timestep mode, set next_dump
for simulation time mode, set next_time_dump and next_dump
which flag depends on caller
SETUP = from setup() at start of run
WRITE = from write() during run each time a dump file is written
RESET_DT = from reset_dt() called from fix dt/reset when it changes timestep size
------------------------------------------------------------------------- */
void Output::write_dump(bigint ntimestep)
{
for (int idump = 0; idump < ndump; idump++) {
dump[idump]->write();
last_dump[idump] = ntimestep;
}
}
/* ----------------------------------------------------------------------
calculate when next dump occurs for Dump instance idump
operates in one of two modes, based on mode_dump flag
for timestep mode, set next_dump
for simulation time mode, set next_time_dump and next_dump
which flag depends on caller
SETUP = from setup() at start of run
WRITE = from write() during run each time a dump file is written
RESET_DT = from reset_dt() called from fix dt/reset when it changes timestep size
------------------------------------------------------------------------- */
void Output::calculate_next_dump(int which, int idump, bigint ntimestep)
{
// dump mode is by timestep
// just set next_dump
{
// dump mode is by timestep
// just set next_dump
if (mode_dump[idump] == 0) {
if (mode_dump[idump] == 0) {
if (every_dump[idump]) {
if (every_dump[idump]) {
// which = SETUP: nextdump = next multiple of every_dump
// which = WRITE: increment nextdump by every_dump
// which = SETUP: next_dump = next multiple of every_dump
// which = WRITE: increment next_dump by every_dump
// current step is already multiple of every_dump
if (which == SETUP)
next_dump[idump] = (ntimestep/every_dump[idump])*every_dump[idump] + every_dump[idump];
else if (which == WRITE)
next_dump[idump] += every_dump[idump];
if (which == SETUP)
next_dump[idump] = (ntimestep/every_dump[idump])*every_dump[idump] + every_dump[idump];
else if (which == WRITE)
next_dump[idump] += every_dump[idump];
} else {
next_dump[idump] = static_cast<bigint>
(input->variable->compute_equal(ivar_dump[idump]));
if (next_dump[idump] <= ntimestep)
error->all(FLERR,"Dump every variable returned a bad timestep");
}
} else {
next_dump[idump] = static_cast<bigint>
(input->variable->compute_equal(ivar_dump[idump]));
if (next_dump[idump] <= ntimestep)
error->all(FLERR,"Dump every variable returned a bad timestep");
}
// dump mode is by simulation time
// set next_time_dump and next_dump
// dump mode is by simulation time
// set next_time_dump and next_dump
} else {
} else {
bigint nextdump;
double nexttime;
double tcurrent = update->atime +
(ntimestep - update->atimestep) * update->dt;
bigint nextdump;
double nexttime;
double tcurrent = update->atime +
(ntimestep - update->atimestep) * update->dt;
if (every_time_dump[idump] > 0.0) {
if (every_time_dump[idump] > 0.0) {
// which = SETUP: nexttime = next multiple of every_time_dump
// which = WRITE: increment nexttime by every_time_dump
// which = RESET_DT: no change to previous nexttime (only timestep has changed)
// which = SETUP: nexttime = next multiple of every_time_dump
// which = WRITE: increment nexttime by every_time_dump
// which = RESET_DT: no change to previous nexttime (only timestep has changed)
switch (which) {
case SETUP:
nexttime = static_cast<bigint> (tcurrent/every_time_dump[idump]) *
every_time_dump[idump] + every_time_dump[idump];
break;
switch (which) {
case SETUP:
nexttime = static_cast<bigint> (tcurrent/every_time_dump[idump]) *
every_time_dump[idump] + every_time_dump[idump];
break;
case WRITE:
nexttime = next_time_dump[idump] + every_time_dump[idump];
break;
case WRITE:
nexttime = next_time_dump[idump] + every_time_dump[idump];
break;
case RESET_DT:
nexttime = next_time_dump[idump];
break;
case RESET_DT:
nexttime = next_time_dump[idump];
break;
default:
nexttime = 0;
error->all(FLERR,"Unexpected argument to calculate_next_dump");
}
default:
nexttime = 0;
error->all(FLERR,"Unexpected argument to calculate_next_dump");
}
nextdump = ntimestep +
static_cast<bigint> ((nexttime - tcurrent - EPSDT*update->dt) / update->dt) + 1;
nextdump = ntimestep +
static_cast<bigint> ((nexttime - tcurrent - EPSDT*update->dt) / update->dt) + 1;
// if delta is too small to reach next timestep, use multiple of delta
// if delta is too small to reach next timestep, use multiple of delta
if (nextdump == ntimestep) {
double tnext = update->atime +
(ntimestep+1 - update->atimestep) * update->dt;
int multiple = static_cast<int>
((tnext - nexttime) / every_time_dump[idump]);
nexttime = nexttime + (multiple+1)*every_time_dump[idump];
nextdump = ntimestep +
static_cast<bigint> ((nexttime - tcurrent - EPSDT*update->dt) / update->dt) + 1;
}
if (nextdump == ntimestep) {
double tnext = update->atime +
(ntimestep+1 - update->atimestep) * update->dt;
int multiple = static_cast<int>
((tnext - nexttime) / every_time_dump[idump]);
nexttime = nexttime + (multiple+1)*every_time_dump[idump];
nextdump = ntimestep +
static_cast<bigint> ((nexttime - tcurrent - EPSDT*update->dt) / update->dt) + 1;
}
} else {
} else {
// do not re-evaulate variable for which = RESET_DT, leave nexttime as-is
// unless next_time_dump < 0.0, which means variable never yet evaluated
// do not re-evaulate variable for which = RESET_DT, leave nexttime as-is
// unless next_time_dump < 0.0, which means variable never yet evaluated
if (which < RESET_DT || next_time_dump[idump] < 0.0) {
nexttime = input->variable->compute_equal(ivar_dump[idump]);
} else
nexttime = next_time_dump[idump];
if (which < RESET_DT || next_time_dump[idump] < 0.0) {
nexttime = input->variable->compute_equal(ivar_dump[idump]);
} else
nexttime = next_time_dump[idump];
if (nexttime <= tcurrent)
error->all(FLERR,"Dump every/time variable returned a bad time");
if (nexttime <= tcurrent)
error->all(FLERR,"Dump every/time variable returned a bad time");
nextdump = ntimestep +
static_cast<bigint> ((nexttime - tcurrent - EPSDT*update->dt) / update->dt) + 1;
if (nextdump <= ntimestep)
error->all(FLERR,"Dump every/time variable too small for next timestep");
}
nextdump = ntimestep +
static_cast<bigint> ((nexttime - tcurrent - EPSDT*update->dt) / update->dt) + 1;
if (nextdump <= ntimestep)
error->all(FLERR,"Dump every/time variable too small for next timestep");
}
next_time_dump[idump] = nexttime;
next_dump[idump] = nextdump;
}
}
next_time_dump[idump] = nexttime;
next_dump[idump] = nextdump;
}
}
/* ---------------------------------------------------------------------- */
@ -589,112 +589,112 @@ int Output::check_time_dumps(bigint ntimestep)
return nowflag;
}
/* ----------------------------------------------------------------------
force restart file(s) to be written
called from PRD and TAD
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
force restart file(s) to be written
called from PRD and TAD
------------------------------------------------------------------------- */
void Output::write_restart(bigint ntimestep)
{
if (restart_flag_single) {
std::string file = restart1;
std::size_t found = file.find('*');
if (found != std::string::npos)
file.replace(found,1,fmt::format("{}",update->ntimestep));
restart->write(file);
}
void Output::write_restart(bigint ntimestep)
{
if (restart_flag_single) {
std::string file = restart1;
std::size_t found = file.find('*');
if (found != std::string::npos)
file.replace(found,1,fmt::format("{}",update->ntimestep));
restart->write(file);
}
if (restart_flag_double) {
if (restart_toggle == 0) {
restart->write(restart2a);
restart_toggle = 1;
} else {
restart->write(restart2b);
restart_toggle = 0;
}
}
if (restart_flag_double) {
if (restart_toggle == 0) {
restart->write(restart2a);
restart_toggle = 1;
} else {
restart->write(restart2b);
restart_toggle = 0;
}
}
last_restart = ntimestep;
}
last_restart = ntimestep;
}
/* ----------------------------------------------------------------------
timestep is being changed, called by update->reset_timestep()
for dumps, require that no dump is "active"
meaning that a snapshot has already been output
reset next output values for restart and thermo
reset to smallest value >= new timestep
if next timestep set by variable evaluation,
eval for ntimestep-1, so current ntimestep can be returned if needed
no guarantee that variable can be evaluated for ntimestep-1
e.g. if it depends on computes, but live with that rare case for now
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
timestep is being changed, called by update->reset_timestep()
for dumps, require that no dump is "active"
meaning that a snapshot has already been output
reset next output values for restart and thermo
reset to smallest value >= new timestep
if next timestep set by variable evaluation,
eval for ntimestep-1, so current ntimestep can be returned if needed
no guarantee that variable can be evaluated for ntimestep-1
e.g. if it depends on computes, but live with that rare case for now
------------------------------------------------------------------------- */
void Output::reset_timestep(bigint ntimestep)
{
next_dump_any = MAXBIGINT;
for (int idump = 0; idump < ndump; idump++)
if ((last_dump[idump] >= 0) && !update->whichflag && !dump[idump]->multifile)
error->all(FLERR, "Cannot reset timestep with active dump - must undump first");
void Output::reset_timestep(bigint ntimestep)
{
next_dump_any = MAXBIGINT;
for (int idump = 0; idump < ndump; idump++)
if ((last_dump[idump] >= 0) && !update->whichflag && !dump[idump]->multifile)
error->all(FLERR, "Cannot reset timestep with active dump - must undump first");
if (restart_flag_single) {
if (restart_every_single) {
next_restart_single =
(ntimestep/restart_every_single)*restart_every_single;
if (next_restart_single < ntimestep)
next_restart_single += restart_every_single;
} else {
modify->clearstep_compute();
update->ntimestep--;
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_single));
if (nextrestart < ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
update->ntimestep++;
next_restart_single = nextrestart;
modify->addstep_compute(next_restart_single);
}
} else next_restart_single = update->laststep + 1;
if (restart_flag_single) {
if (restart_every_single) {
next_restart_single =
(ntimestep/restart_every_single)*restart_every_single;
if (next_restart_single < ntimestep)
next_restart_single += restart_every_single;
} else {
modify->clearstep_compute();
update->ntimestep--;
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_single));
if (nextrestart < ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
update->ntimestep++;
next_restart_single = nextrestart;
modify->addstep_compute(next_restart_single);
}
} else next_restart_single = update->laststep + 1;
if (restart_flag_double) {
if (restart_every_double) {
next_restart_double =
(ntimestep/restart_every_double)*restart_every_double;
if (next_restart_double < ntimestep)
next_restart_double += restart_every_double;
} else {
modify->clearstep_compute();
update->ntimestep--;
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_double));
if (nextrestart < ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
update->ntimestep++;
next_restart_double = nextrestart;
modify->addstep_compute(next_restart_double);
}
} else next_restart_double = update->laststep + 1;
if (restart_flag_double) {
if (restart_every_double) {
next_restart_double =
(ntimestep/restart_every_double)*restart_every_double;
if (next_restart_double < ntimestep)
next_restart_double += restart_every_double;
} else {
modify->clearstep_compute();
update->ntimestep--;
auto nextrestart = static_cast<bigint>
(input->variable->compute_equal(ivar_restart_double));
if (nextrestart < ntimestep)
error->all(FLERR,"Restart variable returned a bad timestep");
update->ntimestep++;
next_restart_double = nextrestart;
modify->addstep_compute(next_restart_double);
}
} else next_restart_double = update->laststep + 1;
next_restart = MIN(next_restart_single,next_restart_double);
next_restart = MIN(next_restart_single,next_restart_double);
if (var_thermo) {
modify->clearstep_compute();
update->ntimestep--;
next_thermo = static_cast<bigint>
(input->variable->compute_equal(ivar_thermo));
if (next_thermo < ntimestep)
error->all(FLERR,"Thermo_modify every variable returned a bad timestep");
update->ntimestep++;
next_thermo = MIN(next_thermo,update->laststep);
modify->addstep_compute(next_thermo);
} else if (thermo_every) {
next_thermo = (ntimestep/thermo_every)*thermo_every;
if (next_thermo < ntimestep) next_thermo += thermo_every;
next_thermo = MIN(next_thermo,update->laststep);
} else next_thermo = update->laststep;
if (var_thermo) {
modify->clearstep_compute();
update->ntimestep--;
next_thermo = static_cast<bigint>
(input->variable->compute_equal(ivar_thermo));
if (next_thermo < ntimestep)
error->all(FLERR,"Thermo_modify every variable returned a bad timestep");
update->ntimestep++;
next_thermo = MIN(next_thermo,update->laststep);
modify->addstep_compute(next_thermo);
} else if (thermo_every) {
next_thermo = (ntimestep/thermo_every)*thermo_every;
if (next_thermo < ntimestep) next_thermo += thermo_every;
next_thermo = MIN(next_thermo,update->laststep);
} else next_thermo = update->laststep;
next = MIN(next_dump_any,next_restart);
next = MIN(next,next_thermo);
}
next = MIN(next_dump_any,next_restart);
next = MIN(next,next_thermo);
}
/* ----------------------------------------------------------------------
timestep size is being changed
@ -728,7 +728,6 @@ void Output::reset_dt()
next = MIN(next,next_thermo);
}
/* ----------------------------------------------------------------------
add a Dump to list of Dumps
------------------------------------------------------------------------- */

View File

@ -25,6 +25,7 @@ PairStyle(hybrid,PairHybrid);
namespace LAMMPS_NS {
class PairHybrid : public Pair {
friend class AtomVecDielectric;
friend class ComputeSpin;
friend class FixGPU;
friend class FixIntel;

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More