Coverage for gpaw/test/new/test_hybrid.py: 89%

45 statements  

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

1import pytest 

2from ase import Atoms 

3from gpaw import GPAW 

4from gpaw.mpi import size 

5import numpy as np 

6 

7 

8def test_pawexxvv(): 

9 from gpaw.hybrids.paw import python_pawexxvv 

10 from _gpaw import pawexxvv 

11 for i in range(20): 

12 D_ii = np.random.rand(i, i) 

13 p = i * (i + 1) // 2 

14 M_pp = np.random.rand(p, p) 

15 V_ii = python_pawexxvv(M_pp, D_ii) 

16 V2_ii = pawexxvv(M_pp, D_ii) 

17 assert np.allclose(V_ii, V2_ii) 

18 

19 

20@pytest.mark.parametrize('ccirs', [False, True]) 

21def test_hse06(gpaw_new, ccirs): 

22 if gpaw_new and size > 4: 

23 pytest.skip('Only band-parallelization!') 

24 if gpaw_new: 

25 experimental = {'ccirs': ccirs} 

26 # Low max_buffer_mem to test that this value is overwritten due to 

27 # the non band-local hybrid-xc hamiltonian. 

28 eigensolver = {'name': 'dav', 

29 'max_buffer_mem': 1024 * 4} 

30 else: 

31 eigensolver = 'dav' 

32 experimental = {} 

33 if ccirs: 

34 pytest.skip('CCIRS only for new GPAW') 

35 atoms = Atoms('Li2', [[0, 0, 0], [0, 0, 2.0]]) 

36 atoms.center(vacuum=2.5) 

37 atoms.calc = GPAW(mode=dict(name='pw', force_complex_dtype=not True), 

38 xc='HSE06', 

39 experimental=experimental, 

40 eigensolver=eigensolver, 

41 nbands=4) 

42 e = atoms.get_potential_energy() 

43 eigs = atoms.calc.get_eigenvalues(spin=0) 

44 assert e == pytest.approx(-5.633278, abs=1e-3) 

45 assert eigs[0] == pytest.approx(-4.67477532, abs=1e-3) 

46 

47 

48def test_h(gpaw_new): 

49 if gpaw_new and size > 2: 

50 pytest.skip('Only band-parallelization!') 

51 atoms = Atoms('H', magmoms=[1]) 

52 atoms.center(vacuum=2.5) 

53 atoms.calc = GPAW(mode='pw', 

54 xc='HSE06', 

55 eigensolver='dav', 

56 nbands=2, 

57 convergence={'energy': 1e-4}) 

58 e = atoms.get_potential_energy() 

59 eigs = atoms.calc.get_eigenvalues(spin=0) 

60 assert e == pytest.approx(-1.703969, abs=4e-3) 

61 assert eigs[0] == pytest.approx(-9.71440, abs=1e-3) 

62 

63 

64if __name__ == '__main__': 

65 test_hse06(1, True)