Coverage for gpaw/test/ps2ae/test_bader.py: 75%

28 statements  

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

1import subprocess 

2 

3import numpy as np 

4import pytest 

5from ase.io import write 

6from ase.units import Bohr 

7 

8from gpaw import GPAW 

9from gpaw.utilities.bader import read_bader_charges 

10from gpaw.utilities.ps2ae import PS2AE 

11 

12 

13@pytest.mark.serial 

14def test_bader(gpw_files, in_tmp_dir, gpaw_new): 

15 """Test bader analysis on interpolated density.""" 

16 calc = GPAW(gpw_files['c2h4_pw_nosym']) 

17 if gpaw_new: 

18 nt_sR = calc.dft.densities().pseudo_densities() 

19 ne = nt_sR.integrate().sum() 

20 density = nt_sR.data.sum(0) 

21 else: 

22 converter = PS2AE(calc) 

23 density = converter.get_pseudo_density() 

24 ne = density.sum() * converter.dv 

25 

26 assert ne == pytest.approx(12, abs=1e-5) 

27 

28 write('density.cube', calc.atoms, data=density * Bohr**3) 

29 try: 

30 subprocess.run('bader -p all_atom density.cube'.split()) 

31 except FileNotFoundError: 

32 return 

33 

34 charges = read_bader_charges() 

35 assert np.ptp(charges[:2]) == 0.0 

36 assert np.ptp(charges[2:]) < 0.001 

37 assert charges.sum() == pytest.approx(12.0, abs=0.0001)