Simulating icosahedral gold clusters

From TurboGAP
Jump to navigation Jump to search

In this tutorial we are going to use a GAP to optimize the structure of an icosahedral gold cluster and estimate its formation energy. In this tutorial we will make use of static (single-point) calculations (turbogap predict) and geometry optimization.

Prerequisites for this tutorial

  • A TurboGAP installation
  • An ASE installation
  • Numpy
  • A utility that can perform simple least-squares regression (I will use gnuplot, which lets me plot the fit at the same time)

Computing the equilibrium lattice parameter of the reference structure

The thermodynamically stable crystal structure of gold is fcc. When we compute the formation energy of a gold nanocluster we will be referring its energy per atom to that of the fcc structure. Therefore, the first step in this tutorial is to find out the lattice parameter of fcc gold by computing the energy vs lattice parameter curve, and finding the minimum.

This script will generate a series of Au fcc structures with lattice parameter between 3.8 and 4.3 Angstrom:

1 from ase.io import write
2 from ase import Atoms
3 import numpy as np
4 
5 append = False
6 for a in np.arange(3.8,4.3,0.01):
7     atoms = Atoms("Au", positions=[[0,0,0]], cell=[[0,a/2,a/2],[a/2,0,a/2],[a/2,a/2,0]], pbc=True)
8     write("fcc.xyz", atoms, append=append)
9     append = True

We now have the fcc.xyz file containing all of these structures. Next, we retrieve the Au GAP potential from Zenodo:

1 wget https://zenodo.org/record/6302852/files/gap_files.tar.gz
2 tar -xvf gap_files.tar.gz

The following step is to set up an input file:

atoms_file = "fcc.xyz"
pot_file = "gap_files/aurum.gap"

species = Au
n_species = 1

and run Turbogap in single-point mode:

mpirun -np turbogap predict

From the resulting trajectory_out.xyz we retrive the lattice parameters and energies with the following script:

1 from ase.io import read
2 db = read("trajectory_out.xyz", index=":")
3 f = open("e.dat", "w+")
4 for atoms in db:
5     e = atoms.info["energy"]
6     a = atoms.get_cell()[0][1]*2
7     print(a, e, file=f)

Run it an save the results to a file (I save the Python script to a file called extract_energy.py here:

python3 extract_energy.py > e.dat

We can open this file in gnuplot and use gnuplot's fitting capabilities to fit a second order polynomial to the data (I restrict the fitting domain to [4.1:4.2] to get a better fit):

fit[4.1:4.2] a+b*x+c*x**2 "e.dat" via a,b,c
opt=-b/2/c; E_opt = a+b*opt+c*opt**2
print opt, E_opt # this will tell you the lattice parameter at the optimum
set xlabel "Lattice parameter (A)"; set ylabel "Energy (eV)"
plot "e.dat" w l t "Data", a+b*x+c*x**2 t "Fit"

I get [math]\displaystyle{ a_\text{opt} = 4.1536 \text{Å} }[/math] and [math]\displaystyle{ E_\text{opt} = -3.0448 \text{eV} }[/math], and the plot looks like this:

Tutorial4 01.png

Setting up the gold cluster

Now that we know what is the reference fcc lattice parameter and its energy, let's construct an icosahedral gold cluster and relax it. We use ASE for constructing the cluster. ASE has a lot of useful functions for constructing clusters, surfaces and other common atomic structures:

1 from ase.cluster import Icosahedron
2 from ase.io import write
3 
4 atoms = Icosahedron("Au", 8, 4.1536)
5 atoms.center(vacuum=10)
6 
7 write("ico.xyz", atoms)

In this case we built an icosahedron with 8 atomic layers and surrounded it by 10 Angstrom of vacuum in all directions.

After running the Python script, we will have an ico.xyz file with the unrelaxed gold cluster in it:

Tutorial4 02.png

We will now proceed to relax this cluster using turbogap md, but in this case not to perform molecular dynamics but to carry out a gradient descent geometry optimization. This is the needed input file:

atoms_file = "ico.xyz"
pot_file = "gap_files/aurum.gap"

species = Au
n_species = 1

optimize = "gd"
write_xyz = 1
md_nsteps = 1000

Run TurboGAP to relax the structure (this will take 1-2 minutes):

mpirun -np 4 turbogap md

In the trajectory_out.xyz file we can find the energy for this structure. Check the energy of the relaxed cluster, i.e., the last frame in the trajectory file. I get [math]\displaystyle{ E = -4085.948634 \,\text{eV} }[/math] for [math]\displaystyle{ N = 1415 }[/math] atoms. Therefore, the cohesive energy per atom is [math]\displaystyle{ e = -4085.948634/1415 \,\text{eV} + 3.0448 \,\text{eV} = 0.157 \,\text{eV} }[/math] versus fcc.