Coverage for gpaw/test/parallel/test_davidson_scalapack.py: 100%

21 statements  

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

1import pytest 

2 

3from ase.build import bulk 

4from ase.parallel import world 

5from gpaw import GPAW, FermiDirac, PW 

6 

7 

8def get_calculator(sl_auto, kpoint_gamma): 

9 calculator = GPAW( 

10 mode=PW(100), 

11 nbands='400%', 

12 basis='szp(dzp)', 

13 occupations=FermiDirac(0.1), 

14 parallel={'sl_auto': sl_auto, 'band': 2 if world.size == 8 else 1}, 

15 kpts=[1, 1, 1] if kpoint_gamma else [1, 1, 2], 

16 symmetry='off', 

17 convergence={'maximum iterations': 1}) 

18 return calculator 

19 

20 

21@pytest.mark.parametrize('kpoint_gamma', [True, False]) 

22def test_davidson_scalapack_eigenvalues(scalapack, kpoint_gamma): 

23 atoms = bulk('Si', cubic=True) * [2, 1, 1] 

24 

25 atoms1 = atoms.copy() 

26 atoms2 = atoms.copy() 

27 

28 atoms1.calc = get_calculator(sl_auto=True, kpoint_gamma=kpoint_gamma) 

29 atoms2.calc = get_calculator(sl_auto=False, kpoint_gamma=kpoint_gamma) 

30 

31 e1 = atoms1.get_potential_energy() 

32 e2 = atoms2.get_potential_energy() 

33 

34 for n, kpoint in enumerate(atoms1.calc.get_bz_k_points()): 

35 eigvals1 = atoms1.calc.get_eigenvalues(kpt=n, spin=0) 

36 eigvals2 = atoms2.calc.get_eigenvalues(kpt=n, spin=0) 

37 

38 assert eigvals1 == pytest.approx(eigvals2, rel=1e-11) 

39 

40 assert e1 == pytest.approx(e2, rel=1e-11)