Merge branch 'develop' into doc-write-data

This commit is contained in:
Axel Kohlmeyer
2024-05-13 13:38:21 -04:00
58 changed files with 2748 additions and 695 deletions

View File

@ -15,7 +15,7 @@ jobs:
build: build:
name: MacOS Unit Test name: MacOS Unit Test
if: ${{ github.repository == 'lammps/lammps' }} if: ${{ github.repository == 'lammps/lammps' }}
runs-on: macos-latest runs-on: macos-13
env: env:
CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_DIR: ${{ github.workspace }}/.ccache
@ -43,6 +43,8 @@ jobs:
working-directory: build working-directory: build
run: | run: |
ccache -z ccache -z
python3 -m venv macosenv
source macosenv/bin/activate
python3 -m pip install numpy python3 -m pip install numpy
python3 -m pip install pyyaml python3 -m pip install pyyaml
cmake -C ../cmake/presets/clang.cmake \ cmake -C ../cmake/presets/clang.cmake \

View File

@ -1,6 +1,6 @@
message(STATUS "Downloading and building OpenCL loader library") message(STATUS "Downloading and building OpenCL loader library")
set(OPENCL_LOADER_URL "${LAMMPS_THIRDPARTY_URL}/opencl-loader-2024.02.09.tar.gz" CACHE STRING "URL for OpenCL loader tarball") set(OPENCL_LOADER_URL "${LAMMPS_THIRDPARTY_URL}/opencl-loader-2024.05.09.tar.gz" CACHE STRING "URL for OpenCL loader tarball")
set(OPENCL_LOADER_MD5 "f3573cf9daa3558ba46fd5866517f38f" CACHE STRING "MD5 checksum of OpenCL loader tarball") set(OPENCL_LOADER_MD5 "e7796826b21c059224fabe997e0f2075" CACHE STRING "MD5 checksum of OpenCL loader tarball")
mark_as_advanced(OPENCL_LOADER_URL) mark_as_advanced(OPENCL_LOADER_URL)
mark_as_advanced(OPENCL_LOADER_MD5) mark_as_advanced(OPENCL_LOADER_MD5)

View File

@ -15,7 +15,8 @@ orientation for rotational models. This produces a stress-free initial
state. Furthermore, bonds are allowed to break under large strains, state. Furthermore, bonds are allowed to break under large strains,
producing fracture. The examples/bpm directory has sample input scripts producing fracture. The examples/bpm directory has sample input scripts
for simulations of the fragmentation of an impacted plate and the for simulations of the fragmentation of an impacted plate and the
pouring of extended, elastic bodies. pouring of extended, elastic bodies. See :ref:`(Clemmer) <howto-Clemmer>`
for more general information on the approach and the LAMMPS implementation.
---------- ----------
@ -150,3 +151,9 @@ the following are currently compatible with BPM bond styles:
interactions, one will need to switch between different *special_bonds* interactions, one will need to switch between different *special_bonds*
settings in the input script. An example is found in settings in the input script. An example is found in
``examples/bpm/impact``. ``examples/bpm/impact``.
----------
.. _howto-Clemmer:
**(Clemmer)** Clemmer, Monti, Lechman, Soft Matter, 20, 1702 (2024).

View File

@ -468,12 +468,13 @@ to.
The *overlap* keyword only applies to the *random* style. It prevents The *overlap* keyword only applies to the *random* style. It prevents
newly created particles from being created closer than the specified newly created particles from being created closer than the specified
*Doverlap* distance from any other particle. When the particles being *Doverlap* distance from any other particle. If particles have finite
created are molecules, the radius of the molecule (from its geometric size (see :doc:`atom_style sphere <atom_style>` for example) *Doverlap*
center) is added to *Doverlap*. If particles have finite size (see should be specified large enough to include the particle size in the
:doc:`atom_style sphere <atom_style>` for example) *Doverlap* should non-overlapping criterion. If molecules are being randomly inserted, then
be specified large enough to include the particle size in the an insertion is only accepted if each particle in the molecule meets the
non-overlapping criterion. overlap criterion with respect to other particles (not including particles
in the molecule itself).
.. note:: .. note::

View File

@ -29,10 +29,12 @@ Syntax
NOTE: All other styles are documented by the :doc:`fix deform <fix_deform>` command NOTE: All other styles are documented by the :doc:`fix deform <fix_deform>` command
*xy*, *xz*, *yz* args = style value *xy*, *xz*, *yz* args = style value
style = *final* or *delta* or *vel* or *erate* or *trate* or *wiggle* or *variable* or *pressure* style = *final* or *delta* or *vel* or *erate* or *trate* or *wiggle* or *variable* or *pressure* or *erate/rescale*
*pressure* values = target gain *pressure* values = target gain
target = target pressure (pressure units) target = target pressure (pressure units)
gain = proportional gain constant (1/(time * pressure) or 1/time units) gain = proportional gain constant (1/(time * pressure) or 1/time units)
*erate/rescale* value = R
R = engineering shear strain rate (1/time units)
NOTE: All other styles are documented by the :doc:`fix deform <fix_deform>` command NOTE: All other styles are documented by the :doc:`fix deform <fix_deform>` command
*box* = style value *box* = style value
@ -159,6 +161,21 @@ details of a simulation and testing different values is
recommended. One can also apply a maximum limit to the magnitude of recommended. One can also apply a maximum limit to the magnitude of
the applied strain using the :ref:`max/rate <deform_max_rate>` option. the applied strain using the :ref:`max/rate <deform_max_rate>` option.
The *erate/rescale* style operates similarly to the *erate* style with
a specified strain rate in units of 1/time. The difference is that
the change in the tilt factor will depend on the current length of
the box perpendicular to the shear direction, L, instead of the
original length, L0. The tilt factor T as a function of time will
change as
.. parsed-literal::
T(t) = T(t-1) + L\*erate\* \Delta t
where T(t-1) is the tilt factor on the previous timestep and :math:`\Delta t`
is the timestep size. This option may be useful in scenarios where
L changes in time.
---------- ----------
The *box* parameter provides an additional control over the *x*, *y*, The *box* parameter provides an additional control over the *x*, *y*,

View File

@ -8,7 +8,7 @@ Syntax
.. parsed-literal:: .. parsed-literal::
fix ID group nonaffine/displacement style args reference/style nstep fix ID group nonaffine/displacement style args reference/style nstep keyword values
* ID, group are documented in :doc:`fix <fix>` command * ID, group are documented in :doc:`fix <fix>` command
* nonaffine/displacement = style name of this fix command * nonaffine/displacement = style name of this fix command
@ -32,6 +32,13 @@ Syntax
*update* = update the reference frame every *nstep* timesteps *update* = update the reference frame every *nstep* timesteps
*offset* = update the reference frame *nstep* timesteps before calculating the nonaffine displacement *offset* = update the reference frame *nstep* timesteps before calculating the nonaffine displacement
* zero or more keyword/value pairs may be appended
.. parsed-literal::
*z/min* values = zmin
zmin = minimum coordination number to calculate D2min
Examples Examples
"""""""" """"""""
@ -76,6 +83,12 @@ is the identity tensor. This calculation is only performed on timesteps that
are a multiple of *nevery* (including timestep zero). Data accessed before are a multiple of *nevery* (including timestep zero). Data accessed before
this occurs will simply be zeroed. this occurs will simply be zeroed.
For particles with low coordination numbers, calculations of :math:`D^2_\mathrm{min}`
may not be accurate. An optional minimum coordination number can be defined using
the *z/min* keyword. If any particle has fewer than the specified number of particles
in the cutoff distance or in contact, the above calculations will be skipped and the
corresponding peratom array entries will be zero.
The *integrated* style simply integrates the velocity of particles The *integrated* style simply integrates the velocity of particles
every timestep to calculate a displacement. This style only works if every timestep to calculate a displacement. This style only works if
used in conjunction with another fix that deforms the box and displaces used in conjunction with another fix that deforms the box and displaces

View File

@ -20,7 +20,7 @@ Syntax
* Nfreq = calculate average bond-order every this many timesteps * Nfreq = calculate average bond-order every this many timesteps
* filename = name of output file * filename = name of output file
* zero or more keyword/value pairs may be appended * zero or more keyword/value pairs may be appended
* keyword = *cutoff* or *element* or *position* or *delete* * keyword = *cutoff* or *element* or *position* or *delete* or *delete_rate_limit*
.. parsed-literal:: .. parsed-literal::
@ -110,10 +110,10 @@ all types from 1 to :math:`N`. A leading asterisk means all types from
The optional keyword *element* can be used to specify the chemical The optional keyword *element* can be used to specify the chemical
symbol printed for each LAMMPS atom type. The number of symbols must symbol printed for each LAMMPS atom type. The number of symbols must
match the number of LAMMPS atom types and each symbol must consist of match the number of LAMMPS atom types and each symbol must consist of
1 or 2 alphanumeric characters. Normally, these symbols should be 1 or 2 alphanumeric characters. By default, these symbols are the same
chosen to match the chemical identity of each LAMMPS atom type, as as the chemical identity of each LAMMPS atom type, as specified by the
specified using the :doc:`reaxff pair_coeff <pair_reaxff>` command and :doc:`ReaxFF pair_coeff <pair_reaxff>` command and the ReaxFF force
the ReaxFF force field file. field file.
The optional keyword *position* writes center-of-mass positions of The optional keyword *position* writes center-of-mass positions of
each identified molecules to file *filepos* every *posfreq* timesteps. each identified molecules to file *filepos* every *posfreq* timesteps.
@ -233,5 +233,5 @@ Default
""""""" """""""
The default values for bond-order cutoffs are 0.3 for all I-J pairs. The default values for bond-order cutoffs are 0.3 for all I-J pairs.
The default element symbols are C, H, O, N. The default element symbols are taken from the ReaxFF pair_coeff command.
Position files are not written by default. Position files are not written by default.

View File

@ -8,56 +8,118 @@ Syntax
.. code-block:: LAMMPS .. code-block:: LAMMPS
replicate nx ny nz *keyword* replicate nx ny nz keyword ...
nx,ny,nz = replication factors in each dimension nx,ny,nz = replication factors in each dimension
* optional *keyword* = *bbox* * zero or more keywords may be appended
* keyword = *bbox* or *bond/periodic*
.. parsed-literal:: .. parsed-literal::
*bbox* = only check atoms in replicas that overlap with a processor's subdomain *bbox* = use a bounding-box algorithm which is faster for large proc counts
*bond/periodic* = use an algorithm that correctly replicates periodic bond loops
Examples Examples
"""""""" """"""""
For examples of replicating simple linear polymer chains (periodic or
non-periodic) or periodic carbon nanotubes, see examples/replicate.
.. code-block:: LAMMPS .. code-block:: LAMMPS
replicate 2 3 2 replicate 2 3 2
replicate 2 3 2 bbox
replicate 2 3 2 bond/periodic
Description Description
""""""""""" """""""""""
Replicate the current simulation one or more times in each dimension. Replicate the current system one or more times in each dimension. For
For example, replication factors of 2,2,2 will create a simulation example, replication factors of 2,2,2 will create a simulation with 8x
with 8x as many atoms by doubling the simulation domain in each as many atoms by doubling the size of the simulation box in each
dimension. A replication factor of 1 in a dimension leaves the dimension. A replication factor of 1 leaves the simulation domain
simulation domain unchanged. When the new simulation box is created unchanged in that dimension.
it is also partitioned into a regular 3d grid of rectangular bricks,
one per processor, based on the number of processors being used and
the settings of the :doc:`processors <processors>` command. The
partitioning can later be changed by the :doc:`balance <balance>` or
:doc:`fix balance <fix_balance>` commands.
All properties of the atoms are replicated, including their When the new simulation box is created it is partitioned into a
velocities, which may or may not be desirable. New atom IDs are regular 3d grid of rectangular bricks, one per processor, based on the
assigned to new atoms, as are molecule IDs. Bonds and other topology number of processors being used and the settings of the
interactions are created between pairs of new atoms as well as between :doc:`processors <processors>` command. The partitioning can be
old and new atoms. This is done by using the image flag for each atom changed by subsequent :doc:`balance <balance>` or :doc:`fix balance
to "unwrap" it out of the periodic box before replicating it. <fix_balance>` commands.
This means that any molecular bond you specify in the original data All properties of each atom are replicated (except per-atom fix data,
file that crosses a periodic boundary should be between two atoms with see the Restrictions section below). This includes their velocities,
image flags that differ by 1. This will allow the bond to be which may or may not be desirable. New atom IDs are assigned to new
unwrapped appropriately. atoms, as are new molecule IDs. Bonds and other topology interactions
are created between pairs of new atoms as well as between old and new
atoms.
The optional keyword *bbox* uses a bounding box to only check atoms in .. note::
replicas that overlap with a processor's subdomain when assigning
atoms to processors. It typically results in a substantial speedup The bond discussion which follows only refers to models with
when using the replicate command on a large number of processors. It permanent covalent bonds typically defined in LAMMPS via a data
does require temporary use of more memory, specifically that each file. It is not relevant to sytems modeled with many-body
processor can store all atoms in the entire system before it is potentials which can define bonds on-the-fly, based on the current
replicated. positions of nearby atoms, e.g. models using the :doc:`AIREBO
<pair_airebo>` or :doc:`ReaxFF <pair_reaxff>` potentials.
If the *bond/periodic* keyword is not specified, bond replication is
done by using the image flag for each atom to "unwrap" it out of the
periodic box before replicating it. After replication is performed,
atoms outside the new periodic box are wrapped back into it. This
assigns correct images flags to all atoms in the system. For this to
work, all original atoms in the original simulation box must have
consistent image flags. This means that if two atoms have a bond
between them which crosses a periodic boundary, their respective image
flags will differ by 1 in that dimension.
Image flag consistency is not possible if a system has a periodic bond
loop, meaning there is a chain of bonds which crosses an entire
dimension and re-connects to itself across a periodic boundary. In
this case you MUST use the *bond/periodic* keyword to correctly
replicate the system. This option zeroes the image flags for all
atoms and uses a different algorithm to find new (nearby) bond
neighbors in the replicated system. In the final replicated system
all image flags are zero (in each dimension).
.. note::
LAMMPS does not check for image flag consistency before performing
the replication (it does issue a warning about this before a
simulation is run). If the original image flags are inconsistent,
the replicated system will also have inconsistent image flags, but
will otherwise be correctly replicated. This is NOT the case if
there is a periodic bond loop. See the next note.
.. note::
LAMMPS does not check for periodic bond loops. If you use the
*bond/periodic* keyword for a system without periodic bond loops,
the system will be correctly replicated, but image flag information
will be lost (which may or may not be important to your model). If
you do not use the *bond/periodic* keyword for a system with
periodic bond loops, the replicated system will have invalid bonds
(typically very long), resulting in bad dynamics.
If possible, the *bbox* keyword should be used when running on a large
number of processors, as it can result in a substantial speed-up for
the replication operation. It uses a bounding box to only check atoms
in replicas that overlap with each processor's new subdomain when
assigning atoms to processors. It also preserves image flag
information. The only drawback to the *bbox* option is that it
requires a temporary use of more memory. Each processor must be able
to store all atoms (and their per-atom data) in the original system,
before it is replicated.
.. note::
The algorithm used by the *bond/periodic* keyword builds on the
algorithm used by the *bbox* keyword and thus has the same memory
requirements. If you specify only the *bond/peridoic* keyword it
will internally set the *bbox* keyword as well.
----------
Restrictions Restrictions
"""""""""""" """"""""""""
@ -65,49 +127,30 @@ Restrictions
A 2d simulation cannot be replicated in the z dimension. A 2d simulation cannot be replicated in the z dimension.
If a simulation is non-periodic in a dimension, care should be used If a simulation is non-periodic in a dimension, care should be used
when replicating it in that dimension, as it may put atoms nearly on when replicating it in that dimension, as it may generate atoms nearly
top of each other. on top of each other.
.. note::
You cannot use the replicate command on a system which has a
molecule that spans the box and is bonded to itself across a periodic
boundary, so that the molecule is effectively a loop. A simple
example would be a linear polymer chain that spans the simulation box
and bonds back to itself across the periodic boundary. More realistic
examples would be a CNT (meant to be an infinitely long CNT) or a
graphene sheet or a bulk periodic crystal where there are explicit
bonds specified between near neighbors. (Note that this only applies
to systems that have permanent bonds as specified in the data file. A
CNT that is just atoms modeled with the :doc:`AIREBO potential <pair_airebo>` has no such permanent bonds, so it can be
replicated.) The reason replication does not work with those systems
is that the image flag settings described above cannot be made
consistent. I.e. it is not possible to define images flags so that
when every pair of bonded atoms is unwrapped (using the image flags),
they will be close to each other. The only way the replicate command
could work in this scenario is for it to break a bond, insert more
atoms, and re-connect the loop for the larger simulation box. But it
is not clever enough to do this. So you will have to construct a
larger version of your molecule as a pre-processing step and input a
new data file to LAMMPS.
If the current simulation was read in from a restart file (before a If the current simulation was read in from a restart file (before a
run is performed), there must not be any fix information stored in run is performed), there must not be any fix information stored in the
the file for individual atoms. Similarly, no fixes can be defined at file for individual atoms. Similarly, no fixes can be defined at the
the time the replicate command is used that require vectors of atom time the replicate command is used that require vectors of atom
information to be stored. This is because the replicate command does information to be stored. This is because the replicate command does
not know how to replicate that information for new atoms it creates. not know how to replicate that information for new atoms it creates.
To work around this restriction, restart files may be converted into
data files and fixes may be undefined via the :doc:`unfix <unfix>` To work around this restriction two options are possible. (1) Fixes
command before and redefined after the replicate command. which use the stored data in the restart file can be defined before
replication and then deleted via the :doc:`unfix <unfix>` command and
re-defined after it. Or (2) the restart file can be converted to a
data file (which deletes the stored fix infomation) and fixes defined
after the replicate command. In both these scenarios, the per-atom
fix information in the restart file is lost.
Related commands Related commands
"""""""""""""""" """"""""""""""""
none none
Default Default
""""""" """""""
none No settings for using the *bbox* or *bond/periodic* algorithms.

