File: test_COCu111_2.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 (90 lines) | stat: -rw-r--r-- 2,760 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import pytest
from math import sqrt

from ase import Atoms, Atom, io
from ase.calculators.emt import EMT
from ase.constraints import FixAtoms
from ase.neb import NEB
from ase.optimize import BFGS


# XXXXXXXX this is mostly a copy of COCu111 !!!  Grrrr!


@pytest.mark.slow
def test_COCu111_2():
    logfile = "-"  # supresses

    Optimizer = BFGS

    # Distance between Cu atoms on a (111) surface:
    a = 3.6
    d = a / sqrt(2)
    fcc111 = Atoms(symbols='Cu',
                   cell=[(d, 0, 0),
                         (d / 2, d * sqrt(3) / 2, 0),
                         (d / 2, d * sqrt(3) / 6, -a / sqrt(3))],
                   pbc=True)
    initial = fcc111 * (2, 2, 4)
    initial.set_cell([2 * d, d * sqrt(3), 1])
    initial.set_pbc((1, 1, 0))
    initial.calc = EMT()
    Z = initial.get_positions()[:, 2]
    indices = [i for i, z in enumerate(Z) if z < Z.mean()]
    constraint = FixAtoms(indices=indices)
    initial.set_constraint(constraint)

    dyn = Optimizer(initial, logfile=logfile)
    dyn.run(fmax=0.05)

    # relax initial image
    b = 1.2
    h = 1.5
    initial += Atom('C', (d / 2, -b / 2, h))
    initial += Atom('O', (d / 2, +b / 2, h))
    dyn = Optimizer(initial, logfile=logfile)
    dyn.run(fmax=0.05)

    # relax final image
    final = initial.copy()
    final.calc = EMT()
    final.set_constraint(constraint)
    final[-2].position = final[-1].position
    final[-1].x = d
    final[-1].y = d / sqrt(3)
    dyn = Optimizer(final, logfile=logfile)
    dyn.run(fmax=0.1)
    # view(final)

    # Create neb with 2 intermediate steps
    neb = NEB([initial, initial.copy(), initial.copy(), final],
              allow_shared_calculator=True)
    # refine() removed, not implemented any more
    neb.interpolate()

    # Optimize neb using a single calculator
    neb.set_calculators(EMT())
    # refine() removed, not implemented any more
    dyn = Optimizer(neb, maxstep=0.04, trajectory='mep_2coarse.traj',
                    logfile=logfile)
    dyn.run(fmax=0.1)

    # Optimize neb using a many calculators
    neb = NEB([initial, initial.copy(), initial.copy(), final])
    neb.interpolate()
    neb.set_calculators([EMT() for _ in range(neb.nimages)])
    dyn = Optimizer(neb, maxstep=0.04, trajectory='mep_2coarse.traj',
                    logfile=logfile)
    dyn.run(fmax=0.1)

    # read from the trajectory
    neb = NEB(io.read('mep_2coarse.traj', index='-4:'),
              allow_shared_calculator=True)

    # refine() removed, not implemented any more
    neb.set_calculators(EMT())
    # Optimize refined neb using a single calculator
    dyn = Optimizer(neb, maxstep=0.04, trajectory='mep_2fine.traj',
                    logfile=logfile)
    dyn.run(fmax=0.1)
    assert len(neb.images) == 4