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

1# Run with even number of cores 

2 

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 

10 

11 

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 

17 

18 slab = fcc211('Ag', size=(3, 2, 1), vacuum=3.0) 

19 add_adsorbate(slab, 'Ag', 0.5, (-0.1, 2.7)) 

20 

21 slab.set_constraint(FixAtoms(range(6))) 

22 slab.pbc = 1 

23 

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) 

35 

36 calc = getcalc() 

37 

38 slab.calc = calc 

39 

40 qn = QuasiNewton(slab, trajectory='neb000.traj') 

41 qn.run(fmax=0.05) 

42 

43 slab[-1].x += slab.get_cell()[0, 0] 

44 slab[-1].y += 2.8 

45 

46 qn = QuasiNewton(slab, trajectory='neb001.traj') 

47 qn.run(fmax=0.05) 

48 

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 

54 

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 

61 

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() 

73 

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)