Panel-based boundary integral equation (BIE) solvers for 2D Laplace and Stokes problems.
PyPI version Python versions License CI Documentation codecov
This package provides Nyström discretization methods for solving boundary integral equations on smooth 2D curves. It includes:
- Double-layer potential for Laplace (Dirichlet problems)
- Single-layer potential for Laplace (Neumann problems)
- Combined-field formulations for robust exterior problems
- Curvature-corrected diagonal for improved conditioning
- Near-field evaluation with Helsing-Ojala quadrature corrections
pip install panel-bie
# With plotting support
pip install panel-bie[plot]from panel_bie import DoubleLayerLaplace, solve_dirichlet from superellipse import Superellipse # Create geometry curve = Superellipse(a=1, b=1, p=8) disc = curve.panel_discretization(panels_per_quadrant=4, nodes_per_panel=16) # Set up boundary data g = lambda pt: pt[0]**2 - pt[1]**2 # harmonic function # Solve solver = DoubleLayerLaplace(disc) mu = solver.solve(g) # Evaluate at interior point u_0 = solver.evaluate(mu, point=[0.0, 0.0])
The package includes a CLI for quick experiments and diagnostics.
solve - Solve a Dirichlet problem on a superellipse geometry:
# Create a geometry file echo '{"a": 1.0, "b": 1.0, "p": 4.0}' > curve.json # Solve with harmonic boundary data u = x2 - y2 panel-bie solve -g curve.json --bc "x**2 - y**2" --eval 0,0 # With custom discretization panel-bie solve -g curve.json --bc "x" --eval 0.5,0 --panels 8 --nodes 16
condition - Compute the condition number of the discretized operator:
# Default squircle (p=4) panel-bie condition # Higher-order Lamé curve panel-bie condition --p 8 --panels 8 # Custom geometry panel-bie condition --a 2.0 --b 1.0 --p 4 --panels 4 --nodes 16
convergence - Test convergence with increasing panel count:
# Default p=4 superellipse panel-bie convergence # Higher exponent panel-bie convergence --p 8
| Command | Option | Description |
|---|---|---|
| solve | --geometry, -g |
JSON file with geometry (a, b, p, q) |
| solve | --bc |
Boundary condition as Python expression |
| solve | --eval |
Evaluation point as x,y |
| solve | --panels |
Panels per quadrant (default: 4) |
| solve | --nodes |
Nodes per panel (default: 16) |
| solve | --beta |
Panel grading parameter (default: auto) |
| condition | --a, --b, --p |
Superellipse parameters |
| condition | --panels, --nodes |
Discretization parameters |
| condition | --beta |
Panel grading parameter (default: auto) |
| convergence | --a, --b, --p |
Superellipse parameters |
The --beta parameter controls panel grading near corners and is automatically computed to ensure numerical stability (beta must be less than p/2).
For Laplace's equation, the double-layer potential representation:
where
The density
where
For smooth boundaries, the kernel
where
For target points close to the boundary, standard quadrature loses accuracy. This package implements the Helsing-Ojala method for accurate near-boundary evaluation.
Double-layer potential solver for interior Dirichlet problems.
| Method | Description |
|---|---|
assemble() |
Build the discretized operator matrix |
solve(g) |
Solve for density given boundary data g |
evaluate(mu, point) |
Evaluate solution at interior point |
evaluate_grid(mu, grid) |
Evaluate on a grid of points |
Single-layer potential solver for Neumann problems.
Any geometry object providing:
points: (N, 2) boundary nodesnormals: (N, 2) outward unit normalsweights: (N,) quadrature weightscurvature: (N,) signed curvature
Compatible with superellipse.PanelDiscretization.
- Kress, R. (2014). Linear Integral Equations, 3rd ed. Springer.
- Helsing, J. & Ojala, R. (2008). On the evaluation of layer potentials close to their sources. J. Comput. Phys. 227:2899–2921.
MIT License. See LICENSE for details.