\(\renewcommand{\AA}{\text{Å}}\)

# 3.6. Pair styles

Classes that compute pairwise non-bonded interactions are derived from the `Pair` class. In LAMMPS, pairwise force calculations include many-body potentials such as EAM, Tersoff, or ReaxFF where particles interact without an explicit bond topology but include interactions beyond pairwise non-bonded contributions. New styles can be created to add support for additional pair potentials to LAMMPS. When the modifications are small, sometimes it is more effective to derive from an existing pair style class. This latter approach is also used by Accelerator packages where the accelerated style names differ from their base classes by an appended suffix.

The file `src/pair_lj_cut.cpp` is an example of a Pair class with a very simple potential function. It includes several optional methods to enable its use with run_style respa and compute group/group. Writing new pair styles contains a detailed discussion of writing new pair styles from scratch, and how simple and more complex pair styles can be implemented with examples from existing pair styles.

Here is a brief list of some the class methods in the Pair class that must be or may be overridden in a derived class for a new pair style.

Required | “pure” methods that must be overridden in a derived class
--- | ---
compute | workhorse routine that computes pairwise interactions
settings | processes the arguments to the pair_style command
coeff | set coefficients for one i,j type pair, called from pair_coeff

Optional | methods that have a default or dummy implementation
--- | ---
init_one | perform initialization for one i,j type pair
init_style | style initialization: request neighbor list(s), error checks
init_list | Neighbor class callback function to pass neighbor list to pair style
single | force/r and energy of a single pairwise interaction between two atoms
compute_inner/middle/outer | versions of compute used by rRESPA
compute_atomic_energy | energy of one atom, equivalent to per-atom energy
memory_usage | return estimated amount of memory used by the pair style
modify_params | process arguments to pair_modify command
extract | provide access to internal scalar or per-type data like cutoffs
extract_peratom | provide access to internal per-atom data
setup | initialization at the beginning of a run
finish | called at the end of a run, e.g. to print
write & read_restart | write/read i,j pair coeffs to restart files
write & read_restart_settings | write/read global settings to restart files
write_data | write Pair Coeffs section to data file
write_data_all | write PairIJ Coeffs section to data file
pack & unpack_forward_comm | copy data to and from buffer if style uses forward communication
pack & unpack_reverse_comm | copy data to and from buffer if style uses reverse communication
reinit | reset all type-based parameters, called by fix adapt for example
reset_dt | called when the time step is changed by timestep or fix reset/dt

Here is a list of flags or settings that should be set in the constructor of the derived pair class when they differ from the default setting.

Name of flag | Description | default
--- | --- | ---
single_enable | 1 if single() method is implemented, 0 if missing | 1
respa_enable | 1 if pair style has compute_inner/middle/outer() | 0
restartinfo | 1 if pair style writes its settings to a restart | 1
one_coeff | 1 if only a pair_coeff * * command is allowed | 0
manybody_flag | 1 if pair style is a manybody potential | 0
unit_convert_flag | value != 0 indicates support for unit conversion | 0
no_virial_fdotr_compute | 1 if pair style does not call virial_fdotr_compute() | 0
writedata | 1 if write_data() and write_data_all() are implemented | 0
comm_forward | size of buffer (in doubles) for forward communication | 0
comm_reverse | size of buffer (in doubles) for reverse communication | 0
ghostneigh | 1 if cutghost is set and style uses neighbors of ghosts | 0
finitecutflag | 1 if cutoff depends on diameter of atoms | 0
reinitflag | 1 if style has reinit() and is compatible with fix adapt | 0
ewaldflag | 1 if compatible with kspace_style ewald | 0
pppmflag | 1 if compatible with kspace_style pppm | 0
msmflag | 1 if compatible with kspace_style msm | 0
dispersionflag | 1 if compatible with ewald/disp or pppm/disp | 0
tip4pflag | 1 if compatible with kspace_style pppm/tip4p | 0
dipoleflag | 1 if compatible with dipole kspace_style | 0
spinflag | 1 if compatible with spin kspace_style | 0
atomic_energy_enable | 1 if compute_atomic_energy() routine exists | 0