Capacitance Matrix Method
Extends fast spectral solvers to irregular / masked domains using the Sherman-Morrison capacitance correction (Buzbee, Golub & Nielson 1970).
Solver
finitevolx.CapacitanceSolver
Bases: Module
Spectral Poisson/Helmholtz solver for masked irregular domains.
Uses the capacitance matrix method (Buzbee, Golub & Nielson 1970) to extend a fast rectangular spectral solver to a domain defined by a binary mask.
The algorithm (Buzbee, Golub & Nielson 1970):
- Solve the PDE on the full rectangle using a fast spectral solver
(DST/DCT/FFT), ignoring the mask. Call this
u. ugenerally violates ψ = 0 at inner-boundary points. Correct it:ψ = u − Σ_k α_k g_k, whereg_kare precomputed Green's functions (rectangular-domain response to δ-sources at each boundary point b_k).- The coefficients α are found by requiring ψ(b_k) = 0 at all
N_b boundary points, giving the linear system
C α = u[B]whereC[k,l] = g_l(b_k)is the capacitance matrix.
The capacitance correction is delegated to :class:gaussx.CapacitanceSolver;
this class adds the field reshaping and the exterior masking. Construct with
:func:build_capacitance_solver.
Attributes:
| Name | Type | Description |
|---|---|---|
solver |
CapacitanceSolver
|
The generic capacitance solver operating on flat vectors. |
mask |
Float[Array, 'Ny Nx']
|
Domain mask (1.0 = interior, 0.0 = exterior). Applied to the output so that values outside the physical domain are exactly zero. |
shape |
tuple[int, int]
|
Grid shape |
dx |
float
|
Grid spacing in x. |
dy |
float
|
Grid spacing in y. |
lambda_ |
float
|
Helmholtz parameter. |
base_bc |
str
|
Spectral solver used as the rectangular base. |
Source code in .venv/lib/python3.12/site-packages/spectraldiffx/_src/fourier/capacitance.py
__call__(rhs)
Solve (∇² − λ)ψ = rhs on the masked domain.
The generic solver enforces ψ = 0 at the inner-boundary points and returns the corrected field; this method reshapes between fields and flat vectors and zeroes the exterior via the mask.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
rhs
|
Float[Array, 'Ny Nx']
|
Right-hand side on the full rectangular grid. Values outside the physical domain (mask = False) are ignored. |
required |
Returns:
| Type | Description |
|---|---|
Float[Array, 'Ny Nx']
|
Solution ψ on the full rectangular grid. Exactly zero outside the mask, and ψ ≈ 0 at inner-boundary points. |
Source code in .venv/lib/python3.12/site-packages/spectraldiffx/_src/fourier/capacitance.py
Factory
finitevolx.build_capacitance_solver(mask, dx, dy, lambda_=0.0, base_bc='fft')
Pre-compute the capacitance matrix and return a ready-to-use solver.
This is an offline function that performs N_b rectangular spectral
solves (N_b = number of inner-boundary points). The result is a
:class:CapacitanceSolver whose __call__ method is JIT-compilable.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mask
|
np.ndarray of bool shape (Ny, Nx), or Mask2D
|
Physical domain mask. When an :class: |
required |
dx
|
float
|
Grid spacing in x. |
required |
dy
|
float
|
Grid spacing in y. |
required |
lambda_
|
float
|
Helmholtz parameter λ. Use |
0.0
|
base_bc
|
('fft', 'dst', 'dct')
|
Rectangular spectral solver used as the base. |
"fft"
|
Returns:
| Type | Description |
|---|---|
CapacitanceSolver
|
A callable equinox Module with all precomputed arrays baked in. |
Source code in finitevolx/_src/solvers/elliptic.py
Masked Laplacian
finitevolx.masked_laplacian(psi, mask, dx, dy, lambda_=0.0)
Apply the masked discrete Helmholtz operator (∇² − λ)·ψ.
Enforces homogeneous Dirichlet conditions at the mask boundary by zeroing psi outside the mask before applying the 5-point stencil. The output is also zeroed outside the mask.
Neighbors at the rectangle edges wrap around (periodic roll), which is consistent with using the FFT as a preconditioner.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
psi
|
Float[Array, 'Ny Nx']
|
Field to which the operator is applied. |
required |
mask
|
Float[Array, 'Ny Nx'] or Mask2D
|
Binary mask: 1 inside the physical domain, 0 outside (land/exterior).
When an :class: |
required |
dx
|
float
|
Grid spacing in x. |
required |
dy
|
float
|
Grid spacing in y. |
required |
lambda_
|
float
|
Helmholtz parameter. Default: 0.0 (pure Laplacian). |
0.0
|
Returns:
| Type | Description |
|---|---|
Float[Array, 'Ny Nx']
|
Result of (∇² − λ)·(ψ·mask), zeroed outside the mask. |