Statistiques
| Révision :

root / ase / examples / COCu111.py @ 3

Historique | Voir | Annoter | Télécharger (1,87 ko)

1 1 tkerber
from math import sqrt
2 1 tkerber
from ase import Atoms, Atom
3 1 tkerber
from ase.constraints import FixAtoms
4 1 tkerber
from ase.optimize import QuasiNewton
5 1 tkerber
from ase.io import PickleTrajectory
6 1 tkerber
from ase.neb import NEB
7 1 tkerber
from ase.calculators.emt import EMT
8 1 tkerber
9 1 tkerber
# Distance between Cu atoms on a (111) surface:
10 1 tkerber
a = 3.6
11 1 tkerber
d = a / sqrt(2)
12 1 tkerber
y = d * sqrt(3) / 2
13 1 tkerber
fcc111 = Atoms('Cu',
14 1 tkerber
               cell=[(d, 0, 0),
15 1 tkerber
                     (d / 2, y, 0),
16 1 tkerber
                     (d / 2, y / 3, -a / sqrt(3))],
17 1 tkerber
               pbc=True)
18 1 tkerber
slab = fcc111 * (2, 2, 4)
19 1 tkerber
slab.set_cell([2 * d, 2 * y, 1])
20 1 tkerber
slab.set_pbc((1, 1, 0))
21 1 tkerber
slab.set_calculator(EMT())
22 1 tkerber
Z = slab.get_positions()[:, 2]
23 1 tkerber
indices = [i for i, z in enumerate(Z) if z < Z.mean()]
24 1 tkerber
constraint = FixAtoms(indices=indices)
25 1 tkerber
slab.set_constraint(constraint)
26 1 tkerber
dyn = QuasiNewton(slab)
27 1 tkerber
dyn.run(fmax=0.05)
28 1 tkerber
Z = slab.get_positions()[:, 2]
29 1 tkerber
print Z[0] - Z[1]
30 1 tkerber
print Z[1] - Z[2]
31 1 tkerber
print Z[2] - Z[3]
32 1 tkerber
33 1 tkerber
b = 1.2
34 1 tkerber
h = 2.0
35 1 tkerber
slab += Atom('C', (d, 2 * y / 3, h))
36 1 tkerber
slab += Atom('O', (3 * d / 2, y / 3, h))
37 1 tkerber
traj = PickleTrajectory('initial.traj', 'w', slab)
38 1 tkerber
dyn = QuasiNewton(slab)
39 1 tkerber
dyn.attach(traj.write)
40 1 tkerber
dyn.run(fmax=0.05)
41 1 tkerber
#view(slab)
42 1 tkerber
# Make band:
43 1 tkerber
images = [slab.copy() for i in range(6)]
44 1 tkerber
neb = NEB(images, climb=True)
45 1 tkerber
46 1 tkerber
# Set constraints and calculator:
47 1 tkerber
for image in images:
48 1 tkerber
    image.set_calculator(EMT())
49 1 tkerber
    image.set_constraint(constraint)
50 1 tkerber
51 1 tkerber
# Displace last image:
52 1 tkerber
images[-1].positions[-1] = (2 * d, 2 * y / 3, h)
53 1 tkerber
traj = PickleTrajectory('final.traj', 'w', images[-1])
54 1 tkerber
dyn = QuasiNewton(images[-1])
55 1 tkerber
dyn.attach(traj.write)
56 1 tkerber
dyn.run(fmax=0.05)
57 1 tkerber
58 1 tkerber
# Interpolate positions between initial and final states:
59 1 tkerber
neb.interpolate()
60 1 tkerber
61 1 tkerber
for image in images:
62 1 tkerber
    print image.positions[-1], image.get_potential_energy()
63 1 tkerber
64 1 tkerber
traj = PickleTrajectory('mep.traj', 'w')
65 1 tkerber
66 1 tkerber
#dyn = MDMin(neb, dt=0.4)
67 1 tkerber
#dyn = FIRE(neb, dt=0.4)
68 1 tkerber
dyn = QuasiNewton(neb)
69 1 tkerber
dyn.attach(neb.writer(traj))
70 1 tkerber
dyn.run(fmax=0.05)
71 1 tkerber
72 1 tkerber
for image in images:
73 1 tkerber
    print image.positions[-1], image.get_potential_energy()