Statistiques
| Révision :

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