PoPS - Plasma-Oriented PDE Solver¶
PoPS is a model-free C++23 core for coupled hyperbolic-elliptic systems on adaptive
(AMR) meshes. It names no scenario: it advances a hyperbolic part U (finite-volume
transport) coupled to an elliptic part phi (a system Poisson solved each step), and a
model is a composition of generic bricks (pops.Model(state, transport, source, elliptic)).
The mesh and execution stack is written from scratch: a single dispatch seam
(Serial / OpenMP / Kokkos GPU GH200 / MPI), a MultiFab + BoxArray + Geometry stack,
block-structured multi-level and multi-patch AMR (Berger-Rigoutsos, coverage-aware reflux),
multigrid and spectral-FFT Poisson, and Python bindings via pybind11.
Named physical scenarios – diocotron (E x B drift), self-gravitating Euler-Poisson,
asymptotic-preserving isothermal two-fluid – are how the core is validated, not what it is.
Their readable, reproducible form (models, facades, figures) lives in
adc_cases; the runs behind them are tracked in
VALIDATION.
This documentation is the user guide. The detailed design documents (ARCHITECTURE, ALGORITHMS, BACKEND_COVERAGE…) remain the contributor reference and are linked where useful.
Getting started
Tutorials
Concepts
- Hyperbolic-elliptic systems
- The typed authoring API
- PhysicalModel
- Conservative and primitive variables
- Fluxes, sources and eigenvalues
- Moment models and closures
- Elliptic right-hand side and the aux channel
- Poisson equation
- Time integration
- Operator splitting, IMEX and Schur condensation
- Adaptive mesh refinement
- Multi-block and multi-species systems
- Polar and disc geometry
How-to guides
Writing a model
Simulation
AMR
Running
Advanced topics
Reference
- Reference
- Python API
- Public API contract
- Native bricks
- Symbolic physics DSL
- Time programs
- Operator modules
- Physics authoring facade
- Typed operator-first IR (
pops.model) - Builder layer
- Native numerics: Riemann solvers and reconstruction
- Typed bricks (
pops.lib) - Package map
- Strings to typed objects
- Multi-species and multi-block programs
- Program scheduler
- Custom solvers
- Moment models
- API C++
- Backend matrix
- Environment variables
- Validated boundaries
- Bibliography
Development
Design
C++ reference
In brief¶
Three orthogonal axes (concept PhysicalModel, policy NumericalFlux, concept
EllipticSolver) and a single parallelism seam:
generic
Systemcomposition: one block per model, where a model is a composition of generic bricks (pops.Model(state, transport, source, elliptic)); the core names no scenario (the names diocotron, euler_poisson… live on theadc_casesside). Shared system Poisson; on the Python side viapops.System. Three ways to write a model: native brick composition, symbolicpops.physics.facade.Modelmodel, or hybrid composition (see Models).RusanovFlux/HLLCFlux/RoeFluxflux, MUSCL reconstruction (Minmod / VanLeer) + WENO5-Z;GeometricMG(multigrid V-cycle red-black GS) /PoissonFFTSolver(direct spectral);AMR:
AmrSystemsingle- and multi-block, multi-patch N levels, coverage-aware reflux,AmrCouplerMP(Berger-Rigoutsos regrid), see AMR;for_each_cell: serial / OpenMP / Kokkos;comm.hpp: MPI collectives, see Parallel backends.
New here? Start with the overview, install, then follow the A->Z tutorial.
Links¶
Source code: https://github.com/wolf75222/adc_cpp
C++ Doxygen reference: /cpp/
Sister solvers on the pde_core_cpp base: euler_cpp and advection_cpp (private repositories)
Application scenarios: adc_cases