Getting started with GPAW¶
In this exercise we will calculate structures and binding energies for simple molecules.
Performing a structure optimization¶
A structure optimization, also called a relaxation, is a series of calculations used to determine the minimum-energy structure of a given system. This involves multiple calculations of the atomic forces \(\mathbf F^a = -\tfrac{\partial E}{\partial \mathbf R^a}\) with respect to the atomic positions \(\mathbf R^a\) as the atoms are moved downhill according to an optimization algorithm.
The following script uses the EMT calculator
to optimize the structure of H2.
# creates: h2.emt.traj
from ase import Atoms
from ase.calculators.emt import EMT
from ase.optimize import QuasiNewton
system = Atoms('H2', positions=[[0.0, 0.0, 0.0],
[0.0, 0.0, 1.0]])
calc = EMT()
system.calc = calc
opt = QuasiNewton(system, trajectory='h2.emt.traj')
opt.run(fmax=0.05)
This is the first ASE script we have seen so far, so a few comments are in order:
At the top is a series of import statements. These load the Python modules we are going to use.
An
Atoms
object is created, specifying an initial (possibly bad) guess for the atomic positions.An
EMT
calculator is created. A calculator can evaluate quantities such as energies and forces on a collection of atoms. There are different kinds of calculators, and EMT is a particularly simple one. The calculator is associated with theAtoms
object by callingatoms.calc = calc
.An
optimizer
is created and associated with theAtoms
object. It is also given an optional argument,trajectory
, which specifies the name of a file into which the positions will be saved for each step in the geometry optimization.Finally the call
opt.run(fmax=0.05)
will run the optimization algorithm until all atomic forces are below 0.05 eV per Ångström.
Run the above structure optimization.
This will print the (decreasing) total energy for each iteration until
it converges, leaving the file h2.emt.traj
in the working
directory. Use the command ase gui to view the
trajectory file, showing each step of the optimization.
Structure optimization of H2O with EMT and GPAW¶
Adapt the above script as needed and calculate the structure of a H2O molecule using the EMT calculator. Note that water is not a linear molecule. If you start with a linear molecule, the minimization may not be able to break the symmetry. Be sure to visualize the final configuration to check that it is reasonable.
The empirical EMT potential is fast, but not very accurate for
molecules in particular. We therefore want to perform this
calculation in GPAW instead. GPAW uses real-space grids to represent
density and wavefunctions, and the grids exist in a cell. For this
reason you must set a cell for the Atoms
object. As a
coarse value let us use a 6 Ångström cell:
atoms.set_cell((6.0, 6.0, 6.0))
atoms.center()
The cell must be centered in order to prevent atoms from lying too close to the boundary, as the boundary conditions are zero by default.
Instead of importing and using EMT, we now use GPAW:
from gpaw import GPAW
...
calc = GPAW(mode='fd')
...
Make a copy of your script and adapt it to GPAW, then recalculate the structure of H2O (make sure to choose a new filename for the trajectory file).
During the calculation a lot of text is printed to the terminal. This includes the parameters used in the calculation: Atomic positions, grid spacing, XC functional (GPAW uses LDA by default) and many other properties. For each iteration in the self-consistency cycle one line is printed with the energy and convergence measures. After the calculation the energy contributions, band energies and forces are listed.
Use ase gui to visualize and compare bond lenghts and bond angles to the EMT result. Bond lengths and angles are shown automatically if you select two or three atoms at a time.
Atomization energies¶
Now that we know the structure of H2O, we can calculate other interesting properties like the molecule’s atomization energy.
The atomization energy of a molecule is equal to the total energy of the molecule minus the sum of the energies of each of its constituent isolated atoms. For example, the atomization energy of H2 is \(E[\mathrm{H}_2] - 2 E[\mathrm H]\).
GPAW calculations are by default spin-paired, i.e. the spin-up and spin-down densities are assumed to be equal. As this is not the case for isolated atoms, it will be necessary to instruct GPAW to do something different:
calc = GPAW(mode='fd', hund=True)
With the hund
keyword, Hund’s rule is applied to initialize the
atomic states, and the calculation will be made spin-polarized.
Write a script which calculates the total energy of the isolated O and H atoms, and calculate the atomization energy of H2O.
Exchange and correlation functionals¶
So far we have been using GPAW’s default parameters. The default
exchange-correlation functional is LDA. This is not very accurate,
and in particular overestimates atomization energies. You can specify
different XC functionals to the calculator using
GPAW(xc=name)
, where name
is a string such as
'LDA'
, 'PBE'
or 'RPBE'
.
Calculate the atomization energy of H2O with LDA and PBE (just reuse the geometry from the LDA optimization, i.e. do not repeat the minimization).