Equation of state

The EquationOfState class can be used to find equilibrium volume, energy, and bulk modulus for solids:

class ase.eos.EquationOfState(volumes, energies, eos=’sj’)[source]

Fit equation of state for bulk systems.

The following equation is used:

sjeos (default)
    A third order inverse polynomial fit 10.1103/PhysRevB.67.026103


                            2      3        -1/3
        E(V) = c + c t + c t  + c t ,  t = V
                0   1     2      3

    A third order Taylor series expansion about the minimum volume

    PRB 28, 5480 (1983)

    Intermetallic compounds: Principles and Practice,
    Vol I: Principles. pages 195-210

    PRB 70, 224107

    PRB 70, 224107

    PRB 70, 224107

    Intermetallics 11, 23-32 (2003)

    A third order polynomial fit


eos = EquationOfState(volumes, energies, eos='murnaghan')
v0, e0, B = eos.fit()

Calculate volume, energy, and bulk modulus.

Returns the optimal volume, the minimum energy, and the bulk modulus. Notice that the ASE units for the bulk modulus is eV/Angstrom^3 - to get the value in GPa, do this:

v0, e0, B = eos.fit()
print(B / kJ * 1.0e24, 'GPa')
plot(filename=None, show=None, ax=None)[source]

Plot fitted energy curve.

Uses Matplotlib to plot the energy curve. Use show=True to show the figure and filename=’abc.png’ or filename=’abc.eps’ to save the figure to a file.

Convenient helper function:

ase.eos.calculate_eos(atoms, npoints=5, eps=0.04, trajectory=None, callback=None)[source]

Calculate equation-of-state.

atoms: Atoms object
System to calculate EOS for. Must have a calculator attached.
npoints: int
Number of points.
eps: float
Variation in volume from v0*(1-eps) to v0*(1+eps).
trajectory: Trjectory object or str
Write configurations to a trajectory file.
callback: function
Called after every energy calculation.
>>> from ase.build import bulk
>>> from ase.calculators.emt import EMT
>>> a = bulk('Cu', 'fcc', a=3.6)
>>> a.calc = EMT()
>>> eos = calculate_eos(a, trajectory='Cu.traj')
>>> v, e, B = eos.fit()
>>> a = (4 * v)**(1 / 3.0)
>>> print('{0:.6f}'.format(a))

See also

The Equation of state tutorial.