Supported Operators

All operators currently implemented target three-dimensional problems. Two-dimensional support is a planned future extension.

The CFMM wrapper is constructed via CFMM.assemble (or the lower-level PetrovGalerkinCFMM) once the CFMMBEAST and CFMMExaFMMt extensions are loaded.

Helmholtz 3D (scalar)

These operators act on scalar basis functions. The current implementation supports Lagrange C0D1 (lagrangec0d1) basis functions on triangulated surfaces.

The Helmholtz Green's function is

\[G(\boldsymbol{x},\boldsymbol{y}) = \frac{e^{ik|\boldsymbol{x}-\boldsymbol{y}|}}{4\pi|\boldsymbol{x}-\boldsymbol{y}|}, \quad k \in \mathbb{C}.\]

Setting wavenumber = 0 recovers the Laplace Green's function $G_0(\boldsymbol{x},\boldsymbol{y}) = 1/(4\pi|\boldsymbol{x}-\boldsymbol{y}|)$; the ExaFMMt backend automatically switches to LaplaceFMMOptions in that case.

OperatorBEAST constructorMathematical form
Single-layer (V)Helmholtz3D.singlelayer(; wavenumber)$(V u)(\boldsymbol{x}) = \int_\Gamma G(\boldsymbol{x},\boldsymbol{y})\,u(\boldsymbol{y})\,\mathrm{d}S(\boldsymbol{y})$
Double-layer (K)Helmholtz3D.doublelayer(; wavenumber)$(K u)(\boldsymbol{x}) = \int_\Gamma \partial_{\boldsymbol{n}(\boldsymbol{y})} G(\boldsymbol{x},\boldsymbol{y})\,u(\boldsymbol{y})\,\mathrm{d}S(\boldsymbol{y})$
Transposed double-layer (K')Helmholtz3D.doublelayer_transposed(; wavenumber)$(K' u)(\boldsymbol{x}) = \int_\Gamma \partial_{\boldsymbol{n}(\boldsymbol{x})} G(\boldsymbol{x},\boldsymbol{y})\,u(\boldsymbol{y})\,\mathrm{d}S(\boldsymbol{y})$
Hypersingular (W)Helmholtz3D.hypersingular(; wavenumber)$(W u)(\boldsymbol{x}) = -\partial_{\boldsymbol{n}(\boldsymbol{x})} \int_\Gamma \partial_{\boldsymbol{n}(\boldsymbol{y})} G(\boldsymbol{x},\boldsymbol{y})\,u(\boldsymbol{y})\,\mathrm{d}S(\boldsymbol{y})$

All four operators are tested with lagrangec0d1 basis functions (Petrov–Galerkin, square systems). Other scalar basis function types may work but are not currently verified.

Maxwell 3D (vector)

These operators act on vector basis functions. The current implementation supports Raviart–Thomas (raviartthomas) basis functions on triangulated surfaces.

OperatorBEAST constructorMathematical form
Single-layer / EFIE (T)Maxwell3D.singlelayer(; wavenumber)$(\mathcal{T}\boldsymbol{u})(\boldsymbol{x}) = \alpha\!\int_\Gamma G\,\boldsymbol{u}\,\mathrm{d}S + \beta\,\nabla\!\int_\Gamma G\,\nabla_\Gamma\!\cdot\boldsymbol{u}\,\mathrm{d}S$
Double-layer / MFIE (K)Maxwell3D.doublelayer(; wavenumber)$(\mathcal{K}\boldsymbol{u})(\boldsymbol{x}) = \int_\Gamma \nabla G(\boldsymbol{x},\boldsymbol{y})\times\boldsymbol{u}(\boldsymbol{y})\,\mathrm{d}S(\boldsymbol{y})$

Both operators are tested with raviartthomas basis functions (Petrov–Galerkin, square systems).

Tested basis-function / operator combinations

The table below summarises which combinations are covered by the automated test suite. A ✓ means the forward product, the transpose, and the adjoint are all verified against a dense BEAST assembly.

Operatorlagrangec0d1raviartthomas
Helmholtz3D.singlelayer
Helmholtz3D.doublelayer
Helmholtz3D.doublelayer_transposed
Helmholtz3D.hypersingular
Maxwell3D.singlelayer
Maxwell3D.doublelayer

Combinations marked — are not supported by the current operator implementation (the scalar Helmholtz operators require scalar basis functions; the vector Maxwell operators require vector basis functions).