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

33 statements  

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

1import pytest 

2from ase import Atoms 

3from gpaw import GPAW 

4from gpaw.mixer import Mixer 

5from gpaw.test import gen 

6from gpaw.eigensolvers import CG 

7 

8 

9@pytest.mark.ofdft 

10@pytest.mark.libxc 

11def test_ofdft_ofdft_scale(in_tmp_dir): 

12 h = 0.18 

13 a = 10.0 

14 c = a / 2 

15 

16 elements = ['C'] 

17 results = [0.016] 

18 electrons = [6] 

19 lambda_coeff = 2.0 

20 xcname = '1.0_LDA_K_TF+1.0_LDA_X' 

21 

22 setups = {} 

23 for symbol in elements: 

24 g = gen(symbol, xcname=xcname, scalarrel=False, orbital_free=True, 

25 tw_coeff=lambda_coeff) 

26 setups[symbol] = g 

27 

28 for element, result, e in zip(elements, results, electrons): 

29 atom = Atoms(element, 

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

31 cell=(a, a, a)) 

32 

33 mixer = Mixer(0.3, 5, 1) 

34 eigensolver = CG(tw_coeff=lambda_coeff) 

35 calc = GPAW(mode='fd', 

36 h=h, 

37 xc=xcname, 

38 setups=setups, 

39 maxiter=240, 

40 mixer=mixer, eigensolver=eigensolver) 

41 

42 atom.calc = calc 

43 

44 E = atom.get_total_energy() 

45 n = calc.get_all_electron_density() 

46 

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

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

49 

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

51 assert result == pytest.approx(E, abs=1.0e-3)