Coverage for gpaw/hybrids/coulomb.py: 96%

24 statements  

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

1from math import pi 

2 

3import numpy as np 

4 

5from gpaw.hybrids.wstc import WignerSeitzTruncatedCoulomb as WSTC 

6 

7 

8def coulomb_interaction(omega, gd, kd, *, yukawa=False): 

9 if omega: 

10 return ShortRangeCoulomb(omega, yukawa) 

11 return WSTC(gd.cell_cv, kd.N_c) 

12 

13 

14class ShortRangeCoulomb: 

15 def __init__(self, omega, yukawa): 

16 self.omega = omega 

17 self.yukawa = yukawa 

18 

19 def get_description(self): 

20 return f'Short-range Coulomb: erfc(omega*r)/r (omega = {self.omega} ' \ 

21 'bohr^-1)' 

22 

23 def get_potential(self, pd): 

24 G2_G = pd.G2_qG[0] 

25 if self.yukawa: 

26 return 4 * pi / (G2_G + self.omega**2) 

27 x_G = 1 - np.exp(-G2_G / (4 * self.omega**2)) 

28 with np.errstate(invalid='ignore'): 

29 v_G = 4 * pi * x_G / G2_G 

30 G0 = G2_G.argmin() 

31 if G2_G[G0] < 1e-11: 

32 v_G[G0] = pi / self.omega**2 

33 return v_G