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

39 statements  

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

1from math import sqrt 

2import pytest 

3from ase import Atoms 

4from gpaw import GPAW, Mixer, Davidson 

5from gpaw.xc.vdw import VDWFunctional 

6 

7 

8@pytest.mark.slow 

9@pytest.mark.libxc 

10def test_vdw_ar2(in_tmp_dir): 

11 energy_tolerance = 0.002 

12 

13 def test(): 

14 vdw = VDWFunctional('vdW-DF', verbose=1) 

15 d = 3.9 

16 x = d / sqrt(3) 

17 L = 3.0 + 2 * 4.0 

18 dimer = Atoms('Ar2', [(0, 0, 0), (x, x, x)], cell=(L, L, L)) 

19 dimer.center() 

20 calc = GPAW(mode='fd', h=0.2, xc=dict(name='revPBE', stencil=1), 

21 mixer=Mixer(0.8, 7, 50.0), 

22 eigensolver=Davidson(5)) 

23 dimer.calc = calc 

24 e2 = dimer.get_potential_energy() 

25 calc.write('Ar2.gpw') 

26 e2vdw = calc.get_xc_difference(vdw) 

27 e2vdwb = GPAW('Ar2.gpw').get_xc_difference(vdw) 

28 print(e2vdwb - e2vdw) 

29 assert abs(e2vdwb - e2vdw) < 1e-9 

30 if 0: 

31 # See ASE issue !1466 

32 del dimer[1] 

33 else: 

34 dimer.calc = None 

35 del dimer[1] 

36 dimer.calc = calc 

37 e = dimer.get_potential_energy() 

38 evdw = calc.get_xc_difference(vdw) 

39 

40 E = 2 * e - e2 

41 Evdw = E + 2 * evdw - e2vdw 

42 print(E, Evdw) 

43 assert abs(E - -0.0048) < 6e-4, abs(E) 

44 assert abs(Evdw - +0.0223) < 3e-3, abs(Evdw) 

45 

46 print(e2, e) 

47 assert e2 == pytest.approx(-0.005, abs=energy_tolerance) 

48 assert e == pytest.approx(-0.005, abs=energy_tolerance) 

49 

50 test()