Coverage for gpaw/xc/parametrizedxc.py: 85%
33 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-12 00:18 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-12 00:18 +0000
1import numpy as np
3from gpaw.xc.libxc import LibXC
4from gpaw.xc.kernel import XCKernel
7class ParametrizedKernel(XCKernel):
8 def __init__(self, name):
9 self.name = name
10 self.kernels = []
11 self.coefs = []
12 self.type = 'LDA'
13 for x in name.split('+'):
14 c, n = x.split('_', 1)
15 self.coefs.append(float(c))
16 kernel = LibXC(n)
17 self.kernels.append(kernel)
18 if kernel.type == 'GGA':
19 self.type = 'GGA'
21 def calculate(self, e_g, n_sg, dedn_sg,
22 sigma_xg=None, dedsigma_xg=None,
23 tau_sg=None, dedtau_sg=None):
24 e_g[:] = 0.0
25 e_g_tmp = np.empty_like(e_g)
26 dedn_sg_tmp = np.empty_like(dedn_sg)
28 if self.type == 'GGA':
29 dedsigma_xg[:] = 0.0
30 dedsigma_xg_tmp = np.empty_like(dedsigma_xg)
31 else:
32 dedsigma_xg_tmp = None
34 for kernel, c in zip(self.kernels, self.coefs):
35 dedn_sg_tmp[:] = 0.0
36 if self.type == 'GGA':
37 dedsigma_xg_tmp[:] = 0.0
38 kernel.calculate(e_g_tmp, n_sg, dedn_sg_tmp,
39 sigma_xg, dedsigma_xg_tmp,
40 tau_sg, dedtau_sg)
41 e_g += c * e_g_tmp
42 dedn_sg += c * dedn_sg_tmp
43 if self.type == 'GGA':
44 dedsigma_xg += c * dedsigma_xg_tmp