Merge remote-tracking branch 'github/develop' into collected-small-fixes
This commit is contained in:
@ -322,6 +322,7 @@ set(STANDARD_PACKAGES
|
|||||||
REACTION
|
REACTION
|
||||||
REAXFF
|
REAXFF
|
||||||
REPLICA
|
REPLICA
|
||||||
|
RHEO
|
||||||
RIGID
|
RIGID
|
||||||
SCAFACOS
|
SCAFACOS
|
||||||
SHOCK
|
SHOCK
|
||||||
@ -426,6 +427,7 @@ pkg_depends(CG-DNA ASPHERE)
|
|||||||
pkg_depends(ELECTRODE KSPACE)
|
pkg_depends(ELECTRODE KSPACE)
|
||||||
pkg_depends(EXTRA-MOLECULE MOLECULE)
|
pkg_depends(EXTRA-MOLECULE MOLECULE)
|
||||||
pkg_depends(MESONT MOLECULE)
|
pkg_depends(MESONT MOLECULE)
|
||||||
|
pkg_depends(RHEO BPM)
|
||||||
|
|
||||||
# detect if we may enable OpenMP support by default
|
# detect if we may enable OpenMP support by default
|
||||||
set(BUILD_OMP_DEFAULT OFF)
|
set(BUILD_OMP_DEFAULT OFF)
|
||||||
@ -566,7 +568,7 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
foreach(PKG_WITH_INCL KSPACE PYTHON ML-IAP VORONOI COLVARS ML-HDNNP MDI MOLFILE NETCDF
|
foreach(PKG_WITH_INCL KSPACE PYTHON ML-IAP VORONOI COLVARS ML-HDNNP MDI MOLFILE NETCDF
|
||||||
PLUMED QMMM ML-QUIP SCAFACOS MACHDYN VTK KIM COMPRESS ML-PACE LEPTON)
|
PLUMED QMMM ML-QUIP SCAFACOS MACHDYN VTK KIM COMPRESS ML-PACE LEPTON RHEO)
|
||||||
if(PKG_${PKG_WITH_INCL})
|
if(PKG_${PKG_WITH_INCL})
|
||||||
include(Packages/${PKG_WITH_INCL})
|
include(Packages/${PKG_WITH_INCL})
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
2
cmake/Modules/Packages/RHEO.cmake
Normal file
2
cmake/Modules/Packages/RHEO.cmake
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
find_package(GSL 2.7 REQUIRED)
|
||||||
|
target_link_libraries(lammps PRIVATE GSL::gsl)
|
||||||
@ -82,6 +82,7 @@ set(ALL_PACKAGES
|
|||||||
REACTION
|
REACTION
|
||||||
REAXFF
|
REAXFF
|
||||||
REPLICA
|
REPLICA
|
||||||
|
RHEO
|
||||||
RIGID
|
RIGID
|
||||||
SCAFACOS
|
SCAFACOS
|
||||||
SHOCK
|
SHOCK
|
||||||
|
|||||||
@ -84,6 +84,7 @@ set(ALL_PACKAGES
|
|||||||
REACTION
|
REACTION
|
||||||
REAXFF
|
REAXFF
|
||||||
REPLICA
|
REPLICA
|
||||||
|
RHEO
|
||||||
RIGID
|
RIGID
|
||||||
SCAFACOS
|
SCAFACOS
|
||||||
SHOCK
|
SHOCK
|
||||||
|
|||||||
@ -59,6 +59,7 @@ This is the list of packages that may require additional steps.
|
|||||||
* :ref:`POEMS <poems>`
|
* :ref:`POEMS <poems>`
|
||||||
* :ref:`PYTHON <python>`
|
* :ref:`PYTHON <python>`
|
||||||
* :ref:`QMMM <qmmm>`
|
* :ref:`QMMM <qmmm>`
|
||||||
|
* :ref:`RHEO <rheo>`
|
||||||
* :ref:`SCAFACOS <scafacos>`
|
* :ref:`SCAFACOS <scafacos>`
|
||||||
* :ref:`VORONOI <voronoi>`
|
* :ref:`VORONOI <voronoi>`
|
||||||
* :ref:`VTK <vtk>`
|
* :ref:`VTK <vtk>`
|
||||||
@ -1566,10 +1567,11 @@ LAMMPS build.
|
|||||||
.. tab:: CMake build
|
.. tab:: CMake build
|
||||||
|
|
||||||
When the ``-D PKG_PLUMED=yes`` flag is included in the cmake
|
When the ``-D PKG_PLUMED=yes`` flag is included in the cmake
|
||||||
command you must ensure that GSL is installed in locations that
|
command you must ensure that `the GNU Scientific Library (GSL)
|
||||||
are specified in your environment. There are then two additional
|
<https://www.gnu.org/software/gsl/>` is installed in locations
|
||||||
variables that control the manner in which PLUMED is obtained and
|
that are accessible in your environment. There are then two
|
||||||
linked into LAMMPS.
|
additional variables that control the manner in which PLUMED is
|
||||||
|
obtained and linked into LAMMPS.
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
@ -2040,6 +2042,36 @@ verified to work in February 2020 with Quantum Espresso versions 6.3 to
|
|||||||
|
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
.. _rheo:
|
||||||
|
|
||||||
|
RHEO package
|
||||||
|
------------
|
||||||
|
|
||||||
|
To build with this package you must have the `GNU Scientific Library
|
||||||
|
(GSL) <https://www.gnu.org/software/gsl/>` installed in locations that
|
||||||
|
are accessible in your environment. The GSL library should be at least
|
||||||
|
version 2.7.
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. tab:: CMake build
|
||||||
|
|
||||||
|
If CMake cannot find the GSL library or include files, you can set:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
-D GSL_ROOT_DIR=path # path to root of GSL installation
|
||||||
|
|
||||||
|
.. tab:: Traditional make
|
||||||
|
|
||||||
|
LAMMPS will try to auto-detect the GSL compiler and linker flags
|
||||||
|
from the corresponding ``pkg-config`` file (``gsl.pc``), otherwise
|
||||||
|
you can edit the file ``lib/rheo/Makefile.lammps``
|
||||||
|
to specify the paths and library names where indicated by comments.
|
||||||
|
This must be done **before** the package is installed.
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
.. _scafacos:
|
.. _scafacos:
|
||||||
|
|
||||||
SCAFACOS package
|
SCAFACOS package
|
||||||
|
|||||||
@ -62,6 +62,7 @@ packages:
|
|||||||
* :ref:`POEMS <poems>`
|
* :ref:`POEMS <poems>`
|
||||||
* :ref:`PYTHON <python>`
|
* :ref:`PYTHON <python>`
|
||||||
* :ref:`QMMM <qmmm>`
|
* :ref:`QMMM <qmmm>`
|
||||||
|
* :ref:`RHEO <rheo>`
|
||||||
* :ref:`SCAFACOS <scafacos>`
|
* :ref:`SCAFACOS <scafacos>`
|
||||||
* :ref:`VORONOI <voronoi>`
|
* :ref:`VORONOI <voronoi>`
|
||||||
* :ref:`VTK <vtk>`
|
* :ref:`VTK <vtk>`
|
||||||
|
|||||||
@ -54,6 +54,7 @@ OPT.
|
|||||||
* :doc:`oxdna2/fene <bond_oxdna>`
|
* :doc:`oxdna2/fene <bond_oxdna>`
|
||||||
* :doc:`oxrna2/fene <bond_oxdna>`
|
* :doc:`oxrna2/fene <bond_oxdna>`
|
||||||
* :doc:`quartic (o) <bond_quartic>`
|
* :doc:`quartic (o) <bond_quartic>`
|
||||||
|
* :doc:`rheo/shell <bond_rheo_shell>`
|
||||||
* :doc:`special <bond_special>`
|
* :doc:`special <bond_special>`
|
||||||
* :doc:`table (o) <bond_table>`
|
* :doc:`table (o) <bond_table>`
|
||||||
|
|
||||||
|
|||||||
@ -126,6 +126,7 @@ KOKKOS, o = OPENMP, t = OPT.
|
|||||||
* :doc:`reduce <compute_reduce>`
|
* :doc:`reduce <compute_reduce>`
|
||||||
* :doc:`reduce/chunk <compute_reduce_chunk>`
|
* :doc:`reduce/chunk <compute_reduce_chunk>`
|
||||||
* :doc:`reduce/region <compute_reduce>`
|
* :doc:`reduce/region <compute_reduce>`
|
||||||
|
* :doc:`rheo/property/atom <compute_rheo_property_atom>`
|
||||||
* :doc:`rigid/local <compute_rigid_local>`
|
* :doc:`rigid/local <compute_rigid_local>`
|
||||||
* :doc:`saed <compute_saed>`
|
* :doc:`saed <compute_saed>`
|
||||||
* :doc:`slcsa/atom <compute_slcsa_atom>`
|
* :doc:`slcsa/atom <compute_slcsa_atom>`
|
||||||
|
|||||||
@ -28,6 +28,7 @@ OPT.
|
|||||||
* :doc:`adapt <fix_adapt>`
|
* :doc:`adapt <fix_adapt>`
|
||||||
* :doc:`adapt/fep <fix_adapt_fep>`
|
* :doc:`adapt/fep <fix_adapt_fep>`
|
||||||
* :doc:`addforce <fix_addforce>`
|
* :doc:`addforce <fix_addforce>`
|
||||||
|
* :doc:`add/heat <fix_add_heat>`
|
||||||
* :doc:`addtorque <fix_addtorque>`
|
* :doc:`addtorque <fix_addtorque>`
|
||||||
* :doc:`alchemy <fix_alchemy>`
|
* :doc:`alchemy <fix_alchemy>`
|
||||||
* :doc:`amoeba/bitorsion <fix_amoeba_bitorsion>`
|
* :doc:`amoeba/bitorsion <fix_amoeba_bitorsion>`
|
||||||
@ -204,6 +205,11 @@ OPT.
|
|||||||
* :doc:`reaxff/species (k) <fix_reaxff_species>`
|
* :doc:`reaxff/species (k) <fix_reaxff_species>`
|
||||||
* :doc:`recenter <fix_recenter>`
|
* :doc:`recenter <fix_recenter>`
|
||||||
* :doc:`restrain <fix_restrain>`
|
* :doc:`restrain <fix_restrain>`
|
||||||
|
* :doc:`rheo <fix_rheo>`
|
||||||
|
* :doc:`rheo/oxidation <fix_rheo_oxidation>`
|
||||||
|
* :doc:`rheo/pressure <fix_rheo_pressure>`
|
||||||
|
* :doc:`rheo/thermal <fix_rheo_thermal>`
|
||||||
|
* :doc:`rheo/viscosity <fix_rheo_viscosity>`
|
||||||
* :doc:`rhok <fix_rhok>`
|
* :doc:`rhok <fix_rhok>`
|
||||||
* :doc:`rigid (o) <fix_rigid>`
|
* :doc:`rigid (o) <fix_rigid>`
|
||||||
* :doc:`rigid/meso <fix_rigid_meso>`
|
* :doc:`rigid/meso <fix_rigid_meso>`
|
||||||
|
|||||||
@ -264,6 +264,8 @@ OPT.
|
|||||||
* :doc:`rebo (io) <pair_airebo>`
|
* :doc:`rebo (io) <pair_airebo>`
|
||||||
* :doc:`rebomos (o) <pair_rebomos>`
|
* :doc:`rebomos (o) <pair_rebomos>`
|
||||||
* :doc:`resquared (go) <pair_resquared>`
|
* :doc:`resquared (go) <pair_resquared>`
|
||||||
|
* :doc:`rheo <pair_rheo>`
|
||||||
|
* :doc:`rheo/solid <pair_rheo_solid>`
|
||||||
* :doc:`saip/metal (t) <pair_saip_metal>`
|
* :doc:`saip/metal (t) <pair_saip_metal>`
|
||||||
* :doc:`sdpd/taitwater/isothermal <pair_sdpd_taitwater_isothermal>`
|
* :doc:`sdpd/taitwater/isothermal <pair_sdpd_taitwater_isothermal>`
|
||||||
* :doc:`smatb <pair_smatb>`
|
* :doc:`smatb <pair_smatb>`
|
||||||
|
|||||||
@ -134,6 +134,8 @@ Lowercase directories
|
|||||||
+-------------+------------------------------------------------------------------+
|
+-------------+------------------------------------------------------------------+
|
||||||
| rerun | use of rerun and read_dump commands |
|
| rerun | use of rerun and read_dump commands |
|
||||||
+-------------+------------------------------------------------------------------+
|
+-------------+------------------------------------------------------------------+
|
||||||
|
| rheo | RHEO simulations of fluid flows and phase transitions |
|
||||||
|
+-------------+------------------------------------------------------------------+
|
||||||
| 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 |
|
||||||
|
|||||||
@ -89,6 +89,7 @@ Packages howto
|
|||||||
Howto_drude2
|
Howto_drude2
|
||||||
Howto_peri
|
Howto_peri
|
||||||
Howto_manifold
|
Howto_manifold
|
||||||
|
Howto_rheo
|
||||||
Howto_spins
|
Howto_spins
|
||||||
|
|
||||||
Tutorials howto
|
Tutorials howto
|
||||||
|
|||||||
116
doc/src/Howto_rheo.rst
Normal file
116
doc/src/Howto_rheo.rst
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
Reproducing hydrodynamics and elastic objects (RHEO)
|
||||||
|
====================================================
|
||||||
|
|
||||||
|
The RHEO package is a hybrid implementation of smoothed particle
|
||||||
|
hydrodynamics (SPH) for fluid flow, which can couple to the :doc:`BPM package
|
||||||
|
<Howto_bpm>` to model solid elements. RHEO combines these methods to enable
|
||||||
|
mesh-free modeling of multi-phase material systems. Its SPH solver supports
|
||||||
|
many advanced options including reproducing kernels, particle shifting, free
|
||||||
|
surface identification, and solid surface reconstruction. To model fluid-solid
|
||||||
|
systems, the status of particles can dynamically change between a fluid and
|
||||||
|
solid state, e.g. during melting/solidification, which determines how they
|
||||||
|
interact and their physical behavior. The package is designed with modularity
|
||||||
|
in mind, so one can easily turn various features on/off, adjust physical
|
||||||
|
details of the system, or develop new capabilities. For instance, the numerics
|
||||||
|
associated with calculating gradients, reproducing kernels, etc. are separated
|
||||||
|
into distinctclasses to simplify the development of new integration schemes
|
||||||
|
which can call these calculations. Additional numerical details can be found in
|
||||||
|
:ref:`(Palermo) <howto_rheo_palermo>` and
|
||||||
|
:ref:`(Clemmer) <howto_rheo_clemmer>`.
|
||||||
|
|
||||||
|
Note, if you simply want to run a traditional SPH simulation, the :ref:`SPH package
|
||||||
|
<PKG-SPH>` package is likely better suited for your application. It has fewer advanced
|
||||||
|
features and therefore benefits from improved performance. The :ref:`MACHDYN
|
||||||
|
<PKG-MACHDYN>` package for solids may also be relevant for fluid-solid problems.
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
At the core of the package is :doc:`fix rheo <fix_rheo>` which integrates
|
||||||
|
particle trajectories and controls many optional features (e.g. the use
|
||||||
|
of reproducing kernels). In conjunction to fix rheo, one must specify an
|
||||||
|
instance of :doc:`fix rheo/pressure <fix_rheo_pressure>` and
|
||||||
|
:doc:`fix rheo/viscosity <fix_rheo_viscosity>` to define a pressure equation
|
||||||
|
of state and viscosity model, respectively. Optionally, one can model
|
||||||
|
a heat equation with :doc:`fix rheo/thermal <fix_rheo_thermal>`, which also
|
||||||
|
allows the user to specify equations for a particle's thermal conductivity,
|
||||||
|
specific heat, latent heat, and melting temperature. The ordering of these
|
||||||
|
fixes in an an input script matters. Fix rheo must be defined prior to all
|
||||||
|
other RHEO fixes.
|
||||||
|
|
||||||
|
Typically, RHEO requires atom style rheo. In addition to typical atom
|
||||||
|
properties like positions and forces, particles store a local density,
|
||||||
|
viscosity, pressure, and status. If thermal evolution is modeled, one must
|
||||||
|
use atom style rheo/thermal which also includes a local energy, temperature, and
|
||||||
|
conductivity. Note that the temperature is always derived from the energy.
|
||||||
|
This implies the *temperature* attribute of :doc:`the set command <set>` does not
|
||||||
|
affect particles. Instead, one should use the *sph/e* attribute.
|
||||||
|
|
||||||
|
The status variable uses bit-masking to track various properties of a particle
|
||||||
|
such as its current state of matter (fluid or solid) and its location relative
|
||||||
|
to a surface. Some of these properties (and others) can be accessed using
|
||||||
|
:doc:`compute rheo/property/atom <compute_rheo_property_atom>`. The *status*
|
||||||
|
attribute in :doc:`the set command <set>` only allows control over the first bit
|
||||||
|
which sets the state of matter, 0 is fluid and 1 is solid.
|
||||||
|
|
||||||
|
Fluid interactions, including pressure forces, viscous forces, and heat exchange,
|
||||||
|
are calculated using :doc:`pair rheo <pair_rheo>`. Unlike typical pair styles,
|
||||||
|
pair rheo ignores the :doc:`special bond <special_bonds>` settings. Instead,
|
||||||
|
it determines whether to calculate forces based on the status of particles: e.g.,
|
||||||
|
hydrodynamic forces are only calculated if a fluid particle is involved.
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
To model elastic objects, there are currently two mechanisms in RHEO, one designed
|
||||||
|
for bulk solid bodies and the other for thin shells. Both mechanisms rely on
|
||||||
|
introducing bonded forces between particles and therefore require a hybrid of atom
|
||||||
|
style bond and rheo (or rheo/thermal).
|
||||||
|
|
||||||
|
To create an elastic solid body, one has to (a) change the status of constituent
|
||||||
|
particles to solid (e.g. with the :doc:`set <set>` command), (b) create bpm
|
||||||
|
bonds between the particles (see the :doc:`bpm howto <Howto_bpm>` page for
|
||||||
|
more details), and (c) use :doc:`pair rheo/solid <pair_rheo_solid>` to
|
||||||
|
apply repulsive contact forces between distinct solid bodies. Akin to pair rheo,
|
||||||
|
pair rheo/solid considers a particles fluid/solid phase to determine whether to
|
||||||
|
apply forces. However, unlike pair rheo, pair rheo/solid does obey special bond
|
||||||
|
settings such that contact forces do not have to be calculated between two bonded
|
||||||
|
solid particles in the same elastic body.
|
||||||
|
|
||||||
|
In systems with thermal evolution, fix rheo/thermal can optionally set a
|
||||||
|
melting/solidification temperature allowing particles to dynamically swap their
|
||||||
|
state between fluid and solid when the temperature exceeds or drops below the
|
||||||
|
critical temperature, respectively. Using the *react* option, one can specify a maximum
|
||||||
|
bond length and a bond type. Then, when solidifying, particles will search their
|
||||||
|
local neighbors and automatically create bonds with any neighboring solid particles
|
||||||
|
in range. For BPM bond styles, bonds will then use the immediate position of the two
|
||||||
|
particles to calculate a reference state. When melting, particles will delete any
|
||||||
|
bonds of the specified type when reverting to a fluid state. Special bonds are updated
|
||||||
|
as bonds are created/broken.
|
||||||
|
|
||||||
|
The other option for elastic objects is an elastic shell that is nominally much
|
||||||
|
thinner than a particle diameter, e.g. a oxide skin which gradually forms over time
|
||||||
|
on the surface of a fluid. Currently, this is implemented using
|
||||||
|
:doc:`fix rheo/oxidation <fix_rheo_oxidation>` and bond style
|
||||||
|
:doc:`rheo/shell <bond_rheo_shell>`. Essentially, fix rheo/oxidation creates candidate
|
||||||
|
bonds of a specified type between surface fluid particles within a specified distance.
|
||||||
|
a newly created rheo/shell bond will then start a timer. While the timer is counting
|
||||||
|
down, the bond will delete itself if particles move too far apart or move away from the
|
||||||
|
surface. However, if the timer reaches a user-defined threshold, then the bond will
|
||||||
|
activate and apply additional forces to the fluid particles. Bond style rheo/shell
|
||||||
|
then operates very similarly to a BPM bond style, storing a reference length and
|
||||||
|
breaking if stretched too far. Unlike the above method, this option does not remove
|
||||||
|
the underlying fluid interactions (although particle shifting is turned off) and does
|
||||||
|
not modify special bond settings of particles.
|
||||||
|
|
||||||
|
While these two options are not expected to be appropriate for every system,
|
||||||
|
either framework can be modified to create more suitable models (e.g. by changing the
|
||||||
|
criteria for creating/deleting a bond or altering force calculations).
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. _howto_rheo_palermo:
|
||||||
|
|
||||||
|
**(Palermo)** Palermo, Wolf, Clemmer, O'Connor, in preparation.
|
||||||
|
|
||||||
|
.. _howto_rheo_clemmer:
|
||||||
|
|
||||||
|
**(Clemmer)** Clemmer, Pierce, O'Connor, Nevins, Jones, Lechman, Tencer, Appl. Math. Model., 130, 310-326 (2024).
|
||||||
@ -8,12 +8,12 @@ info on how to download or build any extra library it requires. It also
|
|||||||
gives links to documentation, example scripts, and pictures/movies (if
|
gives links to documentation, example scripts, and pictures/movies (if
|
||||||
available) that illustrate use of the package.
|
available) that illustrate use of the package.
|
||||||
|
|
||||||
The majority of packages can be included in a LAMMPS build with a
|
The majority of packages can be included in a LAMMPS build with a single
|
||||||
single setting (``-D PKG_<NAME>=on`` for CMake) or command
|
setting (``-D PKG_<NAME>=on`` for CMake) or command (``make yes-<name>``
|
||||||
(``make yes-<name>`` for make). See the :doc:`Build package <Build_package>`
|
for make). See the :doc:`Build package <Build_package>` page for more
|
||||||
page for more info. A few packages may require additional steps;
|
info. A few packages may require additional steps; this is indicated in
|
||||||
this is indicated in the descriptions below. The :doc:`Build extras <Build_extras>`
|
the descriptions below. The :doc:`Build extras <Build_extras>` page
|
||||||
page gives those details.
|
gives those details.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
@ -103,6 +103,7 @@ page gives those details.
|
|||||||
* :ref:`QEQ <PKG-QEQ>`
|
* :ref:`QEQ <PKG-QEQ>`
|
||||||
* :ref:`QMMM <PKG-QMMM>`
|
* :ref:`QMMM <PKG-QMMM>`
|
||||||
* :ref:`QTB <PKG-QTB>`
|
* :ref:`QTB <PKG-QTB>`
|
||||||
|
* :ref:`RHEO <PKG-RHEO>`
|
||||||
* :ref:`REACTION <PKG-REACTION>`
|
* :ref:`REACTION <PKG-REACTION>`
|
||||||
* :ref:`REAXFF <PKG-REAXFF>`
|
* :ref:`REAXFF <PKG-REAXFF>`
|
||||||
* :ref:`REPLICA <PKG-REPLICA>`
|
* :ref:`REPLICA <PKG-REPLICA>`
|
||||||
@ -2622,6 +2623,45 @@ another set.
|
|||||||
|
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
.. _PKG-RHEO:
|
||||||
|
|
||||||
|
RHEO package
|
||||||
|
------------
|
||||||
|
|
||||||
|
**Contents:**
|
||||||
|
|
||||||
|
Pair styles, bond styles, fixes, and computes for reproducing
|
||||||
|
hydrodynamics and elastic objects. See the :doc:`Howto rheo
|
||||||
|
<Howto_rheo>` page for an overview.
|
||||||
|
|
||||||
|
**Install:**
|
||||||
|
|
||||||
|
This package has :ref:`specific installation instructions <rheo>` on the :doc:`Build extras <Build_extras>` page.
|
||||||
|
|
||||||
|
**Authors:** Joel T. Clemmer (Sandia National Labs),
|
||||||
|
Thomas C. O'Connor (Carnegie Mellon University)
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
**Supporting info:**
|
||||||
|
|
||||||
|
* src/RHEO filenames -> commands
|
||||||
|
* :doc:`Howto_rheo <Howto_rheo>`
|
||||||
|
* :doc:`atom_style rheo <atom_style>`
|
||||||
|
* :doc:`atom_style rheo/thermal <atom_style>`
|
||||||
|
* :doc:`bond_style rheo/shell <bond_rheo_shell>`
|
||||||
|
* :doc:`compute rheo/property/atom <compute_rheo_property_atom>`
|
||||||
|
* :doc:`fix rheo <fix_rheo>`
|
||||||
|
* :doc:`fix rheo/oxidation <fix_rheo_oxidation>`
|
||||||
|
* :doc:`fix rheo/pressure <fix_rheo_pressure>`
|
||||||
|
* :doc:`fix rheo/thermal <fix_rheo_thermal>`
|
||||||
|
* :doc:`fix rheo/viscosity <fix_rheo_viscosity>`
|
||||||
|
* :doc:`pair_style rheo <pair_rheo>`
|
||||||
|
* :doc:`pair_style rheo/solid <pair_rheo_solid>`
|
||||||
|
* examples/rheo
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
.. _PKG-RIGID:
|
.. _PKG-RIGID:
|
||||||
|
|
||||||
RIGID package
|
RIGID package
|
||||||
|
|||||||
@ -413,6 +413,11 @@ whether an extra library is needed to build and use the package:
|
|||||||
- :doc:`fix qtb <fix_qtb>` :doc:`fix qbmsst <fix_qbmsst>`
|
- :doc:`fix qtb <fix_qtb>` :doc:`fix qbmsst <fix_qbmsst>`
|
||||||
- qtb
|
- qtb
|
||||||
- no
|
- no
|
||||||
|
* - :ref:`RHEO <PKG-RHEO>`
|
||||||
|
- reproducing hydrodynamics and elastic objects
|
||||||
|
- :doc:`Howto rheo <Howto_rheo>`
|
||||||
|
- rheo
|
||||||
|
- no
|
||||||
* - :ref:`REACTION <PKG-REACTION>`
|
* - :ref:`REACTION <PKG-REACTION>`
|
||||||
- chemical reactions in classical MD
|
- chemical reactions in classical MD
|
||||||
- :doc:`fix bond/react <fix_bond_react>`
|
- :doc:`fix bond/react <fix_bond_react>`
|
||||||
|
|||||||
@ -189,6 +189,14 @@ the Additional Information section below.
|
|||||||
- *atomic* + molecule, radius, rmass + "smd data"
|
- *atomic* + molecule, radius, rmass + "smd data"
|
||||||
- :ref:`MACHDYN <PKG-MACHDYN>`
|
- :ref:`MACHDYN <PKG-MACHDYN>`
|
||||||
- Smooth Mach Dynamics models
|
- Smooth Mach Dynamics models
|
||||||
|
* - *rheo*
|
||||||
|
- *atomic* + rho, status
|
||||||
|
- :ref:`RHEO <PKG-RHEO>`
|
||||||
|
- solid and fluid RHEO particles
|
||||||
|
* - *rheo/thermal*
|
||||||
|
- *atomic* + rho, status, energy, temperature
|
||||||
|
- :ref:`RHEO <PKG-RHEO>`
|
||||||
|
- RHEO particles with temperature
|
||||||
* - *sph*
|
* - *sph*
|
||||||
- *atomic* + "sph data"
|
- *atomic* + "sph data"
|
||||||
- :ref:`SPH <PKG-SPH>`
|
- :ref:`SPH <PKG-SPH>`
|
||||||
|
|||||||
188
doc/src/bond_rheo_shell.rst
Normal file
188
doc/src/bond_rheo_shell.rst
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
.. index:: bond_style rheo/shell
|
||||||
|
|
||||||
|
bond_style rheo/shell command
|
||||||
|
=============================
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
bond_style rheo/shell keyword value attribute1 attribute2 ...
|
||||||
|
|
||||||
|
* required keyword = *t/form*
|
||||||
|
* optional keyword = *store/local*
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
*t/form* value = formation time for a bond (time units)
|
||||||
|
|
||||||
|
*store/local* values = fix_ID N attributes ...
|
||||||
|
* fix_ID = ID of associated internal fix to store data
|
||||||
|
* N = prepare data for output every this many timesteps
|
||||||
|
* attributes = zero or more of the below attributes may be appended
|
||||||
|
|
||||||
|
*id1, id2* = IDs of 2 atoms in the bond
|
||||||
|
*time* = the timestep the bond broke
|
||||||
|
*x, y, z* = the center of mass position of the 2 atoms when the bond broke (distance units)
|
||||||
|
*x/ref, y/ref, z/ref* = the initial center of mass position of the 2 atoms (distance units)
|
||||||
|
|
||||||
|
Examples
|
||||||
|
""""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
bond_style rheo/shell t/form 10.0
|
||||||
|
bond_coeff 1 1.0 0.05 0.1
|
||||||
|
|
||||||
|
Description
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
The *rheo/shell* bond style is designed to work with
|
||||||
|
:doc:`fix rheo/oxidation <fix_rheo_oxidation>` which creates candidate
|
||||||
|
bonds between eligible surface or near-surface particles. When a bond
|
||||||
|
is first created, it computes no forces and starts a timer. Forces are
|
||||||
|
not computed until the timer reaches the specified bond formation time,
|
||||||
|
*t/form*, and the bond is enabled and applies forces. If the two particles
|
||||||
|
move outside of the maximum bond distance or move into the bulk before
|
||||||
|
the timer reaches *t/form*, the bond automatically deletes itself. This
|
||||||
|
deletion is not recorded as a broken bond in the optional *store/local* fix.
|
||||||
|
|
||||||
|
Before bonds are enabled, they are still treated as regular bonds by
|
||||||
|
all other parts of LAMMPS. This means they are written to data files
|
||||||
|
and counted in computes such as :doc:`nbond/atom <compute_nbond_atom>`.
|
||||||
|
To only count enabled bonds, use the *nbond/shell* attribute in
|
||||||
|
:doc:`compute rheo/property/atom <compute_rheo_property_atom>`.
|
||||||
|
|
||||||
|
When enabled, the bond then computes forces based on deviations from
|
||||||
|
the initial reference state of the two atoms much like a BPM style
|
||||||
|
bond (as further discussed in the :doc:`BPM howto page <Howto_bpm>`).
|
||||||
|
The reference state is stored by each bond when it is first enabled.
|
||||||
|
Data is then preserved across run commands and is written to
|
||||||
|
:doc:`binary restart files <restart>` such that restarting the system
|
||||||
|
will not reset the reference state of a bond or the timer.
|
||||||
|
|
||||||
|
This bond style is based on a model described in
|
||||||
|
:ref:`(Clemmer) <rheo_clemmer>`. The force has a magnitude of
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
F = 2 k (r - r_0) + \frac{2 k}{r_0^2 \epsilon_c^2} (r - r_0)^3
|
||||||
|
|
||||||
|
where :math:`k` is a stiffness, :math:`r` is the current distance
|
||||||
|
and :math:`r_0` is the initial distance between the two particles, and
|
||||||
|
:math:`\epsilon_c` is maximum strain beyond which a bond breaks. This
|
||||||
|
is done by setting the bond type to 0 such that forces are no longer
|
||||||
|
computed.
|
||||||
|
|
||||||
|
A damping force proportional to the difference in the normal velocity
|
||||||
|
of particles is also applied to bonded particles:
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
F_D = - \gamma w (\hat{r} \bullet \vec{v})
|
||||||
|
|
||||||
|
where :math:`\gamma` is the damping strength, :math:`\hat{r}` is the
|
||||||
|
displacement normal vector, and :math:`\vec{v}` is the velocity difference
|
||||||
|
between the two particles.
|
||||||
|
|
||||||
|
The following coefficients must be defined for each bond type via the
|
||||||
|
:doc:`bond_coeff <bond_coeff>` command as in the example above, or in
|
||||||
|
the data file or restart files read by the :doc:`read_data
|
||||||
|
<read_data>` or :doc:`read_restart <read_restart>` commands:
|
||||||
|
|
||||||
|
* :math:`k` (force/distance units)
|
||||||
|
* :math:`\epsilon_c` (unit less)
|
||||||
|
* :math:`\gamma` (force/velocity units)
|
||||||
|
|
||||||
|
Unlike other BPM-style bonds, this bond style does not update special
|
||||||
|
bond settings when bonds are created or deleted. This bond style also
|
||||||
|
does not enforce specific :doc:`special_bonds <special_bonds>` settings.
|
||||||
|
This behavior is purposeful such :doc:`RHEO pair <pair_rheo>` forces
|
||||||
|
and heat flows are still calculated.
|
||||||
|
|
||||||
|
If the *store/local* keyword is used, an internal fix will track bonds that
|
||||||
|
break during the simulation. Whenever a bond breaks, data is processed
|
||||||
|
and transferred to an internal fix labeled *fix_ID*. This allows the
|
||||||
|
local data to be accessed by other LAMMPS commands. Following this optional
|
||||||
|
keyword, a list of one or more attributes is specified. These include the
|
||||||
|
IDs of the two atoms in the bond. The other attributes for the two atoms
|
||||||
|
include the timestep during which the bond broke and the current/initial
|
||||||
|
center of mass position of the two atoms.
|
||||||
|
|
||||||
|
Data is continuously accumulated over intervals of *N*
|
||||||
|
timesteps. At the end of each interval, all of the saved accumulated
|
||||||
|
data is deleted to make room for new data. Individual datum may
|
||||||
|
therefore persist anywhere between *1* to *N* timesteps depending on
|
||||||
|
when they are saved. This data can be accessed using the *fix_ID* and a
|
||||||
|
:doc:`dump local <dump>` command. To ensure all data is output,
|
||||||
|
the dump frequency should correspond to the same interval of *N*
|
||||||
|
timesteps. A dump frequency of an integer multiple of *N* can be used
|
||||||
|
to regularly output a sample of the accumulated data.
|
||||||
|
|
||||||
|
Note that when unbroken bonds are dumped to a file via the
|
||||||
|
:doc:`dump local <dump>` command, bonds with type 0 (broken bonds)
|
||||||
|
are not included.
|
||||||
|
The :doc:`delete_bonds <delete_bonds>` command can also be used to
|
||||||
|
query the status of broken bonds or permanently delete them, e.g.:
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
delete_bonds all stats
|
||||||
|
delete_bonds all bond 0 remove
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
Restart and other info
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
This bond style writes the reference state of each bond to
|
||||||
|
:doc:`binary restart files <restart>`. Loading a restart
|
||||||
|
file will properly restore bonds. However, the reference state is NOT
|
||||||
|
written to data files. Therefore reading a data file will not
|
||||||
|
restore bonds and will cause their reference states to be redefined.
|
||||||
|
|
||||||
|
If the *store/local* option is used, an internal fix will calculate
|
||||||
|
a local vector or local array depending on the number of input values.
|
||||||
|
The length of the vector or number of rows in the array is the number
|
||||||
|
of recorded, broken bonds. If a single input is specified, a local
|
||||||
|
vector is produced. If two or more inputs are specified, a local array
|
||||||
|
is produced where the number of columns = the number of inputs. The
|
||||||
|
vector or array can be accessed by any command that uses local values
|
||||||
|
from a compute as input. See the :doc:`Howto output <Howto_output>` page
|
||||||
|
for an overview of LAMMPS output options.
|
||||||
|
|
||||||
|
The vector or array will be floating point values that correspond to
|
||||||
|
the specified attribute.
|
||||||
|
|
||||||
|
The single() function of this bond style returns 0.0 for the energy
|
||||||
|
of a bonded interaction, since energy is not conserved in these
|
||||||
|
dissipative potentials. The single() function also calculates two
|
||||||
|
extra bond quantities, the initial distance :math:`r_0` and a time.
|
||||||
|
These extra quantities can be accessed by the
|
||||||
|
:doc:`compute bond/local <compute_bond_local>` command as *b1* and *b2*\ .
|
||||||
|
|
||||||
|
Restrictions
|
||||||
|
""""""""""""
|
||||||
|
|
||||||
|
This bond style is part of the RHEO package. It is only enabled if
|
||||||
|
LAMMPS was built with that package. See the :doc:`Build package
|
||||||
|
<Build_package>` page for more info.
|
||||||
|
|
||||||
|
Related commands
|
||||||
|
""""""""""""""""
|
||||||
|
|
||||||
|
:doc:`bond_coeff <bond_coeff>`, :doc:`fix rheo/oxidation <fix_rheo_oxidation>`
|
||||||
|
|
||||||
|
Default
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
NA
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. _rheo_clemmer:
|
||||||
|
|
||||||
|
**(Clemmer)** Clemmer, Pierce, O'Connor, Nevins, Jones, Lechman, Tencer, Appl. Math. Model., 130, 310-326 (2024).
|
||||||
@ -105,6 +105,7 @@ accelerated styles exist.
|
|||||||
* :doc:`oxdna2/fene <bond_oxdna>` - same as oxdna but used with different pair styles
|
* :doc:`oxdna2/fene <bond_oxdna>` - same as oxdna but used with different pair styles
|
||||||
* :doc:`oxrna2/fene <bond_oxdna>` - modified FENE bond suitable for RNA modeling
|
* :doc:`oxrna2/fene <bond_oxdna>` - modified FENE bond suitable for RNA modeling
|
||||||
* :doc:`quartic <bond_quartic>` - breakable quartic bond
|
* :doc:`quartic <bond_quartic>` - breakable quartic bond
|
||||||
|
* :doc:`rheo/shell <bond_rheo_shell>` - shell bond for oxidation modeling in RHEO
|
||||||
* :doc:`special <bond_special>` - enable special bond exclusions for 1-5 pairs and beyond
|
* :doc:`special <bond_special>` - enable special bond exclusions for 1-5 pairs and beyond
|
||||||
* :doc:`table <bond_table>` - tabulated by bond length
|
* :doc:`table <bond_table>` - tabulated by bond length
|
||||||
|
|
||||||
|
|||||||
@ -290,6 +290,7 @@ The individual style names on the :doc:`Commands compute <Commands_compute>` pag
|
|||||||
* :doc:`reduce <compute_reduce>` - combine per-atom quantities into a single global value
|
* :doc:`reduce <compute_reduce>` - combine per-atom quantities into a single global value
|
||||||
* :doc:`reduce/chunk <compute_reduce_chunk>` - reduce per-atom quantities within each chunk
|
* :doc:`reduce/chunk <compute_reduce_chunk>` - reduce per-atom quantities within each chunk
|
||||||
* :doc:`reduce/region <compute_reduce>` - same as compute reduce, within a region
|
* :doc:`reduce/region <compute_reduce>` - same as compute reduce, within a region
|
||||||
|
* :doc:`rheo/property/atom <compute_rheo_property_atom>` - convert atom attributes in RHEO package to per-atom vectors/arrays
|
||||||
* :doc:`rigid/local <compute_rigid_local>` - extract rigid body attributes
|
* :doc:`rigid/local <compute_rigid_local>` - extract rigid body attributes
|
||||||
* :doc:`saed <compute_saed>` - electron diffraction intensity on a mesh of reciprocal lattice nodes
|
* :doc:`saed <compute_saed>` - electron diffraction intensity on a mesh of reciprocal lattice nodes
|
||||||
* :doc:`slcsa/atom <compute_slcsa_atom>` - perform Supervised Learning Crystal Structure Analysis (SL-CSA)
|
* :doc:`slcsa/atom <compute_slcsa_atom>` - perform Supervised Learning Crystal Structure Analysis (SL-CSA)
|
||||||
|
|||||||
@ -8,10 +8,17 @@ Syntax
|
|||||||
|
|
||||||
.. code-block:: LAMMPS
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
compute ID group-ID nbond/atom
|
compute ID group-ID nbond/atom keyword value
|
||||||
|
|
||||||
* ID, group-ID are documented in :doc:`compute <compute>` command
|
* ID, group-ID are documented in :doc:`compute <compute>` command
|
||||||
* nbond/atom = style name of this compute command
|
* nbond/atom = style name of this compute command
|
||||||
|
* zero or more keyword/value pairs may be appended
|
||||||
|
* keyword = *bond/type*
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
*bond/type* value = *btype*
|
||||||
|
*btype* = bond type included in count
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
""""""""
|
""""""""
|
||||||
@ -19,6 +26,7 @@ Examples
|
|||||||
.. code-block:: LAMMPS
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
compute 1 all nbond/atom
|
compute 1 all nbond/atom
|
||||||
|
compute 1 all nbond/atom bond/type 2
|
||||||
|
|
||||||
Description
|
Description
|
||||||
"""""""""""
|
"""""""""""
|
||||||
@ -31,6 +39,9 @@ the :doc:`Howto broken bonds <Howto_bpm>` page for more information.
|
|||||||
The number of bonds will be zero for atoms not in the specified
|
The number of bonds will be zero for atoms not in the specified
|
||||||
compute group. This compute does not depend on Newton bond settings.
|
compute group. This compute does not depend on Newton bond settings.
|
||||||
|
|
||||||
|
If the keyword *bond/type* is specified, only bonds of *btype* are
|
||||||
|
counted.
|
||||||
|
|
||||||
Output info
|
Output info
|
||||||
"""""""""""
|
"""""""""""
|
||||||
|
|
||||||
|
|||||||
143
doc/src/compute_rheo_property_atom.rst
Normal file
143
doc/src/compute_rheo_property_atom.rst
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
.. index:: compute rheo/property/atom
|
||||||
|
|
||||||
|
compute rheo/property/atom command
|
||||||
|
==================================
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
compute ID group-ID rheo/property/atom input1 input2 ...
|
||||||
|
|
||||||
|
* ID, group-ID are documented in :doc:`compute <compute>` command
|
||||||
|
* rheo/property/atom = style name of this compute command
|
||||||
|
* input = one or more atom attributes
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
possible attributes = phase, surface, surface/r,
|
||||||
|
surface/divr, surface/n/a, coordination,
|
||||||
|
shift/v/a, energy, temperature, heatflow,
|
||||||
|
conductivity, cv, viscosity, pressure, rho,
|
||||||
|
grad/v/ab, stress/v/ab, stress/t/ab, nbond/shell
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
*phase* = atom phase state
|
||||||
|
*surface* = atom surface status
|
||||||
|
*surface/r* = atom distance from the surface
|
||||||
|
*surface/divr* = divergence of position at atom position
|
||||||
|
*surface/n/a* = a-component of surface normal vector
|
||||||
|
*coordination* = coordination number
|
||||||
|
*shift/v/a* = a-component of atom shifting velocity
|
||||||
|
*energy* = atom energy
|
||||||
|
*temperature* = atom temperature
|
||||||
|
*heatflow* = atom heat flow
|
||||||
|
*conductivity* = atom conductivity
|
||||||
|
*cv* = atom specific heat
|
||||||
|
*viscosity* = atom viscosity
|
||||||
|
*pressure* = atom pressure
|
||||||
|
*rho* = atom density
|
||||||
|
*grad/v/ab* = ab-component of atom velocity gradient tensor
|
||||||
|
*stress/v/ab* = ab-component of atom viscous stress tensor
|
||||||
|
*stress/t/ab* = ab-component of atom total stress tensor (pressure and viscous)
|
||||||
|
*nbond/shell* = number of oxide bonds
|
||||||
|
|
||||||
|
Examples
|
||||||
|
""""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
compute 1 all rheo/property/atom phase surface/r surface/n/* pressure
|
||||||
|
compute 2 all rheo/property/atom shift/v/x grad/v/xx stress/v/*
|
||||||
|
|
||||||
|
Description
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
Define a computation that stores atom attributes specific to the RHEO
|
||||||
|
package for each atom in the group. This is useful so that the values
|
||||||
|
can be used by other :doc:`output commands <Howto_output>` that take
|
||||||
|
computes as inputs. See for example, the
|
||||||
|
:doc:`compute reduce <compute_reduce>`,
|
||||||
|
:doc:`fix ave/atom <fix_ave_atom>`,
|
||||||
|
:doc:`fix ave/histo <fix_ave_histo>`,
|
||||||
|
:doc:`fix ave/chunk <fix_ave_chunk>`, and
|
||||||
|
:doc:`atom-style variable <variable>` commands.
|
||||||
|
|
||||||
|
For vector attributes, e.g. *shift/v/*:math:`\alpha`, one must specify
|
||||||
|
:math:`\alpha` as the *x*, *y*, or *z* component, e.g. *shift/v/x*.
|
||||||
|
Alternatively, a wild card \* will include all components, *x* and *y* in
|
||||||
|
2D or *x*, *y*, and *z* in 3D.
|
||||||
|
|
||||||
|
For tensor attributes, e.g. *grad/v/*:math:`\alpha \beta`, one must specify
|
||||||
|
both :math:`\alpha` and :math:`\beta` as *x*, *y*, or *z*, e.g. *grad/v/xy*.
|
||||||
|
Alternatively, a wild card \* will include all components. In 2D, this
|
||||||
|
includes *xx*, *xy*, *yx*, and *yy*. In 3D, this includes *xx*, *xy*, *xz*,
|
||||||
|
*yx*, *yy*, *yz*, *zx*, *zy*, and *zz*.
|
||||||
|
|
||||||
|
Many properties require their respective fixes, listed below in related
|
||||||
|
commands, be defined. For instance, the *viscosity* attribute is the
|
||||||
|
viscosity of a particle calculated by
|
||||||
|
:doc:`fix rheo/viscous <fix_rheo_viscosity>`. The meaning of less obvious
|
||||||
|
properties is described below.
|
||||||
|
|
||||||
|
The *phase* property indicates whether the particle is in a fluid state,
|
||||||
|
a value of 0, or a solid state, a value of 1.
|
||||||
|
|
||||||
|
The *surface* property indicates the surface designation produced by
|
||||||
|
the *interface/reconstruct* option of :doc:`fix rheo <fix_rheo>`. Bulk
|
||||||
|
particles have a value of 0, surface particles have a value of 1, and
|
||||||
|
splash particles have a value of 2. The *surface/r* property is the
|
||||||
|
distance from the surface, up to the kernel cutoff length. Surface particles
|
||||||
|
have a value of 0. The *surface/n/*:math:`\alpha` properties are the
|
||||||
|
components of the surface normal vector.
|
||||||
|
|
||||||
|
The *shift/v/*:math:`\alpha` properties are the components of the shifting
|
||||||
|
velocity produced by the *shift* option of :doc:`fix rheo <fix_rheo>`.
|
||||||
|
|
||||||
|
The *nbond/shell* property is the number of shell bonds that have been
|
||||||
|
activated from :doc:`bond style rheo/shell <bond_rheo_shell>`.
|
||||||
|
|
||||||
|
The values are stored in a per-atom vector or array as discussed
|
||||||
|
below. Zeroes are stored for atoms not in the specified group or for
|
||||||
|
quantities that are not defined for a particular particle in the group
|
||||||
|
|
||||||
|
Output info
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
This compute calculates a per-atom vector or per-atom array depending
|
||||||
|
on the number of input values. Generally, if a single input is specified,
|
||||||
|
a per-atom vector is produced. If two or more inputs are specified, a
|
||||||
|
per-atom array is produced where the number of columns = the number of
|
||||||
|
inputs. However, if a wild card \* is used for a vector or tensor, then
|
||||||
|
the number of inputs is considered to be incremented by the dimension or
|
||||||
|
the dimension squared, respectively. The vector or array can be accessed
|
||||||
|
by any command that uses per-atom values from a compute as input. See the
|
||||||
|
:doc:`Howto output <Howto_output>` page for an overview of LAMMPS output
|
||||||
|
options.
|
||||||
|
|
||||||
|
The vector or array values will be in whatever :doc:`units <units>` the
|
||||||
|
corresponding attribute is in (e.g., density units for *rho*).
|
||||||
|
|
||||||
|
Restrictions
|
||||||
|
""""""""""""
|
||||||
|
none
|
||||||
|
|
||||||
|
Related commands
|
||||||
|
""""""""""""""""
|
||||||
|
|
||||||
|
:doc:`dump custom <dump>`, :doc:`compute reduce <compute_reduce>`,
|
||||||
|
:doc:`fix ave/atom <fix_ave_atom>`, :doc:`fix ave/chunk <fix_ave_chunk>`,
|
||||||
|
:doc:`fix rheo/viscosity <fix_rheo_viscosity>`,
|
||||||
|
:doc:`fix rheo/pressure <fix_rheo_pressure>`,
|
||||||
|
:doc:`fix rheo/thermal <fix_rheo_thermal>`,
|
||||||
|
:doc:`fix rheo/oxdiation <fix_rheo_oxidation>`,
|
||||||
|
:doc:`fix rheo <fix_rheo>`
|
||||||
|
|
||||||
|
Default
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
none
|
||||||
@ -193,6 +193,7 @@ accelerated styles exist.
|
|||||||
* :doc:`adapt <fix_adapt>` - change a simulation parameter over time
|
* :doc:`adapt <fix_adapt>` - change a simulation parameter over time
|
||||||
* :doc:`adapt/fep <fix_adapt_fep>` - enhanced version of fix adapt
|
* :doc:`adapt/fep <fix_adapt_fep>` - enhanced version of fix adapt
|
||||||
* :doc:`addforce <fix_addforce>` - add a force to each atom
|
* :doc:`addforce <fix_addforce>` - add a force to each atom
|
||||||
|
* :doc:`add/heat <fix_add_heat>` - add a heat flux to each atom
|
||||||
* :doc:`addtorque <fix_addtorque>` - add a torque to a group of atoms
|
* :doc:`addtorque <fix_addtorque>` - add a torque to a group of atoms
|
||||||
* :doc:`alchemy <fix_alchemy>` - perform an "alchemical transformation" between two partitions
|
* :doc:`alchemy <fix_alchemy>` - perform an "alchemical transformation" between two partitions
|
||||||
* :doc:`amoeba/bitorsion <fix_amoeba_bitorsion>` - torsion/torsion terms in AMOEBA force field
|
* :doc:`amoeba/bitorsion <fix_amoeba_bitorsion>` - torsion/torsion terms in AMOEBA force field
|
||||||
@ -369,6 +370,11 @@ accelerated styles exist.
|
|||||||
* :doc:`reaxff/species <fix_reaxff_species>` - write out ReaxFF molecule information
|
* :doc:`reaxff/species <fix_reaxff_species>` - write out ReaxFF molecule information
|
||||||
* :doc:`recenter <fix_recenter>` - constrain the center-of-mass position of a group of atoms
|
* :doc:`recenter <fix_recenter>` - constrain the center-of-mass position of a group of atoms
|
||||||
* :doc:`restrain <fix_restrain>` - constrain a bond, angle, dihedral
|
* :doc:`restrain <fix_restrain>` - constrain a bond, angle, dihedral
|
||||||
|
* :doc:`rheo <fix_rheo>` - integrator for the RHEO package
|
||||||
|
* :doc:`rheo/thermal <fix_rheo_thermal>` - thermal integrator for the RHEO package
|
||||||
|
* :doc:`rheo/oxidation <fix_rheo_oxidation>` - create oxidation bonds for the RHEO package
|
||||||
|
* :doc:`rheo/pressure <fix_rheo_pressure>` - pressure calculation for the RHEO package
|
||||||
|
* :doc:`rheo/viscosity <fix_rheo_pressure>` - viscosity calculation for the RHEO package
|
||||||
* :doc:`rhok <fix_rhok>` - add bias potential for long-range ordered systems
|
* :doc:`rhok <fix_rhok>` - add bias potential for long-range ordered systems
|
||||||
* :doc:`rigid <fix_rigid>` - constrain one or more clusters of atoms to move as a rigid body with NVE integration
|
* :doc:`rigid <fix_rigid>` - constrain one or more clusters of atoms to move as a rigid body with NVE integration
|
||||||
* :doc:`rigid/meso <fix_rigid_meso>` - constrain clusters of mesoscopic SPH/SDPD particles to move as a rigid body
|
* :doc:`rigid/meso <fix_rigid_meso>` - constrain clusters of mesoscopic SPH/SDPD particles to move as a rigid body
|
||||||
|
|||||||
111
doc/src/fix_add_heat.rst
Normal file
111
doc/src/fix_add_heat.rst
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
.. index:: fix add/heat
|
||||||
|
|
||||||
|
fix add/heat command
|
||||||
|
====================
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
fix ID group-ID add/heat style args keyword values ...
|
||||||
|
|
||||||
|
* ID, group-ID are documented in :doc:`fix <fix>` command
|
||||||
|
* add/heat = style name of this fix command
|
||||||
|
* style = *constant* or *linear* or *quartic*
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
*constant* args = *rate*
|
||||||
|
*rate* = rate of heat flow (energy/time units)
|
||||||
|
*linear* args = :math:`T_{target}` *k*
|
||||||
|
:math:`T_{target}` = target temperature (temperature units)
|
||||||
|
*k* = prefactor (energy/(time*temperature) units)
|
||||||
|
*quartic* args = :math:`T_{target}` *k*
|
||||||
|
:math:`T_{target}` = target temperature (temperature units)
|
||||||
|
*k* = prefactor (energy/(time*temperature^4) units)
|
||||||
|
|
||||||
|
* zero or more keyword/value pairs may be appended to args
|
||||||
|
* keyword = *overwrite*
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
*overwrite* value = *yes* or *no*
|
||||||
|
*yes* = sets current heat flow of particle
|
||||||
|
*no* = adds to current heat flow of particle
|
||||||
|
|
||||||
|
Examples
|
||||||
|
""""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
fix 1 all add/heat constant v_heat
|
||||||
|
fix 1 all add/heat linear 10.0 1.0 overwrite yes
|
||||||
|
|
||||||
|
Description
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
This fix adds heat to particles with the temperature attribute every timestep.
|
||||||
|
Note that this is an internal temperature of a particle intended for use with
|
||||||
|
non-atomistic models like the discrete element method.
|
||||||
|
|
||||||
|
For the *constant* style, heat is added at the specified rate. For the *linear* style,
|
||||||
|
heat is added at a rate of :math:`k (T_{target} - T)` where :math:`k` is the
|
||||||
|
specified prefactor, :math:`T_{target}` is the specified target temperature, and
|
||||||
|
:math:`T` is the temperature of the atom. This may be more representative of a
|
||||||
|
conductive process. For the *quartic* style, heat is added at a rate of
|
||||||
|
:math:`k (T_{target}^4 - T^4)`, akin to radiative heat transfer.
|
||||||
|
|
||||||
|
The rate or temperature can be can be specified as an equal-style or atom-style
|
||||||
|
:doc:`variable <variable>`. If the value is a variable, it should be
|
||||||
|
specified as v_name, where name is the variable name. In this case, the
|
||||||
|
variable will be evaluated each time step, and its value will be used to
|
||||||
|
determine the rate of heat added.
|
||||||
|
|
||||||
|
Equal-style variables can specify formulas with various mathematical
|
||||||
|
functions and include :doc:`thermo_style <thermo_style>` command
|
||||||
|
keywords for the simulation box parameters, time step, and elapsed time
|
||||||
|
to specify time-dependent heating.
|
||||||
|
|
||||||
|
Atom-style variables can specify the same formulas as equal-style
|
||||||
|
variables but can also include per-atom values, such as atom
|
||||||
|
coordinates to specify spatially-dependent heating.
|
||||||
|
|
||||||
|
If the *overwrite* keyword is set to *yes*, this fix will set the total
|
||||||
|
heat flow on a particle every timestep, overwriting contributions from pair
|
||||||
|
styles or other fixes. If *overwrite* is *no*, this fix will add heat on
|
||||||
|
top of other contributions.
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
Restart, fix_modify, output, run start/stop, minimize info
|
||||||
|
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
No information about this fix is written to :doc:`binary restart files <restart>`.
|
||||||
|
None of the :doc:`fix_modify <fix_modify>` options are relevant to this fix.
|
||||||
|
No global or per-atom quantities are stored by this fix for access by various
|
||||||
|
:doc:`output commands <Howto_output>`. No parameter of this fix can be used
|
||||||
|
with the *start/stop* keywords of the :doc:`run <run>` command. This fix is
|
||||||
|
not invoked during :doc:`energy minimization <minimize>`.
|
||||||
|
|
||||||
|
Restrictions
|
||||||
|
""""""""""""
|
||||||
|
|
||||||
|
This pair style is part of the GRANULAR package. It is
|
||||||
|
only enabled if LAMMPS was built with that package.
|
||||||
|
See the :doc:`Build package <Build_package>` page for more info.
|
||||||
|
|
||||||
|
This fix requires that atoms store temperature and heat flow
|
||||||
|
as defined by the :doc:`fix property/atom <fix_property_atom>` command.
|
||||||
|
|
||||||
|
Related commands
|
||||||
|
""""""""""""""""
|
||||||
|
|
||||||
|
:doc:`fix heat/flow <fix_heat_flow>`,
|
||||||
|
:doc:`fix property/atom <fix_property_atom>`,
|
||||||
|
:doc:`fix rheo/thermal <fix_rheo_thermal>`
|
||||||
|
|
||||||
|
Default
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
The default for the *overwrite* keyword is *no*
|
||||||
@ -1,7 +1,7 @@
|
|||||||
.. index:: fix heat/flow
|
.. index:: fix heat/flow
|
||||||
|
|
||||||
fix heat/flow command
|
fix heat/flow command
|
||||||
==========================
|
=====================
|
||||||
|
|
||||||
Syntax
|
Syntax
|
||||||
""""""
|
""""""
|
||||||
@ -56,13 +56,19 @@ not invoked during :doc:`energy minimization <minimize>`.
|
|||||||
Restrictions
|
Restrictions
|
||||||
""""""""""""
|
""""""""""""
|
||||||
|
|
||||||
|
This pair style is part of the GRANULAR package. It is
|
||||||
|
only enabled if LAMMPS was built with that package.
|
||||||
|
See the :doc:`Build package <Build_package>` page for more info.
|
||||||
|
|
||||||
This fix requires that atoms store temperature and heat flow
|
This fix requires that atoms store temperature and heat flow
|
||||||
as defined by the :doc:`fix property/atom <fix_property_atom>` command.
|
as defined by the :doc:`fix property/atom <fix_property_atom>` command.
|
||||||
|
|
||||||
Related commands
|
Related commands
|
||||||
""""""""""""""""
|
""""""""""""""""
|
||||||
|
|
||||||
:doc:`pair granular <pair_granular>`, :doc:`fix property/atom <fix_property_atom>`
|
:doc:`pair granular <pair_granular>`,
|
||||||
|
:doc:`fix add/heat <fix_add_heat>`,
|
||||||
|
:doc:`fix property/atom <fix_property_atom>`
|
||||||
|
|
||||||
Default
|
Default
|
||||||
"""""""
|
"""""""
|
||||||
|
|||||||
180
doc/src/fix_rheo.rst
Normal file
180
doc/src/fix_rheo.rst
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
.. index:: fix rheo
|
||||||
|
|
||||||
|
fix rheo command
|
||||||
|
================
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
""""""
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
fix ID group-ID rheo cut kstyle zmin keyword values...
|
||||||
|
|
||||||
|
* ID, group-ID are documented in :doc:`fix <fix>` command
|
||||||
|
* rheo = style name of this fix command
|
||||||
|
* cut = cutoff for the kernel (distance)
|
||||||
|
* kstyle = *quintic* or *RK0* or *RK1* or *RK2*
|
||||||
|
* zmin = minimal number of neighbors for reproducing kernels
|
||||||
|
* zero or more keyword/value pairs may be appended to args
|
||||||
|
* keyword = *thermal* or *interface/reconstruct* or *surface/detection* or
|
||||||
|
*shift* or *rho/sum* or *density* or *self/mass* or *speed/sound*
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
*thermal* values = none, turns on thermal evolution
|
||||||
|
*interface/reconstruct* values = none, reconstructs interfaces with solid particles
|
||||||
|
*surface/detection* values = *sdstyle* *limit* *limit/splash*
|
||||||
|
*sdstyle* = *coordination* or *divergence*
|
||||||
|
*limit* = threshold for surface particles
|
||||||
|
*limit/splash* = threshold for splash particles
|
||||||
|
*shift* values = none, turns on velocity shifting
|
||||||
|
*rho/sum* values = none, uses the kernel to compute the density of particles
|
||||||
|
*self/mass* values = none, a particle uses its own mass in a rho summation
|
||||||
|
*density* values = *rho01*, ... *rho0N* (density)
|
||||||
|
*speed/sound* values = *cs0*, ... *csN* (velocity)
|
||||||
|
|
||||||
|
Examples
|
||||||
|
""""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
fix 1 all rheo 3.0 quintic 0 thermal density 0.1 0.1 speed/sound 10.0 1.0
|
||||||
|
fix 1 all rheo 3.0 RK1 10 shift surface/detection coordination 40
|
||||||
|
|
||||||
|
Description
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
Perform time integration for RHEO particles, updating positions, velocities,
|
||||||
|
and densities. For a detailed breakdown of the integration timestep and
|
||||||
|
numerical details, see :ref:`(Palermo) <rheo_palermo>`. For an
|
||||||
|
overview of other features available in the RHEO package, see
|
||||||
|
:doc:`the RHEO howto <Howto_rheo>`.
|
||||||
|
|
||||||
|
The type of kernel is specified using *kstyle* and the cutoff is *cut*. Four
|
||||||
|
kernels are currently available. The *quintic* kernel is a standard quintic
|
||||||
|
spline function commonly used in SPH. The other options, *RK0*, *RK1*, and
|
||||||
|
*RK2*, are zeroth, first, and second order reproducing. To generate a
|
||||||
|
reproducing kernel, a particle must have sufficient neighbors inside the
|
||||||
|
kernel cutoff distance (a coordination number) to accurately calculate
|
||||||
|
moments. This threshold is set by *zmin*. If reproducing kernels are
|
||||||
|
requested but a particle has fewer neighbors, then it will revert to a
|
||||||
|
non-reproducing quintic kernel until it gains more neighbors.
|
||||||
|
|
||||||
|
To model temperature evolution, one must specify the *thermal* keyword,
|
||||||
|
define a separate instance of :doc:`fix rheo/thermal <fix_rheo_thermal>`,
|
||||||
|
and use atom style rheo/thermal.
|
||||||
|
|
||||||
|
By default, the density of solid RHEO particles does not evolve and forces
|
||||||
|
with fluid particles are calculated using the current velocity of the solid
|
||||||
|
particle. If the *interface/reconstruct* keyword is used, then the density
|
||||||
|
and velocity of solid particles are alternatively reconstructed for every
|
||||||
|
fluid-solid interaction to ensure no-slip and pressure-balanced boundaries.
|
||||||
|
This is done by estimating the location of the fluid-solid interface and
|
||||||
|
extrapolating fluid particle properties across the interface to calculate a
|
||||||
|
temporary apparent density and velocity for a solid particle. The numerical
|
||||||
|
details are the same as those described in
|
||||||
|
:ref:`(Palermo) <howto_rheo_palermo>` except there is an additional
|
||||||
|
restriction that the reconstructed solid density cannot be less than the
|
||||||
|
equilibrium density. This prevents fluid particles from sticking to solid
|
||||||
|
surfaces.
|
||||||
|
|
||||||
|
A modified form of Fickian particle shifting can be enabled with the
|
||||||
|
*shift* keyword. This effectively shifts particle positions to generate a
|
||||||
|
more uniform spatial distribution. Shifting currently does not consider the
|
||||||
|
type of a particle and therefore may be inappropriate in systems consisting
|
||||||
|
of multiple fluid phases.
|
||||||
|
|
||||||
|
In systems with free surfaces, the *surface/detection* keyword can be used
|
||||||
|
to classify the location of particles as being within the bulk fluid, on a
|
||||||
|
free surface, or isolated from other particles in a splash or droplet.
|
||||||
|
Shifting is then disabled in the normal direction away from the free surface
|
||||||
|
to prevent particles from diffusing away. Surface detection can also be used
|
||||||
|
to control surface-nucleated effects like oxidation when used in combination
|
||||||
|
with :doc:`fix rheo/oxidation <fix_rheo_oxidation>`. Surface detection is not
|
||||||
|
performed on solid bodies.
|
||||||
|
|
||||||
|
The *surface/detection* keyword takes three arguments: *sdstyle*, *limit*,
|
||||||
|
and *limit/splash*. The first, *sdstyle*, specifies whether surface particles
|
||||||
|
are identified using a coordination number (*coordination*) or the divergence
|
||||||
|
of the local particle positions (*divergence*). The threshold value for a
|
||||||
|
surface particle for either of these criteria is set by the numerical value
|
||||||
|
of *limit*. Additionally, if a particle's coordination number is too low,
|
||||||
|
i.e. if it has separated off from the bulk in a droplet, it is not possible
|
||||||
|
to define surfaces and the particle is classified as a splash. The coordination
|
||||||
|
threshold for this classification is set by the numerical value of
|
||||||
|
*limit/splash*.
|
||||||
|
|
||||||
|
By default, RHEO integrates particles' densities using a mass diffusion
|
||||||
|
equation. Alternatively, one can update densities every timestep by performing
|
||||||
|
a kernel summation of the masses of neighboring particles by specifying the *rho/sum*
|
||||||
|
keyword.
|
||||||
|
|
||||||
|
The *self/mass* keyword modifies the behavior of the density summation in *rho/sum*.
|
||||||
|
Typically, the density :math:`\rho` of a particle is calculated as the sum over neighbors
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
\rho_i = \sum_{j} W_{ij} M_j
|
||||||
|
|
||||||
|
where :math:`W_{ij}` is the kernel, and :math:`M_j` is the mass of particle :math:`j`.
|
||||||
|
The *self/mass* keyword augments this expression by replacing :math:`M_j` with
|
||||||
|
:math:`M_i`. This may be useful in simulations of multiple fluid phases with large
|
||||||
|
differences in density, :ref:`(Hu) <fix_rheo_hu>`.
|
||||||
|
|
||||||
|
The *density* keyword is used to specify the equilibrium density of each of the N
|
||||||
|
particle types. It must be followed by N numerical values specifying each type's
|
||||||
|
equilibrium density *rho0*.
|
||||||
|
|
||||||
|
The *speed/sound* keyword is used to specify the speed of sound of each of the
|
||||||
|
N particle types. It must be followed by N numerical values specifying each type's
|
||||||
|
speed of sound *cs*.
|
||||||
|
|
||||||
|
Restart, fix_modify, output, run start/stop, minimize info
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
No information about this fix is written to :doc:`binary restart files <restart>`.
|
||||||
|
None of the :doc:`fix_modify <fix_modify>` options
|
||||||
|
are relevant to this fix. No global or per-atom quantities are stored
|
||||||
|
by this fix for access by various :doc:`output commands <Howto_output>`.
|
||||||
|
No parameter of this fix can be used with the *start/stop* keywords of
|
||||||
|
the :doc:`run <run>` command. This fix is not invoked during
|
||||||
|
:doc:`energy minimization <minimize>`.
|
||||||
|
|
||||||
|
Restrictions
|
||||||
|
""""""""""""
|
||||||
|
|
||||||
|
This fix must be used with atom style rheo or rheo/thermal. This fix must
|
||||||
|
be used in conjunction with :doc:`fix rheo/pressure <fix_rheo_pressure>`.
|
||||||
|
and :doc:`fix rheo/viscosity <fix_rheo_viscosity>`. If the *thermal* setting
|
||||||
|
is used, there must also be an instance of
|
||||||
|
:doc:`fix rheo/thermal <fix_rheo_thermal>`. The fix group must be set to all.
|
||||||
|
Only one instance of fix rheo may be defined and it must be defined prior
|
||||||
|
to all other RHEO fixes in the input script.
|
||||||
|
|
||||||
|
This fix is part of the RHEO package. It is only enabled if LAMMPS was built
|
||||||
|
with that package. See the :doc:`Build package <Build_package>` page for more info.
|
||||||
|
|
||||||
|
Related commands
|
||||||
|
""""""""""""""""
|
||||||
|
|
||||||
|
:doc:`fix rheo/viscosity <fix_rheo_viscosity>`,
|
||||||
|
:doc:`fix rheo/pressure <fix_rheo_pressure>`,
|
||||||
|
:doc:`fix rheo/thermal <fix_rheo_thermal>`,
|
||||||
|
:doc:`pair rheo <pair_rheo>`,
|
||||||
|
:doc:`compute rheo/property/atom <compute_rheo_property_atom>`
|
||||||
|
|
||||||
|
Default
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
*rho0* and *cs* are set to 1.0 for all atom types.
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. _rheo_palermo:
|
||||||
|
|
||||||
|
**(Palermo)** Palermo, Wolf, Clemmer, O'Connor, in preparation.
|
||||||
|
|
||||||
|
.. _fix_rheo_hu:
|
||||||
|
|
||||||
|
**(Hu)** Hu, and Adams J. Comp. Physics, 213, 844-861 (2006).
|
||||||
85
doc/src/fix_rheo_oxidation.rst
Normal file
85
doc/src/fix_rheo_oxidation.rst
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
.. index:: fix rheo/oxidation
|
||||||
|
|
||||||
|
fix rheo/oxidation command
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
""""""
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
fix ID group-ID rheo/oxidation cut btype rsurf
|
||||||
|
|
||||||
|
* ID, group-ID are documented in :doc:`fix <fix>` command
|
||||||
|
* rheo/oxidation = style name of this fix command
|
||||||
|
* cut = maximum bond length (distance units)
|
||||||
|
* btype = type of bonds created
|
||||||
|
* rsurf = distance from surface to create bonds (distance units)
|
||||||
|
|
||||||
|
Examples
|
||||||
|
""""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
fix 1 all rheo/oxidation 1.5 2 0.0
|
||||||
|
fix 1 all rheo/oxidation 1.0 1 2.0
|
||||||
|
|
||||||
|
Description
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
This fix dynamically creates bonds on the surface of fluids to
|
||||||
|
represent physical processes such as oxidation. It is intended
|
||||||
|
for use with bond style :doc:`bond rheo/shell <bond_rheo_shell>`.
|
||||||
|
|
||||||
|
Every timestep, particles check neighbors within a distance of *cut*.
|
||||||
|
This distance must be smaller than the kernel length defined in
|
||||||
|
:doc:`fix rheo <fix_rheo>`. Bonds of type *btype* are created between
|
||||||
|
a fluid particle and either a fluid or solid neighbor. The fluid particles
|
||||||
|
must also be on the fluid surface, or within a distance of *rsurf* from
|
||||||
|
the surface. This process is further described in
|
||||||
|
:ref:`(Clemmer) <howto_rheo_clemmer2>`.
|
||||||
|
|
||||||
|
If used in conjunction with solid bodies, such as those generated
|
||||||
|
by the *react* option of :doc:`fix rheo/thermal <fix_rheo_thermal>`,
|
||||||
|
it is recommended to use a :doc:`hybrid bond style <bond_hybrid>`
|
||||||
|
with different bond types for solid and oxide bonds.
|
||||||
|
|
||||||
|
Restart, fix_modify, output, run start/stop, minimize info
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
No information about this fix is written to :doc:`binary restart files <restart>`.
|
||||||
|
None of the :doc:`fix_modify <fix_modify>` options
|
||||||
|
are relevant to this fix. No global or per-atom quantities are stored
|
||||||
|
by this fix for access by various :doc:`output commands <Howto_output>`.
|
||||||
|
No parameter of this fix can be used with the *start/stop* keywords of
|
||||||
|
the :doc:`run <run>` command. This fix is not invoked during :doc:`energy minimization <minimize>`.
|
||||||
|
|
||||||
|
Restrictions
|
||||||
|
""""""""""""
|
||||||
|
|
||||||
|
This fix must be used with the bond style :doc:`rheo/shell <bond_rheo_shell>`
|
||||||
|
and :doc:`fix rheo <fix_rheo>` with surface detection enabled.
|
||||||
|
|
||||||
|
This fix is part of the RHEO package. It is only enabled if
|
||||||
|
LAMMPS was built with that package. See the :doc:`Build package <Build_package>`
|
||||||
|
page for more info.
|
||||||
|
|
||||||
|
Related commands
|
||||||
|
""""""""""""""""
|
||||||
|
|
||||||
|
:doc:`fix rheo <fix_rheo>`,
|
||||||
|
:doc:`bond rheo/shell <bond_rheo_shell>`,
|
||||||
|
:doc:`compute rheo/property/atom <compute_rheo_property_atom>`
|
||||||
|
|
||||||
|
Default
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
none
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. _howto_rheo_clemmer2:
|
||||||
|
|
||||||
|
**(Clemmer)** Clemmer, Pierce, O'Connor, Nevins, Jones, Lechman, Tencer, Appl. Math. Model., 130, 310-326 (2024).
|
||||||
106
doc/src/fix_rheo_pressure.rst
Normal file
106
doc/src/fix_rheo_pressure.rst
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
.. index:: fix rheo/pressure
|
||||||
|
|
||||||
|
fix rheo/pressure command
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
""""""
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
fix ID group-ID rheo/pressure type1 pstyle1 args1 ... typeN pstyleN argsN
|
||||||
|
|
||||||
|
* ID, group-ID are documented in :doc:`fix <fix>` command
|
||||||
|
* rheo/pressure = style name of this fix command
|
||||||
|
* one or more types and pressure styles must be appended
|
||||||
|
* types = lists of types (see below)
|
||||||
|
* pstyle = *linear* or *taitwater* or *cubic*
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
*linear* args = none
|
||||||
|
*taitwater* args = none
|
||||||
|
*cubic* args = cubic prefactor :math:`A_3` (pressure/density\^2)
|
||||||
|
|
||||||
|
Examples
|
||||||
|
""""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
fix 1 all rheo/pressure * linear
|
||||||
|
fix 1 all rheo/pressure 1 linear 2 cubic 10.0
|
||||||
|
|
||||||
|
Description
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
This fix defines a pressure equation of state for RHEO particles. One can
|
||||||
|
define different equations of state for different atom types. An equation
|
||||||
|
must be specified for every atom type.
|
||||||
|
|
||||||
|
One first defines the atom *types*. A wild-card asterisk can be used in place
|
||||||
|
of or in conjunction with the *types* argument to set the coefficients for
|
||||||
|
multiple pairs of atom types. This takes the form "\*" or "\*n" or "m\*"
|
||||||
|
or "m\*n". If :math:`N` is the number of atom types, then an asterisk with
|
||||||
|
no numeric values means all types from 1 to :math:`N`. A leading asterisk
|
||||||
|
means all types from 1 to n (inclusive). A trailing asterisk means all types
|
||||||
|
from m to :math:`N` (inclusive). A middle asterisk means all types from m to n
|
||||||
|
(inclusive).
|
||||||
|
|
||||||
|
The *types* definition is followed by the pressure style, *pstyle*. Current
|
||||||
|
options *linear*, *taitwater*, and *cubic*. Style *linear* is a linear
|
||||||
|
equation of state with a particle pressure :math:`P` calculated as
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
P = c (\rho - \rho_0)
|
||||||
|
|
||||||
|
where :math:`c` is the speed of sound, :math:`\rho_0` is the equilibrium density,
|
||||||
|
and :math:`\rho` is the current density of a particle. The numerical values of
|
||||||
|
:math:`c` and :math:`\rho_0` are set in :doc:`fix rheo <fix_rheo>`. Style *cubic*
|
||||||
|
is a cubic equation of state which has an extra argument :math:`A_3`,
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
P = c ((\rho - \rho_0) + A_3 (\rho - \rho_0)^3) .
|
||||||
|
|
||||||
|
Style *taitwater* is Tait's equation of state:
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
P = \frac{c^2 \rho_0}{7} \biggl[\left(\frac{\rho}{\rho_0}\right)^{7} - 1\biggr].
|
||||||
|
|
||||||
|
Restart, fix_modify, output, run start/stop, minimize info
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
No information about this fix is written to :doc:`binary restart files <restart>`.
|
||||||
|
None of the :doc:`fix_modify <fix_modify>` options
|
||||||
|
are relevant to this fix. No global or per-atom quantities are stored
|
||||||
|
by this fix for access by various :doc:`output commands <Howto_output>`.
|
||||||
|
No parameter of this fix can be used with the *start/stop* keywords of
|
||||||
|
the :doc:`run <run>` command. This fix is not invoked during :doc:`energy minimization <minimize>`.
|
||||||
|
|
||||||
|
Restrictions
|
||||||
|
""""""""""""
|
||||||
|
|
||||||
|
This fix must be used with an atom style that includes density
|
||||||
|
such as atom_style rheo or rheo/thermal. This fix must be used in
|
||||||
|
conjunction with :doc:`fix rheo <fix_rheo>`. The fix group must be
|
||||||
|
set to all. Only one instance of fix rheo/pressure can be defined.
|
||||||
|
|
||||||
|
This fix is part of the RHEO package. It is only enabled if
|
||||||
|
LAMMPS was built with that package. See the :doc:`Build package <Build_package>`
|
||||||
|
page for more info.
|
||||||
|
|
||||||
|
Related commands
|
||||||
|
""""""""""""""""
|
||||||
|
|
||||||
|
:doc:`fix rheo <fix_rheo>`,
|
||||||
|
:doc:`pair rheo <pair_rheo>`,
|
||||||
|
:doc:`compute rheo/property/atom <compute_rheo_property_atom>`
|
||||||
|
|
||||||
|
Default
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
none
|
||||||
128
doc/src/fix_rheo_thermal.rst
Normal file
128
doc/src/fix_rheo_thermal.rst
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
.. index:: fix rheo/thermal
|
||||||
|
|
||||||
|
fix rheo/thermal command
|
||||||
|
========================
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
""""""
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
fix ID group-ID rheo/thermal attribute values ...
|
||||||
|
|
||||||
|
* ID, group-ID are documented in :doc:`fix <fix>` command
|
||||||
|
* rheo/thermal = style name of this fix command
|
||||||
|
* one or more attributes may be appended
|
||||||
|
* attribute = *conductivity* or *specific/heat* or *latent/heat* or *Tfreeze* or *react*
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
*conductivity* args = types style args
|
||||||
|
types = lists of types (see below)
|
||||||
|
style = *constant*
|
||||||
|
*constant* arg = conductivity (power/temperature)
|
||||||
|
*specific/heat* args = types style args
|
||||||
|
types = lists of types (see below)
|
||||||
|
style = *constant*
|
||||||
|
*constant* arg = specific heat (energy/(mass*temperature))
|
||||||
|
*latent/heat* args = types style args
|
||||||
|
types = lists of types (see below)
|
||||||
|
style = *constant*
|
||||||
|
*constant* arg = latent heat (energy/mass)
|
||||||
|
*Tfreeze* args = types style args
|
||||||
|
types = lists of types (see below)
|
||||||
|
style = *constant*
|
||||||
|
*constant* arg = freezing temperature (temperature)
|
||||||
|
*react* args = cut type
|
||||||
|
cut = maximum bond distance
|
||||||
|
type = bond type
|
||||||
|
|
||||||
|
Examples
|
||||||
|
""""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
fix 1 all rheo/thermal conductivity * constant 1.0 specific/heat * constant 1.0 Tfreeze * constant 1.0
|
||||||
|
fix 1 all rheo/pressure conductivity 1*2 constant 1.0 conductivity 3*4 constant 2.0 specific/heat * constant 1.0
|
||||||
|
|
||||||
|
Description
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
This fix performs time integration of temperature for atom style rheo/thermal.
|
||||||
|
In addition, it defines multiple thermal properties of particles and handles
|
||||||
|
melting/solidification, if applicable. For more details on phase transitions
|
||||||
|
in RHEO, see :doc:`the RHEO howto <Howto_rheo>`.
|
||||||
|
|
||||||
|
Note that the temperature of a particle is always derived from the energy.
|
||||||
|
This implies the *temperature* attribute of :doc:`the set command <set>` does
|
||||||
|
not affect particles. Instead, one should use the *sph/e* attribute.
|
||||||
|
|
||||||
|
For each atom type, one can define expressions for the *conductivity*,
|
||||||
|
*specific/heat*, *latent/heat*, and critical temperature (*Tfreeze*).
|
||||||
|
The conductivity and specific heat must be defined for all atom types.
|
||||||
|
The latent heat and critical temperature are optional. However, a
|
||||||
|
critical temperature must be defined to specify a latent heat.
|
||||||
|
|
||||||
|
Note, if shifting is turned on in :doc:`fix rheo <fix_rheo>`, the gradient
|
||||||
|
of the energy is used to shift energies. This may be inappropriate in systems
|
||||||
|
with multiple atom types with different specific heats.
|
||||||
|
|
||||||
|
For each property, one must first define a list of atom types. A wild-card
|
||||||
|
asterisk can be used in place of or in conjunction with the *types* argument
|
||||||
|
to set the coefficients for multiple pairs of atom types. This takes the
|
||||||
|
form "\*" or "\*n" or "m\*" or "m\*n". If :math:`N` is the number of atom
|
||||||
|
types, then an asterisk with no numeric values means all types from 1 to
|
||||||
|
:math:`N`. A leading asterisk means all types from 1 to n (inclusive).
|
||||||
|
A trailing asterisk means all types from m to :math:`N` (inclusive). A
|
||||||
|
middle asterisk means all types from m to n (inclusive).
|
||||||
|
|
||||||
|
The *types* definition for each property is followed by the style. Currently,
|
||||||
|
the only option is *constant*. Style *constant* simply applies a constant value
|
||||||
|
of respective property to each particle of the assigned type.
|
||||||
|
|
||||||
|
The *react* keyword controls whether bonds are created/deleted when particles
|
||||||
|
transition between a fluid and solid state. This option only applies to atom
|
||||||
|
types that have a defined value of *Tfreeze*. When a fluid particle's
|
||||||
|
temperature drops below *Tfreeze*, bonds of type *btype* are created between
|
||||||
|
nearby solid particles within a distance of *cut*. The particle's status also
|
||||||
|
swaps to a solid state. When a solid particle's temperature rises above
|
||||||
|
*Tfreeze*, all bonds of type *btype* are broken and the particle's status swaps
|
||||||
|
to a fluid state.
|
||||||
|
|
||||||
|
Restart, fix_modify, output, run start/stop, minimize info
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
No information about this fix is written to :doc:`binary restart files <restart>`.
|
||||||
|
None of the :doc:`fix_modify <fix_modify>` options
|
||||||
|
are relevant to this fix. No global or per-atom quantities are stored
|
||||||
|
by this fix for access by various :doc:`output commands <Howto_output>`.
|
||||||
|
No parameter of this fix can be used with the *start/stop* keywords of
|
||||||
|
the :doc:`run <run>` command. This fix is not invoked during :doc:`energy minimization <minimize>`.
|
||||||
|
|
||||||
|
Restrictions
|
||||||
|
""""""""""""
|
||||||
|
|
||||||
|
This fix must be used with an atom style that includes temperature,
|
||||||
|
heatflow, and conductivity such as atom_style rheo/thermal This fix
|
||||||
|
must be used in conjunction with :doc:`fix rheo <fix_rheo>` with the
|
||||||
|
*thermal* setting. The fix group must be set to all. Only one
|
||||||
|
instance of fix rheo/pressure can be defined.
|
||||||
|
|
||||||
|
This fix is part of the RHEO package. It is only enabled if
|
||||||
|
LAMMPS was built with that package. See the :doc:`Build package <Build_package>`
|
||||||
|
page for more info.
|
||||||
|
|
||||||
|
Related commands
|
||||||
|
""""""""""""""""
|
||||||
|
|
||||||
|
:doc:`fix rheo <fix_rheo>`,
|
||||||
|
:doc:`pair rheo <pair_rheo>`,
|
||||||
|
:doc:`compute rheo/property/atom <compute_rheo_property_atom>`,
|
||||||
|
:doc:`fix add/heat <fix_add_heat>`
|
||||||
|
|
||||||
|
Default
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
none
|
||||||
117
doc/src/fix_rheo_viscosity.rst
Normal file
117
doc/src/fix_rheo_viscosity.rst
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
.. index:: fix rheo/viscosity
|
||||||
|
|
||||||
|
fix rheo/viscosity command
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
""""""
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
fix ID group-ID rheo/viscosity type1 pstyle1 args1 ... typeN pstyleN argsN
|
||||||
|
|
||||||
|
* ID, group-ID are documented in :doc:`fix <fix>` command
|
||||||
|
* rheo/viscosity = style name of this fix command
|
||||||
|
* one or more types and viscosity styles must be appended
|
||||||
|
* types = lists of types (see below)
|
||||||
|
* vstyle = *constant* or *power*
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
*constant* args = *eta*
|
||||||
|
*eta* = viscosity
|
||||||
|
|
||||||
|
*power* args = *eta*, *gd0*, *K*, *n*
|
||||||
|
*eta* = viscosity
|
||||||
|
*gd0* = critical strain rate
|
||||||
|
*K* = consistency index
|
||||||
|
*n* = power-law exponent
|
||||||
|
|
||||||
|
Examples
|
||||||
|
""""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
fix 1 all rheo/viscosity * constant 1.0
|
||||||
|
fix 1 all rheo/viscosity 1 constant 1.0 2 power 0.1 5e-4 0.001 0.5
|
||||||
|
|
||||||
|
Description
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
This fix defines a viscosity for RHEO particles. One can define different
|
||||||
|
viscosities for different atom types, but a viscosity must be specified for
|
||||||
|
every atom type.
|
||||||
|
|
||||||
|
One first defines the atom *types*. A wild-card asterisk can be used in place
|
||||||
|
of or in conjunction with the *types* argument to set the coefficients for
|
||||||
|
multiple pairs of atom types. This takes the form "\*" or "\*n" or "m\*"
|
||||||
|
or "m\*n". If :math:`N` is the number of atom types, then an asterisk with
|
||||||
|
no numeric values means all types from 1 to :math:`N`. A leading asterisk
|
||||||
|
means all types from 1 to n (inclusive). A trailing asterisk means all types
|
||||||
|
from m to :math:`N` (inclusive). A middle asterisk means all types from m to n
|
||||||
|
(inclusive).
|
||||||
|
|
||||||
|
The *types* definition is followed by the viscosity style, *vstyle*. Two
|
||||||
|
options are available, *constant* and *power*. Style *constant* simply
|
||||||
|
applies a constant value of the viscosity *eta* to each particle of the
|
||||||
|
assigned type. Style *power* is a Hershchel-Bulkley constitutive equation
|
||||||
|
for the stress :math:`\tau`
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
\tau = \left(\frac{\tau_0}{\dot{\gamma}} + K \dot{\gamma}^{n - 1}\right) \dot{\gamma}, \tau \ge \tau_0
|
||||||
|
|
||||||
|
where :math:`\dot{\gamma}` is the strain rate and :math:`\tau_0` is the critical
|
||||||
|
yield stress, below which :math:`\dot{\gamma} = 0.0`. To avoid divergences, this
|
||||||
|
expression is regularized by defining a critical strain rate *gd0*. If the local
|
||||||
|
strain rate on a particle falls below this limit, a constant viscosity of *eta*
|
||||||
|
is assigned. This implies a value of
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
\tau_0 = \eta \dot{\gamma}_0 - K \dot{\gamma}_0^N
|
||||||
|
|
||||||
|
as further discussed in :ref:`(Palermo) <rheo_palermo2>`.
|
||||||
|
|
||||||
|
|
||||||
|
Restart, fix_modify, output, run start/stop, minimize info
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
No information about this fix is written to :doc:`binary restart files <restart>`.
|
||||||
|
None of the :doc:`fix_modify <fix_modify>` options
|
||||||
|
are relevant to this fix. No global or per-atom quantities are stored
|
||||||
|
by this fix for access by various :doc:`output commands <Howto_output>`.
|
||||||
|
No parameter of this fix can be used with the *start/stop* keywords of
|
||||||
|
the :doc:`run <run>` command. This fix is not invoked during
|
||||||
|
:doc:`energy minimization <minimize>`.
|
||||||
|
|
||||||
|
Restrictions
|
||||||
|
""""""""""""
|
||||||
|
|
||||||
|
This fix must be used with an atom style that includes viscosity
|
||||||
|
such as atom_style rheo or rheo/thermal. This fix must be used in
|
||||||
|
conjunction with :doc:`fix rheo <fix_rheo>`. The fix group must be
|
||||||
|
set to all. Only one instance of fix rheo/viscosity can be defined.
|
||||||
|
|
||||||
|
This fix is part of the RHEO package. It is only enabled if
|
||||||
|
LAMMPS was built with that package. See the
|
||||||
|
:doc:`Build package <Build_package>` page for more info.
|
||||||
|
|
||||||
|
Related commands
|
||||||
|
""""""""""""""""
|
||||||
|
|
||||||
|
:doc:`fix rheo <fix_rheo>`,
|
||||||
|
:doc:`pair rheo <pair_rheo>`,
|
||||||
|
:doc:`compute rheo/property/atom <compute_rheo_property_atom>`
|
||||||
|
|
||||||
|
Default
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
none
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. _rheo_palermo2:
|
||||||
|
|
||||||
|
**(Palermo)** Palermo, Wolf, Clemmer, O'Connor, in preparation.
|
||||||
102
doc/src/pair_rheo.rst
Normal file
102
doc/src/pair_rheo.rst
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
.. index:: pair_style rheo
|
||||||
|
|
||||||
|
pair_style rheo command
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
pair_style rheo cutoff keyword values
|
||||||
|
|
||||||
|
* cutoff = global cutoff for kernel (distance units)
|
||||||
|
* zero or more keyword/value pairs may be appended to args
|
||||||
|
* keyword = *rho/damp* or *artificial/visc* or *harmonic/means*
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
*rho/damp* args = density damping prefactor :math:`\xi`
|
||||||
|
*artificial/visc* args = artificial viscosity prefactor :math:`\zeta`
|
||||||
|
*harmonic/means* args = none
|
||||||
|
|
||||||
|
Examples
|
||||||
|
""""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
pair_style rheo 3.0 rho/damp 1.0 artificial/visc 2.0
|
||||||
|
pair_coeff * *
|
||||||
|
|
||||||
|
Description
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
Pair style *rheo* computes pressure and viscous forces between particles
|
||||||
|
in the :doc:`rheo package <Howto_rheo>`. If thermal evolution is turned
|
||||||
|
on in :doc:`fix rheo <fix_rheo>`, then the pair style also calculates
|
||||||
|
heat exchanged between particles.
|
||||||
|
|
||||||
|
The *artificial/viscosity* keyword is used to specify the magnitude
|
||||||
|
:math:`\zeta` of an optional artificial viscosity contribution to forces.
|
||||||
|
This factor can help stabilize simulations by smoothing out small length
|
||||||
|
scale variations in velocity fields. Artificial viscous forces typically
|
||||||
|
are only exchanged by fluid particles. However, if interfaces are not
|
||||||
|
reconstructed in fix rheo, fluid particles will also exchange artificial
|
||||||
|
viscous forces with solid particles to improve stability.
|
||||||
|
|
||||||
|
The *rho/damp* keyword is used to specify the magnitude :math:`\xi` of
|
||||||
|
an optional pairwise damping term between the density of particles. This
|
||||||
|
factor can help stabilize simulations by smoothing out small length
|
||||||
|
scale variations in density fields. However, in systems that develop
|
||||||
|
a density gradient in equilibrium (e.g. in a hydrostatic column underlying
|
||||||
|
gravity), this option may be inappropriate.
|
||||||
|
|
||||||
|
If particles have different viscosities or conductivities, the
|
||||||
|
*harmonic/means* keyword changes how they are averaged before calculating
|
||||||
|
pairwise forces or heat exchanges. By default, an arithmetic averaged is
|
||||||
|
used, however, a harmonic mean may improve stability in systems with multiple
|
||||||
|
fluid phases with large disparities in viscosities.
|
||||||
|
|
||||||
|
No coefficients are defined for each pair of atoms types via the
|
||||||
|
:doc:`pair_coeff <pair_coeff>` command as in the examples
|
||||||
|
above.
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
Mixing, shift, table, tail correction, restart, rRESPA info
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
This style does not support the :doc:`pair_modify <pair_modify>`
|
||||||
|
shift, table, and tail options.
|
||||||
|
|
||||||
|
This style does not write information to :doc:`binary restart files <restart>`.
|
||||||
|
Thus, you need to re-specify the pair_style and pair_coeff commands in an input
|
||||||
|
script that reads a restart file.
|
||||||
|
|
||||||
|
This style can only be used via the *pair* keyword of the
|
||||||
|
:doc:`run_style respa <run_style>` command. It does not support the *inner*,
|
||||||
|
*middle*, *outer* keywords.
|
||||||
|
|
||||||
|
Restrictions
|
||||||
|
""""""""""""
|
||||||
|
|
||||||
|
This fix is part of the RHEO package. It is only enabled if
|
||||||
|
LAMMPS was built with that package. See the
|
||||||
|
:doc:`Build package <Build_package>` page for more info.
|
||||||
|
|
||||||
|
Related commands
|
||||||
|
""""""""""""""""
|
||||||
|
|
||||||
|
:doc:`fix rheo <fix_rheo>`,
|
||||||
|
:doc:`fix rheo/pressure <fix_rheo_pressure>`,
|
||||||
|
:doc:`fix rheo/thermal <fix_rheo_thermal>`,
|
||||||
|
:doc:`fix rheo/viscosity <fix_rheo_viscosity>`,
|
||||||
|
:doc:`compute rheo/property/atom <compute_rheo_property_atom>`
|
||||||
|
|
||||||
|
Default
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
Density damping and artificial viscous forces are not calculated.
|
||||||
|
Arithmetic means are used for mixing particle properties.
|
||||||
112
doc/src/pair_rheo_solid.rst
Normal file
112
doc/src/pair_rheo_solid.rst
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
.. index:: pair_style rheo/solid
|
||||||
|
|
||||||
|
pair_style rheo/solid command
|
||||||
|
=============================
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
pair_style rheo/solid
|
||||||
|
|
||||||
|
Examples
|
||||||
|
""""""""
|
||||||
|
|
||||||
|
.. code-block:: LAMMPS
|
||||||
|
|
||||||
|
pair_style rheo/solid
|
||||||
|
pair_coeff * * 1.0 1.5 1.0
|
||||||
|
|
||||||
|
Description
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
Style *rheo/solid* is effectively a copy of pair style
|
||||||
|
:doc:`bpm/spring <pair_bpm_spring>` except it only applies forces
|
||||||
|
between solid RHEO particles, determined by checking the status of
|
||||||
|
each pair of neighboring particles before calculating forces.
|
||||||
|
|
||||||
|
The style computes pairwise forces with the formula
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
F = k (r - r_c)
|
||||||
|
|
||||||
|
where :math:`k` is a stiffness and :math:`r_c` is the cutoff length.
|
||||||
|
An additional damping force is also applied to interacting
|
||||||
|
particles. The force is proportional to the difference in the
|
||||||
|
normal velocity of particles
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
F_D = - \gamma w (\hat{r} \bullet \vec{v})
|
||||||
|
|
||||||
|
where :math:`\gamma` is the damping strength, :math:`\hat{r}` is the
|
||||||
|
displacement normal vector, :math:`\vec{v}` is the velocity difference
|
||||||
|
between the two particles, and :math:`w` is a smoothing factor.
|
||||||
|
This smoothing factor is constructed such that damping forces go to zero
|
||||||
|
as particles come out of contact to avoid discontinuities. It is
|
||||||
|
given by
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
w = 1.0 - \left( \frac{r}{r_c} \right)^8 .
|
||||||
|
|
||||||
|
The following coefficients must be defined for each pair of atom types
|
||||||
|
via the :doc:`pair_coeff <pair_coeff>` command as in the examples
|
||||||
|
above, or in the data file or restart files read by the
|
||||||
|
:doc:`read_data <read_data>` or :doc:`read_restart <read_restart>`
|
||||||
|
commands, or by mixing as described below:
|
||||||
|
|
||||||
|
* :math:`k` (force/distance units)
|
||||||
|
* :math:`r_c` (distance units)
|
||||||
|
* :math:`\gamma` (force/velocity units)
|
||||||
|
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
Mixing, shift, table, tail correction, restart, rRESPA info
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
For atom type pairs I,J and I != J, the A coefficient and cutoff
|
||||||
|
distance for this pair style can be mixed. A is always mixed via a
|
||||||
|
*geometric* rule. The cutoff is mixed according to the pair_modify
|
||||||
|
mix value. The default mix value is *geometric*\ . See the
|
||||||
|
"pair_modify" command for details.
|
||||||
|
|
||||||
|
This pair style does not support the :doc:`pair_modify <pair_modify>`
|
||||||
|
shift option, since the pair interaction goes to 0.0 at the cutoff.
|
||||||
|
|
||||||
|
The :doc:`pair_modify <pair_modify>` table and tail options are not
|
||||||
|
relevant for this pair style.
|
||||||
|
|
||||||
|
This pair style writes its information to :doc:`binary restart files
|
||||||
|
<restart>`, so pair_style and pair_coeff commands do not need to be
|
||||||
|
specified in an input script that reads a restart file.
|
||||||
|
|
||||||
|
This pair style can only be used via the *pair* keyword of the
|
||||||
|
:doc:`run_style respa <run_style>` command. It does not support the
|
||||||
|
*inner*, *middle*, *outer* keywords.
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
Restrictions
|
||||||
|
""""""""""""
|
||||||
|
|
||||||
|
This pair style is part of the RHEO package. It is only enabled if
|
||||||
|
LAMMPS was built with that package. See the :doc:`Build package
|
||||||
|
<Build_package>` page for more info.
|
||||||
|
|
||||||
|
Related commands
|
||||||
|
""""""""""""""""
|
||||||
|
|
||||||
|
:doc:`fix rheo <fix_rheo>`,
|
||||||
|
:doc:`fix rheo/thermal <fix_rheo_thermal>`,
|
||||||
|
:doc:`pair bpm/spring <pair_bpm_spring>`
|
||||||
|
|
||||||
|
Default
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
none
|
||||||
@ -337,6 +337,8 @@ accelerated styles exist.
|
|||||||
* :doc:`reaxff <pair_reaxff>` - ReaxFF potential
|
* :doc:`reaxff <pair_reaxff>` - ReaxFF potential
|
||||||
* :doc:`rebo <pair_airebo>` - Second generation REBO potential of Brenner
|
* :doc:`rebo <pair_airebo>` - Second generation REBO potential of Brenner
|
||||||
* :doc:`rebomos <pair_rebomos>` - REBOMoS potential for MoS2
|
* :doc:`rebomos <pair_rebomos>` - REBOMoS potential for MoS2
|
||||||
|
* :doc:`rheo <pair_rheo>` - fluid interactions in RHEO package
|
||||||
|
* :doc:`rheo/solid <pair_rheo_solid>` - solid interactions in RHEO package
|
||||||
* :doc:`resquared <pair_resquared>` - Everaers RE-Squared ellipsoidal potential
|
* :doc:`resquared <pair_resquared>` - Everaers RE-Squared ellipsoidal potential
|
||||||
* :doc:`saip/metal <pair_saip_metal>` - Interlayer potential for hetero-junctions formed with hexagonal 2D materials and metal surfaces
|
* :doc:`saip/metal <pair_saip_metal>` - Interlayer potential for hetero-junctions formed with hexagonal 2D materials and metal surfaces
|
||||||
* :doc:`sdpd/taitwater/isothermal <pair_sdpd_taitwater_isothermal>` - Smoothed dissipative particle dynamics for water at isothermal conditions
|
* :doc:`sdpd/taitwater/isothermal <pair_sdpd_taitwater_isothermal>` - Smoothed dissipative particle dynamics for water at isothermal conditions
|
||||||
|
|||||||
@ -859,6 +859,10 @@ of analysis.
|
|||||||
- atom-ID molecule-ID atom-type x y z
|
- atom-ID molecule-ID atom-type x y z
|
||||||
* - peri
|
* - peri
|
||||||
- atom-ID atom-type volume density x y z
|
- atom-ID atom-type volume density x y z
|
||||||
|
* - rheo
|
||||||
|
- atom-ID atom-type status rho x y z
|
||||||
|
* - rheo/thermal
|
||||||
|
- atom-ID atom-type status rho energy x y z
|
||||||
* - smd
|
* - smd
|
||||||
- atom-ID atom-type molecule volume mass kradius cradius x0 y0 z0 x y z
|
- atom-ID atom-type molecule volume mass kradius cradius x0 y0 z0 x y z
|
||||||
* - sph
|
* - sph
|
||||||
|
|||||||
@ -120,6 +120,8 @@ Syntax
|
|||||||
*angle* value = numeric angle type or angle type label, for all angles between selected atoms
|
*angle* value = numeric angle type or angle type label, for all angles between selected atoms
|
||||||
*dihedral* value = numeric dihedral type or dihedral type label, for all dihedrals between selected atoms
|
*dihedral* value = numeric dihedral type or dihedral type label, for all dihedrals between selected atoms
|
||||||
*improper* value = numeric improper type or improper type label, for all impropers between selected atoms
|
*improper* value = numeric improper type or improper type label, for all impropers between selected atoms
|
||||||
|
*rheo/rho* value = density of RHEO particles (mass/distance\^3)
|
||||||
|
*rheo/status* value = status or phase of RHEO particles (unitless)
|
||||||
*sph/e* value = energy of SPH particles (need units)
|
*sph/e* value = energy of SPH particles (need units)
|
||||||
value can be an atom-style variable (see below)
|
value can be an atom-style variable (see below)
|
||||||
*sph/cv* value = heat capacity of SPH particles (need units)
|
*sph/cv* value = heat capacity of SPH particles (need units)
|
||||||
@ -506,6 +508,10 @@ by the *bond types* (\ *angle types*, etc) field in the header of the
|
|||||||
data file read by the :doc:`read_data <read_data>` command. These
|
data file read by the :doc:`read_data <read_data>` command. These
|
||||||
keywords do not allow use of an atom-style variable.
|
keywords do not allow use of an atom-style variable.
|
||||||
|
|
||||||
|
Keywords *rheo/rho* and *rheo/status* set the density and the status of
|
||||||
|
rheo particles. In particular, one can only set the phase in the status
|
||||||
|
as described by the :doc:`RHEO howto page <Howto_rheo>`.
|
||||||
|
|
||||||
Keywords *sph/e*, *sph/cv*, and *sph/rho* set the energy, heat capacity,
|
Keywords *sph/e*, *sph/cv*, and *sph/rho* set the energy, heat capacity,
|
||||||
and density of smoothed particle hydrodynamics (SPH) particles. See
|
and density of smoothed particle hydrodynamics (SPH) particles. See
|
||||||
`this PDF guide <PDF/SPH_LAMMPS_userguide.pdf>`_ to using SPH in LAMMPS.
|
`this PDF guide <PDF/SPH_LAMMPS_userguide.pdf>`_ to using SPH in LAMMPS.
|
||||||
|
|||||||
@ -393,6 +393,7 @@ buf
|
|||||||
builtin
|
builtin
|
||||||
Bulacu
|
Bulacu
|
||||||
Bulatov
|
Bulatov
|
||||||
|
Bulkley
|
||||||
Bureekaew
|
Bureekaew
|
||||||
burlywood
|
burlywood
|
||||||
Bussi
|
Bussi
|
||||||
@ -564,6 +565,7 @@ cond
|
|||||||
conda
|
conda
|
||||||
Conda
|
Conda
|
||||||
Condens
|
Condens
|
||||||
|
conductivities
|
||||||
conf
|
conf
|
||||||
config
|
config
|
||||||
configfile
|
configfile
|
||||||
@ -1441,6 +1443,7 @@ henrich
|
|||||||
Henrich
|
Henrich
|
||||||
Hermitian
|
Hermitian
|
||||||
Herrmann
|
Herrmann
|
||||||
|
Hershchel
|
||||||
Hertizian
|
Hertizian
|
||||||
hertzian
|
hertzian
|
||||||
Hertzsch
|
Hertzsch
|
||||||
@ -1832,6 +1835,7 @@ Kspace
|
|||||||
KSpace
|
KSpace
|
||||||
KSpaceStyle
|
KSpaceStyle
|
||||||
Kspring
|
Kspring
|
||||||
|
kstyle
|
||||||
kT
|
kT
|
||||||
kTequil
|
kTequil
|
||||||
kth
|
kth
|
||||||
@ -2272,6 +2276,7 @@ modelled
|
|||||||
modelling
|
modelling
|
||||||
Modelling
|
Modelling
|
||||||
Modine
|
Modine
|
||||||
|
modularity
|
||||||
moduli
|
moduli
|
||||||
mofff
|
mofff
|
||||||
MOFFF
|
MOFFF
|
||||||
@ -2489,6 +2494,7 @@ Neumann
|
|||||||
Nevent
|
Nevent
|
||||||
nevery
|
nevery
|
||||||
Nevery
|
Nevery
|
||||||
|
Nevins
|
||||||
newfile
|
newfile
|
||||||
Newns
|
Newns
|
||||||
newtype
|
newtype
|
||||||
@ -3068,6 +3074,7 @@ quatw
|
|||||||
queryargs
|
queryargs
|
||||||
Queteschiner
|
Queteschiner
|
||||||
quickmin
|
quickmin
|
||||||
|
quintic
|
||||||
qw
|
qw
|
||||||
qx
|
qx
|
||||||
qy
|
qy
|
||||||
@ -3079,6 +3086,7 @@ radialscreenedspin
|
|||||||
radialspin
|
radialspin
|
||||||
radian
|
radian
|
||||||
radians
|
radians
|
||||||
|
radiative
|
||||||
radj
|
radj
|
||||||
Rafferty
|
Rafferty
|
||||||
rahman
|
rahman
|
||||||
@ -3182,6 +3190,7 @@ rg
|
|||||||
Rg
|
Rg
|
||||||
Rhaphson
|
Rhaphson
|
||||||
Rhe
|
Rhe
|
||||||
|
rheo
|
||||||
rheological
|
rheological
|
||||||
rheology
|
rheology
|
||||||
rhodo
|
rhodo
|
||||||
@ -3269,6 +3278,7 @@ rsort
|
|||||||
rsq
|
rsq
|
||||||
rst
|
rst
|
||||||
rstyle
|
rstyle
|
||||||
|
rsurf
|
||||||
Rubensson
|
Rubensson
|
||||||
Rubia
|
Rubia
|
||||||
Rud
|
Rud
|
||||||
@ -3652,6 +3662,7 @@ Telsa
|
|||||||
tempCorrCoeff
|
tempCorrCoeff
|
||||||
templated
|
templated
|
||||||
Templeton
|
Templeton
|
||||||
|
Tencer
|
||||||
Tequil
|
Tequil
|
||||||
ters
|
ters
|
||||||
tersoff
|
tersoff
|
||||||
@ -3998,6 +4009,7 @@ Vries
|
|||||||
Vsevolod
|
Vsevolod
|
||||||
Vsmall
|
Vsmall
|
||||||
Vstream
|
Vstream
|
||||||
|
vstyle
|
||||||
vtarget
|
vtarget
|
||||||
vtk
|
vtk
|
||||||
VTK
|
VTK
|
||||||
|
|||||||
75
examples/rheo/balloon/in.rheo.balloon
Normal file
75
examples/rheo/balloon/in.rheo.balloon
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
# ------ 2D water balloon ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style hybrid rheo bond
|
||||||
|
boundary m m p
|
||||||
|
comm_modify vel yes
|
||||||
|
newton off
|
||||||
|
|
||||||
|
region box block -40 40 0 80 -0.01 0.01 units box
|
||||||
|
create_box 1 box bond/types 1 extra/bond/per/atom 15 extra/special/per/atom 50
|
||||||
|
|
||||||
|
region fluid sphere -10 40 0 30 units box side in
|
||||||
|
lattice hex 1.0
|
||||||
|
create_atoms 1 region fluid
|
||||||
|
|
||||||
|
region shell sphere -10 40 0 27 units box side out
|
||||||
|
group shell region shell
|
||||||
|
|
||||||
|
set group shell rheo/status 1
|
||||||
|
set group all vx 0.005 vy -0.04
|
||||||
|
|
||||||
|
# ------ Model parameters ------#
|
||||||
|
|
||||||
|
variable cut equal 3.0
|
||||||
|
variable n equal 1.0
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable zeta equal 0.05
|
||||||
|
variable kappa equal 0.01*${rho0}/${mp}
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable eta equal 0.05
|
||||||
|
variable Cv equal 1.0
|
||||||
|
variable L equal 1.0
|
||||||
|
variable Tf equal 1.0
|
||||||
|
|
||||||
|
mass * ${mp}
|
||||||
|
timestep 0.1
|
||||||
|
|
||||||
|
pair_style hybrid/overlay rheo ${cut} artificial/visc ${zeta} rheo/solid
|
||||||
|
pair_coeff * * rheo
|
||||||
|
pair_coeff * * rheo/solid 1.0 1.0 1.0
|
||||||
|
|
||||||
|
special_bonds lj 0.0 1.0 1.0 coul 0.0 1.0 1.0
|
||||||
|
create_bonds many shell shell 1 0 1.5
|
||||||
|
special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0
|
||||||
|
|
||||||
|
bond_style bpm/spring
|
||||||
|
bond_coeff 1 1.0 1.0 1.0
|
||||||
|
|
||||||
|
# A lower critical strain allows the balloon to pop
|
||||||
|
#bond_coeff 1 1.0 0.05 1.0
|
||||||
|
|
||||||
|
# ------ Drop balloon ------#
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} quintic 0 &
|
||||||
|
shift &
|
||||||
|
surface/detection coordination 22 8
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 all wall/harmonic ylo EDGE 2.0 1.0 1.0
|
||||||
|
fix 5 all enforce2d
|
||||||
|
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
compute phase all rheo/property/atom phase
|
||||||
|
compute nbond all nbond/atom
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 200
|
||||||
|
thermo_style custom step time ke press atoms
|
||||||
|
|
||||||
|
#dump 1 all custom 200 atomDump id type x y vx vy fx fy c_phase c_nbond c_rho
|
||||||
|
run 30000
|
||||||
382
examples/rheo/balloon/log.17Apr2024.balloon.g++.4
Normal file
382
examples/rheo/balloon/log.17Apr2024.balloon.g++.4
Normal file
@ -0,0 +1,382 @@
|
|||||||
|
LAMMPS (17 Apr 2024 - Development - patch_5May2020-18508-g3c0eaf6870-modified)
|
||||||
|
# ------ 2D water balloon ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style hybrid rheo bond
|
||||||
|
boundary m m p
|
||||||
|
comm_modify vel yes
|
||||||
|
newton off
|
||||||
|
|
||||||
|
region box block -40 40 0 80 -0.01 0.01 units box
|
||||||
|
create_box 1 box bond/types 1 extra/bond/per/atom 15 extra/special/per/atom 50
|
||||||
|
Created orthogonal box = (-40 0 -0.01) to (40 80 0.01)
|
||||||
|
2 by 2 by 1 MPI processor grid
|
||||||
|
|
||||||
|
region fluid sphere -10 40 0 30 units box side in
|
||||||
|
lattice hex 1.0
|
||||||
|
Lattice spacing in x,y,z = 1.0745699 1.8612097 1.0745699
|
||||||
|
create_atoms 1 region fluid
|
||||||
|
Created 2830 atoms
|
||||||
|
using lattice units in orthogonal box = (-40 0 -0.01) to (40 80 0.01)
|
||||||
|
create_atoms CPU = 0.001 seconds
|
||||||
|
|
||||||
|
region shell sphere -10 40 0 27 units box side out
|
||||||
|
group shell region shell
|
||||||
|
544 atoms in group shell
|
||||||
|
|
||||||
|
set group shell rheo/status 1
|
||||||
|
Setting atom values ...
|
||||||
|
544 settings made for rheo/status
|
||||||
|
set group all vx 0.005 vy -0.04
|
||||||
|
Setting atom values ...
|
||||||
|
2830 settings made for vx
|
||||||
|
2830 settings made for vy
|
||||||
|
|
||||||
|
# ------ Model parameters ------#
|
||||||
|
|
||||||
|
variable cut equal 3.0
|
||||||
|
variable n equal 1.0
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable mp equal 1/${n}
|
||||||
|
variable mp equal 1/1
|
||||||
|
variable zeta equal 0.05
|
||||||
|
variable kappa equal 0.01*${rho0}/${mp}
|
||||||
|
variable kappa equal 0.01*1/${mp}
|
||||||
|
variable kappa equal 0.01*1/1
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable dt_max equal 0.1*3/${cs}/3
|
||||||
|
variable dt_max equal 0.1*3/1/3
|
||||||
|
variable eta equal 0.05
|
||||||
|
variable Cv equal 1.0
|
||||||
|
variable L equal 1.0
|
||||||
|
variable Tf equal 1.0
|
||||||
|
|
||||||
|
mass * ${mp}
|
||||||
|
mass * 1
|
||||||
|
timestep 0.1
|
||||||
|
|
||||||
|
pair_style hybrid/overlay rheo ${cut} artificial/visc ${zeta} rheo/solid
|
||||||
|
pair_style hybrid/overlay rheo 3 artificial/visc ${zeta} rheo/solid
|
||||||
|
pair_style hybrid/overlay rheo 3 artificial/visc 0.05 rheo/solid
|
||||||
|
pair_coeff * * rheo
|
||||||
|
pair_coeff * * rheo/solid 1.0 1.0 1.0
|
||||||
|
|
||||||
|
special_bonds lj 0.0 1.0 1.0 coul 0.0 1.0 1.0
|
||||||
|
Finding 1-2 1-3 1-4 neighbors ...
|
||||||
|
special bond factors lj: 0 1 1
|
||||||
|
special bond factors coul: 0 1 1
|
||||||
|
0 = max # of 1-2 neighbors
|
||||||
|
101 = max # of special neighbors
|
||||||
|
special bonds CPU = 0.000 seconds
|
||||||
|
create_bonds many shell shell 1 0 1.5
|
||||||
|
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 = 3.3
|
||||||
|
ghost atom cutoff = 3.3
|
||||||
|
binsize = 1.65, bins = 49 49 1
|
||||||
|
3 neighbor lists, perpetual/occasional/extra = 2 1 0
|
||||||
|
(1) command create_bonds, occasional
|
||||||
|
attributes: full, newton off
|
||||||
|
pair build: full/bin
|
||||||
|
stencil: full/bin/2d
|
||||||
|
bin: standard
|
||||||
|
(2) pair rheo, perpetual
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: half/bin/newtoff
|
||||||
|
stencil: full/bin/2d
|
||||||
|
bin: standard
|
||||||
|
(3) pair rheo/solid, perpetual, trim from (2)
|
||||||
|
attributes: half, newton off, cut 1.3
|
||||||
|
pair build: trim
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
Added 1263 bonds, new total = 1263
|
||||||
|
Finding 1-2 1-3 1-4 neighbors ...
|
||||||
|
special bond factors lj: 0 1 1
|
||||||
|
special bond factors coul: 0 1 1
|
||||||
|
6 = max # of 1-2 neighbors
|
||||||
|
101 = max # of special neighbors
|
||||||
|
special bonds CPU = 0.000 seconds
|
||||||
|
special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0
|
||||||
|
|
||||||
|
bond_style bpm/spring
|
||||||
|
bond_coeff 1 1.0 1.0 1.0
|
||||||
|
|
||||||
|
# A lower critical strain allows the balloon to pop
|
||||||
|
#bond_coeff 1 1.0 0.05 1.0
|
||||||
|
|
||||||
|
# ------ Drop balloon ------#
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} quintic 0 shift surface/detection coordination 22 8
|
||||||
|
fix 1 all rheo 3 quintic 0 shift surface/detection coordination 22 8
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
fix 2 all rheo/viscosity * constant 0.05
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 all wall/harmonic ylo EDGE 2.0 1.0 1.0
|
||||||
|
fix 5 all enforce2d
|
||||||
|
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
compute phase all rheo/property/atom phase
|
||||||
|
compute nbond all nbond/atom
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 200
|
||||||
|
thermo_style custom step time ke press atoms
|
||||||
|
|
||||||
|
dump 1 all custom 200 atomDump id type x y vx vy fx fy c_phase c_nbond c_rho
|
||||||
|
run 30000
|
||||||
|
|
||||||
|
CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE
|
||||||
|
|
||||||
|
Your simulation uses code contributions which should be cited:
|
||||||
|
|
||||||
|
- BPM bond style: doi:10.1039/D3SM01373A
|
||||||
|
|
||||||
|
@Article{Clemmer2024,
|
||||||
|
author = {Clemmer, Joel T. and Monti, Joseph M. and Lechman, Jeremy B.},
|
||||||
|
title = {A soft departure from jamming: the compaction of deformable
|
||||||
|
granular matter under high pressures},
|
||||||
|
journal = {Soft Matter},
|
||||||
|
year = 2024,
|
||||||
|
volume = 20,
|
||||||
|
number = 8,
|
||||||
|
pages = {1702--1718}
|
||||||
|
}
|
||||||
|
|
||||||
|
- @article{PalermoInPrep,
|
||||||
|
journal = {in prep},
|
||||||
|
title = {RHEO: A Hybrid Mesh-Free Model Framework for Dynamic Multi-Phase Flows},
|
||||||
|
year = {2024},
|
||||||
|
author = {Eric T. Palermo and Ki T. Wolf and Joel T. Clemmer and Thomas C. O'Connor},
|
||||||
|
}
|
||||||
|
|
||||||
|
CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE
|
||||||
|
|
||||||
|
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 = 3.3
|
||||||
|
ghost atom cutoff = 3.3
|
||||||
|
binsize = 1.65, bins = 49 49 1
|
||||||
|
6 neighbor lists, perpetual/occasional/extra = 6 0 0
|
||||||
|
(1) pair rheo, perpetual, half/full from (3)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: halffull/newtoff
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(2) pair rheo/solid, perpetual, trim from (1)
|
||||||
|
attributes: half, newton off, cut 1.3
|
||||||
|
pair build: trim
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(3) compute RHEO/KERNEL, perpetual
|
||||||
|
attributes: full, newton off
|
||||||
|
pair build: full/bin
|
||||||
|
stencil: full/bin/2d
|
||||||
|
bin: standard
|
||||||
|
(4) compute RHEO/GRAD, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(5) compute RHEO/VSHIFT, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(6) compute RHEO/SURFACE, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
Per MPI rank memory allocation (min/avg/max) = 17.63 | 17.64 | 17.65 Mbytes
|
||||||
|
Step Time KinEng Press Atoms
|
||||||
|
0 0 0.0008125 0.00035927734 2830
|
||||||
|
200 20 0.0008125 0.00035927734 2830
|
||||||
|
400 40 0.0008125 0.00035927734 2830
|
||||||
|
600 60 0.0008125 0.00035927734 2830
|
||||||
|
800 80 0.0008125 0.00035927734 2830
|
||||||
|
1000 100 0.0008125 0.00035927734 2830
|
||||||
|
1200 120 0.0008125 0.00035927734 2830
|
||||||
|
1400 140 0.0008125 0.00035927734 2830
|
||||||
|
1600 160 0.0008125 0.00035927734 2830
|
||||||
|
1800 180 0.0008125 0.00035927734 2830
|
||||||
|
2000 200 0.0008125 0.00035927734 2830
|
||||||
|
2200 220 0.0008125 0.00035927734 2830
|
||||||
|
2400 240 0.00079033569 0.00043037861 2830
|
||||||
|
2600 260 0.0007549229 0.00045188383 2830
|
||||||
|
2800 280 0.00072808836 0.00031695003 2830
|
||||||
|
3000 300 0.0007017958 1.6121754e-05 2830
|
||||||
|
3200 320 0.00067479047 -0.00015725514 2830
|
||||||
|
3400 340 0.00064762254 -0.00023361314 2830
|
||||||
|
3600 360 0.00061960255 -0.00033837679 2830
|
||||||
|
3800 380 0.0005857206 -0.00051770716 2830
|
||||||
|
4000 400 0.00055061733 -0.00070309251 2830
|
||||||
|
4200 420 0.00051884719 -0.0008247795 2830
|
||||||
|
4400 440 0.00049022236 -0.00099918413 2830
|
||||||
|
4600 460 0.00046060011 -0.0010923159 2830
|
||||||
|
4800 480 0.00042900173 -0.0011524571 2830
|
||||||
|
5000 500 0.00039751503 -0.0012586358 2830
|
||||||
|
5200 520 0.00036620054 -0.0013973543 2830
|
||||||
|
5400 540 0.00033130023 -0.0015185231 2830
|
||||||
|
5600 560 0.00030565892 -0.0016159836 2830
|
||||||
|
5800 580 0.00028209836 -0.0016925198 2830
|
||||||
|
6000 600 0.00024695044 -0.0017796892 2830
|
||||||
|
6200 620 0.00021190635 -0.0018706272 2830
|
||||||
|
6400 640 0.0001947093 -0.0019146643 2830
|
||||||
|
6600 660 0.00018903936 -0.0019146199 2830
|
||||||
|
6800 680 0.00017753371 -0.0019390155 2830
|
||||||
|
7000 700 0.00015170593 -0.0020247472 2830
|
||||||
|
7200 720 0.00011509692 -0.0021222209 2830
|
||||||
|
7400 740 7.9861785e-05 -0.0022033181 2830
|
||||||
|
7600 760 6.1350463e-05 -0.0022511971 2830
|
||||||
|
7800 780 6.5269523e-05 -0.0022222806 2830
|
||||||
|
8000 800 8.5709569e-05 -0.0021089664 2830
|
||||||
|
8200 820 0.00011746348 -0.0019351493 2830
|
||||||
|
8400 840 0.00015698134 -0.0017079928 2830
|
||||||
|
8600 860 0.00019758065 -0.0014618965 2830
|
||||||
|
8800 880 0.00023338199 -0.0012365832 2830
|
||||||
|
9000 900 0.00026282353 -0.0010348527 2830
|
||||||
|
9200 920 0.00028604776 -0.00085287884 2830
|
||||||
|
9400 940 0.00030388767 -0.000681122 2830
|
||||||
|
9600 960 0.000317589 -0.00052203521 2830
|
||||||
|
9800 980 0.00032716728 -0.00037501187 2830
|
||||||
|
10000 1000 0.00033270692 -0.00025576132 2830
|
||||||
|
10200 1020 0.00033485986 -0.00016554207 2830
|
||||||
|
10400 1040 0.00033476763 -9.8525417e-05 2830
|
||||||
|
10600 1060 0.00033351922 -5.1166347e-05 2830
|
||||||
|
10800 1080 0.00033161645 -2.0773965e-05 2830
|
||||||
|
11000 1100 0.00032913022 2.2384421e-07 2830
|
||||||
|
11200 1120 0.00032618376 1.2304773e-05 2830
|
||||||
|
11400 1140 0.00032310409 1.3725982e-05 2830
|
||||||
|
11600 1160 0.0003202128 9.0431945e-06 2830
|
||||||
|
11800 1180 0.00031760386 -5.3537879e-07 2830
|
||||||
|
12000 1200 0.00031518884 -1.331708e-05 2830
|
||||||
|
12200 1220 0.00031283958 -3.0838612e-05 2830
|
||||||
|
12400 1240 0.0003104901 -5.0038548e-05 2830
|
||||||
|
12600 1260 0.00030811597 -6.9699925e-05 2830
|
||||||
|
12800 1280 0.00030555782 -8.9972287e-05 2830
|
||||||
|
13000 1300 0.00030256671 -0.00011712941 2830
|
||||||
|
13200 1320 0.00029907961 -0.00015495826 2830
|
||||||
|
13400 1340 0.00029504656 -0.00020292633 2830
|
||||||
|
13600 1360 0.0002905184 -0.00024892421 2830
|
||||||
|
13800 1380 0.00028564542 -0.000295085 2830
|
||||||
|
14000 1400 0.00028073246 -0.00034571956 2830
|
||||||
|
14200 1420 0.00027611457 -0.00039341977 2830
|
||||||
|
14400 1440 0.00027217382 -0.0004281012 2830
|
||||||
|
14600 1460 0.00026919129 -0.00045342545 2830
|
||||||
|
14800 1480 0.00026727674 -0.00047323419 2830
|
||||||
|
15000 1500 0.0002663482 -0.00048423944 2830
|
||||||
|
15200 1520 0.00026616663 -0.0004816085 2830
|
||||||
|
15400 1540 0.00026634862 -0.00047573486 2830
|
||||||
|
15600 1560 0.0002664314 -0.00046803192 2830
|
||||||
|
15800 1580 0.00026603348 -0.00045753668 2830
|
||||||
|
16000 1600 0.00026511015 -0.00044676105 2830
|
||||||
|
16200 1620 0.00026373403 -0.00044075794 2830
|
||||||
|
16400 1640 0.00026217342 -0.00043684036 2830
|
||||||
|
16600 1660 0.0002607038 -0.00042774771 2830
|
||||||
|
16800 1680 0.00025951097 -0.00041603026 2830
|
||||||
|
17000 1700 0.00025869088 -0.00040302996 2830
|
||||||
|
17200 1720 0.00025825588 -0.00038415247 2830
|
||||||
|
17400 1740 0.00025818373 -0.00035742127 2830
|
||||||
|
17600 1760 0.00025843381 -0.00032854722 2830
|
||||||
|
17800 1780 0.00025897836 -0.00029821183 2830
|
||||||
|
18000 1800 0.00025981472 -0.00026108907 2830
|
||||||
|
18200 1820 0.00026095775 -0.00021731058 2830
|
||||||
|
18400 1840 0.00026239688 -0.00017030825 2830
|
||||||
|
18600 1860 0.00026404432 -0.00011868778 2830
|
||||||
|
18800 1880 0.00026574247 -5.9556286e-05 2830
|
||||||
|
19000 1900 0.00026729563 2.3014881e-06 2830
|
||||||
|
19200 1920 0.00026852418 6.2100169e-05 2830
|
||||||
|
19400 1940 0.00026929086 0.00012090325 2830
|
||||||
|
19600 1960 0.0002695407 0.00017904223 2830
|
||||||
|
19800 1980 0.00026929677 0.00023112254 2830
|
||||||
|
20000 2000 0.00026863577 0.0002756697 2830
|
||||||
|
20200 2020 0.00026765699 0.0003158399 2830
|
||||||
|
20400 2040 0.00026646841 0.00035200747 2830
|
||||||
|
20600 2060 0.00026516938 0.00038018442 2830
|
||||||
|
20800 2080 0.00026383495 0.00040179111 2830
|
||||||
|
21000 2100 0.00026252489 0.00042030921 2830
|
||||||
|
21200 2120 0.00026128616 0.00043466976 2830
|
||||||
|
21400 2140 0.00026014896 0.00044221445 2830
|
||||||
|
21600 2160 0.00025912325 0.00044531883 2830
|
||||||
|
21800 2180 0.00025821515 0.00044661709 2830
|
||||||
|
22000 2200 0.00025742576 0.00044409089 2830
|
||||||
|
22200 2220 0.00025674938 0.00043634999 2830
|
||||||
|
22400 2240 0.00025617111 0.00042630344 2830
|
||||||
|
22600 2260 0.0002556791 0.00041561603 2830
|
||||||
|
22800 2280 0.00025525963 0.00040166735 2830
|
||||||
|
23000 2300 0.00025489538 0.00038430419 2830
|
||||||
|
23200 2320 0.00025456861 0.0003669402 2830
|
||||||
|
23400 2340 0.00025426747 0.00034972373 2830
|
||||||
|
23600 2360 0.00025398353 0.0003302242 2830
|
||||||
|
23800 2380 0.00025370842 0.00030993088 2830
|
||||||
|
24000 2400 0.00025344084 0.00029143258 2830
|
||||||
|
24200 2420 0.00025318683 0.00027421708 2830
|
||||||
|
24400 2440 0.0002529591 0.00025603123 2830
|
||||||
|
24600 2460 0.0002527713 0.00023950245 2830
|
||||||
|
24800 2480 0.00025264228 0.00022644812 2830
|
||||||
|
25000 2500 0.00025259021 0.00021540748 2830
|
||||||
|
25200 2520 0.00025262892 0.00020544201 2830
|
||||||
|
25400 2540 0.00025276229 0.00019845807 2830
|
||||||
|
25600 2560 0.0002529876 0.00019449958 2830
|
||||||
|
25800 2580 0.00025329374 0.00019082606 2830
|
||||||
|
26000 2600 0.00025366066 0.00018700064 2830
|
||||||
|
26200 2620 0.00025406164 0.00018426061 2830
|
||||||
|
26400 2640 0.00025446737 0.00018098339 2830
|
||||||
|
26600 2660 0.00025484714 0.00017471869 2830
|
||||||
|
26800 2680 0.00025516604 0.00016565557 2830
|
||||||
|
27000 2700 0.00025538911 0.00015493626 2830
|
||||||
|
27200 2720 0.00025548177 0.00014075592 2830
|
||||||
|
27400 2740 0.00025541168 0.00012205573 2830
|
||||||
|
27600 2760 0.00025514889 0.00010039772 2830
|
||||||
|
27800 2780 0.00025467547 7.7069215e-05 2830
|
||||||
|
28000 2800 0.0002539915 5.1158042e-05 2830
|
||||||
|
28200 2820 0.00025312083 2.3468384e-05 2830
|
||||||
|
28400 2840 0.00025211323 -3.2184465e-06 2830
|
||||||
|
28600 2860 0.00025104366 -2.7726301e-05 2830
|
||||||
|
28800 2880 0.00025000263 -5.0202987e-05 2830
|
||||||
|
29000 2900 0.00024907814 -6.9244776e-05 2830
|
||||||
|
29200 2920 0.00024833815 -8.2874516e-05 2830
|
||||||
|
29400 2940 0.0002478155 -9.1854992e-05 2830
|
||||||
|
29600 2960 0.00024750313 -9.766055e-05 2830
|
||||||
|
29800 2980 0.00024735538 -9.9681291e-05 2830
|
||||||
|
30000 3000 0.00024730191 -9.818759e-05 2830
|
||||||
|
Loop time of 177.982 on 4 procs for 30000 steps with 2830 atoms
|
||||||
|
|
||||||
|
Performance: 1456330.235 tau/day, 168.557 timesteps/s, 477.016 katom-step/s
|
||||||
|
99.7% CPU use with 4 MPI tasks x no OpenMP threads
|
||||||
|
|
||||||
|
MPI task timing breakdown:
|
||||||
|
Section | min time | avg time | max time |%varavg| %total
|
||||||
|
---------------------------------------------------------------
|
||||||
|
Pair | 22.913 | 27.061 | 34.594 | 87.2 | 15.20
|
||||||
|
Bond | 0.22386 | 0.26159 | 0.30792 | 6.0 | 0.15
|
||||||
|
Neigh | 0.84412 | 0.84509 | 0.8462 | 0.1 | 0.47
|
||||||
|
Comm | 0.50015 | 0.55579 | 0.60346 | 5.2 | 0.31
|
||||||
|
Output | 0.65854 | 0.69412 | 0.72473 | 2.8 | 0.39
|
||||||
|
Modify | 133.13 | 136 | 137.38 | 14.5 | 76.41
|
||||||
|
Other | | 12.57 | | | 7.06
|
||||||
|
|
||||||
|
Nlocal: 707.5 ave 1576 max 53 min
|
||||||
|
Histogram: 2 0 0 0 0 0 1 0 0 1
|
||||||
|
Nghost: 164.75 ave 239 max 94 min
|
||||||
|
Histogram: 1 0 1 0 0 0 0 1 0 1
|
||||||
|
Neighs: 12307.8 ave 27380 max 983 min
|
||||||
|
Histogram: 2 0 0 0 0 0 1 0 0 1
|
||||||
|
FullNghs: 23517 ave 53040 max 1502 min
|
||||||
|
Histogram: 2 0 0 0 0 0 1 0 0 1
|
||||||
|
|
||||||
|
Total # of neighbors = 94068
|
||||||
|
Ave neighs/atom = 33.239576
|
||||||
|
Ave special neighs/atom = 0.89257951
|
||||||
|
Neighbor list builds = 783
|
||||||
|
Dangerous builds = 0
|
||||||
|
Total wall time: 0:02:58
|
||||||
76
examples/rheo/dam-break/in.rheo.dam.break
Normal file
76
examples/rheo/dam-break/in.rheo.dam.break
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
# ------ 2D dam break ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style rheo
|
||||||
|
boundary f s p
|
||||||
|
comm_modify vel yes
|
||||||
|
newton off
|
||||||
|
|
||||||
|
# ------ Create simulation box ------ #
|
||||||
|
|
||||||
|
variable n equal 1.0
|
||||||
|
variable cut equal 2.2
|
||||||
|
variable dx equal 3.0
|
||||||
|
|
||||||
|
region box block -1 150 -1 80 -0.1 0.1 units box
|
||||||
|
create_box 2 box
|
||||||
|
lattice hex ${n}
|
||||||
|
|
||||||
|
region fluid block $(xlo+v_dx+1.0) $(xlo+40.0) $(ylo+v_dx+1.0) $(yhi-20.0) EDGE EDGE units box
|
||||||
|
region walls1 block $(xlo+v_dx) $(xhi-v_dx) $(ylo+v_dx) $(yhi-v_dx) EDGE EDGE side out units box
|
||||||
|
region walls2 block EDGE EDGE EDGE $(yhi-v_dx) EDGE EDGE side in units box
|
||||||
|
region walls intersect 2 walls1 walls2
|
||||||
|
|
||||||
|
create_atoms 1 region fluid
|
||||||
|
create_atoms 2 region walls
|
||||||
|
|
||||||
|
group fluid type 1
|
||||||
|
group rig type 2
|
||||||
|
|
||||||
|
# ------ Model parameters ------ #
|
||||||
|
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable zeta equal 0.1
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable eta equal 0.1
|
||||||
|
variable Dr equal 0.1
|
||||||
|
|
||||||
|
mass 1 ${mp}
|
||||||
|
mass 2 $(2*v_mp)
|
||||||
|
set group all rheo/rho ${rho0}
|
||||||
|
|
||||||
|
set group all rheo/status 0
|
||||||
|
set group rig rheo/status 1
|
||||||
|
|
||||||
|
timestep ${dt_max}
|
||||||
|
|
||||||
|
pair_style rheo ${cut} artificial/visc ${zeta} #rho/damp ${Dr}
|
||||||
|
pair_coeff * *
|
||||||
|
|
||||||
|
# ------ Fixes & computes ------ #
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} quintic 10 &
|
||||||
|
surface/detection coordination 22 8 &
|
||||||
|
rho/sum
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 all gravity 1e-3 vector 0 -1 0
|
||||||
|
fix 5 rig setforce 0.0 0.0 0.0
|
||||||
|
fix 6 all enforce2d
|
||||||
|
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
compute p all rheo/property/atom pressure
|
||||||
|
compute surf all rheo/property/atom surface
|
||||||
|
compute sn all rheo/property/atom surface/n/x surface/n/y
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 20
|
||||||
|
thermo_style custom step time ke press
|
||||||
|
|
||||||
|
#dump 1 all custom 200 atomDump id type x y vx vy fx fy c_rho c_surf c_p c_sn[*]
|
||||||
|
|
||||||
|
run 30000
|
||||||
1694
examples/rheo/dam-break/log.17Apr2024.dam.g++.4
Normal file
1694
examples/rheo/dam-break/log.17Apr2024.dam.g++.4
Normal file
File diff suppressed because it is too large
Load Diff
82
examples/rheo/ice-cubes/in.rheo.ice.cubes
Normal file
82
examples/rheo/ice-cubes/in.rheo.ice.cubes
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
# ------ 2D Ice Cube Pour ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style hybrid rheo/thermal bond
|
||||||
|
boundary m m p
|
||||||
|
comm_modify vel yes
|
||||||
|
newton off
|
||||||
|
special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0
|
||||||
|
|
||||||
|
region box block -25 25 0 100 -0.01 0.01 units box
|
||||||
|
create_box 1 box bond/types 1 extra/bond/per/atom 15 extra/special/per/atom 50
|
||||||
|
|
||||||
|
region fluid block $(xlo+1) $(xhi-1) $(ylo+1) $(ylo+30) EDGE EDGE units box
|
||||||
|
lattice sq 1.0
|
||||||
|
create_atoms 1 region fluid
|
||||||
|
|
||||||
|
set group all sph/e 8.0
|
||||||
|
|
||||||
|
# ------ Model parameters ------#
|
||||||
|
|
||||||
|
variable cut equal 3.0
|
||||||
|
variable n equal 1.0
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable zeta equal 0.05
|
||||||
|
variable kappa equal 0.01*${rho0}/${mp}
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable eta equal 0.05
|
||||||
|
variable Cv equal 1.0
|
||||||
|
variable L equal 1.0
|
||||||
|
variable Tf equal 1.0
|
||||||
|
|
||||||
|
mass * ${mp}
|
||||||
|
timestep 0.1
|
||||||
|
|
||||||
|
pair_style hybrid/overlay rheo ${cut} artificial/visc ${zeta} rheo/solid
|
||||||
|
pair_coeff * * rheo
|
||||||
|
pair_coeff * * rheo/solid 1.0 1.0 1.0
|
||||||
|
|
||||||
|
bond_style bpm/spring
|
||||||
|
bond_coeff 1 1.0 1.0 1.0
|
||||||
|
|
||||||
|
# ------ Pour particles ------#
|
||||||
|
|
||||||
|
molecule my_mol "square.mol"
|
||||||
|
|
||||||
|
# Wall region extends far enough in z to avoid contact
|
||||||
|
region wall block EDGE EDGE EDGE EDGE -5 5 side in open 4 units box
|
||||||
|
region drop block -16 16 70 90 EDGE EDGE side in units box
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} quintic 0 &
|
||||||
|
thermal &
|
||||||
|
shift &
|
||||||
|
surface/detection coordination 22 8
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 all rheo/thermal conductivity * constant ${kappa} &
|
||||||
|
specific/heat * constant ${Cv} &
|
||||||
|
Tfreeze * constant ${Tf} &
|
||||||
|
latent/heat * constant ${L} &
|
||||||
|
react 1.5 1
|
||||||
|
fix 5 all wall/region wall harmonic 1.0 1.0 1.0
|
||||||
|
fix 6 all gravity 5e-4 vector 0 -1 0
|
||||||
|
fix 7 all deposit 8 0 1000 37241459 mol my_mol region drop near 2.0 vy -0.02 -0.02
|
||||||
|
fix 8 all enforce2d
|
||||||
|
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
compute phase all rheo/property/atom phase
|
||||||
|
compute temp all rheo/property/atom temperature
|
||||||
|
compute eng all rheo/property/atom energy
|
||||||
|
compute nbond all nbond/atom
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 200
|
||||||
|
thermo_style custom step time ke press atoms
|
||||||
|
|
||||||
|
#dump 1 all custom 200 atomDump id type x y vx vy fx fy c_phase c_temp c_eng c_nbond c_rho
|
||||||
|
|
||||||
|
run 30000
|
||||||
379
examples/rheo/ice-cubes/log.17Apr2024.ice.g++.4
Normal file
379
examples/rheo/ice-cubes/log.17Apr2024.ice.g++.4
Normal file
@ -0,0 +1,379 @@
|
|||||||
|
LAMMPS (17 Apr 2024 - Development - patch_5May2020-18508-g3c0eaf6870-modified)
|
||||||
|
# ------ 2D Ice Cube Pour ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style hybrid rheo/thermal bond
|
||||||
|
boundary m m p
|
||||||
|
comm_modify vel yes
|
||||||
|
newton off
|
||||||
|
special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0
|
||||||
|
|
||||||
|
region box block -25 25 0 100 -0.01 0.01 units box
|
||||||
|
create_box 1 box bond/types 1 extra/bond/per/atom 15 extra/special/per/atom 50
|
||||||
|
Created orthogonal box = (-25 0 -0.01) to (25 100 0.01)
|
||||||
|
2 by 2 by 1 MPI processor grid
|
||||||
|
|
||||||
|
region fluid block $(xlo+1) $(xhi-1) $(ylo+1) $(ylo+30) EDGE EDGE units box
|
||||||
|
region fluid block -24 $(xhi-1) $(ylo+1) $(ylo+30) EDGE EDGE units box
|
||||||
|
region fluid block -24 24 $(ylo+1) $(ylo+30) EDGE EDGE units box
|
||||||
|
region fluid block -24 24 1 $(ylo+30) EDGE EDGE units box
|
||||||
|
region fluid block -24 24 1 30 EDGE EDGE units box
|
||||||
|
lattice sq 1.0
|
||||||
|
Lattice spacing in x,y,z = 1 1 1
|
||||||
|
create_atoms 1 region fluid
|
||||||
|
Created 1470 atoms
|
||||||
|
using lattice units in orthogonal box = (-25 0 -0.01) to (25 100 0.01)
|
||||||
|
create_atoms CPU = 0.001 seconds
|
||||||
|
|
||||||
|
set group all sph/e 8.0
|
||||||
|
Setting atom values ...
|
||||||
|
1470 settings made for sph/e
|
||||||
|
|
||||||
|
# ------ Model parameters ------#
|
||||||
|
|
||||||
|
variable cut equal 3.0
|
||||||
|
variable n equal 1.0
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable mp equal 1/${n}
|
||||||
|
variable mp equal 1/1
|
||||||
|
variable zeta equal 0.05
|
||||||
|
variable kappa equal 0.01*${rho0}/${mp}
|
||||||
|
variable kappa equal 0.01*1/${mp}
|
||||||
|
variable kappa equal 0.01*1/1
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable dt_max equal 0.1*3/${cs}/3
|
||||||
|
variable dt_max equal 0.1*3/1/3
|
||||||
|
variable eta equal 0.05
|
||||||
|
variable Cv equal 1.0
|
||||||
|
variable L equal 1.0
|
||||||
|
variable Tf equal 1.0
|
||||||
|
|
||||||
|
mass * ${mp}
|
||||||
|
mass * 1
|
||||||
|
timestep 0.1
|
||||||
|
|
||||||
|
pair_style hybrid/overlay rheo ${cut} artificial/visc ${zeta} rheo/solid
|
||||||
|
pair_style hybrid/overlay rheo 3 artificial/visc ${zeta} rheo/solid
|
||||||
|
pair_style hybrid/overlay rheo 3 artificial/visc 0.05 rheo/solid
|
||||||
|
pair_coeff * * rheo
|
||||||
|
pair_coeff * * rheo/solid 1.0 1.0 1.0
|
||||||
|
|
||||||
|
bond_style bpm/spring
|
||||||
|
bond_coeff 1 1.0 1.0 1.0
|
||||||
|
|
||||||
|
# ------ Pour particles ------#
|
||||||
|
|
||||||
|
molecule my_mol "square.mol"
|
||||||
|
Read molecule template my_mol:
|
||||||
|
#Made with create_mol.py
|
||||||
|
1 molecules
|
||||||
|
0 fragments
|
||||||
|
100 atoms with max type 1
|
||||||
|
342 bonds with max type 1
|
||||||
|
0 angles with max type 0
|
||||||
|
0 dihedrals with max type 0
|
||||||
|
0 impropers with max type 0
|
||||||
|
|
||||||
|
# Wall region extends far enough in z to avoid contact
|
||||||
|
region wall block EDGE EDGE EDGE EDGE -5 5 side in open 4 units box
|
||||||
|
region drop block -16 16 70 90 EDGE EDGE side in units box
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} quintic 0 thermal shift surface/detection coordination 22 8
|
||||||
|
fix 1 all rheo 3 quintic 0 thermal shift surface/detection coordination 22 8
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
fix 2 all rheo/viscosity * constant 0.05
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 all rheo/thermal conductivity * constant ${kappa} specific/heat * constant ${Cv} Tfreeze * constant ${Tf} latent/heat * constant ${L} react 1.5 1
|
||||||
|
fix 4 all rheo/thermal conductivity * constant 0.01 specific/heat * constant ${Cv} Tfreeze * constant ${Tf} latent/heat * constant ${L} react 1.5 1
|
||||||
|
fix 4 all rheo/thermal conductivity * constant 0.01 specific/heat * constant 1 Tfreeze * constant ${Tf} latent/heat * constant ${L} react 1.5 1
|
||||||
|
fix 4 all rheo/thermal conductivity * constant 0.01 specific/heat * constant 1 Tfreeze * constant 1 latent/heat * constant ${L} react 1.5 1
|
||||||
|
fix 4 all rheo/thermal conductivity * constant 0.01 specific/heat * constant 1 Tfreeze * constant 1 latent/heat * constant 1 react 1.5 1
|
||||||
|
fix 5 all wall/region wall harmonic 1.0 1.0 1.0
|
||||||
|
fix 6 all gravity 5e-4 vector 0 -1 0
|
||||||
|
fix 7 all deposit 8 0 1000 37241459 mol my_mol region drop near 2.0 vy -0.02 -0.02
|
||||||
|
WARNING: Molecule attributes do not match system attributes (../molecule.cpp:1881)
|
||||||
|
fix 8 all enforce2d
|
||||||
|
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
compute phase all rheo/property/atom phase
|
||||||
|
compute temp all rheo/property/atom temperature
|
||||||
|
compute eng all rheo/property/atom energy
|
||||||
|
compute nbond all nbond/atom
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 200
|
||||||
|
thermo_style custom step time ke press atoms
|
||||||
|
|
||||||
|
dump 1 all custom 200 atomDump id type x y vx vy fx fy c_phase c_temp c_eng c_nbond c_rho
|
||||||
|
|
||||||
|
run 30000
|
||||||
|
|
||||||
|
CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE
|
||||||
|
|
||||||
|
Your simulation uses code contributions which should be cited:
|
||||||
|
|
||||||
|
- BPM bond style: doi:10.1039/D3SM01373A
|
||||||
|
|
||||||
|
@Article{Clemmer2024,
|
||||||
|
author = {Clemmer, Joel T. and Monti, Joseph M. and Lechman, Jeremy B.},
|
||||||
|
title = {A soft departure from jamming: the compaction of deformable
|
||||||
|
granular matter under high pressures},
|
||||||
|
journal = {Soft Matter},
|
||||||
|
year = 2024,
|
||||||
|
volume = 20,
|
||||||
|
number = 8,
|
||||||
|
pages = {1702--1718}
|
||||||
|
}
|
||||||
|
|
||||||
|
- @article{PalermoInPrep,
|
||||||
|
journal = {in prep},
|
||||||
|
title = {RHEO: A Hybrid Mesh-Free Model Framework for Dynamic Multi-Phase Flows},
|
||||||
|
year = {2024},
|
||||||
|
author = {Eric T. Palermo and Ki T. Wolf and Joel T. Clemmer and Thomas C. O'Connor},
|
||||||
|
}
|
||||||
|
|
||||||
|
- @article{ApplMathModel.130.310,
|
||||||
|
title = {A hybrid smoothed-particle hydrodynamics model of oxide skins on molten aluminum},
|
||||||
|
journal = {Applied Mathematical Modelling},
|
||||||
|
volume = {130},
|
||||||
|
pages = {310-326},
|
||||||
|
year = {2024},
|
||||||
|
issn = {0307-904X},
|
||||||
|
doi = {https://doi.org/10.1016/j.apm.2024.02.027},
|
||||||
|
author = {Joel T. Clemmer and Flint Pierce and Thomas C. O'Connor and Thomas D. Nevins and Elizabeth M.C. Jones and Jeremy B. Lechman and John Tencer},
|
||||||
|
}
|
||||||
|
|
||||||
|
CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE
|
||||||
|
|
||||||
|
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 = 3.3
|
||||||
|
ghost atom cutoff = 3.3
|
||||||
|
binsize = 1.65, bins = 31 61 1
|
||||||
|
7 neighbor lists, perpetual/occasional/extra = 6 1 0
|
||||||
|
(1) pair rheo, perpetual, half/full from (3)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: halffull/newtoff
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(2) pair rheo/solid, perpetual, trim from (4)
|
||||||
|
attributes: half, newton off, cut 1.3
|
||||||
|
pair build: trim
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(3) compute RHEO/KERNEL, perpetual
|
||||||
|
attributes: full, newton off
|
||||||
|
pair build: full/bin
|
||||||
|
stencil: full/bin/2d
|
||||||
|
bin: standard
|
||||||
|
(4) compute RHEO/GRAD, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(5) compute RHEO/VSHIFT, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(6) compute RHEO/SURFACE, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(7) fix rheo/thermal, occasional, trim from (4)
|
||||||
|
attributes: half, newton off, cut 3
|
||||||
|
pair build: trim
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
Per MPI rank memory allocation (min/avg/max) = 15.53 | 15.61 | 15.69 Mbytes
|
||||||
|
Step Time KinEng Press Atoms
|
||||||
|
0 0 0 0 1470
|
||||||
|
200 20 5.6002982e-05 3.4434234e-05 1570
|
||||||
|
400 40 8.2173099e-05 8.6171768e-05 1570
|
||||||
|
600 60 8.019018e-05 0.00010750355 1570
|
||||||
|
800 80 0.00013866953 0.00010265608 1570
|
||||||
|
1000 100 0.00018965028 8.1985605e-05 1570
|
||||||
|
1200 120 0.00022033242 7.4736443e-05 1670
|
||||||
|
1400 140 0.00030767062 0.00011264333 1670
|
||||||
|
1600 160 0.00040770127 0.00018779992 1670
|
||||||
|
1800 180 0.00047476332 0.00023153009 1670
|
||||||
|
2000 200 0.00059116774 0.00027200445 1670
|
||||||
|
2200 220 0.0007151733 0.0002919963 1770
|
||||||
|
2400 240 0.00083392135 0.00029757889 1770
|
||||||
|
2600 260 0.00099653466 0.00036547269 1770
|
||||||
|
2800 280 0.0011964069 0.00045983458 1770
|
||||||
|
3000 300 0.0013716953 0.00055013647 1770
|
||||||
|
3200 320 0.0015174096 0.00064203572 1870
|
||||||
|
3400 340 0.0016539743 0.00086671622 1870
|
||||||
|
3600 360 0.0015887858 0.00066353749 1870
|
||||||
|
3800 380 0.0016451684 0.00070551483 1870
|
||||||
|
4000 400 0.0017330971 0.00080722283 1870
|
||||||
|
4200 420 0.001812193 0.00073573903 1970
|
||||||
|
4400 440 0.001755871 0.0010621909 1970
|
||||||
|
4600 460 0.0016190772 0.00072913706 1970
|
||||||
|
4800 480 0.0015741931 0.00073524088 1970
|
||||||
|
5000 500 0.0016488815 0.00088684275 1970
|
||||||
|
5200 520 0.0017213288 0.00077042378 2070
|
||||||
|
5400 540 0.0018509598 0.0010219434 2070
|
||||||
|
5600 560 0.0020251064 0.00083182483 2070
|
||||||
|
5800 580 0.0022473255 0.00095076144 2070
|
||||||
|
6000 600 0.0024843519 0.0011247014 2070
|
||||||
|
6200 620 0.0022282321 0.0018105932 2170
|
||||||
|
6400 640 0.0020289063 0.0014158497 2170
|
||||||
|
6600 660 0.002145241 0.0011359383 2170
|
||||||
|
6800 680 0.0024313937 0.0016475504 2170
|
||||||
|
7000 700 0.0021000599 0.0020983745 2170
|
||||||
|
7200 720 0.0019137235 0.0010439152 2270
|
||||||
|
7400 740 0.0018801367 0.00095436448 2270
|
||||||
|
7600 760 0.0017979449 0.0011184039 2270
|
||||||
|
7800 780 0.0018005205 0.0009243205 2270
|
||||||
|
8000 800 0.0017827073 0.0013671228 2270
|
||||||
|
8200 820 0.0018387108 0.0015426012 2270
|
||||||
|
8400 840 0.0016000788 0.0016751514 2270
|
||||||
|
8600 860 0.0013954964 0.0016884335 2270
|
||||||
|
8800 880 0.0013283728 0.0012399398 2270
|
||||||
|
9000 900 0.001389385 0.0012968496 2270
|
||||||
|
9200 920 0.0012295438 0.0012995821 2270
|
||||||
|
9400 940 0.0010522655 0.00082245528 2270
|
||||||
|
9600 960 0.00097085496 0.00053833131 2270
|
||||||
|
9800 980 0.0009398987 0.00063467387 2270
|
||||||
|
10000 1000 0.00092710392 0.00059494446 2270
|
||||||
|
10200 1020 0.00095545471 0.00074560644 2270
|
||||||
|
10400 1040 0.0009645841 0.00085429807 2270
|
||||||
|
10600 1060 0.00064037148 0.0017222246 2270
|
||||||
|
10800 1080 0.00046790978 0.00088204234 2270
|
||||||
|
11000 1100 0.00030106229 0.00074950209 2270
|
||||||
|
11200 1120 0.00027746016 0.00052831745 2270
|
||||||
|
11400 1140 0.0002533348 0.0006272715 2270
|
||||||
|
11600 1160 0.00021825085 0.00029691552 2270
|
||||||
|
11800 1180 0.0001451308 0.00015037478 2270
|
||||||
|
12000 1200 0.0001314823 0.00017227174 2270
|
||||||
|
12200 1220 0.00013693632 0.00017791384 2270
|
||||||
|
12400 1240 0.00014987347 0.0002286677 2270
|
||||||
|
12600 1260 0.00015092598 0.0003698436 2270
|
||||||
|
12800 1280 0.0001291653 0.00047229532 2270
|
||||||
|
13000 1300 0.00011949988 0.00049560375 2270
|
||||||
|
13200 1320 0.00011694665 0.00057542084 2270
|
||||||
|
13400 1340 9.6164519e-05 0.00062714755 2270
|
||||||
|
13600 1360 8.4517591e-05 0.00044156913 2270
|
||||||
|
13800 1380 0.00019140516 0.0003264745 2270
|
||||||
|
14000 1400 0.00013868599 0.00037753497 2270
|
||||||
|
14200 1420 9.3701636e-05 0.00031517848 2270
|
||||||
|
14400 1440 6.7389077e-05 0.0002946861 2270
|
||||||
|
14600 1460 5.3640086e-05 0.00026650711 2270
|
||||||
|
14800 1480 4.2699992e-05 0.00023789279 2270
|
||||||
|
15000 1500 5.3012016e-05 0.00019933234 2270
|
||||||
|
15200 1520 5.8834197e-05 0.00022407007 2270
|
||||||
|
15400 1540 5.0899982e-05 0.00029695531 2270
|
||||||
|
15600 1560 3.0476742e-05 0.00039119066 2270
|
||||||
|
15800 1580 1.6633264e-05 0.00033770401 2270
|
||||||
|
16000 1600 1.098906e-05 0.00036684894 2270
|
||||||
|
16200 1620 1.464848e-05 0.00036449759 2270
|
||||||
|
16400 1640 1.9598429e-05 0.00021056689 2270
|
||||||
|
16600 1660 1.2644955e-05 0.00020781781 2270
|
||||||
|
16800 1680 8.8428553e-06 0.000165 2270
|
||||||
|
17000 1700 8.8971439e-06 0.00012266475 2270
|
||||||
|
17200 1720 1.7032781e-05 0.00019873443 2270
|
||||||
|
17400 1740 1.9448563e-05 0.00025661663 2270
|
||||||
|
17600 1760 1.3714713e-05 0.000324022 2270
|
||||||
|
17800 1780 9.1326468e-06 0.00031392513 2270
|
||||||
|
18000 1800 9.2464802e-06 0.00029729527 2270
|
||||||
|
18200 1820 1.5553042e-05 0.00027488475 2270
|
||||||
|
18400 1840 1.4132933e-05 0.00019565459 2270
|
||||||
|
18600 1860 9.4734832e-06 0.00016716988 2270
|
||||||
|
18800 1880 5.5115145e-06 0.00013728033 2270
|
||||||
|
19000 1900 8.268812e-06 0.00015119605 2270
|
||||||
|
19200 1920 1.2470136e-05 0.00020222131 2270
|
||||||
|
19400 1940 9.9387775e-06 0.00024503373 2270
|
||||||
|
19600 1960 5.4241999e-06 0.00026921858 2270
|
||||||
|
19800 1980 2.7987348e-06 0.00026201267 2270
|
||||||
|
20000 2000 6.272538e-06 0.00025626323 2270
|
||||||
|
20200 2020 8.0157781e-06 0.000220139 2270
|
||||||
|
20400 2040 6.1652093e-06 0.00017089058 2270
|
||||||
|
20600 2060 2.9967592e-06 0.00014582864 2270
|
||||||
|
20800 2080 3.016678e-06 0.000148629 2270
|
||||||
|
21000 2100 7.287645e-06 0.00016486102 2270
|
||||||
|
21200 2120 8.6905277e-06 0.00020276916 2270
|
||||||
|
21400 2140 6.8453018e-06 0.00023156153 2270
|
||||||
|
21600 2160 3.3853799e-06 0.0002432462 2270
|
||||||
|
21800 2180 4.1241209e-06 0.00022829024 2270
|
||||||
|
22000 2200 7.0802396e-06 0.00020784823 2270
|
||||||
|
22200 2220 7.3361691e-06 0.00018114134 2270
|
||||||
|
22400 2240 5.0764593e-06 0.00014351106 2270
|
||||||
|
22600 2260 2.7487537e-06 0.00012919872 2270
|
||||||
|
22800 2280 4.620167e-06 0.00013746218 2270
|
||||||
|
23000 2300 6.9819357e-06 0.00015985102 2270
|
||||||
|
23200 2320 6.8923916e-06 0.00018713045 2270
|
||||||
|
23400 2340 4.1795088e-06 0.00019846682 2270
|
||||||
|
23600 2360 2.2871028e-06 0.00021068421 2270
|
||||||
|
23800 2380 3.862046e-06 0.00019553306 2270
|
||||||
|
24000 2400 5.2448555e-06 0.00017398041 2270
|
||||||
|
24200 2420 4.7565441e-06 0.00015008142 2270
|
||||||
|
24400 2440 2.2952135e-06 0.00012747106 2270
|
||||||
|
24600 2460 2.1575617e-06 0.00012516996 2270
|
||||||
|
24800 2480 4.1777868e-06 0.0001331902 2270
|
||||||
|
25000 2500 5.5679133e-06 0.00015504562 2270
|
||||||
|
25200 2520 4.5758741e-06 0.00017146032 2270
|
||||||
|
25400 2540 2.3403277e-06 0.00017611666 2270
|
||||||
|
25600 2560 2.7029302e-06 0.00016850788 2270
|
||||||
|
25800 2580 4.3601102e-06 0.00015884642 2270
|
||||||
|
26000 2600 5.2244249e-06 0.00013793898 2270
|
||||||
|
26200 2620 3.4577672e-06 0.00012395875 2270
|
||||||
|
26400 2640 2.361577e-06 0.00011600057 2270
|
||||||
|
26600 2660 2.8515644e-06 0.00011277063 2270
|
||||||
|
26800 2680 4.0851213e-06 0.0001290832 2270
|
||||||
|
27000 2700 4.2579644e-06 0.0001476495 2270
|
||||||
|
27200 2720 2.6593858e-06 0.00015977745 2270
|
||||||
|
27400 2740 1.990115e-06 0.00015612787 2270
|
||||||
|
27600 2760 2.6756835e-06 0.00014913772 2270
|
||||||
|
27800 2780 3.9032806e-06 0.00014014763 2270
|
||||||
|
28000 2800 3.2729446e-06 0.00012216846 2270
|
||||||
|
28200 2820 1.9357278e-06 0.00011078621 2270
|
||||||
|
28400 2840 1.7094832e-06 0.00010910509 2270
|
||||||
|
28600 2860 2.8731406e-06 0.00011179644 2270
|
||||||
|
28800 2880 3.7062354e-06 0.00012254091 2270
|
||||||
|
29000 2900 2.7844262e-06 0.00013060331 2270
|
||||||
|
29200 2920 1.7680655e-06 0.00013797514 2270
|
||||||
|
29400 2940 1.706873e-06 0.0001350685 2270
|
||||||
|
29600 2960 2.8764562e-06 0.00012428508 2270
|
||||||
|
29800 2980 3.1502029e-06 0.00011456718 2270
|
||||||
|
30000 3000 2.1833409e-06 0.00010317469 2270
|
||||||
|
Loop time of 165.611 on 4 procs for 30000 steps with 2270 atoms
|
||||||
|
|
||||||
|
Performance: 1565111.240 tau/day, 181.147 timesteps/s, 411.204 katom-step/s
|
||||||
|
99.7% 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.63183 | 21.226 | 42.266 | 444.6 | 12.82
|
||||||
|
Bond | 0.095073 | 0.17799 | 0.27877 | 17.0 | 0.11
|
||||||
|
Neigh | 2.0745 | 2.0781 | 2.0822 | 0.2 | 1.25
|
||||||
|
Comm | 0.32024 | 0.38703 | 0.45564 | 8.1 | 0.23
|
||||||
|
Output | 0.60459 | 0.76798 | 0.93724 | 18.6 | 0.46
|
||||||
|
Modify | 119.85 | 140.76 | 161.36 | 172.2 | 85.00
|
||||||
|
Other | | 0.2124 | | | 0.13
|
||||||
|
|
||||||
|
Nlocal: 567.5 ave 1139 max 0 min
|
||||||
|
Histogram: 2 0 0 0 0 0 0 0 0 2
|
||||||
|
Nghost: 75.5 ave 152 max 0 min
|
||||||
|
Histogram: 2 0 0 0 0 0 0 0 0 2
|
||||||
|
Neighs: 9238.25 ave 18490 max 0 min
|
||||||
|
Histogram: 2 0 0 0 0 0 0 0 0 2
|
||||||
|
FullNghs: 17945 ave 35917 max 0 min
|
||||||
|
Histogram: 2 0 0 0 0 0 0 0 0 2
|
||||||
|
|
||||||
|
Total # of neighbors = 71780
|
||||||
|
Ave neighs/atom = 31.621145
|
||||||
|
Ave special neighs/atom = 0.22026432
|
||||||
|
Neighbor list builds = 2071
|
||||||
|
Dangerous builds = 0
|
||||||
|
|
||||||
|
Total wall time: 0:02:45
|
||||||
658
examples/rheo/ice-cubes/square.mol
Normal file
658
examples/rheo/ice-cubes/square.mol
Normal file
@ -0,0 +1,658 @@
|
|||||||
|
#Made with create_mol.py
|
||||||
|
|
||||||
|
100 atoms
|
||||||
|
342 bonds
|
||||||
|
|
||||||
|
Coords
|
||||||
|
#ID x y z
|
||||||
|
1 -4 -4 0
|
||||||
|
2 -3 -4 0
|
||||||
|
3 -2 -4 0
|
||||||
|
4 -1 -4 0
|
||||||
|
5 0 -4 0
|
||||||
|
6 1 -4 0
|
||||||
|
7 2 -4 0
|
||||||
|
8 3 -4 0
|
||||||
|
9 4 -4 0
|
||||||
|
10 5 -4 0
|
||||||
|
11 -4 -3 0
|
||||||
|
12 -3 -3 0
|
||||||
|
13 -2 -3 0
|
||||||
|
14 -1 -3 0
|
||||||
|
15 0 -3 0
|
||||||
|
16 1 -3 0
|
||||||
|
17 2 -3 0
|
||||||
|
18 3 -3 0
|
||||||
|
19 4 -3 0
|
||||||
|
20 5 -3 0
|
||||||
|
21 -4 -2 0
|
||||||
|
22 -3 -2 0
|
||||||
|
23 -2 -2 0
|
||||||
|
24 -1 -2 0
|
||||||
|
25 0 -2 0
|
||||||
|
26 1 -2 0
|
||||||
|
27 2 -2 0
|
||||||
|
28 3 -2 0
|
||||||
|
29 4 -2 0
|
||||||
|
30 5 -2 0
|
||||||
|
31 -4 -1 0
|
||||||
|
32 -3 -1 0
|
||||||
|
33 -2 -1 0
|
||||||
|
34 -1 -1 0
|
||||||
|
35 0 -1 0
|
||||||
|
36 1 -1 0
|
||||||
|
37 2 -1 0
|
||||||
|
38 3 -1 0
|
||||||
|
39 4 -1 0
|
||||||
|
40 5 -1 0
|
||||||
|
41 -4 0 0
|
||||||
|
42 -3 0 0
|
||||||
|
43 -2 0 0
|
||||||
|
44 -1 0 0
|
||||||
|
45 0 0 0
|
||||||
|
46 1 0 0
|
||||||
|
47 2 0 0
|
||||||
|
48 3 0 0
|
||||||
|
49 4 0 0
|
||||||
|
50 5 0 0
|
||||||
|
51 -4 1 0
|
||||||
|
52 -3 1 0
|
||||||
|
53 -2 1 0
|
||||||
|
54 -1 1 0
|
||||||
|
55 0 1 0
|
||||||
|
56 1 1 0
|
||||||
|
57 2 1 0
|
||||||
|
58 3 1 0
|
||||||
|
59 4 1 0
|
||||||
|
60 5 1 0
|
||||||
|
61 -4 2 0
|
||||||
|
62 -3 2 0
|
||||||
|
63 -2 2 0
|
||||||
|
64 -1 2 0
|
||||||
|
65 0 2 0
|
||||||
|
66 1 2 0
|
||||||
|
67 2 2 0
|
||||||
|
68 3 2 0
|
||||||
|
69 4 2 0
|
||||||
|
70 5 2 0
|
||||||
|
71 -4 3 0
|
||||||
|
72 -3 3 0
|
||||||
|
73 -2 3 0
|
||||||
|
74 -1 3 0
|
||||||
|
75 0 3 0
|
||||||
|
76 1 3 0
|
||||||
|
77 2 3 0
|
||||||
|
78 3 3 0
|
||||||
|
79 4 3 0
|
||||||
|
80 5 3 0
|
||||||
|
81 -4 4 0
|
||||||
|
82 -3 4 0
|
||||||
|
83 -2 4 0
|
||||||
|
84 -1 4 0
|
||||||
|
85 0 4 0
|
||||||
|
86 1 4 0
|
||||||
|
87 2 4 0
|
||||||
|
88 3 4 0
|
||||||
|
89 4 4 0
|
||||||
|
90 5 4 0
|
||||||
|
91 -4 5 0
|
||||||
|
92 -3 5 0
|
||||||
|
93 -2 5 0
|
||||||
|
94 -1 5 0
|
||||||
|
95 0 5 0
|
||||||
|
96 1 5 0
|
||||||
|
97 2 5 0
|
||||||
|
98 3 5 0
|
||||||
|
99 4 5 0
|
||||||
|
100 5 5 0
|
||||||
|
|
||||||
|
Types
|
||||||
|
#ID type
|
||||||
|
1 1
|
||||||
|
2 1
|
||||||
|
3 1
|
||||||
|
4 1
|
||||||
|
5 1
|
||||||
|
6 1
|
||||||
|
7 1
|
||||||
|
8 1
|
||||||
|
9 1
|
||||||
|
10 1
|
||||||
|
11 1
|
||||||
|
12 1
|
||||||
|
13 1
|
||||||
|
14 1
|
||||||
|
15 1
|
||||||
|
16 1
|
||||||
|
17 1
|
||||||
|
18 1
|
||||||
|
19 1
|
||||||
|
20 1
|
||||||
|
21 1
|
||||||
|
22 1
|
||||||
|
23 1
|
||||||
|
24 1
|
||||||
|
25 1
|
||||||
|
26 1
|
||||||
|
27 1
|
||||||
|
28 1
|
||||||
|
29 1
|
||||||
|
30 1
|
||||||
|
31 1
|
||||||
|
32 1
|
||||||
|
33 1
|
||||||
|
34 1
|
||||||
|
35 1
|
||||||
|
36 1
|
||||||
|
37 1
|
||||||
|
38 1
|
||||||
|
39 1
|
||||||
|
40 1
|
||||||
|
41 1
|
||||||
|
42 1
|
||||||
|
43 1
|
||||||
|
44 1
|
||||||
|
45 1
|
||||||
|
46 1
|
||||||
|
47 1
|
||||||
|
48 1
|
||||||
|
49 1
|
||||||
|
50 1
|
||||||
|
51 1
|
||||||
|
52 1
|
||||||
|
53 1
|
||||||
|
54 1
|
||||||
|
55 1
|
||||||
|
56 1
|
||||||
|
57 1
|
||||||
|
58 1
|
||||||
|
59 1
|
||||||
|
60 1
|
||||||
|
61 1
|
||||||
|
62 1
|
||||||
|
63 1
|
||||||
|
64 1
|
||||||
|
65 1
|
||||||
|
66 1
|
||||||
|
67 1
|
||||||
|
68 1
|
||||||
|
69 1
|
||||||
|
70 1
|
||||||
|
71 1
|
||||||
|
72 1
|
||||||
|
73 1
|
||||||
|
74 1
|
||||||
|
75 1
|
||||||
|
76 1
|
||||||
|
77 1
|
||||||
|
78 1
|
||||||
|
79 1
|
||||||
|
80 1
|
||||||
|
81 1
|
||||||
|
82 1
|
||||||
|
83 1
|
||||||
|
84 1
|
||||||
|
85 1
|
||||||
|
86 1
|
||||||
|
87 1
|
||||||
|
88 1
|
||||||
|
89 1
|
||||||
|
90 1
|
||||||
|
91 1
|
||||||
|
92 1
|
||||||
|
93 1
|
||||||
|
94 1
|
||||||
|
95 1
|
||||||
|
96 1
|
||||||
|
97 1
|
||||||
|
98 1
|
||||||
|
99 1
|
||||||
|
100 1
|
||||||
|
|
||||||
|
Masses
|
||||||
|
#ID mass
|
||||||
|
1 1
|
||||||
|
2 1
|
||||||
|
3 1
|
||||||
|
4 1
|
||||||
|
5 1
|
||||||
|
6 1
|
||||||
|
7 1
|
||||||
|
8 1
|
||||||
|
9 1
|
||||||
|
10 1
|
||||||
|
11 1
|
||||||
|
12 1
|
||||||
|
13 1
|
||||||
|
14 1
|
||||||
|
15 1
|
||||||
|
16 1
|
||||||
|
17 1
|
||||||
|
18 1
|
||||||
|
19 1
|
||||||
|
20 1
|
||||||
|
21 1
|
||||||
|
22 1
|
||||||
|
23 1
|
||||||
|
24 1
|
||||||
|
25 1
|
||||||
|
26 1
|
||||||
|
27 1
|
||||||
|
28 1
|
||||||
|
29 1
|
||||||
|
30 1
|
||||||
|
31 1
|
||||||
|
32 1
|
||||||
|
33 1
|
||||||
|
34 1
|
||||||
|
35 1
|
||||||
|
36 1
|
||||||
|
37 1
|
||||||
|
38 1
|
||||||
|
39 1
|
||||||
|
40 1
|
||||||
|
41 1
|
||||||
|
42 1
|
||||||
|
43 1
|
||||||
|
44 1
|
||||||
|
45 1
|
||||||
|
46 1
|
||||||
|
47 1
|
||||||
|
48 1
|
||||||
|
49 1
|
||||||
|
50 1
|
||||||
|
51 1
|
||||||
|
52 1
|
||||||
|
53 1
|
||||||
|
54 1
|
||||||
|
55 1
|
||||||
|
56 1
|
||||||
|
57 1
|
||||||
|
58 1
|
||||||
|
59 1
|
||||||
|
60 1
|
||||||
|
61 1
|
||||||
|
62 1
|
||||||
|
63 1
|
||||||
|
64 1
|
||||||
|
65 1
|
||||||
|
66 1
|
||||||
|
67 1
|
||||||
|
68 1
|
||||||
|
69 1
|
||||||
|
70 1
|
||||||
|
71 1
|
||||||
|
72 1
|
||||||
|
73 1
|
||||||
|
74 1
|
||||||
|
75 1
|
||||||
|
76 1
|
||||||
|
77 1
|
||||||
|
78 1
|
||||||
|
79 1
|
||||||
|
80 1
|
||||||
|
81 1
|
||||||
|
82 1
|
||||||
|
83 1
|
||||||
|
84 1
|
||||||
|
85 1
|
||||||
|
86 1
|
||||||
|
87 1
|
||||||
|
88 1
|
||||||
|
89 1
|
||||||
|
90 1
|
||||||
|
91 1
|
||||||
|
92 1
|
||||||
|
93 1
|
||||||
|
94 1
|
||||||
|
95 1
|
||||||
|
96 1
|
||||||
|
97 1
|
||||||
|
98 1
|
||||||
|
99 1
|
||||||
|
100 1
|
||||||
|
|
||||||
|
Bonds
|
||||||
|
#ID type atom1 atom2
|
||||||
|
1 1 1 2
|
||||||
|
2 1 1 11
|
||||||
|
3 1 1 12
|
||||||
|
4 1 2 3
|
||||||
|
5 1 2 11
|
||||||
|
6 1 2 12
|
||||||
|
7 1 2 13
|
||||||
|
8 1 3 4
|
||||||
|
9 1 3 12
|
||||||
|
10 1 3 13
|
||||||
|
11 1 3 14
|
||||||
|
12 1 4 5
|
||||||
|
13 1 4 13
|
||||||
|
14 1 4 14
|
||||||
|
15 1 4 15
|
||||||
|
16 1 5 6
|
||||||
|
17 1 5 14
|
||||||
|
18 1 5 15
|
||||||
|
19 1 5 16
|
||||||
|
20 1 6 7
|
||||||
|
21 1 6 15
|
||||||
|
22 1 6 16
|
||||||
|
23 1 6 17
|
||||||
|
24 1 7 8
|
||||||
|
25 1 7 16
|
||||||
|
26 1 7 17
|
||||||
|
27 1 7 18
|
||||||
|
28 1 8 9
|
||||||
|
29 1 8 17
|
||||||
|
30 1 8 18
|
||||||
|
31 1 8 19
|
||||||
|
32 1 9 10
|
||||||
|
33 1 9 18
|
||||||
|
34 1 9 19
|
||||||
|
35 1 9 20
|
||||||
|
36 1 10 19
|
||||||
|
37 1 10 20
|
||||||
|
38 1 11 21
|
||||||
|
39 1 11 12
|
||||||
|
40 1 11 22
|
||||||
|
41 1 12 21
|
||||||
|
42 1 12 13
|
||||||
|
43 1 12 22
|
||||||
|
44 1 12 23
|
||||||
|
45 1 13 22
|
||||||
|
46 1 13 23
|
||||||
|
47 1 13 14
|
||||||
|
48 1 13 24
|
||||||
|
49 1 14 23
|
||||||
|
50 1 14 24
|
||||||
|
51 1 14 15
|
||||||
|
52 1 14 25
|
||||||
|
53 1 15 24
|
||||||
|
54 1 15 16
|
||||||
|
55 1 15 25
|
||||||
|
56 1 15 26
|
||||||
|
57 1 16 25
|
||||||
|
58 1 16 26
|
||||||
|
59 1 16 17
|
||||||
|
60 1 16 27
|
||||||
|
61 1 17 26
|
||||||
|
62 1 17 18
|
||||||
|
63 1 17 27
|
||||||
|
64 1 17 28
|
||||||
|
65 1 18 27
|
||||||
|
66 1 18 28
|
||||||
|
67 1 18 19
|
||||||
|
68 1 18 29
|
||||||
|
69 1 19 28
|
||||||
|
70 1 19 29
|
||||||
|
71 1 19 20
|
||||||
|
72 1 19 30
|
||||||
|
73 1 20 29
|
||||||
|
74 1 20 30
|
||||||
|
75 1 21 22
|
||||||
|
76 1 21 31
|
||||||
|
77 1 21 32
|
||||||
|
78 1 22 23
|
||||||
|
79 1 22 31
|
||||||
|
80 1 22 32
|
||||||
|
81 1 22 33
|
||||||
|
82 1 23 24
|
||||||
|
83 1 23 32
|
||||||
|
84 1 23 33
|
||||||
|
85 1 23 34
|
||||||
|
86 1 24 25
|
||||||
|
87 1 24 33
|
||||||
|
88 1 24 34
|
||||||
|
89 1 24 35
|
||||||
|
90 1 25 26
|
||||||
|
91 1 25 34
|
||||||
|
92 1 25 35
|
||||||
|
93 1 25 36
|
||||||
|
94 1 26 27
|
||||||
|
95 1 26 35
|
||||||
|
96 1 26 36
|
||||||
|
97 1 26 37
|
||||||
|
98 1 27 28
|
||||||
|
99 1 27 36
|
||||||
|
100 1 27 37
|
||||||
|
101 1 27 38
|
||||||
|
102 1 28 29
|
||||||
|
103 1 28 37
|
||||||
|
104 1 28 38
|
||||||
|
105 1 28 39
|
||||||
|
106 1 29 30
|
||||||
|
107 1 29 38
|
||||||
|
108 1 29 39
|
||||||
|
109 1 29 40
|
||||||
|
110 1 30 39
|
||||||
|
111 1 30 40
|
||||||
|
112 1 31 32
|
||||||
|
113 1 31 41
|
||||||
|
114 1 31 42
|
||||||
|
115 1 32 33
|
||||||
|
116 1 32 41
|
||||||
|
117 1 32 42
|
||||||
|
118 1 32 43
|
||||||
|
119 1 33 34
|
||||||
|
120 1 33 42
|
||||||
|
121 1 33 43
|
||||||
|
122 1 33 44
|
||||||
|
123 1 34 35
|
||||||
|
124 1 34 43
|
||||||
|
125 1 34 44
|
||||||
|
126 1 34 45
|
||||||
|
127 1 35 36
|
||||||
|
128 1 35 44
|
||||||
|
129 1 35 45
|
||||||
|
130 1 35 46
|
||||||
|
131 1 36 37
|
||||||
|
132 1 36 45
|
||||||
|
133 1 36 46
|
||||||
|
134 1 36 47
|
||||||
|
135 1 37 38
|
||||||
|
136 1 37 46
|
||||||
|
137 1 37 47
|
||||||
|
138 1 37 48
|
||||||
|
139 1 38 39
|
||||||
|
140 1 38 47
|
||||||
|
141 1 38 48
|
||||||
|
142 1 38 49
|
||||||
|
143 1 39 40
|
||||||
|
144 1 39 48
|
||||||
|
145 1 39 49
|
||||||
|
146 1 39 50
|
||||||
|
147 1 40 49
|
||||||
|
148 1 40 50
|
||||||
|
149 1 41 51
|
||||||
|
150 1 41 42
|
||||||
|
151 1 41 52
|
||||||
|
152 1 42 51
|
||||||
|
153 1 42 43
|
||||||
|
154 1 42 52
|
||||||
|
155 1 42 53
|
||||||
|
156 1 43 52
|
||||||
|
157 1 43 53
|
||||||
|
158 1 43 44
|
||||||
|
159 1 43 54
|
||||||
|
160 1 44 53
|
||||||
|
161 1 44 54
|
||||||
|
162 1 44 45
|
||||||
|
163 1 44 55
|
||||||
|
164 1 45 54
|
||||||
|
165 1 45 46
|
||||||
|
166 1 45 55
|
||||||
|
167 1 45 56
|
||||||
|
168 1 46 55
|
||||||
|
169 1 46 56
|
||||||
|
170 1 46 47
|
||||||
|
171 1 46 57
|
||||||
|
172 1 47 56
|
||||||
|
173 1 47 48
|
||||||
|
174 1 47 57
|
||||||
|
175 1 47 58
|
||||||
|
176 1 48 57
|
||||||
|
177 1 48 58
|
||||||
|
178 1 48 49
|
||||||
|
179 1 48 59
|
||||||
|
180 1 49 58
|
||||||
|
181 1 49 59
|
||||||
|
182 1 49 50
|
||||||
|
183 1 49 60
|
||||||
|
184 1 50 59
|
||||||
|
185 1 50 60
|
||||||
|
186 1 51 52
|
||||||
|
187 1 51 61
|
||||||
|
188 1 51 62
|
||||||
|
189 1 52 53
|
||||||
|
190 1 52 61
|
||||||
|
191 1 52 62
|
||||||
|
192 1 52 63
|
||||||
|
193 1 53 54
|
||||||
|
194 1 53 62
|
||||||
|
195 1 53 63
|
||||||
|
196 1 53 64
|
||||||
|
197 1 54 55
|
||||||
|
198 1 54 63
|
||||||
|
199 1 54 64
|
||||||
|
200 1 54 65
|
||||||
|
201 1 55 56
|
||||||
|
202 1 55 64
|
||||||
|
203 1 55 65
|
||||||
|
204 1 55 66
|
||||||
|
205 1 56 57
|
||||||
|
206 1 56 65
|
||||||
|
207 1 56 66
|
||||||
|
208 1 56 67
|
||||||
|
209 1 57 58
|
||||||
|
210 1 57 66
|
||||||
|
211 1 57 67
|
||||||
|
212 1 57 68
|
||||||
|
213 1 58 59
|
||||||
|
214 1 58 67
|
||||||
|
215 1 58 68
|
||||||
|
216 1 58 69
|
||||||
|
217 1 59 60
|
||||||
|
218 1 59 68
|
||||||
|
219 1 59 69
|
||||||
|
220 1 59 70
|
||||||
|
221 1 60 69
|
||||||
|
222 1 60 70
|
||||||
|
223 1 61 71
|
||||||
|
224 1 61 62
|
||||||
|
225 1 61 72
|
||||||
|
226 1 62 71
|
||||||
|
227 1 62 63
|
||||||
|
228 1 62 72
|
||||||
|
229 1 62 73
|
||||||
|
230 1 63 72
|
||||||
|
231 1 63 73
|
||||||
|
232 1 63 64
|
||||||
|
233 1 63 74
|
||||||
|
234 1 64 73
|
||||||
|
235 1 64 74
|
||||||
|
236 1 64 65
|
||||||
|
237 1 64 75
|
||||||
|
238 1 65 74
|
||||||
|
239 1 65 66
|
||||||
|
240 1 65 75
|
||||||
|
241 1 65 76
|
||||||
|
242 1 66 75
|
||||||
|
243 1 66 76
|
||||||
|
244 1 66 67
|
||||||
|
245 1 66 77
|
||||||
|
246 1 67 76
|
||||||
|
247 1 67 68
|
||||||
|
248 1 67 77
|
||||||
|
249 1 67 78
|
||||||
|
250 1 68 77
|
||||||
|
251 1 68 78
|
||||||
|
252 1 68 69
|
||||||
|
253 1 68 79
|
||||||
|
254 1 69 78
|
||||||
|
255 1 69 79
|
||||||
|
256 1 69 70
|
||||||
|
257 1 69 80
|
||||||
|
258 1 70 79
|
||||||
|
259 1 70 80
|
||||||
|
260 1 71 72
|
||||||
|
261 1 71 81
|
||||||
|
262 1 71 82
|
||||||
|
263 1 72 73
|
||||||
|
264 1 72 81
|
||||||
|
265 1 72 82
|
||||||
|
266 1 72 83
|
||||||
|
267 1 73 74
|
||||||
|
268 1 73 82
|
||||||
|
269 1 73 83
|
||||||
|
270 1 73 84
|
||||||
|
271 1 74 75
|
||||||
|
272 1 74 83
|
||||||
|
273 1 74 84
|
||||||
|
274 1 74 85
|
||||||
|
275 1 75 76
|
||||||
|
276 1 75 84
|
||||||
|
277 1 75 85
|
||||||
|
278 1 75 86
|
||||||
|
279 1 76 77
|
||||||
|
280 1 76 85
|
||||||
|
281 1 76 86
|
||||||
|
282 1 76 87
|
||||||
|
283 1 77 78
|
||||||
|
284 1 77 86
|
||||||
|
285 1 77 87
|
||||||
|
286 1 77 88
|
||||||
|
287 1 78 79
|
||||||
|
288 1 78 87
|
||||||
|
289 1 78 88
|
||||||
|
290 1 78 89
|
||||||
|
291 1 79 80
|
||||||
|
292 1 79 88
|
||||||
|
293 1 79 89
|
||||||
|
294 1 79 90
|
||||||
|
295 1 80 89
|
||||||
|
296 1 80 90
|
||||||
|
297 1 81 82
|
||||||
|
298 1 81 91
|
||||||
|
299 1 81 92
|
||||||
|
300 1 82 83
|
||||||
|
301 1 82 91
|
||||||
|
302 1 82 92
|
||||||
|
303 1 82 93
|
||||||
|
304 1 83 84
|
||||||
|
305 1 83 92
|
||||||
|
306 1 83 93
|
||||||
|
307 1 83 94
|
||||||
|
308 1 84 85
|
||||||
|
309 1 84 93
|
||||||
|
310 1 84 94
|
||||||
|
311 1 84 95
|
||||||
|
312 1 85 86
|
||||||
|
313 1 85 94
|
||||||
|
314 1 85 95
|
||||||
|
315 1 85 96
|
||||||
|
316 1 86 87
|
||||||
|
317 1 86 95
|
||||||
|
318 1 86 96
|
||||||
|
319 1 86 97
|
||||||
|
320 1 87 88
|
||||||
|
321 1 87 96
|
||||||
|
322 1 87 97
|
||||||
|
323 1 87 98
|
||||||
|
324 1 88 89
|
||||||
|
325 1 88 97
|
||||||
|
326 1 88 98
|
||||||
|
327 1 88 99
|
||||||
|
328 1 89 90
|
||||||
|
329 1 89 98
|
||||||
|
330 1 89 99
|
||||||
|
331 1 89 100
|
||||||
|
332 1 90 99
|
||||||
|
333 1 90 100
|
||||||
|
334 1 91 92
|
||||||
|
335 1 92 93
|
||||||
|
336 1 93 94
|
||||||
|
337 1 94 95
|
||||||
|
338 1 95 96
|
||||||
|
339 1 96 97
|
||||||
|
340 1 97 98
|
||||||
|
341 1 98 99
|
||||||
|
342 1 99 100
|
||||||
102
examples/rheo/oxidation/in.rheo.oxidation
Normal file
102
examples/rheo/oxidation/in.rheo.oxidation
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
# ------ 2D oxidizing bar ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style hybrid rheo/thermal bond
|
||||||
|
boundary m m p
|
||||||
|
comm_modify vel yes
|
||||||
|
newton off
|
||||||
|
|
||||||
|
region box block -60 60 0 80 -0.01 0.01 units box
|
||||||
|
create_box 3 box bond/types 2 extra/bond/per/atom 20 extra/special/per/atom 50
|
||||||
|
|
||||||
|
region lbar block -15 0 3 80 EDGE EDGE units box
|
||||||
|
region rbar block 0 15 3 80 EDGE EDGE units box
|
||||||
|
region bar union 2 lbar rbar
|
||||||
|
region floor block EDGE EDGE EDGE 3.0 EDGE EDGE units box
|
||||||
|
|
||||||
|
lattice hex 1.0
|
||||||
|
create_atoms 1 region bar
|
||||||
|
create_atoms 3 region floor
|
||||||
|
|
||||||
|
set region rbar type 2
|
||||||
|
group bar type 1 2
|
||||||
|
group rbar type 2
|
||||||
|
group floor type 3
|
||||||
|
|
||||||
|
set group all sph/e 0.0
|
||||||
|
set group all rheo/status 1
|
||||||
|
|
||||||
|
# ------ Model parameters ------#
|
||||||
|
|
||||||
|
variable cut equal 3.0
|
||||||
|
variable n equal 1.0
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable zeta equal 0.05
|
||||||
|
variable kappa equal 0.1*${rho0}/${mp}
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable eta equal 0.05
|
||||||
|
variable Cv equal 1.0
|
||||||
|
variable L equal 0.1
|
||||||
|
variable Tf equal 1.0
|
||||||
|
|
||||||
|
mass * ${mp}
|
||||||
|
timestep 0.1
|
||||||
|
|
||||||
|
pair_style hybrid/overlay rheo ${cut} artificial/visc ${zeta} rheo/solid
|
||||||
|
pair_coeff * * rheo
|
||||||
|
pair_coeff * * rheo/solid 1.0 1.0 1.0
|
||||||
|
|
||||||
|
special_bonds lj 0.0 1.0 1.0 coul 0.0 1.0 1.0
|
||||||
|
create_bonds many bar bar 1 0 1.5
|
||||||
|
special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0
|
||||||
|
|
||||||
|
bond_style hybrid bpm/spring rheo/shell t/form 100
|
||||||
|
bond_coeff 1 bpm/spring 1.0 1.0 1.0
|
||||||
|
bond_coeff 2 rheo/shell 0.2 0.2 0.1
|
||||||
|
|
||||||
|
# ------ Apply dynamics ------#
|
||||||
|
|
||||||
|
# Note: surface detection is not performed on solid bodies, so cannot use surface property
|
||||||
|
compute coord all rheo/property/atom coordination
|
||||||
|
variable surf atom c_coord<22
|
||||||
|
group surf dynamic all var surf every 10
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} quintic 0 &
|
||||||
|
thermal &
|
||||||
|
shift &
|
||||||
|
surface/detection coordination 22 8
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 all rheo/thermal conductivity * constant ${kappa} &
|
||||||
|
specific/heat * constant ${Cv} &
|
||||||
|
Tfreeze * constant ${Tf} &
|
||||||
|
latent/heat * constant ${L} &
|
||||||
|
react 1.5 1
|
||||||
|
|
||||||
|
fix 5 rbar rheo/oxidation 1.5 2 1.0
|
||||||
|
fix 6 all wall/harmonic ylo EDGE 2.0 1.0 1.0
|
||||||
|
fix 7 all gravity 5e-5 vector 0 -1 0
|
||||||
|
fix 8 floor setforce 0.0 0.0 0.0
|
||||||
|
fix 9 surf add/heat linear 1.1 0.05
|
||||||
|
fix 10 floor add/heat constant 0 overwrite yes # fix the temperature of the floor
|
||||||
|
fix 11 all enforce2d
|
||||||
|
|
||||||
|
compute surf all rheo/property/atom surface
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
compute phase all rheo/property/atom phase
|
||||||
|
compute temp all rheo/property/atom temperature
|
||||||
|
compute eng all rheo/property/atom energy
|
||||||
|
compute nbond_shell all rheo/property/atom nbond/shell
|
||||||
|
compute nbond_solid all nbond/atom bond/type 1
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 200
|
||||||
|
thermo_style custom step time ke press atoms
|
||||||
|
|
||||||
|
#dump 1 all custom 200 atomDump id type x y vx vy fx fy c_phase c_temp c_eng c_nbond_solid c_nbond_shell c_rho c_surf
|
||||||
|
|
||||||
|
run 40000
|
||||||
488
examples/rheo/oxidation/log.17Apr2024.oxidation.g++.4
Normal file
488
examples/rheo/oxidation/log.17Apr2024.oxidation.g++.4
Normal file
@ -0,0 +1,488 @@
|
|||||||
|
LAMMPS (17 Apr 2024 - Development - patch_5May2020-18508-g3c0eaf6870-modified)
|
||||||
|
# ------ 2D oxidizing bar ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style hybrid rheo/thermal bond
|
||||||
|
boundary m m p
|
||||||
|
comm_modify vel yes
|
||||||
|
newton off
|
||||||
|
|
||||||
|
region box block -60 60 0 80 -0.01 0.01 units box
|
||||||
|
create_box 3 box bond/types 2 extra/bond/per/atom 20 extra/special/per/atom 50
|
||||||
|
Created orthogonal box = (-60 0 -0.01) to (60 80 0.01)
|
||||||
|
2 by 2 by 1 MPI processor grid
|
||||||
|
|
||||||
|
region lbar block -15 0 3 80 EDGE EDGE units box
|
||||||
|
region rbar block 0 15 3 80 EDGE EDGE units box
|
||||||
|
region bar union 2 lbar rbar
|
||||||
|
region floor block EDGE EDGE EDGE 3.0 EDGE EDGE units box
|
||||||
|
|
||||||
|
lattice hex 1.0
|
||||||
|
Lattice spacing in x,y,z = 1.0745699 1.8612097 1.0745699
|
||||||
|
create_atoms 1 region bar
|
||||||
|
Created 2255 atoms
|
||||||
|
using lattice units in orthogonal box = (-60 0 -0.01) to (60 80 0.01)
|
||||||
|
create_atoms CPU = 0.001 seconds
|
||||||
|
create_atoms 3 region floor
|
||||||
|
Created 446 atoms
|
||||||
|
using lattice units in orthogonal box = (-60 0 -0.01) to (60 80 0.01)
|
||||||
|
create_atoms CPU = 0.000 seconds
|
||||||
|
|
||||||
|
set region rbar type 2
|
||||||
|
Setting atom values ...
|
||||||
|
1148 settings made for type
|
||||||
|
group bar type 1 2
|
||||||
|
2255 atoms in group bar
|
||||||
|
group rbar type 2
|
||||||
|
1148 atoms in group rbar
|
||||||
|
group floor type 3
|
||||||
|
446 atoms in group floor
|
||||||
|
|
||||||
|
set group all sph/e 0.0
|
||||||
|
Setting atom values ...
|
||||||
|
2701 settings made for sph/e
|
||||||
|
set group all rheo/status 1
|
||||||
|
Setting atom values ...
|
||||||
|
2701 settings made for rheo/status
|
||||||
|
|
||||||
|
# ------ Model parameters ------#
|
||||||
|
|
||||||
|
variable cut equal 3.0
|
||||||
|
variable n equal 1.0
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable mp equal 1/${n}
|
||||||
|
variable mp equal 1/1
|
||||||
|
variable zeta equal 0.05
|
||||||
|
variable kappa equal 0.1*${rho0}/${mp}
|
||||||
|
variable kappa equal 0.1*1/${mp}
|
||||||
|
variable kappa equal 0.1*1/1
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable dt_max equal 0.1*3/${cs}/3
|
||||||
|
variable dt_max equal 0.1*3/1/3
|
||||||
|
variable eta equal 0.05
|
||||||
|
variable Cv equal 1.0
|
||||||
|
variable L equal 0.1
|
||||||
|
variable Tf equal 1.0
|
||||||
|
|
||||||
|
mass * ${mp}
|
||||||
|
mass * 1
|
||||||
|
timestep 0.1
|
||||||
|
|
||||||
|
pair_style hybrid/overlay rheo ${cut} artificial/visc ${zeta} rheo/solid
|
||||||
|
pair_style hybrid/overlay rheo 3 artificial/visc ${zeta} rheo/solid
|
||||||
|
pair_style hybrid/overlay rheo 3 artificial/visc 0.05 rheo/solid
|
||||||
|
pair_coeff * * rheo
|
||||||
|
pair_coeff * * rheo/solid 1.0 1.0 1.0
|
||||||
|
|
||||||
|
special_bonds lj 0.0 1.0 1.0 coul 0.0 1.0 1.0
|
||||||
|
Finding 1-2 1-3 1-4 neighbors ...
|
||||||
|
special bond factors lj: 0 1 1
|
||||||
|
special bond factors coul: 0 1 1
|
||||||
|
0 = max # of 1-2 neighbors
|
||||||
|
101 = max # of special neighbors
|
||||||
|
special bonds CPU = 0.000 seconds
|
||||||
|
create_bonds many bar bar 1 0 1.5
|
||||||
|
Generated 0 of 3 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 = 3.3
|
||||||
|
ghost atom cutoff = 3.3
|
||||||
|
binsize = 1.65, bins = 73 49 1
|
||||||
|
3 neighbor lists, perpetual/occasional/extra = 2 1 0
|
||||||
|
(1) command create_bonds, occasional
|
||||||
|
attributes: full, newton off
|
||||||
|
pair build: full/bin
|
||||||
|
stencil: full/bin/2d
|
||||||
|
bin: standard
|
||||||
|
(2) pair rheo, perpetual
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: half/bin/newtoff
|
||||||
|
stencil: full/bin/2d
|
||||||
|
bin: standard
|
||||||
|
(3) pair rheo/solid, perpetual, trim from (2)
|
||||||
|
attributes: half, newton off, cut 1.3
|
||||||
|
pair build: trim
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
Added 6547 bonds, new total = 6547
|
||||||
|
Finding 1-2 1-3 1-4 neighbors ...
|
||||||
|
special bond factors lj: 0 1 1
|
||||||
|
special bond factors coul: 0 1 1
|
||||||
|
6 = max # of 1-2 neighbors
|
||||||
|
101 = max # of special neighbors
|
||||||
|
special bonds CPU = 0.000 seconds
|
||||||
|
special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0
|
||||||
|
|
||||||
|
bond_style hybrid bpm/spring rheo/shell t/form 100
|
||||||
|
bond_coeff 1 bpm/spring 1.0 1.0 1.0
|
||||||
|
bond_coeff 2 rheo/shell 0.2 0.2 0.1
|
||||||
|
|
||||||
|
# ------ Apply dynamics ------#
|
||||||
|
|
||||||
|
# Note: surface detection is not performed on solid bodies, so cannot use surface property
|
||||||
|
compute coord all rheo/property/atom coordination
|
||||||
|
variable surf atom c_coord<22
|
||||||
|
group surf dynamic all var surf every 10
|
||||||
|
dynamic group surf defined
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} quintic 0 thermal shift surface/detection coordination 22 8
|
||||||
|
fix 1 all rheo 3 quintic 0 thermal shift surface/detection coordination 22 8
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
fix 2 all rheo/viscosity * constant 0.05
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 all rheo/thermal conductivity * constant ${kappa} specific/heat * constant ${Cv} Tfreeze * constant ${Tf} latent/heat * constant ${L} react 1.5 1
|
||||||
|
fix 4 all rheo/thermal conductivity * constant 0.1 specific/heat * constant ${Cv} Tfreeze * constant ${Tf} latent/heat * constant ${L} react 1.5 1
|
||||||
|
fix 4 all rheo/thermal conductivity * constant 0.1 specific/heat * constant 1 Tfreeze * constant ${Tf} latent/heat * constant ${L} react 1.5 1
|
||||||
|
fix 4 all rheo/thermal conductivity * constant 0.1 specific/heat * constant 1 Tfreeze * constant 1 latent/heat * constant ${L} react 1.5 1
|
||||||
|
fix 4 all rheo/thermal conductivity * constant 0.1 specific/heat * constant 1 Tfreeze * constant 1 latent/heat * constant 0.1 react 1.5 1
|
||||||
|
|
||||||
|
fix 5 rbar rheo/oxidation 1.5 2 1.0
|
||||||
|
fix 6 all wall/harmonic ylo EDGE 2.0 1.0 1.0
|
||||||
|
fix 7 all gravity 5e-5 vector 0 -1 0
|
||||||
|
fix 8 floor setforce 0.0 0.0 0.0
|
||||||
|
fix 9 surf add/heat linear 1.1 0.05
|
||||||
|
fix 10 floor add/heat constant 0 overwrite yes # fix the temperature of the floor
|
||||||
|
fix 11 all enforce2d
|
||||||
|
|
||||||
|
compute surf all rheo/property/atom surface
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
compute phase all rheo/property/atom phase
|
||||||
|
compute status all rheo/property/atom status
|
||||||
|
compute temp all rheo/property/atom temperature
|
||||||
|
compute eng all rheo/property/atom energy
|
||||||
|
compute nbond_shell all rheo/property/atom nbond/shell
|
||||||
|
compute nbond_solid all nbond/atom bond/type 1
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 200
|
||||||
|
thermo_style custom step time ke press atoms
|
||||||
|
|
||||||
|
dump 1 all custom 200 atomDump id type x y vx vy fx fy c_phase c_temp c_eng c_nbond_solid c_nbond_shell c_rho c_surf c_status
|
||||||
|
|
||||||
|
run 40000
|
||||||
|
|
||||||
|
CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE
|
||||||
|
|
||||||
|
Your simulation uses code contributions which should be cited:
|
||||||
|
|
||||||
|
- BPM bond style: doi:10.1039/D3SM01373A
|
||||||
|
|
||||||
|
@Article{Clemmer2024,
|
||||||
|
author = {Clemmer, Joel T. and Monti, Joseph M. and Lechman, Jeremy B.},
|
||||||
|
title = {A soft departure from jamming: the compaction of deformable
|
||||||
|
granular matter under high pressures},
|
||||||
|
journal = {Soft Matter},
|
||||||
|
year = 2024,
|
||||||
|
volume = 20,
|
||||||
|
number = 8,
|
||||||
|
pages = {1702--1718}
|
||||||
|
}
|
||||||
|
|
||||||
|
- @article{PalermoInPrep,
|
||||||
|
journal = {in prep},
|
||||||
|
title = {RHEO: A Hybrid Mesh-Free Model Framework for Dynamic Multi-Phase Flows},
|
||||||
|
year = {2024},
|
||||||
|
author = {Eric T. Palermo and Ki T. Wolf and Joel T. Clemmer and Thomas C. O'Connor},
|
||||||
|
}
|
||||||
|
|
||||||
|
- @article{ApplMathModel.130.310,
|
||||||
|
title = {A hybrid smoothed-particle hydrodynamics model of oxide skins on molten aluminum},
|
||||||
|
journal = {Applied Mathematical Modelling},
|
||||||
|
volume = {130},
|
||||||
|
pages = {310-326},
|
||||||
|
year = {2024},
|
||||||
|
issn = {0307-904X},
|
||||||
|
doi = {https://doi.org/10.1016/j.apm.2024.02.027},
|
||||||
|
author = {Joel T. Clemmer and Flint Pierce and Thomas C. O'Connor and Thomas D. Nevins and Elizabeth M.C. Jones and Jeremy B. Lechman and John Tencer},
|
||||||
|
}
|
||||||
|
|
||||||
|
CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE
|
||||||
|
|
||||||
|
Generated 0 of 3 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 = 3.3
|
||||||
|
ghost atom cutoff = 3.3
|
||||||
|
binsize = 1.65, bins = 73 49 1
|
||||||
|
8 neighbor lists, perpetual/occasional/extra = 7 1 0
|
||||||
|
(1) pair rheo, perpetual, half/full from (3)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: halffull/newtoff
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(2) pair rheo/solid, perpetual, trim from (4)
|
||||||
|
attributes: half, newton off, cut 1.3
|
||||||
|
pair build: trim
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(3) compute RHEO/KERNEL, perpetual
|
||||||
|
attributes: full, newton off
|
||||||
|
pair build: full/bin
|
||||||
|
stencil: full/bin/2d
|
||||||
|
bin: standard
|
||||||
|
(4) compute RHEO/GRAD, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(5) compute RHEO/VSHIFT, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(6) compute RHEO/SURFACE, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(7) fix rheo/thermal, occasional, trim from (4)
|
||||||
|
attributes: half, newton off, cut 3
|
||||||
|
pair build: trim
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(8) fix rheo/oxidation, perpetual, trim from (3)
|
||||||
|
attributes: full, newton off, cut 1.8
|
||||||
|
pair build: trim
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
Per MPI rank memory allocation (min/avg/max) = 25.96 | 25.96 | 25.96 Mbytes
|
||||||
|
Step Time KinEng Press Atoms
|
||||||
|
0 0 0 0 2701
|
||||||
|
200 20 4.1743799e-07 1.1743617e-07 2701
|
||||||
|
400 40 1.6697519e-06 4.6974469e-07 2701
|
||||||
|
600 60 3.7127333e-06 1.0646825e-05 2701
|
||||||
|
800 80 4.6683656e-06 0.00015182605 2701
|
||||||
|
1000 100 4.7368707e-06 0.00028128761 2701
|
||||||
|
1200 120 3.4384322e-06 0.00045913378 2701
|
||||||
|
1400 140 1.4119866e-06 0.00055627091 2701
|
||||||
|
1600 160 4.4114517e-07 0.00058247308 2701
|
||||||
|
1800 180 4.8289229e-07 0.0005510948 2701
|
||||||
|
2000 200 1.8494183e-06 0.00048386222 2701
|
||||||
|
2200 220 3.3319816e-06 0.00037903264 2701
|
||||||
|
2400 240 3.8128922e-06 0.00024115906 2701
|
||||||
|
2600 260 3.1943401e-06 9.727407e-05 2701
|
||||||
|
2800 280 1.6172816e-06 -2.632162e-05 2701
|
||||||
|
3000 300 3.6100709e-07 -8.5761867e-05 2701
|
||||||
|
3200 320 1.4745502e-07 -5.9204127e-05 2701
|
||||||
|
3400 340 8.3369782e-07 8.8312464e-07 2701
|
||||||
|
3600 360 2.0484052e-06 5.8521477e-05 2701
|
||||||
|
3800 380 3.1639387e-06 0.0001685663 2701
|
||||||
|
4000 400 3.1692907e-06 0.00026875988 2701
|
||||||
|
4200 420 2.391933e-06 0.00038621787 2701
|
||||||
|
4400 440 1.1964404e-06 0.00048901286 2701
|
||||||
|
4600 460 4.0508824e-07 0.00051863639 2701
|
||||||
|
4800 480 5.4908507e-07 0.00049263754 2701
|
||||||
|
5000 500 1.3139665e-06 0.00041984264 2701
|
||||||
|
5200 520 2.1939161e-06 0.00033095351 2701
|
||||||
|
5400 540 2.3687031e-06 0.00022422981 2701
|
||||||
|
5600 560 1.8280882e-06 0.00011544328 2701
|
||||||
|
5800 580 8.8610517e-07 2.9307791e-05 2701
|
||||||
|
6000 600 2.0989359e-07 -1.7340941e-05 2701
|
||||||
|
6200 620 2.8658301e-07 -8.1237835e-06 2701
|
||||||
|
6400 640 9.7636239e-07 4.3755922e-05 2701
|
||||||
|
6600 660 1.891303e-06 0.0001185719 2701
|
||||||
|
6800 680 2.4149904e-06 0.00020830273 2701
|
||||||
|
7000 700 2.3174953e-06 0.00030114767 2701
|
||||||
|
7200 720 1.7918612e-06 0.00037821537 2701
|
||||||
|
7400 740 1.2114987e-06 0.0004233475 2701
|
||||||
|
7600 760 9.9661553e-07 0.00042958263 2701
|
||||||
|
7800 780 1.1552559e-06 0.00039944618 2701
|
||||||
|
8000 800 1.5249138e-06 0.00034034478 2701
|
||||||
|
8200 820 1.7453861e-06 0.00026826463 2701
|
||||||
|
8400 840 1.6259021e-06 0.00019131768 2701
|
||||||
|
8600 860 1.2612805e-06 0.0001162957 2701
|
||||||
|
8800 880 8.6964518e-07 7.1771506e-05 2701
|
||||||
|
9000 900 7.6892472e-07 5.6170687e-05 2701
|
||||||
|
9200 920 1.0780045e-06 7.1925995e-05 2701
|
||||||
|
9400 940 1.6514902e-06 0.00011635293 2701
|
||||||
|
9600 960 2.1891377e-06 0.00017599885 2701
|
||||||
|
9800 980 2.4551701e-06 0.00024127934 2701
|
||||||
|
10000 1000 2.4277051e-06 0.00029918622 2701
|
||||||
|
10200 1020 2.2655987e-06 0.00034067996 2701
|
||||||
|
10400 1040 2.1767207e-06 0.00035598133 2701
|
||||||
|
10600 1060 2.2796719e-06 0.00034359076 2701
|
||||||
|
10800 1080 2.4884225e-06 0.00030749714 2701
|
||||||
|
11000 1100 2.6387215e-06 0.00025725198 2701
|
||||||
|
11200 1120 2.5968908e-06 0.00020170699 2701
|
||||||
|
11400 1140 2.4108931e-06 0.00015185858 2701
|
||||||
|
11600 1160 2.2375166e-06 0.00011800349 2701
|
||||||
|
11800 1180 2.2407196e-06 0.00010646971 2701
|
||||||
|
12000 1200 2.4845263e-06 0.00011817498 2701
|
||||||
|
12200 1220 2.8733204e-06 0.00015013186 2701
|
||||||
|
12400 1240 3.2437087e-06 0.00019211975 2701
|
||||||
|
12600 1260 3.4732728e-06 0.00023620276 2701
|
||||||
|
12800 1280 3.5836611e-06 0.00027352269 2701
|
||||||
|
13000 1300 3.6592211e-06 0.00029533734 2701
|
||||||
|
13200 1320 3.782506e-06 0.00030032559 2701
|
||||||
|
13400 1340 3.9807086e-06 0.00028395722 2701
|
||||||
|
13600 1360 4.2023176e-06 0.00025390325 2701
|
||||||
|
13800 1380 4.3559781e-06 0.00021794236 2701
|
||||||
|
14000 1400 4.4273371e-06 0.00018026034 2701
|
||||||
|
14200 1420 4.49867e-06 0.0001526569 2701
|
||||||
|
14400 1440 4.6591574e-06 0.00013707051 2701
|
||||||
|
14600 1460 4.9589583e-06 0.00013803875 2701
|
||||||
|
14800 1480 5.3859375e-06 0.00015455425 2701
|
||||||
|
15000 1500 5.8639557e-06 0.00017954785 2701
|
||||||
|
15200 1520 6.3075561e-06 0.0002084257 2701
|
||||||
|
15400 1540 6.7022179e-06 0.0002347669 2701
|
||||||
|
15600 1560 7.0789688e-06 0.00025020766 2701
|
||||||
|
15800 1580 7.4734777e-06 0.00025394845 2701
|
||||||
|
16000 1600 7.8884743e-06 0.00024571725 2701
|
||||||
|
16200 1620 8.3224059e-06 0.00022706648 2701
|
||||||
|
16400 1640 8.7337783e-06 0.00020320706 2701
|
||||||
|
16600 1660 9.1454649e-06 0.00017824346 2701
|
||||||
|
16800 1680 9.5948793e-06 0.00015961835 2701
|
||||||
|
17000 1700 1.0106407e-05 0.00015135471 2701
|
||||||
|
17200 1720 1.0707273e-05 0.00015166884 2701
|
||||||
|
17400 1740 1.1392597e-05 0.0001645916 2701
|
||||||
|
17600 1760 1.2118829e-05 0.00018119729 2701
|
||||||
|
17800 1780 1.2846056e-05 0.0002003616 2701
|
||||||
|
18000 1800 1.3555288e-05 0.00021585952 2701
|
||||||
|
18200 1820 1.4301024e-05 0.00022290158 2701
|
||||||
|
18400 1840 1.5089217e-05 0.00021970192 2701
|
||||||
|
18600 1860 1.5902351e-05 0.00020911128 2701
|
||||||
|
18800 1880 1.6753175e-05 0.00019278718 2701
|
||||||
|
19000 1900 1.7602996e-05 0.00017584076 2701
|
||||||
|
19200 1920 1.8479378e-05 0.00016206226 2701
|
||||||
|
19400 1940 1.9421603e-05 0.00015575677 2701
|
||||||
|
19600 1960 2.0477421e-05 0.00015687558 2701
|
||||||
|
19800 1980 2.1617288e-05 0.00016424998 2701
|
||||||
|
20000 2000 2.2814347e-05 0.00017466664 2701
|
||||||
|
20200 2020 2.4029097e-05 0.00018647149 2701
|
||||||
|
20400 2040 2.5255953e-05 0.00019516077 2701
|
||||||
|
20600 2060 2.649418e-05 0.00019906384 2701
|
||||||
|
20800 2080 2.7755897e-05 0.00019630586 2701
|
||||||
|
21000 2100 2.9067854e-05 0.00018674721 2701
|
||||||
|
21200 2120 3.0396477e-05 0.0001758048 2701
|
||||||
|
21400 2140 3.1759719e-05 0.00016782801 2701
|
||||||
|
21600 2160 3.3193597e-05 0.00016324138 2701
|
||||||
|
21800 2180 3.4729384e-05 0.00016124274 2701
|
||||||
|
22000 2200 3.6367594e-05 0.00016437457 2701
|
||||||
|
22200 2220 3.8095131e-05 0.00017015573 2701
|
||||||
|
22400 2240 3.9867003e-05 0.00017649465 2701
|
||||||
|
22600 2260 4.169511e-05 0.00018111374 2701
|
||||||
|
22800 2280 4.3566134e-05 0.00018104136 2701
|
||||||
|
23000 2300 4.5461538e-05 0.00017822707 2701
|
||||||
|
23200 2320 4.7377333e-05 0.00017285066 2701
|
||||||
|
23400 2340 4.9354403e-05 0.00016826524 2701
|
||||||
|
23600 2360 5.1399791e-05 0.00016517913 2701
|
||||||
|
23800 2380 5.3510931e-05 0.00016299649 2701
|
||||||
|
24000 2400 5.5681048e-05 0.00016256674 2701
|
||||||
|
24200 2420 5.7902429e-05 0.00016513449 2701
|
||||||
|
24400 2440 6.0216049e-05 0.00016895109 2701
|
||||||
|
24600 2460 6.270982e-05 0.00016946227 2701
|
||||||
|
24800 2480 6.5390117e-05 0.00016589426 2701
|
||||||
|
25000 2500 6.8121899e-05 0.00016241676 2701
|
||||||
|
25200 2520 7.0947331e-05 0.00015624292 2701
|
||||||
|
25400 2540 7.4304148e-05 0.0001449537 2701
|
||||||
|
25600 2560 7.7745077e-05 0.00013179658 2701
|
||||||
|
25800 2580 8.0739829e-05 0.00013098838 2701
|
||||||
|
26000 2600 8.3827874e-05 0.00014278841 2701
|
||||||
|
26200 2620 8.7060677e-05 0.00015381649 2701
|
||||||
|
26400 2640 9.0266508e-05 0.00016130999 2701
|
||||||
|
26600 2660 9.3339049e-05 0.00016908268 2701
|
||||||
|
26800 2680 9.6347013e-05 0.00016771087 2701
|
||||||
|
27000 2700 9.9294711e-05 0.00016577315 2701
|
||||||
|
27200 2720 0.00010230007 0.0001670893 2701
|
||||||
|
27400 2740 0.00010547172 0.00016569077 2701
|
||||||
|
27600 2760 0.00010872426 0.00016506303 2701
|
||||||
|
27800 2780 0.00011201844 0.00016482702 2701
|
||||||
|
28000 2800 0.00011532129 0.00016694886 2701
|
||||||
|
28200 2820 0.00011869854 0.00016163005 2701
|
||||||
|
28400 2840 0.00012209747 0.00015339281 2701
|
||||||
|
28600 2860 0.00012549322 0.00014765883 2701
|
||||||
|
28800 2880 0.00012898685 0.00014241765 2701
|
||||||
|
29000 2900 0.00013259039 0.00014215724 2701
|
||||||
|
29200 2920 0.00013628209 0.00014881155 2701
|
||||||
|
29400 2940 0.00014001213 0.00015671333 2701
|
||||||
|
29600 2960 0.00014379216 0.00016446215 2701
|
||||||
|
29800 2980 0.00014764687 0.0001639602 2701
|
||||||
|
30000 3000 0.00015142301 0.00015664816 2701
|
||||||
|
30200 3020 0.00015496407 0.00015545099 2701
|
||||||
|
30400 3040 0.00015797338 0.00015368625 2701
|
||||||
|
30600 3060 0.00016042141 0.00015679918 2701
|
||||||
|
30800 3080 0.00016244716 0.00016093678 2701
|
||||||
|
31000 3100 0.00016202247 0.00016066954 2701
|
||||||
|
31200 3120 0.0001613312 0.00015932059 2701
|
||||||
|
31400 3140 0.00016274961 0.00015988567 2701
|
||||||
|
31600 3160 0.00016541518 0.00015724809 2701
|
||||||
|
31800 3180 0.00016809362 0.00015498827 2701
|
||||||
|
32000 3200 0.00017067801 0.00014830489 2701
|
||||||
|
32200 3220 0.00017333906 0.00014371345 2701
|
||||||
|
32400 3240 0.0001759011 0.00014421259 2701
|
||||||
|
32600 3260 0.00017849952 0.00014228443 2701
|
||||||
|
32800 3280 0.00017801812 0.00014117391 2701
|
||||||
|
33000 3300 0.00017718857 0.00014644675 2701
|
||||||
|
33200 3320 0.00017833666 0.0001291286 2701
|
||||||
|
33400 3340 0.000178576 0.00014878558 2701
|
||||||
|
33600 3360 0.00017846711 0.00013905481 2701
|
||||||
|
33800 3380 0.00017822937 0.00015535996 2701
|
||||||
|
34000 3400 0.00017899663 0.00016094303 2701
|
||||||
|
34200 3420 0.00017924661 0.00015017553 2701
|
||||||
|
34400 3440 0.00018024855 0.00014723549 2701
|
||||||
|
34600 3460 0.00018143865 0.00013903131 2701
|
||||||
|
34800 3480 0.00018258173 0.00013722112 2701
|
||||||
|
35000 3500 0.00018404873 0.00014675949 2701
|
||||||
|
35200 3520 0.00018538521 0.00015108242 2701
|
||||||
|
35400 3540 0.00018669649 0.00014564852 2701
|
||||||
|
35600 3560 0.00018814608 0.00013762161 2701
|
||||||
|
35800 3580 0.00018967415 0.00014602307 2701
|
||||||
|
36000 3600 0.00019146735 0.000126909 2701
|
||||||
|
36200 3620 0.00019414036 0.00012384379 2701
|
||||||
|
36400 3640 0.00019613057 0.00011059573 2701
|
||||||
|
36600 3660 0.00019897104 0.00013621801 2701
|
||||||
|
36800 3680 0.00020169688 0.00013665462 2701
|
||||||
|
37000 3700 0.00020447655 0.00013929258 2701
|
||||||
|
37200 3720 0.00020711105 0.0001363895 2701
|
||||||
|
37400 3740 0.00021077854 0.00013610672 2701
|
||||||
|
37600 3760 0.00021303084 0.00015051235 2701
|
||||||
|
37800 3780 0.00021619561 0.00012664801 2701
|
||||||
|
38000 3800 0.0002194018 0.00012808247 2701
|
||||||
|
38200 3820 0.00022242646 0.0001360174 2701
|
||||||
|
38400 3840 0.00022531568 0.00013311221 2701
|
||||||
|
38600 3860 0.00022821731 0.00013523939 2701
|
||||||
|
38800 3880 0.000231228 0.00014090695 2701
|
||||||
|
39000 3900 0.00023404038 0.00013661835 2701
|
||||||
|
39200 3920 0.00023755044 0.00013659469 2701
|
||||||
|
39400 3940 0.00024009059 0.00012097907 2701
|
||||||
|
39600 3960 0.0002432098 9.7877876e-05 2701
|
||||||
|
39800 3980 0.00024475294 0.0001164688 2701
|
||||||
|
40000 4000 0.00024171274 0.00012432219 2701
|
||||||
|
Loop time of 192.659 on 4 procs for 40000 steps with 2701 atoms
|
||||||
|
|
||||||
|
Performance: 1793840.118 tau/day, 207.620 timesteps/s, 560.783 katom-step/s
|
||||||
|
99.6% CPU use with 4 MPI tasks x no OpenMP threads
|
||||||
|
|
||||||
|
MPI task timing breakdown:
|
||||||
|
Section | min time | avg time | max time |%varavg| %total
|
||||||
|
---------------------------------------------------------------
|
||||||
|
Pair | 16.881 | 24.402 | 30.74 | 114.6 | 12.67
|
||||||
|
Bond | 1.1126 | 1.8917 | 2.6935 | 43.3 | 0.98
|
||||||
|
Neigh | 35.387 | 35.508 | 35.625 | 1.5 | 18.43
|
||||||
|
Comm | 1.5499 | 1.6694 | 1.8006 | 7.4 | 0.87
|
||||||
|
Output | 0.99755 | 1.0072 | 1.0165 | 0.8 | 0.52
|
||||||
|
Modify | 120.6 | 127.43 | 135.54 | 54.8 | 66.14
|
||||||
|
Other | | 0.7553 | | | 0.39
|
||||||
|
|
||||||
|
Nlocal: 675.25 ave 1373 max 7 min
|
||||||
|
Histogram: 2 0 0 0 0 0 0 0 0 2
|
||||||
|
Nghost: 103 ave 163 max 50 min
|
||||||
|
Histogram: 2 0 0 0 0 0 0 0 1 1
|
||||||
|
Neighs: 10509 ave 21592 max 126 min
|
||||||
|
Histogram: 2 0 0 0 0 0 0 0 0 2
|
||||||
|
FullNghs: 20367 ave 41981 max 141 min
|
||||||
|
Histogram: 2 0 0 0 0 0 0 0 0 2
|
||||||
|
|
||||||
|
Total # of neighbors = 81468
|
||||||
|
Ave neighs/atom = 30.162162
|
||||||
|
Ave special neighs/atom = 1.6593854
|
||||||
|
Neighbor list builds = 39932
|
||||||
|
Dangerous builds = 0
|
||||||
|
|
||||||
|
Total wall time: 0:03:12
|
||||||
75
examples/rheo/poiseuille/in.rheo.poiseuille
Normal file
75
examples/rheo/poiseuille/in.rheo.poiseuille
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
# ------ 2D Poiseuille flow ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style rheo
|
||||||
|
boundary p p p
|
||||||
|
comm_modify vel yes
|
||||||
|
|
||||||
|
# ------ Create simulation box ------ #
|
||||||
|
|
||||||
|
variable n equal 1.0
|
||||||
|
variable cut equal 3.0
|
||||||
|
|
||||||
|
region box block 0 20 -10 10 -0.01 0.01
|
||||||
|
create_box 2 box
|
||||||
|
lattice sq ${n}
|
||||||
|
|
||||||
|
region inner block INF INF -7.5 7.5 INF INF units box
|
||||||
|
region walls block INF INF -7.5 7.5 INF INF units box side out
|
||||||
|
|
||||||
|
create_atoms 2 region walls
|
||||||
|
create_atoms 1 region inner
|
||||||
|
|
||||||
|
group fluid type 1
|
||||||
|
group rig type 2
|
||||||
|
|
||||||
|
displace_atoms fluid random 0.1 0.1 0 135414 units box
|
||||||
|
|
||||||
|
# ------ Model parameters ------ #
|
||||||
|
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable zeta equal 1.0
|
||||||
|
variable kappa equal 1.0*${rho0}/${mp}
|
||||||
|
variable fext equal 1e-4/${n}
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable Dr equal 0.05*${cut}*${cs}
|
||||||
|
|
||||||
|
variable eta equal 0.1
|
||||||
|
variable gd0 equal 5e-4
|
||||||
|
variable npow equal 0.5
|
||||||
|
variable K equal 0.001
|
||||||
|
|
||||||
|
mass * ${mp}
|
||||||
|
set group all rheo/rho ${rho0}
|
||||||
|
set group all rheo/status 0
|
||||||
|
set group rig rheo/status 1
|
||||||
|
|
||||||
|
timestep ${dt_max}
|
||||||
|
|
||||||
|
pair_style rheo ${cut} artificial/visc ${zeta} rho/damp ${Dr}
|
||||||
|
pair_coeff * *
|
||||||
|
|
||||||
|
# ------ Fixes & computes ------ #
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} quintic 0 shift
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
#fix 2 all rheo/viscosity * power ${eta} ${gd0} ${K} ${npow}
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 rig setforce 0.0 0.0 0.0
|
||||||
|
fix 5 fluid addforce ${fext} 0.0 0.0
|
||||||
|
fix 6 all enforce2d
|
||||||
|
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 200
|
||||||
|
thermo_style custom step time ke press
|
||||||
|
|
||||||
|
#dump 1 all custom 200 atomDump id type x y vx vy fx fy c_rho
|
||||||
|
|
||||||
|
run 20000
|
||||||
|
|
||||||
288
examples/rheo/poiseuille/log.17Apr2024.poiseuille.g++.4
Normal file
288
examples/rheo/poiseuille/log.17Apr2024.poiseuille.g++.4
Normal file
@ -0,0 +1,288 @@
|
|||||||
|
LAMMPS (17 Apr 2024 - Development - patch_5May2020-18508-g3c0eaf6870-modified)
|
||||||
|
# ------ 2D Poiseuille flow ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style rheo
|
||||||
|
boundary p p p
|
||||||
|
comm_modify vel yes
|
||||||
|
|
||||||
|
# ------ Create simulation box ------ #
|
||||||
|
|
||||||
|
variable n equal 1.0
|
||||||
|
variable cut equal 3.0
|
||||||
|
|
||||||
|
region box block 0 20 -10 10 -0.01 0.01
|
||||||
|
create_box 2 box
|
||||||
|
Created orthogonal box = (0 -10 -0.01) to (20 10 0.01)
|
||||||
|
2 by 2 by 1 MPI processor grid
|
||||||
|
lattice sq ${n}
|
||||||
|
lattice sq 1
|
||||||
|
Lattice spacing in x,y,z = 1 1 1
|
||||||
|
|
||||||
|
region inner block INF INF -7.5 7.5 INF INF units box
|
||||||
|
region walls block INF INF -7.5 7.5 INF INF units box side out
|
||||||
|
|
||||||
|
create_atoms 2 region walls
|
||||||
|
Created 100 atoms
|
||||||
|
using lattice units in orthogonal box = (0 -10 -0.01) to (20 10 0.01)
|
||||||
|
create_atoms CPU = 0.000 seconds
|
||||||
|
create_atoms 1 region inner
|
||||||
|
Created 300 atoms
|
||||||
|
using lattice units in orthogonal box = (0 -10 -0.01) to (20 10 0.01)
|
||||||
|
create_atoms CPU = 0.000 seconds
|
||||||
|
|
||||||
|
group fluid type 1
|
||||||
|
300 atoms in group fluid
|
||||||
|
group rig type 2
|
||||||
|
100 atoms in group rig
|
||||||
|
|
||||||
|
displace_atoms fluid random 0.1 0.1 0 135414 units box
|
||||||
|
Displacing atoms ...
|
||||||
|
|
||||||
|
# ------ Model parameters ------ #
|
||||||
|
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable mp equal 1/${n}
|
||||||
|
variable mp equal 1/1
|
||||||
|
variable zeta equal 1.0
|
||||||
|
variable kappa equal 1.0*${rho0}/${mp}
|
||||||
|
variable kappa equal 1.0*1/${mp}
|
||||||
|
variable kappa equal 1.0*1/1
|
||||||
|
variable fext equal 1e-4/${n}
|
||||||
|
variable fext equal 1e-4/1
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable dt_max equal 0.1*3/${cs}/3
|
||||||
|
variable dt_max equal 0.1*3/1/3
|
||||||
|
variable Dr equal 0.05*${cut}*${cs}
|
||||||
|
variable Dr equal 0.05*3*${cs}
|
||||||
|
variable Dr equal 0.05*3*1
|
||||||
|
|
||||||
|
variable eta equal 0.1
|
||||||
|
variable gd0 equal 5e-4
|
||||||
|
variable npow equal 0.5
|
||||||
|
variable K equal 0.001
|
||||||
|
|
||||||
|
mass * ${mp}
|
||||||
|
mass * 1
|
||||||
|
set group all rheo/rho ${rho0}
|
||||||
|
set group all rheo/rho 1
|
||||||
|
Setting atom values ...
|
||||||
|
400 settings made for rheo/rho
|
||||||
|
set group all rheo/status 0
|
||||||
|
Setting atom values ...
|
||||||
|
400 settings made for rheo/status
|
||||||
|
set group rig rheo/status 1
|
||||||
|
Setting atom values ...
|
||||||
|
100 settings made for rheo/status
|
||||||
|
|
||||||
|
timestep ${dt_max}
|
||||||
|
timestep 0.1
|
||||||
|
|
||||||
|
pair_style rheo ${cut} artificial/visc ${zeta} rho/damp ${Dr}
|
||||||
|
pair_style rheo 3 artificial/visc ${zeta} rho/damp ${Dr}
|
||||||
|
pair_style rheo 3 artificial/visc 1 rho/damp ${Dr}
|
||||||
|
pair_style rheo 3 artificial/visc 1 rho/damp 0.15
|
||||||
|
pair_coeff * *
|
||||||
|
|
||||||
|
# ------ Fixes & computes ------ #
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} quintic 0 shift
|
||||||
|
fix 1 all rheo 3 quintic 0 shift
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
fix 2 all rheo/viscosity * constant 0.1
|
||||||
|
#fix 2 all rheo/viscosity * power ${eta} ${gd0} ${K} ${npow}
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 rig setforce 0.0 0.0 0.0
|
||||||
|
fix 5 fluid addforce ${fext} 0.0 0.0
|
||||||
|
fix 5 fluid addforce 0.0001 0.0 0.0
|
||||||
|
fix 6 all enforce2d
|
||||||
|
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 200
|
||||||
|
thermo_style custom step time ke press
|
||||||
|
|
||||||
|
dump 1 all custom 200 atomDump id type x y vx vy fx fy c_rho
|
||||||
|
|
||||||
|
run 20000
|
||||||
|
|
||||||
|
CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE
|
||||||
|
|
||||||
|
Your simulation uses code contributions which should be cited:
|
||||||
|
|
||||||
|
- @article{PalermoInPrep,
|
||||||
|
journal = {in prep},
|
||||||
|
title = {RHEO: A Hybrid Mesh-Free Model Framework for Dynamic Multi-Phase Flows},
|
||||||
|
year = {2024},
|
||||||
|
author = {Eric T. Palermo and Ki T. Wolf and Joel T. Clemmer and Thomas C. O'Connor},
|
||||||
|
}
|
||||||
|
|
||||||
|
CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE
|
||||||
|
|
||||||
|
Generated 0 of 1 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 = 3.3
|
||||||
|
ghost atom cutoff = 3.3
|
||||||
|
binsize = 1.65, bins = 13 13 1
|
||||||
|
4 neighbor lists, perpetual/occasional/extra = 4 0 0
|
||||||
|
(1) pair rheo, perpetual, half/full from (2)
|
||||||
|
attributes: half, newton on
|
||||||
|
pair build: halffull/newton
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(2) compute RHEO/KERNEL, perpetual
|
||||||
|
attributes: full, newton on
|
||||||
|
pair build: full/bin/atomonly
|
||||||
|
stencil: full/bin/2d
|
||||||
|
bin: standard
|
||||||
|
(3) compute RHEO/GRAD, perpetual, copy from (1)
|
||||||
|
attributes: half, newton on
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(4) compute RHEO/VSHIFT, perpetual, copy from (1)
|
||||||
|
attributes: half, newton on
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
Per MPI rank memory allocation (min/avg/max) = 5.693 | 5.693 | 5.693 Mbytes
|
||||||
|
Step Time KinEng Press
|
||||||
|
0 0 0 0
|
||||||
|
200 20 1.2220462e-06 3.7383146e-05
|
||||||
|
400 40 4.345762e-06 7.5866885e-05
|
||||||
|
600 60 8.8559433e-06 0.00011353743
|
||||||
|
800 80 1.4370506e-05 0.00015135634
|
||||||
|
1000 100 2.0576198e-05 0.00018903722
|
||||||
|
1200 120 2.721926e-05 0.00022533997
|
||||||
|
1400 140 3.4099653e-05 0.00026016069
|
||||||
|
1600 160 4.1064175e-05 0.00029445207
|
||||||
|
1800 180 4.8001225e-05 0.00032893763
|
||||||
|
2000 200 5.4832849e-05 0.00036402396
|
||||||
|
2200 220 6.1508431e-05 0.00039945249
|
||||||
|
2400 240 6.8000141e-05 0.00043534411
|
||||||
|
2600 260 7.430136e-05 0.00046943441
|
||||||
|
2800 280 8.0415328e-05 0.00049807225
|
||||||
|
3000 300 8.6335032e-05 0.00051815375
|
||||||
|
3200 320 9.2021626e-05 0.00052618224
|
||||||
|
3400 340 9.7387936e-05 0.00051877918
|
||||||
|
3600 360 0.00010231526 0.00048650828
|
||||||
|
3800 380 0.00010676617 0.00044578079
|
||||||
|
4000 400 0.00011080098 0.00044777126
|
||||||
|
4200 420 0.00011448127 0.00047047629
|
||||||
|
4400 440 0.00011787852 0.00050280249
|
||||||
|
4600 460 0.00012106805 0.0005397213
|
||||||
|
4800 480 0.00012412056 0.00057885539
|
||||||
|
5000 500 0.0001271078 0.00061396896
|
||||||
|
5200 520 0.00013006637 0.00063981812
|
||||||
|
5400 540 0.00013295039 0.00065094073
|
||||||
|
5600 560 0.00013561487 0.00063918847
|
||||||
|
5800 580 0.00013791796 0.00059087656
|
||||||
|
6000 600 0.00013983422 0.00052171998
|
||||||
|
6200 620 0.00014144833 0.00050658002
|
||||||
|
6400 640 0.00014286538 0.0005248626
|
||||||
|
6600 660 0.00014417734 0.00055826606
|
||||||
|
6800 680 0.00014546931 0.00060063748
|
||||||
|
7000 700 0.00014682553 0.00064421411
|
||||||
|
7200 720 0.0001482833 0.00068252242
|
||||||
|
7400 740 0.00014977996 0.00070671308
|
||||||
|
7600 760 0.00015114829 0.00069774026
|
||||||
|
7800 780 0.0001522719 0.00064408311
|
||||||
|
8000 800 0.00015312897 0.00055977044
|
||||||
|
8200 820 0.00015375669 0.0005225573
|
||||||
|
8400 840 0.00015425683 0.00053833691
|
||||||
|
8600 860 0.00015471278 0.00057447427
|
||||||
|
8800 880 0.0001552059 0.00061980921
|
||||||
|
9000 900 0.00015581593 0.0006659836
|
||||||
|
9200 920 0.0001565564 0.00070813532
|
||||||
|
9400 940 0.00015733573 0.00073378551
|
||||||
|
9600 960 0.00015802107 0.00071560835
|
||||||
|
9800 980 0.00015855339 0.00065636189
|
||||||
|
10000 1000 0.00015890743 0.0005699855
|
||||||
|
10200 1020 0.00015908095 0.00053138971
|
||||||
|
10400 1040 0.00015915523 0.00054790708
|
||||||
|
10600 1060 0.00015921254 0.00058899454
|
||||||
|
10800 1080 0.00015934193 0.00063964906
|
||||||
|
11000 1100 0.00015959891 0.00069241358
|
||||||
|
11200 1120 0.0001599636 0.00073734651
|
||||||
|
11400 1140 0.00016036526 0.00074477329
|
||||||
|
11600 1160 0.00016075471 0.00071047555
|
||||||
|
11800 1180 0.00016109516 0.00064173183
|
||||||
|
12000 1200 0.00016131524 0.00055500553
|
||||||
|
12200 1220 0.00016136366 0.0005290215
|
||||||
|
12400 1240 0.0001613025 0.00055124296
|
||||||
|
12600 1260 0.00016123023 0.00059758627
|
||||||
|
12800 1280 0.00016123043 0.00065488735
|
||||||
|
13000 1300 0.00016132935 0.0007140876
|
||||||
|
13200 1320 0.00016152165 0.00074795629
|
||||||
|
13400 1340 0.00016180372 0.00074730778
|
||||||
|
13600 1360 0.00016216585 0.00071370995
|
||||||
|
13800 1380 0.0001625339 0.00065176323
|
||||||
|
14000 1400 0.00016274999 0.00057515371
|
||||||
|
14200 1420 0.00016271295 0.00055878258
|
||||||
|
14400 1440 0.00016249768 0.00058448193
|
||||||
|
14600 1460 0.00016223675 0.00063096229
|
||||||
|
14800 1480 0.00016201846 0.00068639548
|
||||||
|
15000 1500 0.00016190593 0.00072444357
|
||||||
|
15200 1520 0.00016194466 0.00073830636
|
||||||
|
15400 1540 0.00016216164 0.00072773256
|
||||||
|
15600 1560 0.00016253174 0.00069215481
|
||||||
|
15800 1580 0.00016290895 0.00063239408
|
||||||
|
16000 1600 0.00016306463 0.00057466273
|
||||||
|
16200 1620 0.00016292218 0.00057951567
|
||||||
|
16400 1640 0.00016261117 0.00061504156
|
||||||
|
16600 1660 0.00016225906 0.00066066637
|
||||||
|
16800 1680 0.00016197993 0.00069751908
|
||||||
|
17000 1700 0.0001618568 0.00072202303
|
||||||
|
17200 1720 0.00016194264 0.00073255034
|
||||||
|
17400 1740 0.00016225911 0.0007231031
|
||||||
|
17600 1760 0.00016270465 0.00068931224
|
||||||
|
17800 1780 0.00016304053 0.00062934836
|
||||||
|
18000 1800 0.00016302624 0.00058060272
|
||||||
|
18200 1820 0.00016274847 0.00058859513
|
||||||
|
18400 1840 0.00016236893 0.00061804803
|
||||||
|
18600 1860 0.00016202777 0.00065393237
|
||||||
|
18800 1880 0.0001618184 0.00068747094
|
||||||
|
19000 1900 0.0001618044 0.00071352541
|
||||||
|
19200 1920 0.00016204402 0.00072351769
|
||||||
|
19400 1940 0.00016249999 0.00071330322
|
||||||
|
19600 1960 0.00016297924 0.00067984167
|
||||||
|
19800 1980 0.00016317435 0.00061634142
|
||||||
|
20000 2000 0.00016301186 0.00057234115
|
||||||
|
Loop time of 15.6198 on 4 procs for 20000 steps with 400 atoms
|
||||||
|
|
||||||
|
Performance: 11062881.511 tau/day, 1280.426 timesteps/s, 512.170 katom-step/s
|
||||||
|
99.7% CPU use with 4 MPI tasks x no OpenMP threads
|
||||||
|
|
||||||
|
MPI task timing breakdown:
|
||||||
|
Section | min time | avg time | max time |%varavg| %total
|
||||||
|
---------------------------------------------------------------
|
||||||
|
Pair | 2.1979 | 2.4473 | 2.6992 | 15.7 | 15.67
|
||||||
|
Neigh | 0.024709 | 0.027006 | 0.029223 | 1.3 | 0.17
|
||||||
|
Comm | 0.4657 | 0.71686 | 0.9662 | 29.0 | 4.59
|
||||||
|
Output | 0.033698 | 0.036781 | 0.039359 | 1.1 | 0.24
|
||||||
|
Modify | 12.306 | 12.313 | 12.319 | 0.2 | 78.83
|
||||||
|
Other | | 0.07916 | | | 0.51
|
||||||
|
|
||||||
|
Nlocal: 100 ave 107 max 93 min
|
||||||
|
Histogram: 1 0 0 1 0 0 1 0 0 1
|
||||||
|
Nghost: 185.5 ave 192 max 179 min
|
||||||
|
Histogram: 1 0 0 1 0 0 1 0 0 1
|
||||||
|
Neighs: 1712 ave 1848 max 1598 min
|
||||||
|
Histogram: 1 0 1 0 0 1 0 0 0 1
|
||||||
|
FullNghs: 3424 ave 3682 max 3174 min
|
||||||
|
Histogram: 1 0 1 0 0 0 1 0 0 1
|
||||||
|
|
||||||
|
Total # of neighbors = 13696
|
||||||
|
Ave neighs/atom = 34.24
|
||||||
|
Neighbor list builds = 331
|
||||||
|
Dangerous builds = 0
|
||||||
|
|
||||||
|
|
||||||
|
Total wall time: 0:00:15
|
||||||
65
examples/rheo/taylor-green/in.rheo.taylor.green
Normal file
65
examples/rheo/taylor-green/in.rheo.taylor.green
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# ------ 2D Taylor Green vortex ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style rheo
|
||||||
|
boundary p p p
|
||||||
|
comm_modify vel yes
|
||||||
|
newton off
|
||||||
|
|
||||||
|
# ------ Create simulation box ------ #
|
||||||
|
|
||||||
|
variable n equal 1.0
|
||||||
|
variable cut equal 3.0
|
||||||
|
|
||||||
|
region box block 0 40 0 40 -0.01 0.01
|
||||||
|
create_box 1 box
|
||||||
|
lattice sq ${n}
|
||||||
|
|
||||||
|
create_atoms 1 region box
|
||||||
|
|
||||||
|
displace_atoms all random 0.1 0.1 0 135414 units box
|
||||||
|
|
||||||
|
# ------ Model parameters ------ #
|
||||||
|
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable eta equal 0.05
|
||||||
|
variable zeta equal 1
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable Dr equal 0.1*${cut}*${cs}
|
||||||
|
|
||||||
|
mass * ${mp}
|
||||||
|
set group all rheo/rho ${rho0}
|
||||||
|
set group all rheo/status 0
|
||||||
|
|
||||||
|
variable u0 equal 0.05
|
||||||
|
variable uy atom ${u0}*sin(2*PI*x/lx)*cos(2*PI*y/ly)
|
||||||
|
variable ux atom -${u0}*sin(2*PI*y/ly)*cos(2*PI*x/ly)
|
||||||
|
variable d0 atom ${rho0}-${u0}*${u0}*${rho0}*0.25*(cos(4*PI*x/lx)+cos(4*PI*y/ly))/${cs}/${cs}
|
||||||
|
|
||||||
|
velocity all set v_ux v_uy 0.0 units box
|
||||||
|
|
||||||
|
timestep ${dt_max}
|
||||||
|
|
||||||
|
pair_style rheo ${cut} artificial/visc ${zeta} rho/damp ${Dr}
|
||||||
|
pair_coeff * *
|
||||||
|
|
||||||
|
# ------ Fixes & computes ------ #
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} RK1 8 shift
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 all enforce2d
|
||||||
|
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 200
|
||||||
|
thermo_style custom step time ke press
|
||||||
|
|
||||||
|
#dump 1 all custom 200 atomDump id type x y vx vy fx fy c_rho
|
||||||
|
|
||||||
|
run 10000
|
||||||
224
examples/rheo/taylor-green/log.17Apr2024.taylor.green.g++.4
Normal file
224
examples/rheo/taylor-green/log.17Apr2024.taylor.green.g++.4
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
LAMMPS (17 Apr 2024 - Development - patch_5May2020-18508-g3c0eaf6870-modified)
|
||||||
|
# ------ 2D Taylor Green vortex ------ #
|
||||||
|
|
||||||
|
dimension 2
|
||||||
|
units lj
|
||||||
|
atom_style rheo
|
||||||
|
boundary p p p
|
||||||
|
comm_modify vel yes
|
||||||
|
newton off
|
||||||
|
|
||||||
|
# ------ Create simulation box ------ #
|
||||||
|
|
||||||
|
variable n equal 1.0
|
||||||
|
variable cut equal 3.0
|
||||||
|
|
||||||
|
region box block 0 40 0 40 -0.01 0.01
|
||||||
|
create_box 1 box
|
||||||
|
Created orthogonal box = (0 0 -0.01) to (40 40 0.01)
|
||||||
|
2 by 2 by 1 MPI processor grid
|
||||||
|
lattice sq ${n}
|
||||||
|
lattice sq 1
|
||||||
|
Lattice spacing in x,y,z = 1 1 1
|
||||||
|
|
||||||
|
create_atoms 1 region box
|
||||||
|
Created 1600 atoms
|
||||||
|
using lattice units in orthogonal box = (0 0 -0.01) to (40 40 0.01)
|
||||||
|
create_atoms CPU = 0.001 seconds
|
||||||
|
|
||||||
|
displace_atoms all random 0.1 0.1 0 135414 units box
|
||||||
|
Displacing atoms ...
|
||||||
|
|
||||||
|
# ------ Model parameters ------ #
|
||||||
|
|
||||||
|
variable rho0 equal 1.0
|
||||||
|
variable mp equal ${rho0}/${n}
|
||||||
|
variable mp equal 1/${n}
|
||||||
|
variable mp equal 1/1
|
||||||
|
variable cs equal 1.0
|
||||||
|
variable eta equal 0.05
|
||||||
|
variable zeta equal 1
|
||||||
|
variable dt_max equal 0.1*${cut}/${cs}/3
|
||||||
|
variable dt_max equal 0.1*3/${cs}/3
|
||||||
|
variable dt_max equal 0.1*3/1/3
|
||||||
|
variable Dr equal 0.1*${cut}*${cs}
|
||||||
|
variable Dr equal 0.1*3*${cs}
|
||||||
|
variable Dr equal 0.1*3*1
|
||||||
|
|
||||||
|
mass * ${mp}
|
||||||
|
mass * 1
|
||||||
|
set group all rheo/rho ${rho0}
|
||||||
|
set group all rheo/rho 1
|
||||||
|
Setting atom values ...
|
||||||
|
1600 settings made for rheo/rho
|
||||||
|
set group all rheo/status 0
|
||||||
|
Setting atom values ...
|
||||||
|
1600 settings made for rheo/status
|
||||||
|
|
||||||
|
variable u0 equal 0.05
|
||||||
|
variable uy atom ${u0}*sin(2*PI*x/lx)*cos(2*PI*y/ly)
|
||||||
|
variable uy atom 0.05*sin(2*PI*x/lx)*cos(2*PI*y/ly)
|
||||||
|
variable ux atom -${u0}*sin(2*PI*y/ly)*cos(2*PI*x/ly)
|
||||||
|
variable ux atom -0.05*sin(2*PI*y/ly)*cos(2*PI*x/ly)
|
||||||
|
variable d0 atom ${rho0}-${u0}*${u0}*${rho0}*0.25*(cos(4*PI*x/lx)+cos(4*PI*y/ly))/${cs}/${cs}
|
||||||
|
variable d0 atom 1-${u0}*${u0}*${rho0}*0.25*(cos(4*PI*x/lx)+cos(4*PI*y/ly))/${cs}/${cs}
|
||||||
|
variable d0 atom 1-0.05*${u0}*${rho0}*0.25*(cos(4*PI*x/lx)+cos(4*PI*y/ly))/${cs}/${cs}
|
||||||
|
variable d0 atom 1-0.05*0.05*${rho0}*0.25*(cos(4*PI*x/lx)+cos(4*PI*y/ly))/${cs}/${cs}
|
||||||
|
variable d0 atom 1-0.05*0.05*1*0.25*(cos(4*PI*x/lx)+cos(4*PI*y/ly))/${cs}/${cs}
|
||||||
|
variable d0 atom 1-0.05*0.05*1*0.25*(cos(4*PI*x/lx)+cos(4*PI*y/ly))/1/${cs}
|
||||||
|
variable d0 atom 1-0.05*0.05*1*0.25*(cos(4*PI*x/lx)+cos(4*PI*y/ly))/1/1
|
||||||
|
|
||||||
|
velocity all set v_ux v_uy 0.0 units box
|
||||||
|
|
||||||
|
timestep ${dt_max}
|
||||||
|
timestep 0.1
|
||||||
|
|
||||||
|
pair_style rheo ${cut} artificial/visc ${zeta} rho/damp ${Dr}
|
||||||
|
pair_style rheo 3 artificial/visc ${zeta} rho/damp ${Dr}
|
||||||
|
pair_style rheo 3 artificial/visc 1 rho/damp ${Dr}
|
||||||
|
pair_style rheo 3 artificial/visc 1 rho/damp 0.3
|
||||||
|
pair_coeff * *
|
||||||
|
|
||||||
|
# ------ Fixes & computes ------ #
|
||||||
|
|
||||||
|
fix 1 all rheo ${cut} RK1 8 shift
|
||||||
|
fix 1 all rheo 3 RK1 8 shift
|
||||||
|
fix 2 all rheo/viscosity * constant ${eta}
|
||||||
|
fix 2 all rheo/viscosity * constant 0.05
|
||||||
|
fix 3 all rheo/pressure * linear
|
||||||
|
fix 4 all enforce2d
|
||||||
|
|
||||||
|
compute rho all rheo/property/atom rho
|
||||||
|
|
||||||
|
# ------ Output & Run ------ #
|
||||||
|
|
||||||
|
thermo 200
|
||||||
|
thermo_style custom step time ke press
|
||||||
|
|
||||||
|
dump 1 all custom 200 atomDump id type x y vx vy fx fy c_rho
|
||||||
|
|
||||||
|
run 10000
|
||||||
|
|
||||||
|
CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE
|
||||||
|
|
||||||
|
Your simulation uses code contributions which should be cited:
|
||||||
|
|
||||||
|
- @article{PalermoInPrep,
|
||||||
|
journal = {in prep},
|
||||||
|
title = {RHEO: A Hybrid Mesh-Free Model Framework for Dynamic Multi-Phase Flows},
|
||||||
|
year = {2024},
|
||||||
|
author = {Eric T. Palermo and Ki T. Wolf and Joel T. Clemmer and Thomas C. O'Connor},
|
||||||
|
}
|
||||||
|
|
||||||
|
CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE
|
||||||
|
|
||||||
|
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 = 3.3
|
||||||
|
ghost atom cutoff = 3.3
|
||||||
|
binsize = 1.65, bins = 25 25 1
|
||||||
|
4 neighbor lists, perpetual/occasional/extra = 4 0 0
|
||||||
|
(1) pair rheo, perpetual, half/full from (2)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: halffull/newtoff
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(2) compute RHEO/KERNEL, perpetual
|
||||||
|
attributes: full, newton off
|
||||||
|
pair build: full/bin/atomonly
|
||||||
|
stencil: full/bin/2d
|
||||||
|
bin: standard
|
||||||
|
(3) compute RHEO/GRAD, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
(4) compute RHEO/VSHIFT, perpetual, copy from (1)
|
||||||
|
attributes: half, newton off
|
||||||
|
pair build: copy
|
||||||
|
stencil: none
|
||||||
|
bin: none
|
||||||
|
Per MPI rank memory allocation (min/avg/max) = 6.835 | 6.835 | 6.835 Mbytes
|
||||||
|
Step Time KinEng Press
|
||||||
|
0 0 0.00062497276 0.00062607301
|
||||||
|
200 20 0.00056200647 0.00056633785
|
||||||
|
400 40 0.00050570968 0.00051098771
|
||||||
|
600 60 0.00045586684 0.00046081672
|
||||||
|
800 80 0.00041124523 0.00041549607
|
||||||
|
1000 100 0.00037065341 0.00037412741
|
||||||
|
1200 120 0.00033391585 0.00033580899
|
||||||
|
1400 140 0.00030078316 0.00030057307
|
||||||
|
1600 160 0.00027093231 0.00026842603
|
||||||
|
1800 180 0.00024403239 0.00023839026
|
||||||
|
2000 200 0.0002197865 0.00021148941
|
||||||
|
2200 220 0.0001979269 0.00018659386
|
||||||
|
2400 240 0.00017822267 0.00016430442
|
||||||
|
2600 260 0.00016047141 0.00014408514
|
||||||
|
2800 280 0.00014448504 0.00012574125
|
||||||
|
3000 300 0.00013009159 0.00010869938
|
||||||
|
3200 320 0.00011713578 9.414951e-05
|
||||||
|
3400 340 0.00010547564 8.1900579e-05
|
||||||
|
3600 360 9.4982139e-05 7.1285649e-05
|
||||||
|
3800 380 8.5538983e-05 6.1571123e-05
|
||||||
|
4000 400 7.7040171e-05 5.3462572e-05
|
||||||
|
4200 420 6.9390317e-05 4.6338308e-05
|
||||||
|
4400 440 6.2503763e-05 3.9697323e-05
|
||||||
|
4600 460 5.6303766e-05 3.4234465e-05
|
||||||
|
4800 480 5.0721595e-05 3.0841338e-05
|
||||||
|
5000 500 4.5695301e-05 2.7788566e-05
|
||||||
|
5200 520 4.1169161e-05 2.5744409e-05
|
||||||
|
5400 540 3.7093059e-05 2.3912739e-05
|
||||||
|
5600 560 3.3421819e-05 2.2494185e-05
|
||||||
|
5800 580 3.0114735e-05 2.1594384e-05
|
||||||
|
6000 600 2.7135224e-05 2.1164421e-05
|
||||||
|
6200 620 2.4450446e-05 2.0979349e-05
|
||||||
|
6400 640 2.2030925e-05 2.0858567e-05
|
||||||
|
6600 660 1.9850196e-05 2.098115e-05
|
||||||
|
6800 680 1.7884553e-05 2.1134827e-05
|
||||||
|
7000 700 1.6112763e-05 2.1242242e-05
|
||||||
|
7200 720 1.4515783e-05 2.1312763e-05
|
||||||
|
7400 740 1.3076456e-05 2.1370947e-05
|
||||||
|
7600 760 1.1779327e-05 2.1332126e-05
|
||||||
|
7800 780 1.0610469e-05 2.1156562e-05
|
||||||
|
8000 800 9.5573298e-06 2.0898126e-05
|
||||||
|
8200 820 8.6085799e-06 2.0517958e-05
|
||||||
|
8400 840 7.7539888e-06 1.9841551e-05
|
||||||
|
8600 860 6.9843033e-06 1.9114769e-05
|
||||||
|
8800 880 6.2911575e-06 1.8362959e-05
|
||||||
|
9000 900 5.6669785e-06 1.7473404e-05
|
||||||
|
9200 920 5.1049208e-06 1.6452745e-05
|
||||||
|
9400 940 4.5987908e-06 1.5578629e-05
|
||||||
|
9600 960 4.1429972e-06 1.4427274e-05
|
||||||
|
9800 980 3.7324962e-06 1.3169649e-05
|
||||||
|
10000 1000 3.3627455e-06 1.1938723e-05
|
||||||
|
Loop time of 38.2006 on 4 procs for 10000 steps with 1600 atoms
|
||||||
|
|
||||||
|
Performance: 2261743.875 tau/day, 261.776 timesteps/s, 418.841 katom-step/s
|
||||||
|
99.7% CPU use with 4 MPI tasks x no OpenMP threads
|
||||||
|
|
||||||
|
MPI task timing breakdown:
|
||||||
|
Section | min time | avg time | max time |%varavg| %total
|
||||||
|
---------------------------------------------------------------
|
||||||
|
Pair | 8.2958 | 8.7273 | 9.3582 | 15.2 | 22.85
|
||||||
|
Neigh | 0.034282 | 0.035689 | 0.037115 | 0.7 | 0.09
|
||||||
|
Comm | 0.16788 | 0.17018 | 0.17278 | 0.4 | 0.45
|
||||||
|
Output | 0.066977 | 0.06882 | 0.071704 | 0.7 | 0.18
|
||||||
|
Modify | 28.483 | 28.793 | 28.962 | 3.6 | 75.37
|
||||||
|
Other | | 0.4053 | | | 1.06
|
||||||
|
|
||||||
|
Nlocal: 400 ave 402 max 399 min
|
||||||
|
Histogram: 2 0 0 1 0 0 0 0 0 1
|
||||||
|
Nghost: 307.25 ave 308 max 305 min
|
||||||
|
Histogram: 1 0 0 0 0 0 0 0 0 3
|
||||||
|
Neighs: 7618.25 ave 7697 max 7564 min
|
||||||
|
Histogram: 1 0 1 1 0 0 0 0 0 1
|
||||||
|
FullNghs: 13343 ave 13497 max 13258 min
|
||||||
|
Histogram: 1 1 1 0 0 0 0 0 0 1
|
||||||
|
|
||||||
|
Total # of neighbors = 53372
|
||||||
|
Ave neighs/atom = 33.3575
|
||||||
|
Neighbor list builds = 123
|
||||||
|
Dangerous builds = 0
|
||||||
|
Total wall time: 0:00:38
|
||||||
14
lib/rheo/Makefile.lammps
Normal file
14
lib/rheo/Makefile.lammps
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# Settings that the LAMMPS build will import when this package is installed
|
||||||
|
|
||||||
|
ifeq ($(strip $(shell pkg-config --version)),)
|
||||||
|
# manual configuration w/o pkg-config/pkgconf
|
||||||
|
# change this to -I/path/to/your/lib/gsl/include/
|
||||||
|
rheo_SYSINC = -I../../lib/rheo/gsl/include/
|
||||||
|
|
||||||
|
# change this to -L/path/to/your/lib/gsl/lib/
|
||||||
|
rheo_SYSLIB = -L../../lib/rheo/gsl/lib/ -lgsl -lgslcblas
|
||||||
|
else
|
||||||
|
# autodetect GSL settings from pkg-config/pkgconf
|
||||||
|
rheo_SYSINC = $(shell pkg-config --cflags gsl)
|
||||||
|
rheo_SYSLIB = $(shell pkg-config --libs gsl)
|
||||||
|
endif
|
||||||
7
lib/rheo/README
Normal file
7
lib/rheo/README
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
This directory has a Makefile.lammps file with settings that allows LAMMPS to
|
||||||
|
dynamically link to the GSL library. This is required to use the RHEO package
|
||||||
|
in a LAMMPS input script. If you have the pkg-config command available, it
|
||||||
|
will automatically import the GSL settings. Otherwise they will have to be
|
||||||
|
added manually.
|
||||||
|
|
||||||
|
See the header of Makefile.lammps for more info.
|
||||||
5
src/.gitignore
vendored
5
src/.gitignore
vendored
@ -245,6 +245,9 @@
|
|||||||
/pair_tdpd.cpp
|
/pair_tdpd.cpp
|
||||||
/pair_tdpd.h
|
/pair_tdpd.h
|
||||||
|
|
||||||
|
/*rheo*.cpp
|
||||||
|
/*rheo*.h
|
||||||
|
|
||||||
/compute_grid.cpp
|
/compute_grid.cpp
|
||||||
/compute_grid.h
|
/compute_grid.h
|
||||||
/compute_grid_local.cpp
|
/compute_grid_local.cpp
|
||||||
@ -790,6 +793,8 @@
|
|||||||
/fix_acks2_reaxff.h
|
/fix_acks2_reaxff.h
|
||||||
/fix_adapt_fep.cpp
|
/fix_adapt_fep.cpp
|
||||||
/fix_adapt_fep.h
|
/fix_adapt_fep.h
|
||||||
|
/fix_add_heat.cpp
|
||||||
|
/fix_add_heat.h
|
||||||
/fix_addtorque.cpp
|
/fix_addtorque.cpp
|
||||||
/fix_addtorque.h
|
/fix_addtorque.h
|
||||||
/fix_append_atoms.cpp
|
/fix_append_atoms.cpp
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
#include "comm.h"
|
#include "comm.h"
|
||||||
#include "domain.h"
|
#include "domain.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
#include "fix.h"
|
||||||
#include "fix_bond_history.h"
|
#include "fix_bond_history.h"
|
||||||
#include "fix_store_local.h"
|
#include "fix_store_local.h"
|
||||||
#include "fix_update_special_bonds.h"
|
#include "fix_update_special_bonds.h"
|
||||||
@ -53,10 +54,14 @@ BondBPM::BondBPM(LAMMPS *_lmp) :
|
|||||||
pack_choice(nullptr), output_data(nullptr)
|
pack_choice(nullptr), output_data(nullptr)
|
||||||
{
|
{
|
||||||
overlay_flag = 0;
|
overlay_flag = 0;
|
||||||
|
ignore_special_flag = 0;
|
||||||
prop_atom_flag = 0;
|
prop_atom_flag = 0;
|
||||||
break_flag = 1;
|
break_flag = 1;
|
||||||
nvalues = 0;
|
nvalues = 0;
|
||||||
|
|
||||||
|
nhistory = 0;
|
||||||
|
update_flag = 0;
|
||||||
|
|
||||||
r0_max_estimate = 0.0;
|
r0_max_estimate = 0.0;
|
||||||
max_stretch = 1.0;
|
max_stretch = 1.0;
|
||||||
|
|
||||||
@ -64,10 +69,10 @@ BondBPM::BondBPM(LAMMPS *_lmp) :
|
|||||||
// this is so final order of Modify:fix will conform to input script
|
// this is so final order of Modify:fix will conform to input script
|
||||||
// BondHistory technically only needs this if updateflag = 1
|
// BondHistory technically only needs this if updateflag = 1
|
||||||
|
|
||||||
id_fix_dummy = utils::strdup("BPM_DUMMY");
|
id_fix_dummy = utils::strdup(fmt::format("BPM_DUMMY_{}", instance_total));
|
||||||
modify->add_fix(fmt::format("{} all DUMMY ", id_fix_dummy));
|
modify->add_fix(fmt::format("{} all DUMMY ", id_fix_dummy));
|
||||||
|
|
||||||
id_fix_dummy2 = utils::strdup("BPM_DUMMY2");
|
id_fix_dummy2 = utils::strdup(fmt::format("BPM_DUMMY2_{}", instance_total));
|
||||||
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);
|
if (lmp->citeme) lmp->citeme->add(cite_bpm);
|
||||||
@ -82,7 +87,7 @@ BondBPM::~BondBPM()
|
|||||||
if (id_fix_dummy) modify->delete_fix(id_fix_dummy);
|
if (id_fix_dummy) modify->delete_fix(id_fix_dummy);
|
||||||
if (id_fix_dummy2) modify->delete_fix(id_fix_dummy2);
|
if (id_fix_dummy2) modify->delete_fix(id_fix_dummy2);
|
||||||
if (id_fix_update) modify->delete_fix(id_fix_update);
|
if (id_fix_update) modify->delete_fix(id_fix_update);
|
||||||
if (id_fix_bond_history) modify->delete_fix(id_fix_bond_history);
|
if (fix_bond_history) modify->delete_fix(id_fix_bond_history);
|
||||||
if (id_fix_store_local) modify->delete_fix(id_fix_store_local);
|
if (id_fix_store_local) modify->delete_fix(id_fix_store_local);
|
||||||
if (id_fix_prop_atom) modify->delete_fix(id_fix_prop_atom);
|
if (id_fix_prop_atom) modify->delete_fix(id_fix_prop_atom);
|
||||||
|
|
||||||
@ -109,39 +114,46 @@ void BondBPM::init_style()
|
|||||||
fix_store_local->nvalues = nvalues;
|
fix_store_local->nvalues = nvalues;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overlay_flag) {
|
if (!ignore_special_flag) {
|
||||||
if (force->special_lj[1] != 1.0 || force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0 ||
|
if (overlay_flag) {
|
||||||
force->special_coul[1] != 1.0 || force->special_coul[2] != 1.0 || force->special_coul[3] != 1.0)
|
if (force->special_lj[1] != 1.0 || force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0 ||
|
||||||
error->all(FLERR,
|
force->special_coul[1] != 1.0 || force->special_coul[2] != 1.0 || force->special_coul[3] != 1.0)
|
||||||
"With overlay/pair yes, BPM bond styles require a value of 1.0 for all special_bonds weights");
|
error->all(FLERR,
|
||||||
if (id_fix_update) {
|
"With overlay/pair yes, BPM bond styles require a value of 1.0 for all special_bonds weights");
|
||||||
modify->delete_fix(id_fix_update);
|
if (id_fix_update) {
|
||||||
delete[] id_fix_update;
|
modify->delete_fix(id_fix_update);
|
||||||
id_fix_update = nullptr;
|
delete[] id_fix_update;
|
||||||
}
|
id_fix_update = nullptr;
|
||||||
} else {
|
}
|
||||||
// Require atoms know about all of their bonds and if they break
|
} else {
|
||||||
if (force->newton_bond && break_flag)
|
// Require atoms know about all of their bonds and if they break
|
||||||
error->all(FLERR, "With overlay/pair no, or break yes, BPM bond styles require Newton bond off");
|
if (force->newton_bond && break_flag)
|
||||||
|
error->all(FLERR, "With overlay/pair no, or break yes, BPM bond styles require Newton bond off");
|
||||||
|
|
||||||
// special lj must be 0 1 1 to censor pair forces between bonded particles
|
// special lj must be 0 1 1 to censor pair forces between bonded particles
|
||||||
if (force->special_lj[1] != 0.0 || force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0)
|
if (force->special_lj[1] != 0.0 || force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0)
|
||||||
error->all(FLERR,
|
error->all(FLERR,
|
||||||
"With overlay/pair no, BPM bond styles require special LJ weights = 0,1,1");
|
"With overlay/pair no, BPM bond styles require special LJ weights = 0,1,1");
|
||||||
// if bonds can break, special coulomb must be 1 1 1 to ensure all pairs are included in the
|
// if bonds can break, special coulomb must be 1 1 1 to ensure all pairs are included in the
|
||||||
// neighbor list and 1-3 and 1-4 special bond lists are skipped
|
// neighbor list and 1-3 and 1-4 special bond lists are skipped
|
||||||
if (break_flag && (force->special_coul[1] != 1.0 || force->special_coul[2] != 1.0 ||
|
if (break_flag && (force->special_coul[1] != 1.0 || force->special_coul[2] != 1.0 ||
|
||||||
force->special_coul[3] != 1.0))
|
force->special_coul[3] != 1.0))
|
||||||
error->all(FLERR,
|
error->all(FLERR,
|
||||||
"With overlay/pair no, and break yes, BPM bond styles requires special Coulomb weights = 1,1,1");
|
"With overlay/pair no, and break yes, BPM bond styles requires special Coulomb weights = 1,1,1");
|
||||||
|
|
||||||
if (id_fix_dummy && break_flag) {
|
if (id_fix_dummy && break_flag) {
|
||||||
id_fix_update = utils::strdup("BPM_UPDATE_SPECIAL_BONDS");
|
id_fix_update = utils::strdup("BPM_UPDATE_SPECIAL_BONDS");
|
||||||
fix_update_special_bonds = dynamic_cast<FixUpdateSpecialBonds *>(modify->replace_fix(
|
fix_update_special_bonds = dynamic_cast<FixUpdateSpecialBonds *>(modify->replace_fix(
|
||||||
id_fix_dummy, fmt::format("{} all UPDATE_SPECIAL_BONDS", id_fix_update), 1));
|
id_fix_dummy, fmt::format("{} all UPDATE_SPECIAL_BONDS", id_fix_update), 1));
|
||||||
delete[] id_fix_dummy;
|
delete[] id_fix_dummy;
|
||||||
id_fix_dummy = nullptr;
|
id_fix_dummy = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// special 1-3 and 1-4 weights must be 1 to prevent building 1-3 and 1-4 special bond lists
|
||||||
|
if (force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0 || force->special_coul[2] != 1.0 ||
|
||||||
|
force->special_coul[3] != 1.0)
|
||||||
|
error->all(FLERR, "Bond style bpm requires 1-3 and 1-4 special weights of 1.0");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (force->angle || force->dihedral || force->improper)
|
if (force->angle || force->dihedral || force->improper)
|
||||||
@ -149,10 +161,16 @@ void BondBPM::init_style()
|
|||||||
if (atom->molecular == 2)
|
if (atom->molecular == 2)
|
||||||
error->all(FLERR, "Bond style bpm cannot be used with atom style template");
|
error->all(FLERR, "Bond style bpm cannot be used with atom style template");
|
||||||
|
|
||||||
// special 1-3 and 1-4 weights must be 1 to prevent building 1-3 and 1-4 special bond lists
|
// find all instances of bond history to delete/shift data
|
||||||
if (force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0 || force->special_coul[2] != 1.0 ||
|
// (bond hybrid may create multiple)
|
||||||
force->special_coul[3] != 1.0)
|
histories = modify->get_fix_by_style("BOND_HISTORY");
|
||||||
error->all(FLERR, "Bond style bpm requires 1-3 and 1-4 special weights of 1.0");
|
n_histories = histories.size();
|
||||||
|
|
||||||
|
// If a bond type isn't set, must be using bond style hybrid
|
||||||
|
hybrid_flag = 0;
|
||||||
|
for (int i = 1; i <= atom->nbondtypes; i++)
|
||||||
|
if (!setflag[i]) hybrid_flag = 1;
|
||||||
|
fix_bond_history->setflag = setflag;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
@ -269,6 +287,14 @@ void BondBPM::settings(int narg, char **arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up necessary history fix
|
||||||
|
if (!fix_bond_history) {
|
||||||
|
fix_bond_history = dynamic_cast<FixBondHistory *>(modify->replace_fix(
|
||||||
|
id_fix_dummy2, fmt::format("{} all BOND_HISTORY {} {}", id_fix_bond_history, update_flag, nhistory), 1));
|
||||||
|
delete[] id_fix_dummy2;
|
||||||
|
id_fix_dummy2 = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
@ -385,12 +411,15 @@ void BondBPM::process_broken(int i, int j)
|
|||||||
|
|
||||||
if (i < nlocal) {
|
if (i < nlocal) {
|
||||||
for (m = 0; m < num_bond[i]; m++) {
|
for (m = 0; m < num_bond[i]; m++) {
|
||||||
if (bond_atom[i][m] == tag[j]) {
|
if (bond_atom[i][m] == tag[j] && setflag[bond_type[i][m]]) {
|
||||||
n = num_bond[i];
|
n = num_bond[i];
|
||||||
bond_type[i][m] = bond_type[i][n - 1];
|
bond_type[i][m] = bond_type[i][n - 1];
|
||||||
bond_atom[i][m] = bond_atom[i][n - 1];
|
bond_atom[i][m] = bond_atom[i][n - 1];
|
||||||
fix_bond_history->shift_history(i, m, n - 1);
|
for (auto &ihistory: histories) {
|
||||||
fix_bond_history->delete_history(i, n - 1);
|
auto fix_bond_history2 = dynamic_cast<FixBondHistory *> (ihistory);
|
||||||
|
fix_bond_history2->shift_history(i, m, n - 1);
|
||||||
|
fix_bond_history2->delete_history(i, n - 1);
|
||||||
|
}
|
||||||
num_bond[i]--;
|
num_bond[i]--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -399,12 +428,15 @@ void BondBPM::process_broken(int i, int j)
|
|||||||
|
|
||||||
if (j < nlocal) {
|
if (j < nlocal) {
|
||||||
for (m = 0; m < num_bond[j]; m++) {
|
for (m = 0; m < num_bond[j]; m++) {
|
||||||
if (bond_atom[j][m] == tag[i]) {
|
if (bond_atom[j][m] == tag[i] && setflag[bond_type[j][m]]) {
|
||||||
n = num_bond[j];
|
n = num_bond[j];
|
||||||
bond_type[j][m] = bond_type[j][n - 1];
|
bond_type[j][m] = bond_type[j][n - 1];
|
||||||
bond_atom[j][m] = bond_atom[j][n - 1];
|
bond_atom[j][m] = bond_atom[j][n - 1];
|
||||||
fix_bond_history->shift_history(j, m, n - 1);
|
for (auto &ihistory: histories) {
|
||||||
fix_bond_history->delete_history(j, n - 1);
|
auto fix_bond_history2 = dynamic_cast<FixBondHistory *> (ihistory);
|
||||||
|
fix_bond_history2->shift_history(j, m, n - 1);
|
||||||
|
fix_bond_history2->delete_history(j, n - 1);
|
||||||
|
}
|
||||||
num_bond[j]--;
|
num_bond[j]--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,8 +16,12 @@
|
|||||||
|
|
||||||
#include "bond.h"
|
#include "bond.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace LAMMPS_NS {
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class Fix;
|
||||||
|
|
||||||
class BondBPM : public Bond {
|
class BondBPM : public Bond {
|
||||||
public:
|
public:
|
||||||
BondBPM(class LAMMPS *);
|
BondBPM(class LAMMPS *);
|
||||||
@ -34,7 +38,7 @@ class BondBPM : public Bond {
|
|||||||
protected:
|
protected:
|
||||||
double r0_max_estimate;
|
double r0_max_estimate;
|
||||||
double max_stretch;
|
double max_stretch;
|
||||||
int store_local_freq;
|
int store_local_freq, nhistory, update_flag, hybrid_flag;
|
||||||
|
|
||||||
std::vector<int> leftover_iarg;
|
std::vector<int> leftover_iarg;
|
||||||
|
|
||||||
@ -50,9 +54,12 @@ class BondBPM : public Bond {
|
|||||||
FnPtrPack *pack_choice; // ptrs to pack functions
|
FnPtrPack *pack_choice; // ptrs to pack functions
|
||||||
double *output_data;
|
double *output_data;
|
||||||
|
|
||||||
int prop_atom_flag, nvalues, overlay_flag, break_flag;
|
int prop_atom_flag, nvalues, overlay_flag, break_flag, ignore_special_flag;
|
||||||
int index_x_ref, index_y_ref, index_z_ref;
|
int index_x_ref, index_y_ref, index_z_ref;
|
||||||
|
|
||||||
|
int n_histories;
|
||||||
|
std::vector<Fix *> histories;
|
||||||
|
|
||||||
void pack_id1(int, int, int);
|
void pack_id1(int, int, int);
|
||||||
void pack_id2(int, int, int);
|
void pack_id2(int, int, int);
|
||||||
void pack_time(int, int, int);
|
void pack_time(int, int, int);
|
||||||
|
|||||||
@ -52,6 +52,9 @@ BondBPMRotational::BondBPMRotational(LAMMPS *_lmp) :
|
|||||||
smooth_flag = 1;
|
smooth_flag = 1;
|
||||||
normalize_flag = 0;
|
normalize_flag = 0;
|
||||||
|
|
||||||
|
nhistory = 4;
|
||||||
|
id_fix_bond_history = utils::strdup("HISTORY_BPM_ROTATIONAL");
|
||||||
|
|
||||||
single_extra = 7;
|
single_extra = 7;
|
||||||
svector = new double[7];
|
svector = new double[7];
|
||||||
}
|
}
|
||||||
@ -458,6 +461,9 @@ void BondBPMRotational::compute(int eflag, int vflag)
|
|||||||
store_data();
|
store_data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hybrid_flag)
|
||||||
|
fix_bond_history->compress_history();
|
||||||
|
|
||||||
int i1, i2, itmp, n, type;
|
int i1, i2, itmp, n, type;
|
||||||
double r[3], r0[3], rhat[3];
|
double r[3], r0[3], rhat[3];
|
||||||
double rsq, r0_mag, r_mag, r_mag_inv;
|
double rsq, r0_mag, r_mag, r_mag_inv;
|
||||||
@ -563,6 +569,9 @@ void BondBPMRotational::compute(int eflag, int vflag)
|
|||||||
ev_tally_xyz(i1, i2, nlocal, newton_bond, 0.0, -force1on2[0] * smooth, -force1on2[1] * smooth,
|
ev_tally_xyz(i1, i2, nlocal, newton_bond, 0.0, -force1on2[0] * smooth, -force1on2[1] * smooth,
|
||||||
-force1on2[2] * smooth, r[0], r[1], r[2]);
|
-force1on2[2] * smooth, r[0], r[1], r[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hybrid_flag)
|
||||||
|
fix_bond_history->uncompress_history();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -652,14 +661,6 @@ void BondBPMRotational::init_style()
|
|||||||
|
|
||||||
if (domain->dimension == 2)
|
if (domain->dimension == 2)
|
||||||
error->warning(FLERR, "Bond style bpm/rotational not intended for 2d use");
|
error->warning(FLERR, "Bond style bpm/rotational not intended for 2d use");
|
||||||
|
|
||||||
if (!id_fix_bond_history) {
|
|
||||||
id_fix_bond_history = utils::strdup("HISTORY_BPM_ROTATIONAL");
|
|
||||||
fix_bond_history = dynamic_cast<FixBondHistory *>(modify->replace_fix(
|
|
||||||
id_fix_dummy2, fmt::format("{} all BOND_HISTORY 0 4", id_fix_bond_history), 1));
|
|
||||||
delete[] id_fix_dummy2;
|
|
||||||
id_fix_dummy2 = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|||||||
@ -39,6 +39,9 @@ BondBPMSpring::BondBPMSpring(LAMMPS *_lmp) :
|
|||||||
smooth_flag = 1;
|
smooth_flag = 1;
|
||||||
normalize_flag = 0;
|
normalize_flag = 0;
|
||||||
|
|
||||||
|
nhistory = 1;
|
||||||
|
id_fix_bond_history = utils::strdup("HISTORY_BPM_SPRING");
|
||||||
|
|
||||||
single_extra = 1;
|
single_extra = 1;
|
||||||
svector = new double[1];
|
svector = new double[1];
|
||||||
}
|
}
|
||||||
@ -137,6 +140,9 @@ void BondBPMSpring::compute(int eflag, int vflag)
|
|||||||
store_data();
|
store_data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hybrid_flag)
|
||||||
|
fix_bond_history->compress_history();
|
||||||
|
|
||||||
int i1, i2, itmp, n, type;
|
int i1, i2, itmp, n, type;
|
||||||
double delx, dely, delz, delvx, delvy, delvz;
|
double delx, dely, delz, delvx, delvy, delvz;
|
||||||
double e, rsq, r, r0, rinv, smooth, fbond, dot;
|
double e, rsq, r, r0, rinv, smooth, fbond, dot;
|
||||||
@ -226,6 +232,9 @@ void BondBPMSpring::compute(int eflag, int vflag)
|
|||||||
|
|
||||||
if (evflag) ev_tally(i1, i2, nlocal, newton_bond, 0.0, fbond, delx, dely, delz);
|
if (evflag) ev_tally(i1, i2, nlocal, newton_bond, 0.0, fbond, delx, dely, delz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hybrid_flag)
|
||||||
|
fix_bond_history->uncompress_history();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -283,14 +292,6 @@ void BondBPMSpring::init_style()
|
|||||||
|
|
||||||
if (comm->ghost_velocity == 0)
|
if (comm->ghost_velocity == 0)
|
||||||
error->all(FLERR, "Bond bpm/spring requires ghost atoms store velocity");
|
error->all(FLERR, "Bond bpm/spring requires ghost atoms store velocity");
|
||||||
|
|
||||||
if (!id_fix_bond_history) {
|
|
||||||
id_fix_bond_history = utils::strdup("HISTORY_BPM_SPRING");
|
|
||||||
fix_bond_history = dynamic_cast<FixBondHistory *>(modify->replace_fix(
|
|
||||||
id_fix_dummy2, fmt::format("{} all BOND_HISTORY 0 1", id_fix_bond_history), 1));
|
|
||||||
delete[] id_fix_dummy2;
|
|
||||||
id_fix_dummy2 = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|||||||
@ -14,7 +14,9 @@
|
|||||||
#include "compute_nbond_atom.h"
|
#include "compute_nbond_atom.h"
|
||||||
|
|
||||||
#include "atom.h"
|
#include "atom.h"
|
||||||
|
#include "atom_vec.h"
|
||||||
#include "comm.h"
|
#include "comm.h"
|
||||||
|
#include "error.h"
|
||||||
#include "force.h"
|
#include "force.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
|
||||||
@ -27,6 +29,21 @@ ComputeNBondAtom::ComputeNBondAtom(LAMMPS *_lmp, int narg, char **arg) :
|
|||||||
{
|
{
|
||||||
if (narg < 3) utils::missing_cmd_args(FLERR, "compute nbond/atom", error);
|
if (narg < 3) utils::missing_cmd_args(FLERR, "compute nbond/atom", error);
|
||||||
|
|
||||||
|
if (atom->avec->bonds_allow == 0)
|
||||||
|
error->all(FLERR,"Compute nbond/atom used in system without bonds");
|
||||||
|
|
||||||
|
btype = -1;
|
||||||
|
int iarg = 3;
|
||||||
|
while (iarg < narg) {
|
||||||
|
if (strcmp(arg[iarg], "bond/type") == 0) {
|
||||||
|
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "compute nbond/atom bond/type", error);
|
||||||
|
btype = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
|
||||||
|
iarg += 2;
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, "Unknown compute nbond/atom command {}", arg[iarg]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
peratom_flag = 1;
|
peratom_flag = 1;
|
||||||
size_peratom_cols = 0;
|
size_peratom_cols = 0;
|
||||||
comm_reverse = 1;
|
comm_reverse = 1;
|
||||||
@ -77,6 +94,7 @@ void ComputeNBondAtom::compute_peratom()
|
|||||||
for (i = 0; i < nlocal; i++) {
|
for (i = 0; i < nlocal; i++) {
|
||||||
for (j = 0; j < num_bond[i]; j++) {
|
for (j = 0; j < num_bond[i]; j++) {
|
||||||
if (bond_type[i][j] <= 0) continue;
|
if (bond_type[i][j] <= 0) continue;
|
||||||
|
if (btype != -1 && bond_type[i][j] != btype) continue;
|
||||||
|
|
||||||
k = atom->map(bond_atom[i][j]);
|
k = atom->map(bond_atom[i][j]);
|
||||||
if (k < 0) continue;
|
if (k < 0) continue;
|
||||||
|
|||||||
@ -35,7 +35,7 @@ class ComputeNBondAtom : public Compute {
|
|||||||
double memory_usage() override;
|
double memory_usage() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int nmax;
|
int nmax, btype;
|
||||||
double *nbond;
|
double *nbond;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -90,11 +90,13 @@ void FixUpdateSpecialBonds::pre_exchange()
|
|||||||
for (auto const &it : broken_pairs) {
|
for (auto const &it : broken_pairs) {
|
||||||
tagi = it.first;
|
tagi = it.first;
|
||||||
tagj = it.second;
|
tagj = it.second;
|
||||||
|
|
||||||
i = atom->map(tagi);
|
i = atom->map(tagi);
|
||||||
j = atom->map(tagj);
|
j = atom->map(tagj);
|
||||||
|
|
||||||
// remove i from special bond list for atom j and vice versa
|
// remove i from special bond list for atom j and vice versa
|
||||||
// ignore n2, n3 since 1-3, 1-4 special factors required to be 1.0
|
// ignore n2, n3 since 1-3, 1-4 special factors required to be 1.0
|
||||||
|
// assume ghosts don't need special information
|
||||||
if (i < nlocal) {
|
if (i < nlocal) {
|
||||||
slist = special[i];
|
slist = special[i];
|
||||||
n1 = nspecial[i][0];
|
n1 = nspecial[i][0];
|
||||||
@ -126,19 +128,24 @@ void FixUpdateSpecialBonds::pre_exchange()
|
|||||||
|
|
||||||
// add i to special bond list for atom j and vice versa
|
// add i to special bond list for atom j and vice versa
|
||||||
// ignore n2, n3 since 1-3, 1-4 special factors required to be 1.0
|
// ignore n2, n3 since 1-3, 1-4 special factors required to be 1.0
|
||||||
n1 = nspecial[i][0];
|
// assume ghosts don't need special information
|
||||||
if (n1 >= atom->maxspecial)
|
if (i < nlocal) {
|
||||||
error->one(FLERR, "Special list size exceeded in fix update/special/bond");
|
n1 = nspecial[i][0];
|
||||||
special[i][n1] = tagj;
|
if (n1 >= atom->maxspecial)
|
||||||
nspecial[i][0] += 1;
|
error->one(FLERR, "Special list size exceeded for atom {}", tagi);
|
||||||
nspecial[i][1] = nspecial[i][2] = nspecial[i][0];
|
special[i][n1] = tagj;
|
||||||
|
nspecial[i][0] += 1;
|
||||||
|
nspecial[i][1] = nspecial[i][2] = nspecial[i][0];
|
||||||
|
}
|
||||||
|
|
||||||
n1 = nspecial[j][0];
|
if (j < nlocal) {
|
||||||
if (n1 >= atom->maxspecial)
|
n1 = nspecial[j][0];
|
||||||
error->one(FLERR, "Special list size exceeded in fix update/special/bond");
|
if (n1 >= atom->maxspecial)
|
||||||
special[j][n1] = tagi;
|
error->one(FLERR, "Special list size exceeded for atom {}", tagj);
|
||||||
nspecial[j][0] += 1;
|
special[j][n1] = tagi;
|
||||||
nspecial[j][1] = nspecial[j][2] = nspecial[j][0];
|
nspecial[j][0] += 1;
|
||||||
|
nspecial[j][1] = nspecial[j][2] = nspecial[j][0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
broken_pairs.clear();
|
broken_pairs.clear();
|
||||||
@ -162,7 +169,7 @@ void FixUpdateSpecialBonds::pre_force(int /*vflag*/)
|
|||||||
tagint *tag = atom->tag;
|
tagint *tag = atom->tag;
|
||||||
|
|
||||||
// In theory could communicate a list of broken bonds to neighboring processors here
|
// In theory could communicate a list of broken bonds to neighboring processors here
|
||||||
// to remove restriction that users use Newton bond off
|
// to remove restriction on Newton bond off
|
||||||
|
|
||||||
for (int ilist = 0; ilist < neighbor->nlist; ilist++) {
|
for (int ilist = 0; ilist < neighbor->nlist; ilist++) {
|
||||||
list = neighbor->lists[ilist];
|
list = neighbor->lists[ilist];
|
||||||
|
|||||||
161
src/GRANULAR/fix_add_heat.cpp
Normal file
161
src/GRANULAR/fix_add_heat.cpp
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing author: Joel Clemmer (SNL)
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "fix_add_heat.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "input.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "update.h"
|
||||||
|
#include "variable.h"
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace FixConst;
|
||||||
|
|
||||||
|
enum { CONSTANT, EQUAL, ATOM };
|
||||||
|
enum { ADD, LINEAR, QUARTIC };
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixAddHeat::FixAddHeat(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Fix(lmp, narg, arg), varstr(nullptr), vatom(nullptr)
|
||||||
|
{
|
||||||
|
if (narg < 5) utils::missing_cmd_args(FLERR, "fix add/heat", error);
|
||||||
|
dynamic_group_allow = 1;
|
||||||
|
overwrite_flag = 0;
|
||||||
|
|
||||||
|
if (strcmp(arg[3], "constant") == 0) {
|
||||||
|
style = ADD;
|
||||||
|
} else if (strcmp(arg[3], "linear") == 0) {
|
||||||
|
style = LINEAR;
|
||||||
|
} else if (strcmp(arg[3], "quartic") == 0) {
|
||||||
|
style = QUARTIC;
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, "Invalid option {}", arg[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (utils::strmatch(arg[4], "^v_")) {
|
||||||
|
varstr = utils::strdup(arg[4] + 2);
|
||||||
|
} else {
|
||||||
|
value = utils::numeric(FLERR, arg[4], false, lmp);
|
||||||
|
vstyle = CONSTANT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int iarg = 5;
|
||||||
|
if (style != ADD) {
|
||||||
|
if (narg != 6) utils::missing_cmd_args(FLERR, "fix add/heat", error);
|
||||||
|
prefactor = utils::numeric(FLERR, arg[5], false, lmp);
|
||||||
|
iarg = 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
// optional args
|
||||||
|
|
||||||
|
while (iarg < narg) {
|
||||||
|
if (strcmp(arg[iarg], "overwrite") == 0) {
|
||||||
|
if (iarg + 1 >= narg) utils::missing_cmd_args(FLERR, "fix add/heat", error);
|
||||||
|
overwrite_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp);
|
||||||
|
iarg += 2;
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, "Illegal fix add/heat command, invalid argument {}", arg[iarg]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
maxatom = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixAddHeat::~FixAddHeat()
|
||||||
|
{
|
||||||
|
delete[] varstr;
|
||||||
|
memory->destroy(vatom);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int FixAddHeat::setmask()
|
||||||
|
{
|
||||||
|
int mask = 0;
|
||||||
|
mask |= POST_FORCE;
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixAddHeat::init()
|
||||||
|
{
|
||||||
|
if (!atom->temperature_flag)
|
||||||
|
error->all(FLERR, "Fix add/heat requires atom style with temperature property");
|
||||||
|
if (!atom->heatflow_flag)
|
||||||
|
error->all(FLERR, "Fix add/heat requires atom style with heatflow property");
|
||||||
|
|
||||||
|
// check variable
|
||||||
|
|
||||||
|
if (varstr) {
|
||||||
|
var = input->variable->find(varstr);
|
||||||
|
if (var < 0) error->all(FLERR, "Variable {} for fix addforce does not exist", varstr);
|
||||||
|
if (input->variable->equalstyle(var))
|
||||||
|
vstyle = EQUAL;
|
||||||
|
else if (input->variable->atomstyle(var))
|
||||||
|
vstyle = ATOM;
|
||||||
|
else
|
||||||
|
error->all(FLERR, "Variable {} for fix addforce is invalid style", varstr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixAddHeat::post_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
int *mask = atom->mask;
|
||||||
|
double *heatflow = atom->heatflow;
|
||||||
|
double *temperature = atom->temperature;
|
||||||
|
double dtinv = 1.0 / update->dt;
|
||||||
|
|
||||||
|
if (vstyle == ATOM) {
|
||||||
|
if (atom->nmax > maxatom) {
|
||||||
|
maxatom = atom->nmax;
|
||||||
|
memory->destroy(vatom);
|
||||||
|
memory->create(vatom, maxatom, "addheat:vatom");
|
||||||
|
}
|
||||||
|
|
||||||
|
input->variable->compute_atom(var, igroup, &vatom[0], 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (overwrite_flag)
|
||||||
|
for (int i = 0; i < atom->nlocal; i++)
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
heatflow[i] = 0.0;
|
||||||
|
|
||||||
|
double vtmp, dt;
|
||||||
|
if (vstyle == CONSTANT) vtmp = value;
|
||||||
|
if (vstyle == EQUAL) vtmp = input->variable->compute_equal(var);
|
||||||
|
for (int i = 0; i < atom->nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
if (vstyle == ATOM) vtmp = vatom[i];
|
||||||
|
|
||||||
|
if (style == ADD) {
|
||||||
|
heatflow[i] += dtinv * vtmp;
|
||||||
|
} else if (style == LINEAR) {
|
||||||
|
heatflow[i] += dtinv * prefactor * (vtmp - temperature[i]);
|
||||||
|
} else if (style == QUARTIC) {
|
||||||
|
heatflow[i] += dtinv * prefactor * (pow(vtmp, 4.0) - pow(temperature[i], 4.0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
45
src/GRANULAR/fix_add_heat.h
Normal file
45
src/GRANULAR/fix_add_heat.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef FIX_CLASS
|
||||||
|
// clang-format off
|
||||||
|
FixStyle(add/heat,FixAddHeat);
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_FIX_ADD_HEAT_H
|
||||||
|
#define LMP_FIX_ADD_HEAT_H
|
||||||
|
|
||||||
|
#include "fix.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class FixAddHeat : public Fix {
|
||||||
|
public:
|
||||||
|
FixAddHeat(class LAMMPS *, int, char **);
|
||||||
|
~FixAddHeat() override;
|
||||||
|
int setmask() override;
|
||||||
|
void init() override;
|
||||||
|
void post_force(int) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double value, prefactor;
|
||||||
|
int var, vstyle, maxatom, style, overwrite_flag;
|
||||||
|
char *varstr;
|
||||||
|
double *vatom;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@ -124,6 +124,7 @@ PACKAGE = \
|
|||||||
reaction \
|
reaction \
|
||||||
reaxff \
|
reaxff \
|
||||||
replica \
|
replica \
|
||||||
|
rheo \
|
||||||
rigid \
|
rigid \
|
||||||
scafacos \
|
scafacos \
|
||||||
shock \
|
shock \
|
||||||
@ -233,6 +234,7 @@ PACKLIB = \
|
|||||||
plumed \
|
plumed \
|
||||||
qmmm \
|
qmmm \
|
||||||
ml-quip \
|
ml-quip \
|
||||||
|
rheo \
|
||||||
scafacos \
|
scafacos \
|
||||||
machdyn \
|
machdyn \
|
||||||
vtk \
|
vtk \
|
||||||
@ -254,6 +256,7 @@ PACKEXT = \
|
|||||||
netcdf \
|
netcdf \
|
||||||
plumed \
|
plumed \
|
||||||
qmmm \
|
qmmm \
|
||||||
|
rheo \
|
||||||
scafacos \
|
scafacos \
|
||||||
voronoi \
|
voronoi \
|
||||||
vtk \
|
vtk \
|
||||||
|
|||||||
70
src/RHEO/Install.sh
Normal file
70
src/RHEO/Install.sh
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
# Install/unInstall package files in LAMMPS
|
||||||
|
# mode = 0/1/2 for uninstall/install/update
|
||||||
|
|
||||||
|
mode=$1
|
||||||
|
|
||||||
|
# enforce using portable C locale
|
||||||
|
LC_ALL=C
|
||||||
|
export LC_ALL
|
||||||
|
|
||||||
|
# arg1 = file, arg2 = file it depends on
|
||||||
|
|
||||||
|
action () {
|
||||||
|
if (test $mode = 0) then
|
||||||
|
rm -f ../$1
|
||||||
|
elif (! cmp -s $1 ../$1) then
|
||||||
|
if (test -z "$2" || test -e ../$2) then
|
||||||
|
cp $1 ..
|
||||||
|
if (test $mode = 2) then
|
||||||
|
echo " updating src/$1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
elif (test -n "$2") then
|
||||||
|
if (test ! -e ../$2) then
|
||||||
|
rm -f ../$1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# some styles in RHEO have base classes in BPM
|
||||||
|
|
||||||
|
if (test $1 = 1) then
|
||||||
|
if (test ! -e ../bond_bpm.cpp) then
|
||||||
|
echo "Must install BPM package with RHEO"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
for file in *.cpp *.h; do
|
||||||
|
action ${file}
|
||||||
|
done
|
||||||
|
|
||||||
|
# edit 2 Makefile.package files to include/exclude package info
|
||||||
|
|
||||||
|
if (test $1 = 1) then
|
||||||
|
|
||||||
|
if (test -e ../Makefile.package) then
|
||||||
|
sed -i -e 's/[^ \t]*rheo[^ \t]* //' ../Makefile.package
|
||||||
|
sed -i -e 's|^PKG_SYSINC =[ \t]*|&$(rheo_SYSINC) |' ../Makefile.package
|
||||||
|
sed -i -e 's|^PKG_SYSLIB =[ \t]*|&$(rheo_SYSLIB) |' ../Makefile.package
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (test -e ../Makefile.package.settings) then
|
||||||
|
sed -i -e '/^[ \t]*include.*rheo.*$/d' ../Makefile.package.settings
|
||||||
|
# multiline form needed for BSD sed on Macs
|
||||||
|
sed -i -e '4 i \
|
||||||
|
include ..\/..\/lib\/rheo\/Makefile.lammps
|
||||||
|
' ../Makefile.package.settings
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif (test $1 = 0) then
|
||||||
|
|
||||||
|
if (test -e ../Makefile.package) then
|
||||||
|
sed -i -e 's/[^ \t]*rheo[^ \t]* //' ../Makefile.package
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (test -e ../Makefile.package.settings) then
|
||||||
|
sed -i -e '/^[ \t]*include.*rheo.*$/d' ../Makefile.package.settings
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
10
src/RHEO/README
Normal file
10
src/RHEO/README
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
RHEO or Reproducing Hydrodynamics and Elastic Objects is a package to model
|
||||||
|
multiphase fluid systems. The authors include Joel Clemmer (Sandia), Thomas
|
||||||
|
O'Connor (Carnegie Mellon), and Eric Palermo (Carnegie Mellon).
|
||||||
|
|
||||||
|
Bond style rheo/shell, compute style rheo/property/atom, and fix style
|
||||||
|
rheo/temperature all depend on the BPM package.
|
||||||
|
|
||||||
|
This package requires the GNU scientific library (GSL). We recommend version
|
||||||
|
2.7 or later. To build this package, one must first separately install GSL in
|
||||||
|
a location that can be found by your environment.
|
||||||
174
src/RHEO/atom_vec_rheo.cpp
Normal file
174
src/RHEO/atom_vec_rheo.cpp
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "atom_vec_rheo.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
AtomVecRHEO::AtomVecRHEO(LAMMPS *lmp) : AtomVec(lmp)
|
||||||
|
{
|
||||||
|
molecular = Atom::ATOMIC;
|
||||||
|
mass_type = PER_TYPE;
|
||||||
|
forceclearflag = 1;
|
||||||
|
|
||||||
|
atom->rheo_status_flag = 1;
|
||||||
|
atom->pressure_flag = 1;
|
||||||
|
atom->rho_flag = 1;
|
||||||
|
atom->viscosity_flag = 1;
|
||||||
|
|
||||||
|
// strings with peratom variables to include in each AtomVec method
|
||||||
|
// strings cannot contain fields in corresponding AtomVec default strings
|
||||||
|
// order of fields in a string does not matter
|
||||||
|
// except: fields_data_atom & fields_data_vel must match data file
|
||||||
|
|
||||||
|
fields_grow = {"rheo_status", "rho", "drho", "pressure", "viscosity"};
|
||||||
|
fields_copy = {"rheo_status", "rho", "drho", "pressure", "viscosity"};
|
||||||
|
fields_comm = {"rheo_status", "rho"};
|
||||||
|
fields_comm_vel = {"rheo_status", "rho"};
|
||||||
|
fields_reverse = {"drho"};
|
||||||
|
fields_border = {"rheo_status", "rho"};
|
||||||
|
fields_border_vel = {"rheo_status", "rho"};
|
||||||
|
fields_exchange = {"rheo_status", "rho"};
|
||||||
|
fields_restart = {"rheo_status", "rho"};
|
||||||
|
fields_create = {"rheo_status", "rho", "drho", "pressure", "viscosity"};
|
||||||
|
fields_data_atom = {"id", "type", "rheo_status", "rho", "x"};
|
||||||
|
fields_data_vel = {"id", "v"};
|
||||||
|
|
||||||
|
setup_fields();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
set local copies of all grow ptrs used by this class, except defaults
|
||||||
|
needed in replicate when 2 atom classes exist and it calls pack_restart()
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void AtomVecRHEO::grow_pointers()
|
||||||
|
{
|
||||||
|
rheo_status = atom->rheo_status;
|
||||||
|
pressure = atom->pressure;
|
||||||
|
rho = atom->rho;
|
||||||
|
drho = atom->drho;
|
||||||
|
viscosity = atom->viscosity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
clear extra forces starting at atom N
|
||||||
|
nbytes = # of bytes to clear for a per-atom vector
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void AtomVecRHEO::force_clear(int n, size_t nbytes)
|
||||||
|
{
|
||||||
|
memset(&drho[n], 0, nbytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
initialize non-zero atom quantities
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void AtomVecRHEO::create_atom_post(int ilocal)
|
||||||
|
{
|
||||||
|
rho[ilocal] = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
modify what AtomVec::data_atom() just unpacked
|
||||||
|
or initialize other atom quantities
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void AtomVecRHEO::data_atom_post(int ilocal)
|
||||||
|
{
|
||||||
|
drho[ilocal] = 0.0;
|
||||||
|
pressure[ilocal] = 0.0;
|
||||||
|
viscosity[ilocal] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
assign an index to named atom property and return index
|
||||||
|
return -1 if name is unknown to this atom style
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int AtomVecRHEO::property_atom(const std::string &name)
|
||||||
|
{
|
||||||
|
if (name == "rheo_status") return 0;
|
||||||
|
if (name == "pressure") return 1;
|
||||||
|
if (name == "rho") return 2;
|
||||||
|
if (name == "drho") return 3;
|
||||||
|
if (name == "viscosity") return 4;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
pack per-atom data into buf for ComputePropertyAtom
|
||||||
|
index maps to data specific to this atom style
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void AtomVecRHEO::pack_property_atom(int index, double *buf, int nvalues, int groupbit)
|
||||||
|
{
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
if (index == 0) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = rheo_status[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 1) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = pressure[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 2) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = rho[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 3) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = drho[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 4) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = viscosity[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
46
src/RHEO/atom_vec_rheo.h
Normal file
46
src/RHEO/atom_vec_rheo.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef ATOM_CLASS
|
||||||
|
// clang-format off
|
||||||
|
AtomStyle(rheo,AtomVecRHEO);
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_ATOM_VEC_RHEO_H
|
||||||
|
#define LMP_ATOM_VEC_RHEO_H
|
||||||
|
|
||||||
|
#include "atom_vec.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class AtomVecRHEO : virtual public AtomVec {
|
||||||
|
public:
|
||||||
|
AtomVecRHEO(class LAMMPS *);
|
||||||
|
|
||||||
|
void grow_pointers() override;
|
||||||
|
void force_clear(int, size_t) override;
|
||||||
|
void create_atom_post(int) override;
|
||||||
|
void data_atom_post(int) override;
|
||||||
|
int property_atom(const std::string &) override;
|
||||||
|
void pack_property_atom(int, double *, int, int) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int *rheo_status;
|
||||||
|
double *pressure, *rho, *drho, *viscosity;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
222
src/RHEO/atom_vec_rheo_thermal.cpp
Normal file
222
src/RHEO/atom_vec_rheo_thermal.cpp
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "atom_vec_rheo_thermal.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
AtomVecRHEOThermal::AtomVecRHEOThermal(LAMMPS *lmp) : AtomVec(lmp)
|
||||||
|
{
|
||||||
|
molecular = Atom::ATOMIC;
|
||||||
|
mass_type = PER_TYPE;
|
||||||
|
forceclearflag = 1;
|
||||||
|
|
||||||
|
atom->rheo_status_flag = 1;
|
||||||
|
atom->conductivity_flag = 1;
|
||||||
|
atom->temperature_flag = 1;
|
||||||
|
atom->esph_flag = 1;
|
||||||
|
atom->heatflow_flag = 1;
|
||||||
|
atom->pressure_flag = 1;
|
||||||
|
atom->rho_flag = 1;
|
||||||
|
atom->viscosity_flag = 1;
|
||||||
|
|
||||||
|
// strings with peratom variables to include in each AtomVec method
|
||||||
|
// strings cannot contain fields in corresponding AtomVec default strings
|
||||||
|
// order of fields in a string does not matter
|
||||||
|
// except: fields_data_atom & fields_data_vel must match data file
|
||||||
|
|
||||||
|
fields_grow = {"rheo_status", "rho", "drho", "temperature", "esph", "heatflow", "conductivity", "pressure", "viscosity"};
|
||||||
|
fields_copy = {"rheo_status", "rho", "drho", "temperature", "esph", "heatflow", "conductivity", "pressure", "viscosity"};
|
||||||
|
fields_comm = {"rheo_status", "rho", "esph"};
|
||||||
|
fields_comm_vel = {"rheo_status", "rho", "esph"};
|
||||||
|
fields_reverse = {"drho", "heatflow"};
|
||||||
|
fields_border = {"rheo_status", "rho", "esph"};
|
||||||
|
fields_border_vel = {"rheo_status", "rho", "esph"};
|
||||||
|
fields_exchange = {"rheo_status", "rho", "esph"};
|
||||||
|
fields_restart = {"rheo_status", "rho", "esph"};
|
||||||
|
fields_create = {"rheo_status", "rho", "drho", "temperature", "esph", "heatflow", "conductivity", "pressure", "viscosity"};
|
||||||
|
fields_data_atom = {"id", "type", "rheo_status", "rho", "esph", "x"};
|
||||||
|
fields_data_vel = {"id", "v"};
|
||||||
|
|
||||||
|
setup_fields();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
set local copies of all grow ptrs used by this class, except defaults
|
||||||
|
needed in replicate when 2 atom classes exist and it calls pack_restart()
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void AtomVecRHEOThermal::grow_pointers()
|
||||||
|
{
|
||||||
|
rheo_status = atom->rheo_status;
|
||||||
|
conductivity = atom->conductivity;
|
||||||
|
temperature = atom->temperature;
|
||||||
|
esph = atom->esph;
|
||||||
|
heatflow = atom->heatflow;
|
||||||
|
pressure = atom->pressure;
|
||||||
|
rho = atom->rho;
|
||||||
|
drho = atom->drho;
|
||||||
|
viscosity = atom->viscosity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
clear extra forces starting at atom N
|
||||||
|
nbytes = # of bytes to clear for a per-atom vector
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void AtomVecRHEOThermal::force_clear(int n, size_t nbytes)
|
||||||
|
{
|
||||||
|
memset(&drho[n], 0, nbytes);
|
||||||
|
memset(&heatflow[n], 0, nbytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
initialize non-zero atom quantities
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void AtomVecRHEOThermal::create_atom_post(int ilocal)
|
||||||
|
{
|
||||||
|
rho[ilocal] = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
modify what AtomVec::data_atom() just unpacked
|
||||||
|
or initialize other atom quantities
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void AtomVecRHEOThermal::data_atom_post(int ilocal)
|
||||||
|
{
|
||||||
|
drho[ilocal] = 0.0;
|
||||||
|
heatflow[ilocal] = 0.0;
|
||||||
|
temperature[ilocal] = 0.0;
|
||||||
|
pressure[ilocal] = 0.0;
|
||||||
|
viscosity[ilocal] = 0.0;
|
||||||
|
conductivity[ilocal] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
assign an index to named atom property and return index
|
||||||
|
return -1 if name is unknown to this atom style
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int AtomVecRHEOThermal::property_atom(const std::string &name)
|
||||||
|
{
|
||||||
|
if (name == "rheo_status") return 0;
|
||||||
|
if (name == "rho") return 1;
|
||||||
|
if (name == "drho") return 2;
|
||||||
|
if (name == "temperature") return 3;
|
||||||
|
if (name == "esph") return 4;
|
||||||
|
if (name == "heatflow") return 5;
|
||||||
|
if (name == "conductivity") return 6;
|
||||||
|
if (name == "pressure") return 7;
|
||||||
|
if (name == "viscosity") return 8;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
pack per-atom data into buf for ComputePropertyAtom
|
||||||
|
index maps to data specific to this atom style
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void AtomVecRHEOThermal::pack_property_atom(int index, double *buf, int nvalues, int groupbit)
|
||||||
|
{
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
if (index == 0) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = rheo_status[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 1) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = rho[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 2) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = drho[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 3) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = temperature[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 4) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = esph[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 5) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = heatflow[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 6) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = conductivity[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 7) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = pressure[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
} else if (index == 8) {
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
buf[n] = viscosity[i];
|
||||||
|
else
|
||||||
|
buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
47
src/RHEO/atom_vec_rheo_thermal.h
Normal file
47
src/RHEO/atom_vec_rheo_thermal.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef ATOM_CLASS
|
||||||
|
// clang-format off
|
||||||
|
AtomStyle(rheo/thermal,AtomVecRHEOThermal);
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_ATOM_VEC_RHEO_THERMAL_H
|
||||||
|
#define LMP_ATOM_VEC_RHEO_THERMAL_H
|
||||||
|
|
||||||
|
#include "atom_vec.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class AtomVecRHEOThermal : virtual public AtomVec {
|
||||||
|
public:
|
||||||
|
AtomVecRHEOThermal(class LAMMPS *);
|
||||||
|
|
||||||
|
void grow_pointers() override;
|
||||||
|
void force_clear(int, size_t) override;
|
||||||
|
void create_atom_post(int) override;
|
||||||
|
void data_atom_post(int) override;
|
||||||
|
int property_atom(const std::string &) override;
|
||||||
|
void pack_property_atom(int, double *, int, int) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int *rheo_status;
|
||||||
|
double *conductivity, *temperature, *heatflow, *esph;
|
||||||
|
double *pressure, *rho, *drho, *viscosity;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
591
src/RHEO/bond_rheo_shell.cpp
Normal file
591
src/RHEO/bond_rheo_shell.cpp
Normal file
@ -0,0 +1,591 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "bond_rheo_shell.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "compute_rheo_surface.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_bond_history.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "fix_rheo_oxidation.h"
|
||||||
|
#include "fix_store_local.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "update.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
#define EPSILON 1e-10
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
BondRHEOShell::BondRHEOShell(LAMMPS *_lmp) :
|
||||||
|
BondBPM(_lmp), compute_surface(nullptr), k(nullptr), ecrit(nullptr), gamma(nullptr)
|
||||||
|
{
|
||||||
|
partial_flag = 1;
|
||||||
|
comm_reverse = 1;
|
||||||
|
|
||||||
|
nhistory = 2;
|
||||||
|
update_flag = 1;
|
||||||
|
id_fix_bond_history = utils::strdup("HISTORY_RHEO_SHELL");
|
||||||
|
ignore_special_flag = 1;
|
||||||
|
|
||||||
|
tform = -1;
|
||||||
|
|
||||||
|
single_extra = 1;
|
||||||
|
svector = new double[1];
|
||||||
|
|
||||||
|
// For nbond, create an instance of fix property atom
|
||||||
|
// Need restarts + exchanging with neighbors since it needs to persist
|
||||||
|
// between timesteps (fix property atom will handle callbacks)
|
||||||
|
|
||||||
|
int tmp1, tmp2;
|
||||||
|
index_nb = atom->find_custom("shell_nbond", tmp1, tmp2);
|
||||||
|
if (index_nb == -1) {
|
||||||
|
id_fix = utils::strdup("bond_rheo_shell_fix_property_atom");
|
||||||
|
modify->add_fix(fmt::format("{} all property/atom i_shell_nbond", id_fix));
|
||||||
|
index_nb = atom->find_custom("shell_nbond", tmp1, tmp2);
|
||||||
|
}
|
||||||
|
nbond = atom->ivector[index_nb];
|
||||||
|
|
||||||
|
//Store non-persistent per atom quantities, intermediate
|
||||||
|
|
||||||
|
nmax_store = atom->nmax;
|
||||||
|
memory->create(dbond, nmax_store, "rheo/react:dbond");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
BondRHEOShell::~BondRHEOShell()
|
||||||
|
{
|
||||||
|
if (modify->nfix) modify->delete_fix(id_fix);
|
||||||
|
delete[] id_fix;
|
||||||
|
delete[] svector;
|
||||||
|
|
||||||
|
if (allocated) {
|
||||||
|
memory->destroy(setflag);
|
||||||
|
memory->destroy(k);
|
||||||
|
memory->destroy(ecrit);
|
||||||
|
memory->destroy(gamma);
|
||||||
|
}
|
||||||
|
|
||||||
|
memory->destroy(dbond);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Store data for a single bond - if bond added after LAMMPS init (e.g. pour)
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double BondRHEOShell::store_bond(int n, int i, int j)
|
||||||
|
{
|
||||||
|
double **bondstore = fix_bond_history->bondstore;
|
||||||
|
tagint *tag = atom->tag;
|
||||||
|
|
||||||
|
bondstore[n][0] = 0.0;
|
||||||
|
bondstore[n][1] = 0.0;
|
||||||
|
|
||||||
|
if (i < atom->nlocal) {
|
||||||
|
for (int m = 0; m < atom->num_bond[i]; m++) {
|
||||||
|
if (atom->bond_atom[i][m] == tag[j]) {
|
||||||
|
fix_bond_history->update_atom_value(i, m, 0, 0.0);
|
||||||
|
fix_bond_history->update_atom_value(i, m, 1, 0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j < atom->nlocal) {
|
||||||
|
for (int m = 0; m < atom->num_bond[j]; m++) {
|
||||||
|
if (atom->bond_atom[j][m] == tag[i]) {
|
||||||
|
fix_bond_history->update_atom_value(j, m, 0, 0.0);
|
||||||
|
fix_bond_history->update_atom_value(j, m, 1, 0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Store data for all bonds called once
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::store_data()
|
||||||
|
{
|
||||||
|
int i, j, m, type;
|
||||||
|
int **bond_type = atom->bond_type;
|
||||||
|
|
||||||
|
for (i = 0; i < atom->nlocal; i++) {
|
||||||
|
for (m = 0; m < atom->num_bond[i]; m++) {
|
||||||
|
type = bond_type[i][m];
|
||||||
|
|
||||||
|
//Skip if bond was turned off
|
||||||
|
if (type < 0) continue;
|
||||||
|
|
||||||
|
// map to find index n
|
||||||
|
j = atom->map(atom->bond_atom[i][m]);
|
||||||
|
if (j == -1) error->one(FLERR, "Atom missing in BPM bond");
|
||||||
|
|
||||||
|
fix_bond_history->update_atom_value(i, m, 0, 0.0);
|
||||||
|
fix_bond_history->update_atom_value(i, m, 1, 0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fix_bond_history->post_neighbor();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::compute(int eflag, int vflag)
|
||||||
|
{
|
||||||
|
if (!fix_bond_history->stored_flag) {
|
||||||
|
fix_bond_history->stored_flag = true;
|
||||||
|
store_data();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hybrid_flag)
|
||||||
|
fix_bond_history->compress_history();
|
||||||
|
|
||||||
|
int i1, i2, itmp, n, type;
|
||||||
|
double delx, dely, delz, delvx, delvy, delvz;
|
||||||
|
double e, rsq, r, r0, rinv, dr, fbond, dot, t;
|
||||||
|
double dt = update->dt;
|
||||||
|
|
||||||
|
ev_init(eflag, vflag);
|
||||||
|
|
||||||
|
double *rsurface = compute_surface->rsurface;
|
||||||
|
double **x = atom->x;
|
||||||
|
double **v = atom->v;
|
||||||
|
double **f = atom->f;
|
||||||
|
tagint *tag = atom->tag;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int **bondlist = neighbor->bondlist;
|
||||||
|
int nbondlist = neighbor->nbondlist;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int newton_bond = force->newton_bond;
|
||||||
|
|
||||||
|
double **bondstore = fix_bond_history->bondstore;
|
||||||
|
|
||||||
|
if (atom->nmax > nmax_store){
|
||||||
|
nmax_store = atom->nmax;
|
||||||
|
memory->destroy(dbond);
|
||||||
|
memory->create(dbond, nmax_store, "rheo/shell:dbond");
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t nbytes = nmax_store * sizeof(int);
|
||||||
|
memset(&dbond[0], 0, nbytes);
|
||||||
|
|
||||||
|
for (n = 0; n < nbondlist; n++) {
|
||||||
|
// skip bond if already broken
|
||||||
|
if (bondlist[n][2] <= 0) continue;
|
||||||
|
|
||||||
|
i1 = bondlist[n][0];
|
||||||
|
i2 = bondlist[n][1];
|
||||||
|
type = bondlist[n][2];
|
||||||
|
r0 = bondstore[n][0];
|
||||||
|
t = bondstore[n][1];
|
||||||
|
|
||||||
|
// Ensure pair is always ordered to ensure numerical operations
|
||||||
|
// are identical to minimize the possibility that a bond straddling
|
||||||
|
// an mpi grid (newton off) doesn't break on one proc but not the other
|
||||||
|
if (tag[i2] < tag[i1]) {
|
||||||
|
itmp = i1;
|
||||||
|
i1 = i2;
|
||||||
|
i2 = itmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
delx = x[i1][0] - x[i2][0];
|
||||||
|
dely = x[i1][1] - x[i2][1];
|
||||||
|
delz = x[i1][2] - x[i2][2];
|
||||||
|
rsq = delx * delx + dely * dely + delz * delz;
|
||||||
|
r = sqrt(rsq);
|
||||||
|
|
||||||
|
// If bond hasn't been set - zero data
|
||||||
|
if (t < EPSILON || std::isnan(t))
|
||||||
|
t = store_bond(n, i1, i2);
|
||||||
|
|
||||||
|
delx = x[i1][0] - x[i2][0];
|
||||||
|
dely = x[i1][1] - x[i2][1];
|
||||||
|
delz = x[i1][2] - x[i2][2];
|
||||||
|
|
||||||
|
rsq = delx * delx + dely * dely + delz * delz;
|
||||||
|
r = sqrt(rsq);
|
||||||
|
|
||||||
|
// Bond has not yet formed, check if in range + update timer
|
||||||
|
if (t < tform) {
|
||||||
|
|
||||||
|
// Check if eligible
|
||||||
|
if (r > rmax || rsurface[i1] > rsurf || rsurface[i2] > rsurf) {
|
||||||
|
bondlist[n][2] = 0;
|
||||||
|
process_ineligibility(i1, i2);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check ellapsed time
|
||||||
|
t += dt;
|
||||||
|
bondstore[n][1] = t;
|
||||||
|
if (t >= tform) {
|
||||||
|
bondstore[n][0] = r;
|
||||||
|
r0 = r;
|
||||||
|
if (newton_bond || i1 < nlocal) dbond[i1]++;
|
||||||
|
if (newton_bond || i2 < nlocal) dbond[i2]++;
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
e = (r - r0) / r0;
|
||||||
|
if (fabs(e) > ecrit[type]) {
|
||||||
|
bondlist[n][2] = 0;
|
||||||
|
process_broken(i1, i2);
|
||||||
|
if (newton_bond || i1 < nlocal) dbond[i1]--;
|
||||||
|
if (newton_bond || i2 < nlocal) dbond[i2]--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rinv = 1.0 / r;
|
||||||
|
dr = r - r0;
|
||||||
|
fbond = 2 * k[type] * (-dr + dr * dr * dr / (r0 * r0 * ecrit[type] * ecrit[type]));
|
||||||
|
|
||||||
|
delvx = v[i1][0] - v[i2][0];
|
||||||
|
delvy = v[i1][1] - v[i2][1];
|
||||||
|
delvz = v[i1][2] - v[i2][2];
|
||||||
|
dot = delx * delvx + dely * delvy + delz * delvz;
|
||||||
|
fbond -= gamma[type] * dot * rinv;
|
||||||
|
fbond *= rinv;
|
||||||
|
|
||||||
|
if (newton_bond || i1 < nlocal) {
|
||||||
|
f[i1][0] += delx * fbond;
|
||||||
|
f[i1][1] += dely * fbond;
|
||||||
|
f[i1][2] += delz * fbond;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newton_bond || i2 < nlocal) {
|
||||||
|
f[i2][0] -= delx * fbond;
|
||||||
|
f[i2][1] -= dely * fbond;
|
||||||
|
f[i2][2] -= delz * fbond;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (evflag) ev_tally(i1, i2, nlocal, newton_bond, 0.0, fbond, delx, dely, delz);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Communicate changes in nbond
|
||||||
|
if (newton_bond) comm->reverse_comm(this);
|
||||||
|
|
||||||
|
for(int i = 0; i < nlocal; i++) {
|
||||||
|
nbond[i] += dbond[i];
|
||||||
|
|
||||||
|
// If it has bonds, no shifting
|
||||||
|
if (nbond[i] != 0) status[i] |= STATUS_NO_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hybrid_flag)
|
||||||
|
fix_bond_history->uncompress_history();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::allocate()
|
||||||
|
{
|
||||||
|
allocated = 1;
|
||||||
|
const int np1 = atom->nbondtypes + 1;
|
||||||
|
|
||||||
|
memory->create(k, np1, "bond:k");
|
||||||
|
memory->create(ecrit, np1, "bond:ecrit");
|
||||||
|
memory->create(gamma, np1, "bond:gamma");
|
||||||
|
|
||||||
|
memory->create(setflag, np1, "bond:setflag");
|
||||||
|
for (int i = 1; i < np1; i++) setflag[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
set coeffs for one or more types
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::coeff(int narg, char **arg)
|
||||||
|
{
|
||||||
|
if (narg != 4) error->all(FLERR, "Incorrect args for bond coefficients");
|
||||||
|
if (!allocated) allocate();
|
||||||
|
|
||||||
|
int ilo, ihi;
|
||||||
|
utils::bounds(FLERR, arg[0], 1, atom->nbondtypes, ilo, ihi, error);
|
||||||
|
|
||||||
|
double k_one = utils::numeric(FLERR, arg[1], false, lmp);
|
||||||
|
double ecrit_one = utils::numeric(FLERR, arg[2], false, lmp);
|
||||||
|
double gamma_one = utils::numeric(FLERR, arg[3], false, lmp);
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (int i = ilo; i <= ihi; i++) {
|
||||||
|
k[i] = k_one;
|
||||||
|
ecrit[i] = ecrit_one;
|
||||||
|
gamma[i] = gamma_one;
|
||||||
|
setflag[i] = 1;
|
||||||
|
count++;
|
||||||
|
|
||||||
|
if (1.0 + ecrit[i] > max_stretch) max_stretch = 1.0 + ecrit[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count == 0) error->all(FLERR, "Incorrect args for bond coefficients");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
check for correct settings and create fix
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::init_style()
|
||||||
|
{
|
||||||
|
BondBPM::init_style();
|
||||||
|
|
||||||
|
if (comm->ghost_velocity == 0)
|
||||||
|
error->all(FLERR, "Bond rheo/shell requires ghost atoms store velocity");
|
||||||
|
|
||||||
|
auto fixes = modify->get_fix_by_style("^rheo$");
|
||||||
|
if (fixes.size() == 0) error->all(FLERR, "Need to define fix rheo to use bond rheo/shell");
|
||||||
|
class FixRHEO *fix_rheo = dynamic_cast<FixRHEO *>(fixes[0]);
|
||||||
|
|
||||||
|
if (!fix_rheo->surface_flag) error->all(FLERR,
|
||||||
|
"Bond rheo/shell requires surface calculation in fix rheo");
|
||||||
|
compute_surface = fix_rheo->compute_surface;
|
||||||
|
|
||||||
|
fixes = modify->get_fix_by_style("^rheo/oxidation$");
|
||||||
|
if (fixes.size() == 0) error->all(FLERR, "Need to define fix rheo/oxidation to use bond rheo/shell");
|
||||||
|
class FixRHEOOxidation *fix_rheo_oxidation = dynamic_cast<FixRHEOOxidation *>(fixes[0]);
|
||||||
|
|
||||||
|
rsurf = fix_rheo_oxidation->rsurf;
|
||||||
|
rmax = fix_rheo_oxidation->cut;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::settings(int narg, char **arg)
|
||||||
|
{
|
||||||
|
BondBPM::settings(narg, arg);
|
||||||
|
|
||||||
|
int iarg;
|
||||||
|
for (std::size_t i = 0; i < leftover_iarg.size(); i++) {
|
||||||
|
iarg = leftover_iarg[i];
|
||||||
|
if (strcmp(arg[iarg], "t/form") == 0) {
|
||||||
|
if (iarg + 1 > narg) utils::missing_cmd_args(FLERR, "bond rheo/shell t/form", error);
|
||||||
|
tform = utils::numeric(FLERR, arg[iarg + 1], false, lmp);
|
||||||
|
i += 1;
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, "Illegal bond rheo/shell command, invalid argument {}", arg[iarg]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tform < 0.0)
|
||||||
|
error->all(FLERR, "Illegal bond rheo/shell command, must specify positive formation time");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
used to check bond communiction cutoff - not perfect, estimates based on local-local only
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double BondRHEOShell::equilibrium_distance(int /*i*/)
|
||||||
|
{
|
||||||
|
// Divide out heuristic prefactor added in comm class
|
||||||
|
return max_stretch * rmax / 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
proc 0 writes out coeffs to restart file
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::write_restart(FILE *fp)
|
||||||
|
{
|
||||||
|
BondBPM::write_restart(fp);
|
||||||
|
write_restart_settings(fp);
|
||||||
|
|
||||||
|
fwrite(&k[1], sizeof(double), atom->nbondtypes, fp);
|
||||||
|
fwrite(&ecrit[1], sizeof(double), atom->nbondtypes, fp);
|
||||||
|
fwrite(&gamma[1], sizeof(double), atom->nbondtypes, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
proc 0 reads coeffs from restart file, bcasts them
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::read_restart(FILE *fp)
|
||||||
|
{
|
||||||
|
BondBPM::read_restart(fp);
|
||||||
|
read_restart_settings(fp);
|
||||||
|
allocate();
|
||||||
|
|
||||||
|
if (comm->me == 0) {
|
||||||
|
utils::sfread(FLERR, &k[1], sizeof(double), atom->nbondtypes, fp, nullptr, error);
|
||||||
|
utils::sfread(FLERR, &ecrit[1], sizeof(double), atom->nbondtypes, fp, nullptr, error);
|
||||||
|
utils::sfread(FLERR, &gamma[1], sizeof(double), atom->nbondtypes, fp, nullptr, error);
|
||||||
|
}
|
||||||
|
MPI_Bcast(&k[1], atom->nbondtypes, MPI_DOUBLE, 0, world);
|
||||||
|
MPI_Bcast(&ecrit[1], atom->nbondtypes, MPI_DOUBLE, 0, world);
|
||||||
|
MPI_Bcast(&gamma[1], atom->nbondtypes, MPI_DOUBLE, 0, world);
|
||||||
|
|
||||||
|
for (int i = 1; i <= atom->nbondtypes; i++) setflag[i] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
proc 0 writes to restart file
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::write_restart_settings(FILE *fp)
|
||||||
|
{
|
||||||
|
fwrite(&tform, sizeof(double), 1, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
proc 0 reads from restart file, bcasts
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::read_restart_settings(FILE *fp)
|
||||||
|
{
|
||||||
|
if (comm->me == 0) {
|
||||||
|
utils::sfread(FLERR, &tform, sizeof(double), 1, fp, nullptr, error);
|
||||||
|
}
|
||||||
|
MPI_Bcast(&tform, 1, MPI_DOUBLE, 0, world);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int BondRHEOShell::pack_reverse_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, m, last;
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
buf[m++] = dbond[i];
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::unpack_reverse_comm(int n, int *list, double *buf)
|
||||||
|
{
|
||||||
|
int i, j, m;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
dbond[j] += buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double BondRHEOShell::single(int type, double rsq, int i, int j, double &fforce)
|
||||||
|
{
|
||||||
|
if (type <= 0) return 0.0;
|
||||||
|
|
||||||
|
double r0, t;
|
||||||
|
for (int n = 0; n < atom->num_bond[i]; n++) {
|
||||||
|
if (atom->bond_atom[i][n] == atom->tag[j]) {
|
||||||
|
r0 = fix_bond_history->get_atom_value(i, n, 0);
|
||||||
|
t = fix_bond_history->get_atom_value(i, n, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
svector[1] = t;
|
||||||
|
if (t < tform) return 0.0;
|
||||||
|
|
||||||
|
double r = sqrt(rsq);
|
||||||
|
double rinv = 1.0 / r;
|
||||||
|
double dr = r0 - r;
|
||||||
|
fforce = 2 * k[type] * (dr + dr * dr * dr / (r0 * r0 * ecrit[type] * ecrit[type]));
|
||||||
|
|
||||||
|
double **x = atom->x;
|
||||||
|
double **v = atom->v;
|
||||||
|
double delx = x[i][0] - x[j][0];
|
||||||
|
double dely = x[i][1] - x[j][1];
|
||||||
|
double delz = x[i][2] - x[j][2];
|
||||||
|
double delvx = v[i][0] - v[j][0];
|
||||||
|
double delvy = v[i][1] - v[j][1];
|
||||||
|
double delvz = v[i][2] - v[j][2];
|
||||||
|
double dot = delx * delvx + dely * delvy + delz * delvz;
|
||||||
|
fforce -= gamma[type] * dot * rinv;
|
||||||
|
fforce *= rinv;
|
||||||
|
|
||||||
|
// set single_extra quantities
|
||||||
|
|
||||||
|
svector[0] = r0;
|
||||||
|
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Similar to BondBPM->process_broken(), but don't send to FixStoreLocal
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void BondRHEOShell::process_ineligibility(int i, int j)
|
||||||
|
{
|
||||||
|
// Manually search and remove from atom arrays
|
||||||
|
int m, n;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
tagint *tag = atom->tag;
|
||||||
|
tagint **bond_atom = atom->bond_atom;
|
||||||
|
int **bond_type = atom->bond_type;
|
||||||
|
int *num_bond = atom->num_bond;
|
||||||
|
|
||||||
|
if (i < nlocal) {
|
||||||
|
for (m = 0; m < num_bond[i]; m++) {
|
||||||
|
if (bond_atom[i][m] == tag[j] && setflag[bond_type[i][m]]) {
|
||||||
|
bond_type[i][m] = 0;
|
||||||
|
n = num_bond[i];
|
||||||
|
bond_type[i][m] = bond_type[i][n - 1];
|
||||||
|
bond_atom[i][m] = bond_atom[i][n - 1];
|
||||||
|
for (auto &ihistory: histories) {
|
||||||
|
auto fix_bond_history2 = dynamic_cast<FixBondHistory *> (ihistory);
|
||||||
|
fix_bond_history2->shift_history(i, m, n - 1);
|
||||||
|
fix_bond_history2->delete_history(i, n - 1);
|
||||||
|
}
|
||||||
|
num_bond[i]--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j < nlocal) {
|
||||||
|
for (m = 0; m < num_bond[j]; m++) {
|
||||||
|
if (bond_atom[j][m] == tag[i] && setflag[bond_type[j][m]]) {
|
||||||
|
bond_type[j][m] = 0;
|
||||||
|
n = num_bond[j];
|
||||||
|
bond_type[j][m] = bond_type[j][n - 1];
|
||||||
|
bond_atom[j][m] = bond_atom[j][n - 1];
|
||||||
|
for (auto &ihistory: histories) {
|
||||||
|
auto fix_bond_history2 = dynamic_cast<FixBondHistory *> (ihistory);
|
||||||
|
fix_bond_history2->shift_history(j, m, n - 1);
|
||||||
|
fix_bond_history2->delete_history(j, n - 1);
|
||||||
|
}
|
||||||
|
num_bond[j]--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
63
src/RHEO/bond_rheo_shell.h
Normal file
63
src/RHEO/bond_rheo_shell.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef BOND_CLASS
|
||||||
|
// clang-format off
|
||||||
|
BondStyle(rheo/shell,BondRHEOShell);
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_BOND_RHEO_SHELL_H
|
||||||
|
#define LMP_BOND_RHEO_SHELL_H
|
||||||
|
|
||||||
|
#include "bond_bpm.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class BondRHEOShell : public BondBPM {
|
||||||
|
public:
|
||||||
|
BondRHEOShell(class LAMMPS *);
|
||||||
|
~BondRHEOShell() override;
|
||||||
|
void compute(int, int) override;
|
||||||
|
void coeff(int, char **) override;
|
||||||
|
void init_style() override;
|
||||||
|
void settings(int, char **) override;
|
||||||
|
double equilibrium_distance(int) override;
|
||||||
|
void write_restart(FILE *) override;
|
||||||
|
void read_restart(FILE *) override;
|
||||||
|
void write_restart_settings(FILE *) override;
|
||||||
|
void read_restart_settings(FILE *) override;
|
||||||
|
int pack_reverse_comm(int, int, double *) override;
|
||||||
|
void unpack_reverse_comm(int, int *, double *) override;
|
||||||
|
double single(int, double, int, int, double &) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double *k, *ecrit, *gamma;
|
||||||
|
double tform, rmax, rsurf;
|
||||||
|
|
||||||
|
int *dbond, *nbond;
|
||||||
|
int index_nb, nmax_store;
|
||||||
|
char *id_fix;
|
||||||
|
|
||||||
|
class ComputeRHEOSurface *compute_surface;
|
||||||
|
|
||||||
|
void process_ineligibility(int, int);
|
||||||
|
void allocate();
|
||||||
|
void store_data();
|
||||||
|
double store_bond(int, int, int);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
506
src/RHEO/compute_rheo_grad.cpp
Normal file
506
src/RHEO/compute_rheo_grad.cpp
Normal file
@ -0,0 +1,506 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL), Thomas O'Connor (CMU)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "compute_rheo_grad.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "compute_rheo_kernel.h"
|
||||||
|
#include "compute_rheo_interface.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "update.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
|
||||||
|
enum{COMMGRAD, COMMFIELD};
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOGrad::ComputeRHEOGrad(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Compute(lmp, narg, arg), fix_rheo(nullptr), list(nullptr), rho0(nullptr), compute_interface(nullptr), compute_kernel(nullptr),
|
||||||
|
gradv(nullptr), gradr(nullptr), grade(nullptr), gradn(nullptr)
|
||||||
|
{
|
||||||
|
if (narg < 4) error->all(FLERR,"Illegal compute rheo/grad command");
|
||||||
|
|
||||||
|
velocity_flag = energy_flag = rho_flag = eta_flag = 0;
|
||||||
|
for (int iarg = 3; iarg < narg; iarg++) {
|
||||||
|
if (strcmp(arg[iarg], "velocity") == 0) velocity_flag = 1;
|
||||||
|
else if (strcmp(arg[iarg], "rho") == 0) rho_flag = 1;
|
||||||
|
else if (strcmp(arg[iarg], "energy") == 0) energy_flag = 1;
|
||||||
|
else if (strcmp(arg[iarg], "viscosity") == 0) eta_flag = 1;
|
||||||
|
else error->all(FLERR, "Illegal compute rheo/grad command, {}", arg[iarg]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ncomm_grad = 0;
|
||||||
|
ncomm_field = 0;
|
||||||
|
comm_reverse = 0;
|
||||||
|
|
||||||
|
int dim = domain->dimension;
|
||||||
|
if (velocity_flag) {
|
||||||
|
ncomm_grad += dim * dim;
|
||||||
|
ncomm_field += dim;
|
||||||
|
comm_reverse += dim * dim;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rho_flag) {
|
||||||
|
ncomm_grad += dim;
|
||||||
|
ncomm_field += 1;
|
||||||
|
comm_reverse += dim;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (energy_flag) {
|
||||||
|
ncomm_grad += dim;
|
||||||
|
ncomm_field += 1;
|
||||||
|
comm_reverse += dim;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eta_flag) {
|
||||||
|
ncomm_grad += dim;
|
||||||
|
comm_reverse += dim;
|
||||||
|
}
|
||||||
|
|
||||||
|
comm_forward = ncomm_grad;
|
||||||
|
|
||||||
|
nmax_store = 0;
|
||||||
|
grow_arrays(atom->nmax);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOGrad::~ComputeRHEOGrad()
|
||||||
|
{
|
||||||
|
memory->destroy(gradv);
|
||||||
|
memory->destroy(gradr);
|
||||||
|
memory->destroy(grade);
|
||||||
|
memory->destroy(gradn);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOGrad::init()
|
||||||
|
{
|
||||||
|
cut = fix_rheo->cut;
|
||||||
|
cutsq = cut * cut;
|
||||||
|
rho0 = fix_rheo->rho0;
|
||||||
|
interface_flag = fix_rheo->interface_flag;
|
||||||
|
compute_kernel = fix_rheo->compute_kernel;
|
||||||
|
compute_interface = fix_rheo->compute_interface;
|
||||||
|
|
||||||
|
remap_v_flag = domain->deform_vremap;
|
||||||
|
|
||||||
|
neighbor->add_request(this, NeighConst::REQ_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOGrad::init_list(int /*id*/, NeighList *ptr)
|
||||||
|
{
|
||||||
|
list = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOGrad::compute_peratom()
|
||||||
|
{
|
||||||
|
int i, j, k, ii, jj, jnum, itype, jtype, a, b, fluidi, fluidj;
|
||||||
|
double xtmp, ytmp, ztmp, delx, dely, delz;
|
||||||
|
double rsq, imass, jmass;
|
||||||
|
double rhoi, rhoj, Voli, Volj, drho, de, deta;
|
||||||
|
double vi[3], vj[3], vij[3];
|
||||||
|
double wp, *dWij, *dWji;
|
||||||
|
|
||||||
|
int inum, *ilist, *numneigh, **firstneigh;
|
||||||
|
int *jlist;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
double **x = atom->x;
|
||||||
|
double **v = atom->v;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
double *energy = atom->esph;
|
||||||
|
double *viscosity = atom->viscosity;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int *type = atom->type;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
int newton = force->newton;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
|
||||||
|
// initialize arrays
|
||||||
|
if (atom->nmax > nmax_store) grow_arrays(atom->nmax);
|
||||||
|
|
||||||
|
for (i = 0; i < nmax_store; i++) {
|
||||||
|
if (velocity_flag) {
|
||||||
|
for (k = 0; k < dim * dim; k++)
|
||||||
|
gradv[i][k] = 0.0;
|
||||||
|
}
|
||||||
|
if (rho_flag) {
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
gradr[i][k] = 0.0;
|
||||||
|
}
|
||||||
|
if (energy_flag) {
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
grade[i][k] = 0.0;
|
||||||
|
}
|
||||||
|
if (eta_flag) {
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
gradn[i][k] = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
itype = type[i];
|
||||||
|
fluidi = !(status[i] & PHASECHECK);
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
jtype = type[j];
|
||||||
|
delx = xtmp - x[j][0];
|
||||||
|
dely = ytmp - x[j][1];
|
||||||
|
delz = ztmp - x[j][2];
|
||||||
|
rsq = delx * delx + dely * dely + delz * delz;
|
||||||
|
|
||||||
|
if (rsq < cutsq) {
|
||||||
|
fluidj = !(status[j] & PHASECHECK);
|
||||||
|
|
||||||
|
rhoi = rho[i];
|
||||||
|
rhoj = rho[j];
|
||||||
|
|
||||||
|
vi[0] = v[i][0];
|
||||||
|
vi[1] = v[i][1];
|
||||||
|
vi[2] = v[i][2];
|
||||||
|
|
||||||
|
vj[0] = v[j][0];
|
||||||
|
vj[1] = v[j][1];
|
||||||
|
vj[2] = v[j][2];
|
||||||
|
|
||||||
|
// Add corrections for walls
|
||||||
|
if (interface_flag) {
|
||||||
|
if (fluidi && (!fluidj)) {
|
||||||
|
compute_interface->correct_v(vj, vi, j, i);
|
||||||
|
rhoj = compute_interface->correct_rho(j, i);
|
||||||
|
} else if ((!fluidi) && fluidj) {
|
||||||
|
compute_interface->correct_v(vi, vj, i, j);
|
||||||
|
rhoi = compute_interface->correct_rho(i, j);
|
||||||
|
} else if ((!fluidi) && (!fluidj)) {
|
||||||
|
rhoi = rho0[itype];
|
||||||
|
rhoj = rho0[jtype];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Voli = mass[itype] / rhoi;
|
||||||
|
Volj = mass[jtype] / rhoj;
|
||||||
|
|
||||||
|
vij[0] = vi[0] - vj[0];
|
||||||
|
vij[1] = vi[1] - vj[1];
|
||||||
|
vij[2] = vi[2] - vj[2];
|
||||||
|
|
||||||
|
if (rho_flag) drho = rhoi - rhoj;
|
||||||
|
if (energy_flag) de = energy[i] - energy[j];
|
||||||
|
if (eta_flag) deta = viscosity[i] - viscosity[j];
|
||||||
|
|
||||||
|
wp = compute_kernel->calc_dw(i, j, delx, dely, delz, sqrt(rsq));
|
||||||
|
dWij = compute_kernel->dWij;
|
||||||
|
dWji = compute_kernel->dWji;
|
||||||
|
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
for (b = 0; b < dim; b++) {
|
||||||
|
if (velocity_flag) // uxx uxy uxz uyx uyy uyz uzx uzy uzz
|
||||||
|
gradv[i][a * dim + b] -= vij[a] * Volj * dWij[b];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rho_flag) // P,x P,y P,z
|
||||||
|
gradr[i][a] -= drho * Volj * dWij[a];
|
||||||
|
|
||||||
|
if (energy_flag) // e,x e,y e,z
|
||||||
|
grade[i][a] -= de * Volj * dWij[a];
|
||||||
|
|
||||||
|
if (eta_flag) // n,x n,y n,z
|
||||||
|
gradn[i][a] -= deta * Volj * dWij[a];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newton || j < nlocal) {
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
for (b = 0; b < dim; b++) {
|
||||||
|
if (velocity_flag) // uxx uxy uxz uyx uyy uyz uzx uzy uzz
|
||||||
|
gradv[j][a * dim + b] += vij[a] * Voli * dWji[b];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rho_flag) // P,x P,y P,z
|
||||||
|
gradr[j][a] += drho * Voli * dWji[a];
|
||||||
|
|
||||||
|
if (energy_flag) // e,x e,y e,z
|
||||||
|
grade[j][a] += de * Voli * dWji[a];
|
||||||
|
|
||||||
|
if (eta_flag) // n,x n,y n,z
|
||||||
|
gradn[j][a] += deta * Voli * dWji[a];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newton) comm->reverse_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOGrad::forward_gradients()
|
||||||
|
{
|
||||||
|
comm_stage = COMMGRAD;
|
||||||
|
comm_forward = ncomm_grad;
|
||||||
|
comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOGrad::forward_fields()
|
||||||
|
{
|
||||||
|
comm_stage = COMMFIELD;
|
||||||
|
comm_forward = ncomm_field;
|
||||||
|
comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOGrad::pack_forward_comm(int n, int *list, double *buf,
|
||||||
|
int pbc_flag, int *pbc)
|
||||||
|
{
|
||||||
|
int i,j,k,m;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
double *energy = atom->esph;
|
||||||
|
double **v = atom->v;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
double *h_rate = domain->h_rate;
|
||||||
|
int deform_groupbit = domain->deform_groupbit;
|
||||||
|
double dv[3];
|
||||||
|
|
||||||
|
if (remap_v_flag) {
|
||||||
|
dv[0] = pbc[0] * h_rate[0] + pbc[5] * h_rate[5] + pbc[4] * h_rate[4];
|
||||||
|
dv[1] = pbc[1] * h_rate[1] + pbc[3] * h_rate[3];
|
||||||
|
dv[2] = pbc[2] * h_rate[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
if (comm_stage == COMMGRAD) {
|
||||||
|
|
||||||
|
if (velocity_flag)
|
||||||
|
for (k = 0; k < dim * dim; k++)
|
||||||
|
buf[m++] = gradv[j][k];
|
||||||
|
|
||||||
|
if (rho_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
buf[m++] = gradr[j][k];
|
||||||
|
|
||||||
|
if (energy_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
buf[m++] = grade[j][k];
|
||||||
|
|
||||||
|
if (eta_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
buf[m++] = gradn[j][k];
|
||||||
|
|
||||||
|
} else if (comm_stage == COMMFIELD) {
|
||||||
|
|
||||||
|
if (velocity_flag) {
|
||||||
|
if (remap_v_flag && pbc_flag && (mask[j] & deform_groupbit)) {
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
buf[m++] = v[j][k] + dv[k];
|
||||||
|
} else {
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
buf[m++] = v[j][k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rho_flag)
|
||||||
|
buf[m++] = rho[j];
|
||||||
|
|
||||||
|
if (energy_flag)
|
||||||
|
buf[m++] = energy[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOGrad::unpack_forward_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
double *energy = atom->esph; double **v = atom->v;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
if (comm_stage == COMMGRAD) {
|
||||||
|
if (velocity_flag)
|
||||||
|
for (k = 0; k < dim * dim; k++)
|
||||||
|
gradv[i][k] = buf[m++];
|
||||||
|
|
||||||
|
if (rho_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
gradr[i][k] = buf[m++];
|
||||||
|
|
||||||
|
if (energy_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
grade[i][k] = buf[m++];
|
||||||
|
|
||||||
|
if (eta_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
gradn[i][k] = buf[m++];
|
||||||
|
|
||||||
|
} else if (comm_stage == COMMFIELD) {
|
||||||
|
if (velocity_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
v[i][k] = buf[m++];
|
||||||
|
|
||||||
|
if (rho_flag)
|
||||||
|
rho[i] = buf[m++];
|
||||||
|
|
||||||
|
if (energy_flag)
|
||||||
|
energy[i] = buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOGrad::pack_reverse_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i,k,m,last;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
if (velocity_flag)
|
||||||
|
for (k = 0; k < dim * dim; k++)
|
||||||
|
buf[m++] = gradv[i][k];
|
||||||
|
|
||||||
|
if (rho_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
buf[m++] = gradr[i][k];
|
||||||
|
|
||||||
|
if (energy_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
buf[m++] = grade[i][k];
|
||||||
|
|
||||||
|
if (eta_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
buf[m++] = gradn[i][k];
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOGrad::unpack_reverse_comm(int n, int *list, double *buf)
|
||||||
|
{
|
||||||
|
int i,k,j,m;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
if (velocity_flag)
|
||||||
|
for (k = 0; k < dim * dim; k++)
|
||||||
|
gradv[j][k] += buf[m++];
|
||||||
|
|
||||||
|
if (rho_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
gradr[j][k] += buf[m++];
|
||||||
|
|
||||||
|
if (energy_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
grade[j][k] += buf[m++];
|
||||||
|
|
||||||
|
if (eta_flag)
|
||||||
|
for (k = 0; k < dim; k++)
|
||||||
|
gradn[j][k] += buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOGrad::grow_arrays(int nmax)
|
||||||
|
{
|
||||||
|
int dim = domain->dimension;
|
||||||
|
if (velocity_flag)
|
||||||
|
memory->grow(gradv, nmax, dim * dim, "rheo:grad_v");
|
||||||
|
|
||||||
|
if (rho_flag)
|
||||||
|
memory->grow(gradr, nmax, dim, "rheo:grad_rho");
|
||||||
|
|
||||||
|
if (energy_flag)
|
||||||
|
memory->grow(grade, nmax, dim, "rheo:grad_energy");
|
||||||
|
|
||||||
|
if (eta_flag)
|
||||||
|
memory->grow(gradn, nmax, dim, "rheo:grad_eta");
|
||||||
|
nmax_store = nmax;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOGrad::memory_usage()
|
||||||
|
{
|
||||||
|
double bytes = 0.0;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
if (velocity_flag)
|
||||||
|
bytes = (size_t) nmax_store * dim * dim * sizeof(double);
|
||||||
|
|
||||||
|
if (rho_flag)
|
||||||
|
bytes = (size_t) nmax_store * dim * sizeof(double);
|
||||||
|
|
||||||
|
if (energy_flag)
|
||||||
|
bytes = (size_t) nmax_store * dim * sizeof(double);
|
||||||
|
|
||||||
|
if (eta_flag)
|
||||||
|
bytes = (size_t) nmax_store * dim * sizeof(double);
|
||||||
|
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
64
src/RHEO/compute_rheo_grad.h
Normal file
64
src/RHEO/compute_rheo_grad.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef COMPUTE_CLASS
|
||||||
|
// clang-format off
|
||||||
|
ComputeStyle(RHEO/GRAD,ComputeRHEOGrad)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_COMPUTE_RHEO_GRAD_H
|
||||||
|
#define LMP_COMPUTE_RHEO_GRAD_H
|
||||||
|
|
||||||
|
#include "compute.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class ComputeRHEOGrad : public Compute {
|
||||||
|
public:
|
||||||
|
ComputeRHEOGrad(class LAMMPS *, int, char **);
|
||||||
|
~ComputeRHEOGrad() override;
|
||||||
|
void init() override;
|
||||||
|
void init_list(int, class NeighList *) override;
|
||||||
|
void compute_peratom() override;
|
||||||
|
int pack_forward_comm(int, int *, double *, int, int *) override;
|
||||||
|
void unpack_forward_comm(int, int, double *) override;
|
||||||
|
int pack_reverse_comm(int, int, double *) override;
|
||||||
|
void unpack_reverse_comm(int, int *, double *) override;
|
||||||
|
double memory_usage() override;
|
||||||
|
void forward_gradients();
|
||||||
|
void forward_fields();
|
||||||
|
double **gradv;
|
||||||
|
double **gradr;
|
||||||
|
double **grade;
|
||||||
|
double **gradn;
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int comm_stage, ncomm_grad, ncomm_field, nmax_store;
|
||||||
|
double cut, cutsq, *rho0;
|
||||||
|
|
||||||
|
int velocity_flag, energy_flag, rho_flag, eta_flag;
|
||||||
|
int interface_flag, remap_v_flag;
|
||||||
|
|
||||||
|
class ComputeRHEOKernel *compute_kernel;
|
||||||
|
class ComputeRHEOInterface *compute_interface;
|
||||||
|
class NeighList *list;
|
||||||
|
|
||||||
|
void grow_arrays(int);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
384
src/RHEO/compute_rheo_interface.cpp
Normal file
384
src/RHEO/compute_rheo_interface.cpp
Normal file
@ -0,0 +1,384 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL), Thomas O'Connor (CMU), Eric Palermo (CMU)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "compute_rheo_interface.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "compute_rheo_kernel.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "fix_rheo_pressure.h"
|
||||||
|
#include "math_extra.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "neigh_request.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
using namespace MathExtra;
|
||||||
|
|
||||||
|
static constexpr double EPSILON = 1e-1;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOInterface::ComputeRHEOInterface(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Compute(lmp, narg, arg), fix_rheo(nullptr), compute_kernel(nullptr), fp_store(nullptr),
|
||||||
|
rho0(nullptr), norm(nullptr), normwf(nullptr), chi(nullptr), id_fix_pa(nullptr)
|
||||||
|
{
|
||||||
|
if (narg != 3) error->all(FLERR,"Illegal compute rheo/interface command");
|
||||||
|
|
||||||
|
comm_forward = 3;
|
||||||
|
comm_reverse = 4;
|
||||||
|
|
||||||
|
nmax_store = atom->nmax;
|
||||||
|
memory->create(chi, nmax_store, "rheo:chi");
|
||||||
|
memory->create(norm, nmax_store, "rheo/interface:norm");
|
||||||
|
memory->create(normwf, nmax_store, "rheo/interface:normwf");
|
||||||
|
|
||||||
|
// For fp_store, create an instance of fix property atom
|
||||||
|
// Need restarts + exchanging with neighbors since it needs to persist
|
||||||
|
// between timesteps (fix property atom will handle callbacks)
|
||||||
|
|
||||||
|
int tmp1, tmp2;
|
||||||
|
int index = atom->find_custom("fp_store", tmp1, tmp2);
|
||||||
|
if (index == -1) {
|
||||||
|
id_fix_pa = utils::strdup(id + std::string("_fix_property_atom"));
|
||||||
|
modify->add_fix(fmt::format("{} all property/atom d2_fp_store 3", id_fix_pa));
|
||||||
|
index = atom->find_custom("fp_store", tmp1, tmp2);
|
||||||
|
}
|
||||||
|
fp_store = atom->darray[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOInterface::~ComputeRHEOInterface()
|
||||||
|
{
|
||||||
|
if (id_fix_pa && modify->nfix) modify->delete_fix(id_fix_pa);
|
||||||
|
delete[] id_fix_pa;
|
||||||
|
memory->destroy(chi);
|
||||||
|
memory->destroy(norm);
|
||||||
|
memory->destroy(normwf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOInterface::init()
|
||||||
|
{
|
||||||
|
compute_kernel = fix_rheo->compute_kernel;
|
||||||
|
rho0 = fix_rheo->rho0;
|
||||||
|
cut = fix_rheo->cut;
|
||||||
|
cutsq = cut * cut;
|
||||||
|
wall_max = sqrt(3.0) / 12.0 * cut;
|
||||||
|
|
||||||
|
auto fixes = modify->get_fix_by_style("rheo/pressure");
|
||||||
|
fix_pressure = dynamic_cast<FixRHEOPressure *>(fixes[0]);
|
||||||
|
|
||||||
|
neighbor->add_request(this, NeighConst::REQ_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOInterface::init_list(int /*id*/, NeighList *ptr)
|
||||||
|
{
|
||||||
|
list = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOInterface::compute_peratom()
|
||||||
|
{
|
||||||
|
int a, i, j, ii, jj, jnum, itype, jtype, fluidi, fluidj, status_match;
|
||||||
|
double xtmp, ytmp, ztmp, rsq, w, dot, dx[3];
|
||||||
|
|
||||||
|
int inum, *ilist, *jlist, *numneigh, **firstneigh;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int nall = nlocal + atom->nghost;
|
||||||
|
|
||||||
|
double **x = atom->x;
|
||||||
|
int *type = atom->type;
|
||||||
|
int newton = force->newton;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
|
||||||
|
if (atom->nmax > nmax_store) {
|
||||||
|
nmax_store = atom->nmax;
|
||||||
|
memory->grow(norm, nmax_store, "rheo/interface:norm");
|
||||||
|
memory->grow(normwf, nmax_store, "rheo/interface:normwf");
|
||||||
|
memory->grow(chi, nmax_store, "rheo:chi");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nall; i++) {
|
||||||
|
if (status[i] & PHASECHECK) rho[i] = 0.0;
|
||||||
|
normwf[i] = 0.0;
|
||||||
|
norm[i] = 0.0;
|
||||||
|
chi[i] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
itype = type[i];
|
||||||
|
fluidi = !(status[i] & PHASECHECK);
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
dx[0] = xtmp - x[j][0];
|
||||||
|
dx[1] = ytmp - x[j][1];
|
||||||
|
dx[2] = ztmp - x[j][2];
|
||||||
|
rsq = lensq3(dx);
|
||||||
|
|
||||||
|
if (rsq < cutsq) {
|
||||||
|
jtype = type[j];
|
||||||
|
fluidj = !(status[j] & PHASECHECK);
|
||||||
|
w = compute_kernel->calc_w_quintic(i, j, dx[0], dx[1], dx[2], sqrt(rsq));
|
||||||
|
|
||||||
|
norm[i] += w;
|
||||||
|
|
||||||
|
status_match = 0;
|
||||||
|
if ((fluidi && fluidj) || ((!fluidi) && (!fluidj)))
|
||||||
|
status_match = 1;
|
||||||
|
if (status_match) {
|
||||||
|
chi[i] += w;
|
||||||
|
} else {
|
||||||
|
if (!fluidi) {
|
||||||
|
dot = 0;
|
||||||
|
for (a = 0; a < 3; a++)
|
||||||
|
dot += (-fp_store[j][a] + fp_store[i][a]) * dx[a];
|
||||||
|
|
||||||
|
rho[i] += w * (fix_pressure->calc_pressure(rho[j], jtype) - rho[j] * dot);
|
||||||
|
normwf[i] += w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newton || j < nlocal) {
|
||||||
|
norm[j] += w;
|
||||||
|
if (status_match) {
|
||||||
|
chi[j] += w;
|
||||||
|
} else {
|
||||||
|
if (!fluidj) {
|
||||||
|
dot = 0;
|
||||||
|
for (a = 0; a < 3; a++)
|
||||||
|
dot += (-fp_store[i][a] + fp_store[j][a]) * dx[a];
|
||||||
|
|
||||||
|
rho[j] += w * (fix_pressure->calc_pressure(rho[i], itype) + rho[i] * dot);
|
||||||
|
normwf[j] += w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newton) comm->reverse_comm(this);
|
||||||
|
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
if (norm[i] != 0.0) chi[i] /= norm[i];
|
||||||
|
|
||||||
|
// Recalculate rho for non-fluid particles
|
||||||
|
if (status[i] & PHASECHECK) {
|
||||||
|
if (normwf[i] != 0.0) {
|
||||||
|
// Stores rho for solid particles 1+Pw in Adami Adams 2012
|
||||||
|
rho[i] = MAX(EPSILON, fix_pressure->calc_rho(rho[i] / normwf[i], type[i]));
|
||||||
|
} else {
|
||||||
|
rho[i] = rho0[itype];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
comm_stage = 1;
|
||||||
|
comm_forward = 2;
|
||||||
|
comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOInterface::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/)
|
||||||
|
{
|
||||||
|
int i, j, k, m;
|
||||||
|
m = 0;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
if (comm_stage == 0) {
|
||||||
|
buf[m++] = fp_store[j][0];
|
||||||
|
buf[m++] = fp_store[j][1];
|
||||||
|
buf[m++] = fp_store[j][2];
|
||||||
|
} else {
|
||||||
|
buf[m++] = chi[j];
|
||||||
|
buf[m++] = rho[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOInterface::unpack_forward_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
if (comm_stage == 0) {
|
||||||
|
fp_store[i][0] = buf[m++];
|
||||||
|
fp_store[i][1] = buf[m++];
|
||||||
|
fp_store[i][2] = buf[m++];
|
||||||
|
} else {
|
||||||
|
chi[i] = buf[m++];
|
||||||
|
rho[i] = buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOInterface::pack_reverse_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
buf[m++] = norm[i];
|
||||||
|
buf[m++] = chi[i];
|
||||||
|
buf[m++] = normwf[i];
|
||||||
|
buf[m++] = rho[i];
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOInterface::unpack_reverse_comm(int n, int *list, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, j, m;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
m = 0;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
norm[j] += buf[m++];
|
||||||
|
chi[j] += buf[m++];
|
||||||
|
if (status[j] & PHASECHECK){
|
||||||
|
normwf[j] += buf[m++];
|
||||||
|
rho[j] += buf[m++];
|
||||||
|
} else {
|
||||||
|
m++;
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOInterface::correct_v(double *v_solid, double *v_fluid, int i_solid, int i_fluid)
|
||||||
|
{
|
||||||
|
double wall_prefactor, wall_denom, wall_numer;
|
||||||
|
|
||||||
|
wall_numer = MAX(2.0 * cut * (chi[i_solid] - 0.5), 0.0);
|
||||||
|
wall_denom = MAX(2.0 * cut * (chi[i_fluid] - 0.5), wall_max);
|
||||||
|
|
||||||
|
wall_prefactor = wall_numer / wall_denom;
|
||||||
|
|
||||||
|
v_solid[0] = (v_solid[0] - v_fluid[0]) * wall_prefactor;
|
||||||
|
v_solid[1] = (v_solid[1] - v_fluid[1]) * wall_prefactor;
|
||||||
|
v_solid[2] = (v_solid[2] - v_fluid[2]) * wall_prefactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOInterface::correct_rho(int i_solid, int i_fluid)
|
||||||
|
{
|
||||||
|
int itype = atom->type[i_solid];
|
||||||
|
return MAX(rho0[itype], atom->rho[i_solid]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOInterface::store_forces()
|
||||||
|
{
|
||||||
|
double minv;
|
||||||
|
int *type = atom->type;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
double **f = atom->f;
|
||||||
|
|
||||||
|
// When this is called, fp_store stores the pressure force
|
||||||
|
// After this method, fp_store instead stores non-pressure forces
|
||||||
|
// and is also normalized by the particles mass
|
||||||
|
// If forces are overwritten by a fix, there are no pressure forces
|
||||||
|
// so just normalize
|
||||||
|
auto fixlist = modify->get_fix_by_style("setforce");
|
||||||
|
if (fixlist.size() != 0) {
|
||||||
|
for (const auto &fix : fixlist) {
|
||||||
|
for (int i = 0; i < atom->nlocal; i++) {
|
||||||
|
minv = 1.0 / mass[type[i]];
|
||||||
|
if (mask[i] & fix->groupbit)
|
||||||
|
for (int a = 0; a < 3; a++)
|
||||||
|
fp_store[i][a] = f[i][a] * minv;
|
||||||
|
else
|
||||||
|
for (int a = 0; a < 3; a++)
|
||||||
|
fp_store[i][a] = (f[i][a] - fp_store[i][a]) * minv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < atom->nlocal; i++) {
|
||||||
|
minv = 1.0 / mass[type[i]];
|
||||||
|
for (int a = 0; a < 3; a++)
|
||||||
|
fp_store[i][a] = (f[i][a] - fp_store[i][a]) * minv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forward comm forces
|
||||||
|
comm_forward = 3;
|
||||||
|
comm_stage = 0;
|
||||||
|
comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
memory usage of local atom-based array
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOInterface::memory_usage()
|
||||||
|
{
|
||||||
|
double bytes = 3 * nmax_store * sizeof(double);
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
61
src/RHEO/compute_rheo_interface.h
Normal file
61
src/RHEO/compute_rheo_interface.h
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef COMPUTE_CLASS
|
||||||
|
// clang-format off
|
||||||
|
ComputeStyle(RHEO/INTERFACE,ComputeRHEOInterface)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_COMPUTE_RHEO_INTERFACE_H
|
||||||
|
#define LMP_COMPUTE_RHEO_INTERFACE_H
|
||||||
|
|
||||||
|
#include "compute.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class ComputeRHEOInterface : public Compute {
|
||||||
|
public:
|
||||||
|
ComputeRHEOInterface(class LAMMPS *, int, char **);
|
||||||
|
~ComputeRHEOInterface() override;
|
||||||
|
void init() override;
|
||||||
|
void init_list(int, class NeighList *) override;
|
||||||
|
void compute_peratom() override;
|
||||||
|
int pack_forward_comm(int, int *, double *, int, int *) override;
|
||||||
|
void unpack_forward_comm(int, int, double *) override;
|
||||||
|
int pack_reverse_comm(int, int, double *) override;
|
||||||
|
void unpack_reverse_comm(int, int *, double *) override;
|
||||||
|
double memory_usage() override;
|
||||||
|
void correct_v(double *, double *, int, int);
|
||||||
|
double correct_rho(int, int);
|
||||||
|
void store_forces();
|
||||||
|
|
||||||
|
double *chi, **fp_store;
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int nmax_store, comm_stage;
|
||||||
|
double *rho0, cut, cutsq, wall_max;
|
||||||
|
double *norm, *normwf;
|
||||||
|
|
||||||
|
char *id_fix_pa;
|
||||||
|
|
||||||
|
class NeighList *list;
|
||||||
|
class ComputeRHEOKernel *compute_kernel;
|
||||||
|
class FixRHEOPressure *fix_pressure;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
913
src/RHEO/compute_rheo_kernel.cpp
Normal file
913
src/RHEO/compute_rheo_kernel.cpp
Normal file
@ -0,0 +1,913 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL), Thomas O'Connor (CMU)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "compute_rheo_kernel.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "compute_rheo_interface.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "math_const.h"
|
||||||
|
#include "math_extra.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "neigh_request.h"
|
||||||
|
#include "pair.h"
|
||||||
|
#include "update.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <gsl/gsl_linalg.h>
|
||||||
|
#include <gsl/gsl_matrix.h>
|
||||||
|
#include <gsl/gsl_errno.h>
|
||||||
|
#include <gsl/gsl_cblas.h>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
using namespace MathConst;
|
||||||
|
using namespace MathExtra;
|
||||||
|
|
||||||
|
static constexpr int DELTA = 2000;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOKernel::ComputeRHEOKernel(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Compute(lmp, narg, arg),
|
||||||
|
list(nullptr), C(nullptr), C0(nullptr), coordination(nullptr), compute_interface(nullptr)
|
||||||
|
{
|
||||||
|
if (narg != 4) error->all(FLERR,"Illegal compute rheo/kernel command");
|
||||||
|
|
||||||
|
kernel_style = utils::inumeric(FLERR, arg[3], false, lmp);
|
||||||
|
|
||||||
|
if (kernel_style == QUINTIC || kernel_style == WENDLANDC4) {
|
||||||
|
correction_order = -1;
|
||||||
|
} else if (kernel_style == RK0) {
|
||||||
|
correction_order = 0;
|
||||||
|
} else if (kernel_style == RK1) {
|
||||||
|
correction_order = 1;
|
||||||
|
} else if (kernel_style == RK2) {
|
||||||
|
correction_order = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
dim = domain->dimension;
|
||||||
|
|
||||||
|
comm_forward = 1;
|
||||||
|
ncor = 0;
|
||||||
|
Mdim = 0;
|
||||||
|
if (kernel_style == RK1) {
|
||||||
|
Mdim = 1 + dim;
|
||||||
|
ncor = 1 + dim;
|
||||||
|
comm_forward = ncor * Mdim;
|
||||||
|
} else if (kernel_style == RK2) {
|
||||||
|
//Polynomial basis size (up to quadratic order)
|
||||||
|
Mdim = 1 + dim + dim * (dim + 1) / 2;
|
||||||
|
//Number of sets of correction coefficients (1 x y xx yy) + z zz (3D)
|
||||||
|
ncor = 1 + 2 * dim;
|
||||||
|
comm_forward = ncor * Mdim;
|
||||||
|
}
|
||||||
|
|
||||||
|
comm_forward_save = comm_forward;
|
||||||
|
corrections_calculated = 0;
|
||||||
|
gsl_error_flag = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOKernel::~ComputeRHEOKernel()
|
||||||
|
{
|
||||||
|
memory->destroy(coordination);
|
||||||
|
memory->destroy(C);
|
||||||
|
memory->destroy(C0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOKernel::init()
|
||||||
|
{
|
||||||
|
neighbor->add_request(this, NeighConst::REQ_FULL);
|
||||||
|
|
||||||
|
interface_flag = fix_rheo->interface_flag;
|
||||||
|
compute_interface = fix_rheo->compute_interface;
|
||||||
|
|
||||||
|
zmin = fix_rheo->zmin_kernel;
|
||||||
|
cut = fix_rheo->cut;
|
||||||
|
cutsq = cut * cut;
|
||||||
|
cutinv = 1.0 / cut;
|
||||||
|
cutsqinv = cutinv * cutinv;
|
||||||
|
|
||||||
|
|
||||||
|
if (kernel_style != WENDLANDC4) {
|
||||||
|
if (dim == 3) {
|
||||||
|
pre_w = 1.0 / (120.0 * MY_PI) * 27.0 * cutsqinv * cutinv;
|
||||||
|
pre_wp = pre_w * 3.0 * cutinv;
|
||||||
|
} else {
|
||||||
|
pre_w = 7.0 / (478.0 * MY_PI) * 9 * cutsqinv;
|
||||||
|
pre_wp = pre_w * 3.0 * cutinv;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (dim == 3) {
|
||||||
|
pre_w = 495.0 / (32.0 * MY_PI * cutsq * cut);
|
||||||
|
pre_wp = pre_w * cutinv;
|
||||||
|
} else {
|
||||||
|
pre_w = 9.0 / (MY_PI * cutsq);
|
||||||
|
pre_wp = pre_w * cutinv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nmax_store = atom->nmax;
|
||||||
|
memory->create(coordination, nmax_store, "rheo:coordination");
|
||||||
|
if (kernel_style == RK0) {
|
||||||
|
memory->create(C0, nmax_store, "rheo/kernel:C0");
|
||||||
|
} else if (kernel_style == RK1) {
|
||||||
|
memory->create(C, nmax_store, ncor, Mdim, "rheo/kernel:C");
|
||||||
|
} else if (kernel_style == RK2) {
|
||||||
|
memory->create(C, nmax_store, ncor, Mdim, "rheo/kernel:C");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOKernel::init_list(int /*id*/, NeighList *ptr)
|
||||||
|
{
|
||||||
|
list = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOKernel::check_corrections(int i)
|
||||||
|
{
|
||||||
|
// Skip if there were gsl errors for this atom
|
||||||
|
if (gsl_error_flag)
|
||||||
|
if (gsl_error_tags.find(atom->tag[i]) != gsl_error_tags.end())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Skip if undercoordinated
|
||||||
|
if (coordination[i] < zmin)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Skip if corrections not yet calculated
|
||||||
|
if (!corrections_calculated)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::calc_w_self(int i, int j)
|
||||||
|
{
|
||||||
|
double w;
|
||||||
|
if (kernel_style == WENDLANDC4)
|
||||||
|
w = calc_w_wendlandc4(i, j, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
else
|
||||||
|
w = calc_w_quintic(i, j, 0.0, 0.0, 0.0, 0.0);
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::calc_w(int i, int j, double delx, double dely, double delz, double r)
|
||||||
|
{
|
||||||
|
double w;
|
||||||
|
int corrections_i, corrections_j, corrections;
|
||||||
|
|
||||||
|
if (kernel_style == WENDLANDC4)
|
||||||
|
return calc_w_wendlandc4(i, j, delx, dely, delz, r);
|
||||||
|
|
||||||
|
if (kernel_style != QUINTIC) {
|
||||||
|
corrections_i = check_corrections(i);
|
||||||
|
corrections_j = check_corrections(j);
|
||||||
|
corrections = corrections_i & corrections_j;
|
||||||
|
} else {
|
||||||
|
corrections = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!corrections) w = calc_w_quintic(i, j, delx, dely, delz, r);
|
||||||
|
else if (kernel_style == RK0) w = calc_w_rk0(i, j, delx, dely, delz, r);
|
||||||
|
else if (kernel_style == RK1) w = calc_w_rk1(i, j, delx, dely, delz, r);
|
||||||
|
else if (kernel_style == RK2) w = calc_w_rk2(i, j, delx, dely, delz, r);
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::calc_dw(int i, int j, double delx, double dely, double delz, double r)
|
||||||
|
{
|
||||||
|
double wp;
|
||||||
|
int corrections_i, corrections_j;
|
||||||
|
|
||||||
|
if (kernel_style == WENDLANDC4)
|
||||||
|
return calc_dw_wendlandc4(i, j, delx, dely, delz, r, dWij, dWji);
|
||||||
|
|
||||||
|
if (kernel_style != QUINTIC) {
|
||||||
|
corrections_i = check_corrections(i);
|
||||||
|
corrections_j = check_corrections(j);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calc wp and default dW's, a bit inefficient but can redo later
|
||||||
|
wp = calc_dw_quintic(i, j, delx, dely, delz, r, dWij, dWji);
|
||||||
|
|
||||||
|
// Overwrite if there are corrections
|
||||||
|
if (kernel_style == RK1) {
|
||||||
|
if (corrections_i) calc_dw_rk1(i, j, delx, dely, delz, r, dWij);
|
||||||
|
if (corrections_j) calc_dw_rk1(j, i, -delx, -dely, -delz, r, dWji);
|
||||||
|
} else if (kernel_style == RK2) {
|
||||||
|
if (corrections_i) calc_dw_rk2(i, j, delx, dely, delz, r, dWij);
|
||||||
|
if (corrections_j) calc_dw_rk2(j, i, -delx, -dely, -delz, r, dWji);
|
||||||
|
}
|
||||||
|
|
||||||
|
return wp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::calc_w_quintic(int i, int j, double delx, double dely, double delz, double r)
|
||||||
|
{
|
||||||
|
double w, tmp1, tmp2, tmp3, tmp1sq, tmp2sq, tmp3sq, s;
|
||||||
|
s = r * 3.0 * cutinv;
|
||||||
|
|
||||||
|
if (s > 3.0) {
|
||||||
|
w = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s <= 3.0) {
|
||||||
|
tmp3 = 3.0 - s;
|
||||||
|
tmp3sq = tmp3 * tmp3;
|
||||||
|
w = tmp3sq * tmp3sq * tmp3;
|
||||||
|
}
|
||||||
|
if (s <= 2.0) {
|
||||||
|
tmp2 = 2.0 - s;
|
||||||
|
tmp2sq = tmp2 * tmp2;
|
||||||
|
w -= 6.0 * tmp2sq * tmp2sq * tmp2;
|
||||||
|
}
|
||||||
|
if (s <= 1.0) {
|
||||||
|
tmp1 = 1.0 - s;
|
||||||
|
tmp1sq = tmp1 * tmp1;
|
||||||
|
w += 15.0 * tmp1sq * tmp1sq * tmp1;
|
||||||
|
}
|
||||||
|
|
||||||
|
w *= pre_w;
|
||||||
|
|
||||||
|
Wij = w;
|
||||||
|
Wji = w;
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::calc_dw_quintic(int i, int j, double delx, double dely, double delz, double r, double *dW1, double *dW2)
|
||||||
|
{
|
||||||
|
double wp, tmp1, tmp2, tmp3, tmp1sq, tmp2sq, tmp3sq, s, wprinv;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
int *type = atom->type;
|
||||||
|
|
||||||
|
s = r * 3.0 * cutinv;
|
||||||
|
|
||||||
|
if (s > 3.0) {
|
||||||
|
wp = 0.0;
|
||||||
|
}
|
||||||
|
if (s <= 3.0) {
|
||||||
|
tmp3 = 3.0 - s;
|
||||||
|
tmp3sq = tmp3 * tmp3;
|
||||||
|
wp = -5.0 * tmp3sq * tmp3sq;
|
||||||
|
}
|
||||||
|
if (s <= 2.0) {
|
||||||
|
tmp2 = 2.0 - s;
|
||||||
|
tmp2sq = tmp2 * tmp2;
|
||||||
|
wp += 30.0 * tmp2sq * tmp2sq;
|
||||||
|
}
|
||||||
|
if (s <= 1.0) {
|
||||||
|
tmp1 = 1.0 - s;
|
||||||
|
tmp1sq = tmp1 * tmp1;
|
||||||
|
wp -= 75.0 * tmp1sq * tmp1sq;
|
||||||
|
}
|
||||||
|
|
||||||
|
wp *= pre_wp;
|
||||||
|
wprinv = wp / r;
|
||||||
|
dW1[0] = delx * wprinv;
|
||||||
|
dW1[1] = dely * wprinv;
|
||||||
|
dW1[2] = delz * wprinv;
|
||||||
|
|
||||||
|
dW2[0] = -delx * wprinv;
|
||||||
|
dW2[1] = -dely * wprinv;
|
||||||
|
dW2[2] = -delz * wprinv;
|
||||||
|
|
||||||
|
return wp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::calc_w_wendlandc4(int i, int j, double delx, double dely, double delz, double r)
|
||||||
|
{
|
||||||
|
double w, tmp6, s;
|
||||||
|
s = r * cutinv;
|
||||||
|
|
||||||
|
if (s > 1.0) {
|
||||||
|
w = 0.0;
|
||||||
|
} else {
|
||||||
|
tmp6 = (1.0 - s) * (1.0 - s);
|
||||||
|
tmp6 *= tmp6 * tmp6;
|
||||||
|
w = tmp6 * (1.0 + 6.0 * s + 35.0 * THIRD * s * s);
|
||||||
|
}
|
||||||
|
|
||||||
|
w *= pre_w;
|
||||||
|
|
||||||
|
Wij = w;
|
||||||
|
Wji = w;
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::calc_dw_wendlandc4(int i, int j, double delx, double dely, double delz, double r, double *dW1, double *dW2)
|
||||||
|
{
|
||||||
|
double wp, tmp1, tmp5, tmp6, s, wprinv;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
int *type = atom->type;
|
||||||
|
|
||||||
|
s = r * cutinv;
|
||||||
|
|
||||||
|
if (s > 1.0) {
|
||||||
|
wp = 0.0;
|
||||||
|
} else {
|
||||||
|
tmp1 = 1.0 - s;
|
||||||
|
tmp5 = tmp1 * tmp1;
|
||||||
|
tmp5 = tmp5 * tmp5 * tmp1;
|
||||||
|
tmp6 = tmp5 * tmp1;
|
||||||
|
wp = tmp6 * (6.0 + 70.0 * THIRD * s);
|
||||||
|
wp -= 6 * tmp5 * (1.0 + 6.0 * s + 35.0 * THIRD * s * s);
|
||||||
|
}
|
||||||
|
|
||||||
|
wp *= pre_wp;
|
||||||
|
wprinv = wp / r;
|
||||||
|
dW1[0] = delx * wprinv;
|
||||||
|
dW1[1] = dely * wprinv;
|
||||||
|
dW1[2] = delz * wprinv;
|
||||||
|
|
||||||
|
dW2[0] = -delx * wprinv;
|
||||||
|
dW2[1] = -dely * wprinv;
|
||||||
|
dW2[2] = -delz * wprinv;
|
||||||
|
|
||||||
|
return wp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::calc_w_rk0(int i, int j, double delx, double dely, double delz, double r)
|
||||||
|
{
|
||||||
|
double w;
|
||||||
|
|
||||||
|
w = calc_w_quintic(i, j, delx, dely, delz, r);
|
||||||
|
|
||||||
|
Wij = C0[i] * w;
|
||||||
|
Wji = C0[j] * w;
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::calc_w_rk1(int i, int j, double delx, double dely, double delz, double r)
|
||||||
|
{
|
||||||
|
int b;
|
||||||
|
double w, wR, dx[3], H[Mdim];
|
||||||
|
|
||||||
|
dx[0] = delx;
|
||||||
|
dx[1] = dely;
|
||||||
|
dx[2] = delz;
|
||||||
|
w = calc_w_quintic(i, j, delx, dely, delz, r);
|
||||||
|
|
||||||
|
if (dim == 2) {
|
||||||
|
H[0] = 1.0;
|
||||||
|
H[1] = dx[0] * cutinv;
|
||||||
|
H[2] = dx[1] * cutinv;
|
||||||
|
} else {
|
||||||
|
H[0] = 1.0;
|
||||||
|
H[1] = dx[0] * cutinv;
|
||||||
|
H[2] = dx[1] * cutinv;
|
||||||
|
H[3] = dx[2] * cutinv;
|
||||||
|
}
|
||||||
|
Wij = 0;
|
||||||
|
for (b = 0; b < Mdim; b++) {
|
||||||
|
Wij += C[i][0][b] * H[b]; // C columns: 1 x y (z) xx yy (zz)
|
||||||
|
}
|
||||||
|
Wij *= w;
|
||||||
|
|
||||||
|
//Now compute Wji
|
||||||
|
H[1] *= -1;
|
||||||
|
H[2] *= -1;
|
||||||
|
if (dim == 3) H[3] *= -1;
|
||||||
|
|
||||||
|
Wji = 0;
|
||||||
|
for (b = 0; b < Mdim; b++) {
|
||||||
|
Wji += C[j][0][b] * H[b]; // C columns: 1 x y (z) xx yy (zz)
|
||||||
|
}
|
||||||
|
Wji *= w;
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::calc_w_rk2(int i, int j, double delx, double dely, double delz, double r)
|
||||||
|
{
|
||||||
|
int b;
|
||||||
|
double w, wR, dx[3], H[Mdim];
|
||||||
|
dx[0] = delx;
|
||||||
|
dx[1] = dely;
|
||||||
|
dx[2] = delz;
|
||||||
|
w = calc_w_quintic(i, j, delx, dely, delz, r);
|
||||||
|
|
||||||
|
if (dim == 2) {
|
||||||
|
H[0] = 1.0;
|
||||||
|
H[1] = dx[0] * cutinv;
|
||||||
|
H[2] = dx[1] * cutinv;
|
||||||
|
H[3] = 0.5 * dx[0] * dx[0] * cutsqinv;
|
||||||
|
H[4] = 0.5 * dx[1] * dx[1] * cutsqinv;
|
||||||
|
H[5] = dx[0] * dx[1] * cutsqinv;
|
||||||
|
} else {
|
||||||
|
H[0] = 1.0;
|
||||||
|
H[1] = dx[0] * cutinv;
|
||||||
|
H[2] = dx[1] * cutinv;
|
||||||
|
H[3] = dx[2] * cutinv;
|
||||||
|
H[4] = 0.5 * dx[0] * dx[0] * cutsqinv;
|
||||||
|
H[5] = 0.5 * dx[1] * dx[1] * cutsqinv;
|
||||||
|
H[6] = 0.5 * dx[2] * dx[2] * cutsqinv;
|
||||||
|
H[7] = dx[0] * dx[1] * cutsqinv;
|
||||||
|
H[8] = dx[0] * dx[2] * cutsqinv;
|
||||||
|
H[9] = dx[1] * dx[2] * cutsqinv;
|
||||||
|
}
|
||||||
|
Wij = 0;
|
||||||
|
for (b = 0; b < Mdim; b++) {
|
||||||
|
Wij += C[i][0][b] * H[b]; // C columns: 1 x y (z) xx yy (zz)
|
||||||
|
}
|
||||||
|
Wij *= w;
|
||||||
|
|
||||||
|
//Now compute Wji
|
||||||
|
H[1] *= -1;
|
||||||
|
H[2] *= -1;
|
||||||
|
if (dim == 3) H[3] *= -1;
|
||||||
|
|
||||||
|
Wji = 0;
|
||||||
|
for (b = 0; b < Mdim; b++) {
|
||||||
|
Wji += C[j][0][b] * H[b]; // C columns: 1 x y (z) xx yy (zz)
|
||||||
|
}
|
||||||
|
Wji *= w;
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOKernel::calc_dw_rk1(int i, int j, double delx, double dely, double delz, double r, double *dW)
|
||||||
|
{
|
||||||
|
int a, b;
|
||||||
|
double w, dx[3], H[Mdim];
|
||||||
|
dx[0] = delx;
|
||||||
|
dx[1] = dely;
|
||||||
|
dx[2] = delz;
|
||||||
|
|
||||||
|
w = calc_w_quintic(i, j, delx, dely, delz, r);
|
||||||
|
|
||||||
|
//Populate correction basis
|
||||||
|
if (dim == 2) {
|
||||||
|
H[0] = 1.0;
|
||||||
|
H[1] = dx[0] * cutinv;
|
||||||
|
H[2] = dx[1] * cutinv;
|
||||||
|
} else {
|
||||||
|
H[0] = 1.0;
|
||||||
|
H[1] = dx[0] * cutinv;
|
||||||
|
H[2] = dx[1] * cutinv;
|
||||||
|
H[3] = dx[2] * cutinv;
|
||||||
|
}
|
||||||
|
|
||||||
|
// dWij[] = dWx dWy (dWz)
|
||||||
|
//compute derivative operators
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
dW[a] = 0.0;
|
||||||
|
for (b = 0; b < Mdim; b++) {
|
||||||
|
//First derivative kernels
|
||||||
|
dW[a] += C[i][1 + a][b] * H[b]; // C columns: 1 x y (z)
|
||||||
|
}
|
||||||
|
dW[a] *= w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOKernel::calc_dw_rk2(int i, int j, double delx, double dely, double delz, double r, double *dW)
|
||||||
|
{
|
||||||
|
int a, b;
|
||||||
|
double w, dx[3], H[Mdim];
|
||||||
|
dx[0] = delx;
|
||||||
|
dx[1] = dely;
|
||||||
|
dx[2] = delz;
|
||||||
|
|
||||||
|
w = calc_w_quintic(i, j, delx, dely, delz, r);
|
||||||
|
|
||||||
|
//Populate correction basis
|
||||||
|
if (dim == 2) {
|
||||||
|
H[0] = 1.0;
|
||||||
|
H[1] = dx[0] * cutinv;
|
||||||
|
H[2] = dx[1] * cutinv;
|
||||||
|
H[3] = 0.5 * dx[0] * dx[0] * cutsqinv;
|
||||||
|
H[4] = 0.5 * dx[1] * dx[1] * cutsqinv;
|
||||||
|
H[5] = dx[0] * dx[1] * cutsqinv;
|
||||||
|
} else {
|
||||||
|
H[0] = 1.0;
|
||||||
|
H[1] = dx[0] * cutinv;
|
||||||
|
H[2] = dx[1] * cutinv;
|
||||||
|
H[3] = dx[2] * cutinv;
|
||||||
|
H[4] = 0.5 * dx[0] * dx[0] * cutsqinv;
|
||||||
|
H[5] = 0.5 * dx[1] * dx[1] * cutsqinv;
|
||||||
|
H[6] = 0.5 * dx[2] * dx[2] * cutsqinv;
|
||||||
|
H[7] = dx[0] * dx[1] * cutsqinv;
|
||||||
|
H[8] = dx[0] * dx[2] * cutsqinv;
|
||||||
|
H[9] = dx[1] * dx[2] * cutsqinv;
|
||||||
|
}
|
||||||
|
|
||||||
|
// dWij[] = dWx dWy (dWz)
|
||||||
|
//compute derivative operators
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
dW[a] = 0.0;
|
||||||
|
for (b = 0; b < Mdim; b++) {
|
||||||
|
//First derivative kernels
|
||||||
|
dW[a] += C[i][1 + a][b] * H[b]; // C columns: 1 x y (z) xx yy (zz)
|
||||||
|
}
|
||||||
|
dW[a] *= w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOKernel::compute_peratom()
|
||||||
|
{
|
||||||
|
gsl_error_flag = 0;
|
||||||
|
gsl_error_tags.clear();
|
||||||
|
|
||||||
|
if (kernel_style == QUINTIC) return;
|
||||||
|
corrections_calculated = 1;
|
||||||
|
|
||||||
|
int i, j, ii, jj, inum, jnum, itype, g, a, b, gsl_error;
|
||||||
|
double xtmp, ytmp, ztmp, r, rsq, w, vj, rhoj;
|
||||||
|
double dx[3];
|
||||||
|
gsl_matrix_view gM;
|
||||||
|
|
||||||
|
// Turn off GSL error handler, revert RK to Quintic when insufficient neighbors
|
||||||
|
gsl_set_error_handler_off();
|
||||||
|
|
||||||
|
double **x = atom->x;
|
||||||
|
int *type = atom->type;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
tagint *tag = atom->tag;
|
||||||
|
|
||||||
|
int *ilist, *jlist, *numneigh, **firstneigh;
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
|
||||||
|
// Grow arrays if necessary
|
||||||
|
if (nmax_store < atom->nmax) grow_arrays(atom->nmax);
|
||||||
|
|
||||||
|
if (kernel_style == RK0) {
|
||||||
|
|
||||||
|
double M;
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
|
||||||
|
//Initialize M to zero:
|
||||||
|
M = 0;
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
dx[0] = xtmp - x[j][0];
|
||||||
|
dx[1] = ytmp - x[j][1];
|
||||||
|
dx[2] = ztmp - x[j][2];
|
||||||
|
rsq = lensq3(dx);
|
||||||
|
|
||||||
|
if (rsq < cutsq) {
|
||||||
|
r = sqrt(rsq);
|
||||||
|
w = calc_w_quintic(i, j, dx[0], dx[1], dx[2], r);
|
||||||
|
rhoj = rho[j];
|
||||||
|
if (interface_flag)
|
||||||
|
if (status[j] & PHASECHECK)
|
||||||
|
rhoj = compute_interface->correct_rho(j, i);
|
||||||
|
|
||||||
|
vj = mass[type[j]] / rhoj;
|
||||||
|
M += w * vj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inverse of 1x1 matrix
|
||||||
|
if (coordination[i] >= zmin) C0[i] = 1.0 / M;
|
||||||
|
}
|
||||||
|
} else if (correction_order > 0) {
|
||||||
|
|
||||||
|
// Moment matrix M and polynomial basis vector cut (1d for gsl compatibility)
|
||||||
|
double H[Mdim], M[Mdim * Mdim];
|
||||||
|
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
itype = type[i];
|
||||||
|
|
||||||
|
// Zero upper-triangle M and cut (will be symmetric):
|
||||||
|
for (a = 0; a < Mdim; a++) {
|
||||||
|
for (b = a; b < Mdim; b++) {
|
||||||
|
M[a * Mdim + b] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
dx[0] = xtmp - x[j][0];
|
||||||
|
dx[1] = ytmp - x[j][1];
|
||||||
|
dx[2] = ztmp - x[j][2];
|
||||||
|
|
||||||
|
rsq = lensq3(dx);
|
||||||
|
|
||||||
|
if (rsq < cutsq) {
|
||||||
|
r = sqrt(rsq);
|
||||||
|
w = calc_w_quintic(i, j, dx[0], dx[1], dx[2], r);
|
||||||
|
|
||||||
|
rhoj = rho[j];
|
||||||
|
if (interface_flag)
|
||||||
|
if (status[j] & PHASECHECK)
|
||||||
|
rhoj = compute_interface->correct_rho(j, i);
|
||||||
|
|
||||||
|
vj = mass[type[j]] / rhoj;
|
||||||
|
|
||||||
|
//Populate the H-vector of polynomials (2D)
|
||||||
|
if (dim == 2) {
|
||||||
|
H[0] = 1.0;
|
||||||
|
H[1] = dx[0] * cutinv;
|
||||||
|
H[2] = dx[1] * cutinv;
|
||||||
|
if (kernel_style == RK2) {
|
||||||
|
H[3] = 0.5 * dx[0] * dx[0] * cutsqinv;
|
||||||
|
H[4] = 0.5 * dx[1] * dx[1] * cutsqinv;
|
||||||
|
H[5] = dx[0] * dx[1] * cutsqinv;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
H[0] = 1.0;
|
||||||
|
H[1] = dx[0] * cutinv;
|
||||||
|
H[2] = dx[1] * cutinv;
|
||||||
|
H[3] = dx[2] * cutinv;
|
||||||
|
if (kernel_style == RK2) {
|
||||||
|
H[4] = 0.5 * dx[0] * dx[0] * cutsqinv;
|
||||||
|
H[5] = 0.5 * dx[1] * dx[1] * cutsqinv;
|
||||||
|
H[6] = 0.5 * dx[2] * dx[2] * cutsqinv;
|
||||||
|
H[7] = dx[0] * dx[1] * cutsqinv;
|
||||||
|
H[8] = dx[0] * dx[2] * cutsqinv;
|
||||||
|
H[9] = dx[1] * dx[2] * cutsqinv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate the upper triangle
|
||||||
|
for (a = 0; a < Mdim; a++) {
|
||||||
|
for (b = a; b < Mdim; b++) {
|
||||||
|
M[a * Mdim + b] += H[a] * H[b] * w * vj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate the lower triangle from the symmetric entries of M:
|
||||||
|
for (a = 0; a < Mdim; a++) {
|
||||||
|
for (b = a; b < Mdim; b++) {
|
||||||
|
M[b * Mdim + a] = M[a * Mdim + b];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip if undercoordinated
|
||||||
|
if (coordination[i] < zmin) continue;
|
||||||
|
|
||||||
|
// Use gsl to get Minv, use Cholesky decomposition since the
|
||||||
|
// polynomials are independent, M is symmetrix & positive-definite
|
||||||
|
gM = gsl_matrix_view_array(M,Mdim,Mdim);
|
||||||
|
gsl_error = gsl_linalg_cholesky_decomp1(&gM.matrix);
|
||||||
|
|
||||||
|
if (gsl_error) {
|
||||||
|
//Revert to uncorrected SPH for this particle
|
||||||
|
gsl_error_flag = 1;
|
||||||
|
gsl_error_tags.insert(tag[i]);
|
||||||
|
|
||||||
|
//check if not positive-definite
|
||||||
|
if (gsl_error != GSL_EDOM)
|
||||||
|
error->warning(FLERR, "Failed decomposition in rheo/kernel, gsl_error = {}", gsl_error);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
gsl_linalg_cholesky_invert(&gM.matrix); //M is now M^-1
|
||||||
|
|
||||||
|
// Correction coefficients are columns of M^-1 multiplied by an appropriate coefficient
|
||||||
|
// Solve the linear system several times to get coefficientns
|
||||||
|
// M: 1 x y (z) x^2 y^2 (z^2) xy (xz) (yz)
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
// 0 1 2 3 4 5 || 2D indexing
|
||||||
|
// 0 1 2 3 4 5 6 7 8 9 || 3D indexing
|
||||||
|
// W 1 . . . . . . . . .
|
||||||
|
// dWx . -1 . . . . . . . .
|
||||||
|
// dWy . . -1 . . . . . . .
|
||||||
|
// dWz . . . (-1) . . . . . .
|
||||||
|
// d2Wx . . . . 2 . . . . .
|
||||||
|
// d2Wy . . . . . 2 . . . .
|
||||||
|
// d2Wz . . . . . . (2) . . .
|
||||||
|
|
||||||
|
//0 1 2 3 4
|
||||||
|
//0 1 2 3 4 5 6
|
||||||
|
|
||||||
|
// Pack coefficients into C
|
||||||
|
for (a = 0; a < Mdim; a++) {
|
||||||
|
C[i][0][a] = M[a * Mdim + 0]; // all rows of column 0
|
||||||
|
for (b = 0; b < dim; b++) {
|
||||||
|
//First derivatives
|
||||||
|
C[i][1 + b][a] = -M[a * Mdim + b + 1] * cutinv;
|
||||||
|
// columns 1-2 (2D) or 1-3 (3D)
|
||||||
|
|
||||||
|
//Second derivatives
|
||||||
|
if (kernel_style == RK2)
|
||||||
|
C[i][1 + dim + b][a] = M[a * Mdim + b + 1 + dim] * cutsqinv;
|
||||||
|
// columns 3-4 (2D) or 4-6 (3D)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// communicate calculated quantities
|
||||||
|
comm_stage = 1;
|
||||||
|
comm_forward = comm_forward_save;
|
||||||
|
comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOKernel::compute_coordination()
|
||||||
|
{
|
||||||
|
int i, j, ii, jj, inum, jnum;
|
||||||
|
double xtmp, ytmp, ztmp, rsq;
|
||||||
|
double dx[3];
|
||||||
|
|
||||||
|
double **x = atom->x;
|
||||||
|
|
||||||
|
int *ilist, *jlist, *numneigh, **firstneigh;
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
|
||||||
|
// Grow arrays if necessary
|
||||||
|
if (nmax_store < atom->nmax) grow_arrays(atom->nmax);
|
||||||
|
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
coordination[i] = 0;
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
dx[0] = xtmp - x[j][0];
|
||||||
|
dx[1] = ytmp - x[j][1];
|
||||||
|
dx[2] = ztmp - x[j][2];
|
||||||
|
rsq = lensq3(dx);
|
||||||
|
|
||||||
|
if (rsq < cutsq)
|
||||||
|
coordination[i] += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// communicate calculated quantities
|
||||||
|
comm_stage = 0;
|
||||||
|
comm_forward = 1;
|
||||||
|
comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOKernel::grow_arrays(int nmax)
|
||||||
|
{
|
||||||
|
memory->grow(coordination, nmax, "rheo:coordination");
|
||||||
|
|
||||||
|
if (kernel_style == RK0) {
|
||||||
|
memory->grow(C0, nmax, "rheo/kernel:C0");
|
||||||
|
} else if (correction_order > 0) {
|
||||||
|
memory->grow(C, nmax, ncor, Mdim, "rheo/kernel:C");
|
||||||
|
}
|
||||||
|
|
||||||
|
nmax_store = nmax;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOKernel::pack_forward_comm(int n, int *list, double *buf,
|
||||||
|
int /*pbc_flag*/, int * /*pbc*/)
|
||||||
|
{
|
||||||
|
int i,j,k,m,a,b;
|
||||||
|
m = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
if (comm_stage == 0) {
|
||||||
|
buf[m++] = coordination[j];
|
||||||
|
} else {
|
||||||
|
if (kernel_style == RK0) {
|
||||||
|
buf[m++] = C0[j];
|
||||||
|
} else {
|
||||||
|
for (a = 0; a < ncor; a++)
|
||||||
|
for (b = 0; b < Mdim; b++)
|
||||||
|
buf[m++] = C[j][a][b];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOKernel::unpack_forward_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last,a,b;
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
if (comm_stage == 0) {
|
||||||
|
coordination[i] = buf[m++];
|
||||||
|
} else {
|
||||||
|
if (kernel_style == RK0) {
|
||||||
|
C0[i] = buf[m++];
|
||||||
|
} else {
|
||||||
|
for (a = 0; a < ncor; a++)
|
||||||
|
for (b = 0; b < Mdim; b++)
|
||||||
|
C[i][a][b] = buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOKernel::memory_usage()
|
||||||
|
{
|
||||||
|
double bytes = 0.0;
|
||||||
|
bytes = (size_t) nmax_store * sizeof(int);
|
||||||
|
|
||||||
|
if (kernel_style == RK0) {
|
||||||
|
bytes += (size_t) nmax_store * sizeof(double);
|
||||||
|
} else if (correction_order > 0) {
|
||||||
|
bytes += (size_t) nmax_store * ncor * Mdim * sizeof(double);
|
||||||
|
}
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
81
src/RHEO/compute_rheo_kernel.h
Normal file
81
src/RHEO/compute_rheo_kernel.h
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef COMPUTE_CLASS
|
||||||
|
// clang-format off
|
||||||
|
ComputeStyle(RHEO/KERNEL,ComputeRHEOKernel)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_COMPUTE_RHEO_KERNEL_H
|
||||||
|
#define LMP_COMPUTE_RHEO_KERNEL_H
|
||||||
|
|
||||||
|
#include "compute.h"
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class ComputeRHEOKernel : public Compute {
|
||||||
|
public:
|
||||||
|
ComputeRHEOKernel(class LAMMPS *, int, char **);
|
||||||
|
~ComputeRHEOKernel() override;
|
||||||
|
void init() override;
|
||||||
|
void init_list(int, class NeighList *) override;
|
||||||
|
void compute_peratom() override;
|
||||||
|
int pack_forward_comm(int, int *, double *, int, int *) override;
|
||||||
|
void unpack_forward_comm(int, int, double *) override;
|
||||||
|
double memory_usage() override;
|
||||||
|
void compute_coordination();
|
||||||
|
double calc_w_self(int,int);
|
||||||
|
double calc_w(int,int,double,double,double,double);
|
||||||
|
double calc_dw(int,int,double,double,double,double);
|
||||||
|
double calc_w_quintic(int,int,double,double,double,double);
|
||||||
|
double calc_dw_quintic(int,int,double,double,double,double,double *,double *);
|
||||||
|
double calc_w_wendlandc4(int,int,double,double,double,double);
|
||||||
|
double calc_dw_wendlandc4(int,int,double,double,double,double,double *,double *);
|
||||||
|
void grow_arrays(int);
|
||||||
|
|
||||||
|
double dWij[3], dWji[3], Wij, Wji;
|
||||||
|
int correction_order;
|
||||||
|
int *coordination;
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int comm_stage, comm_forward_save;
|
||||||
|
int interface_flag;
|
||||||
|
int gsl_error_flag;
|
||||||
|
std::unordered_set<tagint> gsl_error_tags;
|
||||||
|
|
||||||
|
int corrections_calculated;
|
||||||
|
int kernel_style, zmin, dim, Mdim, ncor;
|
||||||
|
int nmax_store;
|
||||||
|
double cut, cutsq, cutinv, cutsqinv, pre_w, pre_wp;
|
||||||
|
double ***C;
|
||||||
|
double *C0;
|
||||||
|
|
||||||
|
class NeighList *list;
|
||||||
|
class ComputeRHEOInterface *compute_interface;
|
||||||
|
|
||||||
|
int check_corrections(int);
|
||||||
|
|
||||||
|
double calc_w_rk0(int,int,double,double,double,double);
|
||||||
|
double calc_w_rk1(int,int,double,double,double,double);
|
||||||
|
double calc_w_rk2(int,int,double,double,double,double);
|
||||||
|
void calc_dw_rk1(int,int,double,double,double,double,double *);
|
||||||
|
void calc_dw_rk2(int,int,double,double,double,double,double *);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
614
src/RHEO/compute_rheo_property_atom.cpp
Normal file
614
src/RHEO/compute_rheo_property_atom.cpp
Normal file
@ -0,0 +1,614 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "compute_rheo_property_atom.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "atom_vec.h"
|
||||||
|
#include "compute_rheo_interface.h"
|
||||||
|
#include "compute_rheo_kernel.h"
|
||||||
|
#include "compute_rheo_surface.h"
|
||||||
|
#include "compute_rheo_vshift.h"
|
||||||
|
#include "compute_rheo_grad.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "fix_rheo_oxidation.h"
|
||||||
|
#include "fix_rheo_pressure.h"
|
||||||
|
#include "fix_rheo_thermal.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "update.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOPropertyAtom::ComputeRHEOPropertyAtom(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Compute(lmp, narg, arg), fix_rheo(nullptr), fix_pressure(nullptr), fix_thermal(nullptr), compute_interface(nullptr),
|
||||||
|
compute_kernel(nullptr), compute_surface(nullptr), compute_vshift(nullptr), compute_grad(nullptr),
|
||||||
|
avec_index(nullptr), pack_choice(nullptr), col_index(nullptr)
|
||||||
|
{
|
||||||
|
if (narg < 4) utils::missing_cmd_args(FLERR, "compute property/atom", error);
|
||||||
|
|
||||||
|
peratom_flag = 1;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
// Determine number of values
|
||||||
|
nvalues = 0;
|
||||||
|
for (int iarg = 3; iarg < narg; iarg++) {
|
||||||
|
if (strcmp(arg[iarg], "surface/n/*") == 0) {
|
||||||
|
nvalues += dim;
|
||||||
|
} else if (strcmp(arg[iarg], "shift/v/*") == 0) {
|
||||||
|
nvalues += dim;
|
||||||
|
} else if (strcmp(arg[iarg], "grad/v/*") == 0) {
|
||||||
|
nvalues += dim * dim;
|
||||||
|
} else if (strcmp(arg[iarg], "stress/v/*") == 0) {
|
||||||
|
nvalues += dim * dim;
|
||||||
|
} else if (strcmp(arg[iarg], "stress/t/*") == 0) {
|
||||||
|
nvalues += dim * dim;
|
||||||
|
} else {
|
||||||
|
nvalues += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nvalues == 1) size_peratom_cols = 0;
|
||||||
|
else size_peratom_cols = nvalues;
|
||||||
|
|
||||||
|
pressure_flag = thermal_flag = interface_flag = 0;
|
||||||
|
surface_flag = shift_flag = shell_flag = 0;
|
||||||
|
|
||||||
|
// parse input values
|
||||||
|
// customize a new keyword by adding to if statement
|
||||||
|
|
||||||
|
pack_choice = new FnPtrPack[nvalues];
|
||||||
|
avec_index = new int[nvalues];
|
||||||
|
col_index = new int[nvalues];
|
||||||
|
col_t_index = new int[nvalues];
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
int index, a, b;
|
||||||
|
for (int iarg = 3; iarg < narg; iarg++) {
|
||||||
|
if (strcmp(arg[iarg], "phase") == 0) {
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_phase;
|
||||||
|
} else if (strcmp(arg[iarg], "status") == 0) {
|
||||||
|
// Short hand for "rheo_status"
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_status;
|
||||||
|
} else if (strcmp(arg[iarg], "chi") == 0) {
|
||||||
|
interface_flag = 1;
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_chi;
|
||||||
|
} else if (strcmp(arg[iarg], "surface") == 0) {
|
||||||
|
surface_flag = 1;
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_surface;
|
||||||
|
} else if (strcmp(arg[iarg], "surface/r") == 0) {
|
||||||
|
surface_flag = 1;
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_surface_r;
|
||||||
|
} else if (strcmp(arg[iarg], "surface/divr") == 0) {
|
||||||
|
surface_flag = 1;
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_surface_divr;
|
||||||
|
} else if (strcmp(arg[iarg], "coordination") == 0) {
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_coordination;
|
||||||
|
} else if (strcmp(arg[iarg], "pressure") == 0) {
|
||||||
|
pressure_flag = 1;
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_pressure;
|
||||||
|
} else if (strcmp(arg[iarg], "cv") == 0) {
|
||||||
|
thermal_flag = 1;
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_cv;
|
||||||
|
} else if (utils::strmatch(arg[iarg], "^surface/n/")) {
|
||||||
|
surface_flag = 1;
|
||||||
|
i += add_vector_component(arg[iarg], i, &ComputeRHEOPropertyAtom::pack_surface_n) - 1;
|
||||||
|
} else if (utils::strmatch(arg[iarg], "^shift/v/")) {
|
||||||
|
shift_flag = 1;
|
||||||
|
i += add_vector_component(arg[iarg], i, &ComputeRHEOPropertyAtom::pack_shift_v) - 1;
|
||||||
|
} else if (utils::strmatch(arg[iarg], "^grad/v/")) {
|
||||||
|
i += add_tensor_component(arg[iarg], i, &ComputeRHEOPropertyAtom::pack_gradv) - 1;
|
||||||
|
} else if (utils::strmatch(arg[iarg], "^stress/v/")) {
|
||||||
|
i += add_tensor_component(arg[iarg], i, &ComputeRHEOPropertyAtom::pack_viscous_stress) - 1;
|
||||||
|
} else if (utils::strmatch(arg[iarg], "^stress/t/")) {
|
||||||
|
i += add_tensor_component(arg[iarg], i, &ComputeRHEOPropertyAtom::pack_total_stress) - 1;
|
||||||
|
} else if (strcmp(arg[iarg], "energy") == 0) {
|
||||||
|
avec_index[i] = atom->avec->property_atom("esph");
|
||||||
|
if (avec_index[i] < 0)
|
||||||
|
error->all(FLERR,
|
||||||
|
"Invalid keyword {} for atom style {} in compute rheo/property/atom command ",
|
||||||
|
arg[iarg], atom->get_style());
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_atom_style;
|
||||||
|
thermal_flag = 1;
|
||||||
|
} else if (strcmp(arg[iarg], "nbond/shell") == 0) {
|
||||||
|
shell_flag = 1;
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_nbond_shell;
|
||||||
|
} else {
|
||||||
|
avec_index[i] = atom->avec->property_atom(arg[iarg]);
|
||||||
|
if (avec_index[i] < 0)
|
||||||
|
error->all(FLERR,
|
||||||
|
"Invalid keyword {} for atom style {} in compute rheo/property/atom command ",
|
||||||
|
arg[iarg], atom->get_style());
|
||||||
|
pack_choice[i] = &ComputeRHEOPropertyAtom::pack_atom_style;
|
||||||
|
|
||||||
|
if (strcmp(arg[iarg], "temperature") == 0) thermal_flag = 1;
|
||||||
|
if (strcmp(arg[iarg], "heatflow") == 0) thermal_flag = 1;
|
||||||
|
if (strcmp(arg[iarg], "conductivity") == 0) thermal_flag = 1;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
nmax = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOPropertyAtom::~ComputeRHEOPropertyAtom()
|
||||||
|
{
|
||||||
|
delete[] pack_choice;
|
||||||
|
delete[] avec_index;
|
||||||
|
delete[] col_index;
|
||||||
|
delete[] col_t_index;
|
||||||
|
memory->destroy(vector_atom);
|
||||||
|
memory->destroy(array_atom);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::init()
|
||||||
|
{
|
||||||
|
auto fixes = modify->get_fix_by_style("^rheo$");
|
||||||
|
if (fixes.size() == 0) error->all(FLERR, "Need to define fix rheo to use compute rheo/property/atom");
|
||||||
|
fix_rheo = dynamic_cast<FixRHEO *>(fixes[0]);
|
||||||
|
|
||||||
|
if (interface_flag && !(fix_rheo->interface_flag))
|
||||||
|
error->all(FLERR, "Cannot request interfacial property without corresponding option in fix rheo");
|
||||||
|
if (surface_flag && !(fix_rheo->surface_flag))
|
||||||
|
error->all(FLERR, "Cannot request surface property without corresponding option in fix rheo");
|
||||||
|
if (shift_flag && !(fix_rheo->shift_flag))
|
||||||
|
error->all(FLERR, "Cannot request velocity shifting property without corresponding option in fix rheo");
|
||||||
|
if (thermal_flag && !(fix_rheo->thermal_flag))
|
||||||
|
error->all(FLERR, "Cannot request thermal property without fix rheo/thermal");
|
||||||
|
|
||||||
|
compute_interface = fix_rheo->compute_interface;
|
||||||
|
compute_kernel = fix_rheo->compute_kernel;
|
||||||
|
compute_surface = fix_rheo->compute_surface;
|
||||||
|
compute_vshift = fix_rheo->compute_vshift;
|
||||||
|
compute_grad = fix_rheo->compute_grad;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::setup()
|
||||||
|
{
|
||||||
|
if (thermal_flag) {
|
||||||
|
auto fixes = modify->get_fix_by_style("rheo/thermal");
|
||||||
|
fix_thermal = dynamic_cast<FixRHEOThermal *>(fixes[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pressure_flag) {
|
||||||
|
auto fixes = modify->get_fix_by_style("rheo/pressure");
|
||||||
|
fix_pressure = dynamic_cast<FixRHEOPressure *>(fixes[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shell_flag) {
|
||||||
|
auto fixes = modify->get_fix_by_style("rheo/oxidation");
|
||||||
|
fix_oxidation = dynamic_cast<FixRHEOOxidation *>(fixes[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::compute_peratom()
|
||||||
|
{
|
||||||
|
invoked_peratom = update->ntimestep;
|
||||||
|
|
||||||
|
// grow vector or array if necessary
|
||||||
|
|
||||||
|
if (atom->nmax > nmax) {
|
||||||
|
nmax = atom->nmax;
|
||||||
|
if (nvalues == 1) {
|
||||||
|
memory->destroy(vector_atom);
|
||||||
|
memory->create(vector_atom, nmax, "rheo/property/atom:vector");
|
||||||
|
} else {
|
||||||
|
memory->destroy(array_atom);
|
||||||
|
memory->create(array_atom, nmax, nvalues, "rheo/property/atom:array");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fill vector or array with per-atom values
|
||||||
|
|
||||||
|
if (nvalues == 1) {
|
||||||
|
buf = vector_atom;
|
||||||
|
(this->*pack_choice[0])(0);
|
||||||
|
} else {
|
||||||
|
if (nmax) buf = &array_atom[0][0];
|
||||||
|
else buf = nullptr;
|
||||||
|
for (int n = 0; n < nvalues; n++)
|
||||||
|
(this->*pack_choice[n])(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
memory usage of local atom-based array
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOPropertyAtom::memory_usage()
|
||||||
|
{
|
||||||
|
double bytes = (double)nmax * nvalues * sizeof(double);
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
one method for every keyword compute rheo/property/atom can output
|
||||||
|
the atom property is packed into buf starting at n with stride nvalues
|
||||||
|
customize a new keyword by adding a method
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_phase(int n)
|
||||||
|
{
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = (status[i] & PHASECHECK);
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_status(int n)
|
||||||
|
{
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = status[i];
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_chi(int n)
|
||||||
|
{
|
||||||
|
double *chi = compute_interface->chi;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = chi[i];
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_surface(int n)
|
||||||
|
{
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
double label;
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
label = 0;
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
if (status[i] & STATUS_SURFACE) label = 1.0;
|
||||||
|
if (status[i] & STATUS_SPLASH) label = 2.0;
|
||||||
|
}
|
||||||
|
buf[n] = label;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_surface_r(int n)
|
||||||
|
{
|
||||||
|
double *rsurface = compute_surface->rsurface;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = rsurface[i];
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_surface_divr(int n)
|
||||||
|
{
|
||||||
|
double *divr = compute_surface->divr;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = divr[i];
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_surface_n(int n)
|
||||||
|
{
|
||||||
|
double **nsurface = compute_surface->nsurface;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int index = col_index[n];
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = nsurface[i][index];
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_coordination(int n)
|
||||||
|
{
|
||||||
|
int *coordination = compute_kernel->coordination;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = coordination[i];
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_cv(int n)
|
||||||
|
{
|
||||||
|
int *type = atom->type;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = fix_thermal->calc_cv(i, type[i]);
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_pressure(int n)
|
||||||
|
{
|
||||||
|
int *type = atom->type;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = fix_pressure->calc_pressure(rho[i], type[i]);
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_viscous_stress(int n)
|
||||||
|
{
|
||||||
|
double **gradv = compute_grad->gradv;
|
||||||
|
double *viscosity = atom->viscosity;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int index = col_index[n];
|
||||||
|
int dim = domain->dimension;
|
||||||
|
int a = index / dim;
|
||||||
|
int b = index % dim;
|
||||||
|
int index_transpose = b * dim + a;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = viscosity[i] * (gradv[i][index] + gradv[i][index_transpose]);
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_total_stress(int n)
|
||||||
|
{
|
||||||
|
double **gradv = compute_grad->gradv;
|
||||||
|
double *viscosity = atom->viscosity;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
int *type = atom->type;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int index = col_index[n];
|
||||||
|
int dim = domain->dimension;
|
||||||
|
int a = index / dim;
|
||||||
|
int b = index % dim;
|
||||||
|
int index_transpose = b * dim + a;
|
||||||
|
double p;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
if (index == index_transpose)
|
||||||
|
p = fix_pressure->calc_pressure(rho[i], type[i]);
|
||||||
|
else
|
||||||
|
p = 0.0;
|
||||||
|
buf[n] = viscosity[i] * (gradv[i][index] + gradv[i][index_transpose]) + p;
|
||||||
|
} else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_nbond_shell(int n)
|
||||||
|
{
|
||||||
|
int *nbond = fix_oxidation->nbond;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = nbond[i];
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_shift_v(int n)
|
||||||
|
{
|
||||||
|
double **vshift = compute_vshift->vshift;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int index = col_index[n];
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = vshift[i][index];
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_gradv(int n)
|
||||||
|
{
|
||||||
|
double **gradv = compute_grad->gradv;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int index = col_index[n];
|
||||||
|
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) buf[n] = gradv[i][index];
|
||||||
|
else buf[n] = 0.0;
|
||||||
|
n += nvalues;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOPropertyAtom::pack_atom_style(int n)
|
||||||
|
{
|
||||||
|
atom->avec->pack_property_atom(avec_index[n], &buf[n], nvalues, groupbit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOPropertyAtom::add_tensor_component(char* option, int i, FnPtrPack pack_function)
|
||||||
|
{
|
||||||
|
int shift;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
if (((std::string) option).back() == '*') {
|
||||||
|
for (int a = 0; a < dim; a++) {
|
||||||
|
for (int b = 0; b < dim; b++) {
|
||||||
|
pack_choice[i + a * dim + b] = pack_function;
|
||||||
|
col_index[i + a * dim + b] = a * dim + b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
shift = dim * dim;
|
||||||
|
} else {
|
||||||
|
int index;
|
||||||
|
int dim_error = 0;
|
||||||
|
|
||||||
|
if (utils::strmatch(option, "xx$")) {
|
||||||
|
index = 0;
|
||||||
|
} else if (utils::strmatch(option, "xy$")) {
|
||||||
|
index = 1;
|
||||||
|
} else if (utils::strmatch(option, "xz$")) {
|
||||||
|
index = 2;
|
||||||
|
if (dim == 2) dim_error = 1;
|
||||||
|
} else if (utils::strmatch(option, "yx$")) {
|
||||||
|
if (dim == 2) index = 2;
|
||||||
|
else index = 3;
|
||||||
|
} else if (utils::strmatch(option, "yy$")) {
|
||||||
|
if (dim == 2) index = 3;
|
||||||
|
else index = 4;
|
||||||
|
} else if (utils::strmatch(option, "yz$")) {
|
||||||
|
index = 5;
|
||||||
|
if (dim == 2) dim_error = 1;
|
||||||
|
} else if (utils::strmatch(option, "zx$")) {
|
||||||
|
index = 6;
|
||||||
|
if (dim == 2) dim_error = 1;
|
||||||
|
} else if (utils::strmatch(option, "zy$")) {
|
||||||
|
index = 7;
|
||||||
|
if (dim == 2) dim_error = 1;
|
||||||
|
} else if (utils::strmatch(option, "zz$")) {
|
||||||
|
index = 8;
|
||||||
|
if (dim == 2) dim_error = 1;
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, "Invalid compute rheo/property/atom property {}", option);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dim_error)
|
||||||
|
error->all(FLERR, "Invalid compute rheo/property/atom property {} in 2D", option);
|
||||||
|
|
||||||
|
pack_choice[i] = pack_function;
|
||||||
|
col_index[i] = index;
|
||||||
|
shift = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOPropertyAtom::add_vector_component(char* option, int i, FnPtrPack pack_function)
|
||||||
|
{
|
||||||
|
int shift;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
if (((std::string) option).back() == '*') {
|
||||||
|
for (int a = 0; a < dim; a++) {
|
||||||
|
pack_choice[i + a] = pack_function;
|
||||||
|
col_index[i + a] = a;
|
||||||
|
}
|
||||||
|
shift = dim;
|
||||||
|
} else {
|
||||||
|
int index;
|
||||||
|
if (utils::strmatch(option, "x$")) {
|
||||||
|
index = 0;
|
||||||
|
} else if (utils::strmatch(option, "y$")) {
|
||||||
|
index = 1;
|
||||||
|
} else if (utils::strmatch(option, "z$")) {
|
||||||
|
if (dim == 2)
|
||||||
|
error->all(FLERR, "Invalid compute rheo/property/atom property {} in 2D", option);
|
||||||
|
index = 2;
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, "Invalid compute rheo/property/atom property {}", option);
|
||||||
|
}
|
||||||
|
|
||||||
|
pack_choice[i] = pack_function;
|
||||||
|
col_index[i] = index;
|
||||||
|
shift = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return shift;
|
||||||
|
}
|
||||||
83
src/RHEO/compute_rheo_property_atom.h
Normal file
83
src/RHEO/compute_rheo_property_atom.h
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef COMPUTE_CLASS
|
||||||
|
// clang-format off
|
||||||
|
ComputeStyle(rheo/property/atom,ComputeRHEOPropertyAtom);
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_COMPUTE_RHEO_PROPERTY_ATOM_H
|
||||||
|
#define LMP_COMPUTE_RHEO_PROPERTY_ATOM_H
|
||||||
|
|
||||||
|
#include "compute.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class ComputeRHEOPropertyAtom : public Compute {
|
||||||
|
public:
|
||||||
|
ComputeRHEOPropertyAtom(class LAMMPS *, int, char **);
|
||||||
|
~ComputeRHEOPropertyAtom() override;
|
||||||
|
void init() override;
|
||||||
|
void setup() override;
|
||||||
|
void compute_peratom() override;
|
||||||
|
double memory_usage() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int nvalues, nmax;
|
||||||
|
int pressure_flag, thermal_flag, interface_flag;
|
||||||
|
int surface_flag, shift_flag, shell_flag;
|
||||||
|
int *avec_index;
|
||||||
|
int *col_index, *col_t_index;
|
||||||
|
double *buf;
|
||||||
|
|
||||||
|
typedef void (ComputeRHEOPropertyAtom::*FnPtrPack)(int);
|
||||||
|
FnPtrPack *pack_choice; // ptrs to pack functions
|
||||||
|
|
||||||
|
void pack_phase(int);
|
||||||
|
void pack_status(int);
|
||||||
|
void pack_chi(int);
|
||||||
|
void pack_surface(int);
|
||||||
|
void pack_surface_r(int);
|
||||||
|
void pack_surface_divr(int);
|
||||||
|
void pack_surface_n(int);
|
||||||
|
void pack_coordination(int);
|
||||||
|
void pack_cv(int);
|
||||||
|
void pack_shift_v(int);
|
||||||
|
void pack_gradv(int);
|
||||||
|
void pack_pressure(int);
|
||||||
|
void pack_viscous_stress(int);
|
||||||
|
void pack_total_stress(int);
|
||||||
|
void pack_nbond_shell(int);
|
||||||
|
void pack_atom_style(int);
|
||||||
|
|
||||||
|
int add_vector_component(char*, int, FnPtrPack);
|
||||||
|
int add_tensor_component(char*, int, FnPtrPack);
|
||||||
|
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
class FixRHEOPressure *fix_pressure;
|
||||||
|
class FixRHEOThermal *fix_thermal;
|
||||||
|
class FixRHEOOxidation *fix_oxidation;
|
||||||
|
class ComputeRHEOInterface *compute_interface;
|
||||||
|
class ComputeRHEOKernel *compute_kernel;
|
||||||
|
class ComputeRHEOSurface *compute_surface;
|
||||||
|
class ComputeRHEOVShift *compute_vshift;
|
||||||
|
class ComputeRHEOGrad *compute_grad;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
197
src/RHEO/compute_rheo_rho_sum.cpp
Normal file
197
src/RHEO/compute_rheo_rho_sum.cpp
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "compute_rheo_rho_sum.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "compute_rheo_kernel.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "neigh_request.h"
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEORhoSum::ComputeRHEORhoSum(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Compute(lmp, narg, arg), fix_rheo(nullptr), compute_kernel(nullptr)
|
||||||
|
{
|
||||||
|
if (narg != 4) error->all(FLERR,"Illegal compute RHEO/rho command");
|
||||||
|
|
||||||
|
self_mass_flag = utils::bnumeric(FLERR, arg[3], false, lmp);
|
||||||
|
|
||||||
|
comm_forward = 1;
|
||||||
|
comm_reverse = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEORhoSum::~ComputeRHEORhoSum() {}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEORhoSum::init()
|
||||||
|
{
|
||||||
|
compute_kernel = fix_rheo->compute_kernel;
|
||||||
|
cut = fix_rheo->cut;
|
||||||
|
cutsq = cut * cut;
|
||||||
|
|
||||||
|
// need an occasional half neighbor list
|
||||||
|
neighbor->add_request(this, NeighConst::REQ_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEORhoSum::init_list(int /*id*/, NeighList *ptr)
|
||||||
|
{
|
||||||
|
list = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
void ComputeRHEORhoSum::compute_peratom()
|
||||||
|
{
|
||||||
|
int i, j, ii, jj, inum, jnum, itype, jtype;
|
||||||
|
double xtmp, ytmp, ztmp, delx, dely, delz;
|
||||||
|
int *ilist, *jlist, *numneigh, **firstneigh;
|
||||||
|
double rsq, w;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
double **x = atom->x;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
int *type = atom->type;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
int newton = force->newton;
|
||||||
|
|
||||||
|
double jmass;
|
||||||
|
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
int nall = nlocal + atom->nghost;
|
||||||
|
|
||||||
|
// initialize arrays, local with quintic self-contribution, ghosts are zeroed
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
w = compute_kernel->calc_w_self(i, i);
|
||||||
|
rho[i] = w * mass[type[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = nlocal; i < nall; i++) rho[i] = 0.0;
|
||||||
|
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
itype = type[i];
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
delx = xtmp - x[j][0];
|
||||||
|
dely = ytmp - x[j][1];
|
||||||
|
delz = ztmp - x[j][2];
|
||||||
|
rsq = delx * delx + dely * dely + delz * delz;
|
||||||
|
if (rsq < cutsq) {
|
||||||
|
w = compute_kernel->calc_w(i, j, delx, dely, delz, sqrt(rsq));
|
||||||
|
|
||||||
|
if (self_mass_flag) {
|
||||||
|
rho[i] += w * mass[type[i]];
|
||||||
|
if (newton || j < nlocal)
|
||||||
|
rho[j] += w * mass[type[j]];
|
||||||
|
} else {
|
||||||
|
rho[i] += w * mass[type[j]];
|
||||||
|
if (newton || j < nlocal)
|
||||||
|
rho[j] += w * mass[type[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newton) comm->reverse_comm(this);
|
||||||
|
comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEORhoSum::pack_forward_comm(int n, int *list, double *buf,
|
||||||
|
int /*pbc_flag*/, int * /*pbc*/)
|
||||||
|
{
|
||||||
|
int i, j, k, m;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
m = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
buf[m++] = rho[j];
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
void ComputeRHEORhoSum::unpack_forward_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
rho[i] = buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEORhoSum::pack_reverse_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
buf[m++] = rho[i];
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEORhoSum::unpack_reverse_comm(int n, int *list, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, j, m;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
rho[j] += buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
52
src/RHEO/compute_rheo_rho_sum.h
Normal file
52
src/RHEO/compute_rheo_rho_sum.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef COMPUTE_CLASS
|
||||||
|
// clang-format off
|
||||||
|
ComputeStyle(RHEO/RHO/SUM,ComputeRHEORhoSum)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_COMPUTE_RHEO_RHO_SUM_H
|
||||||
|
#define LMP_COMPUTE_RHEO_RHO_SUM_H
|
||||||
|
|
||||||
|
#include "compute.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class ComputeRHEORhoSum : public Compute {
|
||||||
|
public:
|
||||||
|
ComputeRHEORhoSum(class LAMMPS *, int, char **);
|
||||||
|
~ComputeRHEORhoSum() override;
|
||||||
|
void init() override;
|
||||||
|
void init_list(int, class NeighList *) override;
|
||||||
|
void compute_peratom() override;
|
||||||
|
int pack_forward_comm(int, int *, double *, int, int *) override;
|
||||||
|
void unpack_forward_comm(int, int, double *) override;
|
||||||
|
int pack_reverse_comm(int, int, double *) override;
|
||||||
|
void unpack_reverse_comm(int, int *, double *) override;
|
||||||
|
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int self_mass_flag;
|
||||||
|
double cut, cutsq;
|
||||||
|
|
||||||
|
class NeighList *list;
|
||||||
|
class ComputeRHEOKernel *compute_kernel;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
417
src/RHEO/compute_rheo_surface.cpp
Normal file
417
src/RHEO/compute_rheo_surface.cpp
Normal file
@ -0,0 +1,417 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL), Thomas O'Connor (CMU), Eric Palermo (CMU)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "compute_rheo_surface.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "compute_rheo_interface.h"
|
||||||
|
#include "compute_rheo_kernel.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "math_extra.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "neigh_request.h"
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
using namespace FixConst;
|
||||||
|
using namespace MathExtra;
|
||||||
|
|
||||||
|
static constexpr double EPSILON = 1e-10;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOSurface::ComputeRHEOSurface(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Compute(lmp, narg, arg), fix_rheo(nullptr), list(nullptr), rho0(nullptr), compute_kernel(nullptr), compute_interface(nullptr),
|
||||||
|
B(nullptr), gradC(nullptr), nsurface(nullptr), divr(nullptr), rsurface(nullptr)
|
||||||
|
{
|
||||||
|
if (narg != 3) error->all(FLERR,"Illegal compute RHEO/SURFACE command");
|
||||||
|
|
||||||
|
int dim = domain->dimension;
|
||||||
|
comm_forward = 2;
|
||||||
|
comm_reverse = dim * dim + 1;
|
||||||
|
|
||||||
|
nmax_store = 0;
|
||||||
|
grow_arrays(atom->nmax);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOSurface::~ComputeRHEOSurface()
|
||||||
|
{
|
||||||
|
memory->destroy(divr);
|
||||||
|
memory->destroy(rsurface);
|
||||||
|
memory->destroy(nsurface);
|
||||||
|
memory->destroy(B);
|
||||||
|
memory->destroy(gradC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOSurface::init()
|
||||||
|
{
|
||||||
|
compute_kernel = fix_rheo->compute_kernel;
|
||||||
|
compute_interface = fix_rheo->compute_interface;
|
||||||
|
cut = fix_rheo->cut;
|
||||||
|
rho0 = fix_rheo->rho0;
|
||||||
|
threshold_style = fix_rheo->surface_style;
|
||||||
|
threshold_divr = fix_rheo->divr_surface;
|
||||||
|
threshold_z = fix_rheo->zmin_surface;
|
||||||
|
threshold_splash = fix_rheo->zmin_splash;
|
||||||
|
interface_flag = fix_rheo->interface_flag;
|
||||||
|
|
||||||
|
cutsq = cut * cut;
|
||||||
|
|
||||||
|
// need an occasional half neighbor list
|
||||||
|
neighbor->add_request(this, NeighConst::REQ_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOSurface::init_list(int /*id*/, NeighList *ptr)
|
||||||
|
{
|
||||||
|
list = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOSurface::compute_peratom()
|
||||||
|
{
|
||||||
|
int i, j, ii, jj, inum, jnum, a, b, itype, jtype, fluidi, fluidj;
|
||||||
|
double xtmp, ytmp, ztmp, rsq, Voli, Volj, rhoi, rhoj, wp;
|
||||||
|
double dWij[3], dWji[3], dx[3];
|
||||||
|
int *ilist, *jlist, *numneigh, **firstneigh;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
double **x = atom->x;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int newton = force->newton;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int *type = atom->type;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
int *coordination = compute_kernel->coordination;
|
||||||
|
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
|
||||||
|
// Grow and zero arrays
|
||||||
|
if (nmax_store < atom->nmax)
|
||||||
|
grow_arrays(atom->nmax);
|
||||||
|
|
||||||
|
size_t nbytes = nmax_store * sizeof(double);
|
||||||
|
memset(&divr[0], 0, nbytes);
|
||||||
|
memset(&rsurface[0], 0, nbytes);
|
||||||
|
memset(&nsurface[0][0], 0, dim * nbytes);
|
||||||
|
memset(&gradC[0][0], 0, dim * dim * nbytes);
|
||||||
|
memset(&B[0][0], 0, dim * dim * nbytes);
|
||||||
|
|
||||||
|
|
||||||
|
// loop over neighbors to calculate the average orientation of neighbors
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
itype = type[i];
|
||||||
|
fluidi = !(status[i] & PHASECHECK);
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
dx[0] = xtmp - x[j][0];
|
||||||
|
dx[1] = ytmp - x[j][1];
|
||||||
|
dx[2] = ztmp - x[j][2];
|
||||||
|
|
||||||
|
rsq = lensq3(dx);
|
||||||
|
if (rsq < cutsq) {
|
||||||
|
jtype = type[j];
|
||||||
|
fluidj = !(status[j] & PHASECHECK);
|
||||||
|
|
||||||
|
rhoi = rho[i];
|
||||||
|
rhoj = rho[j];
|
||||||
|
|
||||||
|
// Add corrections for walls
|
||||||
|
if (interface_flag) {
|
||||||
|
if (fluidi && (!fluidj)) {
|
||||||
|
rhoj = compute_interface->correct_rho(j, i);
|
||||||
|
} else if ((!fluidi) && fluidj) {
|
||||||
|
rhoi = compute_interface->correct_rho(i, j);
|
||||||
|
} else if ((!fluidi) && (!fluidj)) {
|
||||||
|
rhoi = rho0[itype];
|
||||||
|
rhoj = rho0[jtype];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Voli = mass[itype] / rhoi;
|
||||||
|
Volj = mass[jtype] / rhoj;
|
||||||
|
|
||||||
|
wp = compute_kernel->calc_dw_quintic(i, j, dx[0], dx[1], dx[2], sqrt(rsq), dWij, dWji);
|
||||||
|
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
divr[i] -= dWij[a] * dx[a] * Volj;
|
||||||
|
gradC[i][a] += dWij[a] * Volj;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((j < nlocal) || newton) {
|
||||||
|
for (a = 0; a < dim; a++){
|
||||||
|
divr[j] += dWji[a] * dx[a] * Voli;
|
||||||
|
gradC[j][a] += dWji[a] * Voli;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// reverse gradC and divr, forward divr
|
||||||
|
comm_stage = 0;
|
||||||
|
comm_reverse = dim * dim + 1;
|
||||||
|
comm_forward = 1;
|
||||||
|
if (newton) comm->reverse_comm(this);
|
||||||
|
comm->forward_comm(this);
|
||||||
|
|
||||||
|
// calculate nsurface for local atoms
|
||||||
|
// Note, this isn't forwarded to ghosts
|
||||||
|
double maggC;
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
maggC = 0.0;
|
||||||
|
for (a = 0;a < dim; a++)
|
||||||
|
maggC += gradC[i][a] * gradC[i][a];
|
||||||
|
maggC = sqrt(maggC) + EPSILON;
|
||||||
|
maggC = 1.0 / maggC;
|
||||||
|
for (a = 0; a < dim; a++)
|
||||||
|
nsurface[i][a] = -gradC[i][a] * maggC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove surface settings and assign new values
|
||||||
|
int nall = nlocal + atom->nghost;
|
||||||
|
int test;
|
||||||
|
|
||||||
|
for (i = 0; i < nall; i++) {
|
||||||
|
status[i] &= SURFACEMASK;
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
if (threshold_style == DIVR)
|
||||||
|
test = divr[i] < threshold_divr;
|
||||||
|
else
|
||||||
|
test = coordination[i] < threshold_z;
|
||||||
|
|
||||||
|
// Treat nonfluid particles as bulk
|
||||||
|
if (status[i] & PHASECHECK)
|
||||||
|
test = 0;
|
||||||
|
|
||||||
|
if (test) {
|
||||||
|
if (coordination[i] < threshold_splash)
|
||||||
|
status[i] |= STATUS_SPLASH;
|
||||||
|
else
|
||||||
|
status[i] |= STATUS_SURFACE;
|
||||||
|
rsurface[i] = 0.0;
|
||||||
|
} else {
|
||||||
|
status[i] |= STATUS_BULK;
|
||||||
|
rsurface[i] = cut;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
fluidi = !(status[i] & PHASECHECK);
|
||||||
|
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
fluidj = !(status[j] & PHASECHECK);
|
||||||
|
|
||||||
|
dx[0] = xtmp - x[j][0];
|
||||||
|
dx[1] = ytmp - x[j][1];
|
||||||
|
dx[2] = ztmp - x[j][2];
|
||||||
|
rsq = lensq3(dx);
|
||||||
|
if (rsq < cutsq) {
|
||||||
|
if (fluidi) {
|
||||||
|
if ((status[i] & STATUS_BULK) && (status[j] & STATUS_SURFACE)) {
|
||||||
|
status[i] &= SURFACEMASK;
|
||||||
|
status[i] |= STATUS_LAYER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status[j] & STATUS_SURFACE)
|
||||||
|
rsurface[i] = MIN(rsurface[i], sqrt(rsq));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fluidj && (j < nlocal || newton)) {
|
||||||
|
if ((status[j] & STATUS_BULK) && (status[j] & PHASECHECK) && (status[i] & STATUS_SURFACE)) {
|
||||||
|
status[j] &= SURFACEMASK;
|
||||||
|
status[j] |= STATUS_LAYER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status[i] & STATUS_SURFACE)
|
||||||
|
rsurface[j] = MIN(rsurface[j], sqrt(rsq));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear normal vectors for non-surface particles
|
||||||
|
|
||||||
|
for (i = 0; i < nall; i++) {
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
if (!(status[i] & STATUS_SURFACE))
|
||||||
|
for (a = 0; a < dim; a++)
|
||||||
|
nsurface[i][a] = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// forward/reverse status and rsurface
|
||||||
|
comm_stage = 1;
|
||||||
|
comm_reverse = 2;
|
||||||
|
comm_forward = 2;
|
||||||
|
if (newton) comm->reverse_comm(this);
|
||||||
|
comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOSurface::pack_reverse_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i,a,b,k,m,last;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
if (comm_stage == 0) {
|
||||||
|
buf[m++] = divr[i];
|
||||||
|
for (a = 0; a < dim; a ++ )
|
||||||
|
for (b = 0; b < dim; b ++)
|
||||||
|
buf[m++] = gradC[i][a * dim + b];
|
||||||
|
} else if (comm_stage == 1) {
|
||||||
|
buf[m++] = (double) status[i];
|
||||||
|
buf[m++] = rsurface[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOSurface::unpack_reverse_comm(int n, int *list, double *buf)
|
||||||
|
{
|
||||||
|
int i,a,b,k,j,m;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int tmp1;
|
||||||
|
double tmp2;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
if (comm_stage == 0) {
|
||||||
|
divr[j] += buf[m++];
|
||||||
|
for (a = 0; a < dim; a ++ )
|
||||||
|
for (b = 0; b < dim; b ++)
|
||||||
|
gradC[j][a * dim + b] += buf[m++];
|
||||||
|
} else if (comm_stage == 1) {
|
||||||
|
tmp1 = (int) buf[m++];
|
||||||
|
if ((status[j] & STATUS_BULK) && (tmp1 & STATUS_LAYER)) {
|
||||||
|
status[j] &= SURFACEMASK;
|
||||||
|
status[j] |= STATUS_LAYER;
|
||||||
|
}
|
||||||
|
tmp2 = buf[m++];
|
||||||
|
rsurface[j] = MIN(rsurface[j], tmp2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOSurface::pack_forward_comm(int n, int *list, double *buf,
|
||||||
|
int /*pbc_flag*/, int * /*pbc*/)
|
||||||
|
{
|
||||||
|
int i,j,a,b,k,m;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
m = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
if (comm_stage == 0) {
|
||||||
|
buf[m++] = divr[j];
|
||||||
|
} else if (comm_stage == 1) {
|
||||||
|
buf[m++] = (double) status[j];
|
||||||
|
buf[m++] = rsurface[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOSurface::unpack_forward_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, a, b, m, last;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
if (comm_stage == 0) {
|
||||||
|
divr[i] = buf[m++];
|
||||||
|
} else if (comm_stage == 1) {
|
||||||
|
status[i] = (int) buf[m++];
|
||||||
|
rsurface[i] = buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOSurface::grow_arrays(int nmax)
|
||||||
|
{
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
memory->grow(divr, nmax, "rheo/surface:divr");
|
||||||
|
memory->grow(rsurface, nmax, "rheo/surface:rsurface");
|
||||||
|
memory->grow(nsurface, nmax, dim, "rheo/surface:nsurface");
|
||||||
|
memory->grow(B, nmax, dim * dim, "rheo/surface:B");
|
||||||
|
memory->grow(gradC, nmax, dim * dim, "rheo/surface:gradC");
|
||||||
|
|
||||||
|
nmax_store = nmax;
|
||||||
|
}
|
||||||
59
src/RHEO/compute_rheo_surface.h
Normal file
59
src/RHEO/compute_rheo_surface.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef COMPUTE_CLASS
|
||||||
|
// clang-format off
|
||||||
|
ComputeStyle(RHEO/SURFACE,ComputeRHEOSurface)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_COMPUTE_RHEO_SURFACE_H
|
||||||
|
#define LMP_COMPUTE_RHEO_SURFACE_H
|
||||||
|
|
||||||
|
#include "compute.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class ComputeRHEOSurface : public Compute {
|
||||||
|
public:
|
||||||
|
ComputeRHEOSurface(class LAMMPS *, int, char **);
|
||||||
|
~ComputeRHEOSurface() override;
|
||||||
|
void init() override;
|
||||||
|
void init_list(int, class NeighList *) override;
|
||||||
|
void compute_peratom() override;
|
||||||
|
int pack_reverse_comm(int, int, double *) override;
|
||||||
|
void unpack_reverse_comm(int, int *, double *) override;
|
||||||
|
int pack_forward_comm(int, int *, double *, int, int *) override;
|
||||||
|
void unpack_forward_comm(int, int, double *) override;
|
||||||
|
|
||||||
|
double **nsurface, *rsurface, *divr;
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int surface_style, nmax_store, threshold_z, threshold_splash, interface_flag;
|
||||||
|
int threshold_style, comm_stage;
|
||||||
|
|
||||||
|
double cut, cutsq, *rho0, threshold_divr;
|
||||||
|
double **B, **gradC;
|
||||||
|
|
||||||
|
class NeighList *list;
|
||||||
|
class ComputeRHEOKernel *compute_kernel;
|
||||||
|
class ComputeRHEOInterface *compute_interface;
|
||||||
|
|
||||||
|
void grow_arrays(int);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
321
src/RHEO/compute_rheo_vshift.cpp
Normal file
321
src/RHEO/compute_rheo_vshift.cpp
Normal file
@ -0,0 +1,321 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL), Thomas O'Connor (CMU), Eric Palermo (CMU)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "compute_rheo_vshift.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "compute_rheo_interface.h"
|
||||||
|
#include "compute_rheo_kernel.h"
|
||||||
|
#include "compute_rheo_surface.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "neigh_request.h"
|
||||||
|
|
||||||
|
#include "update.h"
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOVShift::ComputeRHEOVShift(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Compute(lmp, narg, arg), list(nullptr), vshift(nullptr), fix_rheo(nullptr),
|
||||||
|
compute_kernel(nullptr), compute_interface(nullptr), compute_surface(nullptr)
|
||||||
|
{
|
||||||
|
if (narg != 3) error->all(FLERR,"Illegal compute RHEO/VShift command");
|
||||||
|
|
||||||
|
comm_reverse = 3;
|
||||||
|
surface_flag = 0;
|
||||||
|
|
||||||
|
nmax_store = atom->nmax;
|
||||||
|
memory->create(vshift, nmax_store, 3, "rheo:vshift");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ComputeRHEOVShift::~ComputeRHEOVShift()
|
||||||
|
{
|
||||||
|
memory->destroy(vshift);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOVShift::init()
|
||||||
|
{
|
||||||
|
neighbor->add_request(this, NeighConst::REQ_DEFAULT);
|
||||||
|
|
||||||
|
surface_flag = fix_rheo->surface_flag;
|
||||||
|
interface_flag = fix_rheo->interface_flag;
|
||||||
|
|
||||||
|
compute_kernel = fix_rheo->compute_kernel;
|
||||||
|
compute_interface = fix_rheo->compute_interface;
|
||||||
|
compute_surface = fix_rheo->compute_surface;
|
||||||
|
|
||||||
|
rho0 = fix_rheo->rho0;
|
||||||
|
cut = fix_rheo->cut;
|
||||||
|
cutsq = cut * cut;
|
||||||
|
cutthird = cut / 3.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOVShift::init_list(int /*id*/, NeighList *ptr)
|
||||||
|
{
|
||||||
|
list = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOVShift::compute_peratom()
|
||||||
|
{
|
||||||
|
int i, j, a, b, ii, jj, jnum, itype, jtype;
|
||||||
|
int fluidi, fluidj;
|
||||||
|
double xtmp, ytmp, ztmp, rsq, r, rinv;
|
||||||
|
double w, wp, dr, w0, w4, vmag, prefactor;
|
||||||
|
double imass, jmass, voli, volj, rhoi, rhoj;
|
||||||
|
double dx[3], vi[3], vj[3];
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
int *jlist;
|
||||||
|
int inum, *ilist, *numneigh, **firstneigh;
|
||||||
|
|
||||||
|
int *type = atom->type;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
double **x = atom->x;
|
||||||
|
double **v = atom->v;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int nall = nlocal + atom->nghost;
|
||||||
|
int newton_pair = force->newton_pair;
|
||||||
|
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
|
||||||
|
if (nmax_store < atom->nmax) {
|
||||||
|
memory->grow(vshift, atom->nmax, 3, "rheo:vshift");
|
||||||
|
nmax_store = atom->nmax;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nall; i++)
|
||||||
|
for (a = 0; a < dim; a++)
|
||||||
|
vshift[i][a] = 0.0;
|
||||||
|
|
||||||
|
for (a = 0; a < 3; a++) {
|
||||||
|
vi[a] = 0.0;
|
||||||
|
vj[a] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
itype = type[i];
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
imass = mass[itype];
|
||||||
|
fluidi = !(status[i] & PHASECHECK);
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
fluidj = !(status[j] & PHASECHECK);
|
||||||
|
if ((!fluidi) && (!fluidj)) continue;
|
||||||
|
|
||||||
|
// Will skip shifting in FixRHEO initial integrate, but also skip here to save time
|
||||||
|
if ((status[i] & STATUS_NO_SHIFT) && (status[j] & STATUS_NO_SHIFT)) continue;
|
||||||
|
|
||||||
|
dx[0] = xtmp - x[j][0];
|
||||||
|
dx[1] = ytmp - x[j][1];
|
||||||
|
dx[2] = ztmp - x[j][2];
|
||||||
|
rsq = dx[0] * dx[0] + dx[1] * dx[1] + dx[2] * dx[2];
|
||||||
|
|
||||||
|
if (rsq < cutsq) {
|
||||||
|
jtype = type[j];
|
||||||
|
jmass = mass[jtype];
|
||||||
|
|
||||||
|
r = sqrt(rsq);
|
||||||
|
rinv = 1 / r;
|
||||||
|
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
vi[a] = v[i][a];
|
||||||
|
vj[a] = v[j][a];
|
||||||
|
}
|
||||||
|
|
||||||
|
rhoi = rho[i];
|
||||||
|
rhoj = rho[j];
|
||||||
|
|
||||||
|
// Add corrections for walls
|
||||||
|
if (interface_flag) {
|
||||||
|
if (fluidi && (!fluidj)) {
|
||||||
|
compute_interface->correct_v(vj, vi, j, i);
|
||||||
|
rhoj = compute_interface->correct_rho(j, i);
|
||||||
|
} else if ((!fluidi) && fluidj) {
|
||||||
|
compute_interface->correct_v(vi, vj, i, j);
|
||||||
|
rhoi = compute_interface->correct_rho(i, j);
|
||||||
|
} else if ((!fluidi) && (!fluidj)) {
|
||||||
|
rhoi = rho0[itype];
|
||||||
|
rhoj = rho0[jtype];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
voli = imass / rhoi;
|
||||||
|
volj = jmass / rhoj;
|
||||||
|
|
||||||
|
wp = compute_kernel->calc_dw(i, j, dx[0], dx[1], dx[2], r);
|
||||||
|
w = compute_kernel->calc_w(i, j, dx[0], dx[1], dx[2], r);
|
||||||
|
w0 = compute_kernel->calc_w(i, j, 0, 0, 0, cutthird); // dx, dy, dz irrelevant
|
||||||
|
w4 = w * w * w * w / (w0 * w0 * w0 * w0);
|
||||||
|
dr = -2 * cutthird * (1 + 0.2 * w4) * wp * rinv;
|
||||||
|
|
||||||
|
if ((mask[i] & groupbit) && fluidi) {
|
||||||
|
vmag = sqrt(vi[0] * vi[0] + vi[1] * vi[1] + vi[2] * vi[2]);
|
||||||
|
prefactor = vmag * volj * dr;
|
||||||
|
|
||||||
|
vshift[i][0] += prefactor * dx[0];
|
||||||
|
vshift[i][1] += prefactor * dx[1];
|
||||||
|
vshift[i][2] += prefactor * dx[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newton_pair || j < nlocal) {
|
||||||
|
if ((mask[j] & groupbit) && fluidj) {
|
||||||
|
vmag = sqrt(vj[0] * vj[0] + vj[1] * vj[1] + vj[2] * vj[2]);
|
||||||
|
prefactor = vmag * voli * dr;
|
||||||
|
|
||||||
|
vshift[j][0] -= prefactor * dx[0];
|
||||||
|
vshift[j][1] -= prefactor * dx[1];
|
||||||
|
vshift[j][2] -= prefactor * dx[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newton_pair) comm->reverse_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOVShift::correct_surfaces()
|
||||||
|
{
|
||||||
|
if (!surface_flag) return;
|
||||||
|
|
||||||
|
int i, a, b;
|
||||||
|
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
double **nsurface = compute_surface->nsurface;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
double nx, ny, nz, vx, vy, vz, dot;
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
|
||||||
|
if (status[i] & PHASECHECK) continue;
|
||||||
|
|
||||||
|
//if ((status[i] & STATUS_SURFACE) || (status[i] & STATUS_LAYER)) {
|
||||||
|
if (status[i] & STATUS_SURFACE) {
|
||||||
|
nx = nsurface[i][0];
|
||||||
|
ny = nsurface[i][1];
|
||||||
|
vx = vshift[i][0];
|
||||||
|
vy = vshift[i][1];
|
||||||
|
|
||||||
|
dot = nx * vx + ny * vy;
|
||||||
|
if (dim == 3) {
|
||||||
|
nz = nsurface[i][2];
|
||||||
|
vz = vshift[i][2];
|
||||||
|
dot += nz * vz;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allowing shifting into the bulk
|
||||||
|
if (dot < 0.0) continue;
|
||||||
|
|
||||||
|
vshift[i][0] = (1 - nx * nx) * vx - nx * ny * vy;
|
||||||
|
vshift[i][1] = (1 - ny * ny) * vy - nx * ny * vx;
|
||||||
|
if (dim == 3) {
|
||||||
|
vshift[i][0] -= nx * nz * vz;
|
||||||
|
vshift[i][1] -= ny * nz * vz;
|
||||||
|
vshift[i][2] = (1 - nz * nz) * vz - nz * ny * vy - nx * nz * vx;
|
||||||
|
} else {
|
||||||
|
vshift[i][2] = 0.0;
|
||||||
|
}
|
||||||
|
} else if (status[i] & STATUS_SPLASH) {
|
||||||
|
vshift[i][0] = 0.0;
|
||||||
|
vshift[i][1] = 0.0;
|
||||||
|
vshift[i][2] = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int ComputeRHEOVShift::pack_reverse_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i,m,last;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
buf[m++] = vshift[i][0];
|
||||||
|
buf[m++] = vshift[i][1];
|
||||||
|
buf[m++] = vshift[i][2];
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ComputeRHEOVShift::unpack_reverse_comm(int n, int *list, double *buf)
|
||||||
|
{
|
||||||
|
int i,j,m;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
vshift[j][0] += buf[m++];
|
||||||
|
vshift[j][1] += buf[m++];
|
||||||
|
vshift[j][2] += buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
memory usage of local atom-based array
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double ComputeRHEOVShift::memory_usage()
|
||||||
|
{
|
||||||
|
double bytes = 3 * nmax_store * sizeof(double);
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
57
src/RHEO/compute_rheo_vshift.h
Normal file
57
src/RHEO/compute_rheo_vshift.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef COMPUTE_CLASS
|
||||||
|
// clang-format off
|
||||||
|
ComputeStyle(RHEO/VSHIFT,ComputeRHEOVShift)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_COMPUTE_RHEO_VSHIFT_H
|
||||||
|
#define LMP_COMPUTE_RHEO_VSHIFT_H
|
||||||
|
|
||||||
|
#include "compute.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class ComputeRHEOVShift : public Compute {
|
||||||
|
public:
|
||||||
|
ComputeRHEOVShift(class LAMMPS *, int, char **);
|
||||||
|
~ComputeRHEOVShift() override;
|
||||||
|
void init() override;
|
||||||
|
void init_list(int, class NeighList *) override;
|
||||||
|
void compute_peratom() override;
|
||||||
|
int pack_reverse_comm(int, int, double *) override;
|
||||||
|
void unpack_reverse_comm(int, int *, double *) override;
|
||||||
|
double memory_usage() override;
|
||||||
|
void correct_surfaces();
|
||||||
|
double **vshift;
|
||||||
|
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int nmax_store;
|
||||||
|
double dtv, cut, cutsq, cutthird;
|
||||||
|
int surface_flag, interface_flag;
|
||||||
|
double *rho0;
|
||||||
|
|
||||||
|
class NeighList *list;
|
||||||
|
class ComputeRHEOInterface *compute_interface;
|
||||||
|
class ComputeRHEOKernel *compute_kernel;
|
||||||
|
class ComputeRHEOSurface *compute_surface;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
515
src/RHEO/fix_rheo.cpp
Normal file
515
src/RHEO/fix_rheo.cpp
Normal file
@ -0,0 +1,515 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL), Thomas O'Connor (CMU), Eric Palermo (CMU)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "citeme.h"
|
||||||
|
#include "compute_rheo_grad.h"
|
||||||
|
#include "compute_rheo_interface.h"
|
||||||
|
#include "compute_rheo_surface.h"
|
||||||
|
#include "compute_rheo_kernel.h"
|
||||||
|
#include "compute_rheo_rho_sum.h"
|
||||||
|
#include "compute_rheo_vshift.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "update.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
using namespace FixConst;
|
||||||
|
|
||||||
|
static const char cite_rheo[] =
|
||||||
|
"@article{PalermoInPrep,\n"
|
||||||
|
" journal = {in prep},\n"
|
||||||
|
" title = {RHEO: A Hybrid Mesh-Free Model Framework for Dynamic Multi-Phase Flows},\n"
|
||||||
|
" year = {2024},\n"
|
||||||
|
" author = {Eric T. Palermo and Ki T. Wolf and Joel T. Clemmer and Thomas C. O'Connor},\n"
|
||||||
|
"}\n\n";
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixRHEO::FixRHEO(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Fix(lmp, narg, arg), compute_grad(nullptr), compute_kernel(nullptr), compute_surface(nullptr),
|
||||||
|
compute_interface(nullptr), compute_rhosum(nullptr), compute_vshift(nullptr), rho0(nullptr), csq(nullptr)
|
||||||
|
{
|
||||||
|
time_integrate = 1;
|
||||||
|
|
||||||
|
viscosity_fix_defined = 0;
|
||||||
|
pressure_fix_defined = 0;
|
||||||
|
thermal_fix_defined = 0;
|
||||||
|
oxidation_fix_defined = 0;
|
||||||
|
|
||||||
|
thermal_flag = 0;
|
||||||
|
rhosum_flag = 0;
|
||||||
|
shift_flag = 0;
|
||||||
|
interface_flag = 0;
|
||||||
|
surface_flag = 0;
|
||||||
|
oxidation_flag = 0;
|
||||||
|
self_mass_flag = 0;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int n = atom->ntypes;
|
||||||
|
memory->create(rho0, n + 1, "rheo:rho0");
|
||||||
|
memory->create(csq, n + 1, "rheo:csq");
|
||||||
|
for (i = 1; i <= n; i++) {
|
||||||
|
rho0[i] = 1.0;
|
||||||
|
csq[i] = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (igroup != 0)
|
||||||
|
error->all(FLERR, "fix rheo command requires group all");
|
||||||
|
|
||||||
|
if (atom->pressure_flag != 1)
|
||||||
|
error->all(FLERR, "fix rheo command requires atom_style with pressure");
|
||||||
|
if (atom->rho_flag != 1)
|
||||||
|
error->all(FLERR, "fix rheo command requires atom_style with density");
|
||||||
|
if (atom->viscosity_flag != 1)
|
||||||
|
error->all(FLERR, "fix rheo command requires atom_style with viscosity");
|
||||||
|
if (atom->rheo_status_flag != 1)
|
||||||
|
error->all(FLERR, "fix rheo command requires atom_style with status");
|
||||||
|
|
||||||
|
if (narg < 5)
|
||||||
|
utils::missing_cmd_args(FLERR, "fix rheo", error);
|
||||||
|
|
||||||
|
cut = utils::numeric(FLERR, arg[3], false, lmp);
|
||||||
|
if (strcmp(arg[4], "quintic") == 0) {
|
||||||
|
kernel_style = QUINTIC;
|
||||||
|
} else if (strcmp(arg[4], "wendland/c4") == 0) {
|
||||||
|
kernel_style = WENDLANDC4;
|
||||||
|
} else if (strcmp(arg[4], "RK0") == 0) {
|
||||||
|
kernel_style = RK0;
|
||||||
|
} else if (strcmp(arg[4], "RK1") == 0) {
|
||||||
|
kernel_style = RK1;
|
||||||
|
} else if (strcmp(arg[4], "RK2") == 0) {
|
||||||
|
kernel_style = RK2;
|
||||||
|
} else error->all(FLERR, "Unknown kernel style {} in fix rheo", arg[4]);
|
||||||
|
zmin_kernel = utils::numeric(FLERR, arg[5], false, lmp);
|
||||||
|
|
||||||
|
int iarg = 6;
|
||||||
|
while (iarg < narg){
|
||||||
|
if (strcmp(arg[iarg], "shift") == 0) {
|
||||||
|
shift_flag = 1;
|
||||||
|
} else if (strcmp(arg[iarg], "thermal") == 0) {
|
||||||
|
thermal_flag = 1;
|
||||||
|
} else if (strcmp(arg[iarg], "surface/detection") == 0) {
|
||||||
|
surface_flag = 1;
|
||||||
|
if(iarg + 3 >= narg) utils::missing_cmd_args(FLERR, "fix rheo surface/detection", error);
|
||||||
|
if (strcmp(arg[iarg + 1], "coordination") == 0) {
|
||||||
|
surface_style = COORDINATION;
|
||||||
|
zmin_surface = utils::inumeric(FLERR, arg[iarg + 2], false, lmp);
|
||||||
|
zmin_splash = utils::inumeric(FLERR, arg[iarg + 3], false, lmp);
|
||||||
|
} else if (strcmp(arg[iarg + 1], "divergence") == 0) {
|
||||||
|
surface_style = DIVR;
|
||||||
|
divr_surface = utils::numeric(FLERR, arg[iarg + 2], false, lmp);
|
||||||
|
zmin_splash = utils::inumeric(FLERR, arg[iarg + 3], false, lmp);
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, "Illegal surface/detection option in fix rheo, {}", arg[iarg + 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
iarg += 3;
|
||||||
|
} else if (strcmp(arg[iarg], "interface/reconstruct") == 0) {
|
||||||
|
interface_flag = 1;
|
||||||
|
} else if (strcmp(arg[iarg], "rho/sum") == 0) {
|
||||||
|
rhosum_flag = 1;
|
||||||
|
} else if (strcmp(arg[iarg], "self/mass") == 0) {
|
||||||
|
self_mass_flag = 1;
|
||||||
|
} else if (strcmp(arg[iarg], "density") == 0) {
|
||||||
|
if (iarg + n >= narg) utils::missing_cmd_args(FLERR, "fix rheo density", error);
|
||||||
|
for (i = 1; i <= n; i++)
|
||||||
|
rho0[i] = utils::numeric(FLERR, arg[iarg + i], false, lmp);
|
||||||
|
iarg += n;
|
||||||
|
} else if (strcmp(arg[iarg], "speed/sound") == 0) {
|
||||||
|
if (iarg + n >= narg) utils::missing_cmd_args(FLERR, "fix rheo speed/sound", error);
|
||||||
|
for (i = 1; i <= n; i++) {
|
||||||
|
csq[i] = utils::numeric(FLERR, arg[iarg + i], false, lmp);
|
||||||
|
csq[i] *= csq[i];
|
||||||
|
}
|
||||||
|
iarg += n;
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, "Illegal fix rheo command: {}", arg[iarg]);
|
||||||
|
}
|
||||||
|
iarg += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self_mass_flag && (!rhosum_flag))
|
||||||
|
error->all(FLERR, "Cannot use self/mass setting without rho/sum");
|
||||||
|
|
||||||
|
if (lmp->citeme) lmp->citeme->add(cite_rheo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixRHEO::~FixRHEO()
|
||||||
|
{
|
||||||
|
if (compute_kernel) modify->delete_compute("rheo_kernel");
|
||||||
|
if (compute_grad) modify->delete_compute("rheo_grad");
|
||||||
|
if (compute_interface) modify->delete_compute("rheo_interface");
|
||||||
|
if (compute_surface) modify->delete_compute("rheo_surface");
|
||||||
|
if (compute_rhosum) modify->delete_compute("rheo_rhosum");
|
||||||
|
if (compute_vshift) modify->delete_compute("rheo_vshift");
|
||||||
|
|
||||||
|
memory->destroy(csq);
|
||||||
|
memory->destroy(rho0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Create necessary internal computes
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEO::post_constructor()
|
||||||
|
{
|
||||||
|
compute_kernel = dynamic_cast<ComputeRHEOKernel *>(modify->add_compute(
|
||||||
|
fmt::format("rheo_kernel all RHEO/KERNEL {}", kernel_style)));
|
||||||
|
compute_kernel->fix_rheo = this;
|
||||||
|
|
||||||
|
std::string cmd = "rheo_grad all RHEO/GRAD velocity rho viscosity";
|
||||||
|
if (thermal_flag) cmd += " energy";
|
||||||
|
compute_grad = dynamic_cast<ComputeRHEOGrad *>(modify->add_compute(cmd));
|
||||||
|
compute_grad->fix_rheo = this;
|
||||||
|
|
||||||
|
if (rhosum_flag) {
|
||||||
|
compute_rhosum = dynamic_cast<ComputeRHEORhoSum *>(modify->add_compute(
|
||||||
|
fmt::format("rheo_rhosum all RHEO/RHO/SUM {}", self_mass_flag)));
|
||||||
|
compute_rhosum->fix_rheo = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shift_flag) {
|
||||||
|
compute_vshift = dynamic_cast<ComputeRHEOVShift *>(modify->add_compute(
|
||||||
|
"rheo_vshift all RHEO/VSHIFT"));
|
||||||
|
compute_vshift->fix_rheo = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (interface_flag) {
|
||||||
|
compute_interface = dynamic_cast<ComputeRHEOInterface *>(modify->add_compute(
|
||||||
|
"rheo_interface all RHEO/INTERFACE"));
|
||||||
|
compute_interface->fix_rheo = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (surface_flag) {
|
||||||
|
compute_surface = dynamic_cast<ComputeRHEOSurface *>(modify->add_compute(
|
||||||
|
"rheo_surface all RHEO/SURFACE"));
|
||||||
|
compute_surface->fix_rheo = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int FixRHEO::setmask()
|
||||||
|
{
|
||||||
|
int mask = 0;
|
||||||
|
mask |= INITIAL_INTEGRATE;
|
||||||
|
mask |= FINAL_INTEGRATE;
|
||||||
|
mask |= PRE_FORCE;
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEO::init()
|
||||||
|
{
|
||||||
|
dtv = update->dt;
|
||||||
|
dtf = 0.5 * update->dt * force->ftm2v;
|
||||||
|
|
||||||
|
if (modify->get_fix_by_style("^rheo$").size() > 1)
|
||||||
|
error->all(FLERR, "Can only specify one instance of fix rheo");
|
||||||
|
|
||||||
|
if (atom->rheo_status_flag != 1)
|
||||||
|
error->all(FLERR,"fix rheo command requires atom property status");
|
||||||
|
if (atom->rho_flag != 1)
|
||||||
|
error->all(FLERR,"fix rheo command requires atom property rho");
|
||||||
|
if (atom->pressure_flag != 1)
|
||||||
|
error->all(FLERR,"fix rheo command requires atom property pressure");
|
||||||
|
if (atom->viscosity_flag != 1)
|
||||||
|
error->all(FLERR,"fix rheo command requires atom property viscosity");
|
||||||
|
|
||||||
|
if (thermal_flag) {
|
||||||
|
if (atom->esph_flag != 1)
|
||||||
|
error->all(FLERR,"fix rheo command requires atom property esph with thermal setting");
|
||||||
|
if (atom->temperature_flag != 1)
|
||||||
|
error->all(FLERR,"fix rheo command requires atom property temperature with thermal setting");
|
||||||
|
if (atom->heatflow_flag != 1)
|
||||||
|
error->all(FLERR,"fix rheo command requires atom property heatflow with thermal setting");
|
||||||
|
if (atom->conductivity_flag != 1)
|
||||||
|
error->all(FLERR,"fix rheo command requires atom property conductivity with thermal setting");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEO::setup_pre_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
// Check to confirm accessory fixes do not preceed FixRHEO
|
||||||
|
// Note: fixes set this flag in setup_pre_force()
|
||||||
|
if (viscosity_fix_defined || pressure_fix_defined || thermal_fix_defined || oxidation_fix_defined)
|
||||||
|
error->all(FLERR, "Fix RHEO must be defined before all other RHEO fixes");
|
||||||
|
|
||||||
|
// Calculate surfaces
|
||||||
|
if (surface_flag) {
|
||||||
|
compute_kernel->compute_coordination();
|
||||||
|
compute_surface->compute_peratom();
|
||||||
|
}
|
||||||
|
|
||||||
|
pre_force(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEO::setup(int /*vflag*/)
|
||||||
|
{
|
||||||
|
// Confirm all accessory fixes are defined
|
||||||
|
// Note: fixes set this flag in setup_pre_force()
|
||||||
|
if (!viscosity_fix_defined)
|
||||||
|
error->all(FLERR, "Missing fix rheo/viscosity");
|
||||||
|
|
||||||
|
if (!pressure_fix_defined)
|
||||||
|
error->all(FLERR, "Missing fix rheo/pressure");
|
||||||
|
|
||||||
|
if(thermal_flag && !thermal_fix_defined)
|
||||||
|
error->all(FLERR, "Missing fix rheo/thermal");
|
||||||
|
|
||||||
|
// Reset to zero for future runs
|
||||||
|
thermal_fix_defined = 0;
|
||||||
|
viscosity_fix_defined = 0;
|
||||||
|
pressure_fix_defined = 0;
|
||||||
|
oxidation_fix_defined = 0;
|
||||||
|
|
||||||
|
if (rhosum_flag)
|
||||||
|
compute_rhosum->compute_peratom();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEO::initial_integrate(int /*vflag*/)
|
||||||
|
{
|
||||||
|
// update v, x and rho of atoms in group
|
||||||
|
int i, a, b;
|
||||||
|
double dtfm, divu;
|
||||||
|
|
||||||
|
int *type = atom->type;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
double **x = atom->x;
|
||||||
|
double **v = atom->v;
|
||||||
|
double **f = atom->f;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
double *drho = atom->drho;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
double *rmass = atom->rmass;
|
||||||
|
double **gradr = compute_grad->gradr;
|
||||||
|
double **gradv = compute_grad->gradv;
|
||||||
|
double **vshift;
|
||||||
|
if (shift_flag)
|
||||||
|
vshift = compute_vshift->vshift;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int rmass_flag = atom->rmass_flag;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
if (igroup == atom->firstgroup)
|
||||||
|
nlocal = atom->nfirst;
|
||||||
|
|
||||||
|
//Density Half-step
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
if (status[i] & STATUS_NO_INTEGRATION) continue;
|
||||||
|
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
if (rmass_flag) {
|
||||||
|
dtfm = dtf / rmass[i];
|
||||||
|
} else {
|
||||||
|
dtfm = dtf / mass[type[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
v[i][0] += dtfm * f[i][0];
|
||||||
|
v[i][1] += dtfm * f[i][1];
|
||||||
|
v[i][2] += dtfm * f[i][2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update gradients and interpolate solid properties
|
||||||
|
compute_grad->forward_fields(); // also forwards v and rho for chi
|
||||||
|
if (interface_flag) {
|
||||||
|
// Need to save, wiped in exchange
|
||||||
|
compute_interface->store_forces();
|
||||||
|
compute_interface->compute_peratom();
|
||||||
|
}
|
||||||
|
compute_grad->compute_peratom();
|
||||||
|
|
||||||
|
// Position half-step
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
x[i][a] += dtv * v[i][a];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update density using div(u)
|
||||||
|
if (!rhosum_flag) {
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
if (status[i] & STATUS_NO_INTEGRATION) continue;
|
||||||
|
if (status[i] & PHASECHECK) continue;
|
||||||
|
|
||||||
|
divu = 0;
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
divu += gradv[i][a * (1 + dim)];
|
||||||
|
}
|
||||||
|
rho[i] += dtf * (drho[i] - rho[i] * divu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shifting atoms
|
||||||
|
if (shift_flag) {
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
|
||||||
|
if (status[i] & STATUS_NO_SHIFT) continue;
|
||||||
|
if (status[i] & PHASECHECK) continue;
|
||||||
|
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
x[i][a] += dtv * vshift[i][a];
|
||||||
|
for (b = 0; b < dim; b++) {
|
||||||
|
v[i][a] += dtv * vshift[i][b] * gradv[i][a * dim + b];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rhosum_flag) {
|
||||||
|
if (status[i] & PHASECHECK) continue;
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
rho[i] += dtv * vshift[i][a] * gradr[i][a];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEO::pre_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
compute_kernel->compute_coordination(); // Needed for rho sum
|
||||||
|
|
||||||
|
if (rhosum_flag)
|
||||||
|
compute_rhosum->compute_peratom();
|
||||||
|
|
||||||
|
compute_kernel->compute_peratom();
|
||||||
|
|
||||||
|
if (interface_flag) {
|
||||||
|
// Note on first setup, have no forces for pressure to reference
|
||||||
|
compute_interface->compute_peratom();
|
||||||
|
}
|
||||||
|
|
||||||
|
// No need to forward v, rho, or T for compute_grad since already done
|
||||||
|
compute_grad->compute_peratom();
|
||||||
|
compute_grad->forward_gradients();
|
||||||
|
|
||||||
|
if (shift_flag)
|
||||||
|
compute_vshift->compute_peratom();
|
||||||
|
|
||||||
|
// Remove temporary options
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int nall = atom->nlocal + atom->nghost;
|
||||||
|
for (int i = 0; i < nall; i++)
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
status[i] &= OPTIONSMASK;
|
||||||
|
|
||||||
|
// Calculate surfaces, update status
|
||||||
|
if (surface_flag) {
|
||||||
|
compute_surface->compute_peratom();
|
||||||
|
if (shift_flag)
|
||||||
|
compute_vshift->correct_surfaces();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEO::final_integrate()
|
||||||
|
{
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
if (igroup == atom->firstgroup)
|
||||||
|
nlocal = atom->nfirst;
|
||||||
|
|
||||||
|
double dtfm, divu;
|
||||||
|
int i, a;
|
||||||
|
|
||||||
|
double **x = atom->x;
|
||||||
|
double **v = atom->v;
|
||||||
|
double **f = atom->f;
|
||||||
|
double **gradv = compute_grad->gradv;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
double *drho = atom->drho;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
double *rmass = atom->rmass;
|
||||||
|
int *type = atom->type;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
|
||||||
|
int rmass_flag = atom->rmass_flag;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
// Update velocity
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
if (status[i] & STATUS_NO_INTEGRATION) continue;
|
||||||
|
|
||||||
|
if (rmass_flag) {
|
||||||
|
dtfm = dtf / rmass[i];
|
||||||
|
} else {
|
||||||
|
dtfm = dtf / mass[type[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
v[i][a] += dtfm * f[i][a];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update density using divu
|
||||||
|
if (!rhosum_flag) {
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
if (mask[i] & groupbit) {
|
||||||
|
if (status[i] & STATUS_NO_INTEGRATION) continue;
|
||||||
|
if (status[i] & PHASECHECK) continue;
|
||||||
|
|
||||||
|
divu = 0;
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
divu += gradv[i][a * (1 + dim)];
|
||||||
|
}
|
||||||
|
rho[i] += dtf * (drho[i] - rho[i] * divu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEO::reset_dt()
|
||||||
|
{
|
||||||
|
dtv = update->dt;
|
||||||
|
dtf = 0.5 * update->dt * force->ftm2v;
|
||||||
|
}
|
||||||
108
src/RHEO/fix_rheo.h
Normal file
108
src/RHEO/fix_rheo.h
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef FIX_CLASS
|
||||||
|
// clang-format off
|
||||||
|
FixStyle(rheo,FixRHEO)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_FIX_RHEO_H
|
||||||
|
#define LMP_FIX_RHEO_H
|
||||||
|
|
||||||
|
#include "fix.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class FixRHEO : public Fix {
|
||||||
|
public:
|
||||||
|
FixRHEO(class LAMMPS *, int, char **);
|
||||||
|
~FixRHEO() override;
|
||||||
|
int setmask() override;
|
||||||
|
void post_constructor() override;
|
||||||
|
void init() override;
|
||||||
|
void setup_pre_force(int) override;
|
||||||
|
void setup(int) override;
|
||||||
|
void pre_force(int) override;
|
||||||
|
void initial_integrate(int) override;
|
||||||
|
void final_integrate() override;
|
||||||
|
void reset_dt() override;
|
||||||
|
|
||||||
|
// Model parameters
|
||||||
|
double cut;
|
||||||
|
double *rho0, *csq;
|
||||||
|
int self_mass_flag;
|
||||||
|
int zmin_kernel, zmin_surface, zmin_splash;
|
||||||
|
int kernel_style, surface_style;
|
||||||
|
double divr_surface;
|
||||||
|
|
||||||
|
// Accessory fixes/computes
|
||||||
|
int thermal_flag;
|
||||||
|
int rhosum_flag;
|
||||||
|
int shift_flag;
|
||||||
|
int interface_flag;
|
||||||
|
int surface_flag;
|
||||||
|
int oxidation_flag;
|
||||||
|
|
||||||
|
int viscosity_fix_defined;
|
||||||
|
int pressure_fix_defined;
|
||||||
|
int thermal_fix_defined;
|
||||||
|
int oxidation_fix_defined;
|
||||||
|
|
||||||
|
class ComputeRHEOGrad *compute_grad;
|
||||||
|
class ComputeRHEOKernel *compute_kernel;
|
||||||
|
class ComputeRHEOInterface *compute_interface;
|
||||||
|
class ComputeRHEOSurface *compute_surface;
|
||||||
|
class ComputeRHEORhoSum *compute_rhosum;
|
||||||
|
class ComputeRHEOVShift *compute_vshift;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double dtv, dtf;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace RHEO_NS {
|
||||||
|
|
||||||
|
enum {QUINTIC, WENDLANDC4, RK0, RK1, RK2};
|
||||||
|
enum {COORDINATION, DIVR};
|
||||||
|
|
||||||
|
// Status variables
|
||||||
|
enum Status{
|
||||||
|
// Phase status
|
||||||
|
STATUS_SOLID = 1 << 0,
|
||||||
|
// Gap for future phase: STATUS_ = 1 << 1,
|
||||||
|
|
||||||
|
// Surface status
|
||||||
|
STATUS_BULK = 1 << 2,
|
||||||
|
STATUS_LAYER = 1 << 3,
|
||||||
|
STATUS_SURFACE = 1 << 4,
|
||||||
|
STATUS_SPLASH = 1 << 5,
|
||||||
|
|
||||||
|
// Temporary status options - reset in preforce
|
||||||
|
STATUS_NO_SHIFT = 1 << 6,
|
||||||
|
STATUS_NO_INTEGRATION = 1 << 7,
|
||||||
|
STATUS_FREEZING = 1 << 8,
|
||||||
|
STATUS_MELTING = 1 << 9
|
||||||
|
};
|
||||||
|
|
||||||
|
// Masks and their inverses
|
||||||
|
#define PHASEMASK 0xFFFFFFFC // 11111111111111111111111111111100
|
||||||
|
#define PHASECHECK 0x00000003 // 00000000000000000000000000000011
|
||||||
|
#define SURFACEMASK 0xFFFFFFC3 // 11111111111111111111111111000011
|
||||||
|
#define SURFACECHECK 0x0000003C // 00000000000000000000000000111100
|
||||||
|
#define OPTIONSMASK 0xFFFFFC3F // 11111111111111111111110000111111
|
||||||
|
|
||||||
|
} // namespace RHEO_NS
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
296
src/RHEO/fix_rheo_oxidation.cpp
Normal file
296
src/RHEO/fix_rheo_oxidation.cpp
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "fix_rheo_oxidation.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "atom_vec.h"
|
||||||
|
#include "citeme.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "compute_rheo_surface.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "neigh_request.h"
|
||||||
|
#include "update.h"
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
using namespace FixConst;
|
||||||
|
enum {NONE, CONSTANT};
|
||||||
|
|
||||||
|
static const char cite_rheo_oxide[] =
|
||||||
|
"@article{ApplMathModel.130.310,\n"
|
||||||
|
" title = {A hybrid smoothed-particle hydrodynamics model of oxide skins on molten aluminum},\n"
|
||||||
|
" journal = {Applied Mathematical Modelling},\n"
|
||||||
|
" volume = {130},\n"
|
||||||
|
" pages = {310-326},\n"
|
||||||
|
" year = {2024},\n"
|
||||||
|
" issn = {0307-904X},\n"
|
||||||
|
" doi = {https://doi.org/10.1016/j.apm.2024.02.027},\n"
|
||||||
|
" author = {Joel T. Clemmer and Flint Pierce and Thomas C. O'Connor and Thomas D. Nevins and Elizabeth M.C. Jones and Jeremy B. Lechman and John Tencer},\n"
|
||||||
|
"}\n\n";
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixRHEOOxidation::FixRHEOOxidation(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Fix(lmp, narg, arg), compute_surface(nullptr), fix_rheo(nullptr)
|
||||||
|
{
|
||||||
|
if (narg != 6) error->all(FLERR,"Illegal fix command");
|
||||||
|
|
||||||
|
force_reneighbor = 1;
|
||||||
|
next_reneighbor = -1;
|
||||||
|
comm_forward = 3;
|
||||||
|
|
||||||
|
cut = utils::numeric(FLERR, arg[3], false, lmp);
|
||||||
|
if (cut <= 0.0) error->all(FLERR, "Illegal bond cutoff {} in fix rheo/oxidation", cut);
|
||||||
|
|
||||||
|
btype = utils::inumeric(FLERR, arg[4], false, lmp);
|
||||||
|
if (btype < 1 || btype > atom->nbondtypes) error->all(FLERR, "Illegal value {} for bond type in fix rheo/oxidation", btype);
|
||||||
|
|
||||||
|
rsurf = utils::numeric(FLERR, arg[5], false, lmp);
|
||||||
|
if (rsurf <= 0.0) error->all(FLERR, "Illegal surface distance {} in fix rheo/oxidation", cut);
|
||||||
|
|
||||||
|
cutsq = cut * cut;
|
||||||
|
|
||||||
|
if (lmp->citeme) lmp->citeme->add(cite_rheo_oxide);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixRHEOOxidation::~FixRHEOOxidation()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int FixRHEOOxidation::setmask()
|
||||||
|
{
|
||||||
|
int mask = 0;
|
||||||
|
mask |= POST_INTEGRATE;
|
||||||
|
mask |= PRE_FORCE;
|
||||||
|
mask |= POST_FORCE;
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOOxidation::init()
|
||||||
|
{
|
||||||
|
auto fixes = modify->get_fix_by_style("^rheo$");
|
||||||
|
if (fixes.size() == 0) error->all(FLERR, "Need to define fix rheo to use fix rheo/oxidation");
|
||||||
|
fix_rheo = dynamic_cast<FixRHEO *>(fixes[0]);
|
||||||
|
|
||||||
|
if (cut > fix_rheo->cut)
|
||||||
|
error->all(FLERR, "Bonding length exceeds kernel cutoff");
|
||||||
|
|
||||||
|
if (rsurf >= fix_rheo->cut)
|
||||||
|
error->all(FLERR, "Surface distance must be less than kernel cutoff");
|
||||||
|
|
||||||
|
if (!force->bond) error->all(FLERR, "Must define a bond style with fix rheo/oxidation");
|
||||||
|
if (!atom->avec->bonds_allow) error->all(FLERR, "Fix rheo/oxidation requires atom bonds");
|
||||||
|
|
||||||
|
int tmp1, tmp2;
|
||||||
|
index_nb = atom->find_custom("shell_nbond", tmp1, tmp2);
|
||||||
|
if (index_nb == -1)
|
||||||
|
error->all(FLERR, "Must use bond style rheo/shell to use fix rheo/oxidation");
|
||||||
|
nbond = atom->ivector[index_nb];
|
||||||
|
|
||||||
|
// need a half neighbor list
|
||||||
|
auto req = neighbor->add_request(this, NeighConst::REQ_FULL);
|
||||||
|
req->set_cutoff(cut);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOOxidation::init_list(int /*id*/, NeighList *ptr)
|
||||||
|
{
|
||||||
|
list = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOOxidation::setup_pre_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
// Not strictly required that this fix be after FixRHEO,
|
||||||
|
// but enforce to be consistent with other RHEO fixes
|
||||||
|
fix_rheo->oxidation_fix_defined = 1;
|
||||||
|
|
||||||
|
if (!fix_rheo->surface_flag) error->all(FLERR,
|
||||||
|
"fix rheo/oxidation requires surface calculation in fix rheo");
|
||||||
|
compute_surface = fix_rheo->compute_surface;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOOxidation::pre_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOOxidation::post_integrate()
|
||||||
|
{
|
||||||
|
int i, j, n, ii, jj, inum, jnum, bflag, fluidi, fluidj;
|
||||||
|
int *ilist, *jlist, *numneigh, **firstneigh;
|
||||||
|
double delx, dely, delz, rsq;
|
||||||
|
tagint tagi, tagj;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int newton_bond = force->newton_bond;
|
||||||
|
|
||||||
|
tagint *tag = atom->tag;
|
||||||
|
tagint **bond_atom = atom->bond_atom;
|
||||||
|
int **bond_type = atom->bond_type;
|
||||||
|
int *num_bond = atom->num_bond;
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
double *rsurface = compute_surface->rsurface;
|
||||||
|
double **x = atom->x;
|
||||||
|
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
|
||||||
|
// Forward positions (after inititial integrate, before comm)
|
||||||
|
// Note: surface designation lags one timestep, acceptable error
|
||||||
|
comm->forward_comm(this);
|
||||||
|
|
||||||
|
int added_bonds = 0;
|
||||||
|
// loop over neighbors of my atoms
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
if (!(mask[i] & groupbit)) continue;
|
||||||
|
|
||||||
|
// Exclude particles that aren't solid or surface
|
||||||
|
fluidi = !(status[i] & PHASECHECK);
|
||||||
|
if (fluidi && (rsurface[i] > rsurf)) continue;
|
||||||
|
|
||||||
|
tagi = tag[i];
|
||||||
|
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
if (!(mask[j] & groupbit)) continue;
|
||||||
|
|
||||||
|
fluidj = !(status[j] & PHASECHECK);
|
||||||
|
if (fluidj && (rsurface[j] > rsurf)) continue;
|
||||||
|
|
||||||
|
// Skip solid-solid, leaves surface-surface or surface-solid
|
||||||
|
if ((!fluidi) && (!fluidj)) continue;
|
||||||
|
|
||||||
|
tagj = tag[j];
|
||||||
|
|
||||||
|
// Ensure pair is always ordered to ensure numerical operations
|
||||||
|
// are identical to minimize the possibility that a bond straddling
|
||||||
|
// an mpi grid (newton off) isn't created on one proc but not the other
|
||||||
|
if (tagi < tagj) {
|
||||||
|
delx = x[i][0] - x[j][0];
|
||||||
|
dely = x[i][1] - x[j][1];
|
||||||
|
delz = x[i][2] - x[j][2];
|
||||||
|
} else {
|
||||||
|
delx = x[j][0] - x[i][0];
|
||||||
|
dely = x[j][1] - x[i][1];
|
||||||
|
delz = x[j][2] - x[i][2];
|
||||||
|
}
|
||||||
|
rsq = delx * delx + dely * dely + delz * delz;
|
||||||
|
if (rsq > cutsq) continue;
|
||||||
|
|
||||||
|
// Check if already have an oxide bond
|
||||||
|
bflag = 0;
|
||||||
|
for (n = 0; n < num_bond[i]; n++) {
|
||||||
|
if (bond_type[i][n] == btype && bond_atom[i][n] == tagj) {
|
||||||
|
bflag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bflag) continue;
|
||||||
|
|
||||||
|
added_bonds += 1;
|
||||||
|
|
||||||
|
// Add bonds to owned atoms
|
||||||
|
// If newton bond off, add to both, otherwise add to whichever has a smaller tag
|
||||||
|
|
||||||
|
if (!newton_bond || (tagi < tagj)) {
|
||||||
|
if (num_bond[i] == atom->bond_per_atom)
|
||||||
|
error->one(FLERR,"New bond exceeded bonds per atom in fix rheo/oxidation for atom {}", tagi);
|
||||||
|
bond_type[i][num_bond[i]] = btype;
|
||||||
|
bond_atom[i][num_bond[i]] = tagj;
|
||||||
|
num_bond[i]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int added_bonds_all;
|
||||||
|
MPI_Allreduce(&added_bonds, &added_bonds_all, 1, MPI_INT, MPI_SUM, world);
|
||||||
|
|
||||||
|
if (added_bonds_all > 0)
|
||||||
|
next_reneighbor = update->ntimestep;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOOxidation::post_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int *num_bond = atom->num_bond;
|
||||||
|
for (int i = 0; i < atom->nlocal; i++)
|
||||||
|
if (num_bond[i] != 0)
|
||||||
|
status[i] |= STATUS_NO_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int FixRHEOOxidation::pack_forward_comm(int n, int *list, double *buf,
|
||||||
|
int /*pbc_flag*/, int * /*pbc*/)
|
||||||
|
{
|
||||||
|
int i, j, k, m;
|
||||||
|
double **x = atom->x;
|
||||||
|
m = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
buf[m++] = x[j][0];
|
||||||
|
buf[m++] = x[j][1];
|
||||||
|
buf[m++] = x[j][2];
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOOxidation::unpack_forward_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last;
|
||||||
|
double **x = atom->x;
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
x[i][0] = buf[m++];
|
||||||
|
x[i][1] = buf[m++];
|
||||||
|
x[i][2] = buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
57
src/RHEO/fix_rheo_oxidation.h
Normal file
57
src/RHEO/fix_rheo_oxidation.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef FIX_CLASS
|
||||||
|
// clang-format off
|
||||||
|
FixStyle(rheo/oxidation,FixRHEOOxidation)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_FIX_RHEO_OXIDATION_H
|
||||||
|
#define LMP_FIX_RHEO_OXIDATION_H
|
||||||
|
|
||||||
|
#include "fix.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class FixRHEOOxidation : public Fix {
|
||||||
|
public:
|
||||||
|
FixRHEOOxidation(class LAMMPS *, int, char **);
|
||||||
|
~FixRHEOOxidation() override;
|
||||||
|
int setmask() override;
|
||||||
|
void init() override;
|
||||||
|
void init_list(int, class NeighList *) override;
|
||||||
|
void setup_pre_force(int) override;
|
||||||
|
void post_integrate() override;
|
||||||
|
void pre_force(int) override;
|
||||||
|
void post_force(int) override;
|
||||||
|
int pack_forward_comm(int, int *, double *, int, int *) override;
|
||||||
|
void unpack_forward_comm(int, int, double *) override;
|
||||||
|
int *nbond;
|
||||||
|
double rsurf, cut;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int btype, index_nb;
|
||||||
|
double cutsq;
|
||||||
|
|
||||||
|
class NeighList *list;
|
||||||
|
class ComputeRHEOSurface *compute_surface;
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
254
src/RHEO/fix_rheo_pressure.cpp
Normal file
254
src/RHEO/fix_rheo_pressure.cpp
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL), Thomas O'Connor (CMU)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "fix_rheo_pressure.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "update.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace FixConst;
|
||||||
|
enum {NONE, LINEAR, CUBIC, TAITWATER, TAITGENERAL};
|
||||||
|
|
||||||
|
static constexpr double SEVENTH = 1.0 / 7.0;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixRHEOPressure::FixRHEOPressure(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Fix(lmp, narg, arg), fix_rheo(nullptr), rho0(nullptr), csq(nullptr), rho0inv(nullptr), csqinv(nullptr), c_cubic(nullptr), tpower(nullptr), pbackground(nullptr), pressure_style(nullptr)
|
||||||
|
{
|
||||||
|
if (narg < 4) error->all(FLERR,"Illegal fix command");
|
||||||
|
|
||||||
|
comm_forward = 1;
|
||||||
|
|
||||||
|
// Currently can only have one instance of fix rheo/pressure
|
||||||
|
if (igroup != 0)
|
||||||
|
error->all(FLERR,"fix rheo/pressure command requires group all");
|
||||||
|
|
||||||
|
int i, nlo, nhi;
|
||||||
|
int n = atom->ntypes;
|
||||||
|
memory->create(pressure_style, n + 1, "rheo:pressure_style");
|
||||||
|
memory->create(c_cubic, n + 1, "rheo:c_cubic");
|
||||||
|
memory->create(tpower, n + 1, "rheo:tpower");
|
||||||
|
memory->create(pbackground, n + 1, "rheo:pbackground");
|
||||||
|
for (i = 1; i <= n; i++) pressure_style[i] = NONE;
|
||||||
|
|
||||||
|
int iarg = 3;
|
||||||
|
while (iarg < narg) {
|
||||||
|
utils::bounds(FLERR, arg[iarg], 1, n, nlo, nhi, error);
|
||||||
|
|
||||||
|
if (iarg + 1 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/pressure", error);
|
||||||
|
|
||||||
|
if (strcmp(arg[iarg + 1], "linear") == 0) {
|
||||||
|
for (i = nlo; i <= nhi; i++)
|
||||||
|
pressure_style[i] = LINEAR;
|
||||||
|
} else if (strcmp(arg[iarg + 1], "tait/water") == 0) {
|
||||||
|
for (i = nlo; i <= nhi; i++)
|
||||||
|
pressure_style[i] = TAITWATER;
|
||||||
|
} else if (strcmp(arg[iarg + 1], "tait/general") == 0) {
|
||||||
|
if (iarg + 3 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/pressure tait", error);
|
||||||
|
|
||||||
|
double tpower_one = utils::numeric(FLERR, arg[iarg + 2], false, lmp);
|
||||||
|
double pbackground_one = utils::numeric(FLERR, arg[iarg + 3], false, lmp);
|
||||||
|
iarg += 2;
|
||||||
|
|
||||||
|
for (i = nlo; i <= nhi; i++) {
|
||||||
|
pressure_style[i] = TAITGENERAL;
|
||||||
|
tpower[i] = tpower_one;
|
||||||
|
pbackground[i] = pbackground_one;
|
||||||
|
}
|
||||||
|
} else if (strcmp(arg[iarg + 1], "cubic") == 0) {
|
||||||
|
if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/pressure cubic", error);
|
||||||
|
|
||||||
|
double c_cubic_one = utils::numeric(FLERR, arg[iarg + 2], false, lmp);
|
||||||
|
iarg += 1;
|
||||||
|
|
||||||
|
for (i = nlo; i <= nhi; i++) {
|
||||||
|
pressure_style[i] = CUBIC;
|
||||||
|
c_cubic[i] = c_cubic_one;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error->all(FLERR,"Illegal fix command, {}", arg[iarg]);
|
||||||
|
}
|
||||||
|
iarg += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i <= n; i++)
|
||||||
|
if (pressure_style[i] == NONE)
|
||||||
|
error->all(FLERR,"Must specify pressure for atom type {} in fix/rheo/pressure", i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixRHEOPressure::~FixRHEOPressure()
|
||||||
|
{
|
||||||
|
memory->destroy(pressure_style);
|
||||||
|
memory->destroy(csqinv);
|
||||||
|
memory->destroy(rho0inv);
|
||||||
|
memory->destroy(c_cubic);
|
||||||
|
memory->destroy(tpower);
|
||||||
|
memory->destroy(pbackground);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int FixRHEOPressure::setmask()
|
||||||
|
{
|
||||||
|
int mask = 0;
|
||||||
|
mask |= PRE_FORCE;
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOPressure::init()
|
||||||
|
{
|
||||||
|
auto fixes = modify->get_fix_by_style("^rheo$");
|
||||||
|
if (fixes.size() == 0) error->all(FLERR, "Need to define fix rheo to use fix rheo/pressure");
|
||||||
|
fix_rheo = dynamic_cast<FixRHEO *>(fixes[0]);
|
||||||
|
|
||||||
|
csq = fix_rheo->csq;
|
||||||
|
rho0 = fix_rheo->rho0;
|
||||||
|
|
||||||
|
int n = atom->ntypes;
|
||||||
|
memory->create(csqinv, n + 1, "rheo:rho0inv");
|
||||||
|
memory->create(rho0inv, n + 1, "rheo:rho0inv");
|
||||||
|
for (int i = 0; i <= n; i++) {
|
||||||
|
csqinv[i] = 1.0 / csq[i];
|
||||||
|
rho0inv[i] = 1.0 / rho0[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modify->get_fix_by_style("rheo/pressure").size() > 1)
|
||||||
|
error->all(FLERR, "Can only specify one instance of fix rheo/pressure");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOPressure::setup_pre_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
fix_rheo->pressure_fix_defined = 1;
|
||||||
|
pre_force(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Update (and forward) pressure every timestep
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOPressure::pre_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
double dr, rr3, rho_ratio;
|
||||||
|
|
||||||
|
int *mask = atom->mask;
|
||||||
|
int *type = atom->type;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
double *pressure = atom->pressure;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
|
for (i = 0; i < nlocal; i++)
|
||||||
|
if (mask[i] & groupbit)
|
||||||
|
pressure[i] = calc_pressure(rho[i], type[i]);
|
||||||
|
|
||||||
|
if (comm_forward) comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int FixRHEOPressure::pack_forward_comm(int n, int *list, double *buf,
|
||||||
|
int /*pbc_flag*/, int * /*pbc*/)
|
||||||
|
{
|
||||||
|
int i,j,k,m;
|
||||||
|
double *pressure = atom->pressure;
|
||||||
|
m = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
buf[m++] = pressure[j];
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOPressure::unpack_forward_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last;
|
||||||
|
double *pressure = atom->pressure;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
pressure[i] = buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double FixRHEOPressure::calc_pressure(double rho, int type)
|
||||||
|
{
|
||||||
|
double p, dr, rr3, rho_ratio;
|
||||||
|
|
||||||
|
if (pressure_style[type] == LINEAR) {
|
||||||
|
p = csq[type] * (rho - rho0[type]);
|
||||||
|
} else if (pressure_style[type] == CUBIC) {
|
||||||
|
dr = rho - rho0[type];
|
||||||
|
p = csq[type] * (dr + c_cubic[type] * dr * dr * dr);
|
||||||
|
} else if (pressure_style[type] == TAITWATER) {
|
||||||
|
rho_ratio = rho * rho0inv[type];
|
||||||
|
rr3 = rho_ratio * rho_ratio * rho_ratio;
|
||||||
|
p = csq[type] * rho0[type] * SEVENTH * (rr3 * rr3 * rho_ratio - 1.0);
|
||||||
|
} else if (pressure_style[type] == TAITGENERAL) {
|
||||||
|
rho_ratio = rho * rho0inv[type];
|
||||||
|
p = csq[type] * rho0[type] * (pow(rho_ratio, tpower[type]) - 1.0) / tpower[type];
|
||||||
|
p += pbackground[type];
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double FixRHEOPressure::calc_rho(double p, int type)
|
||||||
|
{
|
||||||
|
double rho, dr, rr3, rho_ratio;
|
||||||
|
|
||||||
|
if (pressure_style[type] == LINEAR) {
|
||||||
|
rho = csqinv[type] * p + rho0[type];
|
||||||
|
} else if (pressure_style[type] == CUBIC) {
|
||||||
|
error->one(FLERR, "Rho calculation from pressure not yet supported for cubic pressure equation");
|
||||||
|
} else if (pressure_style[type] == TAITWATER) {
|
||||||
|
rho = pow(7.0 * p + csq[type] * rho0[type], SEVENTH);
|
||||||
|
rho *= pow(rho0[type], 6.0 * SEVENTH);
|
||||||
|
rho *= pow(csq[type], -SEVENTH);
|
||||||
|
} else if (pressure_style[type] == TAITGENERAL) {
|
||||||
|
p -= pbackground[type];
|
||||||
|
rho = pow(tpower[type] * p + csq[type] * rho0[type], 1.0 / tpower[type]);
|
||||||
|
rho *= pow(rho0[type], 1.0 - 1.0 / tpower[type]);
|
||||||
|
rho *= pow(csq[type], -1.0 / tpower[type]);
|
||||||
|
}
|
||||||
|
return rho;
|
||||||
|
}
|
||||||
50
src/RHEO/fix_rheo_pressure.h
Normal file
50
src/RHEO/fix_rheo_pressure.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef FIX_CLASS
|
||||||
|
// clang-format off
|
||||||
|
FixStyle(rheo/pressure,FixRHEOPressure)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_FIX_RHEO_PRESSURE_H
|
||||||
|
#define LMP_FIX_RHEO_PRESSURE_H
|
||||||
|
|
||||||
|
#include "fix.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class FixRHEOPressure : public Fix {
|
||||||
|
public:
|
||||||
|
FixRHEOPressure(class LAMMPS *, int, char **);
|
||||||
|
~FixRHEOPressure() override;
|
||||||
|
int setmask() override;
|
||||||
|
void init() override;
|
||||||
|
void setup_pre_force(int) override;
|
||||||
|
void pre_force(int) override;
|
||||||
|
int pack_forward_comm(int, int *, double *, int, int *) override;
|
||||||
|
void unpack_forward_comm(int, int, double *) override;
|
||||||
|
double calc_pressure(double, int);
|
||||||
|
double calc_rho(double, int);
|
||||||
|
|
||||||
|
private:
|
||||||
|
double *c_cubic, *csq, *csqinv, *rho0, *rho0inv, *tpower, *pbackground;
|
||||||
|
int *pressure_style;
|
||||||
|
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
786
src/RHEO/fix_rheo_thermal.cpp
Normal file
786
src/RHEO/fix_rheo_thermal.cpp
Normal file
@ -0,0 +1,786 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "fix_rheo_thermal.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "atom_vec.h"
|
||||||
|
#include "citeme.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "compute_rheo_grad.h"
|
||||||
|
#include "compute_rheo_vshift.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "fix_bond_history.h"
|
||||||
|
#include "fix_update_special_bonds.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "math_extra.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "neigh_request.h"
|
||||||
|
#include "pair.h"
|
||||||
|
#include "update.h"
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
using namespace FixConst;
|
||||||
|
enum {NONE, CONSTANT};
|
||||||
|
|
||||||
|
static const char cite_rheo_oxide[] =
|
||||||
|
"@article{ApplMathModel.130.310,\n"
|
||||||
|
" title = {A hybrid smoothed-particle hydrodynamics model of oxide skins on molten aluminum},\n"
|
||||||
|
" journal = {Applied Mathematical Modelling},\n"
|
||||||
|
" volume = {130},\n"
|
||||||
|
" pages = {310-326},\n"
|
||||||
|
" year = {2024},\n"
|
||||||
|
" issn = {0307-904X},\n"
|
||||||
|
" doi = {https://doi.org/10.1016/j.apm.2024.02.027},\n"
|
||||||
|
" author = {Joel T. Clemmer and Flint Pierce and Thomas C. O'Connor and Thomas D. Nevins and Elizabeth M.C. Jones and Jeremy B. Lechman and John Tencer},\n"
|
||||||
|
"}\n\n";
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixRHEOThermal::FixRHEOThermal(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Fix(lmp, narg, arg), fix_rheo(nullptr), compute_grad(nullptr), compute_vshift(nullptr),
|
||||||
|
Tc(nullptr), kappa(nullptr), cv(nullptr), L(nullptr),
|
||||||
|
Tc_style(nullptr), kappa_style(nullptr), cv_style(nullptr), L_style(nullptr),
|
||||||
|
fix_update_special_bonds(nullptr)
|
||||||
|
{
|
||||||
|
if (narg < 4) error->all(FLERR,"Illegal fix command");
|
||||||
|
|
||||||
|
force_reneighbor = 1;
|
||||||
|
next_reneighbor = -1;
|
||||||
|
cut_bond = 0;
|
||||||
|
comm_forward = 0;
|
||||||
|
|
||||||
|
// Currently can only have one instance of fix rheo/thermal
|
||||||
|
if (igroup != 0)
|
||||||
|
error->all(FLERR,"fix rheo/thermal command requires group all");
|
||||||
|
|
||||||
|
int i, nlo, nhi;
|
||||||
|
int n = atom->ntypes;
|
||||||
|
|
||||||
|
memory->create(Tc_style, n + 1, "rheo:Tc_style");
|
||||||
|
memory->create(kappa_style, n + 1, "rheo:kappa_style");
|
||||||
|
memory->create(cv_style, n + 1, "rheo:cv_style");
|
||||||
|
memory->create(L_style, n + 1, "rheo:L_style");
|
||||||
|
|
||||||
|
memory->create(Tc, n + 1, "rheo:Tc");
|
||||||
|
memory->create(kappa, n + 1, "rheo:kappa");
|
||||||
|
memory->create(cv, n + 1, "rheo:cv");
|
||||||
|
memory->create(L, n + 1, "rheo:L");
|
||||||
|
|
||||||
|
for (i = 1; i <= n; i++) {
|
||||||
|
Tc_style[i] = NONE;
|
||||||
|
kappa_style[i] = NONE;
|
||||||
|
cv_style[i] = NONE;
|
||||||
|
L_style[i] = NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int iarg = 3;
|
||||||
|
while (iarg < narg) {
|
||||||
|
if (strcmp(arg[iarg],"conductivity") == 0) {
|
||||||
|
if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/thermal conductivity", error);
|
||||||
|
utils::bounds(FLERR, arg[iarg + 1], 1, n, nlo, nhi, error);
|
||||||
|
|
||||||
|
// Conductivity arguments
|
||||||
|
if (strcmp(arg[iarg + 2], "constant") == 0) {
|
||||||
|
if (iarg + 3 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/thermal conductivity constant", error);
|
||||||
|
|
||||||
|
double kappa_one = utils::numeric(FLERR, arg[iarg + 3], false, lmp);
|
||||||
|
if (kappa_one < 0.0) error->all(FLERR, "The conductivity must be positive");
|
||||||
|
iarg += 2;
|
||||||
|
|
||||||
|
for (i = nlo; i <= nhi; i++) {
|
||||||
|
kappa_style[i] = CONSTANT;
|
||||||
|
kappa[i] = kappa_one;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error->all(FLERR,"Illegal fix command, {}", arg[iarg + 2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg], "specific/heat") == 0) {
|
||||||
|
if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/thermal specific/heat", error);
|
||||||
|
utils::bounds(FLERR, arg[iarg + 1], 1, n, nlo, nhi, error);
|
||||||
|
|
||||||
|
// Cv arguments
|
||||||
|
if (strcmp(arg[iarg + 2], "constant") == 0) {
|
||||||
|
if (iarg + 3 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/thermal specific/heat constant", error);
|
||||||
|
|
||||||
|
double cv_one = utils::numeric(FLERR, arg[iarg + 3], false, lmp);
|
||||||
|
if (cv_one < 0.0) error->all(FLERR, "The specific heat must be positive");
|
||||||
|
iarg += 2;
|
||||||
|
|
||||||
|
for (i = nlo; i <= nhi; i++) {
|
||||||
|
cv_style[i] = CONSTANT;
|
||||||
|
cv[i] = cv_one;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
error->all(FLERR,"Illegal fix command, {}", arg[iarg + 2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg], "Tfreeze") == 0) {
|
||||||
|
if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/thermal Tfreeze", error);
|
||||||
|
utils::bounds(FLERR, arg[iarg + 1], 1, n, nlo, nhi, error);
|
||||||
|
|
||||||
|
// T freeze arguments
|
||||||
|
if (strcmp(arg[iarg + 2], "constant") == 0) {
|
||||||
|
if (iarg + 3 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/thermal Tfreeze constant", error);
|
||||||
|
|
||||||
|
double Tc_one = utils::numeric(FLERR, arg[iarg + 3], false, lmp);
|
||||||
|
iarg += 2;
|
||||||
|
|
||||||
|
for (i = nlo; i <= nhi; i++) {
|
||||||
|
Tc_style[i] = CONSTANT;
|
||||||
|
Tc[i] = Tc_one;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, "Illegal fix command, {}", arg[iarg + 2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg], "latent/heat") == 0) {
|
||||||
|
if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/thermal latent/heat", error);
|
||||||
|
utils::bounds(FLERR, arg[iarg + 1], 1, n, nlo, nhi, error);
|
||||||
|
|
||||||
|
// Cv arguments
|
||||||
|
if (strcmp(arg[iarg + 2], "constant") == 0) {
|
||||||
|
if (iarg + 3 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/thermal latent/heat constant", error);
|
||||||
|
|
||||||
|
double L_one = utils::numeric(FLERR, arg[iarg + 3], false, lmp);
|
||||||
|
if (L_one < 0.0) error->all(FLERR, "The latent heat must be positive");
|
||||||
|
iarg += 2;
|
||||||
|
|
||||||
|
for (i = nlo; i <= nhi; i++) {
|
||||||
|
L_style[i] = CONSTANT;
|
||||||
|
L[i] = L_one;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
error->all(FLERR,"Illegal fix command, {}", arg[iarg + 2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg], "react") == 0) {
|
||||||
|
if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/thermal react", error);
|
||||||
|
cut_bond = utils::numeric(FLERR, arg[iarg + 1], false, lmp);
|
||||||
|
btype = utils::numeric(FLERR, arg[iarg + 2], false, lmp);
|
||||||
|
comm_forward = 4;
|
||||||
|
if (cut_bond <= 0.0) error->all(FLERR, "Illegal max bond length must be greater than zero");\
|
||||||
|
if (btype < 1 || btype > atom->nbondtypes) error->all(FLERR, "Illegal value for bond type");
|
||||||
|
|
||||||
|
cutsq_bond = cut_bond * cut_bond;
|
||||||
|
iarg += 3;
|
||||||
|
} else {
|
||||||
|
error->all(FLERR,"Illegal fix command, {}", arg[iarg]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 1; i <= n; i++) {
|
||||||
|
if (cv_style[i] == NONE)
|
||||||
|
error->all(FLERR, "Must specify specific/heat for atom type {} in fix/rheo/thermal", i);
|
||||||
|
if (kappa_style[i] == NONE)
|
||||||
|
error->all(FLERR, "Must specify conductivity for atom type {} in fix/rheo/thermal", i);
|
||||||
|
if (Tc_style[i] == NONE && L_style[i] != NONE)
|
||||||
|
error->all(FLERR, "Must specify critical temperature for atom type {} to use latent heat in fix rheo/thermal", i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lmp->citeme) lmp->citeme->add(cite_rheo_oxide);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixRHEOThermal::~FixRHEOThermal()
|
||||||
|
{
|
||||||
|
// Remove custom property if it exists
|
||||||
|
int tmp1, tmp2, index;
|
||||||
|
index = atom->find_custom("rheo_conductivity", tmp1, tmp2);
|
||||||
|
if (index != -1) atom->remove_custom(index, 1, 0);
|
||||||
|
|
||||||
|
memory->destroy(cv_style);
|
||||||
|
memory->destroy(Tc_style);
|
||||||
|
memory->destroy(kappa_style);
|
||||||
|
memory->destroy(L_style);
|
||||||
|
memory->destroy(cv);
|
||||||
|
memory->destroy(Tc);
|
||||||
|
memory->destroy(kappa);
|
||||||
|
memory->destroy(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int FixRHEOThermal::setmask()
|
||||||
|
{
|
||||||
|
int mask = 0;
|
||||||
|
mask |= INITIAL_INTEGRATE;
|
||||||
|
mask |= POST_INTEGRATE;
|
||||||
|
mask |= POST_NEIGHBOR;
|
||||||
|
mask |= PRE_FORCE;
|
||||||
|
mask |= FINAL_INTEGRATE;
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::init()
|
||||||
|
{
|
||||||
|
auto fixes = modify->get_fix_by_style("^rheo$");
|
||||||
|
if (fixes.size() == 0) error->all(FLERR, "Need to define fix rheo to use fix rheo/viscosity");
|
||||||
|
fix_rheo = dynamic_cast<FixRHEO *>(fixes[0]);
|
||||||
|
cut_kernel = fix_rheo->cut;
|
||||||
|
|
||||||
|
if (cut_bond > cut_kernel)
|
||||||
|
error->all(FLERR, "Bonding length exceeds kernel cutoff");
|
||||||
|
|
||||||
|
if (!fix_rheo->thermal_flag)
|
||||||
|
error->all(FLERR, "Need to define thermal setting in fix rheo");
|
||||||
|
compute_grad = fix_rheo->compute_grad;
|
||||||
|
compute_vshift = fix_rheo->compute_vshift;
|
||||||
|
|
||||||
|
dt = update->dt;
|
||||||
|
dth = 0.5 * update->dt;
|
||||||
|
|
||||||
|
if (atom->esph_flag != 1)
|
||||||
|
error->all(FLERR, "fix rheo/thermal command requires atom property esph");
|
||||||
|
if (atom->temperature_flag != 1)
|
||||||
|
error->all(FLERR, "fix rheo/thermal command requires atom property temperature");
|
||||||
|
if (atom->heatflow_flag != 1)
|
||||||
|
error->all(FLERR, "fix rheo/thermal command requires atom property heatflow");
|
||||||
|
if (atom->conductivity_flag != 1)
|
||||||
|
error->all(FLERR, "fix rheo/thermal command requires atom property conductivity");
|
||||||
|
|
||||||
|
if (cut_bond > 0.0) {
|
||||||
|
if (!force->bond) error->all(FLERR, "Must define a bond style to use reactive bond generation with fix rheo/thermal");
|
||||||
|
if (!atom->avec->bonds_allow) error->all(FLERR, "Reactive bond generation in fix rheo/thermal requires atom bonds");
|
||||||
|
|
||||||
|
// all special weights must be 1.0 (no special neighbors) or there must be an instance of fix update/special/bonds
|
||||||
|
if (force->special_lj[0] != 1.0 || force->special_lj[1] != 1.0 || force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0) {
|
||||||
|
auto fixes = modify->get_fix_by_style("UPDATE_SPECIAL_BONDS");
|
||||||
|
if (fixes.size() == 0) error->all(FLERR, "Without fix update/special/bonds, reactive bond generation in fix rheo/thermal requires special weights of 1.0");
|
||||||
|
fix_update_special_bonds = dynamic_cast<FixUpdateSpecialBonds *>(fixes[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// must have newton off so both processors will search nlist to build bonds
|
||||||
|
if (force->newton_pair)
|
||||||
|
error->all(FLERR, "Need Newton off for reactive bond generation");
|
||||||
|
|
||||||
|
// need a half neighbor list, built only when particles freeze
|
||||||
|
auto req = neighbor->add_request(this, NeighConst::REQ_OCCASIONAL);
|
||||||
|
req->set_cutoff(cut_kernel);
|
||||||
|
|
||||||
|
// find instances of bond history to delete/shift data
|
||||||
|
histories = modify->get_fix_by_style("BOND_HISTORY");
|
||||||
|
n_histories = histories.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::init_list(int /*id*/, NeighList *ptr)
|
||||||
|
{
|
||||||
|
list = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::setup_pre_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
fix_rheo->thermal_fix_defined = 1;
|
||||||
|
|
||||||
|
if (modify->get_fix_by_style("rheo/thermal").size() > 1)
|
||||||
|
error->all(FLERR, "More than one fix rheo/thermal defined");
|
||||||
|
|
||||||
|
post_neighbor();
|
||||||
|
pre_force(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::initial_integrate(int /*vflag*/)
|
||||||
|
{
|
||||||
|
// update temperature from shifting
|
||||||
|
if (!fix_rheo->shift_flag) return;
|
||||||
|
int i, a;
|
||||||
|
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
double *energy = atom->esph;
|
||||||
|
double **grade = compute_grad->grade;
|
||||||
|
double **vshift = compute_vshift->vshift;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
if (igroup == atom->firstgroup)
|
||||||
|
nlocal = atom->nfirst;
|
||||||
|
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
if (status[i] & STATUS_NO_SHIFT) continue;
|
||||||
|
for (a = 0; a < dim; a++)
|
||||||
|
energy[i] += dt * vshift[i][a] * grade[i][a];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::post_integrate()
|
||||||
|
{
|
||||||
|
int i, itype;
|
||||||
|
double cvi, Tci, Ti, Li;
|
||||||
|
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
double *energy = atom->esph;
|
||||||
|
double *temperature = atom->temperature;
|
||||||
|
double *heatflow = atom->heatflow;
|
||||||
|
int *type = atom->type;
|
||||||
|
|
||||||
|
int n_melt = 0;
|
||||||
|
int n_freeze = 0;
|
||||||
|
|
||||||
|
//Integrate energy and check status
|
||||||
|
for (i = 0; i < atom->nlocal; i++) {
|
||||||
|
if (status[i] & STATUS_NO_INTEGRATION) continue;
|
||||||
|
|
||||||
|
itype = type[i];
|
||||||
|
cvi = calc_cv(i, itype);
|
||||||
|
energy[i] += dth * heatflow[i];
|
||||||
|
temperature[i] = energy[i] / cvi;
|
||||||
|
|
||||||
|
if (Tc_style[itype] != NONE) {
|
||||||
|
Ti = temperature[i];
|
||||||
|
Tci = calc_Tc(i, itype);
|
||||||
|
|
||||||
|
if (L_style[itype] != NONE) {
|
||||||
|
Li = calc_L(i, itype);
|
||||||
|
if (Ti > Tci) Ti = MAX(Tci, (energy[i] - Li) / cvi);
|
||||||
|
temperature[i] = Ti;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check phase change if Ti != Tci
|
||||||
|
|
||||||
|
if (Ti > Tci) {
|
||||||
|
// If solid, melt
|
||||||
|
if (status[i] & STATUS_SOLID) {
|
||||||
|
status[i] &= PHASEMASK;
|
||||||
|
status[i] |= STATUS_MELTING;
|
||||||
|
n_melt += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Ti < Tci) {
|
||||||
|
// If fluid, freeze
|
||||||
|
if (!(status[i] & STATUS_SOLID)) {
|
||||||
|
status[i] &= PHASEMASK;
|
||||||
|
status[i] |= STATUS_SOLID;
|
||||||
|
status[i] |= STATUS_FREEZING;
|
||||||
|
n_freeze += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int n_melt_all, n_freeze_all;
|
||||||
|
MPI_Allreduce(&n_melt, &n_melt_all, 1, MPI_INT, MPI_SUM, world);
|
||||||
|
MPI_Allreduce(&n_freeze, &n_freeze_all, 1, MPI_INT, MPI_SUM, world);
|
||||||
|
|
||||||
|
if (cut_bond > 0 && (n_melt_all || n_freeze_all)) {
|
||||||
|
|
||||||
|
// If a particle freezes, check if it already has bonds of that type
|
||||||
|
// If so, assume it was inserted as a solid particle
|
||||||
|
// Note: inserted solid particle may still shift one timestep
|
||||||
|
int *num_bond = atom->num_bond;
|
||||||
|
int **bond_type = atom->bond_type;
|
||||||
|
for (i = 0; i < atom->nlocal; i++) {
|
||||||
|
if (status[i] & STATUS_FREEZING) {
|
||||||
|
for (int n = 0; n < num_bond[i]; n++) {
|
||||||
|
if (bond_type[i][n] == btype) {
|
||||||
|
status[i] &= ~STATUS_FREEZING;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forward status + positions (after inititial integrate, before comm)
|
||||||
|
comm->forward_comm(this);
|
||||||
|
|
||||||
|
if (n_freeze_all) create_bonds();
|
||||||
|
if (n_melt_all) break_bonds();
|
||||||
|
|
||||||
|
next_reneighbor = update->ntimestep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Only need to update non-evolving conductivity styles after atoms exchange
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::post_neighbor()
|
||||||
|
{
|
||||||
|
int i, itype;
|
||||||
|
int *type = atom->type;
|
||||||
|
double *conductivity = atom->conductivity;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int nall = nlocal + atom->nghost;
|
||||||
|
|
||||||
|
for (i = 0; i < nall; i++) {
|
||||||
|
itype = type[i];
|
||||||
|
if (kappa_style[itype] == CONSTANT)
|
||||||
|
conductivity[i] = kappa[itype];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Calculate temperature
|
||||||
|
In the future, update & forward evolving conductivity styles every timestep
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::pre_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
int i, itype;
|
||||||
|
double cvi, Tci, Ti, Li;
|
||||||
|
|
||||||
|
double *energy = atom->esph;
|
||||||
|
double *temperature = atom->temperature;
|
||||||
|
int *type = atom->type;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int nall = nlocal + atom->nghost;
|
||||||
|
|
||||||
|
// Calculate temperature
|
||||||
|
for (i = 0; i < nall; i++) {
|
||||||
|
itype = type[i];
|
||||||
|
cvi = calc_cv(i, itype);
|
||||||
|
temperature[i] = energy[i] / cvi;
|
||||||
|
|
||||||
|
if (Tc_style[itype] != NONE) {
|
||||||
|
Ti = temperature[i];
|
||||||
|
Tci = calc_Tc(i, itype);
|
||||||
|
|
||||||
|
if (L_style[itype] != NONE) {
|
||||||
|
Li = calc_L(i, itype);
|
||||||
|
if (Ti > Tci) Ti = MAX(Tci, (energy[i] - Li) / cvi);
|
||||||
|
temperature[i] = Ti;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::final_integrate()
|
||||||
|
{
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
double *energy = atom->esph;
|
||||||
|
double *heatflow = atom->heatflow;
|
||||||
|
|
||||||
|
//Integrate energy
|
||||||
|
for (int i = 0; i < atom->nlocal; i++) {
|
||||||
|
if (status[i] & STATUS_NO_INTEGRATION) continue;
|
||||||
|
energy[i] += dth * heatflow[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::reset_dt()
|
||||||
|
{
|
||||||
|
dt = update->dt;
|
||||||
|
dth = 0.5 * update->dt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::break_bonds()
|
||||||
|
{
|
||||||
|
int m, n, nmax, i, j, melti, meltj;
|
||||||
|
|
||||||
|
tagint *tag = atom->tag;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int **bond_type = atom->bond_type;
|
||||||
|
tagint **bond_atom = atom->bond_atom;
|
||||||
|
int *num_bond = atom->num_bond;
|
||||||
|
|
||||||
|
int **bondlist = neighbor->bondlist;
|
||||||
|
int nbondlist = neighbor->nbondlist;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int nall = nlocal + atom->nghost;
|
||||||
|
|
||||||
|
// Delete all bonds for local atoms that melt of a given type
|
||||||
|
for (int i = 0; i < nlocal; i++) {
|
||||||
|
melti = status[i] & STATUS_MELTING;
|
||||||
|
if (!melti) continue;
|
||||||
|
for (m = (num_bond[i] - 1); m >= 0; m--) {
|
||||||
|
if (bond_type[i][m] != btype) continue;
|
||||||
|
|
||||||
|
j = atom->map(bond_atom[i][m]);
|
||||||
|
meltj = status[j] & STATUS_MELTING;
|
||||||
|
|
||||||
|
nmax = num_bond[i] - 1;
|
||||||
|
if (m == nmax) {
|
||||||
|
if (n_histories > 0)
|
||||||
|
for (auto &ihistory: histories)
|
||||||
|
dynamic_cast<FixBondHistory *>(ihistory)->delete_history(i, m);
|
||||||
|
} else {
|
||||||
|
bond_type[i][m] = bond_type[i][nmax];
|
||||||
|
bond_atom[i][m] = bond_atom[i][nmax];
|
||||||
|
if (n_histories > 0) {
|
||||||
|
for (auto &ihistory: histories) {
|
||||||
|
auto fix_bond_history = dynamic_cast<FixBondHistory *> (ihistory);
|
||||||
|
fix_bond_history->shift_history(i, m, nmax);
|
||||||
|
fix_bond_history->delete_history(i, nmax);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bond_type[i][nmax] = 0;
|
||||||
|
num_bond[i]--;
|
||||||
|
|
||||||
|
// Update special unless two owned atoms melt simultaneously then
|
||||||
|
// only update for atom with lower tag
|
||||||
|
if (fix_update_special_bonds) {
|
||||||
|
if ((i < nlocal) && (j < nlocal) && melti && meltj) {
|
||||||
|
if (tag[i] < tag[j]) {
|
||||||
|
fix_update_special_bonds->add_broken_bond(i, j);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fix_update_special_bonds->add_broken_bond(i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update bond list and break solid-melted bonds
|
||||||
|
for (n = 0; n < nbondlist; n++) {
|
||||||
|
|
||||||
|
// skip bond if not correct type
|
||||||
|
if (bondlist[n][2] != btype) continue;
|
||||||
|
i = bondlist[n][0];
|
||||||
|
j = bondlist[n][1];
|
||||||
|
|
||||||
|
melti = status[i] & STATUS_MELTING;
|
||||||
|
meltj = status[j] & STATUS_MELTING;
|
||||||
|
|
||||||
|
if (!melti && !meltj) continue;
|
||||||
|
|
||||||
|
bondlist[n][2] = 0;
|
||||||
|
|
||||||
|
// Delete bonds for non-melted local atoms (shifting)
|
||||||
|
if (i < nlocal && !melti) {
|
||||||
|
for (m = 0; m < num_bond[i]; m++) {
|
||||||
|
if ((bond_atom[i][m] == tag[j]) && (bond_type[i][m] == btype)) {
|
||||||
|
nmax = num_bond[i] - 1;
|
||||||
|
bond_type[i][m] = bond_type[i][nmax];
|
||||||
|
bond_atom[i][m] = bond_atom[i][nmax];
|
||||||
|
if (n_histories > 0)
|
||||||
|
for (auto &ihistory: histories) {
|
||||||
|
auto fix_bond_history = dynamic_cast<FixBondHistory *> (ihistory);
|
||||||
|
fix_bond_history->shift_history(i, m, nmax);
|
||||||
|
fix_bond_history->delete_history(i, nmax);
|
||||||
|
}
|
||||||
|
bond_type[i][nmax] = 0;
|
||||||
|
num_bond[i]--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j < nlocal && !meltj) {
|
||||||
|
for (m = 0; m < num_bond[j]; m++) {
|
||||||
|
if ((bond_atom[j][m] == tag[i]) && (bond_type[j][m] == btype)) {
|
||||||
|
nmax = num_bond[j] - 1;
|
||||||
|
bond_type[j][m] = bond_type[j][nmax];
|
||||||
|
bond_atom[j][m] = bond_atom[j][nmax];
|
||||||
|
if (n_histories > 0)
|
||||||
|
for (auto &ihistory: histories) {
|
||||||
|
auto fix_bond_history = dynamic_cast<FixBondHistory *> (ihistory);
|
||||||
|
fix_bond_history->shift_history(j, m, nmax);
|
||||||
|
fix_bond_history->delete_history(j, nmax);
|
||||||
|
}
|
||||||
|
bond_type[j][nmax] = 0;
|
||||||
|
num_bond[j]--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unless both atoms melt simultaneously, need to remove special bond if the melted atom is a ghost
|
||||||
|
if (melti && meltj) continue;
|
||||||
|
if (fix_update_special_bonds)
|
||||||
|
if (((i >= nlocal) && melti) || ((j >= nlocal) && meltj))
|
||||||
|
fix_update_special_bonds->add_broken_bond(i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::create_bonds()
|
||||||
|
{
|
||||||
|
int i, j, ii, jj, inum, jnum;
|
||||||
|
int *ilist, *jlist, *numneigh, **firstneigh;
|
||||||
|
double delx, dely, delz, rsq;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int newton_bond = force->newton_bond;
|
||||||
|
|
||||||
|
tagint *tag = atom->tag;
|
||||||
|
tagint **bond_atom = atom->bond_atom;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int **bond_type = atom->bond_type;
|
||||||
|
int *num_bond = atom->num_bond;
|
||||||
|
double **x = atom->x;
|
||||||
|
|
||||||
|
neighbor->build_one(list, 1);
|
||||||
|
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
|
||||||
|
// loop over neighbors of my atoms
|
||||||
|
// might be faster to do a full list and just act on the atom that freezes
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
if (!(status[i] & STATUS_SOLID)) continue;
|
||||||
|
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
if (!(status[j] & STATUS_SOLID)) continue;
|
||||||
|
if (!(status[i] & STATUS_FREEZING) && !(status[j] & STATUS_FREEZING)) continue;
|
||||||
|
|
||||||
|
// Ensure pair is always ordered to ensure numerical operations
|
||||||
|
// are identical to minimize the possibility that a bond straddling
|
||||||
|
// an mpi grid (newton off) isn't created on one proc but not the other
|
||||||
|
if (tag[i] < tag[j]) {
|
||||||
|
delx = x[i][0] - x[j][0];
|
||||||
|
dely = x[i][1] - x[j][1];
|
||||||
|
delz = x[i][2] - x[j][2];
|
||||||
|
} else {
|
||||||
|
delx = x[j][0] - x[i][0];
|
||||||
|
dely = x[j][1] - x[i][1];
|
||||||
|
delz = x[j][2] - x[i][2];
|
||||||
|
}
|
||||||
|
rsq = delx * delx + dely * dely + delz * delz;
|
||||||
|
if (rsq > cutsq_bond) continue;
|
||||||
|
|
||||||
|
// Add bonds to owned atoms
|
||||||
|
// If newton bond off, add to both, otherwise add to whichever has a smaller tag
|
||||||
|
if ((i < nlocal) && (!newton_bond || (tag[i] < tag[j]))) {
|
||||||
|
if (num_bond[i] == atom->bond_per_atom)
|
||||||
|
error->one(FLERR,"New bond exceeded bonds per atom in fix rheo/thermal");
|
||||||
|
bond_type[i][num_bond[i]] = btype;
|
||||||
|
bond_atom[i][num_bond[i]] = tag[j];
|
||||||
|
num_bond[i]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((j < nlocal) && (!newton_bond || (tag[j] < tag[i]))) {
|
||||||
|
if (num_bond[j] == atom->bond_per_atom)
|
||||||
|
error->one(FLERR,"New bond exceeded bonds per atom in fix rheo/thermal");
|
||||||
|
bond_type[j][num_bond[j]] = btype;
|
||||||
|
bond_atom[j][num_bond[j]] = tag[i];
|
||||||
|
num_bond[j]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fix_update_special_bonds) fix_update_special_bonds->add_created_bond(i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double FixRHEOThermal::calc_cv(int i, int itype)
|
||||||
|
{
|
||||||
|
if (cv_style[itype] == CONSTANT) {
|
||||||
|
return cv[itype];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double FixRHEOThermal::calc_Tc(int i, int itype)
|
||||||
|
{
|
||||||
|
if (Tc_style[itype] == CONSTANT) {
|
||||||
|
return Tc[itype];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double FixRHEOThermal::calc_L(int i, int itype)
|
||||||
|
{
|
||||||
|
if (L_style[itype] == CONSTANT) {
|
||||||
|
return L[itype];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int FixRHEOThermal::pack_forward_comm(int n, int *list, double *buf,
|
||||||
|
int /*pbc_flag*/, int * /*pbc*/)
|
||||||
|
{
|
||||||
|
int i, j, k, m;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
double **x = atom->x;
|
||||||
|
m = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
buf[m++] = ubuf(status[j]).d;
|
||||||
|
buf[m++] = x[j][0];
|
||||||
|
buf[m++] = x[j][1];
|
||||||
|
buf[m++] = x[j][2];
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOThermal::unpack_forward_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
double **x = atom->x;
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
status[i] = (int) ubuf(buf[m++]).i;
|
||||||
|
x[i][0] = buf[m++];
|
||||||
|
x[i][1] = buf[m++];
|
||||||
|
x[i][2] = buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
73
src/RHEO/fix_rheo_thermal.h
Normal file
73
src/RHEO/fix_rheo_thermal.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef FIX_CLASS
|
||||||
|
// clang-format off
|
||||||
|
FixStyle(rheo/thermal,FixRHEOThermal)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_FIX_RHEO_THERMAL_H
|
||||||
|
#define LMP_FIX_RHEO_THERMAL_H
|
||||||
|
|
||||||
|
#include "fix.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class FixRHEOThermal : public Fix {
|
||||||
|
public:
|
||||||
|
FixRHEOThermal(class LAMMPS *, int, char **);
|
||||||
|
~FixRHEOThermal() override;
|
||||||
|
int setmask() override;
|
||||||
|
void init() override;
|
||||||
|
void init_list(int, class NeighList *) override;
|
||||||
|
void setup_pre_force(int) override;
|
||||||
|
void initial_integrate(int) override;
|
||||||
|
void post_integrate() override;
|
||||||
|
void post_neighbor() override;
|
||||||
|
void pre_force(int) override;
|
||||||
|
void final_integrate() override;
|
||||||
|
int pack_forward_comm(int, int *, double *, int, int *) override;
|
||||||
|
void unpack_forward_comm(int, int, double *) override;
|
||||||
|
void reset_dt() override;
|
||||||
|
double calc_cv(int, int);
|
||||||
|
double calc_Tc(int, int);
|
||||||
|
double calc_L(int, int);
|
||||||
|
|
||||||
|
private:
|
||||||
|
double *cv, *Tc, *kappa, *L;
|
||||||
|
double dt, dth;
|
||||||
|
double cut_kernel, cut_bond, cutsq_bond;
|
||||||
|
int *cv_style, *Tc_style, *kappa_style, *L_style;
|
||||||
|
int btype;
|
||||||
|
class NeighList *list;
|
||||||
|
|
||||||
|
int n_histories;
|
||||||
|
std::vector<Fix *> histories;
|
||||||
|
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
class ComputeRHEOGrad *compute_grad;
|
||||||
|
class ComputeRHEOVShift *compute_vshift;
|
||||||
|
class FixUpdateSpecialBonds *fix_update_special_bonds;
|
||||||
|
|
||||||
|
void grow_array(int);
|
||||||
|
void break_bonds();
|
||||||
|
void create_bonds();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
251
src/RHEO/fix_rheo_viscosity.cpp
Normal file
251
src/RHEO/fix_rheo_viscosity.cpp
Normal file
@ -0,0 +1,251 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL), Thomas O'Connor (CMU)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "fix_rheo_viscosity.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "compute_rheo_grad.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "update.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace FixConst;
|
||||||
|
enum {NONE, CONSTANT, POWER};
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixRHEOViscosity::FixRHEOViscosity(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Fix(lmp, narg, arg), fix_rheo(nullptr), compute_grad(nullptr), eta(nullptr),
|
||||||
|
npow(nullptr), K(nullptr), gd0(nullptr), tau0(nullptr), viscosity_style(nullptr)
|
||||||
|
{
|
||||||
|
if (narg < 4) error->all(FLERR, "Illegal fix command");
|
||||||
|
|
||||||
|
comm_forward = 0;
|
||||||
|
constant_flag = 0;
|
||||||
|
evolve_flag = 0;
|
||||||
|
|
||||||
|
// Currently can only have one instance of fix rheo/viscosity
|
||||||
|
if (igroup != 0)
|
||||||
|
error->all(FLERR,"fix rheo/viscosity command requires group all");
|
||||||
|
|
||||||
|
int i, nlo, nhi;
|
||||||
|
int n = atom->ntypes;
|
||||||
|
memory->create(viscosity_style, n + 1, "rheo:viscosity_style");
|
||||||
|
memory->create(eta, n + 1, "rheo:eta");
|
||||||
|
memory->create(gd0, n + 1, "rheo:gd0");
|
||||||
|
memory->create(K, n + 1, "rheo:K");
|
||||||
|
memory->create(npow, n + 1, "rheo:npow");
|
||||||
|
memory->create(tau0, n + 1, "rheo:tau0");
|
||||||
|
for (i = 1; i <= n; i++) viscosity_style[i] = NONE;
|
||||||
|
|
||||||
|
int iarg = 3;
|
||||||
|
while (iarg < narg) {
|
||||||
|
utils::bounds(FLERR, arg[iarg], 1, n, nlo, nhi, error);
|
||||||
|
|
||||||
|
if (iarg + 1 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/viscosity", error);
|
||||||
|
|
||||||
|
if (strcmp(arg[iarg + 1], "constant") == 0) {
|
||||||
|
if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/viscosity constant", error);
|
||||||
|
|
||||||
|
constant_flag = 1;
|
||||||
|
double eta_one = utils::numeric(FLERR, arg[iarg + 2], false, lmp);
|
||||||
|
if (eta_one < 0.0) error->all(FLERR, "The viscosity must be positive");
|
||||||
|
iarg += 1;
|
||||||
|
|
||||||
|
for (i = nlo; i <= nhi; i++) {
|
||||||
|
viscosity_style[i] = CONSTANT;
|
||||||
|
eta[i] = eta_one;
|
||||||
|
}
|
||||||
|
} else if (strcmp(arg[iarg + 1], "power") == 0) {
|
||||||
|
if (iarg + 5 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/viscosity power", error);
|
||||||
|
|
||||||
|
comm_forward = 1;
|
||||||
|
evolve_flag = 1;
|
||||||
|
double eta_one = utils::numeric(FLERR, arg[iarg + 2], false, lmp);
|
||||||
|
double gd0_one = utils::numeric(FLERR, arg[iarg + 3], false, lmp);
|
||||||
|
double K_one = utils::numeric(FLERR, arg[iarg + 4], false, lmp);
|
||||||
|
double npow_one = utils::numeric(FLERR, arg[iarg + 5], false, lmp);
|
||||||
|
if (eta_one < 0.0) error->all(FLERR, "The viscosity must be positive");
|
||||||
|
iarg += 4;
|
||||||
|
|
||||||
|
for (i = nlo; i <= nhi; i++) {
|
||||||
|
viscosity_style[i] = POWER;
|
||||||
|
eta[i] = eta_one;
|
||||||
|
gd0[i] = gd0_one;
|
||||||
|
K[i] = K_one;
|
||||||
|
npow[i] = npow_one;
|
||||||
|
tau0[i] = eta[i] * gd0[i] - K[i] * pow(gd0[i], npow[i]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, "Illegal fix command, {}", arg[iarg]);
|
||||||
|
}
|
||||||
|
iarg += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i <= n; i++)
|
||||||
|
if (viscosity_style[i] == NONE)
|
||||||
|
error->all(FLERR,"Must specify viscosity for atom type {} in fix/rheo/viscosity", i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
FixRHEOViscosity::~FixRHEOViscosity()
|
||||||
|
{
|
||||||
|
memory->destroy(viscosity_style);
|
||||||
|
memory->destroy(eta);
|
||||||
|
memory->destroy(gd0);
|
||||||
|
memory->destroy(K);
|
||||||
|
memory->destroy(npow);
|
||||||
|
memory->destroy(tau0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int FixRHEOViscosity::setmask()
|
||||||
|
{
|
||||||
|
int mask = 0;
|
||||||
|
mask |= POST_NEIGHBOR;
|
||||||
|
mask |= PRE_FORCE;
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOViscosity::init()
|
||||||
|
{
|
||||||
|
auto fixes = modify->get_fix_by_style("^rheo$");
|
||||||
|
if (fixes.size() == 0) error->all(FLERR, "Need to define fix rheo to use fix rheo/viscosity");
|
||||||
|
fix_rheo = dynamic_cast<FixRHEO *>(fixes[0]);
|
||||||
|
|
||||||
|
compute_grad = fix_rheo->compute_grad;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOViscosity::setup_pre_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
fix_rheo->viscosity_fix_defined = 1;
|
||||||
|
|
||||||
|
if (modify->get_fix_by_style("rheo/viscosity").size() > 1)
|
||||||
|
error->all(FLERR, "More than one fix rheo/viscosity defined");
|
||||||
|
|
||||||
|
post_neighbor();
|
||||||
|
pre_force(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Only need to update non-evolving viscosity styles after atoms exchange
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOViscosity::post_neighbor()
|
||||||
|
{
|
||||||
|
if (!constant_flag) return;
|
||||||
|
|
||||||
|
int i, itype;
|
||||||
|
int *type = atom->type;
|
||||||
|
double *viscosity = atom->viscosity;
|
||||||
|
|
||||||
|
int nall = atom->nlocal + atom->nghost;
|
||||||
|
|
||||||
|
for (i = 0; i < nall; i++) {
|
||||||
|
itype = type[i];
|
||||||
|
if (viscosity_style[itype])
|
||||||
|
viscosity[i] = eta[itype];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Update (and forward) evolving viscosity styles every timestep
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOViscosity::pre_force(int /*vflag*/)
|
||||||
|
{
|
||||||
|
if (!evolve_flag) return;
|
||||||
|
|
||||||
|
int i, itype, a, b;
|
||||||
|
double tmp, gdot;
|
||||||
|
|
||||||
|
int *type = atom->type;
|
||||||
|
double *viscosity = atom->viscosity;
|
||||||
|
double **gradv = compute_grad->gradv;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 0; i < nlocal; i++) {
|
||||||
|
itype = type[i];
|
||||||
|
if (viscosity_style[itype] == POWER) {
|
||||||
|
gdot = 0.0;
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
for (b = a; b < dim; b++) {
|
||||||
|
tmp = gradv[i][a * dim + b] + gradv[i][b * dim + a];
|
||||||
|
tmp = tmp * tmp;
|
||||||
|
if (a == b) tmp *= 0.5;
|
||||||
|
gdot += tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gdot = sqrt(gdot);
|
||||||
|
if (gdot <= gd0[itype]) {
|
||||||
|
viscosity[i] = eta[itype];
|
||||||
|
} else {
|
||||||
|
viscosity[i] = K[itype] * pow(gdot, npow[itype] - 1) + tau0[itype] / gdot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comm_forward) comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int FixRHEOViscosity::pack_forward_comm(int n, int *list, double *buf,
|
||||||
|
int /*pbc_flag*/, int * /*pbc*/)
|
||||||
|
{
|
||||||
|
int i, j, k, m;
|
||||||
|
double *viscosity = atom->viscosity;
|
||||||
|
m = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
buf[m++] = viscosity[j];
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void FixRHEOViscosity::unpack_forward_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last;
|
||||||
|
double *viscosity = atom->viscosity;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
viscosity[i] = buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
50
src/RHEO/fix_rheo_viscosity.h
Normal file
50
src/RHEO/fix_rheo_viscosity.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef FIX_CLASS
|
||||||
|
// clang-format off
|
||||||
|
FixStyle(rheo/viscosity,FixRHEOViscosity)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_FIX_RHEO_VISCOSITY_H
|
||||||
|
#define LMP_FIX_RHEO_VISCOSITY_H
|
||||||
|
|
||||||
|
#include "fix.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class FixRHEOViscosity : public Fix {
|
||||||
|
public:
|
||||||
|
FixRHEOViscosity(class LAMMPS *, int, char **);
|
||||||
|
~FixRHEOViscosity() override;
|
||||||
|
int setmask() override;
|
||||||
|
void init() override;
|
||||||
|
void setup_pre_force(int) override;
|
||||||
|
void post_neighbor() override;
|
||||||
|
void pre_force(int) override;
|
||||||
|
int pack_forward_comm(int, int *, double *, int, int *) override;
|
||||||
|
void unpack_forward_comm(int, int, double *) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
double *eta, *npow, *K, *gd0, *tau0;
|
||||||
|
int *viscosity_style, constant_flag, evolve_flag;
|
||||||
|
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
class ComputeRHEOGrad *compute_grad;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
549
src/RHEO/pair_rheo.cpp
Normal file
549
src/RHEO/pair_rheo.cpp
Normal file
@ -0,0 +1,549 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL), Thomas O'Connor (CMU)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "pair_rheo.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "compute_rheo_kernel.h"
|
||||||
|
#include "compute_rheo_grad.h"
|
||||||
|
#include "compute_rheo_interface.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "fix_rheo_pressure.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "math_extra.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
using namespace MathExtra;
|
||||||
|
|
||||||
|
static constexpr double EPSILON = 1e-2;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
PairRHEO::PairRHEO(LAMMPS *lmp) :
|
||||||
|
Pair(lmp), compute_kernel(nullptr), compute_grad(nullptr), compute_interface(nullptr), fix_rheo(nullptr),
|
||||||
|
fix_pressure(nullptr), rho0(nullptr), csq(nullptr), cs(nullptr)
|
||||||
|
{
|
||||||
|
restartinfo = 0;
|
||||||
|
single_enable = 0;
|
||||||
|
|
||||||
|
artificial_visc_flag = 0;
|
||||||
|
rho_damp_flag = 0;
|
||||||
|
thermal_flag = 0;
|
||||||
|
harmonic_means_flag = 0;
|
||||||
|
|
||||||
|
comm_reverse = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
PairRHEO::~PairRHEO()
|
||||||
|
{
|
||||||
|
if (allocated) {
|
||||||
|
memory->destroy(setflag);
|
||||||
|
memory->destroy(cutsq);
|
||||||
|
}
|
||||||
|
|
||||||
|
memory->destroy(cs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEO::compute(int eflag, int vflag)
|
||||||
|
{
|
||||||
|
int i, j, a, b, ii, jj, inum, jnum, itype, jtype;
|
||||||
|
int pair_force_flag, pair_rho_flag, pair_avisc_flag;
|
||||||
|
int fluidi, fluidj;
|
||||||
|
double xtmp, ytmp, ztmp, w, wp, Ti, Tj, dT, csq_ave, cs_ave;
|
||||||
|
double rhoi, rhoj, rho0i, rho0j, voli, volj, Pi, Pj, etai, etaj, kappai, kappaj, eta_ave, kappa_ave, dT_prefactor;
|
||||||
|
double mu, q, fp_prefactor, drho_damp, fmag, psi_ij, Fij;
|
||||||
|
double *dWij, *dWji, *dW1ij, *dW1ji;
|
||||||
|
double dx[3], du[3], dv[3], fv[3], dfp[3], fsolid[3], ft[3], vi[3], vj[3];
|
||||||
|
|
||||||
|
int *ilist, *jlist, *numneigh, **firstneigh;
|
||||||
|
double imass, jmass, rsq, r, rinv;
|
||||||
|
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int newton_pair = force->newton_pair;
|
||||||
|
int dim = domain->dimension;
|
||||||
|
|
||||||
|
ev_init(eflag, vflag);
|
||||||
|
|
||||||
|
double **gradv = compute_grad->gradv;
|
||||||
|
double **gradr = compute_grad->gradr;
|
||||||
|
double **v = atom->v;
|
||||||
|
double **x = atom->x;
|
||||||
|
double **f = atom->f;
|
||||||
|
double *rho = atom->rho;
|
||||||
|
double *mass = atom->mass;
|
||||||
|
double *drho = atom->drho;
|
||||||
|
double *pressure = atom->pressure;
|
||||||
|
double *viscosity = atom->viscosity;
|
||||||
|
double *conductivity = atom->conductivity;
|
||||||
|
double *temperature = atom->temperature;
|
||||||
|
double *heatflow = atom->heatflow;
|
||||||
|
double *special_lj = force->special_lj;
|
||||||
|
int *type = atom->type;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
tagint *tag = atom->tag;
|
||||||
|
|
||||||
|
double **fp_store, *chi;
|
||||||
|
if (compute_interface) {
|
||||||
|
fp_store = compute_interface->fp_store;
|
||||||
|
chi = compute_interface->chi;
|
||||||
|
|
||||||
|
for (i = 0; i < atom->nmax; i++) {
|
||||||
|
fp_store[i][0] = 0.0;
|
||||||
|
fp_store[i][1] = 0.0;
|
||||||
|
fp_store[i][2] = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
|
||||||
|
for (a = 0; a < 3; a++) {
|
||||||
|
vi[a] = 0.0;
|
||||||
|
vj[a] = 0.0;
|
||||||
|
du[a] = 0.0;
|
||||||
|
fv[a] = 0.0;
|
||||||
|
dfp[a] = 0.0;
|
||||||
|
fsolid[a] = 0.0;
|
||||||
|
ft[0] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// loop over neighbors of my atoms
|
||||||
|
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
itype = type[i];
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
imass = mass[itype];
|
||||||
|
etai = viscosity[i];
|
||||||
|
fluidi = !(status[i] & PHASECHECK);
|
||||||
|
if (thermal_flag) {
|
||||||
|
kappai = conductivity[i];
|
||||||
|
Ti = temperature[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
dx[0] = xtmp - x[j][0];
|
||||||
|
dx[1] = ytmp - x[j][1];
|
||||||
|
dx[2] = ztmp - x[j][2];
|
||||||
|
rsq = lensq3(dx);
|
||||||
|
jtype = type[j];
|
||||||
|
|
||||||
|
if (rsq < cutksq) {
|
||||||
|
r = sqrt(rsq);
|
||||||
|
rinv = 1 / r;
|
||||||
|
|
||||||
|
jmass = mass[jtype];
|
||||||
|
etaj = viscosity[j];
|
||||||
|
fluidj = !(status[j] & PHASECHECK);
|
||||||
|
if (thermal_flag) {
|
||||||
|
Tj = temperature[j];
|
||||||
|
kappaj = conductivity[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
cs_ave = 0.5 * (cs[itype] + cs[jtype]);
|
||||||
|
csq_ave = cs_ave * cs_ave;
|
||||||
|
|
||||||
|
pair_rho_flag = 0;
|
||||||
|
pair_force_flag = 0;
|
||||||
|
pair_avisc_flag = 0;
|
||||||
|
if (fluidi || fluidj) {
|
||||||
|
pair_force_flag = 1;
|
||||||
|
if (!interface_flag) pair_avisc_flag = 1;
|
||||||
|
}
|
||||||
|
if (fluidi && fluidj) {
|
||||||
|
pair_rho_flag = 1;
|
||||||
|
pair_avisc_flag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
wp = compute_kernel->calc_dw(i, j, dx[0], dx[1], dx[2], r);
|
||||||
|
dWij = compute_kernel->dWij;
|
||||||
|
dWji = compute_kernel->dWji;
|
||||||
|
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
vi[a] = v[i][a];
|
||||||
|
vj[a] = v[j][a];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add corrections for walls
|
||||||
|
rhoi = rho[i];
|
||||||
|
rhoj = rho[j];
|
||||||
|
rho0i = rho0[itype];
|
||||||
|
rho0j = rho0[jtype];
|
||||||
|
Pi = pressure[i];
|
||||||
|
Pj = pressure[j];
|
||||||
|
fmag = 0;
|
||||||
|
if (interface_flag) {
|
||||||
|
if (fluidi && (!fluidj)) {
|
||||||
|
compute_interface->correct_v(vj, vi, j, i);
|
||||||
|
rhoj = compute_interface->correct_rho(j, i);
|
||||||
|
Pj = fix_pressure->calc_pressure(rhoj, jtype);
|
||||||
|
|
||||||
|
if ((chi[j] > 0.9) && (r < (cutk * 0.5)))
|
||||||
|
fmag = (chi[j] - 0.9) * (cutk * 0.5 - r) * rho0j * csq_ave * cutk * rinv;
|
||||||
|
|
||||||
|
} else if ((!fluidi) && fluidj) {
|
||||||
|
compute_interface->correct_v(vi, vj, i, j);
|
||||||
|
rhoi = compute_interface->correct_rho(i, j);
|
||||||
|
Pi = fix_pressure->calc_pressure(rhoi, itype);
|
||||||
|
|
||||||
|
if (chi[i] > 0.9 && r < (cutk * 0.5))
|
||||||
|
fmag = (chi[i] - 0.9) * (cutk * 0.5 - r) * rho0i * csq_ave * cutk * rinv;
|
||||||
|
|
||||||
|
} else if ((!fluidi) && (!fluidj)) {
|
||||||
|
rhoi = rho0i;
|
||||||
|
rhoj = rho0j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Repel if close to inner solid particle
|
||||||
|
scale3(fmag, dx, fsolid);
|
||||||
|
|
||||||
|
// Compute volume after reconstructing
|
||||||
|
voli = imass / rhoi;
|
||||||
|
volj = jmass / rhoj;
|
||||||
|
|
||||||
|
// Thermal Evolution
|
||||||
|
if (thermal_flag) {
|
||||||
|
if (harmonic_means_flag) {
|
||||||
|
kappa_ave = 2.0 * kappai * kappaj / (kappai + kappaj);
|
||||||
|
} else {
|
||||||
|
kappa_ave = 0.5 * (kappai + kappaj);
|
||||||
|
}
|
||||||
|
dT_prefactor = 2.0 * kappa_ave * (Ti - Tj) * rinv * rinv * voli * volj * 2.0 / (rhoi + rhoj);
|
||||||
|
|
||||||
|
dT = dot3(dx, dWij);
|
||||||
|
heatflow[i] += dT * dT_prefactor;
|
||||||
|
|
||||||
|
if (newton_pair || j < nlocal) {
|
||||||
|
dT = dot3(dx, dWji);
|
||||||
|
heatflow[j] += dT * dT_prefactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pair_force_flag) {
|
||||||
|
|
||||||
|
//Hydrostatic pressure forces
|
||||||
|
fp_prefactor = voli * volj * (Pj + Pi);
|
||||||
|
sub3(vi, vj, dv);
|
||||||
|
|
||||||
|
if (harmonic_means_flag) {
|
||||||
|
eta_ave = 2.0 * etai * etaj / (etai + etaj);
|
||||||
|
} else {
|
||||||
|
eta_ave = 0.5 * (etai + etaj);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Add artificial viscous pressure if required
|
||||||
|
if (artificial_visc_flag && pair_avisc_flag) {
|
||||||
|
//Interpolate velocities to midpoint and use this difference for artificial viscosity
|
||||||
|
copy3(dv, du);
|
||||||
|
for (a = 0; a < dim; a++)
|
||||||
|
for (b = 0; b < dim; b++)
|
||||||
|
du[a] -= 0.5 * (gradv[i][a * dim + b] + gradv[j][a * dim + b]) * dx[b];
|
||||||
|
|
||||||
|
mu = dot3(du, dx) * cutkinv3;
|
||||||
|
mu /= (rsq * cutkinv3 * cutkinv3 + EPSILON);
|
||||||
|
mu = MIN(0.0, mu);
|
||||||
|
q = av * (-2.0 * cs_ave * mu + mu * mu);
|
||||||
|
fp_prefactor += voli * volj * q * (rhoj + rhoi);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -Grad[P + Q]
|
||||||
|
scale3(-fp_prefactor, dWij, dfp);
|
||||||
|
|
||||||
|
// Now compute viscous eta*Lap[v] terms
|
||||||
|
for (a = 0; a < dim; a++) {
|
||||||
|
fv[a] = 0.0;
|
||||||
|
for (b = 0; b < dim; b++)
|
||||||
|
fv[a] += dv[a] * dx[b] * dWij[b];
|
||||||
|
fv[a] *= 2.0 * eta_ave * voli * volj * rinv * rinv;
|
||||||
|
}
|
||||||
|
|
||||||
|
add3(fv, dfp, ft);
|
||||||
|
add3(fsolid, ft, ft);
|
||||||
|
|
||||||
|
f[i][0] += ft[0];
|
||||||
|
f[i][1] += ft[1];
|
||||||
|
f[i][2] += ft[2];
|
||||||
|
|
||||||
|
// Note the virial's definition is hazy, e.g. viscous contributions will depend on rotation
|
||||||
|
if (evflag)
|
||||||
|
ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, ft[0], ft[1], ft[2], dx[0], dx[1], dx[2]);
|
||||||
|
|
||||||
|
if (newton_pair || j < nlocal) {
|
||||||
|
for (a = 0; a < dim; a ++) {
|
||||||
|
fv[a] = 0.0;
|
||||||
|
for (b = 0; b < dim; b++)
|
||||||
|
fv[a] += (vi[a] - vj[a]) * dx[b] * dWji[b];
|
||||||
|
fv[a] *= -2.0 * eta_ave * voli * volj * rinv * rinv;
|
||||||
|
// flip sign here b/c -= at accummulator
|
||||||
|
}
|
||||||
|
|
||||||
|
scale3(fp_prefactor, dWji, dfp);
|
||||||
|
add3(fv, dfp, ft);
|
||||||
|
add3(fsolid, ft, ft);
|
||||||
|
|
||||||
|
f[j][0] -= ft[0];
|
||||||
|
f[j][1] -= ft[1];
|
||||||
|
f[j][2] -= ft[2];
|
||||||
|
|
||||||
|
if (evflag)
|
||||||
|
ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, ft[0], ft[1], ft[2], -dx[0], -dx[1], -dx[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (compute_interface) {
|
||||||
|
fp_store[i][0] += dfp[0];
|
||||||
|
fp_store[i][1] += dfp[1];
|
||||||
|
fp_store[i][2] += dfp[2];
|
||||||
|
|
||||||
|
if (newton_pair || j < nlocal) {
|
||||||
|
fp_store[j][0] -= dfp[0];
|
||||||
|
fp_store[j][1] -= dfp[1];
|
||||||
|
fp_store[j][2] -= dfp[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Density damping
|
||||||
|
// conventional for low-order h
|
||||||
|
// interpolated for RK 1 & 2 (Antuono et al., Computers & Fluids 2021)
|
||||||
|
if (rho_damp_flag && pair_rho_flag) {
|
||||||
|
if (laplacian_order >= 1) {
|
||||||
|
psi_ij = rhoj - rhoi;
|
||||||
|
Fij = -rinv * rinv * dot3(dx, dWij);
|
||||||
|
for (a = 0; a < dim; a++)
|
||||||
|
psi_ij += 0.5 * (gradr[i][a] + gradr[j][a]) * dx[a];
|
||||||
|
drho[i] += 2 * rho_damp * psi_ij * Fij * volj;
|
||||||
|
} else {
|
||||||
|
drho_damp = 2 * rho_damp * ((rhoj - rho0[jtype]) - (rhoi - rho0[itype])) * rinv * wp;
|
||||||
|
drho[i] -= drho_damp * volj;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newton_pair || j < nlocal) {
|
||||||
|
if (laplacian_order >= 1) {
|
||||||
|
Fij = rinv * rinv * dot3(dx, dWji);
|
||||||
|
psi_ij *= -1;
|
||||||
|
drho[j] += 2 * rho_damp * psi_ij * Fij * voli;
|
||||||
|
} else {
|
||||||
|
drho[j] += drho_damp * voli;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vflag_fdotr) virial_fdotr_compute();
|
||||||
|
|
||||||
|
if (compute_interface) {
|
||||||
|
if (newton_pair) comm->reverse_comm(this);
|
||||||
|
comm->forward_comm(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
allocate all arrays
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEO::allocate()
|
||||||
|
{
|
||||||
|
allocated = 1;
|
||||||
|
int n = atom->ntypes;
|
||||||
|
|
||||||
|
memory->create(setflag, n + 1, n + 1, "pair:setflag");
|
||||||
|
for (int i = 1; i <= n; i++)
|
||||||
|
for (int j = i; j <= n; j++)
|
||||||
|
setflag[i][j] = 0;
|
||||||
|
|
||||||
|
memory->create(cutsq, n + 1, n + 1, "pair:cutsq");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
global settings
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEO::settings(int narg, char **arg)
|
||||||
|
{
|
||||||
|
if (narg < 1) error->all(FLERR, "Illegal pair_style command");
|
||||||
|
|
||||||
|
cutk = utils::numeric(FLERR, arg[0], false, lmp);
|
||||||
|
|
||||||
|
int iarg = 1;
|
||||||
|
while (iarg < narg) {
|
||||||
|
if (strcmp(arg[iarg], "rho/damp") == 0) {
|
||||||
|
if (iarg + 1 >= narg) utils::missing_cmd_args(FLERR, "pair rheo rho/damp", error);
|
||||||
|
rho_damp_flag = 1;
|
||||||
|
rho_damp = utils::numeric(FLERR, arg[iarg + 1], false, lmp);
|
||||||
|
iarg++;
|
||||||
|
} else if (strcmp(arg[iarg], "artificial/visc") == 0) {
|
||||||
|
if (iarg + 1 >= narg) utils::missing_cmd_args(FLERR, "pair rheo artificial/visc", error);
|
||||||
|
artificial_visc_flag = 1;
|
||||||
|
av = utils::numeric(FLERR, arg[iarg + 1], false, lmp);
|
||||||
|
iarg++;
|
||||||
|
} else if (strcmp(arg[iarg], "harmonic/means") == 0) {
|
||||||
|
harmonic_means_flag = 1;
|
||||||
|
} else error->all(FLERR, "Illegal pair_style command, {}", arg[iarg]);
|
||||||
|
iarg++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
set coeffs for one or more type pairs
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEO::coeff(int narg, char **arg)
|
||||||
|
{
|
||||||
|
if (narg != 2)
|
||||||
|
error->all(FLERR, "Incorrect number of args for pair_style rheo coefficients");
|
||||||
|
if (!allocated)
|
||||||
|
allocate();
|
||||||
|
|
||||||
|
int ilo, ihi, jlo, jhi;
|
||||||
|
utils::bounds(FLERR, arg[0], 1, atom->ntypes, ilo, ihi, error);
|
||||||
|
utils::bounds(FLERR, arg[1], 1, atom->ntypes, jlo, jhi, error);
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (int i = ilo; i <= ihi; i++) {
|
||||||
|
for (int j = 0; j <= atom->ntypes; j++) {
|
||||||
|
setflag[i][j] = 1;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count == 0)
|
||||||
|
error->all(FLERR, "Incorrect args for pair rheo coefficients");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
setup specific to this pair style
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEO::setup()
|
||||||
|
{
|
||||||
|
auto fixes = modify->get_fix_by_style("rheo");
|
||||||
|
if (fixes.size() == 0) error->all(FLERR, "Need to define fix rheo to use pair rheo");
|
||||||
|
fix_rheo = dynamic_cast<FixRHEO *>(fixes[0]);
|
||||||
|
|
||||||
|
// Currently only allow one instance of fix rheo/pressure
|
||||||
|
fixes = modify->get_fix_by_style("rheo/pressure");
|
||||||
|
if (fixes.size() == 0) error->all(FLERR, "Need to define fix rheo/pressure to use pair rheo");
|
||||||
|
fix_pressure = dynamic_cast<FixRHEOPressure *>(fixes[0]);
|
||||||
|
|
||||||
|
compute_kernel = fix_rheo->compute_kernel;
|
||||||
|
compute_grad = fix_rheo->compute_grad;
|
||||||
|
compute_interface = fix_rheo->compute_interface;
|
||||||
|
thermal_flag = fix_rheo->thermal_flag;
|
||||||
|
interface_flag = fix_rheo->interface_flag;
|
||||||
|
csq = fix_rheo->csq;
|
||||||
|
rho0 = fix_rheo->rho0;
|
||||||
|
|
||||||
|
if (cutk != fix_rheo->cut)
|
||||||
|
error->all(FLERR, "Pair rheo cutoff {} does not agree with fix rheo cutoff {}", cutk, fix_rheo->cut);
|
||||||
|
|
||||||
|
cutksq = cutk * cutk;
|
||||||
|
cutkinv = 1.0 / cutk;
|
||||||
|
cutkinv3 = cutkinv * 3.0;
|
||||||
|
laplacian_order = -1;
|
||||||
|
|
||||||
|
int n = atom->ntypes;
|
||||||
|
memory->create(cs, n + 1, "rheo:cs");
|
||||||
|
for (int i = 1; i <= n; i++)
|
||||||
|
cs[i] = sqrt(csq[i]);
|
||||||
|
|
||||||
|
if (comm->ghost_velocity == 0)
|
||||||
|
error->all(FLERR, "Pair RHEO requires ghost atoms store velocity");
|
||||||
|
|
||||||
|
if (laplacian_order == -1) {
|
||||||
|
if (fix_rheo->kernel_style == RK2)
|
||||||
|
laplacian_order = 2;
|
||||||
|
else if (fix_rheo->kernel_style == RK1)
|
||||||
|
laplacian_order = 1;
|
||||||
|
else
|
||||||
|
laplacian_order = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
init for one type pair i,j and corresponding j,i
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double PairRHEO::init_one(int i, int j)
|
||||||
|
{
|
||||||
|
if (setflag[i][j] == 0)
|
||||||
|
error->all(FLERR, "All pair rheo coeffs are not set");
|
||||||
|
|
||||||
|
return cutk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int PairRHEO::pack_reverse_comm(int n, int first, double *buf)
|
||||||
|
{
|
||||||
|
int i, k, m, last;
|
||||||
|
double **fp_store = compute_interface->fp_store;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
last = first + n;
|
||||||
|
for (i = first; i < last; i++) {
|
||||||
|
buf[m++] = fp_store[i][0];
|
||||||
|
buf[m++] = fp_store[i][1];
|
||||||
|
buf[m++] = fp_store[i][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEO::unpack_reverse_comm(int n, int *list, double *buf)
|
||||||
|
{
|
||||||
|
int i, j, k, m;
|
||||||
|
double **fp_store = compute_interface->fp_store;
|
||||||
|
|
||||||
|
m = 0;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
j = list[i];
|
||||||
|
fp_store[j][0] += buf[m++];
|
||||||
|
fp_store[j][1] += buf[m++];
|
||||||
|
fp_store[j][2] += buf[m++];
|
||||||
|
}
|
||||||
|
}
|
||||||
63
src/RHEO/pair_rheo.h
Normal file
63
src/RHEO/pair_rheo.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef PAIR_CLASS
|
||||||
|
// clang-format off
|
||||||
|
PairStyle(rheo,PairRHEO)
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_PAIR_RHEO_H
|
||||||
|
#define LMP_PAIR_RHEO_H
|
||||||
|
|
||||||
|
#include "pair.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class PairRHEO : public Pair {
|
||||||
|
public:
|
||||||
|
PairRHEO(class LAMMPS *);
|
||||||
|
~PairRHEO() override;
|
||||||
|
void compute(int, int) override;
|
||||||
|
void settings(int, char **) override;
|
||||||
|
void coeff(int, char **) override;
|
||||||
|
void setup() override;
|
||||||
|
double init_one(int, int) override;
|
||||||
|
int pack_reverse_comm(int, int, double *) override;
|
||||||
|
void unpack_reverse_comm(int, int *, double *) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double cutk, *csq, *rho0; // From fix RHEO
|
||||||
|
double *cs, cutksq, cutkinv, cutkinv3, av, rho_damp;
|
||||||
|
|
||||||
|
int laplacian_order;
|
||||||
|
int artificial_visc_flag;
|
||||||
|
int rho_damp_flag;
|
||||||
|
int thermal_flag;
|
||||||
|
int interface_flag;
|
||||||
|
|
||||||
|
int harmonic_means_flag;
|
||||||
|
|
||||||
|
void allocate();
|
||||||
|
|
||||||
|
class ComputeRHEOKernel *compute_kernel;
|
||||||
|
class ComputeRHEOGrad *compute_grad;
|
||||||
|
class ComputeRHEOInterface *compute_interface;
|
||||||
|
class FixRHEO *fix_rheo;
|
||||||
|
class FixRHEOPressure *fix_pressure;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
359
src/RHEO/pair_rheo_solid.cpp
Normal file
359
src/RHEO/pair_rheo_solid.cpp
Normal file
@ -0,0 +1,359 @@
|
|||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing authors:
|
||||||
|
Joel Clemmer (SNL)
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "pair_rheo_solid.h"
|
||||||
|
|
||||||
|
#include "atom.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "fix_rheo.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace RHEO_NS;
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
PairRHEOSolid::PairRHEOSolid(LAMMPS *_lmp) : Pair(_lmp)
|
||||||
|
{
|
||||||
|
writedata = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
PairRHEOSolid::~PairRHEOSolid()
|
||||||
|
{
|
||||||
|
if (allocated) {
|
||||||
|
memory->destroy(setflag);
|
||||||
|
memory->destroy(cutsq);
|
||||||
|
|
||||||
|
memory->destroy(k);
|
||||||
|
memory->destroy(cut);
|
||||||
|
memory->destroy(gamma);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEOSolid::compute(int eflag, int vflag)
|
||||||
|
{
|
||||||
|
int i, j, ii, jj, inum, jnum, itype, jtype;
|
||||||
|
double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair;
|
||||||
|
double r, rsq, rinv, factor_lj;
|
||||||
|
int *ilist, *jlist, *numneigh, **firstneigh;
|
||||||
|
double vxtmp, vytmp, vztmp, delvx, delvy, delvz, dot, smooth;
|
||||||
|
|
||||||
|
evdwl = 0.0;
|
||||||
|
if (eflag || vflag)
|
||||||
|
ev_setup(eflag, vflag);
|
||||||
|
else
|
||||||
|
evflag = vflag_fdotr = 0;
|
||||||
|
|
||||||
|
double **x = atom->x;
|
||||||
|
double **v = atom->v;
|
||||||
|
double **f = atom->f;
|
||||||
|
int *type = atom->type;
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
int nlocal = atom->nlocal;
|
||||||
|
int newton_pair = force->newton_pair;
|
||||||
|
double *special_lj = force->special_lj;
|
||||||
|
|
||||||
|
inum = list->inum;
|
||||||
|
ilist = list->ilist;
|
||||||
|
numneigh = list->numneigh;
|
||||||
|
firstneigh = list->firstneigh;
|
||||||
|
|
||||||
|
// loop over neighbors of my atoms
|
||||||
|
|
||||||
|
for (ii = 0; ii < inum; ii++) {
|
||||||
|
i = ilist[ii];
|
||||||
|
if (!(status[i] & STATUS_SOLID)) continue;
|
||||||
|
|
||||||
|
xtmp = x[i][0];
|
||||||
|
ytmp = x[i][1];
|
||||||
|
ztmp = x[i][2];
|
||||||
|
vxtmp = v[i][0];
|
||||||
|
vytmp = v[i][1];
|
||||||
|
vztmp = v[i][2];
|
||||||
|
itype = type[i];
|
||||||
|
jlist = firstneigh[i];
|
||||||
|
jnum = numneigh[i];
|
||||||
|
|
||||||
|
for (jj = 0; jj < jnum; jj++) {
|
||||||
|
j = jlist[jj];
|
||||||
|
factor_lj = special_lj[sbmask(j)];
|
||||||
|
if (factor_lj == 0) continue;
|
||||||
|
j &= NEIGHMASK;
|
||||||
|
|
||||||
|
if (!(status[j] & STATUS_SOLID)) continue;
|
||||||
|
|
||||||
|
delx = xtmp - x[j][0];
|
||||||
|
dely = ytmp - x[j][1];
|
||||||
|
delz = ztmp - x[j][2];
|
||||||
|
rsq = delx * delx + dely * dely + delz * delz;
|
||||||
|
jtype = type[j];
|
||||||
|
|
||||||
|
if (rsq < cutsq[itype][jtype]) {
|
||||||
|
r = sqrt(rsq);
|
||||||
|
|
||||||
|
rinv = 1.0 / r;
|
||||||
|
fpair = k[itype][jtype] * (cut[itype][jtype] - r);
|
||||||
|
|
||||||
|
smooth = rsq / cutsq[itype][jtype];
|
||||||
|
smooth *= smooth;
|
||||||
|
smooth *= smooth;
|
||||||
|
smooth = 1.0 - smooth;
|
||||||
|
delvx = vxtmp - v[j][0];
|
||||||
|
delvy = vytmp - v[j][1];
|
||||||
|
delvz = vztmp - v[j][2];
|
||||||
|
dot = delx * delvx + dely * delvy + delz * delvz;
|
||||||
|
fpair -= gamma[itype][jtype] * dot * smooth * rinv;
|
||||||
|
|
||||||
|
fpair *= factor_lj * rinv;
|
||||||
|
if (eflag) evdwl = 0.0;
|
||||||
|
|
||||||
|
f[i][0] += delx * fpair;
|
||||||
|
f[i][1] += dely * fpair;
|
||||||
|
f[i][2] += delz * fpair;
|
||||||
|
|
||||||
|
if (newton_pair || j < nlocal) {
|
||||||
|
f[j][0] -= delx * fpair;
|
||||||
|
f[j][1] -= dely * fpair;
|
||||||
|
f[j][2] -= delz * fpair;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (evflag) ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, fpair, delx, dely, delz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vflag_fdotr) virial_fdotr_compute();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
allocate all arrays
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEOSolid::allocate()
|
||||||
|
{
|
||||||
|
allocated = 1;
|
||||||
|
const int np1 = atom->ntypes + 1;
|
||||||
|
|
||||||
|
memory->create(setflag, np1, np1, "pair:setflag");
|
||||||
|
for (int i = 1; i < np1; i++)
|
||||||
|
for (int j = i; j < np1; j++) setflag[i][j] = 0;
|
||||||
|
|
||||||
|
memory->create(cutsq, np1, np1, "pair:cutsq");
|
||||||
|
|
||||||
|
memory->create(k, np1, np1, "pair:k");
|
||||||
|
memory->create(cut, np1, np1, "pair:cut");
|
||||||
|
memory->create(gamma, np1, np1, "pair:gamma");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
global settings
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEOSolid::settings(int narg, char ** /*arg*/)
|
||||||
|
{
|
||||||
|
if (narg != 0) error->all(FLERR, "Illegal pair_style command");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
set coeffs for one or more type pairs
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEOSolid::coeff(int narg, char **arg)
|
||||||
|
{
|
||||||
|
if (narg != 5) error->all(FLERR, "Incorrect args for pair coefficients");
|
||||||
|
if (!allocated) allocate();
|
||||||
|
|
||||||
|
int ilo, ihi, jlo, jhi;
|
||||||
|
utils::bounds(FLERR, arg[0], 1, atom->ntypes, ilo, ihi, error);
|
||||||
|
utils::bounds(FLERR, arg[1], 1, atom->ntypes, jlo, jhi, error);
|
||||||
|
|
||||||
|
double k_one = utils::numeric(FLERR, arg[2], false, lmp);
|
||||||
|
double cut_one = utils::numeric(FLERR, arg[3], false, lmp);
|
||||||
|
double gamma_one = utils::numeric(FLERR, arg[4], false, lmp);
|
||||||
|
|
||||||
|
if (cut_one <= 0.0) error->all(FLERR, "Incorrect args for pair coefficients");
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (int i = ilo; i <= ihi; i++) {
|
||||||
|
for (int j = MAX(jlo, i); j <= jhi; j++) {
|
||||||
|
k[i][j] = k_one;
|
||||||
|
cut[i][j] = cut_one;
|
||||||
|
gamma[i][j] = gamma_one;
|
||||||
|
|
||||||
|
setflag[i][j] = 1;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
init specific to this pair style
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEOSolid::init_style()
|
||||||
|
{
|
||||||
|
if (comm->ghost_velocity == 0)
|
||||||
|
error->all(FLERR,"Pair rheo/solid requires ghost atoms store velocity");
|
||||||
|
|
||||||
|
if (!atom->rheo_status_flag)
|
||||||
|
error->all(FLERR,"Pair rheo/solid requires atom_style rheo");
|
||||||
|
|
||||||
|
neighbor->add_request(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
init for one type pair i,j and corresponding j,i
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double PairRHEOSolid::init_one(int i, int j)
|
||||||
|
{
|
||||||
|
if (setflag[i][j] == 0) {
|
||||||
|
cut[i][j] = mix_distance(cut[i][i], cut[j][j]);
|
||||||
|
k[i][j] = mix_energy(k[i][i], k[j][j], cut[i][i], cut[j][j]);
|
||||||
|
gamma[i][j] = mix_energy(gamma[i][i], gamma[j][j], cut[i][i], cut[j][j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
cut[j][i] = cut[i][j];
|
||||||
|
k[j][i] = k[i][j];
|
||||||
|
gamma[j][i] = gamma[i][j];
|
||||||
|
|
||||||
|
return cut[i][j];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
proc 0 writes to restart file
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEOSolid::write_restart(FILE *fp)
|
||||||
|
{
|
||||||
|
write_restart_settings(fp);
|
||||||
|
|
||||||
|
int i, j;
|
||||||
|
for (i = 1; i <= atom->ntypes; i++)
|
||||||
|
for (j = i; j <= atom->ntypes; j++) {
|
||||||
|
fwrite(&setflag[i][j], sizeof(int), 1, fp);
|
||||||
|
if (setflag[i][j]) {
|
||||||
|
fwrite(&k[i][j], sizeof(double), 1, fp);
|
||||||
|
fwrite(&cut[i][j], sizeof(double), 1, fp);
|
||||||
|
fwrite(&gamma[i][j], sizeof(double), 1, fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
proc 0 reads from restart file, bcasts
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEOSolid::read_restart(FILE *fp)
|
||||||
|
{
|
||||||
|
read_restart_settings(fp);
|
||||||
|
allocate();
|
||||||
|
|
||||||
|
int i, j;
|
||||||
|
int me = comm->me;
|
||||||
|
for (i = 1; i <= atom->ntypes; i++)
|
||||||
|
for (j = i; j <= atom->ntypes; j++) {
|
||||||
|
if (me == 0) utils::sfread(FLERR, &setflag[i][j], sizeof(int), 1, fp, nullptr, error);
|
||||||
|
MPI_Bcast(&setflag[i][j], 1, MPI_INT, 0, world);
|
||||||
|
if (setflag[i][j]) {
|
||||||
|
if (me == 0) {
|
||||||
|
utils::sfread(FLERR, &k[i][j], sizeof(double), 1, fp, nullptr, error);
|
||||||
|
utils::sfread(FLERR, &cut[i][j], sizeof(double), 1, fp, nullptr, error);
|
||||||
|
utils::sfread(FLERR, &gamma[i][j], sizeof(double), 1, fp, nullptr, error);
|
||||||
|
}
|
||||||
|
MPI_Bcast(&k[i][j], 1, MPI_DOUBLE, 0, world);
|
||||||
|
MPI_Bcast(&cut[i][j], 1, MPI_DOUBLE, 0, world);
|
||||||
|
MPI_Bcast(&gamma[i][j], 1, MPI_DOUBLE, 0, world);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
proc 0 writes to data file
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEOSolid::write_data(FILE *fp)
|
||||||
|
{
|
||||||
|
for (int i = 1; i <= atom->ntypes; i++)
|
||||||
|
fprintf(fp, "%d %g %g %g\n", i, k[i][i], cut[i][i], gamma[i][i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
proc 0 writes all pairs to data file
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairRHEOSolid::write_data_all(FILE *fp)
|
||||||
|
{
|
||||||
|
for (int i = 1; i <= atom->ntypes; i++)
|
||||||
|
for (int j = i; j <= atom->ntypes; j++)
|
||||||
|
fprintf(fp, "%d %d %g %g %g\n", i, j, k[i][j], cut[i][j], gamma[i][j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double PairRHEOSolid::single(int i, int j, int itype, int jtype, double rsq, double /*factor_coul*/,
|
||||||
|
double factor_lj, double &fforce)
|
||||||
|
{
|
||||||
|
double fpair, r, rinv;
|
||||||
|
double delx, dely, delz, delvx, delvy, delvz, dot, smooth;
|
||||||
|
|
||||||
|
if (rsq > cutsq[itype][jtype]) return 0.0;
|
||||||
|
|
||||||
|
int *status = atom->rheo_status;
|
||||||
|
if (!(status[i] & STATUS_SOLID)) return 0.0;
|
||||||
|
if (!(status[j] & STATUS_SOLID)) return 0.0;
|
||||||
|
|
||||||
|
double **x = atom->x;
|
||||||
|
double **v = atom->v;
|
||||||
|
|
||||||
|
r = sqrt(rsq);
|
||||||
|
rinv = 1.0 / r;
|
||||||
|
|
||||||
|
fpair = k[itype][jtype] * (cut[itype][jtype] - r);
|
||||||
|
|
||||||
|
smooth = rsq / cutsq[itype][jtype];
|
||||||
|
smooth *= smooth;
|
||||||
|
smooth = 1.0 - smooth;
|
||||||
|
delx = x[i][0] - x[j][0];
|
||||||
|
dely = x[i][1] - x[j][1];
|
||||||
|
delz = x[i][2] - x[j][2];
|
||||||
|
delvx = v[i][0] - v[j][0];
|
||||||
|
delvy = v[i][1] - v[j][1];
|
||||||
|
delvz = v[i][2] - v[j][2];
|
||||||
|
dot = delx * delvx + dely * delvy + delz * delvz;
|
||||||
|
fpair -= gamma[itype][jtype] * dot * rinv * smooth;
|
||||||
|
|
||||||
|
fpair *= factor_lj;
|
||||||
|
fforce = fpair;
|
||||||
|
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
51
src/RHEO/pair_rheo_solid.h
Normal file
51
src/RHEO/pair_rheo_solid.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef PAIR_CLASS
|
||||||
|
// clang-format off
|
||||||
|
PairStyle(rheo/solid,PairRHEOSolid);
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef LMP_PAIR_RHEO_SOLID_H
|
||||||
|
#define LMP_PAIR_RHEO_SOLID_H
|
||||||
|
|
||||||
|
#include "pair.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class PairRHEOSolid : public Pair {
|
||||||
|
public:
|
||||||
|
PairRHEOSolid(class LAMMPS *);
|
||||||
|
~PairRHEOSolid() override;
|
||||||
|
void compute(int, int) override;
|
||||||
|
void settings(int, char **) override;
|
||||||
|
void coeff(int, char **) override;
|
||||||
|
void init_style() override;
|
||||||
|
double init_one(int, int) override;
|
||||||
|
void write_restart(FILE *) override;
|
||||||
|
void read_restart(FILE *) override;
|
||||||
|
void write_data(FILE *) override;
|
||||||
|
void write_data_all(FILE *) override;
|
||||||
|
double single(int, int, int, int, double, double, double, double &) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
double **k, **cut, **gamma;
|
||||||
|
|
||||||
|
void allocate();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace LAMMPS_NS
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
32
src/atom.cpp
32
src/atom.cpp
@ -198,6 +198,13 @@ Atom::Atom(LAMMPS *_lmp) : Pointers(_lmp), atom_style(nullptr), avec(nullptr), a
|
|||||||
eff_plastic_strain_rate = nullptr;
|
eff_plastic_strain_rate = nullptr;
|
||||||
damage = nullptr;
|
damage = nullptr;
|
||||||
|
|
||||||
|
// RHEO package
|
||||||
|
|
||||||
|
rheo_status = nullptr;
|
||||||
|
conductivity = nullptr;
|
||||||
|
pressure = nullptr;
|
||||||
|
viscosity = nullptr;
|
||||||
|
|
||||||
// SPH package
|
// SPH package
|
||||||
|
|
||||||
rho = drho = esph = desph = cv = nullptr;
|
rho = drho = esph = desph = cv = nullptr;
|
||||||
@ -529,6 +536,13 @@ void Atom::peratom_create()
|
|||||||
add_peratom("cc",&cc,DOUBLE,1);
|
add_peratom("cc",&cc,DOUBLE,1);
|
||||||
add_peratom("cc_flux",&cc_flux,DOUBLE,1,1); // set per-thread flag
|
add_peratom("cc_flux",&cc_flux,DOUBLE,1,1); // set per-thread flag
|
||||||
|
|
||||||
|
// RHEO package
|
||||||
|
|
||||||
|
add_peratom("rheo_status",&rheo_status,INT,0);
|
||||||
|
add_peratom("conductivity",&conductivity,DOUBLE,0);
|
||||||
|
add_peratom("pressure",&pressure,DOUBLE,0);
|
||||||
|
add_peratom("viscosity",&viscosity,DOUBLE,0);
|
||||||
|
|
||||||
// SPH package
|
// SPH package
|
||||||
|
|
||||||
add_peratom("rho",&rho,DOUBLE,0);
|
add_peratom("rho",&rho,DOUBLE,0);
|
||||||
@ -634,6 +648,7 @@ void Atom::set_atomflag_defaults()
|
|||||||
temperature_flag = heatflow_flag = 0;
|
temperature_flag = heatflow_flag = 0;
|
||||||
vfrac_flag = spin_flag = eradius_flag = ervel_flag = erforce_flag = 0;
|
vfrac_flag = spin_flag = eradius_flag = ervel_flag = erforce_flag = 0;
|
||||||
cs_flag = csforce_flag = vforce_flag = ervelforce_flag = etag_flag = 0;
|
cs_flag = csforce_flag = vforce_flag = ervelforce_flag = etag_flag = 0;
|
||||||
|
rheo_status_flag = conductivity_flag = pressure_flag = viscosity_flag = 0;
|
||||||
rho_flag = esph_flag = cv_flag = vest_flag = 0;
|
rho_flag = esph_flag = cv_flag = vest_flag = 0;
|
||||||
dpd_flag = edpd_flag = tdpd_flag = 0;
|
dpd_flag = edpd_flag = tdpd_flag = 0;
|
||||||
sp_flag = 0;
|
sp_flag = 0;
|
||||||
@ -3048,7 +3063,15 @@ void *Atom::extract(const char *name)
|
|||||||
if (strcmp(name,"vforce") == 0) return (void *) vforce;
|
if (strcmp(name,"vforce") == 0) return (void *) vforce;
|
||||||
if (strcmp(name,"etag") == 0) return (void *) etag;
|
if (strcmp(name,"etag") == 0) return (void *) etag;
|
||||||
|
|
||||||
|
// RHEO package
|
||||||
|
|
||||||
|
if (strcmp(name,"rheo_status") == 0) return (void *) rheo_status;
|
||||||
|
if (strcmp(name,"conductivity") == 0) return (void *) conductivity;
|
||||||
|
if (strcmp(name,"pressure") == 0) return (void *) pressure;
|
||||||
|
if (strcmp(name,"viscosity") == 0) return (void *) viscosity;
|
||||||
|
|
||||||
// SPH package
|
// SPH package
|
||||||
|
|
||||||
if (strcmp(name,"rho") == 0) return (void *) rho;
|
if (strcmp(name,"rho") == 0) return (void *) rho;
|
||||||
if (strcmp(name,"drho") == 0) return (void *) drho;
|
if (strcmp(name,"drho") == 0) return (void *) drho;
|
||||||
if (strcmp(name,"esph") == 0) return (void *) esph;
|
if (strcmp(name,"esph") == 0) return (void *) esph;
|
||||||
@ -3169,6 +3192,15 @@ int Atom::extract_datatype(const char *name)
|
|||||||
if (strcmp(name,"vforce") == 0) return LAMMPS_DOUBLE_2D;
|
if (strcmp(name,"vforce") == 0) return LAMMPS_DOUBLE_2D;
|
||||||
if (strcmp(name,"etag") == 0) return LAMMPS_INT;
|
if (strcmp(name,"etag") == 0) return LAMMPS_INT;
|
||||||
|
|
||||||
|
// RHEO package
|
||||||
|
|
||||||
|
if (strcmp(name,"rheo_status") == 0) return LAMMPS_INT;
|
||||||
|
if (strcmp(name,"conductivity") == 0) return LAMMPS_DOUBLE;
|
||||||
|
if (strcmp(name,"pressure") == 0) return LAMMPS_DOUBLE;
|
||||||
|
if (strcmp(name,"viscosity") == 0) return LAMMPS_DOUBLE;
|
||||||
|
|
||||||
|
// SPH package
|
||||||
|
|
||||||
if (strcmp(name,"rho") == 0) return LAMMPS_DOUBLE;
|
if (strcmp(name,"rho") == 0) return LAMMPS_DOUBLE;
|
||||||
if (strcmp(name,"drho") == 0) return LAMMPS_DOUBLE;
|
if (strcmp(name,"drho") == 0) return LAMMPS_DOUBLE;
|
||||||
if (strcmp(name,"esph") == 0) return LAMMPS_DOUBLE;
|
if (strcmp(name,"esph") == 0) return LAMMPS_DOUBLE;
|
||||||
|
|||||||
@ -155,6 +155,13 @@ class Atom : protected Pointers {
|
|||||||
double *eff_plastic_strain_rate;
|
double *eff_plastic_strain_rate;
|
||||||
double *damage;
|
double *damage;
|
||||||
|
|
||||||
|
// RHEO package
|
||||||
|
|
||||||
|
int *rheo_status;
|
||||||
|
double *conductivity;
|
||||||
|
double *pressure;
|
||||||
|
double *viscosity;
|
||||||
|
|
||||||
// SPH package
|
// SPH package
|
||||||
|
|
||||||
double *rho, *drho, *esph, *desph, *cv;
|
double *rho, *drho, *esph, *desph, *cv;
|
||||||
@ -190,6 +197,7 @@ class Atom : protected Pointers {
|
|||||||
int temperature_flag, heatflow_flag;
|
int temperature_flag, heatflow_flag;
|
||||||
int vfrac_flag, spin_flag, eradius_flag, ervel_flag, erforce_flag;
|
int vfrac_flag, spin_flag, eradius_flag, ervel_flag, erforce_flag;
|
||||||
int cs_flag, csforce_flag, vforce_flag, ervelforce_flag, etag_flag;
|
int cs_flag, csforce_flag, vforce_flag, ervelforce_flag, etag_flag;
|
||||||
|
int rheo_status_flag, conductivity_flag, pressure_flag, viscosity_flag;
|
||||||
int rho_flag, esph_flag, cv_flag, vest_flag;
|
int rho_flag, esph_flag, cv_flag, vest_flag;
|
||||||
int dpd_flag, edpd_flag, tdpd_flag;
|
int dpd_flag, edpd_flag, tdpd_flag;
|
||||||
int mesont_flag;
|
int mesont_flag;
|
||||||
|
|||||||
@ -34,6 +34,7 @@ BondHybrid::BondHybrid(LAMMPS *lmp) : Bond(lmp)
|
|||||||
nstyles = 0;
|
nstyles = 0;
|
||||||
has_quartic = -1;
|
has_quartic = -1;
|
||||||
nbondlist = nullptr;
|
nbondlist = nullptr;
|
||||||
|
orig_map = nullptr;
|
||||||
maxbond = nullptr;
|
maxbond = nullptr;
|
||||||
bondlist = nullptr;
|
bondlist = nullptr;
|
||||||
}
|
}
|
||||||
@ -81,6 +82,10 @@ void BondHybrid::compute(int eflag, int vflag)
|
|||||||
memory->destroy(bondlist[m]);
|
memory->destroy(bondlist[m]);
|
||||||
maxbond[m] = nbondlist[m] + EXTRA;
|
maxbond[m] = nbondlist[m] + EXTRA;
|
||||||
memory->create(bondlist[m], maxbond[m], 3, "bond_hybrid:bondlist");
|
memory->create(bondlist[m], maxbond[m], 3, "bond_hybrid:bondlist");
|
||||||
|
if (partial_flag) {
|
||||||
|
memory->destroy(orig_map[m]);
|
||||||
|
memory->create(orig_map[m], maxbond[m], "bond_hybrid:orig_map");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nbondlist[m] = 0;
|
nbondlist[m] = 0;
|
||||||
}
|
}
|
||||||
@ -91,6 +96,8 @@ void BondHybrid::compute(int eflag, int vflag)
|
|||||||
bondlist[m][n][0] = bondlist_orig[i][0];
|
bondlist[m][n][0] = bondlist_orig[i][0];
|
||||||
bondlist[m][n][1] = bondlist_orig[i][1];
|
bondlist[m][n][1] = bondlist_orig[i][1];
|
||||||
bondlist[m][n][2] = bondlist_orig[i][2];
|
bondlist[m][n][2] = bondlist_orig[i][2];
|
||||||
|
if (partial_flag)
|
||||||
|
orig_map[m][n] = i;
|
||||||
nbondlist[m]++;
|
nbondlist[m]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -135,6 +142,21 @@ void BondHybrid::compute(int eflag, int vflag)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If bond style can be deleted by setting type to zero (BPM or quartic), update bondlist_orig
|
||||||
|
// Otherwise, bond type could be restored back to its original value during reneighboring
|
||||||
|
// Use orig_map to propagate changes from temporary bondlist array back to original array
|
||||||
|
|
||||||
|
if (partial_flag) {
|
||||||
|
for (m = 0; m < nstyles; m++) {
|
||||||
|
for (i = 0; i < nbondlist[m]; i++) {
|
||||||
|
if (bondlist[m][i][2] <= 0) {
|
||||||
|
n = orig_map[m][i];
|
||||||
|
bondlist_orig[n][2] = bondlist[m][i][2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// restore ptrs to original bondlist
|
// restore ptrs to original bondlist
|
||||||
|
|
||||||
neighbor->nbondlist = nbondlist_orig;
|
neighbor->nbondlist = nbondlist_orig;
|
||||||
@ -154,9 +176,11 @@ void BondHybrid::allocate()
|
|||||||
|
|
||||||
nbondlist = new int[nstyles];
|
nbondlist = new int[nstyles];
|
||||||
maxbond = new int[nstyles];
|
maxbond = new int[nstyles];
|
||||||
|
orig_map = new int *[nstyles];
|
||||||
bondlist = new int **[nstyles];
|
bondlist = new int **[nstyles];
|
||||||
for (int m = 0; m < nstyles; m++) maxbond[m] = 0;
|
for (int m = 0; m < nstyles; m++) maxbond[m] = 0;
|
||||||
for (int m = 0; m < nstyles; m++) bondlist[m] = nullptr;
|
for (int m = 0; m < nstyles; m++) bondlist[m] = nullptr;
|
||||||
|
for (int m = 0; m < nstyles; m++) orig_map[m] = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -173,6 +197,8 @@ void BondHybrid::deallocate()
|
|||||||
delete[] maxbond;
|
delete[] maxbond;
|
||||||
for (int i = 0; i < nstyles; i++) memory->destroy(bondlist[i]);
|
for (int i = 0; i < nstyles; i++) memory->destroy(bondlist[i]);
|
||||||
delete[] bondlist;
|
delete[] bondlist;
|
||||||
|
for (int i = 0; i < nstyles; i++) memory->destroy(orig_map[i]);
|
||||||
|
delete[] orig_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
@ -260,8 +286,13 @@ void BondHybrid::flags()
|
|||||||
if (styles[m]) comm_forward = MAX(comm_forward, styles[m]->comm_forward);
|
if (styles[m]) comm_forward = MAX(comm_forward, styles[m]->comm_forward);
|
||||||
if (styles[m]) comm_reverse = MAX(comm_reverse, styles[m]->comm_reverse);
|
if (styles[m]) comm_reverse = MAX(comm_reverse, styles[m]->comm_reverse);
|
||||||
if (styles[m]) comm_reverse_off = MAX(comm_reverse_off, styles[m]->comm_reverse_off);
|
if (styles[m]) comm_reverse_off = MAX(comm_reverse_off, styles[m]->comm_reverse_off);
|
||||||
|
if (styles[m]) partial_flag = MAX(partial_flag, styles[m]->partial_flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (m = 0; m < nstyles; m++)
|
||||||
|
if (styles[m]->partial_flag != partial_flag)
|
||||||
|
error->all(FLERR, "Cannot hybridize bond styles with different topology settings");
|
||||||
|
|
||||||
init_svector();
|
init_svector();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -351,6 +382,7 @@ void BondHybrid::init_style()
|
|||||||
// to create an entry for it in the bond type to sub-style map
|
// to create an entry for it in the bond type to sub-style map
|
||||||
|
|
||||||
if (has_quartic >= 0) map[0] = has_quartic;
|
if (has_quartic >= 0) map[0] = has_quartic;
|
||||||
|
else map[0] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user