Files
lammps/doc/src/fix_indent.rst
2024-07-06 09:55:22 -04:00

256 lines
10 KiB
ReStructuredText

.. index:: fix indent
fix indent command
==================
Syntax
""""""
.. code-block:: LAMMPS
fix ID group-ID indent K gstyle args keyword value ...
* ID, group-ID are documented in :doc:`fix <fix>` command
* indent = style name of this fix command
* K = force constant for indenter surface (force/distance\^2 units)
* gstyle = *sphere* or *cylinder* or *cone* or *plane*
.. parsed-literal::
*sphere* args = x y z R
x, y, z = position of center of indenter (distance units)
R = sphere radius of indenter (distance units)
any of x, y, z, R can be a variable (see below)
*cylinder* args = dim c1 c2 R
dim = *x* or *y* or *z* = axis of cylinder
c1, c2 = coords of cylinder axis in other 2 dimensions (distance units)
R = cylinder radius of indenter (distance units)
any of c1,c2,R can be a variable (see below)
*cone* args = dim c1 c2 radlo radhi lo hi
dim = *x* or *y* or *z* = axis of cone
c1, c2 = coords of cone axis in other 2 dimensions (distance units)
radlo,radhi = cone radii at lo and hi end (distance units)
lo,hi = bounds of cone in dim (distance units)
any of c1, c2, radlo, radhi, lo, hi can be a variable (see below)
*plane* args = dim pos side
dim = *x* or *y* or *z* = plane perpendicular to this dimension
pos = position of plane in dimension x, y, or z (distance units)
pos can be a variable (see below)
side = *lo* or *hi*
* zero or more keyword/value pairs may be appended
* keyword = *side* or *units*
.. parsed-literal::
*side* value = *in* or *out*
*in* = the indenter acts on particles inside the sphere or cylinder or cone
*out* = the indenter acts on particles outside the sphere or cylinder or cone
*units* value = *lattice* or *box*
lattice = the geometry is defined in lattice units
box = the geometry is defined in simulation box units
Examples
""""""""
.. code-block:: LAMMPS
fix 1 all indent 10.0 sphere 0.0 0.0 15.0 3.0
fix 1 all indent 10.0 sphere v_x v_y 0.0 v_radius side in
fix 2 flow indent 10.0 cylinder z 0.0 0.0 10.0 units box
Description
"""""""""""
Insert an indenter within a simulation box. The indenter repels all
atoms in the group that touch it, so it can be used to push into a
material or as an obstacle in a flow. Alternatively, it can be used as a
constraining wall around a simulation; see the discussion of the
*side* keyword below.
The *gstyle* keyword selects the geometry of the indenter and it can
either have the value of *sphere*, *cylinder*, *cone*, or *plane*\ .
A spherical indenter (*gstyle* = *sphere*) exerts a force of magnitude
.. math::
F(r) = - K \left( r - R \right)^2
on each atom where *K* is the specified force constant, *r* is the
distance from the atom to the center of the indenter, and *R* is the
radius of the indenter. The force is repulsive and F(r) = 0 for *r* >
*R*\ .
A cylindrical indenter (*gstyle* = *cylinder*) follows the same formula
for the force as a sphere, except that *r* is defined the distance
from the atom to the center axis of the cylinder. The cylinder extends
infinitely along its axis.
.. versionadded:: 17April2024
A conical indenter (*gstyle* = *cone*) is similar to a cylindrical indenter
except that it has a finite length (between *lo* and *hi*), and that two
different radii (one at each end, *radlo* and *radhi*) can be defined.
Spherical, cylindrical, and conical indenters account for periodic
boundaries in two ways. First, the center point of a spherical
indenter (x,y,z) or axis of a cylindrical/conical indenter (c1,c2) is
remapped back into the simulation box, if the box is periodic in a
particular dimension. This occurs every timestep if the indenter
geometry is specified with a variable (see below), e.g. it is moving
over time. Second, the calculation of distance to the indenter center
or axis accounts for periodic boundaries. Both of these mean that an
indenter can effectively move through and straddle one or more
periodic boundaries.
A planar indenter (*gstyle* = *plane*) behaves like an axis-aligned
infinite-extent wall with the same force expression on atoms in the
system as before, but where *R* is the position of the plane and *r-R*
is the distance of an from the plane. If the *side* parameter of the
plane is specified as *lo* then it will indent from the lo end of the
simulation box, meaning that atoms with a coordinate less than the
plane's current position will be pushed towards the hi end of the box
and atoms with a coordinate higher than the plane's current position
will feel no force. Vice versa if *side* is specified as *hi*\ .
Any of the 4 quantities defining a spherical indenter's geometry can
be specified as an equal-style :doc:`variable <variable>`, namely *x*,
*y*, *z*, or *R*\ . For a cylindrical indenter, any of the 3
quantities *c1*, *c2*, or *R*, can be a variable. For a conical
indenter, any of the 6 quantities *c1*, *c2*, *radlo*, *radhi*, *lo*,
or *hi* can be a variable. For a planar indenter, the single value
*pos* can be a variable.
If any of these values 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 timestep, and its value used to define the
indenter geometry.
Note that equal-style variables can specify formulas with various
mathematical functions, and include :doc:`thermo_style <thermo_style>`
command keywords for the simulation box parameters and timestep and
elapsed time. Thus it is easy to specify indenter properties that
change as a function of time or span consecutive runs in a continuous
fashion. For the latter, see the *start* and *stop* keywords of the
:doc:`run <run>` command and the *elaplong* keyword of
:doc:`thermo_style custom <thermo_style>` for details.
For example, if a spherical indenter's x-position is specified as v_x,
then this variable definition will keep it's center at a relative
position in the simulation box, 1/4 of the way from the left edge to
the right edge, even if the box size changes:
.. code-block:: LAMMPS
variable x equal "xlo + 0.25*lx"
Similarly, either of these variable definitions will move the indenter
from an initial position at 2.5 at a constant velocity of 5:
.. code-block:: LAMMPS
variable x equal "2.5 + 5*elaplong*dt"
variable x equal vdisplace(2.5,5)
If a spherical indenter's radius is specified as v_r, then these
variable definitions will grow the size of the indenter at a specified
rate.
.. code-block:: LAMMPS
variable r0 equal 0.0
variable rate equal 1.0
variable r equal "v_r0 + step*dt*v_rate"
If the *side* keyword is specified as *out*, which is the default,
then particles outside the indenter are pushed away from its outer
surface, as described above. This only applies to spherical,
cylindrical, and conical indenters. If the *side* keyword is
specified as *in*, the action of the indenter is reversed. Particles
inside the indenter are pushed away from its inner surface. In other
words, the indenter is now a containing wall that traps the particles
inside it. If the radius shrinks over time, it will squeeze the
particles.
The *units* keyword determines the meaning of the distance units used
to define the indenter geometry. A *box* value selects standard
distance units as defined by the :doc:`units <units>` command,
e.g. Angstroms for units = real or metal. A *lattice* value means the
distance units are in lattice spacings. The :doc:`lattice <lattice>`
command must have been previously used to define the lattice spacing.
The (x,y,z) coords of the indenter position are scaled by the x,y,z
lattice spacings respectively. The radius of a spherical or
cylindrical indenter is scaled by the x lattice spacing.
Note that the units keyword only affects indenter geometry parameters
specified directly with numbers, not those specified as variables. In
the latter case, you should use the *xlat*, *ylat*, *zlat* keywords of
the :doc:`thermo_style <thermo_style>` command if you want to include
lattice spacings in a variable formula.
The force constant *K* is not affected by the *units* keyword. It is
always in force/distance\^2 units where force and distance are defined
by the :doc:`units <units>` command. If you wish K to be scaled by
the lattice spacing, you can define K with a variable whose formula
contains *xlat*, *ylat*, *zlat* keywords of the :doc:`thermo_style
<thermo_style>` command, e.g.
.. code-block:: LAMMPS
variable k equal 100.0/xlat/xlat
fix 1 all indent $k sphere ...
Restart, fix_modify, output, run start/stop, minimize info
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
No information about this fix is written to :doc:`binary restart files
<restart>`.
The :doc:`fix_modify <fix_modify>` *energy* option is supported by
this fix to add the energy of interaction between atoms and the
indenter to the global potential energy of the system as part of
:doc:`thermodynamic output <thermo_style>`. The default setting for
this fix is :doc:`fix_modify energy no <fix_modify>`. The energy of
each particle interacting with the indenter is K/3 (r - R)\^3.
The :doc:`fix_modify <fix_modify>` *respa* option is supported by this
fix. This allows to set at which level of the :doc:`r-RESPA
<run_style>` integrator the fix is adding its forces. Default is the
outermost level.
This fix computes a global scalar energy and a global 3-vector of
forces (on the indenter), which can be accessed by various
:doc:`output commands <Howto_output>`. The scalar and vector values
calculated by this fix are "extensive".
The forces due to this fix are imposed during an energy minimization,
invoked by the :doc:`minimize <minimize>` command. Note that if you
define the indenter geometry with a variable using a time-dependent
formula, LAMMPS uses the iteration count in the minimizer as the
timestep. But it is almost certainly a bad idea to have the indenter
change its position or size during a minimization. LAMMPS does not
check if you have done this.
.. note::
If you want the atom/indenter interaction energy to be included in
the total potential energy of the system (the quantity being
minimized), you must enable the :doc:`fix_modify <fix_modify>`
*energy* option for this fix.
Restrictions
""""""""""""
none
Related commands
""""""""""""""""
none
Default
"""""""
The option defaults are side = out and units = lattice.