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