Poisson and elliptic solvers¶
Declare field solves with typed field problems. The problem describes the operator, right-hand side, boundary conditions, outputs, and compiled solver descriptor. The runtime materializes the solve.
Geometric multigrid¶
from pops.fields import PoissonProblem
from pops.fields.bcs import Periodic
from pops.fields.rhs import ChargeDensity
from pops.math import laplacian
from pops.solvers.elliptic import GeometricMG
from pops.solvers.tolerances import Relative
poisson = PoissonProblem(
name="phi",
unknown="phi",
equation=(-laplacian("phi") == ChargeDensity.from_blocks("plasma")),
bcs=(Periodic(),),
solver=GeometricMG(tolerance=Relative(1.0e-10)),
)
Add it to a case:
case = case.field(poisson)
Solver choice¶
Use pops.solvers descriptors for algorithms:
GeometricMG()for geometric multigrid;FFT()for periodic uniform Poisson routes;CG(),GMRES(), orBiCGStab()for matrix-free linear problems where the route supports Krylov solves.
The descriptor declares compatibility. For example, FFT is a uniform periodic solver, while AMR field solves should route to multigrid.
Multiple named fields¶
Declare each field as a separate FieldProblem:
phi = PoissonProblem(name="phi", unknown="phi", equation=eq_phi, solver=GeometricMG())
psi = PoissonProblem(name="psi", unknown="psi", equation=eq_psi, solver=GeometricMG())
case = case.field(phi).field(psi)
The names are stable user identifiers. Solver behavior remains typed.