Equation of state (EOS)

Equation of state (EOS)#

Note

We are currently moving to a new way to display our examples. For this example we have an updated version, which you can find here. The example on this page is deprecated and will be removed once all examples have been moved to the new format.

First, do a bulk calculation for different lattice constants:

import numpy as np

from ase import Atoms
from ase.calculators.emt import EMT
from ase.io.trajectory import Trajectory

a = 4.0  # approximate lattice constant
b = a / 2
ag = Atoms(
    'Ag', cell=[(0, b, b), (b, 0, b), (b, b, 0)], pbc=1, calculator=EMT()
)  # use EMT potential
cell = ag.get_cell()
traj = Trajectory('Ag.traj', 'w')
for x in np.linspace(0.95, 1.05, 5):
    ag.set_cell(cell * x, scale_atoms=True)
    ag.get_potential_energy()
    traj.write(ag)

This will write a trajectory file containing five configurations of FCC silver for five different lattice constants. Now, analyse the result with the EquationOfState class and this script:

from ase.eos import EquationOfState
from ase.io import read
from ase.units import kJ

configs = read('Ag.traj@0:5')  # read 5 configurations
# Extract volumes and energies:
volumes = [ag.get_volume() for ag in configs]
energies = [ag.get_potential_energy() for ag in configs]
eos = EquationOfState(volumes, energies)
v0, e0, B = eos.fit()
print(B / kJ * 1.0e24, 'GPa')
eos.plot('Ag-eos.png')

eos

A quicker way to do this analysis, is to use the ase.gui tool:

$ ase gui Ag.traj

And then choose Tools ‣ Bulk modulus.