Skip to content

peclet-flow 1.0.0

Choose a tag to compare

@eajfpeters eajfpeters released this 12 Sep 02:10
· 623 commits to main since this release

peclet-flow 1.0.0 — THE flow solver of the family: an incompressible cut-cell immersed-boundary Navier-Stokes solver on a staggered MAC grid, with a collocated variant sharing the same Python API, geometric VoF two-phase flow, analytic moving geometry, scalar transport and a validated distributed solve that is bit-exact to single-rank. This release brings the physical-units API: the solver takes a physical domain and physical properties, and the discretization is derived rather than supplied. Anisotropic cells work on both grids.

Operator storage is now double by default. Float storage breaks the singular row-sum identity A·1 = 0 at high multigrid contrast, and it breaks it silently: on a dense bed the residual floors and then rebounds, so the run is invalid rather than merely less accurate. Measured cost of being wrong on a random close packing at rtol 1e-8: float took 24/33/capped iterations at max|div| 4.5e-06, against 14/14/28 and 9.5e-12 in double. A float build is one flag away and now warns. Your numbers change in the last digits wherever the operator is involved; the accuracy and efficiency baselines do not move, and max|div| improves by about two orders of magnitude.

Build time, for anyone working on the source: the solver template is now compiled once per grid rather than once per consumer, so a full rebuild costs a quarter of the CPU it did and editing one of the twelve domain headers rebuilds four objects instead of forty-nine. Proved bit-exact.

Tested: 155/155 on the OpenMP backend — 49 single-rank plus 106 distributed at np 1, 2 and 4 — 49/49 single-rank on CUDA, and the accuracy and efficiency regression passing with every gated metric unchanged.

peclet 1.0.0 — the clean break.

This is the family's first major release. Every package moves to 1.0.0 together, because the
release removes every non-canonical Python name outright instead of deprecating it: there were no
external users, so the names were fixed once rather than carried forever. From 1.0.0 on the
deprecation ladder in docs/NAMING.md is binding — a rename is additive and deprecated for two
releases before removal, and a break costs a major.

The headline feature is the physical-units API: solvers take a physical domain and physical
properties, and the spatial discretization is derived rather than supplied. Anisotropic cells work
on both grids, single-phase and VoF.

One deliberate numerics change. peclet.flow now stores its operators in double precision by
default. Float storage breaks the singular row-sum identity A·1 = 0 at high multigrid contrast,
and it breaks it silently — on a dense bed the residual floors and then rebounds, so the run is
invalid rather than merely less accurate. A float build is one flag away and now warns. Results from
the default build change in the last digits wherever the operator is involved; the accuracy and
efficiency baselines do not move, and max|div| improves by about two orders of magnitude.

Full changelog, including every removed name with its replacement and the known limitations:
https://github.com/computational-chemical-engineering/peclet/blob/main/CHANGELOG.md