.. index:: compute angle/local

compute angle/local command
===========================

Syntax
""""""

.. code-block:: LAMMPS

   compute ID group-ID angle/local value1 value2 ... keyword args ...

* ID, group-ID are documented in :doc:`compute <compute>` command
* angle/local = style name of this compute command
* one or more values may be appended
* value = *theta* or *eng* or *v_name*

  .. parsed-literal::

       *theta* = tabulate angles
       *eng* = tabulate angle energies
       *v_name* = equal-style variable with name (see below)

* zero or more keyword/args pairs may be appended
* keyword = *set*

  .. parsed-literal::

       *set* args = theta name
         theta = only currently allowed arg
         name = name of variable to set with theta

Examples
""""""""

.. code-block:: LAMMPS

   compute 1 all angle/local theta
   compute 1 all angle/local eng theta
   compute 1 all angle/local theta v_cos set theta t

Description
"""""""""""

Define a computation that calculates properties of individual angle
interactions.  The number of datums generated, aggregated across all
processors, equals the number of angles in the system, modified by the
group parameter as explained below.

The value *theta* is the angle for the three atoms in the interaction.

The value *eng* is the interaction energy for the angle.

The value *v_name* can be used together with the *set* keyword to
compute a user-specified function of the angle theta.  The *name*
specified for the *v_name* value is the name of an :doc:`equal-style variable <variable>` which should evaluate a formula based on a
variable which will store the angle theta.  This other variable must
be an :doc:`internal-style variable <variable>` defined in the input
script; its initial numeric value can be anything.  It must be an
internal-style variable, because this command resets its value
directly.  The *set* keyword is used to identify the name of this
other variable associated with theta.

Note that the value of theta for each angle which stored in the
internal variable is in radians, not degrees.

As an example, these commands can be added to the bench/in.rhodo
script to compute the cosine and cosine-squared of every angle in the
system and output the statistics in various ways:

.. code-block:: LAMMPS

   variable t internal 0.0
   variable cos equal cos(v_t)
   variable cossq equal cos(v_t)*cos(v_t)

   compute 1 all property/local aatom1 aatom2 aatom3 atype
   compute 2 all angle/local eng theta v_cos v_cossq set theta t
   dump 1 all local 100 tmp.dump c_1[*] c_2[*]

   compute 3 all reduce ave c_2[*] inputs local
   thermo_style custom step temp press c_3[*]

   fix 10 all ave/histo 10 10 100 -1 1 20 c_2[3] mode vector file tmp.histo

The :doc:`dump local <dump>` command will output the potential energy
(:math:`\phi`), the angle (:math:`\theta`), :math:`\cos(\theta`), and
:math:`\cos^2(\theta)` for every angle :math:`\theta` in the system.
The :doc:`thermo_style <thermo_style>` command will print the
average of those quantities via the :doc:`compute reduce <compute_reduce>`
command with thermo output.  And the :doc:`fix ave/histo <fix_ave_histo>`
command will histogram the :math:`\cos(\theta)` values and write them to a
file.

----------

The local data stored by this command is generated by looping over all
the atoms owned on a processor and their angles.  An angle will only
be included if all three atoms in the angle are in the specified compute
group.  Any angles that have been broken (see the
:doc:`angle_style <angle_style>` command) by setting their angle type to
0 are not included.  Angles that have been turned off (see the :doc:`fix shake <fix_shake>` or :doc:`delete_bonds <delete_bonds>` commands) by
setting their angle type negative are written into the file, but their
energy will be 0.0.

Note that as atoms migrate from processor to processor, there will be
no consistent ordering of the entries within the local vector or array
from one timestep to the next.  The only consistency that is
guaranteed is that the ordering on a particular timestep will be the
same for local vectors or arrays generated by other compute commands.
For example, angle output from the :doc:`compute property/local <compute_property_local>` command can be combined
with data from this command and output by the :doc:`dump local <dump>`
command in a consistent way.

Here is an example of how to do this:

.. code-block:: LAMMPS

   compute 1 all property/local atype aatom1 aatom2 aatom3
   compute 2 all angle/local theta eng
   dump 1 all local 1000 tmp.dump index c_1[1] c_1[2] c_1[3] c_1[4] c_2[1] c_2[2]

Output info
"""""""""""

This compute calculates a local vector or local array depending on the
number of values.  The length of the vector or number of rows in the
array is the number of angles.  If a single value is specified, a
local vector is produced.  If two or more values are specified, a
local array is produced where the number of columns = the number of
values.  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 output for *theta* will be in degrees.  The output for *eng* will
be in energy :doc:`units <units>`.

Restrictions
""""""""""""
 none

Related commands
""""""""""""""""

:doc:`dump local <dump>`, :doc:`compute property/local <compute_property_local>`

Default
"""""""

none
