Geometries

Choose a named body, construct a meridian or elliptical-section loft, or supply a closed triangular surface. Geometry support and material support are separate: a mesh that works for a rigid scatterer does not automatically support elasticity. All lengths below are in meters. The generated bodies use x for their longitudinal or revolution axis, with y and z transverse.

Each gallery panel shows one geometry rendered from its package mesh. Click an image to enlarge it. Panels are independently scaled and preserve aspect ratios. The mesh resolution is for viewing, not a scattering convergence recommendation.

Julia example
using AcousticScattering
using CairoMakie: Figure, Axis3, plot!, save, hidedecorations!, hidespines!

function save_geometries(entries; meridian=false)
    for (name, body) in entries
        fig = Figure(; size=(570, 360))
        ring = body isa Torus || (body isa RevolvedBody && body.closed)
        ax = Axis3(fig[1, 1];
            aspect=:data, azimuth=ring ? pi/6 : -0.35pi, elevation=0.12pi,
            viewmode=:fitzoom, perspectiveness=0.15)
        surface = meridian ? mesh(body; resolution=128) :
                  mesh(body; method=:full, resolution=0.16, mesh_order=2, qorder=2)
        plot!(ax, surface)
        hidedecorations!(ax)
        hidespines!(ax)
        slug = replace(lowercase(name), r"[^a-z0-9]+" => "_")
        save("geometry_$(slug).png", fig)
    end
    return nothing
end

canonical = [
    "Sphere" => Sphere(0.7),
    "Prolate spheroid" => Spheroid(1.0, 0.4),
    "Oblate spheroid" => Spheroid(0.35, 0.85),
    "Flat-ended cylinder" => Cylinder(0.4, 1.5),
    "Capsule" => Cylinder(0.4, 1.0; endcap_depth=0.4),
    "Bent, domed cylinder" => Cylinder(0.25, 2.0;
        radius_curvature=1.2, endcap_depth=0.25),
]
save_geometries(canonical)
Julia example
primitives = [
    "Triaxial ellipsoid" => Ellipsoid(1.0, 0.6, 0.35),
    "Superellipsoid" => Superellipsoid(0.9, 0.6, 0.4;
        axial_exponent=0.6, equatorial_exponent=0.6),
    "Cone" => Cone(0.6, 1.5),
    "Bicone" => Bicone(0.6, 1.8; waist=0.4),
    "Circular frustum" => Frustum(0.65, 0.3, 1.4),
    "Elliptical frustum" => Frustum((0.65, 0.35), (0.3, 0.2), 1.4),
]
save_geometries(primitives)

Profiles, lofts and toroids

RevolvedBody accepts axial coordinates and radii describing a simple piecewise-linear meridian. Its ordinary form has two endpoints on the axis and positive interior radii. closed=true instead describes a loop away from the axis, allowing toroids with noncircular cross-sections. Crossing or touching profiles are rejected. Either traversal direction is accepted.

LoftedBody joins elliptical sections along a straight or bent centerline and closes both ends with flat caps. Supply centers as a $3\times N$ matrix and semi-axes as a $2\times N$ matrix. Section normals follow the centerline unless directions is supplied. twists rotates each section about its normal in radians. All semi-axes must be positive.

Julia example
centers = [-1.0 0.0 1.0; 0.0 0.15 0.6; 0.0 0.0 0.15]
axes = [0.3 0.5 0.25; 0.2 0.3 0.15]
profiles = [
    "Circular frustum chain" => FrustumChain(
        [-1.0, -0.5, 0.2, 1.0], [0.0, 0.5, 0.35, 0.0]),
    "Elliptical frustum chain" => FrustumChain([-1.0, 0.0, 1.0], axes),
    "Bent elliptical loft" => LoftedBody(centers, axes; twists=[0.0, 0.2, 0.4]),
    "Ring torus" => Torus(0.75, 0.25),
    "Elliptical tube torus" => Torus(0.75, (0.15, 0.3)),
    "Rectangular-section toroid" => RevolvedBody(
        [-0.2, 0.2, 0.2, -0.2], [0.55, 0.55, 0.95, 0.95]; closed=true),
]
save_geometries(profiles)

