Statistiques
| Révision :

root / ase / test / COCu111_2.py @ 1

Historique | Voir | Annoter | Télécharger (1,82 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 FIRE, QuasiNewton
5 1 tkerber
from ase.neb import SingleCalculatorNEB
6 1 tkerber
from ase.calculators.emt import EMT
7 1 tkerber
8 1 tkerber
Optimizer=FIRE
9 1 tkerber
Optimizer=QuasiNewton
10 1 tkerber
11 1 tkerber
# Distance between Cu atoms on a (111) surface:
12 1 tkerber
a = 3.6
13 1 tkerber
d = a / sqrt(2)
14 1 tkerber
fcc111 = Atoms(symbols='Cu',
15 1 tkerber
               cell=[(d, 0, 0),
16 1 tkerber
                     (d / 2, d * sqrt(3) / 2, 0),
17 1 tkerber
                     (d / 2, d * sqrt(3) / 6, -a / sqrt(3))],
18 1 tkerber
               pbc=True)
19 1 tkerber
initial = fcc111 * (2, 2, 4)
20 1 tkerber
initial.set_cell([2 * d, d * sqrt(3), 1])
21 1 tkerber
initial.set_pbc((1, 1, 0))
22 1 tkerber
initial.set_calculator(EMT())
23 1 tkerber
Z = initial.get_positions()[:, 2]
24 1 tkerber
indices = [i for i, z in enumerate(Z) if z < Z.mean()]
25 1 tkerber
constraint = FixAtoms(indices=indices)
26 1 tkerber
initial.set_constraint(constraint)
27 1 tkerber
dyn = Optimizer(initial)
28 1 tkerber
dyn.run(fmax=0.05)
29 1 tkerber
Z = initial.get_positions()[:, 2]
30 1 tkerber
print Z[0] - Z[1]
31 1 tkerber
print Z[1] - Z[2]
32 1 tkerber
print Z[2] - Z[3]
33 1 tkerber
34 1 tkerber
b = 1.2
35 1 tkerber
h = 1.5
36 1 tkerber
initial += Atom('C', (d / 2, -b / 2, h))
37 1 tkerber
initial += Atom('O', (d / 2, +b / 2, h))
38 1 tkerber
s = initial.copy()
39 1 tkerber
dyn = Optimizer(initial)
40 1 tkerber
dyn.run(fmax=0.05)
41 1 tkerber
#view(initial)
42 1 tkerber
43 1 tkerber
# create final
44 1 tkerber
final = initial.copy()
45 1 tkerber
final.set_calculator(EMT())
46 1 tkerber
final.set_constraint(constraint)
47 1 tkerber
final[-2].position = final[-1].position
48 1 tkerber
final[-1].x = d
49 1 tkerber
final[-1].y = d / sqrt(3)
50 1 tkerber
dyn = Optimizer(final)
51 1 tkerber
dyn.run(fmax=0.1)
52 1 tkerber
#view(final)
53 1 tkerber
54 1 tkerber
# create 2 intermediate step neb
55 1 tkerber
neb = SingleCalculatorNEB([initial, final])
56 1 tkerber
neb.refine(2)
57 1 tkerber
neb.set_calculators(EMT())
58 1 tkerber
assert(neb.n() == 4)
59 1 tkerber
60 1 tkerber
dyn = Optimizer(neb, maxstep=0.04, trajectory='mep_2coarse.traj')
61 1 tkerber
dyn.run(fmax=0.1)
62 1 tkerber
#dyn.run(fmax=39.1)
63 1 tkerber
64 1 tkerber
# read from the trajectory
65 1 tkerber
neb = SingleCalculatorNEB('mep_2coarse.traj@-4:')
66 1 tkerber
67 1 tkerber
# refine in the important region
68 1 tkerber
neb.refine(2, 1, 3)
69 1 tkerber
neb.set_calculators(EMT())
70 1 tkerber
dyn = Optimizer(neb, maxstep=0.04, trajectory='mep_2fine.traj')
71 1 tkerber
dyn.run(fmax=0.1)
72 1 tkerber
assert(len(neb.images) == 8)