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