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
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
1from math import pi
3import numpy as np
5from gpaw.hybrids.wstc import WignerSeitzTruncatedCoulomb as WSTC
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)
14class ShortRangeCoulomb:
15 def __init__(self, omega, yukawa):
16 self.omega = omega
17 self.yukawa = yukawa
19 def get_description(self):
20 return f'Short-range Coulomb: erfc(omega*r)/r (omega = {self.omega} ' \
21 'bohr^-1)'
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