View File

@ -4162,6 +4162,7 @@ zenodo
Zepeda Zepeda
zflag zflag
Zhang Zhang
Zhao
Zhen Zhen
zhi zhi
Zhigilei Zhigilei

View File

@ -104,6 +104,7 @@ prd: parallel replica dynamics of vacancy diffusion in bulk Si
python: use of PYTHON package to invoke Python code from input script python: use of PYTHON package to invoke Python code from input script
qeq: use of QEQ package for charge equilibration qeq: use of QEQ package for charge equilibration
reaxff: RDX and TATB and several other models using ReaxFF reaxff: RDX and TATB and several other models using ReaxFF
replicate: use of replicate command
rerun: use of rerun and read_dump commands rerun: use of rerun and read_dump commands
rigid: rigid bodies modeled as independent or coupled rigid: rigid bodies modeled as independent or coupled
shear: sideways shear applied to 2d solid, with and without a void shear: sideways shear applied to 2d solid, with and without a void

32
examples/replicate/README Normal file
View File

@ -0,0 +1,32 @@
This directory has input scripts which demonstrate how to use the
replicate command both for systems with and without periodic bond
loops. A periodic bond loop is where a chain of bonds spans a
periodic dimension of the box and includes one or more bonds which
cross the periodic boundary to close the loop.
To run these scripts, LAMMPS should be built with the MOLECULE and
CLASS2 packages. The latter is only needed for the CNT example.
--------
These scripts are tiny examples which illustrate both kinds of
systems. Each produces a series of images which can be visualized.
If the 3 lines for a dump movie command are uncommented, a MPG movie
is produced, assuming LAMMPS is build with FFMPEG support.
in.replicate.bond.x # linear chains in x direction, bond loop in x
in.replcate.bond.x.y # 2d grid of bonded atoms, bond loops in x and y
in.replicate.bond.xy # linear chains in diagonal direction, bond loop in x and y
in.replicate.bond.noloop # linear chains in x direction, no bond loop
If you do not use the bond/periodic keyword with the replicate command
in the first 3 of these scripts (which have periodic bond loops), and
visualize the dynamics of hee simulation, you will see how the
replication creates a bogus system.
--------
This script is for a complex system of 3 orthogonal CNTs which has
periodic bond loops in all 3 dimensions xyz.
in.replicate.cnt

View File

@ -0,0 +1,22 @@
# system with periodic bonds in x
3 atoms
3 bonds
1 atom types
1 bond types
0 3 xlo xhi
0 1 ylo yhi
Atoms
1 1 1 0.5 0.5 0
2 1 1 1.5 0.5 0
3 1 1 2.5 0.5 0
Bonds
1 1 1 2
2 1 2 3
3 1 3 1

View File

@ -0,0 +1,21 @@
# system with non-periodic bonds in x
3 atoms
2 bonds
1 atom types
1 bond types
0 3 xlo xhi
0 1 ylo yhi
Atoms
1 1 1 0.5 0.5 0 0 0 0
2 1 1 1.5 0.5 0 0 0 0
3 1 1 2.5 0.5 0 -1 0 0
Bonds
1 1 1 2
2 1 3 1

View File

@ -0,0 +1,43 @@
# system with periodic bonds in both x and y
9 atoms
18 bonds
1 atom types
1 bond types
0 3 xlo xhi
0 3 ylo yhi
Atoms
1 1 1 0.5 0.5 0
2 1 1 1.5 0.5 0
3 1 1 2.5 0.5 0
4 1 1 0.5 1.5 0
5 1 1 1.5 1.5 0
6 1 1 2.5 1.5 0
7 1 1 0.5 2.5 0
8 1 1 1.5 2.5 0
9 1 1 2.5 2.5 0
Bonds
1 1 1 2
2 1 2 3
3 1 3 1
4 1 4 5
5 1 5 6
6 1 6 4
7 1 7 8
8 1 8 9
9 1 9 7
10 1 1 4
11 1 4 7
12 1 7 1
13 1 2 5
14 1 5 8
15 1 8 2
16 1 3 6
17 1 6 9
18 1 9 3

View File

@ -0,0 +1,22 @@
# system with periodic bonds in xy direction
3 atoms
3 bonds
1 atom types
1 bond types
0 3 xlo xhi
0 3 ylo yhi
Atoms
1 1 1 0.5 0.5 0
2 1 1 1.5 1.5 0
3 1 1 2.5 2.5 0
Bonds
1 1 1 2
2 1 2 3
3 1 3 1

View File

@ -0,0 +1,34 @@
# test of replicating system with periodic bonds in x
dimension 2
atom_style molecular
read_data data.bond.x
#replicate 3 3 1
replicate 3 3 1 bond/periodic
mass 1 1.0
velocity all create 0.02 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0
bond_style harmonic
bond_coeff 1 50.0 1.0
special_bonds fene
fix 1 all nve
write_data tmp.data.x
dump 1 all image 100 tmp.image.x.*.ppm type type &
adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.x.mpg type type &
# adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000

View File

@ -0,0 +1,34 @@
# test of replicating system with periodic bonds in x
dimension 2
atom_style molecular
read_data data.bond.x.noloop
replicate 3 3 1
#replicate 3 3 1 bond/periodic
mass 1 1.0
velocity all create 0.001 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0
bond_style harmonic
bond_coeff 1 50.0 1.0
special_bonds fene
fix 1 all nve
write_data tmp.data.x.non
dump 1 all image 100 tmp.image.x.non.*.ppm type type &
adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.x.non.mpg type type &
# adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000

View File

@ -0,0 +1,34 @@
# test of replicating system with periodic bonds in both x and y
dimension 2
atom_style molecular
read_data data.bond.x.y
#replicate 3 3 1
replicate 3 3 1 bond/periodic
mass 1 1.0
velocity all create 0.02 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0
bond_style harmonic
bond_coeff 1 50.0 1.0
special_bonds fene
fix 1 all nve
write_data tmp.data.x.y
dump 1 all image 100 tmp.image.x.y.*.ppm type type &
adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.x.y.mpg type type &
# adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000

View File

@ -0,0 +1,34 @@
# test of replicating system with periodic bonds in xy diagonal direction
dimension 2
atom_style molecular
read_data data.bond.xy
#replicate 3 3 1
replicate 3 3 1 bond/periodic
mass 1 1.0
velocity all create 0.02 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.5
bond_style harmonic
bond_coeff 1 50.0 1.414
special_bonds fene
fix 1 all nve
write_data tmp.data.xy
dump 1 all image 100 tmp.image.xy.*.ppm type type &
adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.xy.mpg type type &
# adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000

View File

@ -0,0 +1,32 @@
# three orthogonal periodic CNTs
# demo for replicating triply looped system
# infinite loops in x, y, z
# includes bonded interactions across box corners
# includes bonds, angles, dihedrals, impropers (class2)
units real
boundary p p p
atom_style full
pair_style lj/class2 10
angle_style class2
bond_style class2
dihedral_style class2
improper_style class2
read_data three_periodic_CNTs.data.gz
replicate 2 2 2 bond/periodic
fix 1 all nve
run 100
# write_restart replicate.restart
# write_data replicate.data

View File

@ -0,0 +1,125 @@
LAMMPS (17 Apr 2024)
# test of replicating system with periodic bonds in x
dimension 2
atom_style molecular
read_data data.bond.x
Reading data file ...
orthogonal box = (0 0 -0.5) to (3 1 0.5)
1 by 1 by 1 MPI processor grid
reading atoms ...
3 atoms
scanning bonds ...
1 = max bonds/atom
orthogonal box = (0 0 -0.5) to (3 1 0.5)
1 by 1 by 1 MPI processor grid
reading bonds ...
3 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
2 = max # of 1-3 neighbors
4 = max # of 1-4 neighbors
2 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.004 seconds
#replicate 3 3 1
replicate 3 3 1 bond/periodic
Replication is creating a 3x3x1 = 9 times larger system...
orthogonal box = (0 0 -0.5) to (9 3 0.5)
1 by 1 by 1 MPI processor grid
bounding box image = (0 0 0) to (0 0 0)
bounding box extra memory = 0.00 MB
average # of replicas added to proc = 9.00 out of 9 (100.00%)
27 atoms
27 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
2 = max # of 1-3 neighbors
4 = max # of 1-4 neighbors
6 = max # of special neighbors
special bonds CPU = 0.000 seconds
replicate CPU = 0.001 seconds
mass 1 1.0
velocity all create 0.02 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0
bond_style harmonic
bond_coeff 1 50.0 1.0
special_bonds fene
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 1 1
special bond factors coul: 0 1 1
2 = max # of 1-2 neighbors
6 = max # of special neighbors
special bonds CPU = 0.000 seconds
fix 1 all nve
write_data tmp.data.x
System init for write_data ...
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 2.8
ghost atom cutoff = 2.8
binsize = 1.4, bins = 7 3 1
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/2d
bin: standard
dump 1 all image 100 tmp.image.x.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.x.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
WARNING: Inconsistent image flags (../domain.cpp:1051)
Per MPI rank memory allocation (min/avg/max) = 6.302 | 6.302 | 6.302 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0.02 -1.1250229 0 -1.1057636 9.028122
5000 0.54111971 -1.9054641 0.29066874 -1.0937172 3.4346743
Loop time of 0.0764878 on 1 procs for 5000 steps with 27 atoms
Performance: 28239805.842 tau/day, 65369.921 timesteps/s, 1.765 Matom-step/s
66.5% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.0048837 | 0.0048837 | 0.0048837 | 0.0 | 6.38
Bond | 0.00065879 | 0.00065879 | 0.00065879 | 0.0 | 0.86
Neigh | 0.0019897 | 0.0019897 | 0.0019897 | 0.0 | 2.60
Comm | 0.0012815 | 0.0012815 | 0.0012815 | 0.0 | 1.68
Output | 0.066351 | 0.066351 | 0.066351 | 0.0 | 86.75
Modify | 0.00069789 | 0.00069789 | 0.00069789 | 0.0 | 0.91
Other | | 0.0006247 | | | 0.82
Nlocal: 27 ave 27 max 27 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 108 ave 108 max 108 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 284 ave 284 max 284 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 284
Ave neighs/atom = 10.518519
Ave special neighs/atom = 2
Neighbor list builds = 287
Dangerous builds = 0
Total wall time: 0:00:00

View File

@ -0,0 +1,126 @@
LAMMPS (17 Apr 2024)
WARNING: Using I/O redirection is unreliable with parallel runs. Better to use the -in switch to read input files. (../lammps.cpp:551)
# test of replicating system with periodic bonds in x
dimension 2
atom_style molecular
read_data data.bond.x
Reading data file ...
orthogonal box = (0 0 -0.5) to (3 1 0.5)
4 by 1 by 1 MPI processor grid
reading atoms ...
3 atoms
scanning bonds ...
1 = max bonds/atom
orthogonal box = (0 0 -0.5) to (3 1 0.5)
4 by 1 by 1 MPI processor grid
reading bonds ...
3 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
2 = max # of 1-3 neighbors
4 = max # of 1-4 neighbors
2 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.003 seconds
#replicate 3 3 1
replicate 3 3 1 bond/periodic
Replication is creating a 3x3x1 = 9 times larger system...
orthogonal box = (0 0 -0.5) to (9 3 0.5)
4 by 1 by 1 MPI processor grid
bounding box image = (0 0 0) to (0 0 0)
bounding box extra memory = 0.00 MB
average # of replicas added to proc = 5.25 out of 9 (58.33%)
27 atoms
27 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
2 = max # of 1-3 neighbors
4 = max # of 1-4 neighbors
6 = max # of special neighbors
special bonds CPU = 0.000 seconds
replicate CPU = 0.002 seconds
mass 1 1.0
velocity all create 0.02 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0
bond_style harmonic
bond_coeff 1 50.0 1.0
special_bonds fene
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 1 1
special bond factors coul: 0 1 1
2 = max # of 1-2 neighbors
6 = max # of special neighbors
special bonds CPU = 0.000 seconds
fix 1 all nve
write_data tmp.data.x
System init for write_data ...
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 2.8
ghost atom cutoff = 2.8
binsize = 1.4, bins = 7 3 1
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/2d
bin: standard
dump 1 all image 100 tmp.image.x.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.x.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
WARNING: Inconsistent image flags (../domain.cpp:1051)
Per MPI rank memory allocation (min/avg/max) = 6.309 | 6.309 | 6.309 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0.02 -1.1250229 0 -1.1057636 9.028122
5000 0.50911963 -1.7968226 0.21209852 -1.0944607 4.1676488
Loop time of 0.21682 on 4 procs for 5000 steps with 27 atoms
Performance: 9962160.612 tau/day, 23060.557 timesteps/s, 622.635 katom-step/s
93.9% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.001787 | 0.0021247 | 0.0028772 | 1.0 | 0.98
Bond | 0.00039682 | 0.00045617 | 0.00059887 | 0.0 | 0.21
Neigh | 0.0013626 | 0.0014006 | 0.0014798 | 0.1 | 0.65
Comm | 0.017009 | 0.01791 | 0.018656 | 0.5 | 8.26
Output | 0.06892 | 0.12188 | 0.18918 | 13.7 | 56.21
Modify | 0.00060336 | 0.00072159 | 0.00088047 | 0.0 | 0.33
Other | | 0.07233 | | | 33.36
Nlocal: 6.75 ave 7 max 6 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 64.5 ave 65 max 63 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Neighs: 70.25 ave 77 max 60 min
Histogram: 1 0 0 0 0 1 0 0 1 1
Total # of neighbors = 281
Ave neighs/atom = 10.407407
Ave special neighs/atom = 2
Neighbor list builds = 287
Dangerous builds = 0
Total wall time: 0:00:00

View File

