root / ase / examples / neb1.py @ 3
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) |