Coverage for gpaw/test/ofdft/test_ofdft.py: 100%

30 statements  

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

1import pytest 

2from ase import Atoms 

3from gpaw import GPAW 

4from gpaw.mixer import Mixer 

5from gpaw.test import gen 

6 

7 

8@pytest.mark.ofdft 

9@pytest.mark.libxc 

10def test_ofdft_ofdft(in_tmp_dir): 

11 a = 6.0 

12 c = a / 2 

13 # d = 1.8 

14 

15 elements = ['C', 'Be'] 

16 results = [0.243, 9.9773] 

17 electrons = [6, 3] 

18 charges = [0, 1] 

19 xcname = '1.0_LDA_K_TF+1.0_LDA_X' 

20 

21 setups = {} 

22 for symbol in elements: 

23 s = gen(symbol, xcname=xcname, scalarrel=False, orbital_free=True, 

24 gpernode=75) 

25 setups[symbol] = s 

26 

27 for element, result, e, charge in zip(elements, 

28 results, 

29 electrons, 

30 charges): 

31 atom = Atoms(element, 

32 positions=[(c, c, c)], 

33 cell=(a, a, a)) 

34 

35 mixer = Mixer(0.3, 5, 1) 

36 calc = GPAW(mode='fd', 

37 gpts=(32, 32, 32), 

38 txt='-', 

39 xc=xcname, 

40 setups=setups, 

41 eigensolver='cg', mixer=mixer, charge=charge) 

42 

43 atom.calc = calc 

44 

45 E = atom.get_total_energy() 

46 n = calc.get_all_electron_density() 

47 

48 dv = atom.get_volume() / calc.get_number_of_grid_points().prod() 

49 I = n.sum() * dv / 2**3 

50 

51 assert I == pytest.approx(e, abs=1.0e-6) 

52 assert result == pytest.approx(E, abs=1.0e-2)