Coverage for gpaw/test/eigen/test_davidson.py: 86%

28 statements  

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

1from ase import Atom, Atoms 

2from gpaw import GPAW 

3from gpaw.eigensolvers.davidson import Davidson 

4from gpaw.mpi import size 

5import pytest 

6 

7 

8def test_eigen_davidson(): 

9 a = 4.05 

10 d = a / 2**0.5 

11 bulk = Atoms([Atom('Al', (0, 0, 0)), 

12 Atom('Al', (0.5, 0.5, 0.5))], pbc=True) 

13 bulk.set_cell((d, d, a), scale_atoms=True) 

14 h = 0.25 

15 base_params = dict( 

16 mode='fd', 

17 h=h, 

18 nbands=2 * 8, 

19 kpts=(2, 2, 2)) 

20 base_convergence = {'eigenstates': 7.2e-9, 'energy': 1e-5} 

21 calc = GPAW(**base_params, convergence=base_convergence) 

22 bulk.calc = calc 

23 e0 = bulk.get_potential_energy() 

24 calc = GPAW(**base_params, 

25 convergence={**base_convergence, 'bands': 5}, 

26 eigensolver='dav') 

27 bulk.calc = calc 

28 e1 = bulk.get_potential_energy() 

29 assert e0 == pytest.approx(e1, abs=5.0e-5) 

30 

31 energy_tolerance = 0.0004 

32 assert e0 == pytest.approx(-6.97626, abs=energy_tolerance) 

33 assert e1 == pytest.approx(-6.976265, abs=energy_tolerance) 

34 

35 # band parallelization 

36 if size % 2 == 0: 

37 calc = GPAW(**base_params, 

38 convergence={**base_convergence, 'bands': 5}, 

39 parallel={'band': 2}, 

40 eigensolver=Davidson(niter=3)) 

41 bulk.calc = calc 

42 e3 = bulk.get_potential_energy() 

43 assert e0 == pytest.approx(e3, abs=5.0e-5)