Coverage for gpaw/test/response/test_mpa_poly_C.py: 100%
30 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
1import pytest
2import numpy as np
3from ase.units import Hartree as Ha
4from gpaw.cgpaw import evaluate_mpa_poly as mpa_C
7def mpa_py(omega, f, omegat_nGG, W_nGG, eta, factor):
8 x1_nGG = f / (omega + omegat_nGG - 1j * eta)
9 x2_nGG = (1.0 - f) / (omega - omegat_nGG + 1j * eta)
11 x_GG = 2 * factor * np.sum(W_nGG * (x1_nGG + x2_nGG),
12 axis=0)
14 eps = 0.0001 / Ha
15 xp_nGG = f / (omega + eps + omegat_nGG - 1j * eta)
16 xp_nGG += (1.0 - f) / (omega + eps - omegat_nGG + 1j * eta)
17 xm_nGG = f / (omega - eps + omegat_nGG - 1j * eta)
18 xm_nGG += (1.0 - f) / (omega - eps - omegat_nGG + 1j * eta)
19 dx_GG = 2 * factor * np.sum(W_nGG * (xp_nGG - xm_nGG) / (2 * eps),
20 axis=0)
21 return x_GG, dx_GG
24@pytest.mark.parametrize('f', [0, 0.4, 1.0])
25def test_residues(f):
26 factor = 2.0
27 eta = 0.1 * Ha
28 nG = 5
29 npols = 10
30 omega = 0.5
32 rng = np.random.default_rng(seed=1)
33 omegat_nGG = rng.random((npols, nG, nG)) * 0.05 + 5.5 - 0.01j
34 W_nGG = np.array(rng.random((npols, nG, nG)), dtype=complex)
36 x_GG_py, dx_GG_py = mpa_py(omega, f, omegat_nGG, W_nGG, eta, factor)
38 x_GG_C = np.empty(omegat_nGG.shape[1:], dtype=complex)
39 dx_GG_C = np.empty(omegat_nGG.shape[1:], dtype=complex)
40 mpa_C(x_GG_C, dx_GG_C, omega, f, omegat_nGG, W_nGG, eta, factor)
42 assert np.allclose(x_GG_py, x_GG_C, atol=1e-6)