Skip to content

underwater.propagation.weston_regimes

Weston’s shallow-water propagation regimes (flux theory).

A source in a shallow-water waveguide loses energy in four successive range regimes, each with its own power law. The boundaries between them follow from the seabed reflectivity alone, which makes the set an inexpensive analytic reference for any numerical propagation model:

  • spherical spreading (), while the sound has not yet felt the boundaries;
  • cylindrical spreading (), once the energy is confined to a cylinder of height H and only rays within the critical angle survive;
  • mode stripping (), once the accumulated reflection loss has eroded the steep paths;
  • single mode — an exponential decay dominated by the lowest-order mode.

Everything here is implemented clean-room from Ainslie, Principles of Sonar Performance Modelling (Springer 2010), §9.1.1.2 (printed pp. 452-458): Equations (9.42) to (9.61) and the seabed properties of Table 9.1 (WESTON_SEABEDS). The quantity computed is Ainslie’s propagation factor F (units m⁻²), reported as the propagation loss dB re 1 m², which reduces to spherical spreading for a point source in free water.

The regime formulae are energy-flux (incoherent) results: they describe the range-averaged field, not its modal interference. That is exactly what makes them a usable cross-check for phonometry.underwater.propagation.numerical — the range average of a normal-mode or parabolic-equation field over many interference cycles converges on the cylindrical-spreading law, with for a totally reflecting (pressure-release) bottom.

Auto-generated from the source docstrings by scripts/generate_api_docs.py (make api-docs). Do not edit by hand.

critical_grazing_angle(sound_speed_ratio: float) -> float

Critical grazing angle , in radians.

A seabed slower than the water (, e.g. mud) has no critical angle; the function then returns 0, which correctly switches the reflection-loss gradient to the refracting-sediment branch of reflection_loss_gradient.

Parameters

NameDescription
sound_speed_ratio, dimensionless and positive.

Returns: The critical grazing angle, in radians (0 if none exists).

Raises

ExceptionWhen
ValueErrorIf the ratio is not positive and finite.
effective_depth(
water_depth: float,
frequency_hz: float,
*,
seabed: str | WestonSeabed = 'sand',
sound_speed: float = 1500.0,
) -> float

Weston effective water depth He (Ainslie Eq. 9.55), in metres.

: the depth at which a pressure-release boundary appears to lie, a short distance below the true seabed. Only meaningful for a seabed with a critical angle.

Parameters

NameDescription
water_depthWater-column depth H, in metres.
frequency_hzAcoustic frequency, in Hz.
seabed"sand", "mud" or a WestonSeabed.
sound_speedWater sound speed c_w, in m/s.

Returns: The effective depth He, in metres.

Raises

ExceptionWhen
ValueErrorIf the seabed has no critical angle or an input is invalid.
loss_parameter(attenuation_db_per_wavelength: float) -> float

Sediment loss parameter (Ainslie Eq. 9.23).

Parameters

NameDescription
attenuation_db_per_wavelength, in dB per wavelength.

Returns: The dimensionless loss parameter .

Raises

ExceptionWhen
ValueErrorIf the attenuation is negative or non-finite.
reflection_loss_gradient(
seabed: str | WestonSeabed = 'sand',
*,
frequency_hz: float | None = None,
) -> float

Reflection loss gradient , in nepers per radian.

The rate at which the seabed reflection loss grows with grazing angle, (Ainslie Eq. 9.45). Two branches:

  • a reflecting seabed with a critical angle (sand, coarse silt), (Eq. 9.51), frequency-independent;
  • a refracting seabed with none (mud, clay, fine silt), (Eq. 9.53), proportional to frequency.

Parameters

NameDescription
seabed"sand", "mud" or an explicit WestonSeabed.
frequency_hzAcoustic frequency, in Hz; required only for the refracting branch ().

Returns: The reflection loss gradient , in Np/rad.

Raises

ExceptionWhen
ValueErrorIf the frequency is missing or invalid for a refracting seabed.
waveguide_cutoff_frequency(
water_depth: float,
*,
seabed: str | WestonSeabed = 'sand',
sound_speed: float = 1500.0,
) -> float

Shallow-water waveguide cut-off frequency fc (Ainslie Eq. 9.60), in Hz.

— below it no mode is cut on and ducted propagation does not occur.

Parameters

NameDescription
water_depthWater-column depth H, in metres.
seabed"sand", "mud" or a WestonSeabed.
sound_speedWater sound speed c_w, in m/s.

Returns: The cut-off frequency, in Hz.

Raises

ExceptionWhen
ValueErrorIf the seabed has no critical angle or an input is invalid.
weston_propagation_loss(
range_m: NDArray[np.float64] | list[float] | float,
frequency_hz: float,
water_depth: float,
*,
seabed: str | WestonSeabed = 'sand',
sound_speed: float = 1500.0,
source_depth: float | None = None,
receiver_depth: float | None = None,
critical_angle: float | None = None,
reflection_loss_gradient_value: float | None = None,
) -> WestonPropagationResult

Propagation loss across Weston’s four shallow-water regimes.

Assembles the piecewise loss from Ainslie’s Equations (9.42), (9.49) and (9.54), switching regime at the boundaries of weston_regime_boundaries, and returns each regime’s own law over the whole range grid so the transitions can be drawn.

Parameters

