Files
lammps/doc/src/Modify_fix.rst
2025-04-03 13:47:53 -04:00

159 lines
16 KiB
ReStructuredText

Fix styles
==========
In LAMMPS, a "fix" is any operation that is computed during timestepping
that alters some property of the system. Essentially everything that
happens during a simulation besides force computation, neighbor list
construction, and output, is a "fix". This includes time integration
(update of coordinates and velocities), force constraints or boundary
conditions (SHAKE or walls), and diagnostics (compute a diffusion
coefficient). New styles can be created to add new options to LAMMPS.
The file ``src/fix_setforce.cpp`` is a simple example of setting forces
on atoms to prescribed values. There are dozens of fix options already
in LAMMPS; choose one as a template that is similar to what you want to
implement. There also is a detailed discussion of :doc:`how to write
new fix styles <Developer_write_fix>` in LAMMPS.
Here is a brief description of methods you can define in your new
derived class. See ``src/fix.h`` for additional details.
+---------------------------+--------------------------------------------------------------------------------------------+
| post_constructor | perform tasks that cannot be run in the constructor (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| setmask | determines when the fix is called during the timestep (required) |
+---------------------------+--------------------------------------------------------------------------------------------+
| init | initialization before a run (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| init_list | store pointer to neighbor list; called by neighbor list code (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| setup_pre_exchange | called before atom exchange in setup (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| setup_pre_force | called before force computation in setup (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| setup | called immediately before the first timestep and after forces are computed (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| min_setup_pre_force | like setup_pre_force, but for minimizations instead of MD runs (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| min_setup | like setup, but for minimizations instead of MD runs (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| initial_integrate | called at very beginning of each timestep (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| pre_exchange | called before atom exchange on re-neighboring steps (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| pre_neighbor | called before neighbor list build (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| pre_force | called before pair & molecular forces are computed (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| post_force | called after pair & molecular forces are computed and communicated (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| final_integrate | called at end of each timestep (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| end_of_step | called at very end of timestep (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| write_restart | dumps fix info to restart file (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| restart | uses info from restart file to re-initialize the fix (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| grow_arrays | allocate memory for atom-based arrays used by fix (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| copy_arrays | copy atom info when an atom migrates to a new processor (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| pack_exchange | store atom's data in a buffer (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| unpack_exchange | retrieve atom's data from a buffer (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| pack_restart | store atom's data for writing to restart file (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| unpack_restart | retrieve atom's data from a restart file buffer (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| size_restart | size of atom's data (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| maxsize_restart | max size of atom's data (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| setup_pre_force_respa | same as setup_pre_force, but for rRESPA (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| initial_integrate_respa | same as initial_integrate, but for rRESPA (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| post_integrate_respa | called after the first half integration step is done in rRESPA (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| pre_force_respa | same as pre_force, but for rRESPA (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| post_force_respa | same as post_force, but for rRESPA (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| final_integrate_respa | same as final_integrate, but for rRESPA (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| min_pre_force | called after pair & molecular forces are computed in minimizer (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| min_post_force | called after pair & molecular forces are computed and communicated in minimizer (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| min_store | store extra data for linesearch based minimization on a LIFO stack (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| min_pushstore | push the minimization LIFO stack one element down (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| min_popstore | pop the minimization LIFO stack one element up (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| min_clearstore | clear minimization LIFO stack (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| min_step | reset or move forward on line search minimization (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| min_dof | report number of degrees of freedom *added* by this fix in minimization (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| max_alpha | report maximum allowed step size during linesearch minimization (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| pack_comm | pack a buffer to communicate a per-atom quantity (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| unpack_comm | unpack a buffer to communicate a per-atom quantity (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| pack_reverse_comm | pack a buffer to reverse communicate a per-atom quantity (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| unpack_reverse_comm | unpack a buffer to reverse communicate a per-atom quantity (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| dof | report number of degrees of freedom *removed* by this fix during MD (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| compute_scalar | return a global scalar property that the fix computes (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| compute_vector | return a component of a vector property that the fix computes (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| compute_array | return a component of an array property that the fix computes (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| deform | called when the box size is changed (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| reset_target | called when a change of the target temperature is requested during a run (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| reset_dt | is called when a change of the time step is requested during a run (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| modify_param | called when a fix_modify request is executed (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| memory_usage | report memory used by fix (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
| thermo | compute quantities for thermodynamic output (optional) |
+---------------------------+--------------------------------------------------------------------------------------------+
Typically, only a small fraction of these methods are defined for a
particular fix. Setmask is mandatory, as it determines when the fix
will be invoked during :doc:`the evolution of a timestep
<Developer_flow>`. Fixes that perform time integration (\ *nve*, *nvt*,
*npt*\ ) implement initial_integrate() and final_integrate() to perform
velocity Verlet updates. Fixes that constrain forces implement
post_force().
Fixes that perform diagnostics typically implement end_of_step(). For
an end_of_step fix, one of your fix arguments must be the variable
"nevery" which is used to determine when to call the fix and you must
set this variable in the constructor of your fix. By convention, this
is the first argument the fix defines (after the ID, group-ID, style).
If the fix needs to store information for each atom that persists from
timestep to timestep, it can manage that memory and migrate the info
with the atoms as they move from processors to processor by implementing
the grow_arrays, copy_arrays, pack_exchange, and unpack_exchange
methods. Similarly, the pack_restart and unpack_restart methods can be
implemented to store information about the fix in restart files. If you
wish an integrator or force constraint fix to work with rRESPA (see the
:doc:`run_style <run_style>` command), the initial_integrate,
post_force_integrate, and final_integrate_respa methods can be
implemented. The thermo method enables a fix to contribute values to
thermodynamic output, as printed quantities and/or to be summed to the
potential energy of the system.