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

1import pytest 

2from gpaw.mpi import world 

3from ase import Atoms 

4from gpaw import GPAW 

5 

6pytestmark = pytest.mark.skipif(world.size > 1, 

7 reason='world.size > 1') 

8 

9 

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)