Coverage for gpaw/test/response/test_gw_MoS2_cut.py: 100%

33 statements  

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

1import pytest 

2from ase import Atoms 

3from ase.lattice.hexagonal import Hexagonal 

4from gpaw import GPAW, FermiDirac 

5from gpaw.response.g0w0 import G0W0 

6 

7 

8@pytest.fixture 

9def gpwfile(in_tmp_dir): 

10 calc = GPAW( 

11 mode='pw', 

12 xc='PBE', 

13 nbands=16, 

14 convergence={'bands': 15}, 

15 setups={'Mo': '6'}, 

16 occupations=FermiDirac(0.001), 

17 kpts={'size': (3, 3, 1), 'gamma': True}) 

18 

19 a = 3.1604 

20 c = 10.0 

21 

22 cell = Hexagonal(symbol='Mo', 

23 latticeconstant={'a': a, 'c': c}).get_cell() 

24 layer = Atoms(symbols='MoS2', cell=cell, pbc=[True, True, False], 

25 scaled_positions=[(0, 0, 0.5), 

26 (2 / 3, 1 / 3, 0.3 + 0.5), 

27 (2 / 3, 1 / 3, -0.3 + 0.5)]) 

28 

29 pos = layer.get_positions() 

30 pos[1][2] = pos[0][2] + 3.172 / 2 

31 pos[2][2] = pos[0][2] - 3.172 / 2 

32 layer.set_positions(pos) 

33 layer.calc = calc 

34 layer.get_potential_energy() 

35 fname = 'MoS2.gpw' 

36 calc.write(fname, mode='all') 

37 return fname 

38 

39 

40@pytest.mark.response 

41@pytest.mark.parametrize('integrate_gamma', ['sphere', 'reciprocal2D', 

42 '1BZ2D']) 

43def test_response_gw_MoS2_cut(scalapack, gpwfile, integrate_gamma): 

44 gw = G0W0(gpwfile, 

45 'gw-test', 

46 nbands=15, 

47 ecut=10, 

48 eta=0.2, 

49 frequencies={'type': 'nonlinear', 'domega0': 0.1}, 

50 integrate_gamma=integrate_gamma, 

51 truncation='2D', 

52 kpts=[((1 / 3, 1 / 3, 0))], 

53 bands=(8, 10)) 

54 

55 e_qp = gw.calculate()['qp'][0, 0] 

56 

57 paths = gw.savepckl() 

58 for path in paths.values(): 

59 assert path.exists() 

60 

61 results = {'sphere': (2.392, 7.337), 

62 '1BZ2D': (2.400, 7.311), 

63 'reciprocal2D': (2.406, 7.297)} 

64 ev, ec = results[integrate_gamma] 

65 assert e_qp[0] == pytest.approx(ev, abs=0.01) 

66 assert e_qp[1] == pytest.approx(ec, abs=0.01)