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

1import numpy as np 

2 

3from gpaw.xc.libxc import LibXC 

4from gpaw.xc.kernel import XCKernel 

5 

6 

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' 

20 

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) 

27 

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 

33 

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