\(\renewcommand{\AA}{\text{Å}}\)
2.3.7. Per-atom properties
Similar to what is described in Per-atom properties, the instances of
lammps
, PyLammps
, or
IPyLammps
can be used to extract atom quantities
and modify some of them. The main difference between the interfaces is how the information
is exposed.
While the lammps
is just a thin layer that wraps C API calls,
PyLammps
and IPyLammps
expose
information as objects and properties.
In some cases the data returned is a direct reference to the original data
inside LAMMPS cast to ctypes
pointers. Where possible, the wrappers will
determine the ctypes
data type and cast pointers accordingly. If
numpy
is installed arrays can also be extracted as numpy arrays, which
will access the C arrays directly and have the correct dimensions to protect
against invalid accesses.
Warning
When accessing per-atom data, please note that this data is the per-processor local data and indexed accordingly. These arrays can change sizes and order at every neighbor list rebuild and atom sort event as atoms are migrating between subdomains.
from lammps import lammps
lmp = lammps()
lmp.file("in.sysinit")
nlocal = lmp.extract_global("nlocal")
x = lmp.extract_atom("x")
for i in range(nlocal):
print("(x,y,z) = (", x[i][0], x[i][1], x[i][2], ")")
lmp.close()
Methods:
extract_atom()
: extract a per-atom quantity
Numpy Methods:
numpy.extract_atom()
: extract a per-atom quantity as numpy array
All atoms in the current simulation can be accessed by using the PyLammps.atoms
property.
Each element of this list is a Atom
or Atom2D
object. The attributes of
these objects provide access to their data (id, type, position, velocity, force, etc.):
# access first atom
L.atoms[0].id
L.atoms[0].type
# access second atom
L.atoms[1].position
L.atoms[1].velocity
L.atoms[1].force
Some attributes can be changed:
# set position in 2D simulation
L.atoms[0].position = (1.0, 0.0)
# set position in 3D simulation
L.atoms[0].position = (1.0, 0.0, 1.0)