Coverage for eminus/xc/lda_c_vwn.py: 100.00%
34 statements
« prev ^ index » next coverage.py v7.6.9, created at 2024-12-18 08:43 +0000
« prev ^ index » next coverage.py v7.6.9, created at 2024-12-18 08:43 +0000
1# SPDX-FileCopyrightText: 2021 The eminus developers
2# SPDX-License-Identifier: Apache-2.0
3"""Vosko-Wilk-Nusair LDA correlation.
5Reference: Phys. Rev. B 22, 3812.
6"""
8import numpy as np
11def lda_c_vwn(n, A=0.0310907, b=3.72744, c=12.9352, x0=-0.10498, **kwargs):
12 """Vosko-Wilk-Nusair parametrization of the correlation functional (spin-paired).
14 Corresponds to the functional with the label LDA_C_VWN and ID 7 in Libxc.
16 Reference: Phys. Rev. B 22, 3812.
18 Args:
19 n: Real-space electronic density.
21 Keyword Args:
22 A: Functional parameter.
23 b: Functional parameter.
24 c: Functional parameter.
25 x0: Functional parameter.
26 **kwargs: Throwaway arguments.
28 Returns:
29 VWN correlation energy density and potential.
30 """
31 rs = (3 / (4 * np.pi * n)) ** (1 / 3)
33 x = np.sqrt(rs)
34 X = rs + b * x + c
35 Q = np.sqrt(4 * c - b**2)
36 fx0 = b * x0 / (x0**2 + b * x0 + c)
37 f3 = 2 * (2 * x0 + b) / Q
38 tx = 2 * x + b
39 tanx = np.arctan(Q / tx)
41 ec = A * (np.log(rs / X) + 2 * b / Q * tanx - fx0 * (np.log((x - x0) ** 2 / X) + f3 * tanx))
43 tt = tx**2 + Q**2
44 vc = ec - x * A / 6 * (
45 2 / x - tx / X - 4 * b / tt - fx0 * (2 / (x - x0) - tx / X - 4 * (2 * x0 + b) / tt)
46 )
47 return ec, np.array([vc]), None
50def lda_c_vwn_spin(n, zeta, **kwargs):
51 """Vosko-Wilk-Nusair parametrization of the correlation functional (spin-polarized).
53 Corresponds to the functional with the label LDA_C_VWN and ID 7 in Libxc.
55 Reference: Phys. Rev. B 22, 3812.
57 Args:
58 n: Real-space electronic density.
59 zeta: Relative spin polarization.
61 Keyword Args:
62 **kwargs: Throwaway arguments.
64 Returns:
65 VWN correlation energy density and potential.
66 """
67 A = (0.0310907, 0.01554535, -1 / (6 * np.pi**2))
68 b = (3.72744, 7.06042, 1.13107)
69 c = (12.9352, 18.0578, 13.0045)
70 x0 = (-0.10498, -0.325, -0.0047584)
72 ec0, vc0, _ = lda_c_vwn(n, A[0], b[0], c[0], x0[0]) # Paramagnetic
73 ec1, vc1, _ = lda_c_vwn(n, A[1], b[1], c[1], x0[1]) # Ferromagnetic
74 ac, dac, _ = lda_c_vwn(n, A[2], b[2], c[2], x0[2]) # Spin stiffness
76 d2fzeta0 = 4 / 9 / (2 ** (1 / 3) - 1)
77 fzeta = 0.5 * ((1 + zeta) ** (4 / 3) + (1 - zeta) ** (4 / 3) - 2) / (2 ** (1 / 3) - 1)
78 zeta4 = zeta**4
79 fzetaz4 = fzeta * zeta4
80 De = ec1 - ec0 - ac / d2fzeta0
82 ec = ec0 + ac / d2fzeta0 * fzeta + De * fzetaz4
84 dfzeta = 4 / 6 * ((1 + zeta) ** (1 / 3) - (1 - zeta) ** (1 / 3)) / (2 ** (1 / 3) - 1)
85 dec1 = vc0 + dac / d2fzeta0 * fzeta + (vc1 - vc0 - dac / d2fzeta0) * fzetaz4
86 dec2 = ac / d2fzeta0 * dfzeta + De * (4 * zeta**3 * fzeta + zeta4 * dfzeta)
88 vc_up = dec1 + (1 - zeta) * dec2
89 vc_dw = dec1 - (1 + zeta) * dec2
90 return ec, np.array([vc_up, vc_dw]), None