Finite capped paraboloids, hyperboloids, ogives, waisted bodies, rounded noses and other surfaces of revolution can use sampled profiles without another solver. For example, the next paraboloid has $r^2=0.3(x+1)$ and a flat cap at $x=1$. The hyperboloid has $r=0.3\sqrt{1+(x/0.6)^2}$ between two flat caps.

Julia example
parameter = collect(range(0.0, 1.0; length=33))
paraboloid = RevolvedBody(vcat(-1 .+ 2parameter.^2, 1.0),
    vcat(sqrt(0.6) .* parameter, 0.0))
x = collect(range(-1.0, 1.0; length=41))
hyperboloid = RevolvedBody(vcat(-1.0, x, 1.0),
    vcat(0.0, 0.3sqrt.(1 .+ (x ./ 0.6).^2), 0.0))
ogive = RevolvedBody(t -> (2t-1, sqrt(1.25^2-(2t-1)^2)-0.75); n=48)
save_geometries([
    "Capped paraboloid" => paraboloid,
    "Capped hyperboloid" => hyperboloid,
    "Double circular-arc ogive" => ogive,
]; meridian=true)

Increasing mesh resolution only subdivides the supplied profile segments. Increase profile sampling separately to converge a curved surface. Corners are preserved. The last gallery revolves meridian panels. Full triangular meshing of densely sampled profiles may require smaller elements or mesh_order=1 near tips and closely spaced corners. Loft section placement likewise controls geometry independently of surface element size. Superellipsoid nodes lie on the prescribed surface, while the triangular interpolants approximate it. Strong curvature and cusps may need finer meshes or linear elements.

Named constructors and solver routes

ShapePublic constructorAvailable routes
SphereSphere(radius)Modal, Kirchhoff, FEM, BEM, MFS, Fourier
Prolate or oblate spheroidSpheroid(axial, radial)Modal, T-matrix, Kirchhoff, FEM, BEM, MFS, Fourier
Straight circular cylinderCylinder(radius, length)Modal approximation, Kirchhoff, meridian FEM, BEM, MFS
Bent circular cylinderCylinder(r, L; radius_curvature=R)Full BEM/MFS, lateral-surface methods and near-broadside modal approximation
Capsule or domed cylinderCylinder(r, L; endcap_depth=d)Full mesh BEM/MFS, straight-cylinder MFS
Triaxial ellipsoidEllipsoid(a, b, c)Full mesh BEM, MFS, Kirchhoff
SuperellipsoidSuperellipsoid(a, b, c; axial_exponent=e1, equatorial_exponent=e2)Full mesh BEM, MFS, Kirchhoff
Circular coneCone(radius, length)Axisymmetric BEM and full mesh methods
Circular biconeBicone(radius, length; waist=0.5)Axisymmetric BEM and full mesh methods
Circular frustumFrustum(left_radius, right_radius, length)Axisymmetric BEM and full mesh methods
Elliptical frustumFrustum((a1,b1), (a2,b2), length)Full mesh methods
Circular frustum chainFrustumChain(x, radii)Axisymmetric BEM and full mesh methods
Elliptical frustum chainFrustumChain(x, semiaxes)Full mesh methods
Ring torus, circular tubeTorus(major_radius, minor_radius)Axisymmetric BEM and full mesh methods
Ring torus, elliptical tubeTorus(R, (axial_radius, radial_radius))Axisymmetric BEM and full mesh methods

Here full mesh methods means BEM, MFS and mesh Kirchhoff. The table lists geometry routes, not every material combination. See Choosing a solver for canonical bodies and the material limits below for generated surfaces. Straight-cylinder meridian BEM/FEM use flat ends. Cylinder modal models are approximations to finite bodies, and bent-body lateral models omit endcaps.

