-
Notifications
You must be signed in to change notification settings - Fork 90
Description
Feature Request: Stabilized Maxwell BEM for Low-Frequency Problems
Background
This issue follows a discussion in the ngbem repository (Weggler/ngbem#14) with @Weggler (Lucy Weggler), who suggested implementing the stabilized Maxwell formulation in NGSolve core rather than the legacy ngbem addon.
The stabilized formulation is based on:
L. Weggler, "High Order Boundary Element Methods,"
Ph.D. Dissertation, Universitaet des Saarlandes, 2011.
- Chapter 3.3: Stabilized Formulation (Theory)
- Chapter 5.3: Stabilized Formulation (Discretization)
Problem: Low-Frequency Breakdown
The classical EFIE (Electric Field Integral Equation) formulation suffers from low-frequency breakdown:
cond(A_c) ~ O(kappa^{-2}) as kappa -> 0
From the thesis (Table 6.6), for a sphere with N=128 elements, p=1:
| kappa [1/m] | Classical cond(A_c) | Stabilized cond(A_s) |
|---|---|---|
| 5.0 | 3.9e+1 | 1.6e+1 |
| 5.0e-1 | 3.5e+2 | 1.1e+2 |
| 5.0e-2 | 3.5e+4 | 6.2e+1 |
| 5.0e-3 | 3.5e+6 | 6.2e+1 |
| 5.0e-4 | 3.5e+8 | 6.2e+1 |
This limits the applicability of Maxwell BEM to high-frequency problems only.
Solution: Stabilized Formulation
The stabilized formulation (Eq. 5.20) introduces an additional unknown (surface charge density rho_Gamma) and explicitly recovers the Gauss law:
| A_kappa Q_kappa | | j^t | | M*m |
| | * | | = | |
| Q_kappa^T kappa^2*V | | rho_Gamma | | 0 |
where:
A_kappa: Maxwell single layer potential (already in NGSolve)V_kappa: Helmholtz single layer potential (already in NGSolve)Q_kappa: Transition matrix (new - Eq. 5.19)
The transition matrix couples the surface divergence of HDivSurface elements with the scalar H1 space:
(Q_kappa)_lk = int_Gamma int_Gamma div_Gamma phi_l(x) G_kappa(x-y) nu_k(y) dsigma_y dsigma_x
What is Currently Available
In ngsolve/bem/:
MaxwellSLKernel<3>,MaxwellDLKernel<3>inkernels.hppDiffOpMaxwell,DiffOpMaxwellNewinbem_diffops.hpp- Python bindings:
MaxwellSingleLayerPotentialOperator,MaxwellDoubleLayerPotentialOperator
What is Missing
As @Weggler noted, the missing piece is:
"there has been only one operator missing, right? The one that takes the normal trace of E (the normal trace of the potential)"
Specifically, we need:
- A way to construct the transition operator Q_kappa
- This requires coupling
div_Gamma(from HDivSurface) with the scalar Helmholtz single layer potential
Proposed Implementation
Option 1: New Kernel + DiffOp
Add a TransitionKernel<3> that uses the Helmholtz Green's function with a trial evaluator computing div_Gamma:
template<>
class TransitionKernel<3> : public BaseKernel
{
double kappa;
public:
typedef Complex value_type;
static string Name() { return "Transition"; }
template <typename T>
auto Evaluate(Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
{
T r = L2Norm(x - y);
auto G = exp(Complex(0, kappa) * r) / (4.0 * M_PI * r);
return Vec<1, Complex>(G);
}
// ... FMM support similar to HelmholtzSLKernel
};Option 2: Compose Existing Operators
Use the relationship from Eq. 5.22:
Q_kappa = D * V_kappa
where D is the discrete surface divergence operator.
References
- Original discussion: Feature Proposal: Stabilized Maxwell BEM for Low-Frequency Problems (based on your thesis) Weggler/ngbem#14
- Prototype code (Gist): https://gist.github.com/ksugahar/985063de1b5a1abea040f2c744b7d61b
- Thesis reference:
- Eq. 3.77: Continuity equation (weak form)
- Eq. 5.14: Stabilized variational formulation
- Eq. 5.19: Transition matrix definition
- Eq. 5.20: Block system matrix
- Lemma 5.3.1: Equivalence proof via Schur complement
Deliverables
If this feature is accepted, I am happy to contribute:
- Implementation of the transition operator
- Python bindings
- Documentation notebook demonstrating the stabilized formulation
- Test cases comparing classical vs stabilized at various kappa values
Looking forward to your feedback!
cc: @Weggler @JSchoeberl