@ -0,0 +1,121 @@
LAMMPS (17 Apr 2024)
# test of replicating system with periodic bonds in x
dimension 2
atom_style molecular
read_data data.bond.x.non
Reading data file ...
orthogonal box = (0 0 -0.5) to (3 1 0.5)
1 by 1 by 1 MPI processor grid
reading atoms ...
3 atoms
scanning bonds ...
1 = max bonds/atom
orthogonal box = (0 0 -0.5) to (3 1 0.5)
1 by 1 by 1 MPI processor grid
reading bonds ...
2 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
1 = max # of 1-3 neighbors
1 = max # of 1-4 neighbors
2 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.004 seconds
replicate 3 3 1
Replication is creating a 3x3x1 = 9 times larger system...
orthogonal box = (0 0 -0.5) to (9 3 0.5)
1 by 1 by 1 MPI processor grid
27 atoms
18 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
1 = max # of 1-3 neighbors
1 = max # of 1-4 neighbors
2 = max # of special neighbors
special bonds CPU = 0.000 seconds
replicate CPU = 0.001 seconds
#replicate 3 3 1 bond/periodic
mass 1 1.0
velocity all create 0.001 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0
bond_style harmonic
bond_coeff 1 50.0 1.0
special_bonds fene
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 1 1
special bond factors coul: 0 1 1
2 = max # of 1-2 neighbors
2 = max # of special neighbors
special bonds CPU = 0.000 seconds
fix 1 all nve
write_data tmp.data.x.non
System init for write_data ...
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 2.8
ghost atom cutoff = 2.8
binsize = 1.4, bins = 7 3 1
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/2d
bin: standard
dump 1 all image 100 tmp.image.x.non.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.x.non.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
Per MPI rank memory allocation (min/avg/max) = 6.052 | 6.052 | 6.052 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0.001 -1.1250229 0 -1.1240599 13.009826
5000 0.62003692 -2.0147214 0.30861545 -1.1090334 8.0279226
Loop time of 0.0734456 on 1 procs for 5000 steps with 27 atoms
Performance: 29409520.548 tau/day, 68077.594 timesteps/s, 1.838 Matom-step/s
94.4% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.0051444 | 0.0051444 | 0.0051444 | 0.0 | 7.00
Bond | 0.00048789 | 0.00048789 | 0.00048789 | 0.0 | 0.66
Neigh | 0.0019333 | 0.0019333 | 0.0019333 | 0.0 | 2.63
Comm | 0.001332 | 0.001332 | 0.001332 | 0.0 | 1.81
Output | 0.063139 | 0.063139 | 0.063139 | 0.0 | 85.97
Modify | 0.00077014 | 0.00077014 | 0.00077014 | 0.0 | 1.05
Other | | 0.0006387 | | | 0.87
Nlocal: 27 ave 27 max 27 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 101 ave 101 max 101 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 288 ave 288 max 288 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 288
Ave neighs/atom = 10.666667
Ave special neighs/atom = 1.3333333
Neighbor list builds = 322
Dangerous builds = 0
Total wall time: 0:00:00

View File

@ -0,0 +1,122 @@
LAMMPS (17 Apr 2024)
WARNING: Using I/O redirection is unreliable with parallel runs. Better to use the -in switch to read input files. (../lammps.cpp:551)
# test of replicating system with periodic bonds in x
dimension 2
atom_style molecular
read_data data.bond.x.non
Reading data file ...
orthogonal box = (0 0 -0.5) to (3 1 0.5)
4 by 1 by 1 MPI processor grid
reading atoms ...
3 atoms
scanning bonds ...
1 = max bonds/atom
orthogonal box = (0 0 -0.5) to (3 1 0.5)
4 by 1 by 1 MPI processor grid
reading bonds ...
2 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
1 = max # of 1-3 neighbors
1 = max # of 1-4 neighbors
2 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.004 seconds
replicate 3 3 1
Replication is creating a 3x3x1 = 9 times larger system...
orthogonal box = (0 0 -0.5) to (9 3 0.5)
4 by 1 by 1 MPI processor grid
27 atoms
18 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
1 = max # of 1-3 neighbors
1 = max # of 1-4 neighbors
2 = max # of special neighbors
special bonds CPU = 0.000 seconds
replicate CPU = 0.002 seconds
#replicate 3 3 1 bond/periodic
mass 1 1.0
velocity all create 0.001 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0
bond_style harmonic
bond_coeff 1 50.0 1.0
special_bonds fene
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 1 1
special bond factors coul: 0 1 1
2 = max # of 1-2 neighbors
2 = max # of special neighbors
special bonds CPU = 0.000 seconds
fix 1 all nve
write_data tmp.data.x.non
System init for write_data ...
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 2.8
ghost atom cutoff = 2.8
binsize = 1.4, bins = 7 3 1
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/2d
bin: standard
dump 1 all image 100 tmp.image.x.non.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.x.non.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
Per MPI rank memory allocation (min/avg/max) = 6.059 | 6.059 | 6.059 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0.001 -1.1250229 0 -1.1240599 13.009826
5000 0.74931971 -2.233724 0.40158766 -1.1105692 5.6354701
Loop time of 0.197835 on 4 procs for 5000 steps with 27 atoms
Performance: 10918214.594 tau/day, 25273.645 timesteps/s, 682.388 katom-step/s
88.8% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.0018771 | 0.0021131 | 0.0027188 | 0.8 | 1.07
Bond | 0.00032659 | 0.00038248 | 0.00049555 | 0.0 | 0.19
Neigh | 0.001385 | 0.0014211 | 0.0014704 | 0.1 | 0.72
Comm | 0.017163 | 0.017405 | 0.017805 | 0.2 | 8.80
Output | 0.070971 | 0.11052 | 0.17112 | 12.1 | 55.87
Modify | 0.00058993 | 0.00067708 | 0.00075608 | 0.0 | 0.34
Other | | 0.06532 | | | 33.02
Nlocal: 6.75 ave 7 max 6 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 59.75 ave 60 max 59 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Neighs: 72 ave 79 max 63 min
Histogram: 1 0 0 0 0 0 2 0 0 1
Total # of neighbors = 288
Ave neighs/atom = 10.666667
Ave special neighs/atom = 1.3333333
Neighbor list builds = 323
Dangerous builds = 0
Total wall time: 0:00:00

View File

@ -0,0 +1,125 @@
LAMMPS (17 Apr 2024)
# test of replicating system with periodic bonds in both x and y
dimension 2
atom_style molecular
read_data data.bond.x.y
Reading data file ...
orthogonal box = (0 0 -0.5) to (3 3 0.5)
1 by 1 by 1 MPI processor grid
reading atoms ...
9 atoms
scanning bonds ...
2 = max bonds/atom
orthogonal box = (0 0 -0.5) to (3 3 0.5)
1 by 1 by 1 MPI processor grid
reading bonds ...
18 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
4 = max # of 1-2 neighbors
12 = max # of 1-3 neighbors
48 = max # of 1-4 neighbors
8 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.004 seconds
#replicate 3 3 1
replicate 3 3 1 bond/periodic
Replication is creating a 3x3x1 = 9 times larger system...
orthogonal box = (0 0 -0.5) to (9 9 0.5)
1 by 1 by 1 MPI processor grid
bounding box image = (0 0 0) to (0 0 0)
bounding box extra memory = 0.00 MB
average # of replicas added to proc = 9.00 out of 9 (100.00%)
81 atoms
162 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
4 = max # of 1-2 neighbors
12 = max # of 1-3 neighbors
48 = max # of 1-4 neighbors
24 = max # of special neighbors
special bonds CPU = 0.000 seconds
replicate CPU = 0.001 seconds
mass 1 1.0
velocity all create 0.02 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0
bond_style harmonic
bond_coeff 1 50.0 1.0
special_bonds fene
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 1 1
special bond factors coul: 0 1 1
4 = max # of 1-2 neighbors
24 = max # of special neighbors
special bonds CPU = 0.000 seconds
fix 1 all nve
write_data tmp.data.x.y
System init for write_data ...
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 2.8
ghost atom cutoff = 2.8
binsize = 1.4, bins = 7 7 1
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/2d
bin: standard
dump 1 all image 100 tmp.image.x.y.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.x.y.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
WARNING: Inconsistent image flags (../domain.cpp:1051)
Per MPI rank memory allocation (min/avg/max) = 7.555 | 7.555 | 7.555 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0.02 -1.1250229 0 -1.1052698 -2.9713842
5000 0.046175679 -1.2280388 0.080003864 -1.1024293 -4.1097897
Loop time of 0.212344 on 1 procs for 5000 steps with 81 atoms
Performance: 10172161.526 tau/day, 23546.670 timesteps/s, 1.907 Matom-step/s
93.0% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.01283 | 0.01283 | 0.01283 | 0.0 | 6.04
Bond | 0.0032785 | 0.0032785 | 0.0032785 | 0.0 | 1.54
Neigh | 0.0018379 | 0.0018379 | 0.0018379 | 0.0 | 0.87
Comm | 0.0016247 | 0.0016247 | 0.0016247 | 0.0 | 0.77
Output | 0.18991 | 0.18991 | 0.18991 | 0.0 | 89.44
Modify | 0.0018198 | 0.0018198 | 0.0018198 | 0.0 | 0.86
Other | | 0.001039 | | | 0.49
Nlocal: 81 ave 81 max 81 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 144 ave 144 max 144 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 714 ave 714 max 714 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 714
Ave neighs/atom = 8.8148148
Ave special neighs/atom = 4
Neighbor list builds = 72
Dangerous builds = 0
Total wall time: 0:00:00

View File

@ -0,0 +1,126 @@
LAMMPS (17 Apr 2024)
WARNING: Using I/O redirection is unreliable with parallel runs. Better to use the -in switch to read input files. (../lammps.cpp:551)
# test of replicating system with periodic bonds in both x and y
dimension 2
atom_style molecular
read_data data.bond.x.y
Reading data file ...
orthogonal box = (0 0 -0.5) to (3 3 0.5)
2 by 2 by 1 MPI processor grid
reading atoms ...
9 atoms
scanning bonds ...
2 = max bonds/atom
orthogonal box = (0 0 -0.5) to (3 3 0.5)
2 by 2 by 1 MPI processor grid
reading bonds ...
18 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
4 = max # of 1-2 neighbors
12 = max # of 1-3 neighbors
48 = max # of 1-4 neighbors
8 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.003 seconds
#replicate 3 3 1
replicate 3 3 1 bond/periodic
Replication is creating a 3x3x1 = 9 times larger system...
orthogonal box = (0 0 -0.5) to (9 9 0.5)
2 by 2 by 1 MPI processor grid
bounding box image = (0 0 0) to (0 0 0)
bounding box extra memory = 0.00 MB
average # of replicas added to proc = 6.25 out of 9 (69.44%)
81 atoms
162 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
4 = max # of 1-2 neighbors
12 = max # of 1-3 neighbors
48 = max # of 1-4 neighbors
24 = max # of special neighbors
special bonds CPU = 0.000 seconds
replicate CPU = 0.001 seconds
mass 1 1.0
velocity all create 0.02 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.0
bond_style harmonic
bond_coeff 1 50.0 1.0
special_bonds fene
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 1 1
special bond factors coul: 0 1 1
4 = max # of 1-2 neighbors
24 = max # of special neighbors
special bonds CPU = 0.000 seconds
fix 1 all nve
write_data tmp.data.x.y
System init for write_data ...
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 2.8
ghost atom cutoff = 2.8
binsize = 1.4, bins = 7 7 1
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/2d
bin: standard
dump 1 all image 100 tmp.image.x.y.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.x.y.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
WARNING: Inconsistent image flags (../domain.cpp:1051)
Per MPI rank memory allocation (min/avg/max) = 7.552 | 7.552 | 7.552 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0.02 -1.1250229 0 -1.1052698 -2.9713842
5000 0.046175679 -1.2280388 0.080003864 -1.1024293 -4.1097897
Loop time of 0.273847 on 4 procs for 5000 steps with 81 atoms
Performance: 7887622.810 tau/day, 18258.386 timesteps/s, 1.479 Matom-step/s
92.4% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.0039465 | 0.0042593 | 0.0046129 | 0.4 | 1.56
Bond | 0.0011489 | 0.001207 | 0.0012757 | 0.2 | 0.44
Neigh | 0.00079819 | 0.0008044 | 0.00081324 | 0.0 | 0.29
Comm | 0.024107 | 0.024703 | 0.025269 | 0.3 | 9.02
Output | 0.14406 | 0.18123 | 0.23779 | 8.7 | 66.18
Modify | 0.00089401 | 0.00095321 | 0.0010422 | 0.0 | 0.35
Other | | 0.06069 | | | 22.16
Nlocal: 20.25 ave 22 max 19 min
Histogram: 2 0 0 0 0 0 1 0 0 1
Nghost: 81.5 ave 82 max 80 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Neighs: 178.5 ave 195 max 165 min
Histogram: 2 0 0 0 0 0 0 1 0 1
Total # of neighbors = 714
Ave neighs/atom = 8.8148148
Ave special neighs/atom = 4
Neighbor list builds = 72
Dangerous builds = 0
Total wall time: 0:00:00

View File

@ -0,0 +1,125 @@
LAMMPS (17 Apr 2024)
# test of replicating system with periodic bonds in xy diagonal direction
dimension 2
atom_style molecular
read_data data.bond.xy
Reading data file ...
orthogonal box = (0 0 -0.5) to (3 3 0.5)
1 by 1 by 1 MPI processor grid
reading atoms ...
3 atoms
scanning bonds ...
1 = max bonds/atom
orthogonal box = (0 0 -0.5) to (3 3 0.5)
1 by 1 by 1 MPI processor grid
reading bonds ...
3 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
2 = max # of 1-3 neighbors
4 = max # of 1-4 neighbors
2 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.004 seconds
#replicate 3 3 1
replicate 3 3 1 bond/periodic
Replication is creating a 3x3x1 = 9 times larger system...
orthogonal box = (0 0 -0.5) to (9 9 0.5)
1 by 1 by 1 MPI processor grid
bounding box image = (0 0 0) to (0 0 0)
bounding box extra memory = 0.00 MB
average # of replicas added to proc = 9.00 out of 9 (100.00%)
27 atoms
27 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
2 = max # of 1-3 neighbors
4 = max # of 1-4 neighbors
6 = max # of special neighbors
special bonds CPU = 0.000 seconds
replicate CPU = 0.001 seconds
mass 1 1.0
velocity all create 0.02 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.5
bond_style harmonic
bond_coeff 1 50.0 1.414
special_bonds fene
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 1 1
special bond factors coul: 0 1 1
2 = max # of 1-2 neighbors
6 = max # of special neighbors
special bonds CPU = 0.000 seconds
fix 1 all nve
write_data tmp.data.xy
System init for write_data ...
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 2.8
ghost atom cutoff = 2.8
binsize = 1.4, bins = 7 7 1
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/2d
bin: standard
dump 1 all image 100 tmp.image.xy.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.xy.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
WARNING: Inconsistent image flags (../domain.cpp:1051)
Per MPI rank memory allocation (min/avg/max) = 6.302 | 6.302 | 6.302 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0.02 -0.66256987 2.2804444e-06 -0.64330834 -0.59475371
5000 0.43110862 -1.1484506 0.16888799 -0.56442095 -0.3683968
Loop time of 0.124095 on 1 procs for 5000 steps with 27 atoms
Performance: 17406010.885 tau/day, 40291.692 timesteps/s, 1.088 Matom-step/s
82.3% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.0013734 | 0.0013734 | 0.0013734 | 0.0 | 1.11
Bond | 0.00064058 | 0.00064058 | 0.00064058 | 0.0 | 0.52
Neigh | 0.00090424 | 0.00090424 | 0.00090424 | 0.0 | 0.73
Comm | 0.00081732 | 0.00081732 | 0.00081732 | 0.0 | 0.66
Output | 0.11905 | 0.11905 | 0.11905 | 0.0 | 95.93
Modify | 0.0007252 | 0.0007252 | 0.0007252 | 0.0 | 0.58
Other | | 0.0005888 | | | 0.47
Nlocal: 27 ave 27 max 27 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 45 ave 45 max 45 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 66 ave 66 max 66 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 66
Ave neighs/atom = 2.4444444
Ave special neighs/atom = 2
Neighbor list builds = 244
Dangerous builds = 0
Total wall time: 0:00:00

