Coverage for tests/test_pscattering.py: 100%
34 statements
« prev ^ index » next coverage.py v7.4.1, created at 2024-08-30 14:00 +0200
« prev ^ index » next coverage.py v7.4.1, created at 2024-08-30 14:00 +0200
1import numpy as np
2import pytest
4import flexfrac1d.lib.phase_shift as ps
6random_handlers = (
7 ps.UniformScatteringHandler,
8 ps.PerturbationScatteringHandler,
9)
11edge_amplitudes = (
12 np.array(1.5 + 1.8j),
13 np.array([0.11833799 + 0.63103069j, 0.78585931 + 0.84839417j]),
14)
15c_wavenumbers = (
16 np.array(0.78032224 + 0.85889267j),
17 np.array([0.10716051 + 0.7798643j, 0.54648262 + 0.94570875j]),
18)
19xfs = (
20 np.array([11.1]),
21 np.array([4.7, 8.3]),
22 np.array([2.2, 6.4, 9.3]),
23)
26@pytest.mark.parametrize(
27 "edge_amplitudes, c_wavenumbers", zip(edge_amplitudes, c_wavenumbers)
28)
29@pytest.mark.parametrize("xf", xfs)
30def test_continuity(
31 edge_amplitudes: np.ndarray, c_wavenumbers: np.ndarray, xf: np.ndarray
32):
33 # Verify that when no scattering is used, the right edge of the left floe
34 # is in the same state as the left edge of the right floe. That is, the
35 # complex amplitude advected from the left edge of the left floe is equal to the
36 # amplitude at the left edge of the right floe.
37 post_amplitudes = ps.ContinuousScatteringHandler.compute_edge_amplitudes(
38 edge_amplitudes, c_wavenumbers, xf
39 )
40 for xl, xr, pl, pr in zip(
41 xf[:-1], xf[1:], post_amplitudes[:-1], post_amplitudes[1:]
42 ):
43 assert np.allclose(pl * np.exp(1j * c_wavenumbers * (xr - xl)) - pr, 0)
46@pytest.mark.parametrize("handler_type", random_handlers)
47@pytest.mark.parametrize(
48 "edge_amplitudes, c_wavenumbers", zip(edge_amplitudes, c_wavenumbers)
49)
50@pytest.mark.parametrize("xf", xfs)
51def test_absolute_value_continuity(
52 handler_type: type,
53 edge_amplitudes: np.ndarray,
54 c_wavenumbers: np.ndarray,
55 xf: np.ndarray,
56):
57 # Verify that when scattering is used, the amplitude at the right edge of
58 # the left floe is equal, in amplitude, and different, in phase, from the
59 # amplitude at the left edge of the right floe.
60 seed = 3103
61 random_handler: ps.ScatteringHandler = handler_type.from_seed(seed)
62 pa_continuous = ps.ContinuousScatteringHandler.compute_edge_amplitudes(
63 edge_amplitudes, c_wavenumbers, xf
64 )
65 pa_random = random_handler.compute_edge_amplitudes(
66 edge_amplitudes, c_wavenumbers, xf
67 )
68 for pac, par in zip(pa_continuous[1:], pa_random[1:]):
69 assert not np.allclose(pac - par, 0)
70 assert np.allclose(np.abs(pac) - np.abs(par), 0)
73@pytest.mark.parametrize("handler_type", random_handlers)
74@pytest.mark.parametrize(
75 "edge_amplitudes, c_wavenumbers", zip(edge_amplitudes, c_wavenumbers)
76)
77@pytest.mark.parametrize("xf", xfs)
78def test_repeatability(handler_type: type, edge_amplitudes, c_wavenumbers, xf):
79 # Verify that two random scattering handlers return the same result when
80 # computing the amplitudes from a generator seeded with the same number.
81 seed = 83
83 handler1: ps.ScatteringHandler = handler_type.from_seed(seed)
84 test1 = handler1.compute_edge_amplitudes(edge_amplitudes, c_wavenumbers, xf)
86 handler2: ps.ScatteringHandler = handler_type.from_seed(seed)
87 test2 = handler2.compute_edge_amplitudes(edge_amplitudes, c_wavenumbers, xf)
89 assert np.allclose(test1 - test2, 0)