Atom styles =========== Classes that define an :doc:`atom style ` are derived from the AtomVec class and managed by the Atom class. The atom style determines what attributes are associated with an atom. A new atom style can be created if one of the existing atom styles does not define all the attributes you need to store and communicate with atoms. Atom_vec_atomic.cpp is a simple example of an atom style. Here is a brief description of methods you define in your new derived class. See atom_vec.h for details. +-------------------------+--------------------------------------------------------------------------------+ | init | one time setup (optional) | +-------------------------+--------------------------------------------------------------------------------+ | grow | re-allocate atom arrays to longer lengths (required) | +-------------------------+--------------------------------------------------------------------------------+ | grow_reset | make array pointers in Atom and AtomVec classes consistent (required) | +-------------------------+--------------------------------------------------------------------------------+ | copy | copy info for one atom to another atom's array locations (required) | +-------------------------+--------------------------------------------------------------------------------+ | pack_comm | store an atom's info in a buffer communicated every timestep (required) | +-------------------------+--------------------------------------------------------------------------------+ | pack_comm_vel | add velocity info to communication buffer (required) | +-------------------------+--------------------------------------------------------------------------------+ | pack_comm_hybrid | store extra info unique to this atom style (optional) | +-------------------------+--------------------------------------------------------------------------------+ | unpack_comm | retrieve an atom's info from the buffer (required) | +-------------------------+--------------------------------------------------------------------------------+ | unpack_comm_vel | also retrieve velocity info (required) | +-------------------------+--------------------------------------------------------------------------------+ | unpack_comm_hybrid | retrieve extra info unique to this atom style (optional) | +-------------------------+--------------------------------------------------------------------------------+ | pack_reverse | store an atom's info in a buffer communicating partial forces (required) | +-------------------------+--------------------------------------------------------------------------------+ | pack_reverse_hybrid | store extra info unique to this atom style (optional) | +-------------------------+--------------------------------------------------------------------------------+ | unpack_reverse | retrieve an atom's info from the buffer (required) | +-------------------------+--------------------------------------------------------------------------------+ | unpack_reverse_hybrid | retrieve extra info unique to this atom style (optional) | +-------------------------+--------------------------------------------------------------------------------+ | pack_border | store an atom's info in a buffer communicated on neighbor re-builds (required) | +-------------------------+--------------------------------------------------------------------------------+ | pack_border_vel | add velocity info to buffer (required) | +-------------------------+--------------------------------------------------------------------------------+ | pack_border_hybrid | store extra info unique to this atom style (optional) | +-------------------------+--------------------------------------------------------------------------------+ | unpack_border | retrieve an atom's info from the buffer (required) | +-------------------------+--------------------------------------------------------------------------------+ | unpack_border_vel | also retrieve velocity info (required) | +-------------------------+--------------------------------------------------------------------------------+ | unpack_border_hybrid | retrieve extra info unique to this atom style (optional) | +-------------------------+--------------------------------------------------------------------------------+ | pack_exchange | store all an atom's info to migrate to another processor (required) | +-------------------------+--------------------------------------------------------------------------------+ | unpack_exchange | retrieve an atom's info from the buffer (required) | +-------------------------+--------------------------------------------------------------------------------+ | size_restart | number of restart quantities associated with proc's atoms (required) | +-------------------------+--------------------------------------------------------------------------------+ | pack_restart | pack atom quantities into a buffer (required) | +-------------------------+--------------------------------------------------------------------------------+ | unpack_restart | unpack atom quantities from a buffer (required) | +-------------------------+--------------------------------------------------------------------------------+ | create_atom | create an individual atom of this style (required) | +-------------------------+--------------------------------------------------------------------------------+ | data_atom | parse an atom line from the data file (required) | +-------------------------+--------------------------------------------------------------------------------+ | data_atom_hybrid | parse additional atom info unique to this atom style (optional) | +-------------------------+--------------------------------------------------------------------------------+ | data_vel | parse one line of velocity information from data file (optional) | +-------------------------+--------------------------------------------------------------------------------+ | data_vel_hybrid | parse additional velocity data unique to this atom style (optional) | +-------------------------+--------------------------------------------------------------------------------+ | memory_usage | tally memory allocated by atom arrays (required) | +-------------------------+--------------------------------------------------------------------------------+ The constructor of the derived class sets values for several variables that you must set when defining a new atom style, which are documented in atom_vec.h. New atom arrays are defined in atom.cpp. Search for the word "customize" and you will find locations you will need to modify. .. note:: It is possible to add some attributes, such as a molecule ID, to atom styles that do not have them via the :doc:`fix property/atom ` command. This command also allows new custom attributes consisting of extra integer or floating-point values to be added to atoms. See the :doc:`fix property/atom ` doc page for examples of cases where this is useful and details on how to initialize, access, and output the custom values. New :doc:`pair styles `, :doc:`fixes `, or :doc:`computes ` can be added to LAMMPS, as discussed below. The code for these classes can use the per-atom properties defined by fix property/atom. The Atom class has a find_custom() method that is useful in this context: .. code-block:: c++ int index = atom->find_custom(char *name, int &flag); The "name" of a custom attribute, as specified in the :doc:`fix property/atom ` command, is checked to verify that it exists and its index is returned. The method also sets flag = 0/1 depending on whether it is an integer or floating-point attribute. The vector of values associated with the attribute can then be accessed using the returned index as .. code-block:: c++ int *ivector = atom->ivector[index]; double *dvector = atom->dvector[index]; Ivector or dvector are vectors of length Nlocal = # of owned atoms, which store the attributes of individual atoms.