File: test_dimer_method.py

package info (click to toggle)
python-ase 3.21.1-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 13,936 kB
  • sloc: python: 122,428; xml: 946; makefile: 111; javascript: 47
file content (41 lines) | stat: -rw-r--r-- 1,460 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from ase.build import fcc100, add_adsorbate
from ase.constraints import FixAtoms
from ase.calculators.emt import EMT
from ase.dimer import DimerControl, MinModeAtoms, MinModeTranslate


def test_dimer_method():
    # Set up a small "slab" with an adatoms
    atoms = fcc100('Pt', size=(2, 2, 1), vacuum=10.0)
    add_adsorbate(atoms, 'Pt', 1.611, 'hollow')

    # Freeze the "slab"
    mask = [atom.tag > 0 for atom in atoms]
    atoms.set_constraint(FixAtoms(mask=mask))

    # Calculate using EMT
    atoms.calc = EMT()
    atoms.get_potential_energy()

    # Set up the dimer
    d_control = DimerControl(initial_eigenmode_method='displacement',
                             displacement_method='vector', logfile=None,
                             mask=[0, 0, 0, 0, 1])
    d_atoms = MinModeAtoms(atoms, d_control)

    # Displace the atoms
    displacement_vector = [[0.0] * 3] * 5
    displacement_vector[-1][1] = -0.1
    d_atoms.displace(displacement_vector=displacement_vector)

    # Converge to a saddle point
    dim_rlx = MinModeTranslate(d_atoms, trajectory='dimer_method.traj',
                               logfile=None)
    dim_rlx.run(fmax=0.001)

    # Test the results
    tolerance = 1e-3
    assert(d_atoms.get_barrier_energy() - 1.03733136918 < tolerance)
    assert(abs(d_atoms.get_curvature() + 0.900467048707) < tolerance)
    assert(d_atoms.get_eigenmode()[-1][1] < -0.99)
    assert(abs(d_atoms.get_positions()[-1][1]) < tolerance)