Coverage for gpaw/test/ase_features/autoneb.py: 20%
46 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
1# Run with even number of cores
3import pytest
4from gpaw import GPAW, Mixer, PoissonSolver
5import ase.parallel as mpi
6from ase.build import fcc211, add_adsorbate
7from ase.constraints import FixAtoms
8from ase.optimize import QuasiNewton
9from ase.autoneb import AutoNEB
12@pytest.mark.skip(reason='TODO')
13def test_autoneb():
14 from ase.mep.neb import NEBTools
15 size = mpi.world.size
16 rank = mpi.world.rank
18 slab = fcc211('Ag', size=(3, 2, 1), vacuum=3.0)
19 add_adsorbate(slab, 'Ag', 0.5, (-0.1, 2.7))
21 slab.set_constraint(FixAtoms(range(6)))
22 slab.pbc = 1
24 def getcalc(**kwargs):
25 kwargs1 = dict(xc='oldLDA',
26 gpts=(32, 24, 32),
27 setups={'Ag': '11'},
28 # h=0.24,
29 poissonsolver=PoissonSolver(relax='GS'),
30 mixer=Mixer(0.5, 5, 50.0),
31 mode='lcao',
32 basis='sz(dzp)')
33 kwargs1.update(kwargs)
34 return GPAW(**kwargs1)
36 calc = getcalc()
38 slab.calc = calc
40 qn = QuasiNewton(slab, trajectory='neb000.traj')
41 qn.run(fmax=0.05)
43 slab[-1].x += slab.get_cell()[0, 0]
44 slab[-1].y += 2.8
46 qn = QuasiNewton(slab, trajectory='neb001.traj')
47 qn.run(fmax=0.05)
49 def attach_calculators(images):
50 nim = len(images)
51 n = size // nim # number of cpu's per image
52 j = rank // n # image number
53 assert nim * n == size
55 for i in range(nim):
56 ranks = range(i * n, (i + 1) * n)
57 if rank in ranks:
58 calc = getcalc(txt='neb%d.txt' % j,
59 communicator=ranks)
60 images[i].calc = calc
62 autoneb = AutoNEB(attach_calculators,
63 prefix='neb',
64 n_simul=2,
65 parallel=True,
66 climb=True,
67 n_max=5,
68 optimizer='FIRE',
69 fmax=0.05,
70 k=0.5,
71 maxsteps=[25, 1000])
72 autoneb.run()
74 nebtools = NEBTools(autoneb.all_images)
75 barrier, delta_e = nebtools.get_barrier()
76 print('barrier', barrier)
77 ref = 0.74051020956857272 # 1.484 <- with better parameters
78 err = abs(barrier - ref)
79 assert err < 1e-3, 'barrier={}, expected={}, err={}'.format(barrier,
80 ref, err)