View File

@ -0,0 +1,126 @@
LAMMPS (17 Apr 2024)
WARNING: Using I/O redirection is unreliable with parallel runs. Better to use the -in switch to read input files. (../lammps.cpp:551)
# test of replicating system with periodic bonds in xy diagonal direction
dimension 2
atom_style molecular
read_data data.bond.xy
Reading data file ...
orthogonal box = (0 0 -0.5) to (3 3 0.5)
2 by 2 by 1 MPI processor grid
reading atoms ...
3 atoms
scanning bonds ...
1 = max bonds/atom
orthogonal box = (0 0 -0.5) to (3 3 0.5)
2 by 2 by 1 MPI processor grid
reading bonds ...
3 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
2 = max # of 1-3 neighbors
4 = max # of 1-4 neighbors
2 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.003 seconds
#replicate 3 3 1
replicate 3 3 1 bond/periodic
Replication is creating a 3x3x1 = 9 times larger system...
orthogonal box = (0 0 -0.5) to (9 9 0.5)
2 by 2 by 1 MPI processor grid
bounding box image = (0 0 0) to (0 0 0)
bounding box extra memory = 0.00 MB
average # of replicas added to proc = 6.25 out of 9 (69.44%)
27 atoms
27 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
2 = max # of 1-3 neighbors
4 = max # of 1-4 neighbors
6 = max # of special neighbors
special bonds CPU = 0.000 seconds
replicate CPU = 0.001 seconds
mass 1 1.0
velocity all create 0.02 87287 loop geom
pair_style lj/cut 2.5
pair_coeff 1 1 1.0 1.5
bond_style harmonic
bond_coeff 1 50.0 1.414
special_bonds fene
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 1 1
special bond factors coul: 0 1 1
2 = max # of 1-2 neighbors
6 = max # of special neighbors
special bonds CPU = 0.000 seconds
fix 1 all nve
write_data tmp.data.xy
System init for write_data ...
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 2.8
ghost atom cutoff = 2.8
binsize = 1.4, bins = 7 7 1
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/2d
bin: standard
dump 1 all image 100 tmp.image.xy.*.ppm type type adiam 0.2 bond type 0.1 zoom 1.6
dump_modify 1 pad 5
#dump 2 all movie 100 tmp.movie.xy.mpg type type # adiam 0.2 bond type 0.1 zoom 1.6
#dump_modify 2 pad 5
run 5000
Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule
WARNING: Inconsistent image flags (../domain.cpp:1051)
Per MPI rank memory allocation (min/avg/max) = 6.301 | 6.301 | 6.301 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0.02 -0.66256988 2.2804444e-06 -0.64330834 -0.59475371
5000 0.43110877 -1.1484507 0.168888 -0.56442093 -0.36839692
Loop time of 0.286423 on 4 procs for 5000 steps with 27 atoms
Performance: 7541285.935 tau/day, 17456.680 timesteps/s, 471.330 katom-step/s
92.9% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.00054941 | 0.00084836 | 0.0013689 | 0.0 | 0.30
Bond | 0.00034068 | 0.00045816 | 0.00068461 | 0.0 | 0.16
Neigh | 0.00092076 | 0.00098494 | 0.0010463 | 0.0 | 0.34
Comm | 0.018151 | 0.018737 | 0.019531 | 0.4 | 6.54
Output | 0.13261 | 0.19363 | 0.2596 | 10.7 | 67.60
Modify | 0.00053153 | 0.00071381 | 0.0010268 | 0.0 | 0.25
Other | | 0.07105 | | | 24.81
Nlocal: 6.75 ave 9 max 5 min
Histogram: 2 0 0 0 0 0 0 1 0 1
Nghost: 26.25 ave 28 max 25 min
Histogram: 2 0 0 0 0 0 1 0 0 1
Neighs: 16.5 ave 23 max 10 min
Histogram: 1 1 0 0 0 0 0 0 1 1
Total # of neighbors = 66
Ave neighs/atom = 2.4444444
Ave special neighs/atom = 2
Neighbor list builds = 244
Dangerous builds = 0
Total wall time: 0:00:00

View File

@ -0,0 +1,134 @@
LAMMPS (17 Apr 2024)
# three orthogonal periodic CNTs
# demo for replicating triply looped system
# infinite loops in x, y, z
# includes bonded interactions across box corners
# includes bonds, angles, dihedrals, impropers (class2)
units real
boundary p p p
atom_style full
pair_style lj/class2 10
angle_style class2
bond_style class2
dihedral_style class2
improper_style class2
read_data three_periodic_CNTs.data.gz
Reading data file ...
orthogonal box = (0 0 0) to (80.96 80.96 80.96)
1 by 1 by 1 MPI processor grid
reading atoms ...
3168 atoms
reading velocities ...
3168 velocities
scanning bonds ...
3 = max bonds/atom
scanning angles ...
3 = max angles/atom
scanning dihedrals ...
12 = max dihedrals/atom
scanning impropers ...
1 = max impropers/atom
orthogonal box = (0 0 0) to (80.96 80.96 80.96)
1 by 1 by 1 MPI processor grid
reading bonds ...
4752 bonds
reading angles ...
9504 angles
reading dihedrals ...
19008 dihedrals
reading impropers ...
3168 impropers
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
3 = max # of 1-2 neighbors
6 = max # of 1-3 neighbors
18 = max # of 1-4 neighbors
18 = max # of special neighbors
special bonds CPU = 0.002 seconds
read_data CPU = 0.056 seconds
replicate 2 2 2 bond/periodic
Replication is creating a 2x2x2 = 8 times larger system...
orthogonal box = (0 0 0) to (161.92 161.92 161.92)
1 by 1 by 1 MPI processor grid
bounding box image = (0 0 0) to (0 0 0)
bounding box extra memory = 1.62 MB
average # of replicas added to proc = 8.00 out of 8 (100.00%)
25344 atoms
38016 bonds
76032 angles
152064 dihedrals
25344 impropers
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
3 = max # of 1-2 neighbors
6 = max # of 1-3 neighbors
18 = max # of 1-4 neighbors
18 = max # of special neighbors
special bonds CPU = 0.012 seconds
replicate CPU = 0.027 seconds
fix 1 all nve
run 100
Generated 0 of 0 mixed pair_coeff terms from sixthpower/geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 12
ghost atom cutoff = 12
binsize = 6, bins = 27 27 27
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/class2, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/3d
bin: standard
WARNING: Inconsistent image flags (../domain.cpp:1051)
Per MPI rank memory allocation (min/avg/max) = 51.87 | 51.87 | 51.87 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0 -14266.189 1466925.5 1452659.3 -29908.753
100 2155.9128 -17224.188 1306769.8 1452409 1985.2082
Loop time of 5.0155 on 1 procs for 100 steps with 25344 atoms
Performance: 1.723 ns/day, 13.932 hours/ns, 19.938 timesteps/s, 505.314 katom-step/s
100.0% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 1.6557 | 1.6557 | 1.6557 | 0.0 | 33.01
Bond | 3.2813 | 3.2813 | 3.2813 | 0.0 | 65.42
Neigh | 0.047025 | 0.047025 | 0.047025 | 0.0 | 0.94
Comm | 0.0085317 | 0.0085317 | 0.0085317 | 0.0 | 0.17
Output | 7.8551e-05 | 7.8551e-05 | 7.8551e-05 | 0.0 | 0.00
Modify | 0.014635 | 0.014635 | 0.014635 | 0.0 | 0.29
Other | | 0.008159 | | | 0.16
Nlocal: 25344 ave 25344 max 25344 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 22737 ave 22737 max 22737 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 2.89358e+06 ave 2.89358e+06 max 2.89358e+06 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 2893576
Ave neighs/atom = 114.17203
Ave special neighs/atom = 18
Neighbor list builds = 1
Dangerous builds = 0
# write_restart replicate.restart
# write_data replicate.data
Total wall time: 0:00:05

View File

@ -0,0 +1,135 @@
LAMMPS (17 Apr 2024)
WARNING: Using I/O redirection is unreliable with parallel runs. Better to use the -in switch to read input files. (../lammps.cpp:551)
# three orthogonal periodic CNTs
# demo for replicating triply looped system
# infinite loops in x, y, z
# includes bonded interactions across box corners
# includes bonds, angles, dihedrals, impropers (class2)
units real
boundary p p p
atom_style full
pair_style lj/class2 10
angle_style class2
bond_style class2
dihedral_style class2
improper_style class2
read_data three_periodic_CNTs.data.gz
Reading data file ...
orthogonal box = (0 0 0) to (80.96 80.96 80.96)
1 by 2 by 2 MPI processor grid
reading atoms ...
3168 atoms
reading velocities ...
3168 velocities
scanning bonds ...
3 = max bonds/atom
scanning angles ...
3 = max angles/atom
scanning dihedrals ...
12 = max dihedrals/atom
scanning impropers ...
1 = max impropers/atom
orthogonal box = (0 0 0) to (80.96 80.96 80.96)
1 by 2 by 2 MPI processor grid
reading bonds ...
4752 bonds
reading angles ...
9504 angles
reading dihedrals ...
19008 dihedrals
reading impropers ...
3168 impropers
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
3 = max # of 1-2 neighbors
6 = max # of 1-3 neighbors
18 = max # of 1-4 neighbors
18 = max # of special neighbors
special bonds CPU = 0.001 seconds
read_data CPU = 0.064 seconds
replicate 2 2 2 bond/periodic
Replication is creating a 2x2x2 = 8 times larger system...
orthogonal box = (0 0 0) to (161.92 161.92 161.92)
1 by 2 by 2 MPI processor grid
bounding box image = (0 0 0) to (0 0 0)
bounding box extra memory = 1.62 MB
average # of replicas added to proc = 4.50 out of 8 (56.25%)
25344 atoms
38016 bonds
76032 angles
152064 dihedrals
25344 impropers
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
3 = max # of 1-2 neighbors
6 = max # of 1-3 neighbors
18 = max # of 1-4 neighbors
18 = max # of special neighbors
special bonds CPU = 0.004 seconds
replicate CPU = 0.012 seconds
fix 1 all nve
run 100
Generated 0 of 0 mixed pair_coeff terms from sixthpower/geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 12
ghost atom cutoff = 12
binsize = 6, bins = 27 27 27
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/class2, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/3d
bin: standard
WARNING: Inconsistent image flags (../domain.cpp:1051)
Per MPI rank memory allocation (min/avg/max) = 28.69 | 28.69 | 28.69 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0 -14266.189 1466925.5 1452659.3 -29908.753
100 2155.9128 -17224.188 1306769.8 1452409 1985.2082
Loop time of 1.3667 on 4 procs for 100 steps with 25344 atoms
Performance: 6.322 ns/day, 3.796 hours/ns, 73.169 timesteps/s, 1.854 Matom-step/s
99.8% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.43424 | 0.43539 | 0.43741 | 0.2 | 31.86
Bond | 0.88613 | 0.89013 | 0.90094 | 0.7 | 65.13
Neigh | 0.013198 | 0.013199 | 0.013201 | 0.0 | 0.97
Comm | 0.010742 | 0.020522 | 0.02546 | 4.1 | 1.50
Output | 3.2788e-05 | 3.6302e-05 | 4.4556e-05 | 0.0 | 0.00
Modify | 0.0042029 | 0.0042366 | 0.004267 | 0.0 | 0.31
Other | | 0.003188 | | | 0.23
Nlocal: 6336 ave 6336 max 6336 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 10558 ave 10558 max 10558 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 723394 ave 723394 max 723394 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 2893576
Ave neighs/atom = 114.17203
Ave special neighs/atom = 18
Neighbor list builds = 1
Dangerous builds = 0
# write_restart replicate.restart
# write_data replicate.data
Total wall time: 0:00:01

Binary file not shown.

View File

@ -14,6 +14,7 @@
#include "bond_bpm.h" #include "bond_bpm.h"
#include "atom.h" #include "atom.h"
#include "citeme.h"
#include "comm.h" #include "comm.h"
#include "domain.h" #include "domain.h"
#include "error.h" #include "error.h"
@ -30,6 +31,19 @@
using namespace LAMMPS_NS; using namespace LAMMPS_NS;
static const char cite_bpm[] =
"BPM bond style: doi:10.1039/D3SM01373A\n\n"
"@Article{Clemmer2024,\n"
" author = {Clemmer, Joel T. and Monti, Joseph M. and Lechman, Jeremy B.},\n"
" title = {A soft departure from jamming: the compaction of deformable\n"
" granular matter under high pressures},\n"
" journal = {Soft Matter},\n"
" year = 2024,\n"
" volume = 20,\n"
" number = 8,\n"
" pages = {1702--1718}\n"
"}\n\n";
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
BondBPM::BondBPM(LAMMPS *_lmp) : BondBPM::BondBPM(LAMMPS *_lmp) :
@ -55,6 +69,8 @@ BondBPM::BondBPM(LAMMPS *_lmp) :
id_fix_dummy2 = utils::strdup("BPM_DUMMY2"); id_fix_dummy2 = utils::strdup("BPM_DUMMY2");
modify->add_fix(fmt::format("{} all DUMMY ", id_fix_dummy2)); modify->add_fix(fmt::format("{} all DUMMY ", id_fix_dummy2));
if (lmp->citeme) lmp->citeme->add(cite_bpm);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */

View File

