Statistiques
| Révision :

root / ase / examples / neb1.py @ 1

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

1 1 tkerber
from ase import *
2 1 tkerber
from math import sqrt
3 1 tkerber
4 1 tkerber
a = 4.0614
5 1 tkerber
b = a / sqrt(2)
6 1 tkerber
h = b / 2
7 1 tkerber
initial = Atoms([Atom('Al', (0, 0, 0)),
8 1 tkerber
                 Atom('Al', (a / 2, b / 2, -h))],
9 1 tkerber
                pbc=(1, 1, 0),
10 1 tkerber
                cell=(a, b, 2 * h))
11 1 tkerber
initial *= (2, 2, 2)
12 1 tkerber
initial.append(Atom('Al', (a / 2, b / 2, 3 * h)))
13 1 tkerber
14 1 tkerber
#view(initial)
15 1 tkerber
16 1 tkerber
#initial.set_cell((2*2,2*b,)
17 1 tkerber
final = initial.copy()
18 1 tkerber
final.positions[-1, 1] += b
19 1 tkerber
20 1 tkerber
# Construct a list of images:
21 1 tkerber
images = [initial]
22 1 tkerber
for i in range(5):
23 1 tkerber
    images.append(initial.copy())
24 1 tkerber
images.append(final)
25 1 tkerber
26 1 tkerber
# Make a mask of zeros and ones that select the dynamic atoms (the
27 1 tkerber
# three topmost layers):
28 1 tkerber
mask = initial.positions[:, 2] < 0.5 * h
29 1 tkerber
constraint = FixAtoms(mask=mask)
30 1 tkerber
print mask
31 1 tkerber
print 'Fixed atoms:', constraint.fixed
32 1 tkerber
33 1 tkerber
for image in images:
34 1 tkerber
    # Let all images use an EMT calculator:
35 1 tkerber
    image.set_calculator(EMT())
36 1 tkerber
    image.set_constraint(constraint)
37 1 tkerber
38 1 tkerber
# Relax the initial and final states:
39 1 tkerber
QuasiNewton(initial).run(fmax=0.05)
40 1 tkerber
QuasiNewton(final).run(fmax=0.05)
41 1 tkerber
42 1 tkerber
# Create a Nudged Elastic Band:
43 1 tkerber
neb = NEB(images)
44 1 tkerber
45 1 tkerber
# Mak a starting guess for the minimum energy path (a straight line
46 1 tkerber
# from the initial to the final state):
47 1 tkerber
neb.interpolate()
48 1 tkerber
49 1 tkerber
# Use MDMin to relax the path:
50 1 tkerber
minimizer = QuasiNewton(neb)
51 1 tkerber
minimizer.run(fmax=0.05)
52 1 tkerber
53 1 tkerber
# Write the path to a trajectory:
54 1 tkerber
traj = PickleTrajectory('jump1.traj', 'w')
55 1 tkerber
neb.write(traj)