This section is related to the geometry optimization section. To run a geometry optimization calculation, the slab needs to be defined in the script. Some examples of defining metal and metal oxide surfaces are given here.
This first example is a complete geometry optimization script. To set up a different slab, the part defining the slab (line 14) should be modified.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#!/usr/bin/python from ase import Atoms from ase.calculators.vasp import Vasp from ase.constraints import FixAtoms from ase.optimize import QuasiNewton from ase.lattice.surface import hcp0001 from ase.io import write,read #A simple Ru(0001) surface. Surface element, size and #vacuum are specified in the parentheses #define slab slab = hcp0001('Ru', size=(3,3,2), vacuum=10) #define adsorbate molecule = Atoms('CO', [(0., 0., 0.), (0., 0., 1.16)]) #add adsorbate to the surface add_adsorbate(slab, molecule, 1.7, ‘hcp’) #read in the input file fName = 'input.xyz' slab = read(fName) #set slab coordinates from input file slab.set_positions(slab.get_positions()) #set up calculator calc = Vasp(xc='PBE',lreal='Auto',kpts=[2,2,1], ismear=1,sigma=0.2,algo='fast',istart=0,npar=8) slab.set_calculator(calc) #freeze all layers below top layer mask = [atom.tag > 1 for atom in slab] slab.set_constraint(FixAtoms(mask=mask)) #run optimization dyn = QuasiNewton(slab, trajectory='CO-Ru.traj') dyn.run(fmax=0.05) #(eV/A) #write output write('outPut.xyz', slab) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#CeO2(111) surface #Lattice constant a = 5.46745036711 #Coordinates of the unit-cell atoms in fractional #coordinates (the fractional coordinates can be #found in the link given in external link section) CeO2 = Atoms([ Atom('Ce', (0., 0., 0.)), Atom('Ce', (0., 0.5, 0.5)), Atom('Ce', (0.5, 0., 0.5)), Atom('Ce', (0.5, 0.5, 0.)), Atom('O', (0.75, 0.25, 0.25)), Atom('O', (0.25, 0.75, 0.75)), Atom('O', (0.75, 0.75, 0.75)), Atom('O', (0.25, 0.25, 0.25)), Atom('O', (0.25, 0.25, 0.75)), Atom('O', (0.75, 0.75, 0.25)), Atom('O', (0.25, 0.75, 0.25)), Atom('O', (0.75, 0.25, 0.75)) ]) #Defining lattice size in a, b and c directions. #In this case, they are all equal. cell = [(a, 0., 0.), (0., a, 0.), (0., 0., a)] #Scales the atomic positions with the unit cell CeO2.set_cell(cell, scale_atoms=True) #(1,1,1) is the slab type. There are 2 unit cells along #z direction slab = surface(CeO2, (1, 1, 1), 2) #Repeating the slab 2 unit cells in x and 1 unit cell #in y directions slab = slab.repeat((2,1,1)) slab.center(vacuum=10, axis=2) |
1 2 3 4 5 |
#Building a gold surface with one of the atoms replaced #by Pd slab = fcc111('Au', size=(3,3,4), vacuum=10) slab.set_chemical_symbols('AuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuAuPdAuAuAuAu') |