Coverage for gpaw/test/lcao/test_lcao_hamiltonian.py: 100%

30 statements  

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

1import numpy as np 

2import pytest 

3from ase import Atoms 

4 

5from gpaw import GPAW, restart 

6from gpaw.atom.basis import BasisMaker 

7from gpaw.lcao.tools import get_lcao_hamiltonian 

8from gpaw.mpi import world 

9 

10 

11def test_lcao_lcao_hamiltonian(in_tmp_dir, add_cwd_to_setup_paths): 

12 if world.rank == 0: 

13 basis = BasisMaker.from_symbol('Li').generate(1, 1) 

14 basis.write_xml() 

15 world.barrier() 

16 

17 if 1: 

18 a = 2.7 

19 bulk = Atoms('Li', pbc=True, cell=[a, a, a]) 

20 calc = GPAW(gpts=(8, 8, 8), kpts=(4, 4, 4), mode='lcao', basis='szp') 

21 bulk.calc = calc 

22 e = bulk.get_potential_energy() 

23 niter = calc.get_number_of_iterations() 

24 calc.write('temp.gpw') 

25 

26 atoms, calc = restart('temp.gpw') 

27 H_skMM, S_kMM = get_lcao_hamiltonian(calc) 

28 eigs = calc.get_eigenvalues(kpt=2) 

29 

30 if world.rank == 0: 

31 eigs2 = sorted(np.linalg.eigvals(np.linalg.solve(S_kMM[2], 

32 H_skMM[0, 2])).real) 

33 assert abs(sum(eigs - eigs2)) < 1e-8 

34 

35 energy_tolerance = 0.0003 

36 niter_tolerance = 0 

37 assert e == pytest.approx(-1.82847, abs=energy_tolerance) 

38 assert niter == pytest.approx(5, abs=niter_tolerance)