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