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

52 statements  

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

1import pytest 

2import numpy as np 

3from gpaw.response import ResponseContext, ResponseGroundStateAdapter 

4from gpaw.response.coulomb_kernels import CoulombKernel 

5from gpaw import GPAW, PW, FermiDirac 

6from gpaw.response.chi0 import Chi0Calculator 

7from gpaw.response.frequencies import FrequencyDescriptor 

8from gpaw.response.screened_interaction import (initialize_w_calculator, 

9 GammaIntegrationMode) 

10from ase.build import bulk 

11from ase import Atoms 

12 

13 

14@pytest.mark.response 

15def test_Wsymm(in_tmp_dir, scalapack): 

16 def calc_gs(symm): 

17 k = 2 

18 cell = bulk('Ga', 'fcc', a=5.68).cell 

19 a = Atoms('GaAs', cell=cell, pbc=True, 

20 scaled_positions=((0, 0, 0), (0.25, 0.25, 0.25))) 

21 

22 # First with symmetry off 

23 calc = GPAW(mode=PW(400), 

24 xc='LDA', 

25 occupations=FermiDirac(width=0.01), 

26 convergence={'bands': -4}, 

27 symmetry=symm, 

28 kpts={'size': (k, k, k), 'gamma': True}, 

29 txt='gs_GaAs.txt') 

30 

31 a.calc = calc 

32 a.get_potential_energy() 

33 if symm == 'off': 

34 calc.write('GaAs.gpw', mode='all') 

35 else: 

36 calc.write('GaAs_symm.gpw', mode='all') 

37 return calc 

38 

39 def get_IBZ_k(calc): 

40 gs = calc.gs_adapter() 

41 qclist = gs.kd.ibzk_kc 

42 return qclist 

43 

44 def calc_W(seed, q_c_list): 

45 gs = ResponseGroundStateAdapter.from_gpw_file(seed + '.gpw') 

46 context = ResponseContext('test.log') 

47 chi0calc = Chi0Calculator( 

48 gs, context, 

49 wd=FrequencyDescriptor(np.array([0.])), 

50 hilbert=False, 

51 ecut=100, 

52 intraband=False) 

53 wcontext = ResponseContext('out.txt') 

54 truncation = None 

55 coulomb = CoulombKernel.from_gs(gs, truncation=truncation) 

56 gimode = GammaIntegrationMode('sphere') 

57 wcalc = initialize_w_calculator(chi0calc, 

58 wcontext, 

59 coulomb=coulomb, 

60 integrate_gamma=gimode) 

61 Wlist = [] 

62 qlist = [] 

63 for iq, q_c in enumerate(q_c_list): 

64 chi0 = chi0calc.calculate(q_c) 

65 W_wGG = wcalc.calculate_W_wGG(chi0, 

66 fxc_mode='GW', 

67 only_correlation=False) 

68 Wlist.append(W_wGG) 

69 qlist.append(q_c) 

70 return Wlist, qlist 

71 

72 for symm in ['off', {}]: 

73 # calc gs with and without symmetry 

74 calc = calc_gs(symm) 

75 # get list of Q in IBZ with symmetry 

76 q_c_list = get_IBZ_k(calc) 

77 

78 # calc W_GG 

79 WGG_nosymm, qnosymm = calc_W('GaAs', q_c_list) 

80 WGG_symm, qsymm = calc_W('GaAs_symm', q_c_list) 

81 

82 # compare W_GG for all k in IBZ 

83 for iq, q_c in enumerate(q_c_list): 

84 assert np.allclose(qnosymm[iq], qsymm[iq]) 

85 assert np.allclose(WGG_symm[iq], WGG_nosymm[iq])