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
« 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
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)
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)
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)