Prolate spheroidal modal series (PSMS) solution
Details
Calculates the far-field scattering amplitude and related quantities for a prolate spheroid using the modal series solution, supporting various boundary conditions (rigid, pressure-release, liquid-filled, and gas-filled).
Usage
This model is accessed via:
target_strength(
...,
model="psms",
phi_body,
boundary,
adaptive,
simplify_Amn,
precision,
n_integration,
sound_speed_sw,
density_sw
)Arguments
phi_bodyIncident roll angle (radians).
boundaryBoundary condition at the cylinder surface. One of
"fixed_rigid","pressure_release","liquid_filled", or"gas_filled". See the boundary conditions documentation for more details on these different boundary conditions.adaptiveA boolean argument controlling whether the PSMS backend is allowed to stop once the retained modal tail becomes numerically negligible and to choose an adaptive quadrature order for full fluid- or gas-filled overlap integrals. When
FALSE(default), the implementation uses the published hard truncation rule and a fixed quadrature order unless the user overrides it directly. WhenTRUE, the hard \(m_{\max}\) and \(n_{\max}\) rules remain the upper bounds, but the backscatter implementation is allowed to stop early once the retained tail is both numerically small and gradient-flat.simplify_AmnA boolean argument that flags whether or not to use the simplified calculation for the exansion matrix, \(A_{mn}\), for a fluid-filled scatterer. See Theory for the mathematical formulation and assumptions. Note: this argument only applies to when
boundary = "liquid_filled"orboundary = "gas_filled". It is otherwise left unused for all other boundary conditions.precisionA literal argument that allows for levels of precision when calculating the expansion matrix, \(A_{mn}\). There are two choices:
"double"for double-precision (64-bit) and"quad"for quadruple-precision (128-bit). See Details for more double- and quadruple-precision usages are implemented.n_integrationAn integer argument that informs the model how many integration points will be used to calculate \(\alpha_{mn}^{m}\), which is numerically calculated using Gauss-Legendre quadrature. When left as
NULL, the model uses 96 integration points unlessadaptive = TRUE, in which case a reduced-frequency-based quadrature rule is selected internally for the full fluid- or gas-filled solve. See gauss_legendre for a full description of hown_integrationis used. Note: this argument only applies to whenboundary = "liquid_filled"orboundary = "gas_filled". It is otherwise left unused for all other boundary conditions.sound_speed_swSeawater sound speed (\(m~s^{-1}\)).
density_swSeawater density (\(kg~m^{-3}\)).
Theory
some relevant parameters are used to describe the geometry. A spheroid surface is given by \(\xi = \xi_0 = \mathrm{constant}\). Denoting the major radius \(a\), the minor radius \(b\), and the semi-focal-length \(q\), then:
$$ a = \xi_0 q \\ \xi_0 = \left[1 - \left(\frac{b}{a}\right)^2\right]^{-1/2} $$
Densities are expressed by \(\rho\), sound speeds by \(c\), and wavenumbers by \(k\), each followed by a subscript 0 for the surrounding medium or 1 for the spheroidal body. For the spheroid, an alternative of the reduced frequency \(ka\) is \(h = kq\).
The far-field scattering amplitude is given by:
$$ f_\infty(\theta, \phi | \theta', \phi') = \frac{2}{j k_0} \sum\limits_{m=0}^\infty \sum\limits_{n=m}^\infty \frac{\epsilon_m}{N_{mn}(h_0)} S_{mn}(h_0, \cos\theta') \, A_{mn} S_{mn}(h_0, \cos\theta) \cos m(\phi - \phi') $$
where \(\epsilon_m = (-1)^{m/2}\) for even m, and \(N_{mn}(h_0)\) is the norm. \(S_{mn}\) is the angle spheroidal wave function of the first kind of order \(m\) and degree \(n\), and \(A_{mn}\) is the expansion coefficient for the scattered wave, determined by the boundary conditions. The parameters \(\theta\) and \(\phi\) denote the spherical angle coordinates of an observed point along the body. The \(\theta'\) and \(\phi'\) denote similar spherical angle coordinates of the incident direction. Effectively, \(\phi\) and \(\theta\) correspond to the roll and tilt angles (relative the incident sound wave), respectively. It is assumed that \(\theta'\) and \(\phi'\) are perpendicular to the incident wave such that:
$$ \theta' = \pi - \theta \\ \phi' = \pi + \phi $$
For pressure release (or soft) and rigid spheroids:
$$ A_{mn} = \frac{-\Delta R_{mn}^{(1)}(h_0, \xi_0)}{ \Delta R_{mn}^{(3)}(h_0, \xi_0) } $$
where \(\Delta = 1\) for soft and \(\Delta = \partial / \partial \xi\) f or rigid spheroid, and \(R_{mn}^{(i)}\) is the radial spheroidal wave function of the i-th kind.
For the case of a fluid-filled spheroid, the following simultaneous equation must be solved:
$$ \sum\limits_{n'=m}^\infty K_{nn'}^{(3)} A_{mn'} + \sum\limits_{n'=m}^\infty K_{nn'}^{(1)} \alpha_{mn'}^{m} E_{n'}^{m(1)} = 0 $$
where
$$ K_{nl}^{(i)} = \frac{1}{N_{mn}(h_0)} \int\limits_{-1}^{1} S_{mn}(h_0, \cos\theta) S_{ml}(h_1, \eta) d\eta $$
and
$$ \alpha_{mn}^{m} = \frac{1}{N_{mn}(h_1)} \int\limits_{-1}^{1} S_{mn}(h_0, \eta) S_{mn}(h_1, \eta) d\eta $$
In practice, these kernel matrices are solved numerically to determine \(A_{mn}\). The implementation uses compiled dense linear algebra and keeps the fluid-filled solve in the requested arithmetic so that the linear-system stage does not become detached from the rest of the chosen precision pathway.
In the case that \(h_0 \approx h_1\), \(\alpha_{mn}^{m} \approx 0\) for \(n \neq l\), and a much simplified expression is derived:
$$ A_{mn} = -\frac{E_{mn}^{m(1)}}{E_{mn}^{m(3)}} $$
The maximum values of \(m\) and \(n\) can be estimated by:
$$ m_{\max} = [2 k_0 b] \\ n_{\max} = m_{\max} + [h_0 / 2] $$
Implementation
C++
This model is primarily implemented in C++ since it leverages the
Fortran algorithm developed by Arnie Lee van Buren and Jeffery
Boisvert. Another reason this is primarily written in C++ is due to
computational and performance reasons. As \(k_0\), \(b\), and \(h\)
increase, so do \(m_{\max}\) and \(n_{\max}\). While this is not as much
of a concern for the pressure-release and fixed rigid cases, this results in
increasingly large and unwieldy kernel matrices required for solving the
fluid-filled expansion matrices (\(A_{mn}\)). Consequently, this can
result in the model taking an impractical amount of time to compute
\(f_\infty(\theta, \phi | \theta', \phi')\). C++ helps reduce this
burden compared to a pure R implementation. The current implementation
uses compiled matrix algebra throughout, applies backscatter parity to avoid
recomputing one of the two angular \(S_{mn}\) matrices, and solves the
fluid-filled kernel system natively in the requested arithmetic.
Precision
Another consideration is the floating point precision inherent to R.
R uses double-precision, which stores numeric values in a 64-bit
format. At low \(m_{\max}\) and \(n_{\max}\), there is lower numerical
instability in the prolate spheroidal wave functions used in the model.
However, this is not the case at greater \(m_{\max}\) and \(n_{\max}\)
where the difference between double- (64-bit) and quadruple-precision
(128-bit) can contribute to differences in target strength of more than 1
dB. While R-packages like Rmpfr provide access to the
(GNU) MPFR C library, the (GCC) libquadmath C++
library. Quad precision nevertheless remains much more computationally
intensive than double precision because the spheroidal function evaluations,
overlap integrals, and kernel systems all grow rapidly with
\(m_{\max}\) and \(n_{\max}\).
References
Furusawa, M. (1988). Prolate spheroidal models for predicting general trends of fish target strength. Journal of the Acoustical Society of Japan, 9: 13-24.
Sanderson, C., and Curtin, R. (2019). Practical sparse matrices in C++ with hybrid storage and template-based expression optimisation. Mathematical and Computational Applications, 24: 70.
Spencer, R.D., and Granger, S. (1951). The scattering of sound from a prolate spheroid. The Journal of the Acoustical Society of America, 23: 701-706.
Van Buren, A. L. and Boisvert, J. E. "Prolate Spheroidal Wave Functions." GitHub repository: https://github.com/MathieuandSpheroidalWaveFunctions/Prolate_swf