@ -110,6 +110,12 @@ FixDeformPressure::FixDeformPressure(LAMMPS *lmp, int narg, char **arg) :
} }
set_extra[index].pgain = utils::numeric(FLERR, arg[iarg + 3], false, lmp); set_extra[index].pgain = utils::numeric(FLERR, arg[iarg + 3], false, lmp);
i += 4; i += 4;
} else if (strcmp(arg[iarg + 1], "erate/rescale") == 0) {
if (iarg + 3 > narg) utils::missing_cmd_args(FLERR, "fix deform/pressure erate/rescale", error);
set[index].style = ERATERS;
set[index].rate = utils::numeric(FLERR, arg[iarg + 2], false, lmp);
iarg += 3;
i += 3;
} else error->all(FLERR, "Illegal fix deform/pressure command: {}", arg[iarg + 1]); } else error->all(FLERR, "Illegal fix deform/pressure command: {}", arg[iarg + 1]);
} else if (strcmp(arg[iarg], "box") == 0) { } else if (strcmp(arg[iarg], "box") == 0) {
@ -424,16 +430,31 @@ void FixDeformPressure::init()
if (!pressure) if (!pressure)
error->all(FLERR, "Pressure ID {} for fix deform/pressure does not exist", id_press); error->all(FLERR, "Pressure ID {} for fix deform/pressure does not exist", id_press);
} }
// if yz [3] changes and will cause box flip, then xy [5] cannot be changing
// this is b/c the flips would induce continuous changes in xz
// in order to keep the edge vectors of the flipped shape matrix
// an integer combination of the edge vectors of the unflipped shape matrix
// error if style PRESSURE/ERATEER for yz, can't calculate if box flip occurs
if (set[3].style && set[5].style) {
int flag = 0;
double lo,hi;
if (flipflag && set[3].style == PRESSURE)
error->all(FLERR, "Fix {} cannot use yz pressure with xy", style);
if (flipflag && set[3].style == ERATERS)
error->all(FLERR, "Fix {} cannot use yz erate/rescale with xy", style);
}
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
compute T,P if needed before integrator starts compute T,P before integrator starts
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
void FixDeformPressure::setup(int /*vflag*/) void FixDeformPressure::setup(int /*vflag*/)
{ {
// trigger virial computation on next timestep // trigger virial computation, if needed, on next timestep
if (pressure_flag) pressure->addstep(update->ntimestep+1); if (pressure_flag) pressure->addstep(update->ntimestep + 1);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -446,7 +467,20 @@ void FixDeformPressure::end_of_step()
// set new box size for strain-based dims // set new box size for strain-based dims
if (strain_flag) FixDeform::apply_strain(); if (strain_flag) {
FixDeform::apply_strain();
for (int i = 3; i < 6; i++) {
if (set[i].style == ERATERS) {
double L = domain->zprd;
if (i == 5) L = domain->yprd;
h_rate[i] = set[i].rate * L;
set_extra[i].cumulative_shift += update->dt * h_rate[i];
set[i].tilt_target = set[i].tilt_start + set_extra[i].cumulative_shift;
}
}
}
// set new box size for pressure-based dims // set new box size for pressure-based dims
@ -479,12 +513,33 @@ void FixDeformPressure::end_of_step()
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
set_extra[i].prior_pressure = pressure->vector[i]; set_extra[i].prior_pressure = pressure->vector[i];
set_extra[i].prior_rate = ((set[i].hi_target - set[i].lo_target) / set_extra[i].prior_rate = ((set[i].hi_target - set[i].lo_target) /
(domain->boxhi[i] - domain->boxlo[i]) - 1.0) / update->dt; domain->prd[i] - 1.0) / update->dt;
} }
} }
if (varflag) modify->addstep_compute(update->ntimestep + nevery); if (varflag) modify->addstep_compute(update->ntimestep + nevery);
// If tilting while evolving linear dimension, sum remapping effects
// otherwise, update_domain() will inaccurately use the current
// linear dimension to apply prior remappings
for (int i = 3; i < 6; i++) {
int idenom = 0;
if (i == 3) idenom = 1;
if (set[i].style && (set_box.style || set[idenom].style) && domain->periodicity[idenom]) {
// Add prior remappings. If the box remaps this timestep, don't
// add it yet so update_domain() will first detect the remapping
set[i].tilt_target += set_extra[i].cumulative_remap;
// Update remapping for next timestep
double prd = set[idenom].hi_target - set[idenom].lo_target;
double prdinv = 1.0 / prd;
if (set[i].tilt_target * prdinv < -0.5)
set_extra[i].cumulative_remap += prd;
if (set[i].tilt_target * prdinv > 0.5)
set_extra[i].cumulative_remap -= prd;
}
}
FixDeform::update_domain(); FixDeform::update_domain();
@ -502,7 +557,7 @@ void FixDeformPressure::apply_pressure()
{ {
// If variable pressure, calculate current target // If variable pressure, calculate current target
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
if (set[i].style == PRESSURE) if (set[i].style == PRESSURE || set[i].style == PMEAN)
if (set_extra[i].pvar_flag) if (set_extra[i].pvar_flag)
set_extra[i].ptarget = input->variable->compute_equal(set_extra[i].pvar); set_extra[i].ptarget = input->variable->compute_equal(set_extra[i].pvar);
@ -556,26 +611,24 @@ void FixDeformPressure::apply_pressure()
h_ratelo[i] = -0.5 * h_rate[i]; h_ratelo[i] = -0.5 * h_rate[i];
double offset = 0.5 * (domain->boxhi[i] - domain->boxlo[i]) * (1.0 + update->dt * h_rate[i]); double shift = domain->prd[i] * update->dt * h_rate[i];
set[i].lo_target = 0.5 * (set[i].lo_start + set[i].hi_start) - offset; set_extra[i].cumulative_shift += shift;
set[i].hi_target = 0.5 * (set[i].lo_start + set[i].hi_start) + offset; set[i].lo_target = set[i].lo_start - 0.5 * set_extra[i].cumulative_shift;
set[i].hi_target = set[i].hi_start + 0.5 * set_extra[i].cumulative_shift;
} }
for (int i = 3; i < 6; i++) { for (int i = 3; i < 6; i++) {
if (set[i].style != PRESSURE) continue; if (set[i].style != PRESSURE) continue;
double L, tilt, pcurrent; double L, pcurrent;
if (i == 3) { if (i == 3) {
L = domain->zprd; L = domain->zprd;
tilt = domain->yz;
pcurrent = tensor[5]; pcurrent = tensor[5];
} else if (i == 4) { } else if (i == 4) {
L = domain->zprd; L = domain->zprd;
tilt = domain->xz + update->dt;
pcurrent = tensor[4]; pcurrent = tensor[4];
} else { } else {
L = domain->yprd; L = domain->yprd;
tilt = domain->xy;
pcurrent = tensor[3]; pcurrent = tensor[3];
} }
@ -592,7 +645,8 @@ void FixDeformPressure::apply_pressure()
if (fabs(h_rate[i]) > max_h_rate) if (fabs(h_rate[i]) > max_h_rate)
h_rate[i] = max_h_rate * h_rate[i] / fabs(h_rate[i]); h_rate[i] = max_h_rate * h_rate[i] / fabs(h_rate[i]);
set[i].tilt_target = tilt + update->dt * h_rate[i]; set_extra[i].cumulative_shift += update->dt * h_rate[i];
set[i].tilt_target = set[i].tilt_start + set_extra[i].cumulative_shift;
} }
} }
@ -629,9 +683,9 @@ void FixDeformPressure::apply_volume()
double dt = update->dt; double dt = update->dt;
double e1i = set_extra[i].prior_rate; double e1i = set_extra[i].prior_rate;
double e2i = set_extra[fixed].prior_rate; double e2i = set_extra[fixed].prior_rate;
double L1i = domain->boxhi[i] - domain->boxlo[i]; double L1i = domain->prd[i];
double L2i = domain->boxhi[fixed] - domain->boxlo[fixed]; double L2i = domain->prd[fixed];
double L3i = domain->boxhi[dynamic1] - domain->boxlo[dynamic1]; double L3i = domain->prd[dynamic1];
double L3 = (set[dynamic1].hi_target - set[dynamic1].lo_target); double L3 = (set[dynamic1].hi_target - set[dynamic1].lo_target);
double Vi = L1i * L2i * L3i; double Vi = L1i * L2i * L3i;
double V = L3 * L1i * L2i; double V = L3 * L1i * L2i;
@ -680,7 +734,7 @@ void FixDeformPressure::apply_volume()
} }
} }
h_rate[i] = (2.0 * shift / (domain->boxhi[i] - domain->boxlo[i]) - 1.0) / update->dt; h_rate[i] = (2.0 * shift / domain->prd[i] - 1.0) / update->dt;
h_ratelo[i] = -0.5 * h_rate[i]; h_ratelo[i] = -0.5 * h_rate[i];
set[i].lo_target = 0.5 * (set[i].lo_start + set[i].hi_start) - shift; set[i].lo_target = 0.5 * (set[i].lo_start + set[i].hi_start) - shift;
@ -742,7 +796,7 @@ void FixDeformPressure::apply_box()
set[i].hi_target = 0.5 * (set[i].lo_start + set[i].hi_start) + shift; set[i].hi_target = 0.5 * (set[i].lo_start + set[i].hi_start) + shift;
// Recalculate h_rate // Recalculate h_rate
h_rate[i] = (set[i].hi_target - set[i].lo_target) / (domain->boxhi[i] - domain->boxlo[i]) - 1.0; h_rate[i] = (set[i].hi_target - set[i].lo_target) / domain->prd[i] - 1.0;
h_rate[i] /= update->dt; h_rate[i] /= update->dt;
h_ratelo[i] = -0.5 * h_rate[i]; h_ratelo[i] = -0.5 * h_rate[i];
} }
@ -767,14 +821,21 @@ void FixDeformPressure::apply_box()
if (fabs(v_rate) > max_h_rate) if (fabs(v_rate) > max_h_rate)
v_rate = max_h_rate * v_rate / fabs(v_rate); v_rate = max_h_rate * v_rate / fabs(v_rate);
scale = (1.0 + update->dt * v_rate);
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
shift = 0.5 * (set[i].hi_target - set[i].lo_target) * scale; shift = (set[i].hi_target - set[i].lo_target) * update->dt * v_rate;
set[i].lo_target = 0.5 * (set[i].lo_start + set[i].hi_start) - shift; set_extra[6].cumulative_vshift[i] += shift;
set[i].hi_target = 0.5 * (set[i].lo_start + set[i].hi_start) + shift;
if (set[i].style == NONE) {
// Overwrite default targets of current length
set[i].lo_target = set[i].lo_start;
set[i].hi_target = set[i].hi_start;
}
set[i].lo_target -= 0.5 * set_extra[6].cumulative_vshift[i];
set[i].hi_target += 0.5 * set_extra[6].cumulative_vshift[i];
// Recalculate h_rate // Recalculate h_rate
h_rate[i] = (set[i].hi_target - set[i].lo_target) / (domain->boxhi[i] - domain->boxlo[i]) - 1.0; h_rate[i] = (set[i].hi_target - set[i].lo_target) / domain->prd[i] - 1.0;
h_rate[i] /= update->dt; h_rate[i] /= update->dt;
h_ratelo[i] = -0.5 * h_rate[i]; h_ratelo[i] = -0.5 * h_rate[i];
} }
@ -788,7 +849,7 @@ void FixDeformPressure::apply_box()
void FixDeformPressure::write_restart(FILE *fp) void FixDeformPressure::write_restart(FILE *fp)
{ {
if (comm->me == 0) { if (comm->me == 0) {
int size = 9 * sizeof(double) + 7 * sizeof(Set) + 7 * sizeof(SetExtra); int size = 7 * sizeof(Set) + 7 * sizeof(SetExtra);
fwrite(&size, sizeof(int), 1, fp); fwrite(&size, sizeof(int), 1, fp);
fwrite(set, sizeof(Set), 6, fp); fwrite(set, sizeof(Set), 6, fp);
fwrite(&set_box, sizeof(Set), 1, fp); fwrite(&set_box, sizeof(Set), 1, fp);
@ -803,22 +864,16 @@ void FixDeformPressure::write_restart(FILE *fp)
void FixDeformPressure::restart(char *buf) void FixDeformPressure::restart(char *buf)
{ {
int n = 0; int n = 0;
auto list = (double *) buf;
for (int i = 0; i < 6; i++)
h_rate[i] = list[n++];
for (int i = 0; i < 3; i++)
h_ratelo[i] = list[n++];
n = n * sizeof(double);
int samestyle = 1; int samestyle = 1;
Set *set_restart = (Set *) &buf[n]; Set *set_restart = (Set *) buf;
for (int i = 0; i < 6; ++i) { for (int i = 0; i < 6; ++i) {
// restore data from initial state // restore data from initial state
set[i].lo_initial = set_restart[i].lo_initial; set[i].lo_initial = set_restart[i].lo_initial;
set[i].hi_initial = set_restart[i].hi_initial; set[i].hi_initial = set_restart[i].hi_initial;
set[i].vol_initial = set_restart[i].vol_initial; set[i].vol_initial = set_restart[i].vol_initial;
set[i].tilt_initial = set_restart[i].tilt_initial; set[i].tilt_initial = set_restart[i].tilt_initial;
// check if style settings are consistent (should do the whole set?)
// check if style settings are consistent
if (set[i].style != set_restart[i].style) if (set[i].style != set_restart[i].style)
samestyle = 0; samestyle = 0;
if (set[i].substyle != set_restart[i].substyle) if (set[i].substyle != set_restart[i].substyle)

View File

@ -51,6 +51,9 @@ class FixDeformPressure : public FixDeform {
struct SetExtra { struct SetExtra {
double ptarget, pgain; double ptarget, pgain;
double prior_pressure, prior_rate; double prior_pressure, prior_rate;
double cumulative_shift;
double cumulative_vshift[3];
double cumulative_remap;
int saved; int saved;
char *pstr; char *pstr;
int pvar, pvar_flag; int pvar, pvar_flag;

View File

@ -46,6 +46,8 @@ enum { TYPE, RADIUS, CUSTOM };
enum { INTEGRATED, D2MIN }; enum { INTEGRATED, D2MIN };
enum { FIXED, OFFSET, UPDATE }; enum { FIXED, OFFSET, UPDATE };
static constexpr double EPSILON = 1.0e-15;
static const char cite_nonaffine_d2min[] = static const char cite_nonaffine_d2min[] =
"@article{PhysRevE.57.7192,\n" "@article{PhysRevE.57.7192,\n"
" title = {Dynamics of viscoplastic deformation in amorphous solids},\n" " title = {Dynamics of viscoplastic deformation in amorphous solids},\n"
@ -66,7 +68,7 @@ static const char cite_nonaffine_d2min[] =
FixNonaffineDisplacement::FixNonaffineDisplacement(LAMMPS *lmp, int narg, char **arg) : FixNonaffineDisplacement::FixNonaffineDisplacement(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg), id_fix(nullptr), fix(nullptr), D2min(nullptr), X(nullptr), Y(nullptr), Fix(lmp, narg, arg), id_fix(nullptr), fix(nullptr), D2min(nullptr), X(nullptr), Y(nullptr),
F(nullptr), norm(nullptr) F(nullptr), norm(nullptr), singular(nullptr)
{ {
if (narg < 4) utils::missing_cmd_args(FLERR,"fix nonaffine/displacement", error); if (narg < 4) utils::missing_cmd_args(FLERR,"fix nonaffine/displacement", error);
@ -74,6 +76,8 @@ FixNonaffineDisplacement::FixNonaffineDisplacement(LAMMPS *lmp, int narg, char *
if (nevery <= 0) error->all(FLERR,"Illegal nevery value {} in fix nonaffine/displacement", nevery); if (nevery <= 0) error->all(FLERR,"Illegal nevery value {} in fix nonaffine/displacement", nevery);
reference_timestep = update_timestep = offset_timestep = -1; reference_timestep = update_timestep = offset_timestep = -1;
z_min = 0;
int iarg = 4; int iarg = 4;
if (strcmp(arg[iarg], "integrated") == 0) { if (strcmp(arg[iarg], "integrated") == 0) {
nad_style = INTEGRATED; nad_style = INTEGRATED;
@ -117,6 +121,16 @@ FixNonaffineDisplacement::FixNonaffineDisplacement(LAMMPS *lmp, int narg, char *
if ((offset_timestep <= 0) || (offset_timestep > nevery)) if ((offset_timestep <= 0) || (offset_timestep > nevery))
error->all(FLERR, "Illegal offset timestep {} in fix nonaffine/displacement", arg[iarg + 1]); error->all(FLERR, "Illegal offset timestep {} in fix nonaffine/displacement", arg[iarg + 1]);
} else error->all(FLERR,"Illegal reference style {} in fix nonaffine/displacement", arg[iarg]); } else error->all(FLERR,"Illegal reference style {} in fix nonaffine/displacement", arg[iarg]);
iarg += 2;
while (iarg < narg) {
if (strcmp(arg[iarg], "z/min") == 0) {
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR,"fix nonaffine/displacement", error);
z_min = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
if (z_min < 0) error->all(FLERR, "Minimum coordination must be positive");
iarg += 2;
} else error->all(FLERR,"Illegal keyword {} in fix nonaffine/displacement", arg[iarg]);
}
if (nad_style == D2MIN) if (nad_style == D2MIN)
if (cut_style == RADIUS && (!atom->radius_flag)) if (cut_style == RADIUS && (!atom->radius_flag))
@ -151,6 +165,7 @@ FixNonaffineDisplacement::~FixNonaffineDisplacement()
memory->destroy(Y); memory->destroy(Y);
memory->destroy(F); memory->destroy(F);
memory->destroy(norm); memory->destroy(norm);
memory->destroy(singular);
memory->destroy(D2min); memory->destroy(D2min);
} }
@ -395,6 +410,7 @@ void FixNonaffineDisplacement::calculate_D2Min()
} }
} }
norm[i] = 0; norm[i] = 0;
singular[i] = 0;
D2min[i] = 0; D2min[i] = 0;
} }
@ -471,14 +487,29 @@ void FixNonaffineDisplacement::calculate_D2Min()
} }
if (dim == 3) { if (dim == 3) {
invert3(Y_tmp, Y_inv); denom = det3(Y_tmp);
if (fabs(denom) < EPSILON) {
singular[i] = 1;
for (j = 0; j < 3; j++)
for (k = 0; k < 3; k++)
Y_inv[j][k] = 0.0;
} else {
invert3(Y_tmp, Y_inv);
}
} else { } else {
denom = Y_tmp[0][0] * Y_tmp[1][1] - Y_tmp[0][1] * Y_tmp[1][0]; denom = Y_tmp[0][0] * Y_tmp[1][1] - Y_tmp[0][1] * Y_tmp[1][0];
if (denom != 0.0) denom = 1.0 / denom; if (fabs(denom) < EPSILON) {
Y_inv[0][0] = Y_tmp[1][1] * denom; singular[i] = 1;
Y_inv[0][1] = -Y_tmp[0][1] * denom; for (j = 0; j < 2; j++)
Y_inv[1][0] = -Y_tmp[1][0] * denom; for (k = 0; k < 2; k++)
Y_inv[1][1] = Y_tmp[0][0] * denom; Y_inv[j][k] = 0.0;
} else {
denom = 1.0 / denom;
Y_inv[0][0] = Y_tmp[1][1] * denom;
Y_inv[0][1] = -Y_tmp[0][1] * denom;
Y_inv[1][0] = -Y_tmp[1][0] * denom;
Y_inv[1][1] = Y_tmp[0][0] * denom;
}
} }
times3(X_tmp, Y_inv, F_tmp); times3(X_tmp, Y_inv, F_tmp);
@ -559,10 +590,16 @@ void FixNonaffineDisplacement::calculate_D2Min()
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
if (!(mask[i] & groupbit)) continue; if (!(mask[i] & groupbit)) continue;
if (norm[i] != 0) if (norm[i] < z_min || singular[i] == 1) {
D2min[i] /= norm[i]; if (norm[i] >= z_min)
else error->warning(FLERR, "Singular matrix detected for atom {}, defaulting output to zero", atom->tag[i]);
D2min[i] = 0.0; array_atom[i][0] = 0.0;
array_atom[i][1] = 0.0;
array_atom[i][2] = 0.0;
continue;
}
D2min[i] /= norm[i];
for (j = 0; j < 3; j++) for (j = 0; j < 3; j++)
for (k = 0; k < 3; k++) for (k = 0; k < 3; k++)
@ -743,10 +780,12 @@ void FixNonaffineDisplacement::grow_arrays(int nmax_new)
memory->destroy(F); memory->destroy(F);
memory->destroy(D2min); memory->destroy(D2min);
memory->destroy(norm); memory->destroy(norm);
memory->destroy(singular);
memory->create(X, nmax, 3, 3, "fix_nonaffine_displacement:X"); memory->create(X, nmax, 3, 3, "fix_nonaffine_displacement:X");
memory->create(Y, nmax, 3, 3, "fix_nonaffine_displacement:Y"); memory->create(Y, nmax, 3, 3, "fix_nonaffine_displacement:Y");
memory->create(F, nmax, 3, 3, "fix_nonaffine_displacement:F"); memory->create(F, nmax, 3, 3, "fix_nonaffine_displacement:F");
memory->create(D2min, nmax, "fix_nonaffine_displacement:D2min"); memory->create(D2min, nmax, "fix_nonaffine_displacement:D2min");
memory->create(norm, nmax, "fix_nonaffine_displacement:norm"); memory->create(norm, nmax, "fix_nonaffine_displacement:norm");
memory->create(singular, nmax, "fix_nonaffine_displacement:singular");
} }
} }

