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
« 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
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)))
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')
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
39 def get_IBZ_k(calc):
40 gs = calc.gs_adapter()
41 qclist = gs.kd.ibzk_kc
42 return qclist
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
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)
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)
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])