atoMEC: an open-source average-atom Python code

Timothy Callow1,2, Daniel Kotik1,2, Eli Kraisler3 and Attila Cangi1,2
Center for Advanced Systems Understanding (CASUS), D-02826 Görlitz, Germany
Helmholtz-Zentrum Dresden-Rossendorf (HZDR), D-01328 Dresden, Germany
Fritz Haber Center for Molecular Dynamics, Hebrew University of Jerusalem, 9091401 Jerusalem, Israel


Poster hint: change zoom to optimize layout

What is warm dense matter?

Figure depicting the temperatures and densities spanned by the warm dense matter regime, and some examples of wardm dense matter such as white dwarfs

  • Warm dense matter (WDM) lies somewhere between condensed matter physics (CMP) and plasma physics
  • It is characterized by moderate to high temperatures and densities ranging from dense gases to highly compressed solids
  • There are many astrophysical and technological (e.g. inertial confinement fusion (ICF)) examples of warm dense matter

What are average-atom models?

Figure visualizing the average-atom concept Figure depecting a many-body system of interacting electrons and nuclei

  • Average-atom models map the many-body system of electrons and nuclei to a single atom immersed in a plasma
  • This massively reduces the computational complexity: typically, from hundreds of core hours to less than one
  • Drag the slider to visualize this mapping

Average-atom calculation: theory

Average-atom calculation: considerations

The minimization of the grand free energy requires the following considerations:

Physical conditions

What is the temperature and the density of my material?

Model and approximations

For example: What boundary conditions should I use? How should I treat delocalized (unbound) electrons?

Algorithms and numerics

For example: How large should my grid be? How should I solve the differential equations?

Physical conditions: atoMEC.Atom

In atoMEC, the choice of density and temperature is handled by the atoMEC.Atom class.

Consider Aluminium at its normal metallic density (2.7 g cm\(^{-3}\)) and room temperature (300 K):

Al_atom = atoMEC.Atom(

We use the mendeleev library to get the atomic properties.

Model and approximations: atoMEC.models

An "ion-sphere" model is invoked with the atoMEC.models.ISModel class.

Suppose we choose the "neumann" boundary condition and "quantum" treatment for delocalized (unbound) electrons:

model = atoMEC.models.ISModel(

The choice of exchange-correlation functionals (see corresponding paper) is handled by the LIBXC library.

Algorithms and numerics: ISModel.CalcEnergy

The minimization of the grand free energy is handled by the ISModel.CalcEnergy function.

Suppose we want the 3 lowest-energy orbitals in the "n" and "l" directions (these denote quantum numbers), with a grid size of 1500 points:

from atoMEC import config
config.numcores = -1  # parallelize over all cores
SCF_out = model.CalcEnergy(
    grid_params={"ngrid": 1500},

We use SciPy (scipy.sparse) to find the eigenvalues, joblib for parallelization, and SciPy and NumPy for various other tasks (root finding, integration, ...).

Case-study: metallization of helium

Helium metallization: density-of-states

Density: g cm\(^{-3}\)

  • The density-of-states shows the permitted electron energy ranges
  • Drag the slider to see the band-gap narrow as density increases (at fixed temperature 50 kK)
  • Insulator-to-metallic transition happens when band-gap vanishes

Helium metallization: band-gap and ionization

Useful links