Coverage for gpaw/test/mgga/test_nsc_MGGA.py: 100%

56 statements  

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

1import pytest 

2from ase import Atoms 

3from gpaw import GPAW, Mixer, Davidson 

4 

5# ??? g = Generator('H', 'TPSS', scalarrel=True, nofiles=True) 

6 

7 

8@pytest.mark.mgga 

9def test_mgga_nsc_MGGA(in_tmp_dir): 

10 def xc(name): 

11 return dict(name=name, stencil=1) 

12 

13 atoms = Atoms('H', magmoms=[1], pbc=True) 

14 atoms.center(vacuum=3) 

15 

16 def getkwargs(): 

17 return dict(mode='fd', 

18 eigensolver=Davidson(3), 

19 mixer=Mixer(0.7, 5, 50.0), 

20 parallel=dict(augment_grids=True), 

21 gpts=(32, 32, 32), nbands=1, xc=xc('oldPBE')) 

22 

23 calc = GPAW(txt='Hnsc.txt', **getkwargs()) 

24 atoms.calc = calc 

25 e1 = atoms.get_potential_energy() 

26 _ = calc.get_reference_energy() 

27 de12t = calc.get_xc_difference(xc('TPSS')) 

28 de12m = calc.get_xc_difference(xc('M06-L')) 

29 de12m2 = calc.get_xc_difference(xc('M06-L')) 

30 de12r = calc.get_xc_difference(xc('revTPSS')) 

31 

32 print('================') 

33 print('e1 = ', e1) 

34 print('de12t = ', de12t) 

35 print('de12m = ', de12m) 

36 print('de12r = ', de12r) 

37 print('tpss = ', e1 + de12t) 

38 print('m06l = ', e1 + de12m) 

39 print('m06l = ', e1 + de12m2) 

40 print('revtpss = ', e1 + de12r) 

41 print('================') 

42 

43 assert e1 + de12t == pytest.approx(-1.11723235592, abs=0.005) 

44 assert e1 + de12m == pytest.approx(-1.18207312133, abs=0.005) 

45 assert e1 + de12r == pytest.approx(-1.10093196353, abs=0.005) 

46 

47 # ??? g = Generator('He', 'TPSS', scalarrel=True, nofiles=True) 

48 

49 atomsHe = Atoms('He', pbc=True) 

50 atomsHe.center(vacuum=3) 

51 calc = GPAW(txt='Hensc.txt', **getkwargs()) 

52 atomsHe.calc = calc 

53 e1He = atomsHe.get_potential_energy() 

54 _ = calc.get_reference_energy() 

55 de12tHe = calc.get_xc_difference(xc('TPSS')) 

56 de12mHe = calc.get_xc_difference(xc('M06-L')) 

57 de12rHe = calc.get_xc_difference(xc('revTPSS')) 

58 

59 print('================') 

60 print('e1He = ', e1He) 

61 print('de12tHe = ', de12tHe) 

62 print('de12mHe = ', de12mHe) 

63 print('de12rHe = ', de12rHe) 

64 print('tpss = ', e1He + de12tHe) 

65 print('m06l = ', e1He + de12mHe) 

66 print('revtpss = ', e1He + de12rHe) 

67 print('================') 

68 

69 assert e1He + de12tHe == pytest.approx(-0.409972893501, abs=0.005) 

70 assert e1He + de12mHe == pytest.approx(-0.487249688866, abs=0.005) 

71 assert e1He + de12rHe == pytest.approx(-0.447232286813, abs=0.005) 

72 

73 energy_tolerance = 0.001 

74 assert e1 == pytest.approx(-1.124, abs=energy_tolerance) 

75 assert e1He == pytest.approx(0.0100192, abs=energy_tolerance)