2.3.7. Per-atom properties — LAMMPS documentation

\(\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)