---
title: "Peclet Examples"
subtitle: "GPU-accelerated CFD, granular dynamics, and gas–solid coupling — from Python, validated in the open."
toc: false
css: assets/gallery.css
---
:::::: {.hero-band}

::::::
[**`peclet`**](https://pypi.org/project/peclet/) is an open-source simulation suite for
**incompressible CFD** (cut-cell immersed boundaries over signed-distance geometry), **discrete
element granular dynamics** (spheres and arbitrary SDF shapes), and **coupled gas–solid CFD-DEM**
— driven entirely from Python, running on one code base from a laptop CPU to multi-GPU clusters
(Kokkos: CUDA, HIP, OpenMP; MPI for multi-rank).
```bash
pip install peclet # CPU wheels — every page here runs from this
pip install peclet-flow-cu13 peclet-dem-cu13 # CUDA wheels for the GPU sections
```
**Why peclet?**
:::::: {.pitch}
- **One stack, three physics.** A validated Navier–Stokes solver, an XPBD discrete-element solver,
and the volume-averaged coupling between them — the same SDF geometry and the same Python arrays
end to end.
- **Python-first, zero-copy.** Fields and particle states are NumPy/CuPy views into solver memory —
no file shuffling, no lock-in, `matplotlib`/`PyVista` straight from the GPU.
- **Runs where you are.** The identical script runs on a free Colab CPU, a workstation GPU, or an
MPI cluster. Every example carries an *Open in Colab* badge.
- **Evidence, not claims.** Every figure on this site is produced by executing the page against the
released package — analytical solutions, published benchmarks (Ghia, Schäfer–Turek, Zick–Homsy,
MFIX-Exa, X-ray tomography beds), and textbook checks throughout.
- **Honest scale.** A million-particle fluidized bed — deposition, drag, projection, collisions —
advances in seconds per step on a single GPU.
::::::
---
## Single-phase flow
:::::: {.section-lead}
The `flow` solver: exact and canonical benchmarks for the cut-cell immersed-boundary
Navier–Stokes core — from machine-precision channel flow to buoyant convection and a turbulent
channel DNS.
::::::
:::::: {.grid}
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/poiseuille-ibm/index.qmd)
::: {.card-body}
#### [Plane Poiseuille — cut-cell IBM is exact](examples/poiseuille-ibm/index.qmd)
Channel flow past immersed no-slip walls, reproduced to machine precision — and the validation
trap that makes it *look* inexact.
[flow · IBM · verification]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/pipe-poiseuille/index.qmd)
::: {.card-body}
#### [Pipe flow — second-order convergence](examples/pipe-poiseuille/index.qmd)
The same parabolic flow through a *curved* wall, where the cut cells show their genuine O(h²)
accuracy.
[flow · IBM · convergence]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/taylor-green/index.qmd)
::: {.card-body}
#### [Taylor–Green vortex](examples/taylor-green/index.qmd)
An exact unsteady Navier–Stokes solution: divergence projected to ~10⁻¹⁵, kinetic energy decaying
at the analytic rate.
[flow · projection · verification]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/lid-driven-cavity/index.qmd)
::: {.card-body}
#### [Lid-driven cavity](examples/lid-driven-cavity/index.qmd)
The classic recirculating benchmark against the Ghia–Ghia–Shin tables, up to Re 1000.
[flow · benchmark]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/developing-channel/index.qmd)
::: {.card-body}
#### [Developing channel flow](examples/developing-channel/index.qmd)
A uniform stream relaxes into the parabolic profile — the entrance region with inflow/outflow
boundaries.
[flow · boundary conditions]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/backward-facing-step/index.qmd)
::: {.card-body}
#### [Backward-facing step](examples/backward-facing-step/index.qmd)
Separation and reattachment: the canonical separated-flow benchmark, reattachment length tracked
vs Reynolds number.
[flow · separation · benchmark]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/cylinder-vortex-street/index.qmd)
::: {.card-body}
#### [Cylinder vortex street](examples/cylinder-vortex-street/index.qmd)
Kármán shedding past an immersed cylinder, drag/lift and Strouhal number vs the Schäfer–Turek
benchmark.
[flow · IBM · benchmark]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/rayleigh-benard/index.qmd)
::: {.card-body}
#### [Rayleigh–Bénard convection](examples/rayleigh-benard/index.qmd)
3-D Boussinesq convection on the GPU: critical Rayleigh number to 0.4%, Nusselt numbers matching
published DNS.
[flow · heat transfer · GPU]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/wall-bounded-turbulence/index.qmd)
::: {.card-body}
#### [Wall-bounded turbulence](examples/wall-bounded-turbulence/index.qmd)
A channel DNS against the Moser–Kim–Mansour data, with the HPC submit scripts to reproduce it.
[flow · DNS · MPI/HPC]{.tags}
:::
::::
:::::
::::::
## Flow through packings & porous media
:::::: {.section-lead}
Where `dem` meets `flow`: build a packing with the particle solver, hand the geometry to the fluid
solver as a signed-distance field, and measure drag and permeability against the literature.
::::::
:::::: {.grid}
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/zick-homsy/index.qmd)
::: {.card-body}
#### [Zick–Homsy sphere arrays](examples/zick-homsy/index.qmd)
Stokes drag through ordered sphere lattices to <0.5% of the exact series solutions, across the
full solid-fraction range.
[flow · IBM · verification]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/random-packed-bed/index.qmd)
::: {.card-body}
#### [Random packed bed](examples/random-packed-bed/index.qmd)
Pour a packing with `dem`, solve the flow through it, recover Kozeny–Carman/Ergun permeability.
[dem → flow · permeability]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/ring-packed-bed/index.qmd)
::: {.card-body}
#### [Ring packed-bed permeability](examples/ring-packed-bed/index.qmd)
A parametric ΔP study over beds of Raschig rings — non-spherical packing to pressure drop in one
pipeline.
[dem → flow · non-spherical]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/pall-ring-flow/index.qmd)
::: {.card-body}
#### [Pall-ring bed flow](examples/pall-ring-flow/index.qmd)
The frozen dem pack becomes flow geometry analytically; the pressure drop lands within 5% of
Ergun fed the pack's own measured porosity and Sauter diameter.
[flow · dem · porous]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/pore-network-extraction/index.qmd)
::: {.card-body}
#### [Pore-network extraction](examples/pore-network-extraction/index.qmd)
Watershed the SDF into pores and read exact throat conductances straight off a resolved
Stokes solution.
[pnm · flow]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/pore-mesh-voronoi/index.qmd)
::: {.card-body}
#### [Pore-space Voronoi mesh](examples/pore-mesh-voronoi/index.qmd)
Tessellate the void space of a packing into a graded polyhedral mesh with the `voro` engine.
[dem → voro · meshing]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/voronoi-taylor-green/index.qmd)
::: {.card-body}
#### [Navier–Stokes on a Voronoi mesh](examples/voronoi-taylor-green/index.qmd)
Taylor–Green on an unstructured Voronoi mesh with `voro`'s covolume and collocated solvers: exact energy conservation vs second order.
[voro · flow · verification]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/voronoi-sphere-drag/index.qmd)
::: {.card-body}
#### [Body-fitted walls: Poiseuille and sphere drag](examples/voronoi-sphere-drag/index.qmd)
SDF-clipped Voronoi cells as walls: the exact parabola with a quadratic wall gradient, and Zick–Homsy sphere-array drag with the semi-implicit Stokes march.
[voro · sdf · porous media]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/pore-mesh-redistribution/index.qmd)
::: {.card-body}
#### [Redistributing pore-space seeds](examples/pore-mesh-redistribution/index.qmd)
Split, merge and relax interstitial seeds toward a uniform or wall-graded cell volume — the moves a position-only optimiser cannot make.
[voro · meshing]{.tags}
:::
::::
:::::
::::::
## Two-phase flow (VoF)
:::::: {.section-lead}
Sharp interfaces on a fixed grid: geometric volume-of-fluid transport, a balanced-force
continuum surface force, and momentum-consistent advection at large density ratios. Four pages are
gated against something outside the solver — an exact algebraic identity, the exact viscous
normal modes, a published benchmark — one composes all of it with a `dem` packing, and the last
puts the whole stack to work on the question porous media actually ask: which pore fills first.
::::::
:::::: {.grid}
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/bubble-through-packing/index.qmd)
::: {.card-body}
#### [Bubble through a packed bed](examples/bubble-through-packing/index.qmd)
A `dem` packing, cut-cell VoF, a contact angle and momentum-consistent transport in one run —
the bubble squeezes through the throats, the gas volume holds to 1e-9.
[dem → flow · VoF · wetting]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/pore-scale-imbibition/index.qmd)
::: {.card-body}
#### [Pore-scale displacement](examples/pore-scale-imbibition/index.qmd)
A pore doublet, a sphere packing and a micromodel: the contact angle alone decides whether the
narrow pore fills or is bypassed — and a slip control shows where the wetting dynamics stop.
[flow · VoF · wetting · porous]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/vof-advection-benchmarks/index.qmd)
::: {.card-body}
#### [VoF advection benchmarks](examples/vof-advection-benchmarks/index.qmd)
Zalesak's slotted disc and LeVeque's reversing deformation: shape error at order 2.16, and a
volume drift that turns out to be the pressure solve's divergence residual.
[flow · VoF · verification]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/parasitic-currents/index.qmd)
::: {.card-body}
#### [Parasitic currents](examples/parasitic-currents/index.qmd)
The droplet that should not move: machine-zero spurious currents with an exact curvature, and a
factor 3e15 riding on one operator pairing.
[flow · VoF · surface tension]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/capillary-oscillations/index.qmd)
::: {.card-body}
#### [Capillary oscillations](examples/capillary-oscillations/index.qmd)
A ringing wave and a ringing drop against the exact viscous normal modes: the wave closes to
0.6%, the drop keeps a 4% deficit nobody has yet explained.
[flow · VoF · verification]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/rising-bubble/index.qmd)
::: {.card-body}
#### [Rising bubble (Hysing et al.)](examples/rising-bubble/index.qmd)
Both benchmark cases at density ratios 10 and 1000 — centroid to 0.02%, and the
momentum-consistent transport that buys a factor five.
[flow · VoF · benchmark]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/droplet-wetting/index.qmd)
::: {.card-body}
#### [Droplet wetting](examples/droplet-wetting/index.qmd)
Set a contact angle on an immersed solid and get it back within a degree — plus the wall
placement that silently freezes the contact line.
[flow · VoF · wetting]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/trickle-flow-packing/index.qmd)
::: {.card-body}
#### [Trickle flow over a packing](examples/trickle-flow-packing/index.qmd)
Liquid dripped onto 34 wetting spheres with an open outlet below: holdup, wetted area and
pressure drop, with the colour budget closing at the projection floor.
[flow · dem · VoF · porous media]{.tags}
:::
::::
:::::
::::::
## Resolved particles & moving geometry
:::::: {.section-lead}
Bodies the fluid actually resolves: analytic CSG shapes as cut-cell geometry, walls and particles
that move through the grid, and the exactly conservative reaction force and torque that couple
them to `dem`. Every page here is gated against an exact solution — and two of them document the
solver defects they uncovered on the way.
::::::
:::::: {.grid}
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/oscillating-sphere/index.qmd)
::: {.card-body}
#### [Oscillating sphere](examples/oscillating-sphere/index.qmd)
Unsteady Stokes drag, in-phase and out-of-phase, within 0.23% of Stokes (1851) — and a periodic
box that screens its own images.
[flow · moving geometry · exact]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/moving-sphere-drag/index.qmd)
::: {.card-body}
#### [Moving sphere: does the drag spike?](examples/moving-sphere-drag/index.qmd)
The classic immersed-boundary pathology, measured — and the fresh-cell fix that removes a
resolution-independent 2.6% drag bias. Finite Re within 0.4% of Blackburn (2002).
[flow · moving geometry · IBM]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/rotating-sphere-torque/index.qmd)
::: {.card-body}
#### [Rotating sphere torque](examples/rotating-sphere-torque/index.qmd)
A negative result, then a fix: the missing wall term is μ(n×Ω) in closed form. −31% → +2.2%
converging, and the first freely rotating resolved particle decays at 1.04× its box's own drag.
[flow · torque · exact]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/jeffery-orbit/index.qmd)
::: {.card-body}
#### [Jeffery orbit](examples/jeffery-orbit/index.qmd)
A spheroid tumbling in shear through a full resolved rotational loop — the half-period within
3–5% of Jeffery's exact 1922 solution, and the bug hunt that made it possible.
[flow · dem · torque · exact]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/dumbbell-drag/index.qmd)
::: {.card-body}
#### [Dumbbell drag](examples/dumbbell-drag/index.qmd)
Two fused spheres against the exact bispherical solutions — the axial drag to 0.1%, and the
anisotropy that turns a settling doublet broadside-on.
[flow · CSG · exact]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/ten-cate-sphere/index.qmd)
::: {.card-body}
#### [Sedimenting sphere (ten Cate)](examples/ten-cate-sphere/index.qmd)
The classic settling benchmark, resolved: E1 within 3% and E4 within 2% of the PIV at the
coarsest rung — after two solver fixes and one geometry trap that hid for two campaigns.
[flow · dem · coupling · experiment]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/galilean-drag/index.qmd)
::: {.card-body}
#### [Galilean invariance at finite Re](examples/galilean-drag/index.qmd)
A sphere towed through fluid at rest against the same sphere held in a stream — one problem,
two frames, and the moving-geometry machinery reproduces the fixed answer to 0.03% at Re 1.5.
[flow · moving geometry · exact]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/confined-drag-screening/index.qmd)
::: {.card-body}
#### [Confinement at finite Re](examples/confined-drag-screening/index.qmd)
The 39% Faxén wall correction that inertia screens down to a tenth by Re 1.5, measured with the
static twin of a settling experiment — and the periodic-box geometry trap that hid it.
[flow · CSG · verification]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/drafting-kissing-tumbling/index.qmd)
::: {.card-body}
#### [Drafting, kissing, tumbling](examples/drafting-kissing-tumbling/index.qmd)
Two spheres released in line in a closed box draft, touch, and tumble apart side by side — the
classic two-body resolved-coupling test, with nothing prescribed and contact handled by the DEM.
[flow · dem · coupling · two bodies]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/nonsphere-drag/index.qmd)
::: {.card-body}
#### [Non-spherical Stokes drag](examples/nonsphere-drag/index.qmd)
Equal-volume drag ratios, validated against the exact Oberbeck spheroid — then a cube whose
drag is orientation-independent to 0.14%, as its symmetry demands.
[flow · CSG · exact]{.tags}
:::
::::
:::::
::::::
## Granular dynamics
:::::: {.section-lead}
The `dem` solver on its own: dense packings of spheres and arbitrary SDF shapes, moving container
geometry, and hundred-thousand-particle scale on one GPU.
::::::
:::::: {.grid}
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/sdf-particle-packing/index.qmd)
::: {.card-body}
#### [Custom-shaped particles](examples/sdf-particle-packing/index.qmd)
Pack arbitrary shapes — capsules, stars, imported meshes — via signed-distance collision.
[dem · SDF shapes]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/rotating-drum/index.qmd)
::: {.card-body}
#### [Rotating drum](examples/rotating-drum/index.qmd)
A moving SDF wall drives continuous avalanching at a steady dynamic angle of repose.
[dem · moving walls]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/stirred-column/index.qmd)
::: {.card-body}
#### [Stirred column](examples/stirred-column/index.qmd)
A pitched-blade impeller whose geometry actually sweeps, mixing 22 000 grains — Lacey index
0.06 → 0.93 in five revolutions.
[dem · moving geometry · mixing]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/tennis-racket/index.qmd)
::: {.card-body}
#### [Tennis-racket theorem](examples/tennis-racket/index.qmd)
A racket authored as a CSG tree flips about its intermediate axis — within 0.02% of the
torque-free Euler equations.
[dem · CSG · exact]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/pall-ring-packing/index.qmd)
::: {.card-body}
#### [Pall-ring packing](examples/pall-ring-packing/index.qmd)
An industrial packing element as a certified CSG tree, poured into a periodic box — and an honest
reading of its voidage.
[dem · CSG · packing]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/tumbling-cubes/index.qmd)
::: {.card-body}
#### [Tumbling cubes](examples/tumbling-cubes/index.qmd)
100,000 sharp-edged cubes cascading in a drum at ~10 ms per step on one GPU — with the movie.
[dem · non-spherical · GPU]{.tags}
:::
::::
:::::
::::::
## Gas–solid CFD-DEM
:::::: {.section-lead}
The `coupling` module runs both solvers together — volume-averaged gas, per-particle drag,
momentum-conserving feedback — and reproduces published gas–solid benchmarks one-to-one.
::::::
:::::: {.grid}
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/fluidized-bed/index.qmd)
::: {.card-body}
#### [Fluidized bed at engineering scale](examples/fluidized-bed/index.qmd)
One million 1 mm glass beads in air: the bed unpacks, bubbles, and carries its weight in the
pressure drop — live CFD-DEM on one GPU.
[coupling · 10⁶ particles · GPU]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/single-bubble-injection/index.qmd)
::: {.card-body}
#### [Single-bubble injection](examples/single-bubble-injection/index.qmd)
An injected bubble rises through an incipient bed — shape and rise velocity against MRI
measurements and MFIX-Exa.
[coupling · validation]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/bidisperse-segregation/index.qmd)
::: {.card-body}
#### [Bidisperse segregation](examples/bidisperse-segregation/index.qmd)
Jetsam sinks, flotsam floats: species segregation in a bubbling bed, following the MFIX-Exa
configuration.
[coupling · segregation]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-sm-6 .g-col-lg-4}
:::: {.gallery-card}
[](examples/hcs-clustering/index.qmd)
::: {.card-body}
#### [Homogeneous cooling & clustering](examples/hcs-clustering/index.qmd)
Haff's law, the clustering instability, and a one-to-one energy-decay overlay with the MFIX-Exa
benchmark.
[coupling · benchmark]{.tags}
:::
::::
:::::
::::::
---
## Trust, but verify
The examples above *show* what the suite does; two growing collections *prove* it stays correct:
:::::: {.grid}
::::: {.g-col-12 .g-col-md-6}
:::: {.gallery-card}
::: {.card-body}
#### [Sanity checks →](sanity-checks/index.qmd)
Small problems with closed-form answers — restitution, wall bounce, sliding-to-rolling, static
stacks, spin–friction coupling, and a deep layered bed at rest. Each check records a number
against theory in a pass/fail scorecard; together they are the regression tripwire run against
every solver change. New checks are added as new physics lands.
[dem · regression · scorecard]{.tags}
:::
::::
:::::
::::: {.g-col-12 .g-col-md-6}
:::: {.gallery-card}
::: {.card-body}
#### [Benchmarks →](benchmarks/index.qmd)
Quantitative characterization where there is a trade-off to measure, not just a pass to record —
discretization variants, convergence orders, accuracy-versus-cost. Start with
[staggered vs collocated](benchmarks/staggered-vs-collocated/index.qmd) Stokes-drag convergence.
This collection grows as design decisions get measured.
[flow · convergence · characterization]{.tags}
:::
::::
:::::
::::::
## Run any of this yourself
Every page is a self-contained notebook: it builds its geometry and sets every parameter inline.
Click the *Open in Colab* badge on any example to run it on a free CPU runtime, or:
```bash
pip install peclet && git clone https://github.com/computational-chemical-engineering/peclet-examples
quarto render peclet-examples/examples/taylor-green/index.qmd --execute
```
The GPU sections (million-particle beds, cube drums, DNS) need the CUDA wheels or a local build —
each page's *Reproduce this* section gives the exact commands.
:::::: {.callout-note}
## How these pages build
Solver-backed outputs are executed by the authors and **frozen** into the repository, so the site
always builds without a GPU — and what you read is exactly what the released code produced.
::::::