Coverage for gpaw/test/test_potential.py: 97%
35 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
1import pytest
2from gpaw.mpi import world
3from ase import Atoms
4from gpaw import GPAW
6pytestmark = pytest.mark.skipif(world.size > 1,
7 reason='world.size > 1')
10def test_potential(gpaw_new):
11 if gpaw_new:
12 pytest.skip('Not implemented')
13 for mode in ['fd', 'pw']:
14 print(mode)
15 hydrogen = Atoms('H',
16 cell=(2.5, 3, 3.5),
17 pbc=1,
18 calculator=GPAW(txt=None, mode=mode))
19 hydrogen.get_potential_energy()
20 dens = hydrogen.calc.density
21 ham = hydrogen.calc.hamiltonian
22 wfs = hydrogen.calc.wfs
23 ham.poisson.eps = 1e-20
24 dens.interpolate_pseudo_density()
25 dens.calculate_pseudo_charge()
26 ham.update(dens)
27 ham.get_energy(0.0, wfs)
28 y = (ham.vt_sG[0, 0, 0, 0] - ham.vt_sG[0, 0, 0, 1]) * ham.gd.dv
29 x = 0.0001
30 dens.nt_sG[0, 0, 0, 0] += x
31 dens.nt_sG[0, 0, 0, 1] -= x
32 dens.interpolate_pseudo_density()
33 dens.calculate_pseudo_charge()
34 ham.update(dens)
35 e1 = ham.get_energy(0.0, wfs) - ham.e_kinetic
36 dens.nt_sG[0, 0, 0, 0] -= 2 * x
37 dens.nt_sG[0, 0, 0, 1] += 2 * x
38 dens.interpolate_pseudo_density()
39 dens.calculate_pseudo_charge()
40 ham.update(dens)
41 e2 = ham.get_energy(0.0, wfs) - ham.e_kinetic
42 assert y == pytest.approx((e1 - e2) / (2 * x), abs=2e-8)