Coverage for src/flexfrac1d/lib/att.py: 100%
17 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
1"""Attenuation parameterisations."""
3import enum
4import typing
6import attrs
7import numpy as np
10def no_attenuation():
11 """No attenuation.
13 Waves propagate indifinitely, as if the ice cover is perfectly elastic and
14 the fluid perfectly inviscid.
16 Returns
17 -------
18 typing.Literal[0]
19 Amplitude attenuation, in m^-1
21 Notes
22 -----
23 The attenuation is defined as:
25 .. math::
27 \alpha_j = 0 \forall j.
29 """
30 return 0
33def parameterisation_01(thickness: float, wavenumbers: np.ndarray) -> np.ndarray:
34 """Parameterised attenuation for individual wave modes.
36 Parameters
37 ----------
38 thickness : float
39 Ice thickness, in m
40 wavenumbers : np.ndarray
41 Propagating wavenumbers, in rad m^-1
43 Returns
44 -------
45 np.ndarray
46 Amplitude attenuation, in m^-1
48 Notes
49 -----
50 The attenuation is defined as:
52 .. math::
54 \alpha_j = \frac{1}{4} {k_j}^2 h.
56 """
57 return wavenumbers**2 * thickness / 4
60class AttenuationParameterisation(enum.Enum):
61 NO = 0
62 PARAM_01 = 1
65@attrs.frozen
66class AttenuationSpecification:
67 function: typing.Callable
68 args: str | None = None
69 kwargs: dict[str, typing.Any] = attrs.field(factory=dict)
72Attenuation: typing.TypeAlias = AttenuationParameterisation | AttenuationSpecification