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
« 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
9def xc1(name):
10 return dict(name=name, stencil=1)
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)
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)}
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'])
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)
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
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)