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
« 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
5from gpaw import GPAW, restart
6from gpaw.atom.basis import BasisMaker
7from gpaw.lcao.tools import get_lcao_hamiltonian
8from gpaw.mpi import world
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()
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')
26 atoms, calc = restart('temp.gpw')
27 H_skMM, S_kMM = get_lcao_hamiltonian(calc)
28 eigs = calc.get_eigenvalues(kpt=2)
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
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)