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
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
1import pytest
3from ase.build import bulk
4from ase.parallel import world
5from gpaw import GPAW, FermiDirac, PW
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
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]
25 atoms1 = atoms.copy()
26 atoms2 = atoms.copy()
28 atoms1.calc = get_calculator(sl_auto=True, kpoint_gamma=kpoint_gamma)
29 atoms2.calc = get_calculator(sl_auto=False, kpoint_gamma=kpoint_gamma)
31 e1 = atoms1.get_potential_energy()
32 e2 = atoms2.get_potential_energy()
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)
38 assert eigvals1 == pytest.approx(eigvals2, rel=1e-11)
40 assert e1 == pytest.approx(e2, rel=1e-11)