Coverage for tests/test_disp_relations.py: 0%
45 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-09-11 16:23 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-09-11 16:23 +0200
1from hypothesis import given, settings
2import numpy as np
4from swiift.api.utils import (
5 compute_elastic_mass_loading_wavenumbers,
6 compute_free_surface_wavenumbers,
7)
8from swiift.model.model import (
9 DiscreteSpectrum,
10 FloatingIce,
11 FreeSurfaceWaves,
12 Ice,
13 Ocean,
14 WavesUnderElasticPlate,
15)
16from tests.model_strategies import coupled_ocean_ice, ocean_and_mono_spectrum, spec_mono
19def _free_surface(wavenumber, depth):
20 # RHS of alpha = k*tanh(kH), avec alpha := omega**2 / g
21 return wavenumber * np.tanh(wavenumber * depth)
24def elas_mass_surface(
25 wavenumbers: np.ndarray, ice: Ice, ocean: Ocean, gravity: float
26) -> np.ndarray:
27 l4 = ice.flex_rigidity / (ocean.density * gravity)
28 draft = ice.density / ocean.density * ice.thickness
29 dud = ocean.depth - draft
30 k_tanh_kdud = wavenumbers * np.tanh(wavenumbers * dud)
32 return (l4 * wavenumbers**4 + 1) / (1 + draft * k_tanh_kdud) * k_tanh_kdud
35# Use a monochromatic spectrum, which sould not be limiting as
36# polychromatic DiscreteSpectrum objects are just collections
37# of independent Wave objects
38@given(**ocean_and_mono_spectrum)
39def test_free_surface(ocean, spectrum, gravity):
40 angfreqs2 = spectrum._ang_freqs_pow2
41 fsw = FreeSurfaceWaves.from_ocean(ocean, spectrum, gravity)
42 x = _free_surface(fsw.wavenumbers, ocean.depth)
43 y = angfreqs2 / gravity
44 assert np.allclose(x * ocean.depth, y * ocean.depth)
47@given(**ocean_and_mono_spectrum)
48def test_free_surface_utils(ocean: Ocean, spectrum: DiscreteSpectrum, gravity: float):
49 wavenumbers = compute_free_surface_wavenumbers(ocean, spectrum, gravity)
50 x = _free_surface(wavenumbers, ocean.depth)
51 y = spectrum._ang_freqs_pow2 / gravity
52 assert np.allclose(x * ocean.depth, y * ocean.depth)
55@given(**(coupled_ocean_ice | {"spectrum": spec_mono()}))
56@settings(max_examples=500)
57def test_elas_mass_loading(
58 ocean: Ocean, spectrum: DiscreteSpectrum, ice: Ice, gravity: float
59):
60 assert ocean.density > ice.density
61 assert ocean.depth - ice.density / ocean.density * ice.thickness > 0
62 angfreqs2 = spectrum._ang_freqs_pow2
63 wui = WavesUnderElasticPlate.from_ocean(ice, ocean, spectrum, gravity)
64 x = elas_mass_surface(wui.wavenumbers, ice, ocean, gravity)
65 y = angfreqs2 / gravity
66 assert np.allclose(x, y)
69@given(**(coupled_ocean_ice | {"spectrum": spec_mono()}))
70def test_elas_mass_loading_utils(
71 ocean: Ocean, spectrum: DiscreteSpectrum, ice: Ice, gravity: float
72):
73 assert ocean.density > ice.density
74 assert ocean.depth - ice.density / ocean.density * ice.thickness > 0
75 floating_ice = FloatingIce.from_ice_ocean(ice, ocean, gravity)
76 wavenumbers = compute_elastic_mass_loading_wavenumbers(
77 floating_ice, spectrum, gravity
78 )
79 x = elas_mass_surface(wavenumbers, ice, ocean, gravity)
80 y = spectrum._ang_freqs_pow2 / gravity
81 assert np.allclose(x, y)