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

Development

Design

In brief

Three orthogonal axes (concept PhysicalModel, policy NumericalFlux, concept EllipticSolver) and a single parallelism seam:

  • generic System composition: 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 the adc_cases side). Shared system Poisson; on the Python side via pops.System. Three ways to write a model: native brick composition, symbolic pops.physics.facade.Model model, or hybrid composition (see Models).

  • RusanovFlux / HLLCFlux / RoeFlux flux, MUSCL reconstruction (Minmod / VanLeer) + WENO5-Z;

  • GeometricMG (multigrid V-cycle red-black GS) / PoissonFFTSolver (direct spectral);

  • AMR: AmrSystem single- 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.