PekerisModeSolver

Model UnderwaterAcoustics.PekerisModeSolver
Description Normal mode model for constant depth iso-velocity environments
Language Julia
Advantages Fast, differentiable (forward mode), multi-threaded
Limitations Iso-velocity, pressure-release surface, fluid half-space seabed, no seabed absorption (no leaky modes)
Differentiability ForwardDiff
PekerisModeSolver(env; ngrid=0, nmodes=0)

A fast differentiable mode propagation model that only supports iso-velocity constant depth environments.

ngrid is the number of grid points to use for modal root finding for fluid bottom environments. If ngrid is too small, the mode solver may miss some modes. If ngrid is too large, the mode solver may take a long time to converge. The default value of ngrid of 0 will use a heuristic to automatically determine the number of grid points to use.

nmodes controls the maximum number of modes computed. Setting nmodes to 0 causes all propagating modes to be computed.

Implementation largely based on mathematical description in:

Tip

The theory of modal models is summarized in a brief note “On modal models”. It provides an overview of the key concepts and mathematical formulations, as implemented in this model.

While the PekerisModeSolver is range-independent by itself, it can be made range-dependent by using AdiabaticExt as shown in the example below.

Examples

Range-independent scenario

using UnderwaterAcoustics
using Plots

env = UnderwaterEnvironment(
  bathymetry = 5000,
  soundspeed = 1500,
  density = 1000,
  seabed = FluidBoundary(2000, 2000)
)
pm = PekerisModeSolver(env)

tx = AcousticSource(0, -500, 10)
rx = AcousticReceiver(200000, -2500)
modes = arrivals(pm, tx, rx)[1:7]      # first 7 modes
7 element Vector{ModeArrival}:
  mode 1: kᵣ = 0.041883 - 0.0im rad/m, v = 1499.84 m/s, vₚ = 1500.16 m/s
  mode 2: kᵣ = 0.04187 - 0.0im rad/m, v = 1499.36 m/s, vₚ = 1500.66 m/s
  mode 3: kᵣ = 0.041847 - 0.0im rad/m, v = 1498.56 m/s, vₚ = 1501.48 m/s
  mode 4: kᵣ = 0.041815 - 0.0im rad/m, v = 1497.45 m/s, vₚ = 1502.63 m/s
  mode 5: kᵣ = 0.041773 - 0.0im rad/m, v = 1496.01 m/s, vₚ = 1504.12 m/s
  mode 6: kᵣ = 0.041723 - 0.0im rad/m, v = 1494.24 m/s, vₚ = 1505.94 m/s
  mode 7: kᵣ = 0.041663 - 0.0im rad/m, v = 1492.15 m/s, vₚ = 1508.10 m/s
# plot the modes
plot(modes)
rxs = AcousticReceiverGrid2D(200000:10:220000, -2500)
x = transmission_loss(pm, tx, rxs)

plot(200:0.01:220, x; ylims=(70,110), yflip=true, legend=false,
  xlabel="Range (km)", ylabel="Transmission loss (dB)")

Range-dependent scenario

using UnderwaterAcoustics
using Plots

env = UnderwaterEnvironment(
  bathymetry = SampledField([200, 150, 200]; x=[0, 2000, 5000]),
  soundspeed = 1500,
  density = 1000,
  seabed = FluidBoundary(2000, 2000)
)

# use an adiabatic extension to the PekerisModeSolver for range-dependence
pm = AdiabaticExt(PekerisModeSolver, env)

tx = AcousticSource(0, -50, 250)
rx = AcousticReceiver(7000, -25)
modes = arrivals(pm, tx, rx)[1:7]      # first 7 modes
7 element Vector{ModeArrival}:
  mode 1: kᵣ = 1.047083 - 0.0im rad/m, v = 1499.80 m/s, vₚ = 1500.16 m/s
  mode 2: kᵣ = 1.04674 - 0.0im rad/m, v = 1499.22 m/s, vₚ = 1500.66 m/s
  mode 3: kᵣ = 1.046167 - 0.0im rad/m, v = 1498.24 m/s, vₚ = 1501.48 m/s
  mode 4: kᵣ = 1.045364 - 0.0im rad/m, v = 1496.86 m/s, vₚ = 1502.63 m/s
  mode 5: kᵣ = 1.044331 - 0.0im rad/m, v = 1495.09 m/s, vₚ = 1504.12 m/s
  mode 6: kᵣ = 1.043066 - 0.0im rad/m, v = 1492.91 m/s, vₚ = 1505.94 m/s
  mode 7: kᵣ = 1.04157 - 0.0im rad/m, v = 1490.34 m/s, vₚ = 1508.10 m/s
# plot the modes
plot(modes)
rxs = AcousticReceiverGrid2D(10:10:7000, -200:1)
x = transmission_loss(pm, tx, rxs)

plot(rxs, x; crange=50)
plot!(env)

We can also estimate a bandlimited impulse response from the propagation model:

plot(impulse_response(pm, tx, rx, 8000; fmin=200, fmax=300))

Notes

  • Differentiability currently works only with ForwardDiff, and excludes impulse_response().