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> in kernels.hpp
DiffOpMaxwell, DiffOpMaxwellNew in bem_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:
where D is the discrete surface divergence operator.
References
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
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:
Problem: Low-Frequency Breakdown
The classical EFIE (Electric Field Integral Equation) formulation suffers from low-frequency breakdown:
From the thesis (Table 6.6), for a sphere with N=128 elements, p=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:
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:
What is Currently Available
In
ngsolve/bem/:MaxwellSLKernel<3>,MaxwellDLKernel<3>inkernels.hppDiffOpMaxwell,DiffOpMaxwellNewinbem_diffops.hppMaxwellSingleLayerPotentialOperator,MaxwellDoubleLayerPotentialOperatorWhat is Missing
As @Weggler noted, the missing piece is:
Specifically, we need:
div_Gamma(from HDivSurface) with the scalar Helmholtz single layer potentialProposed Implementation
Option 1: New Kernel + DiffOp
Add a
TransitionKernel<3>that uses the Helmholtz Green's function with a trial evaluator computingdiv_Gamma:Option 2: Compose Existing Operators
Use the relationship from Eq. 5.22:
where D is the discrete surface divergence operator.
References
Deliverables
If this feature is accepted, I am happy to contribute:
Looking forward to your feedback!
cc: @Weggler @JSchoeberl