Other supported geometry representations

FamilyHow to represent itPractical scope
Smooth radial bodies of revolutionIrregular(r, order)Fourier matching, subject to its mapping admissibility checks
Sphere or prolate spheroid shellShell(body, thickness)Dedicated structural-shell FEM, with material restrictions
Confocal spheroidal shellSpheroid(a,b) with Shelled(...)Spheroidal T-matrix, including its supported elastic layers
Boxes, prisms, pyramids, polyhedramesh(nodes, triangles) or a Gmsh generatorClosed surfaces with resolved edges
Elliptic cones, elliptic paraboloids, general quadricsGmsh generator or supplied triangular surfaceFinite, closed bodies, including required caps
General toroids, handled or concave bodiesSupplied closed surface, or RevolvedBody where axisymmetricConnected, non-self-intersecting boundary
Bent, twisted or asymmetric biological shapesLoftedBody or supplied surfaceLoft approximation or externally meshed geometry
CAD, scanned or reconstructed objectsmesh("body.msh") or coordinate/connectivity arraysMust satisfy closed-surface validation
Multiple fluid bodies, inclusions and cavitiesOne mesh per interface, coupled fluid BEM with parentsDisjoint or strictly nested interfaces with supported fluid materials
Body near an infinite planar interfacefree_surface(body, boundary, k, depth)Sphere or spheroid coupled to its mirror image for a pressure-release surface or rigid seafloor

See Geometry and incidence for mesh import, units, labels and coupled-region examples. A single supplied mesh describes one connected boundary. Separate region interfaces must be passed separately.

Solver and material limits

Generated surfaces support Rigid(), PressureRelease() and homogeneous FluidFilled(g,h) or GasFilled(g,h) through BEM and full surface MFS. Here g and h are the interior/exterior density and sound-speed ratios. Coupled fluid BEM additionally handles multiple lossless homogeneous regions.

body = Torus(0.025, 0.006)
solution = bem(body, PressureRelease(), 100.0; n=64, m_max=8)
surface = mesh(body; method=:full, resolution=0.003, qorder=4)
solution_3d = bem(surface, PressureRelease(), 100.0)

Axisymmetric BEM uses meridian panels and azimuthal modes. Full BEM uses the closed triangular boundary. MFS requires source offsets that remain on the correct side of the surface, which is more difficult near corners and narrow concavities. Kirchhoff is a high-frequency approximation whose local-normal illumination does not account for self-shadowing or multiple reflections.

FMM is an acceleration of boundary interactions, not an additional geometry class. There is currently no public FMM BEM path. Supported hierarchical-matrix compression can accelerate existing full BEM formulations without changing their geometry or material scope. See BEM and MFS.

Shapes and physics needing further support

Requested familyWhat is still needed
Unbounded cones, paraboloids or hyperboloidsA formulation with the appropriate unbounded-domain conditions. Finite capped versions use existing mesh routes
Open bowls, screens, plates with zero thicknessOpen-surface integral equations and edge treatment. A finite-thickness closed body can use existing mesh routes
Horn torusRegularization or a formulation for its pinched self-contact. Torus requires major_radius > radial_radius
Self-intersecting spindle-torus parameterizationDefine and trim the physical outer envelope first. A simple closed envelope can use a supplied profile or mesh, but has no dedicated constructor
Touching bodies or intersecting interfacesGeometry repair or Boolean union for one body, or a dedicated contact/interface formulation
Arbitrary elastic solids or structural shellsAdditional elastic boundary solvers or general volume/structural mesh support. Acoustic surface support alone is insufficient
Arbitrary spatially varying interiorsGeneral volume geometry and material-field support beyond the existing FEM geometry families
Specialized exact series for another shapeA separate analytic implementation and validation. Numerical mesh support does not provide an exact series

A named constructor is a convenience, not a prerequisite for solving a valid closed acoustic surface. Conversely, adding a constructor alone cannot supply missing material physics or resolve a singular boundary.