The Atom object

ASE defines a python class called Atom to setup and handle atoms in electronic structure and molecular simulations. From a python script, atoms can be created like this:

>>> from ase import Atom
>>> a1 = Atom('Si', (0, 0, 0))
>>> a2 = Atom('H', (1.3, 0, 0), mass=2)
>>> a3 = Atom(14, position=(0, 0, 0))  # same as a1
class ase.atom.Atom(symbol='X', position=(0, 0, 0), tag=None, momentum=None, mass=None, magmom=None, charge=None, atoms=None, index=None)[source]

Class for representing a single atom.

Parameters:

symbol: str or int

Can be a chemical symbol (str) or an atomic number (int).

position: sequence of 3 floats

Atomic position.

tag: int

Special purpose tag.

momentum: sequence of 3 floats

Momentum for atom.

mass: float

Atomic mass in atomic units.

magmom: float or 3 floats

Magnetic moment.

charge: float

Atomic charge.

The first argument to the constructor of an Atom object is the chemical symbol, and the second argument is the position in Å units (see ase.units). The position can be any numerical sequence of length three. The properties of an atom can also be set using keywords like it is done in the a2 and a3 examples above.

More examples:

>>> a = Atom('O', charge=-2)
>>> b = Atom(8, charge=-2)
>>> c = Atom('H', (1, 2, 3), magmom=1)
>>> print(a.charge, a.position)
-2 [ 0.  0.  0.]
>>> c.x = 0.0
>>> c.position
array([ 0.,  2.,  3.])
>>> b.symbol
'O'
>>> c.tag = 42
>>> c.number
1
>>> c.symbol = 'Li'
>>> c.number
3

If the atom object belongs to an Atoms object, then assigning values to the atom attributes will change the corresponding arrays of the atoms object:

>>> from ase import Atoms
>>> OH = Atoms('OH')
>>> OH[0].charge = -1
>>> OH.get_initial_charges()
array([-1.,  0.])

Another example:

>>> for atom in bulk:
...     if atom.symbol == 'Ni':
...         atom.magmom = 0.7  # set initial magnetic moment

The different properties of an atom can be obtained and changed via attributes (position, number, tag, momentum, mass, magmom, charge, x, y, z):

>>> a1.position = [1, 0, 0]
>>> a1.position
[1, 0, 0]
>>> a1.z = 2.5
>>> a1.position
[1, 0, 2.5]
>>> a2.magmom = 1.0

That last line will set the initial magnetic moment that some calculators use (similar to the set_initial_magnetic_moments() method).

Note

The position and momentum attributes refer to mutable objects, so in some cases, you may want to use a1.position.copy() in order to avoid changing the position of a1 by accident.

Getting an Atom from an Atoms object

Indexing an Atoms object returns an Atom object still remembering that it belongs to the collective Atoms: Modifying it will also change the atoms object:

>>> from ase.build import molecule
>>> atoms = molecule('CH4')
>>> atoms.get_positions()
array([[ 0.      ,  0.      ,  0.      ],
       [ 0.629118,  0.629118,  0.629118],
       [-0.629118, -0.629118,  0.629118],
       [ 0.629118, -0.629118, -0.629118],
       [-0.629118,  0.629118, -0.629118]])
>>> a = atoms[2]
>>> a
Atom('H', [-0.62911799999999996, -0.62911799999999996, 0.62911799999999996], index=2)
>>> a.x = 0
>>> atoms.get_positions()
array([[ 0.      ,  0.      ,  0.      ],
       [ 0.629118,  0.629118,  0.629118],
       [ 0.      , -0.629118,  0.629118],
       [ 0.629118, -0.629118, -0.629118],
       [-0.629118,  0.629118, -0.629118]])

See also

ase:

More information about how to use collections of atoms.

ase.calculators:

Information about how to calculate forces and energies of atoms.