View File

@ -48,12 +48,12 @@ class FixNonaffineDisplacement : public Fix {
int nmax, comm_flag; int nmax, comm_flag;
int nad_style, cut_style; int nad_style, cut_style;
int reference_style, offset_timestep, reference_timestep, update_timestep; int reference_style, offset_timestep, reference_timestep, update_timestep;
int reference_saved; int reference_saved, z_min;
double cutoff_custom, cutsq_custom, mycutneigh; double cutoff_custom, cutsq_custom, mycutneigh;
double xprd0, yprd0, zprd0, xprd0_half, yprd0_half, zprd0_half, xy0, xz0, yz0; double xprd0, yprd0, zprd0, xprd0_half, yprd0_half, zprd0_half, xy0, xz0, yz0;
double *D2min, ***X, ***Y, ***F; double *D2min, ***X, ***Y, ***F;
int *norm; int *norm, *singular;
class NeighList *list; // half neighbor list class NeighList *list; // half neighbor list

View File

@ -16,6 +16,7 @@
#include "atom.h" #include "atom.h"
#include "comm.h" #include "comm.h"
#include "error.h" #include "error.h"
#include "force.h"
#include "memory.h" #include "memory.h"
#include "modify.h" #include "modify.h"
#include "update.h" #include "update.h"
@ -127,7 +128,7 @@ void FixHeatFlow::final_integrate()
if (igroup == atom->firstgroup) nlocal = atom->nfirst; if (igroup == atom->firstgroup) nlocal = atom->nfirst;
// add ghost contributions to heatflow if first instance of fix // add ghost contributions to heatflow if first instance of fix
if (first_flag) comm->reverse_comm(this); if (force->newton_pair && first_flag) comm->reverse_comm(this);
if (rmass) { if (rmass) {
for (int i = 0; i < nlocal; i++) for (int i = 0; i < nlocal; i++)

View File

@ -216,9 +216,15 @@ int GranularModel::define_classic_model(char **arg, int iarg, int narg)
// manually parse coeffs // manually parse coeffs
normal_model->coeffs[0] = kn; normal_model->coeffs[0] = kn;
normal_model->coeffs[1] = gamman; normal_model->coeffs[1] = gamman;
tangential_model->coeffs[0] = kt;
tangential_model->coeffs[1] = gammat / gamman; if (tangential_model->num_coeffs == 2) {
tangential_model->coeffs[2] = xmu; tangential_model->coeffs[0] = gammat / gamman;
tangential_model->coeffs[1] = xmu;
} else {
tangential_model->coeffs[0] = kt;
tangential_model->coeffs[1] = gammat / gamman;
tangential_model->coeffs[2] = xmu;
}
normal_model->coeffs_to_local(); normal_model->coeffs_to_local();
tangential_model->coeffs_to_local(); tangential_model->coeffs_to_local();

View File

@ -13,9 +13,6 @@
#ifdef PAIR_CLASS #ifdef PAIR_CLASS
// clang-format off // clang-format off
PairStyle(meam/c/kk,PairMEAMKokkos<LMPDeviceType>);
PairStyle(meam/c/kk/device,PairMEAMKokkos<LMPDeviceType>);
PairStyle(meam/c/kk/host,PairMEAMKokkos<LMPHostType>);
PairStyle(meam/kk,PairMEAMKokkos<LMPDeviceType>); PairStyle(meam/kk,PairMEAMKokkos<LMPDeviceType>);
PairStyle(meam/kk/device,PairMEAMKokkos<LMPDeviceType>); PairStyle(meam/kk/device,PairMEAMKokkos<LMPDeviceType>);
PairStyle(meam/kk/host,PairMEAMKokkos<LMPHostType>); PairStyle(meam/kk/host,PairMEAMKokkos<LMPHostType>);

View File

@ -14,7 +14,6 @@
#ifdef PAIR_CLASS #ifdef PAIR_CLASS
// clang-format off // clang-format off
PairStyle(meam,PairMEAM); PairStyle(meam,PairMEAM);
PairStyle(meam/c,PairMEAM);
// clang-format on // clang-format on
#else #else

View File

@ -74,6 +74,9 @@ FixQEq::FixQEq(LAMMPS *lmp, int narg, char **arg) :
if ((nevery <= 0) || (cutoff <= 0.0) || (tolerance <= 0.0) || (maxiter <= 0)) if ((nevery <= 0) || (cutoff <= 0.0) || (tolerance <= 0.0) || (maxiter <= 0))
error->all(FLERR,"Illegal fix qeq command"); error->all(FLERR,"Illegal fix qeq command");
// must have charges
if (!atom->q_flag) error->all(FLERR, "Fix {} requires atom attribute q", style);
alpha = 0.20; alpha = 0.20;
swa = 0.0; swa = 0.0;
swb = cutoff; swb = cutoff;

View File

@ -65,7 +65,7 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg), Name(nullptr), MolName(nullptr), NMol(nullptr), nd(nullptr), Fix(lmp, narg, arg), Name(nullptr), MolName(nullptr), NMol(nullptr), nd(nullptr),
MolType(nullptr), molmap(nullptr), mark(nullptr), Mol2Spec(nullptr), clusterID(nullptr), MolType(nullptr), molmap(nullptr), mark(nullptr), Mol2Spec(nullptr), clusterID(nullptr),
x0(nullptr), BOCut(nullptr), fp(nullptr), pos(nullptr), fdel(nullptr), delete_Tcount(nullptr), x0(nullptr), BOCut(nullptr), fp(nullptr), pos(nullptr), fdel(nullptr), delete_Tcount(nullptr),
ele(nullptr), eletype(nullptr), filepos(nullptr), filedel(nullptr) filepos(nullptr), filedel(nullptr)
{ {
if (narg < 7) utils::missing_cmd_args(FLERR, "fix reaxff/species", error); if (narg < 7) utils::missing_cmd_args(FLERR, "fix reaxff/species", error);
@ -84,6 +84,9 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) :
nvalid = -1; nvalid = -1;
ntypes = atom->ntypes; ntypes = atom->ntypes;
eletype.resize(ntypes);
ueletype.resize(ntypes);
ele2uele.resize(ntypes);
nevery = utils::inumeric(FLERR, arg[3], false, lmp); nevery = utils::inumeric(FLERR, arg[3], false, lmp);
nrepeat = utils::inumeric(FLERR, arg[4], false, lmp); nrepeat = utils::inumeric(FLERR, arg[4], false, lmp);
@ -156,8 +159,7 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) :
for (int j = 1; j < np1; j++) BOCut[i][j] = bo_cut; for (int j = 1; j < np1; j++) BOCut[i][j] = bo_cut;
// optional args // optional args
eletype = nullptr; filepos = filedel = nullptr;
ele = filepos = filedel = nullptr;
eleflag = posflag = padflag = 0; eleflag = posflag = padflag = 0;
delflag = specieslistflag = masslimitflag = 0; delflag = specieslistflag = masslimitflag = 0;
delete_Nlimit = delete_Nsteps = 0; delete_Nlimit = delete_Nsteps = 0;
@ -191,14 +193,9 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) :
if (iarg + ntypes + 1 > narg) if (iarg + ntypes + 1 > narg)
utils::missing_cmd_args(FLERR, "fix reaxff/species element", error); utils::missing_cmd_args(FLERR, "fix reaxff/species element", error);
eletype = (char **) malloc(ntypes * sizeof(char *)); for (int i = 0; i < ntypes; i++)
int len; eletype[i] = arg[iarg + 1 + i];
for (int i = 0; i < ntypes; i++) { GetUniqueElements();
len = strlen(arg[iarg + 1 + i]) + 1;
eletype[i] = (char *) malloc(len * sizeof(char));
strcpy(eletype[i], arg[iarg + 1 + i]);
}
eleflag = 1;
iarg += ntypes + 1; iarg += ntypes + 1;
// delete species // delete species
@ -285,14 +282,6 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) :
error->all(FLERR, "Unknown fix reaxff/species keyword: {}", arg[iarg]); error->all(FLERR, "Unknown fix reaxff/species keyword: {}", arg[iarg]);
} }
if (!eleflag) {
memory->create(ele, ntypes + 1, "reaxff/species:ele");
ele[0] = 'C';
if (ntypes > 1) ele[1] = 'H';
if (ntypes > 2) ele[2] = 'O';
if (ntypes > 3) ele[3] = 'N';
}
if (delflag && specieslistflag && masslimitflag) if (delflag && specieslistflag && masslimitflag)
error->all(FLERR, "Incompatible combination fix reaxff/species command options"); error->all(FLERR, "Incompatible combination fix reaxff/species command options");
@ -312,7 +301,6 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) :
FixReaxFFSpecies::~FixReaxFFSpecies() FixReaxFFSpecies::~FixReaxFFSpecies()
{ {
memory->destroy(ele);
memory->destroy(BOCut); memory->destroy(BOCut);
memory->destroy(clusterID); memory->destroy(clusterID);
memory->destroy(x0); memory->destroy(x0);
@ -358,7 +346,13 @@ int FixReaxFFSpecies::setmask()
void FixReaxFFSpecies::setup(int /*vflag*/) void FixReaxFFSpecies::setup(int /*vflag*/)
{ {
ntotal = static_cast<int>(atom->natoms); ntotal = static_cast<int>(atom->natoms);
if (Name == nullptr) memory->create(Name, ntypes, "reaxff/species:Name"); if (Name == nullptr) memory->create(Name, nutypes, "reaxff/species:Name");
if (!eleflag) {
for (int i = 0; i < ntypes; i++)
eletype[i] = reaxff->eletype[i+1];
GetUniqueElements();
}
post_integrate(); post_integrate();
} }
@ -648,14 +642,14 @@ void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec)
memory->destroy(MolName); memory->destroy(MolName);
MolName = nullptr; MolName = nullptr;
memory->create(MolName, Nmole * (ntypes + 1), "reaxff/species:MolName"); memory->create(MolName, Nmole * (nutypes + 1), "reaxff/species:MolName");
memory->destroy(NMol); memory->destroy(NMol);
NMol = nullptr; NMol = nullptr;
memory->create(NMol, Nmole, "reaxff/species:NMol"); memory->create(NMol, Nmole, "reaxff/species:NMol");
for (m = 0; m < Nmole; m++) NMol[m] = 1; for (m = 0; m < Nmole; m++) NMol[m] = 1;
memory->create(Nameall, ntypes, "reaxff/species:Nameall"); memory->create(Nameall, nutypes, "reaxff/species:Nameall");
memory->create(NMolall, Nmole, "reaxff/species:NMolall"); memory->create(NMolall, Nmole, "reaxff/species:NMolall");
memory->destroy(Mol2Spec); memory->destroy(Mol2Spec);
@ -664,12 +658,12 @@ void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec)
for (m = 0; m < Nmole; m++) Mol2Spec[m] = -1; for (m = 0; m < Nmole; m++) Mol2Spec[m] = -1;
for (m = 1, Nspec = 0; m <= Nmole; m++) { for (m = 1, Nspec = 0; m <= Nmole; m++) {
for (n = 0; n < ntypes; n++) Name[n] = 0; for (n = 0; n < nutypes; n++) Name[n] = 0;
for (n = 0, flag_mol = 0; n < nlocal; n++) { for (n = 0, flag_mol = 0; n < nlocal; n++) {
if (!(mask[n] & groupbit)) continue; if (!(mask[n] & groupbit)) continue;
cid = nint(clusterID[n]); cid = nint(clusterID[n]);
if (cid == m) { if (cid == m) {
itype = atom->type[n] - 1; itype = ele2uele[atom->type[n] - 1];
Name[itype]++; Name[itype]++;
flag_mol = 1; flag_mol = 1;
} }
@ -677,15 +671,15 @@ void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec)
MPI_Allreduce(&flag_mol, &flag_tmp, 1, MPI_INT, MPI_MAX, world); MPI_Allreduce(&flag_mol, &flag_tmp, 1, MPI_INT, MPI_MAX, world);
flag_mol = flag_tmp; flag_mol = flag_tmp;
MPI_Allreduce(Name, Nameall, ntypes, MPI_INT, MPI_SUM, world); MPI_Allreduce(Name, Nameall, nutypes, MPI_INT, MPI_SUM, world);
for (n = 0; n < ntypes; n++) Name[n] = Nameall[n]; for (n = 0; n < nutypes; n++) Name[n] = Nameall[n];
if (flag_mol == 1) { if (flag_mol == 1) {
flag_identity = 1; flag_identity = 1;
for (k = 0; k < Nspec; k++) { for (k = 0; k < Nspec; k++) {
flag_spec = 0; flag_spec = 0;
for (l = 0; l < ntypes; l++) for (l = 0; l < nutypes; l++)
if (MolName[ntypes * k + l] != Name[l]) flag_spec = 1; if (MolName[nutypes * k + l] != Name[l]) flag_spec = 1;
if (flag_spec == 0) { if (flag_spec == 0) {
NMol[k]++; NMol[k]++;
Mol2Spec[m - 1] = k; Mol2Spec[m - 1] = k;
@ -693,7 +687,7 @@ void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec)
flag_identity *= flag_spec; flag_identity *= flag_spec;
} }
if (Nspec == 0 || flag_identity == 1) { if (Nspec == 0 || flag_identity == 1) {
for (l = 0; l < ntypes; l++) MolName[ntypes * Nspec + l] = Name[l]; for (l = 0; l < nutypes; l++) MolName[nutypes * Nspec + l] = Name[l];
Mol2Spec[m - 1] = Nspec; Mol2Spec[m - 1] = Nspec;
Nspec++; Nspec++;
} }
@ -708,24 +702,24 @@ void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec)
memory->destroy(MolType); memory->destroy(MolType);
MolType = nullptr; MolType = nullptr;
memory->create(MolType, Nspec * (ntypes + 2), "reaxff/species:MolType"); memory->create(MolType, Nspec * (nutypes + 2), "reaxff/species:MolType");
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
int FixReaxFFSpecies::CheckExistence(int id, int ntypes) int FixReaxFFSpecies::CheckExistence(int id, int nutypes)
{ {
int i, j, molid, flag; int i, j, molid, flag;
for (i = 0; i < Nmoltype; i++) { for (i = 0; i < Nmoltype; i++) {
flag = 0; flag = 0;
for (j = 0; j < ntypes; j++) { for (j = 0; j < nutypes; j++) {
molid = MolType[ntypes * i + j]; molid = MolType[nutypes * i + j];
if (molid != MolName[ntypes * id + j]) flag = 1; if (molid != MolName[nutypes * id + j]) flag = 1;
} }
if (flag == 0) return i; if (flag == 0) return i;
} }
for (i = 0; i < ntypes; i++) MolType[ntypes * Nmoltype + i] = MolName[ntypes * id + i]; for (i = 0; i < nutypes; i++) MolType[nutypes * Nmoltype + i] = MolName[nutypes * id + i];
Nmoltype++; Nmoltype++;
return Nmoltype - 1; return Nmoltype - 1;
@ -733,6 +727,50 @@ int FixReaxFFSpecies::CheckExistence(int id, int ntypes)
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
void FixReaxFFSpecies::GetUniqueElements()
{
eleflag = 1;
// get unique 'element' labels
nutypes = 0;
int skipflag;
for (int i = 0; i < ntypes; i++) {
skipflag = 0;
for (int j = 0; j < nutypes; j++)
if (eletype[i] == ueletype[j]) {
skipflag = 1;
break;
}
if (skipflag) continue;
ueletype[nutypes++] = eletype[i];
}
// reorder CHON, if necessary
int incr = 0;
std::vector<std::string> CHON = {"C", "H", "O", "N"};
for (auto it = CHON.begin(); it != CHON.end(); ++it)
for (int j = incr; j < nutypes; j++) {
if (ueletype[j] == *it) {
ueletype.erase(ueletype.begin() + j);
ueletype.insert(ueletype.begin() + incr++, *it);
break;
}
}
// map user input to unique list
for (int i = 0; i < ntypes; i++)
for (int j = 0; j < nutypes; j++)
if (eletype[i] == ueletype[j]) {
ele2uele[i] = j;
break;
}
}
/* ---------------------------------------------------------------------- */
void FixReaxFFSpecies::WriteFormulas(int Nmole, int Nspec) void FixReaxFFSpecies::WriteFormulas(int Nmole, int Nspec)
{ {
int i, j, itemp; int i, j, itemp;
@ -742,17 +780,14 @@ void FixReaxFFSpecies::WriteFormulas(int Nmole, int Nspec)
Nmoltype = 0; Nmoltype = 0;
for (i = 0; i < Nspec; i++) nd[i] = CheckExistence(i, ntypes); for (i = 0; i < Nspec; i++) nd[i] = CheckExistence(i, nutypes);
for (i = 0; i < Nmoltype; i++) { for (i = 0; i < Nmoltype; i++) {
std::string molname; std::string molname;
for (j = 0; j < ntypes; j++) { for (j = 0; j < nutypes; j++) {
itemp = MolType[ntypes * i + j]; itemp = MolType[nutypes * i + j];
if (itemp != 0) { if (itemp != 0) {
if (eletype) molname += ueletype[j];
molname += eletype[j];
else
molname += ele[j];
if (itemp != 1) molname += std::to_string(itemp); if (itemp != 1) molname += std::to_string(itemp);
} }
} }
@ -810,20 +845,20 @@ void FixReaxFFSpecies::WritePos(int Nmole, int Nspec)
} }
Nameall = nullptr; Nameall = nullptr;
memory->create(Nameall, ntypes, "reaxff/species:Nameall"); memory->create(Nameall, nutypes, "reaxff/species:Nameall");
for (m = 1; m <= Nmole; m++) { for (m = 1; m <= Nmole; m++) {
count = 0; count = 0;
avq = 0.0; avq = 0.0;
for (n = 0; n < 3; n++) avx[n] = 0.0; for (n = 0; n < 3; n++) avx[n] = 0.0;
for (n = 0; n < ntypes; n++) Name[n] = 0; for (n = 0; n < nutypes; n++) Name[n] = 0;
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
if (!(mask[i] & groupbit)) continue; if (!(mask[i] & groupbit)) continue;
cid = nint(clusterID[i]); cid = nint(clusterID[i]);
if (cid == m) { if (cid == m) {
itype = atom->type[i] - 1; itype = ele2uele[atom->type[i] - 1];
Name[itype]++; Name[itype]++;
count++; count++;
avq += spec_atom[i][0]; avq += spec_atom[i][0];
@ -850,17 +885,14 @@ void FixReaxFFSpecies::WritePos(int Nmole, int Nspec)
MPI_Reduce(&count, &count_tmp, 1, MPI_INT, MPI_SUM, 0, world); MPI_Reduce(&count, &count_tmp, 1, MPI_INT, MPI_SUM, 0, world);
count = count_tmp; count = count_tmp;
MPI_Reduce(Name, Nameall, ntypes, MPI_INT, MPI_SUM, 0, world); MPI_Reduce(Name, Nameall, nutypes, MPI_INT, MPI_SUM, 0, world);
for (n = 0; n < ntypes; n++) Name[n] = Nameall[n]; for (n = 0; n < nutypes; n++) Name[n] = Nameall[n];
if (comm->me == 0) { if (comm->me == 0) {
fprintf(pos, "%d\t%d\t", m, count); fprintf(pos, "%d\t%d\t", m, count);
for (n = 0; n < ntypes; n++) { for (n = 0; n < nutypes; n++) {
if (Name[n] != 0) { if (Name[n] != 0) {
if (eletype) fprintf(pos, "%s", ueletype[n].c_str());
fprintf(pos, "%s", eletype[n]);
else
fprintf(pos, "%c", ele[n]);
if (Name[n] != 1) fprintf(pos, "%d", Name[n]); if (Name[n] != 1) fprintf(pos, "%d", Name[n]);
} }
} }
@ -912,7 +944,7 @@ void FixReaxFFSpecies::DeleteSpecies(int Nmole, int Nspec)
for (i = 0; i < nlocal; i++) mark[i] = 0; for (i = 0; i < nlocal; i++) mark[i] = 0;
Nameall = nullptr; Nameall = nullptr;
memory->create(Nameall, ntypes, "reaxff/species:Nameall"); memory->create(Nameall, nutypes, "reaxff/species:Nameall");
int ndelcomm; int ndelcomm;
if (masslimitflag) if (masslimitflag)
@ -944,13 +976,13 @@ void FixReaxFFSpecies::DeleteSpecies(int Nmole, int Nspec)
if (this_delete_Tcount == headroom) break; if (this_delete_Tcount == headroom) break;
m = molrange[mm]; m = molrange[mm];
localmass = totalmass = count = nmarklist = 0; localmass = totalmass = count = nmarklist = 0;
for (n = 0; n < ntypes; n++) Name[n] = 0; for (n = 0; n < nutypes; n++) Name[n] = 0;
for (i = 0; i < nlocal; i++) { for (i = 0; i < nlocal; i++) {
if (!(mask[i] & groupbit)) continue; if (!(mask[i] & groupbit)) continue;
cid = nint(clusterID[i]); cid = nint(clusterID[i]);
if (cid == m) { if (cid == m) {
itype = atom->type[i] - 1; itype = ele2uele[atom->type[i] - 1];
Name[itype]++; Name[itype]++;
count++; count++;
marklist[nmarklist++] = i; marklist[nmarklist++] = i;
@ -961,18 +993,15 @@ void FixReaxFFSpecies::DeleteSpecies(int Nmole, int Nspec)
MPI_Allreduce(&count, &count_tmp, 1, MPI_INT, MPI_SUM, world); MPI_Allreduce(&count, &count_tmp, 1, MPI_INT, MPI_SUM, world);
count = count_tmp; count = count_tmp;
MPI_Allreduce(Name, Nameall, ntypes, MPI_INT, MPI_SUM, world); MPI_Allreduce(Name, Nameall, nutypes, MPI_INT, MPI_SUM, world);
for (n = 0; n < ntypes; n++) Name[n] = Nameall[n]; for (n = 0; n < nutypes; n++) Name[n] = Nameall[n];
MPI_Allreduce(&localmass, &totalmass, 1, MPI_DOUBLE, MPI_SUM, world); MPI_Allreduce(&localmass, &totalmass, 1, MPI_DOUBLE, MPI_SUM, world);
species_str = ""; species_str = "";
for (j = 0; j < ntypes; j++) { for (j = 0; j < nutypes; j++) {
if (Name[j] != 0) { if (Name[j] != 0) {
if (eletype) species_str += ueletype[j];
species_str += eletype[j];
else
species_str += ele[j];
if (Name[j] != 1) species_str += fmt::format("{}", Name[j]); if (Name[j] != 1) species_str += fmt::format("{}", Name[j]);
} }
} }
@ -1034,13 +1063,10 @@ void FixReaxFFSpecies::DeleteSpecies(int Nmole, int Nspec)
printflag = 1; printflag = 1;
} }
fprintf(fdel, " %g ", deletecount[m]); fprintf(fdel, " %g ", deletecount[m]);
for (j = 0; j < ntypes; j++) { for (j = 0; j < nutypes; j++) {
int itemp = MolName[ntypes * m + j]; int itemp = MolName[nutypes * m + j];
if (itemp != 0) { if (itemp != 0) {
if (eletype) fprintf(fdel, "%s", ueletype[j].c_str());
fprintf(fdel, "%s", eletype[j]);
else
fprintf(fdel, "%c", ele[j]);
if (itemp != 1) fprintf(fdel, "%d", itemp); if (itemp != 1) fprintf(fdel, "%d", itemp);
} }
} }

View File

@ -43,7 +43,7 @@ class FixReaxFFSpecies : public Fix {
double compute_vector(int) override; double compute_vector(int) override;
protected: protected:
int nmax, nlocal, ntypes, ntotal; int nmax, nlocal, ntypes, nutypes, ntotal;
int nrepeat, nfreq, posfreq, compressed, ndelspec; int nrepeat, nfreq, posfreq, compressed, ndelspec;
int Nmoltype, vector_nmole, vector_nspec; int Nmoltype, vector_nmole, vector_nspec;
int *Name, *MolName, *NMol, *nd, *MolType, *molmap, *mark; int *Name, *MolName, *NMol, *nd, *MolType, *molmap, *mark;
@ -62,7 +62,10 @@ class FixReaxFFSpecies : public Fix {
int delete_Nsteps, *delete_Tcount; int delete_Nsteps, *delete_Tcount;
double massmin, massmax; double massmin, massmax;
int singlepos_opened, multipos_opened, del_opened; int singlepos_opened, multipos_opened, del_opened;
char *ele, **eletype, *filepos, *filedel; char *filepos, *filedel;
std::vector<int> ele2uele; // for element eletype[i], ele2uele[i] stores index of unique element
std::vector<std::string> eletype; // list of ReaxFF elements of length ntypes
std::vector<std::string> ueletype; // list of unique elements, of quantity nutypes
void Output_ReaxFF_Bonds(bigint, FILE *); void Output_ReaxFF_Bonds(bigint, FILE *);
AtomCoord chAnchor(AtomCoord, AtomCoord); AtomCoord chAnchor(AtomCoord, AtomCoord);
@ -72,6 +75,7 @@ class FixReaxFFSpecies : public Fix {
void WriteFormulas(int, int); void WriteFormulas(int, int);
void DeleteSpecies(int, int); void DeleteSpecies(int, int);
int CheckExistence(int, int); int CheckExistence(int, int);
void GetUniqueElements();
int nint(const double &); int nint(const double &);
int pack_forward_comm(int, int *, double *, int, int *) override; int pack_forward_comm(int, int *, double *, int, int *) override;

View File

@ -297,14 +297,17 @@ void PairReaxFF::coeff(int nargs, char **args)
} }
int n = atom->ntypes; int n = atom->ntypes;
eletype.resize(n+1);
// pair_coeff element map // pair_coeff element map
for (int i = 3; i < nargs; i++) for (int i = 3; i < nargs; i++) {
eletype[i-2] = args[i];
for (int j = 0; j < nreax_types; j++) for (int j = 0; j < nreax_types; j++)
if (utils::lowercase(args[i]) == utils::lowercase(api->system->reax_param.sbp[j].name)) { if (utils::lowercase(args[i]) == utils::lowercase(api->system->reax_param.sbp[j].name)) {
map[i-2] = j; map[i-2] = j;
itmp ++; itmp ++;
} }
}
// error check // error check
if (itmp != n) if (itmp != n)

View File

@ -53,6 +53,7 @@ class PairReaxFF : public Pair {
int fixbond_flag, fixspecies_flag; int fixbond_flag, fixspecies_flag;
int **tmpid; int **tmpid;
double **tmpbo, **tmpr; double **tmpbo, **tmpr;
std::vector<std::string> eletype;
ReaxFF::API *api; ReaxFF::API *api;
typedef double rvec[3]; typedef double rvec[3];

View File

@ -316,6 +316,7 @@ void CreateAtoms::command(int narg, char **arg)
onemol->compute_center(); onemol->compute_center();
ranmol = new RanMars(lmp, molseed + comm->me); ranmol = new RanMars(lmp, molseed + comm->me);
memory->create(xmol, onemol->natoms, 3, "create_atoms:xmol");
} }
if (style == MESH) { if (style == MESH) {
@ -651,6 +652,7 @@ void CreateAtoms::command(int narg, char **arg)
delete[] xstr; delete[] xstr;
delete[] ystr; delete[] ystr;
delete[] zstr; delete[] zstr;
if (mode == MOLECULE) memory->destroy(xmol);
// for MOLECULE mode: // for MOLECULE mode:
// create special bond lists for molecular systems, // create special bond lists for molecular systems,
@ -714,7 +716,8 @@ void CreateAtoms::add_single()
if (mode == ATOM) { if (mode == ATOM) {
atom->avec->create_atom(ntype, xone); atom->avec->create_atom(ntype, xone);
} else { } else {
add_molecule(xone); get_xmol(xone);
add_molecule();
} }
} }
} }
@ -732,7 +735,6 @@ void CreateAtoms::add_random()
if (overlapflag) { if (overlapflag) {
double odist = overlap; double odist = overlap;
if (mode == MOLECULE) odist += onemol->molradius;
odistsq = odist * odist; odistsq = odist * odist;
} }
@ -813,25 +815,43 @@ void CreateAtoms::add_random()
// check for overlap of new atom/mol with all other atoms // check for overlap of new atom/mol with all other atoms
// including prior insertions // including prior insertions
// minimum_image() needed to account for distances across PBC // minimum_image() needed to account for distances across PBC
// new molecule only checks its center pt against others
// odistsq is expanded for mode=MOLECULE to account for molecule size
if (overlapflag) { if (overlapflag) {
double **x = atom->x; double **x = atom->x;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
int reject = 0; int reject = 0;
for (int i = 0; i < nlocal; i++) { if (mode == ATOM) {
delx = xone[0] - x[i][0]; for (int i = 0; i < nlocal; i++) {
dely = xone[1] - x[i][1]; delx = xone[0] - x[i][0];
delz = xone[2] - x[i][2]; dely = xone[1] - x[i][1];
domain->minimum_image(delx, dely, delz); delz = xone[2] - x[i][2];
distsq = delx * delx + dely * dely + delz * delz; domain->minimum_image(delx, dely, delz);
if (distsq < odistsq) { distsq = delx * delx + dely * dely + delz * delz;
reject = 1; if (distsq < odistsq) {
break; reject = 1;
break;
}
}
} else {
if (comm->me == 0) get_xmol(xone);
MPI_Bcast(&xmol[0][0], onemol->natoms*3, MPI_DOUBLE, 0, world);
for (int i = 0; i < nlocal; i++) {
for (int j = 0; j < onemol->natoms; j++) {
delx = xmol[j][0] - x[i][0];
dely = xmol[j][1] - x[i][1];
delz = xmol[j][2] - x[i][2];
domain->minimum_image(delx, dely, delz);
distsq = delx * delx + dely * dely + delz * delz;
if (distsq < odistsq) {
reject = 1;
break;
}
}
} }
} }
int reject_any; int reject_any;
MPI_Allreduce(&reject, &reject_any, 1, MPI_INT, MPI_MAX, world); MPI_Allreduce(&reject, &reject_any, 1, MPI_INT, MPI_MAX, world);
if (reject_any) continue; if (reject_any) continue;
@ -858,7 +878,11 @@ void CreateAtoms::add_random()
if (mode == ATOM) { if (mode == ATOM) {
atom->avec->create_atom(ntype, xone); atom->avec->create_atom(ntype, xone);
} else { } else {
add_molecule(xone);
// atomic coordinates calculated above for overlap check
if (!overlapflag) get_xmol(xone);
add_molecule();
} }
} }
} }
@ -1429,7 +1453,8 @@ void CreateAtoms::loop_lattice(int action)
if (mode == ATOM) { if (mode == ATOM) {
atom->avec->create_atom(basistype[m], x); atom->avec->create_atom(basistype[m], x);
} else { } else {
add_molecule(x); get_xmol(x);
add_molecule();
} }
} else if (action == COUNT) { } else if (action == COUNT) {
if (nlatt == MAXSMALLINT) nlatt_overflow = 1; if (nlatt == MAXSMALLINT) nlatt_overflow = 1;
@ -1437,7 +1462,8 @@ void CreateAtoms::loop_lattice(int action)
if (mode == ATOM) { if (mode == ATOM) {
atom->avec->create_atom(basistype[m], x); atom->avec->create_atom(basistype[m], x);
} else { } else {
add_molecule(x); get_xmol(x);
add_molecule();
} }
} }
@ -1452,7 +1478,7 @@ void CreateAtoms::loop_lattice(int action)
add a molecule with its center at center add a molecule with its center at center
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
void CreateAtoms::add_molecule(double *center) void CreateAtoms::get_xmol(double *center)
{ {
double r[3], rotmat[3][3]; double r[3], rotmat[3][3];
@ -1475,10 +1501,6 @@ void CreateAtoms::add_molecule(double *center)
MathExtra::quat_to_mat(quatone, rotmat); MathExtra::quat_to_mat(quatone, rotmat);
// create atoms in molecule with atom ID = 0 and mol ID = 0
// IDs are reset in caller after all molecules created by all procs
// pass add_molecule_atom an offset of 0 since don't know
// max tag of atoms in previous molecules at this point
// onemol->quat_external is used by atom->add_moleclue_atom() // onemol->quat_external is used by atom->add_moleclue_atom()
onemol->quat_external = quatone; onemol->quat_external = quatone;
@ -1488,9 +1510,25 @@ void CreateAtoms::add_molecule(double *center)
for (int m = 0; m < natoms; m++) { for (int m = 0; m < natoms; m++) {
MathExtra::matvec(rotmat, onemol->dx[m], xnew); MathExtra::matvec(rotmat, onemol->dx[m], xnew);
MathExtra::add3(xnew, center, xnew); MathExtra::add3(xnew, center, xnew);
atom->avec->create_atom(ntype + onemol->type[m], xnew); for (int i = 0; i < 3; i++)
n = atom->nlocal - 1; xmol[m][i] = xnew[i];
atom->add_molecule_atom(onemol, m, n, 0); }
}
/* ----------------------------------------------------------------------
add a molecule with atom coordinates from xmol
------------------------------------------------------------------------- */
void CreateAtoms::add_molecule()
{
// create atoms in molecule with atom ID = 0 and mol ID = 0
// IDs are reset in caller after all molecules created by all procs
// pass add_molecule_atom an offset of 0 since don't know
// max tag of atoms in previous molecules at this point
for (int m = 0; m < onemol->natoms; m++) {
atom->avec->create_atom(ntype + onemol->type[m], xmol[m]);
atom->add_molecule_atom(onemol, m, atom->nlocal - 1, 0);
} }
} }

View File

@ -40,7 +40,7 @@ class CreateAtoms : public Command {
bigint nsubset; bigint nsubset;
double subsetfrac; double subsetfrac;
int *basistype; int *basistype;
double xone[3], quatone[4]; double xone[3], quatone[4], **xmol;
double radthresh, radscale, mesh_density; double radthresh, radscale, mesh_density;
int varflag, vvar, xvar, yvar, zvar; int varflag, vvar, xvar, yvar, zvar;
@ -71,7 +71,8 @@ class CreateAtoms : public Command {
int add_quasirandom(const double[3][3], tagint); int add_quasirandom(const double[3][3], tagint);
void add_lattice(); void add_lattice();
void loop_lattice(int); void loop_lattice(int);
void add_molecule(double *); void get_xmol(double *);
void add_molecule();
int vartest(double *); // evaluate a variable with new atom position int vartest(double *); // evaluate a variable with new atom position
}; };

View File

@ -166,11 +166,12 @@ int DumpAtom::modify_param(int narg, char **arg)
} }
if (strcmp(arg[0],"triclinic/general") == 0) { if (strcmp(arg[0],"triclinic/general") == 0) {
triclinic_general = 1; if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
triclinic_general = utils::logical(FLERR,arg[1],false,lmp);
if (triclinic_general && !domain->triclinic_general) if (triclinic_general && !domain->triclinic_general)
error->all(FLERR,"Dump_modify triclinic/general cannot be used " error->all(FLERR,"Dump_modify triclinic/general cannot be used "
"if simulation box is not general triclinic"); "if simulation box is not general triclinic");
return 1; return 2;
} }
return 0; return 0;

View File

@ -1766,7 +1766,8 @@ int DumpCustom::modify_param(int narg, char **arg)
if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
triclinic_general = utils::logical(FLERR,arg[1],false,lmp); triclinic_general = utils::logical(FLERR,arg[1],false,lmp);
if (triclinic_general && !domain->triclinic_general) if (triclinic_general && !domain->triclinic_general)
error->all(FLERR,"Dump_modify triclinic/general invalid b/c simulation box is not"); error->all(FLERR,"Dump_modify triclinic/general cannot be used "
"if simulation box is not general triclinic");
return 2; return 2;
} }

View File

@ -119,8 +119,8 @@ Fix::~Fix()
{ {
if (copymode) return; if (copymode) return;
delete [] id; delete[] id;
delete [] style; delete[] style;
memory->destroy(eatom); memory->destroy(eatom);
memory->destroy(vatom); memory->destroy(vatom);
memory->destroy(cvatom); memory->destroy(cvatom);
@ -133,36 +133,37 @@ Fix::~Fix()
void Fix::modify_params(int narg, char **arg) void Fix::modify_params(int narg, char **arg)
{ {
if (narg == 0) error->all(FLERR,"Illegal fix_modify command"); if (narg == 0) utils::missing_cmd_args(FLERR, "fix_modify", error);
int iarg = 0; int iarg = 0;
while (iarg < narg) { while (iarg < narg) {
if (strcmp(arg[iarg],"dynamic/dof") == 0) { if (strcmp(arg[iarg],"dynamic/dof") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix_modify dynamic/dof", error);
dynamic = utils::logical(FLERR,arg[iarg+1],false,lmp); dynamic = utils::logical(FLERR,arg[iarg+1],false,lmp);
iarg += 2; iarg += 2;
} else if (strcmp(arg[iarg],"energy") == 0) { } else if (strcmp(arg[iarg],"energy") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix_modify energy", error);
thermo_energy = utils::logical(FLERR,arg[iarg+1],false,lmp); thermo_energy = utils::logical(FLERR,arg[iarg+1],false,lmp);
if (thermo_energy && !energy_global_flag && !energy_peratom_flag) if (thermo_energy && !energy_global_flag && !energy_peratom_flag)
error->all(FLERR,"Fix {} {} does not support fix_modify energy command", id, style); error->all(FLERR,"Fix {} {} does not support fix_modify energy command", id, style);
iarg += 2; iarg += 2;
} else if (strcmp(arg[iarg],"virial") == 0) { } else if (strcmp(arg[iarg],"virial") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix_modify virial", error);
thermo_virial = utils::logical(FLERR,arg[iarg+1],false,lmp); thermo_virial = utils::logical(FLERR,arg[iarg+1],false,lmp);
if (thermo_virial && !virial_global_flag && !virial_peratom_flag) if (thermo_virial && !virial_global_flag && !virial_peratom_flag)
error->all(FLERR,"Fix {} {} does not support fix_modify virial command", id, style); error->all(FLERR,"Fix {} {} does not support fix_modify virial command", id, style);
iarg += 2; iarg += 2;
} else if (strcmp(arg[iarg],"respa") == 0) { } else if (strcmp(arg[iarg],"respa") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command"); if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix_modify respa", error);
if (!respa_level_support) error->all(FLERR,"Illegal fix_modify command"); if (!respa_level_support) error->all(FLERR,"Illegal fix_modify respa command");
int lvl = utils::inumeric(FLERR,arg[iarg+1],false,lmp); int lvl = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
if (lvl < 0) error->all(FLERR,"Illegal fix_modify command"); if (lvl < 0) error->all(FLERR,"Illegal fix_modify respa command");
respa_level = lvl-1; respa_level = lvl-1;
iarg += 2; iarg += 2;
} else { } else {
int n = modify_param(narg-iarg,&arg[iarg]); int n = modify_param(narg-iarg,&arg[iarg]);
if (n == 0) error->all(FLERR,"Illegal fix_modify command"); if (n == 0)
error->all(FLERR,"Fix {} {} does not support fix_modify {} command", id, style, arg[iarg]);
iarg += n; iarg += n;
} }
} }

View File

@ -63,7 +63,7 @@ irregular(nullptr), set(nullptr)
int nskip; int nskip;
if (utils::strmatch(style, "^deform/pressure")) { if (utils::strmatch(style, "^deform/pressure")) {
child_parameters.insert("box"); child_parameters.insert("box");
child_styles.insert({{"pressure", 4}, {"pressure/mean", 4}, {"volume", 2}}); child_styles.insert({{"pressure", 4}, {"pressure/mean", 4}, {"erate/rescale", 3}, {"volume", 2}});
} }
// set defaults // set defaults

View File

@ -29,7 +29,7 @@ class FixDeform : public Fix {
int remapflag; // whether x,v are remapped across PBC int remapflag; // whether x,v are remapped across PBC
int dimflag[6]; // which dims are deformed int dimflag[6]; // which dims are deformed
enum { NONE, FINAL, DELTA, SCALE, VEL, ERATE, TRATE, VOLUME, WIGGLE, VARIABLE, PRESSURE, PMEAN }; enum { NONE, FINAL, DELTA, SCALE, VEL, ERATE, TRATE, VOLUME, WIGGLE, VARIABLE, PRESSURE, PMEAN, ERATERS };
enum { ONE_FROM_ONE, ONE_FROM_TWO, TWO_FROM_ONE }; enum { ONE_FROM_ONE, ONE_FROM_TWO, TWO_FROM_ONE };
FixDeform(class LAMMPS *, int, char **); FixDeform(class LAMMPS *, int, char **);

View File

@ -56,6 +56,9 @@ void PairDeprecated::settings(int, char **)
utils::logmesg(lmp, utils::logmesg(lmp,
"\nPair style 'mesont/tpm' has been removed from LAMMPS. " "\nPair style 'mesont/tpm' has been removed from LAMMPS. "
"Please use pair style 'mesocnt' instead\n\n"); "Please use pair style 'mesocnt' instead\n\n");
} else if (utils::strmatch(my_style, "^meam/c")) {
if (lmp->comm->me == 0)
utils::logmesg(lmp, "\nPair style 'meam/c' has been renamed to 'meam'\n\n");
} }
error->all(FLERR, "This pair style is no longer available"); error->all(FLERR, "This pair style is no longer available");
} }

View File

@ -14,6 +14,7 @@
#ifdef PAIR_CLASS #ifdef PAIR_CLASS
// clang-format off // clang-format off
PairStyle(DEPRECATED,PairDeprecated); PairStyle(DEPRECATED,PairDeprecated);
PairStyle(meam/c,PairDeprecated);
PairStyle(reax,PairDeprecated); PairStyle(reax,PairDeprecated);
PairStyle(reax/c,PairDeprecated); PairStyle(reax/c,PairDeprecated);
PairStyle(mesont/tpm,PairDeprecated); PairStyle(mesont/tpm,PairDeprecated);

File diff suppressed because it is too large Load Diff

View File

@ -22,12 +22,37 @@ CommandStyle(replicate,Replicate);
#include "command.h" #include "command.h"
#include <unordered_map>
namespace LAMMPS_NS { namespace LAMMPS_NS {
class Replicate : public Command { class Replicate : public Command {
public: public:
Replicate(class LAMMPS *); Replicate(class LAMMPS *);
void command(int, char **) override; void command(int, char **) override;
private:
int bbox_flag, bond_flag;
class Atom *old;
double old_xprd, old_yprd, old_zprd;
double old_xy, old_xz, old_yz;
int _imagelo[3], _imagehi[3];
double **old_x;
double old_prd_half[3], old_center[3];
tagint *old_tag;
tagint maxtag, maxmol;
int thisrep[3], allnrep[3];
std::unordered_map<tagint, int> old_map;
void replicate_by_proc(int, int, int, double *, double *, double *);
void replicate_by_bbox(int, int, int, double *, double *, double *);
void newtag(tagint, tagint &);
}; };
} // namespace LAMMPS_NS } // namespace LAMMPS_NS

View File

@ -1 +1,2 @@
#define LAMMPS_VERSION "17 Apr 2024" #define LAMMPS_VERSION "17 Apr 2024"
#define LAMMPS_UPDATE "Development"

View File

@ -110,16 +110,31 @@ TEST_F(Advanced_utils, expand_args)
{ {
atomic_system(); atomic_system();
BEGIN_CAPTURE_OUTPUT(); BEGIN_CAPTURE_OUTPUT();
command("compute temp all temp"); try {
command("variable temp vector c_temp"); command("compute temp all temp");
command("variable step equal step"); command("variable temp vector c_temp");
command("variable pe equal pe"); command("variable step equal step");
command("variable pe equal pe"); command("variable pe equal pe");
command("variable epair equal epair"); command("variable pe equal pe");
command("compute gofr all rdf 20 1 1 1 2"); command("variable epair equal epair");
command("fix 1 all ave/time 1 1 1 v_step v_pe v_epair"); command("compute gofr all rdf 20 1 1 1 2");
command("fix 2 all nve"); command("fix 1 all ave/time 1 1 1 v_step v_pe v_epair");
command("run 1 post no"); command("fix 2 all nve");
command("run 1 post no");
} catch (LAMMPSAbortException &ae) {
fprintf(stderr, "LAMMPS Error: %s\n", ae.what());
exit(2);
} catch (LAMMPSException &e) {
fprintf(stderr, "LAMMPS Error: %s\n", e.what());
exit(3);
} catch (fmt::format_error &fe) {
fprintf(stderr, "fmt::format_error: %s\n", fe.what());
exit(4);
} catch (std::exception &e) {
fprintf(stderr, "General exception: %s\n", e.what());
exit(5);
}
auto output = END_CAPTURE_OUTPUT(); auto output = END_CAPTURE_OUTPUT();
char **args, **earg; char **args, **earg;