Numerical convergence

Use a modal sphere as a reference for FEM and BEM. These small axial examples run in the docs build and avoid ambiguity about the observation direction.

Radial FEM

using AcousticScattering

body = Sphere(0.01)
boundary = Rigid()
wavenumber = 2pi * 12000.0 / 1477.4
reference = target_strength(modal(body, boundary, wavenumber))
element_counts = [40, 80]
fem_strengths = [target_strength(fem(body, boundary, wavenumber;
    n_elements = count, m_max = 12)) for count in element_counts]
fem_errors = abs.(fem_strengths .- reference)
@assert all(isfinite, fem_strengths)
@assert last(fem_errors) < 0.05
(elements = element_counts, error_db = fem_errors)
(elements = [40, 80], error_db = [5.142029586124863e-6, 1.2855284694524016e-6])

Element count and modal truncation are separate controls. Fluid-filled radial FEM exposes n_elements_int and n_elements_ext instead of a single n_elements.

Axisymmetric BEM

panel_counts = [24, 48]
bem_strengths = [target_strength(bem(body, boundary, wavenumber;
    incidence_angle = 0.0, n = count)) for count in panel_counts]
bem_errors = abs.(bem_strengths .- reference)
@assert all(isfinite, bem_strengths)
@assert last(bem_errors) < 1.0
(panels = panel_counts, error_db = bem_errors)
(panels = [24, 48], error_db = [0.019554714598868372, 0.004882851210403771])

The assertions are example smoke checks. Scientific error budgets need refinement over the frequency and parameter range of interest. Quadrature and panel resolution control different errors. Neither removes the formulation's irregular-frequency limitations.

For oblique axisymmetric incidence beta in the x–z plane, query backscatter with target_strength(solution; angle = pi - beta, azimuth = pi), or simply target_strength(solution). The defaults follow the antipodal incident direction. An explicitly supplied angle = pi points along negative x.