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
« 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
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})
19 a = 3.1604
20 c = 10.0
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)])
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
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))
55 e_qp = gw.calculate()['qp'][0, 0]
57 paths = gw.savepckl()
58 for path in paths.values():
59 assert path.exists()
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)