Statistiques
| Révision :

root / ase / test / COCu111.py @ 1

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

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