Equation of state tutorial
Requirements
Software components
nanotools
RESCU+
Pseudopotentials
I will need the following pseudopotential file
C_AtomicData.mat
Let’s copy it from the pseudo database to the current working directory and export RESCUPLUS_PSEUDO=$PWD
.
Briefing
In this tutorial, I show how to calculate the lattice constant of gallium arsenide via equation of state.
Code
from nanotools import Atoms, Cell, System, TotalEnergy
from nanotools.eos import EquationOfState as EOS
import numpy as np
a = 3.562 / 2.
cell = Cell(avec=[[0.,a,a],[a,0.,a],[a,a,0.]], resolution=0.12)
fxyz = [[0.00,0.00,0.00],[0.25,0.25,0.25]]
atoms = Atoms(fractional_positions=fxyz, formula="C(2)")
sys = System(cell=cell, atoms=atoms)
ecalc = TotalEnergy(sys)
eos = EOS.from_totalenergy(ecalc)
eos.relative_volumes = np.linspace(0.95, 1.05, 5)
eos.solve()
eos.plot_eos(filename="eos-C.png")
Explanations
I will compute the equilibrium volume of diamond by fitting energy versus volume data to a Birch-Murnaghan equation of state.
Here is a high level view of the calculation workflow:
Create a
TotalEnergy
calculator and specify calculation parameters like resolution, k-sampling, tolerance, etc.Create an
EquationOfState
calculator.Solve the Kohn-Sham equation for a few volumes to obtain the EOS.
Total energy calculator
I first define a diamond crystal system with a lattice constant of 3.562 Ang.
I then create a total energy calculator (ecalc
) from this System
object.
For more detail on how to setup a total energy calculation, refer to total energy tutorial.
Equation of state calculator
I can then initialize a EOS calculator from the total energy calculator.
I use the numpy function linspace
to create an array of relative volumes which I set in relative_volumes
.
The line
eos.relative_volumes = np.linspace(0.95, 1.05, 5)
is equivalent to
eos.relative_volumes = [0.95 , 0.975, 1. , 1.025, 1.05 ]
Upon calling solve
, the EOS calculator then scales the volume of the original TotalEnergy
calculator keeping the fractional coordinates fixed, and it computes the total energy of each crystal.
The calculator will save results to nano_eos_out.json
as the solving progresses.
The results can then be loaded with the class method read
.
You can finally see the data and EOS fit typing
fig = calc.plot_eos()
which will produce