Coverage for gpaw/test/xc/test_nonselfconsistent.py: 100%

30 statements  

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

1from ase import Atoms 

2from ase.units import Bohr 

3from gpaw import GPAW 

4import pytest 

5 

6 

7def xc(name): 

8 return {'name': name, 'stencil': 1} 

9 

10 

11def test_xc_nonselfconsistent(in_tmp_dir): 

12 a = 7.5 * Bohr 

13 n = 16 

14 atoms = Atoms('He', [(0.0, 0.0, 0.0)], cell=(a, a, a), pbc=True) 

15 params = dict(mode='fd', gpts=(n, n, n), nbands=1) 

16 atoms.calc = GPAW(**params, xc=xc('PBE')) 

17 e1 = atoms.get_potential_energy() 

18 e1ref = atoms.calc.get_reference_energy() 

19 de12 = atoms.calc.get_xc_difference(xc('revPBE')) 

20 atoms.calc = GPAW(**params, xc=xc('revPBE')) 

21 e2 = atoms.get_potential_energy() 

22 e2ref = atoms.calc.get_reference_energy() 

23 de21 = atoms.calc.get_xc_difference(xc('PBE')) 

24 print(e1ref + e1 + de12 - (e2ref + e2)) 

25 print(e1ref + e1 - (e2ref + e2 + de21)) 

26 print(de12, de21) 

27 assert e1ref + e1 + de12 == pytest.approx(e2ref + e2, abs=8e-4) 

28 assert e1ref + e1 == pytest.approx(e2ref + e2 + de21, abs=3e-3) 

29 

30 atoms.calc.write('revPBE.gpw') 

31 

32 de21b = GPAW('revPBE.gpw').get_xc_difference(xc('PBE')) 

33 assert de21 == pytest.approx(de21b, abs=9e-8) 

34 

35 energy_tolerance = 0.0005 

36 assert e1 == pytest.approx(-0.07904951, abs=energy_tolerance) 

37 assert e2 == pytest.approx(-0.08147563, abs=energy_tolerance)