Source code for harmonic_measure.boundary_data
"""Boundary data utilities for harmonic measure computation."""
from __future__ import annotations
import numpy as np
from numpy.typing import NDArray
[docs]
def sigmoid(t: float | NDArray) -> float | NDArray:
"""Standard sigmoid function σ(t) = 1 / (1 + e^{-t})."""
return 1.0 / (1.0 + np.exp(-np.clip(t, -500, 500)))
[docs]
def smooth_indicator(inside: bool, delta: float = 0.1) -> float:
"""Convert boolean to smooth indicator value.
Returns ~1 if inside, ~0 if not, with transition width delta.
"""
return sigmoid((1.0 if inside else -1.0) / delta)
[docs]
def smooth_corner_indicator(
pts: NDArray[np.floating],
corners: list[tuple[float, float]],
radius: float,
delta: float | None = None,
) -> NDArray[np.floating]:
"""Smooth indicator for corner neighborhoods.
g(ξ) = σ((ρ - d(ξ)) / δ)
where d(ξ) is distance to nearest corner.
Parameters
----------
pts : ndarray, shape (N, 2)
Boundary points
corners : list of (x, y)
Corner locations
radius : float
Neighborhood radius ρ
delta : float, optional
Smoothing width (default: radius/5)
Returns
-------
g : ndarray, shape (N,)
Smooth indicator values
"""
if delta is None:
delta = radius / 5.0
corners = np.array(corners)
n = pts.shape[0]
g = np.zeros(n)
for i in range(n):
# Distance to nearest corner
dists = np.sqrt(np.sum((corners - pts[i]) ** 2, axis=1))
d = np.min(dists)
# Smooth indicator
g[i] = sigmoid((radius - d) / delta)
return g
[docs]
def corner_boundary_data(
pts: NDArray[np.floating],
a: float,
rho: float,
delta: float | None = None,
) -> NDArray[np.floating]:
"""Standard corner indicator for Lamé curves.
Corners are at (±1, ±a).
Parameters
----------
pts : ndarray, shape (N, 2)
Boundary points
a : float
Aspect ratio (y semi-axis)
rho : float
Corner neighborhood radius
delta : float, optional
Smoothing width
Returns
-------
g : ndarray, shape (N,)
Boundary data values
"""
corners = [(1, a), (1, -a), (-1, a), (-1, -a)]
return smooth_corner_indicator(pts, corners, rho, delta)