Rodin::Distance module

Distance-field computations.

\[ d(\mathbf{x},\Gamma)=\inf_{\mathbf{y}\in\Gamma}\|\mathbf{x}-\mathbf{y}\|. \]

Eikonal constructs distance fields through fast marching, while Poisson and SignedPoisson provide PDE-based alternatives. These models convert boundary or level-set information into distance approximations for shape optimization, interface processing, and mesh adaptation.

Available Methods

MethodClassEquationProperties
EikonalDistance::Eikonal $ \lVert\nabla d\rVert = 1 $ Exact distances via FMM; supports signed distance with interior/interface regions
PoissonDistance::Poisson $ -\Delta u = 1, \; u\vert_{\partial\Omega} = 0 $ Smooth approximation; fast (one linear solve); does not give exact distances
SignedPoissonDistance::SignedPoisson $ -\Delta u = 2\chi_\Omega - 1, \; u\vert_\Gamma = 0 $ Region-dependent forcing yields a signed smooth distance
RvachevDistance::Rvachev $ d = \frac{u}{\sqrt{u^2 + \lVert\nabla u\rVert^2}} $ Normalizes a level-set field to approximate distance; preserves zero set and sign
SpaldingTuckerDistance::SpaldingTucker $ d = \frac{2u}{\lVert\nabla u\rVert + \sqrt{\lVert\nabla u\rVert^2 + 2\lvert u\rvert}} $ Better gradient normalization than Rvachev; more accurate near the interface

All methods except Rvachev and SpaldingTucker inherit from a common CRTP Base<Derived> that provides setInterior() and setInterface() methods for specifying the signed-distance regions (mesh boundary attributes).

Eikonal Distance (FMM)

The Eikonal class wraps the FMM solver and provides the most accurate distance computation. Seeds are automatically identified from the interface attributes. Calling sign() after solve() negates interior values to produce a signed distance field.

P1 Vh(mesh);
GridFunction d(Vh);

Distance::Eikonal eikonal(d);
eikonal.setInterface(interfaceAttr)
       .setInterior(interiorAttr)
       .solve()
       .sign();

Poisson Distance Approximation

Poisson solves $ -\Delta u = 1 $ with $ u = 0 $ on $ \partial\Omega $ in a single linear solve. The result is smooth but only approximates the true distance.

SignedPoisson extends this with region-dependent forcing: $ -\Delta u = 2 $ inside a specified region and $ -\Delta u = -1 $ elsewhere, with $ u = 0 $ on the interface. It supports both single-attribute and attribute-set overloads:

// Unsigned Poisson distance
Distance::Poisson poisson;
auto d1 = poisson(Vh);

// Signed Poisson distance with interface/region attributes
Distance::SignedPoisson signedPoisson;
auto d2 = signedPoisson(interfaceAttr, regionAttr, Vh);

Level-Set Normalization

Rvachev and SpaldingTucker are post-processing operators that normalize an existing level-set field into an approximate distance function without solving any PDE:

Distance::Rvachev rvachev;
auto dR = rvachev(phi);

Distance::SpaldingTucker st;
auto dST = st(phi);

Classes

template<class Derived>
class Base
Base class for distance function computation models using CRTP.
template<class FES, class Data>
class Eikonal
Distance function computation using the Eikonal equation.
class Poisson
Poisson approximation to the distance function.
class Rvachev
Rvachev normalization for a level set function.
class SignedPoisson
Poisson approximation to the signed distance function.
class SpaldingTucker
Spalding-Tucker normalization for a level set function.