Panel-based boundary integral equation solvers for 2D Laplace and Stokes problems
Project description
panel-bie
Panel-based boundary integral equation (BIE) solvers for 2D Laplace and Stokes problems.
Overview
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
Installation
pip install panel-bie
# With plotting support
pip install panel-bie[plot]
Quick Start
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])
Command-Line Interface
The package includes a CLI for quick experiments and diagnostics.
Commands
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 = x² - y²
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
CLI Options
| 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).
Theory
Double-Layer Potential
For Laplace's equation, the double-layer potential representation:
$$u(x) = \int_\Gamma \mu(y) \frac{\partial G(x,y)}{\partial n_y} , ds_y$$
where $G(x,y) = \frac{1}{2\pi} \log|x-y|$ is the fundamental solution.
The density $\mu$ satisfies the second-kind integral equation:
$$\left(-\frac{1}{2}I + K\right)\mu = g$$
where $K$ is the double-layer operator.
Diagonal Correction
For smooth boundaries, the kernel $K(x,y)$ has a finite limit as $y \to x$:
$$K(x,x) = \frac{\kappa(x)}{4\pi}$$
where $\kappa(x)$ is the signed curvature. This package uses this analytic limit rather than numerical regularization.
Near-Field Evaluation
For target points close to the boundary, standard quadrature loses accuracy. This package implements the Helsing-Ojala method for accurate near-boundary evaluation.
API Reference
DoubleLayerLaplace(discretization)
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 |
SingleLayerLaplace(discretization)
Single-layer potential solver for Neumann problems.
Geometry protocol
Any geometry object providing:
points: (N, 2) boundary nodesnormals: (N, 2) outward unit normalsweights: (N,) quadrature weightscurvature: (N,) signed curvature
Compatible with superellipse.PanelDiscretization.
References
- 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.
License
MIT License. See LICENSE for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file panel_bie-0.8.0.tar.gz.
File metadata
- Download URL: panel_bie-0.8.0.tar.gz
- Upload date:
- Size: 17.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f32bf8182d49ae61f8db0f491c0213e61871cc668b4061e4f59964049dec7f3e
|
|
| MD5 |
08953ecb8e8d8d6987cb48a822e93b22
|
|
| BLAKE2b-256 |
27ecfc4f2eab0d8cfb56e26f80af04d7a14c00fad0bdbe0244287ef4c1e0d025
|
Provenance
The following attestation bundles were made for panel_bie-0.8.0.tar.gz:
Publisher:
release.yml on egoughnour/panel-bie
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
panel_bie-0.8.0.tar.gz -
Subject digest:
f32bf8182d49ae61f8db0f491c0213e61871cc668b4061e4f59964049dec7f3e - Sigstore transparency entry: 857988430
- Sigstore integration time:
-
Permalink:
egoughnour/panel-bie@c486efe806fe79ebffcc937e9dc03f7515d84095 -
Branch / Tag:
refs/tags/v0.8.0 - Owner: https://github.com/egoughnour
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c486efe806fe79ebffcc937e9dc03f7515d84095 -
Trigger Event:
push
-
Statement type:
File details
Details for the file panel_bie-0.8.0-py3-none-any.whl.
File metadata
- Download URL: panel_bie-0.8.0-py3-none-any.whl
- Upload date:
- Size: 11.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
856c71e110f9c23f2453a82cd758139b7319bbbc76debea3c1494438d6d6211a
|
|
| MD5 |
3ad80d33a7d0c9b83cf1d7709ccbf235
|
|
| BLAKE2b-256 |
13faec644da9805b563a1f8552ed7e63bdb308f00c00976a96e398726a22af97
|
Provenance
The following attestation bundles were made for panel_bie-0.8.0-py3-none-any.whl:
Publisher:
release.yml on egoughnour/panel-bie
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
panel_bie-0.8.0-py3-none-any.whl -
Subject digest:
856c71e110f9c23f2453a82cd758139b7319bbbc76debea3c1494438d6d6211a - Sigstore transparency entry: 857988467
- Sigstore integration time:
-
Permalink:
egoughnour/panel-bie@c486efe806fe79ebffcc937e9dc03f7515d84095 -
Branch / Tag:
refs/tags/v0.8.0 - Owner: https://github.com/egoughnour
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c486efe806fe79ebffcc937e9dc03f7515d84095 -
Trigger Event:
push
-
Statement type: