Coverage for gpaw/test/exx/test_exx.py: 100%

32 statements  

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

1"""Test EXX/HFT implementation.""" 

2import pytest 

3from ase import Atoms 

4from gpaw import GPAW 

5from gpaw.xc import XC 

6from gpaw.xc.hybrid import HybridXC 

7 

8 

9def xc1(name): 

10 return dict(name=name, stencil=1) 

11 

12 

13@pytest.mark.slow 

14@pytest.mark.libxc 

15@pytest.mark.hybrids 

16def test_exx_exx(in_tmp_dir): 

17 be2 = Atoms('Be2', [(0, 0, 0), (2.45, 0, 0)]) 

18 be2.center(vacuum=2.0) 

19 

20 ref_1871 = { # Values from revision 1871. Not true reference values 

21 # xc Energy eigenvalue 0 eigenvalue 1 

22 'PBE': (5.424066548470926, -3.84092, -0.96192), 

23 'PBE0': (-790.919942, -4.92321, -1.62948), 

24 'EXX': (-785.5837828306236, -7.16802337336, -2.72602997017)} 

25 

26 current = {} # Current revision 

27 for xc in [XC(xc1('PBE')), 

28 HybridXC('PBE0', stencil=1, finegrid=True), 

29 HybridXC('EXX', stencil=1, finegrid=True), 

30 XC(xc1('PBE'))]: # , 'oldPBE', 'LDA']: 

31 # Generate setup 

32 # g = Generator('Be', setup, scalarrel=True, nofiles=True, txt=None) 

33 # g.run(exx=True, **parameters['Be']) 

34 

35 # switch to new xc functional 

36 calc = GPAW(mode='fd', 

37 xc=xc, 

38 h=0.21, 

39 eigensolver='rmm-diis', 

40 nbands=3, 

41 convergence={'eigenstates': 1e-6}, 

42 txt='exx.txt') 

43 be2.calc = calc 

44 E = be2.get_potential_energy() 

45 if xc.name != 'PBE': 

46 E += calc.get_reference_energy() 

47 bands = calc.get_eigenvalues()[:2] # not 3 as unocc. eig are random!? 

48 res = (E,) + tuple(bands) 

49 print(xc.name, res) 

50 

51 if xc.name in current: 

52 for first, second in zip(current[xc.name], res): 

53 assert first == pytest.approx(second, abs=2.5e-3) 

54 else: 

55 current[xc.name] = res 

56 

57 for name in current: 

58 for ref, cur in zip(ref_1871[name], current[name]): 

59 print(ref, cur, ref - cur) 

60 assert ref == pytest.approx(cur, abs=2.9e-3)