Coverage for gpaw/test/pw/test_augment_grids.py: 79%

38 statements  

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

1import numpy as np 

2import pytest 

3from ase import Atoms 

4 

5from gpaw import PW, FermiDirac 

6from gpaw.calculator import GPAW 

7from gpaw.new.calculation import DFTCalculation 

8from gpaw.mpi import rank 

9 

10 

11@pytest.mark.old_gpaw_only 

12@pytest.mark.stress 

13def test_pw_augment_grids(in_tmp_dir, gpaw_new): 

14 ecut = 200 

15 kpoints = [1, 1, 4] 

16 atoms = Atoms('HLi', cell=[6, 6, 3.4], pbc=True, 

17 positions=[[3, 3, 0], [3, 3, 1.6]]) 

18 

19 def calculate(aug): 

20 if gpaw_new: 

21 dft = DFTCalculation.from_parameters( 

22 atoms, 

23 dict(mode=PW(ecut), 

24 parallel={'augment_grids': aug}, 

25 kpts={'size': kpoints}, 

26 occupations=FermiDirac(width=0.1)), 

27 log=f'gpaw.aug{aug}.txt') 

28 dft.converge(steps=4) 

29 dft.energy() 

30 dft.forces() 

31 dft.stress() 

32 e = dft.results['energy'] 

33 f = dft.results['forces'] 

34 s = dft.results['stress'] 

35 else: 

36 atoms.calc = GPAW(mode=PW(ecut), 

37 txt=f'gpaw.aug{aug}.txt', 

38 parallel={'augment_grids': aug}, 

39 kpts={'size': kpoints}, 

40 occupations=FermiDirac(width=0.1), 

41 convergence={'maximum iterations': 4}) 

42 e = atoms.get_potential_energy() 

43 f = atoms.get_forces() 

44 s = atoms.get_stress() 

45 return e, f, s 

46 

47 e1, f1, s1 = calculate(False) 

48 e2, f2, s2 = calculate(True) 

49 

50 eerr = abs(e2 - e1) 

51 ferr = np.abs(f2 - f1).max() 

52 serr = np.abs(s2 - s1).max() 

53 if rank == 0: 

54 print('errs', eerr, ferr, serr) 

55 assert eerr < 5e-12, f'bad energy: err={eerr}' 

56 assert ferr < 5e-12, f'bad forces: err={ferr}' 

57 assert serr < 5e-12, f'bad stress: err={serr}'