Coverage for gpaw/test/vdw/test_libvdwxc_h2.py: 100%

38 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2025-07-14 00:18 +0000

1import pytest 

2from gpaw.utilities import compiled_with_libvdwxc 

3from ase.build import molecule 

4from gpaw import GPAW, Mixer, Davidson, PW 

5from gpaw.xc.libvdwxc import vdw_df 

6from gpaw.mpi import world 

7 

8pytestmark = pytest.mark.skipif(not compiled_with_libvdwxc(), 

9 reason='not compiled_with_libvdwxc()') 

10 

11 

12@pytest.mark.old_gpaw_only 

13def test_vdw_libvdwxc_h2(in_tmp_dir): 

14 system = molecule('H2') 

15 system.center(vacuum=1.0) 

16 system.pbc = 1 

17 

18 def calculate(mode, kwargs1): 

19 kwargs = dict(mode=mode, 

20 basis='sz(dzp)', 

21 eigensolver=Davidson(4) if mode != 'lcao' else None, 

22 xc=vdw_df(), 

23 h=0.25, 

24 convergence=dict(energy=1e-6), 

25 mixer=Mixer(0.5, 5, 10.)) 

26 kwargs.update(kwargs1) 

27 calc = GPAW(**kwargs) 

28 system.calc = calc 

29 system.get_potential_energy() 

30 return calc 

31 

32 fddomainpar = min(2, world.size) 

33 

34 for mode in ['fd', 'pw', 'lcao']: 

35 kwargs = {} 

36 if mode == 'pw': 

37 kwargs['mode'] = PW(250) 

38 else: 

39 kwargs['parallel'] = {'domain': fddomainpar} 

40 calc = calculate(mode, kwargs) 

41 

42 E1 = calc.get_potential_energy() 

43 calc.write('dump.libvdwxc.gpw') 

44 _ = GPAW('dump.libvdwxc.gpw', txt='restart.txt', 

45 parallel={'domain': fddomainpar}) 

46 system2 = calc.get_atoms() 

47 

48 # Verify same energy after restart 

49 E2 = system2.get_potential_energy() 

50 assert abs(E2 - E1) < 1e-14 # Should be exact 

51 

52 # Trigger recaclulation of essentially same system 

53 system2.positions[0, 0] += 1e-13 

54 print('reconverge') 

55 E3 = system2.get_potential_energy() 

56 err2 = abs(E3 - E2) 

57 print('error', err2) 

58 assert err2 < 1e-6 # Around SCF precision