NameDescription
range_mRange(s) from the source, in metres (scalar or array, strictly positive).
frequency_hzAcoustic frequency, in Hz.
water_depthWater-column depth H, in metres.
seabed"sand", "mud" or a WestonSeabed.
sound_speedWater sound speed c_w, in m/s.
source_depthSource depth z0, in metres; defaults to H/2 (used only by the single-mode formula).
receiver_depthReceiver depth z, in metres; defaults to H/2.
critical_angleOverride , in degrees (90 for an ideal totally reflecting waveguide).
reflection_loss_gradient_valueOverride , in Np/rad (0 for a lossless bottom: no mode stripping, no single-mode regime).

Returns: A WestonPropagationResult.

Raises

ExceptionWhen
ValueErrorIf an input is invalid.
weston_regime_boundaries(
frequency_hz: float,
water_depth: float,
*,
seabed: str | WestonSeabed = 'sand',
sound_speed: float = 1500.0,
critical_angle: float | None = None,
reflection_loss_gradient_value: float | None = None,
) -> WestonRegimeBoundaries

Regime boundaries of a shallow-water waveguide (Ainslie §9.1.1.2).

Parameters

NameDescription
frequency_hzAcoustic frequency, in Hz.
water_depthWater-column depth H, in metres.
seabed"sand", "mud" or a WestonSeabed.
sound_speedWater sound speed c_w, in m/s.
critical_angleOverride the seabed critical angle , in degrees. Use 90 for the ideal totally reflecting waveguide.
reflection_loss_gradient_valueOverride , in Np/rad. Use 0 for a lossless bottom (no mode stripping, no single-mode regime).

Returns: A WestonRegimeBoundaries.

Raises

ExceptionWhen
ValueErrorIf an input is invalid.

Constant (tuple).

WESTON_REGIMES = ('spherical', 'cylindrical', 'mode-stripping', 'single-mode')

Constant (dict).

WESTON_SEABEDS = {'sand': WestonSeabed(name='sand', grain_size=1.5, sound_speed_ratio=1.2, density_ratio=2.1, attenuation_db_per_wavelength=0.88, loss_parameter=0.0161, sound_speed_gradient=0.0), 'mud': WestonSeabed(name='mud', grain_size=8.0, sound_speed_ratio=1.0, density_ratio=1.4, attenuation_db_per_wavelength=0.09, loss_parameter=0.00165, sound_speed_gradient=1.0)}
WestonPropagationResult(
range_m: NDArray[np.float64],
propagation_loss: NDArray[np.float64],
propagation_factor: NDArray[np.float64],
regime: NDArray[np.str_],
spherical: NDArray[np.float64],
cylindrical: NDArray[np.float64],
mode_stripping: NDArray[np.float64],
single_mode: NDArray[np.float64],
multipath: NDArray[np.float64],
boundaries: WestonRegimeBoundaries,
frequency: float,
water_depth: float,
source_depth: float,
receiver_depth: float,
seabed: str,
)

Weston regime propagation loss versus range.

Attributes

NameDescription
range_mRanges from the source, in metres.
propagation_lossComposite propagation loss per range, in dB re 1 m².
propagation_factorThe composite propagation factor F, in m⁻².
regimeThe active regime label at each range (one of WESTON_REGIMES).
sphericalSpherical-spreading loss at every range, in dB.
cylindricalCylindrical-spreading loss (Eq. 9.42) at every range, dB.
mode_strippingMode-stripping loss (Eq. 9.49) at every range, dB (nan when the bottom is lossless: without reflection loss there is nothing to strip).
single_modeSingle-mode loss (Eq. 9.54) at every range, in dB.
multipathLoss from the continuous multipath integral (Eq. 9.46), which joins the cylindrical and mode-stripping regimes smoothly, in dB.
boundariesThe WestonRegimeBoundaries in force.
frequencyAcoustic frequency, in Hz.
water_depthWater-column depth H, in metres.
source_depthSource depth z0, in metres.
receiver_depthReceiver depth z, in metres.
seabedName of the seabed used.
WestonPropagationResult.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the composite loss with each regime’s law and the boundaries.

WestonRegimeBoundaries(
spherical_to_cylindrical: float,
cylindrical_to_mode_stripping: float,
mode_stripping_to_single_mode: float,
critical_angle: float,
reflection_loss_gradient: float,
effective_depth: float,
cutoff_frequency: float,
mode_count: float,
)

Range boundaries between Weston’s four propagation regimes.

Attributes

NameDescription
spherical_to_cylindricalRange at which and are equal, , in metres.
cylindrical_to_mode_strippingAinslie Eq. (9.50) , in metres (inf for a lossless bottom).
mode_stripping_to_single_mode, in metres (inf for a lossless bottom). See the module note on Eq. (9.57).
critical_angleCritical grazing angle , in radians.
reflection_loss_gradient, in Np/rad.
effective_depthWeston effective depth He, in metres.
cutoff_frequencyWaveguide cut-off frequency, in Hz (nan when the seabed has no critical angle).
mode_countNumber of cut-on modes, (Eq. 9.58), as a real number.
WestonSeabed(
name: str,
grain_size: float,
sound_speed_ratio: float,
density_ratio: float,
attenuation_db_per_wavelength: float,
loss_parameter: float,
sound_speed_gradient: float,
)

Characteristic seabed properties (Ainslie Table 9.1, printed p. 454).

Attributes

NameDescription
nameSediment name.
grain_sizeGrain size Mz (phi units).
sound_speed_ratio.
density_ratio.
attenuation_db_per_wavelength, in dB per wavelength.
loss_parameter (Equation 9.23).
sound_speed_gradientc', the sediment sound-speed gradient, in s⁻¹ (0 for sand, 1 for mud).