Decision register¶
What this project chose, what it rejected, and why. It exists because settled decisions were being silently reversed — a later session picking the textbook alternative because nothing in front of it said the project had already rejected that alternative on purpose.
Read the entry for anything you are about to change. Reversing a decision here takes a new, explicit decision recorded the same way, with what changed to justify it — never a judgement call in the moment.
The highest-risk prohibitions are additionally inlined in each submodule's CLAUDE.md, because a
register only works if it is reachable from where the work happens. This file is the index; the
verbatim quotes, provenance and supersession chains live in docs/decisions/<area>.md.
Entries marked ⚠️ are unresolved contradictions found during the harvest — do not rely on either reading until they are settled.
Provenance. A bare <note>.md:<line> source names a note in the maintainer's Claude memory
(~/.claude/projects/-home-frankp-Codes-suite/memory/). Since the 2026-10-08 memory clean-up most of
those notes live in its archive/ subdirectory, and trimmed notes may have shifted line numbers —
grep for the quoted text rather than trusting the line. A source that names a commit or a repo path
is authoritative.
flow — Navier-Stokes, IBM, pressure/velocity solve¶
229 in force, 41 superseded — full text in decisions/flow.md
In force¶
- "Hand the stopping level to GraphAMG" telescoping idea is retired. Rejected: handing the MG-telescoping stopping level to GraphAMG mg-decomposition-alignment.md:75
- (1,2) mixed closure order is the recommended default going forward. Rejected: binary-M lagging (divergent, ρ=1.087) and linear-everywhere (1,1) (worse pointwise near the IB) flow-ghost-projection.md:50
- A masked solid cell is not a fluid sample. sdf-scene-campaign.md:44
- API/ordering: x-fastest is fixed; PyVista/VTK [x,y,z] + F-contiguous convention. Rejected: order='F' as the user-facing default and [z,y,x] indexing suite-distributed-status.md:177-184
- Agglomerated redundant coarse solve deferred pending multi-rank hardware. Rejected: shipping the agglomerated coarse solve untested at np<=4 suite-distributed-status.md:296-299
- Agglomerated/"auto" bottom solve default is gated to the singular (mean-removed) path only, not enabled universally. Rejected: enabling "auto" bottom solve on Dirichlet-anchored/outflow operators agglomerated-bottom-ibm-fix.md:45
- Agreement across configurations sharing a floor is not proof of convergence. Rejected: treating cross-config agreement alone as sufficient evidence of convergence defect-correction-campaign.md:65-70
- All level-0 partitioning must go through one shared factory; never hand-build a BlockDecomposer for the solver. Rejected: hand-building a separate BlockDecomposer at any of the three call sites mg-decomposition-alignment.md:56
- Allreduce diet: fuse mean-removal sum+count; 'fine' mean-removal scope as bench/pack default, 'all' stays solver default pending Snellius validation. parallel-scaling-study.md:81-86
- An Anderson restart restores the last kept map output; the state never holds a rejected evaluation (review R2). Rejected: "Restart keeps Rprev/Gprev (step 6 still commits)" — the fifth restart then left the state at the rejected output flow
- Anisotropic MG coarsening order: coarsen axis a iff H_a < 2·min H over coarsenable axes, engaged only under
aniso. Rejected: applying the anisotropic coarsening rule to the isotropic path (would change isotropic bits) physical-units-phase2-aniso.md:47-51 - Anisotropic wall-gradient normal/foot-point convention (⚑B). physical-units-phase2-aniso.md:52-54
- Benchmark layouts on Zen never straddle an L3 (CCD) with one rank. Rejected: 8x3 on contiguous cores 0-23 (ranks straddling CCDs) design
- Block VoF container stages batched: one launch per stage for all markers, block-ordered force gather. Rejected: per-block CUDA streams; a pooled atlas of all blocks; atomics in the force scatter (order) flow
- Block VoF: colliding markers — debris removal with exact return, a block-only curvature clip, a gated gas–gas capillary bound. Rejected: union-colour force assembly (statically unnecessary; re-creates numerical coalescence flow
- Block-container statistics in one team-per-block launch, read back deferred (C2); host MG reductions in pencil order (B2). Rejected: C2 — three fenced per-block reductions per statistic; B2 — host MDRange reductions with flow
- Body-force ghost policy: Neumann copy, pinned to ρ's policy. vof-campaign.md:145-154
- Boiling scope addition did not resurrect transported-φ CLSVOF. Rejected: transported-φ CLSVOF vof-campaign.md:101-106
- Bubble-column benchmark case runs at pressure rtol 1e-8; the solver default stays 1e-10. Rejected: 1e-6 (iterations 7.49, but a systematic gas-volume drift 1.5e-9 per 2000 steps — USER
- Byte-identical gating is unmeasurable for atomic-add paths — gate against the path's own run-to-run spread instead. Rejected: a byte-identical regression gate for atomic-add code paths defect-correction-campaign.md:55-57
- CA (event-halving) smoothing ships default ON with an env kill switch. comm-scaling-plan.md:23
- CSF force is exact; curvature error is the real budget — improve κ, never the force. Rejected: arithmetic cell-force interpolation (set_csf_mode(1)); improving the force term to chase lower Ca vof-campaign.md:430-444
- CUDA wheel dependency name: nvidia-cuda-runtime, not the deprecated -cu13 suffix. Rejected: depending on the
nvidia-cuda-runtime-cu13package name peclet-cuda-wheel-feasible.md:28-30 - Cell-average IBM scheme, not point-value, for Poiseuille validation. Rejected: point-value scheme (ibmFillEntry<0>) cuda-kokkos-migration.md:285-287
- Channel DNS IC must seed streamwise rolls/streaks in wall units, not cold random noise. Rejected: cold random-noise initial condition; perturbation cutoff specified in cycles/cell channel-dns-isotropic-grid.md:46
- Chebyshev pressure bounds re-estimated from a warm start after a coefficient rebuild (D3). Rejected: the cold 15 + 15 estimate every step (30 of 44 V-cycles per step); warm-starting from a flow
- Chebyshev pressure driver's apparent win was a placement artifact, not a real gain. Rejected: adopting the Chebyshev pressure driver based on the uncontrolled 36% win momentum-solve-residual-stop.md:39
- Clean-fluid-interior mask required on both restriction and prolongation for IBM velocity-MG correctness. Rejected: θ-weighting the diagonal's identity (I) term; coupling the coarse grid at cut/solid cells (masking cut cells only, not solid cells, was tried and stil velocity-mg-design.md:54-64
- Coarse-first decomposition ships opt-in, legacy remains the default. Rejected: making coarse-first decomposition the default mg-decomposition-alignment.md:22
- Coarse-level solve policy default stays "smoother", not "auto", because auto regresses the cut-cell IBM path. Rejected: making "auto" the default coarse-level solve policy mg-decomposition-alignment.md:28
- Collocated AUTO default = ghost projection (2026-08-25), superseding "ghost as production is a dead end". Rejected: gauge-exact (ex mode 9) as the unconditional collocated default, chosen by the 2026-08-18 A/B; the 2026-08-20 verdict's "ghost as production" dead end flow
- Collocated momentum advection uses the PROJECTED divergence-free face field, not the cell→face average. Rejected: the un-projected cell→face average ½(u_i+u_j) as the collocated advecting velocity flow/doc/uf_advection.md;
- Collocated pressure coupling is the ABC (MAC) approximate projection, NOT Rhie–Chow. Rejected: Rhie–Chow interpolation as the collocated coupling sdflow-collocated-solver.md:37-39
- Collocated variable density (V8): the mass-adjoint ABC pair; the face-acceleration form is retired. Rejected: face acceleration after the viscous solve (non-incremental; unstable with the rotational flow
- Conjugate scalar transport is two fields on one grid in ψ = c/K, with the series-resistance 2×2 elimination at the fluid and solid probes (P2F). Rejected: Peters' directional one-field scheme (min-curvature T_ξ; Maxwell disc at d/h = 128, L1/L∞: DIRc 6.7e-5/6.0e-3, 5.7e-6/4.0e-4, 7.9e-6/4.3e-4, 1.9e-4/8. flow
- Constant-coefficient (Dodd–Ferrante) pressure driver PARKED: fails the static-balance gate. Rejected: merging it as opt-in despite the failed gate; a third design round (uncertain, the USER
- Container slab half-extent must equal L/2 + wall thickness, never more (periodic-image rule). Rejected: an oversized slab half-extent advective-cutwall-flux-plan.md:57
- Correction: the raw field registry hands out internal (unconverted) arrays. physical-units-plan.md:28
- Coupling partial/cut+solid cells to the coarse grid fails regardless of coarsening depth — capping depth cannot fix it. Rejected: capping coarsening depth as a fix for partial-cell coupling divergence velocity-mg-design.md:118-135
- Crank-Nicolson ported then reverted; backward-Euler is the right default. Rejected: Crank-Nicolson (θ=0.5) time integration with the plain explicit Laplacian suite-distributed-status.md:320-324
- Cut-cell C convention: liquid fraction of fluid volume, openness-weighted. vof-campaign.md:98-100
- Cut-cell scalar transport stores κ (the fluid fraction) in storage and sources. Rejected: unit storage, i.e. the legacy scalar's (first order; the Neumann eigenvalue 11 % off at 32 cells per diameter; 2–12 % mass loss under advection) flow
- Cut-cell scalars refuse the ghost projection (collocated 'ghost', staggered set_ghost_projection) and, for now, collocated open faces. Rejected: advecting with the ghost projection's face field under its binary openness
oxb_(divergence 4.3e-2 of max|F|) or the geometricox_(2.0e-2): a con rulings - Deferred correction is not viable as an undamped fallback. Rejected: undamped deferred correction as the C/F / ghost solve fallback flow-ghost-projection.md:29
- Design constraints for any collocated-plateau fix. Rejected: Basilisk's dt·a face event and both embed-note salvage approaches (ruled out by C2); any fix that fragments the CG graph (ruled out by C4) collocated-second-order-verdict.md:51-55
- Device pressure bottom: block-tridiagonal FP32 direct factor preconditioning FP64 FCG ('direct', the GPU default). Rejected: B1's single-team V-cycle preconditioner (measured +5.3 ms/step, ~1250 dependent phases flow
- Distributed cut-cell MG coarse levels must be nested, not independently re-decomposed. Rejected: independent per-level BlockDecomposer ORB for MG coarse levels channel-dns-isotropic-grid.md:52
- DistributedNS declared canonical; clean API; periodic BCs only; MPI a true build option. Rejected: keeping pnm_backend API compatibility; a halo-BC system for future boundary conditions suite-distributed-status.md:247-251
- DistributedNS solves in physical units (ρ, dynamic μ, force/volume), not kinematic ν. Rejected: the kinematic (ρ≡1, single-ν) formulation as the solved system sdflow-dt-divided-convention.md:46-59
- DistributedStokes renamed to DistributedNS. suite-distributed-status.md:14-18
- Divergence in mixed-order ghost projection (GPORDER 1,2) is caused by the incremental-rotational pressure accumulation, not the linear solve. Rejected: attributing the (1,2) divergence to the linear solve tolerance or resolution ghost-hardening-plan.md:50-59
- Divergence uses flux openness (beta); MG uses operator openness (alpha). Rejected: using the same openness definition for both divergence and MG operator cuda-kokkos-migration.md:325-327
- Do not make the preconditioner rho-aware — harmful, and no compatibility floor exists in practice. Rejected: making the preconditioner rho-aware; the H1 hypothesis that GP_THETA_MIN fires and causes the trouble ghost-hardening-plan.md:26-37
- Domain-BC all-fluid velocity must use double diffSmoothColor, not float IBM stencil. Rejected: float IBM stencil for domain-BC all-fluid velocity cuda-kokkos-migration.md:318-320
- Domain-BC paths stay blocking, following the VelocityMG precedent. Rejected: applying halo-compute overlap to domain-BC paths comm-scaling-plan.md:22
- Double operator storage is the DEFAULT (SCALING_ISSUES #1 closed by decision). Rejected: (a) leaving float as the default and documenting the limitation — rejected because the flow/CMakeLists.txt:48-72
- Drag must be included in bcStencilPath() whenever advection is off. porous-cfddem-cuda-two-bugs.md:14
- E2 resolved: the aspect coarsening rule alone fixes MG-PCG stall on stretched grids — no auto-FCG/symmetric-V-cycle decision needed. Rejected: needing a separate symmetric-V-cycle-under-aniso or auto-FCG-on-aniso decision physical-units-phase2-aniso.md:28-31
- Earlier "slow convergence / non-converged" worry was a multiplied-dt float-precision artifact, fixed by the divided-dt engine convention. Rejected: the multiplied-dt momentum-operator convention ringbed-cfd-surrogate.md:63
- Embed momentum + mode-3 projection (mode 5) does not converge — over-drags. Rejected: mode 5 (embed momentum + mode-3 projection) as a viable configuration embed-port-progress.md:23
- Escalation rule: a twice-failed gate stops the work order, never gets its numerics tweaked to pass. Rejected: tweaking numerics to force a failing gate to pass vof-campaign.md:495-496
- Every VoF consumer is TOLD what a pure cell is; none decides on its own. Rejected: | this
- Every κ > 0 scalar cell with an open face is its own unknown; slivers are never merged or linked. Rejected: cell merging or linking of slivers (the H-k / Hf-1 link schemes: Neumann limit −4.2e-3 at order 1.0, against −6.2e-5 at order 2.0 for κ-FV with every flow
- Exact-crossing openness overrides must be masked to 0 at solid velocity points. Rejected: unmasked exact apertures at solid-velocity-point faces flow-ghost-projection.md:61
- FFT pressure solver (Dodd–Ferrante option E2(b)) DROPPED — no FFT driver in flow. Rejected: an FFT Poisson solver (new dependency) behind the constant-coefficient driver USER
- FV viscous operator confirmed 2nd-order-consistent — "face-flux placement" hypothesis refuted; barrier is the pressure coupling. Rejected: the "face-flux placement" hypothesis; the wall-pressure-term-on-momentum-force fix (both signs) sdflow-collocated-solver.md:152-166
- Face-primary uf reconstruction (mode 8) attempted and reverted — incompatible with flow's divided time convention. Rejected: mode 8 (face-primary uf via Basilisk's acceleration-event reconstruction) under flow's current divided momentum-operator convention embed-port-progress.md:33
- Final default: momentum residual tolerance follows the pressure solver's rtol, not a fixed constant. Rejected: a fixed residual-stop constant (1e-5), decided earlier the same day momentum-solve-residual-stop.md:53
- Fine-scope MG-PCG promoted to default after lever ablation. Rejected: 'all'-scope mean removal as the default; Chebyshev smoother; GraphAMG bottom solve (on GPU) parallel-scaling-study.md:162-164
- Fix: refresh the MG halo before computing the residual, not only before each colour sweep. Rejected: computing the MG residual from ghosts left stale by the pre-smooth's own halo exchange cpu-fat-rank-optimization.md:14-22
- Float MReal operator storage silently breaks A*1=0 at high MG contrast; peer's FCG/S3-indefiniteness fix is refuted for this case. Rejected: the VoF peer's indefinite-pivot S3 model as the explanation for this case's MG degradation collocated-attractor-campaign.md:56
- Fragmentation guard: BFS-isolated pockets are treated as solid for the projection only. flow-ghost-projection.md:81
- Free-variable fix: pin phi=0 at decoupled cells after the solve. Rejected: leaving free variables (solid-centered / BC_ONLY rows) unpinned after the Krylov solve flow-ghost-projection-mpi-plan.md:19
- Fresh (newly-uncovered) cells must be seeded with the local wall velocity, not inherit the solid value. Rejected: inheriting the solid's prior value in a freshly-uncovered cell sdf-scene-campaign.md:97
- Fused periodic wrap in smoother / residual / matvec; device-resident Krylov scalars; no copies around the preconditioner. Rejected: fill-then-sweep with CUDA graph capture; lagged stop checks (not bitwise) flow
- GPU binding must let SLURM cgroup-isolate; manual CUDA_VISIBLE_DEVICES remap fights SLURM. Rejected: PECLET_BIND_GPU=1 manual remap channel-dns-isotropic-grid.md:45
- GPU-aware MPI is not the shipped default on Snellius 2024a due to a toolchain conflict. Rejected: building the solver against the GPU-aware-validated CUDA 12.1.1 stack channel-dns-isotropic-grid.md:44
- Geometric const-coeff + masking are the validated defaults; Galerkin/CG is opt-in. Rejected: making Galerkin/CG the default suite-distributed-status.md:98-100
- Ghost-plane MASK must be exchanged under motion, not just velocity fields. Rejected: exchanging only uBc_/velocity without exchanging the mask ("uBc_ exchange alone changed nothing"); inner-only or ghost-only mask fill (both insufficie advective-cutwall-flux-plan.md:75
- Ghost-projection MPI design: gp-row ownership = inner-block cell; BiCGStab stages the iterate on a g=2 block rather than doing a second exchange. Rejected: a second separate exchange to satisfy the ±2 overlay reach flow-ghost-projection-mpi-plan.md:13-16
- Gibou-style NS scheme identified as a trap (adopted MAC/staggered for stability, not a collocated precedent). Rejected: the Gibou-path literature precedent for a collocated 2nd-order scheme sdflow-collocated-solver.md:169-174
- GraphAMG re-enabled as porous+drag default after two BC-blind defects fixed. Rejected: leaving GraphAMG gated off for domain-BC problems porous-cfddem-cuda-two-bugs.md:27
- Grid-convergence studies must report dimensionless permeability k* = k/N², not dimensional k. Rejected: reporting dimensional k_cells directly as a convergence metric sdflow-regression-suite.md:20-22
- Grid-dimension convention: MG per-axis coarsening depends on factors of two; always check halvings before proposing a grid. Rejected: choosing benchmark grid dimensions without checking per-axis halving depth (led to a "WORSE" refine ladder caught before burning GPU hours) channel-scaling-rebenchmark.md:182-200
- Guidance: ghost for resolved/smooth IBM geometry, cutcell aperture for tight-throat porous media. Rejected: using ghost projection for under-resolved tight-throat porous media flow-ghost-projection.md:86
- Height-function columns stay 7 cells; longer (Popinet/TBFsolver-style) column walks are rejected. Rejected: 9- and 11-cell columns to cut tier-3 work
doc/vof_curvature_cost_design.md - Host backends use the 'direct' pressure bottom where eligible (reverses §13 D-5's host clause and Q-D6's default). Rejected: GraphAMG kept for host bitwise; GraphAMG at tau = 1e-5; GraphAMG setup reuse flow
- Host launch rule: pencils on host, MDRange on device, one cell body; -ffp-contract=off on host, -march opt-in. Rejected: host MDRange in hot paths (2.4x); rebuilding the shared Kokkos prefix with Kokkos_ARCH flow
- Host list-driven batch kernels launch over exact counts with a dynamic schedule; host region kernels iterate rows. Rejected: upper-bound launches under GCC's contiguous static schedule (idle threads on the flow
- Host-serial-kernel threshold lever kept despite measuring as marginal at the fat-rank size. Rejected: cutting reductions over to serial-below-threshold execution; a larger serial-cutoff (131072) cpu-fat-rank-optimization.md:43-49
- How to apply: staggered recommended for accuracy-critical drag/permeability; collocated for structural wins, at the cost of first order at curved walls. sdflow-collocated-solver.md:202-207
- IBM overlay needs no separate scaling change — linear in the base stencil. sdflow-dt-divided-convention.md:24-26
- IBM velocity-MG must NEVER un-scale the residual by 1/D_rescale. Rejected: un-scaling the restricted residual by 1/D_rescale to fix the +2-4% Z&H drag bias velocity-mg-design.md:24-35
- If a pressure method clearly wins at scale, make it the default. parallel-scaling-study.md:11-17
- Immersed scalar walls use probe-flux: one probe on the facet normal, the BC eliminated per facet. Rejected: flow's per-cell Dirichlet mask (order 0.7–1); the Gibou linear ghost alone; Papac/Gibou symmetric Robin (order 1.4–1.7, its Dirichlet limit a mask); t flow
- Incremental (rotational) pressure now default ON in C++ DistributedNS, matching the Python binding. Rejected: classical (non-rotational) pressure as the C++ default sdflow-dt-divided-convention.md:40-44
- Incremental-rotational pressure default ON in sdflow, OFF in DistributedNS. suite-distributed-status.md:325-332
- Instability fix: a wall-banded rotational-term blend, not the full rotational update everywhere. Rejected: the unblended full rotational update on the cell-centered approximate projection (unstable, PM-II instability) collocated-attractor-campaign.md:14
- Invariant: the ORB must never split the wall-normal axis (y) in wall-bounded flow. Rejected: allowing the ORB to split the wall-normal axis channel-scaling-rebenchmark.md:85-88
- Keep the staircase velocity-MG despite modest current efficiency win — it is the right operator for future AMR near contact points. Rejected: removing the staircase velocity-MG for lack of current efficiency win velocity-mg-design.md:113-116
- Lattice-plane trap: an SDF exactly 0 at a staggered point is invisible to both the fluid mask and the ghost detector. Rejected: face-aperture-based detector for the degenerate lattice-plane condition sdf-scene-campaign.md:150
- Level-0 BC hook must use fold=0 (reflection) for the unfolded stencil. Rejected: fold=1 momentum-solve-residual-stop.md:24
- M2 chosen as plain Richardson, not BiCGStab. Rejected: BiCGStab for M2 defect-correction-campaign.md:31
- MG telescoping ships off by default, byte-identical when off. mg-decomposition-alignment.md:79
- MG-PCG stalls on ρ- and eps/drag-scaled coefficient operators; Chebyshev is the default driver for those paths. Rejected: MG-PCG as the default driver for variable-density (and, per line 379/382, porous+drag) coefficient operators multiphysics-framework-plan.md:391
- MG-PCG's relative stopping test never fires on a near-quiescent field; a fixed-iteration cap is the workaround, not a proper fix. Rejected: relying on the relative (rtol) stopping criterion alone near a quiescent field flow-thermal-convection-validated.md:20
- MPI-optional single-source build: default is single-rank with no MPI linked. suite-distributed-status.md:332-345
- Marching-squares (order-2) apertures are now the shipped default in both flow and AMR. Rejected: order-1 (single-sample) apertures as default; an ungated marching-squares aperture (opens masked-DOF staggered faces) collocated-attractor-campaign.md:56
- Masking must exclude BOTH cut cells and solid cells, not cut cells alone. Rejected: masking cut cells only (without also masking solid cells) velocity-mg-design.md:64-75
- Method verdict: WY-split PLIC (B) chosen; CICSAM (A) rejected; CLSVOF (D) dropped. Rejected: CICSAM (A); CLSVOF (D) vof-campaign.md:89-92
- Mixed ghost widths require CutcellMG::parityOg to correct red-black colour parity. comm-scaling-plan.md:33
- Mode 10 (open-centroid quadrature) is dead — worse on Z&H and diverges on RCP slivers. Rejected: mode 10 open-centroid quadrature constraint flow-ghost-projection.md:119
- Mode 4 (fully-FV via defect correction) implemented and is a negative milestone — not 2nd order. Rejected: mode 4 as shipped (face-centre flux placement retained on the 6 axis faces) sdflow-collocated-solver.md:133-150
- Mode-10 quadrature, Seo-Mittal pressure-only split, and ghost-as-production are all dead ends (ghost part superseded 2026-08-25: AUTO collocated default = ghost). Rejected: mode 10 quadrature; Seo-Mittal pressure-only split; ghost scheme as the production path collocated-second-order-verdict.md:40-41
- Momentum solve uses the divided (1/dt-scaled) convention, replacing the dt-multiplied form. Rejected: the dt-multiplied form
I - nu*dt*Lapsdflow-dt-divided-convention.md:10-16 - Momentum tolerance-stop: adaptive tolerance instead of a fixed sweep cap. Rejected: a fixed sweep cap of 5 (user's own suggestion) parallel-scaling-study.md:74-77
- Momentum-advection kernels must use the actual wall velocity field, not maskVelocity's solid zeros. Rejected: reading maskVelocity's solid-zero convention as the wall velocity for a moving wall advective-cutwall-flux-plan.md:15
- Multiphysics assembly is runtime-dispatched flags on existing kernels, not a Solver
template . Rejected: a templated Solverdesign multiphysics-framework-plan.md:403 - Must re-mask solid velocity after grad(phi) correction. Rejected: skipping the re-mask cuda-kokkos-migration.md:354-355
- Non-incremental Chorin projection gives wrong steady Z&H drag — incremental-rotational required. Rejected: non-incremental Chorin projection (−40% error, splitting-error); the warm-detector convergence protocol embed-port-progress.md:21-22
- Old single-GPU CFDSolver reference retired; pnm_backend is pore-network extraction only. Rejected: keeping the CFDSolver single-GPU reference implementation; pnm_backend carrying a CFD solver sdflow-dt-divided-convention.md:29-38
- On host, the 'direct' bottom FCG's reductions are single-lane in index order (bits independent of T_host and of the thread count). Rejected: team reductions on host (order depends on the team size) flow
- On the collocated variable-density path set_body_force is a mean pressure gradient (face form). Rejected: f_const at the cell value (periodic hydrostatic box: cell 20.5 after 30 steps at flow
- One-rank benchmarks run without init_mpi; init_mpi at size 1 stays on the distributed path. Rejected: a silent single-rank switch inside init_mpi flow
- Only upwind/dissipative advection schemes exist — no central/energy-conserving option. Rejected: central/energy-conserving advection scheme (does not exist) channel-dns-isotropic-grid.md:15
- Owner-boundary attribution fix: remove shared-cell pressure from both sides of cross-owner faces. Rejected: leaving the shared-cell pressure flux attributed through owner mid-surfaces sdf-scene-campaign.md:82
- P1 passed: double-diagonal fallback retired as measurably worse, not merely unnecessary. Rejected: the double-diagonal fallback (converges to the float-face operator, not the true one) defect-correction-campaign.md:33-38
- PCG selector fixed; Chebyshev stays varRho/porous default (S0/S1 outcome). Rejected: PCG as the varRho/porous default driver vof-campaign.md:172-201
- PV curvature fallback: one team per target cell, canonical-order accumulation (core pvFitTerm / pvFitAccum). Rejected: a warp reduction of the normal equations (changes the summation order); one team per core
- Pairing lesson: stability needs (G,D) structural match, accuracy needs closure-value consistency — only the ghost architecture has both. Rejected: Design B (star) — "SPD-but-scheme-unstable"; B+ gates ("dead") collocated-attractor-campaign.md:35
- Part II phase-change architecture: Robin IHTR, PLIC plane-shift regression, transported-φ CLSVOF stays dead. Rejected: hard T_sat interface condition; volume-source-in-C interface regression; transported-φ CLSVOF vof-campaign.md:115-125
- Part III bubbly-flow container reuses V0–V4 kernels; Dodd–Ferrante FFT not needed. Rejected: Dodd–Ferrante constant-coefficient FFT pressure solve vof-campaign.md:107-114
- Per-kernel space.fence() removed — default-exec-space kernels are stream-ordered. Rejected: per-kernel fence() calls cuda-kokkos-migration.md:534-539
- Phase B/C explicitly must not touch GP_THETA_MIN, the sliver branch, or the preconditioner scaling. Rejected: touching GP_THETA_MIN, the sliver branch, or the preconditioner scaling in phases B/C ghost-hardening-plan.md:60-64
- Porous pressure correction must use drag-consistent relaxation (SIMPLE/PISO-with-implicit-drag), not a drag-free coefficient. Rejected: the drag-free pressure-correction coefficient (open*eps) used against a drag-loaded momentum diagonal multiphysics-framework-plan.md:381
- Porous projection must run even with no immersed solid — flow now throws, CfdDem auto-installs set_pressure_geometry. Rejected: silently running porous mode without any pressure-geometry / projection porous-cfddem-cuda-two-bugs.md:62
- Port production physics onto the distributed solver rather than retrofit MPI into production kernels. Rejected: retrofit MPI into the production kernels suite-distributed-status.md:101-104
- Pre-fix porous coefficient pair kept for A/B only, never for publishable results. Rejected: publishing results computed with the pre-fix (buildPorousCoeffDrag) pair porous-eps-conservative-momentum.md:38-39
- Precision policy rule: identity-bearing quantities stored in the precision the identity is asserted; ship double-diagonal, not fp64 default. Rejected: full fp64 default operator storage vof-campaign.md:307-312
- Pressure MG operator stored in face form {AC, AFX, AFY, AFZ} with the band sign. Rejected: seven bands (bytes); AC recomputed on the fly (not provably bitwise under FMA flow
- Pressure solve must be PCG (Krylov), not RB-GS, for cut-cell IBM. Rejected: RB-GS for pressure; rotational pressure-update variant cuda-kokkos-migration.md:352-358
- Public API renames: pressure_potential() → pressure() (returns physical pressure). Rejected: the name pressure_potential() for the physical-pressure accessor sdflow-dt-divided-convention.md:36-38
- Published parallel-scaling iteration count is 4.0, not the earlier 12.2. Rejected: the e861010 figures (12.2), which predate the stale-ghost V-cycle residual fix parallel-scaling-study.md:119
- Random-array drag deviation is a genuine method difference, not finite-size or arrangement effects. Rejected: finite-size effects and arrangement/crystallization as explanations for the deviation ibm-accuracy-sphere-validation.md:57-64
- Reaction torque leak fix is a closed-form cut-cell moment; adding the pressure moment term makes it worse. Rejected: adding the pressure moment Σ r×grad(pi) to close the torque gap sdf-scene-campaign.md:70
- Repair attempts (modes 1–3b) inside the unidirectional IBM all fail to reach 2nd order. Rejected: mode 1 (wall-anchored weighted-LSQ), mode 2 (transpose pairing), mode 3a (open-centroid, unstable), mode 3b (o-weighted adjoint, stable but worse cons sdflow-collocated-solver.md:79-108
- Report K normalized by superficial velocity (Zick-Homsy convention), not interstitial. Rejected: reporting an interstitial-normalized K without conversion ibm-accuracy-sphere-validation.md:110-112
- Resolved: the cell-average velocity scheme was a porting bug, not a real discrepancy — point-value is correct. Rejected: the cell-average velocity scheme (buildIbmOverlay<1>) as used in the Kokkos port migration-faithful-port.md:31
- Richardson extrapolation is ill-conditioned for this dense-bed data; do not rely on a free-parameter fit. Rejected: relying on an unconstrained Richardson-extrapolation fit for k_inf on this data ringbed-cfd-surrogate.md:31
- Root cause of the RB-GS stall: update-criterion (max|du| <= rtol*first-sweep-update) chases noise on a warm-started step. Rejected: the update-criterion stop (max|du| <= rtol * first sweep's update) momentum-solve-residual-stop.md:8
- Rung 3 fix: openness-weighted centered gradient replaces plain ½(g⁻+g⁺) projection correction for embed mode. Rejected: plain projectCorrectCenter's ½(g⁻+g⁺) correction (with closed faces zeroed) for the embed-momentum mode embed-port-progress.md:24-25
- S-ladder plan; Dodd–Ferrante splitting rejected for the pressure driver. Rejected: Dodd–Ferrante splitting for the pressure driver vof-campaign.md:473-479
- S3 coarsening indefiniteness is real, but coarsenOpenAvg must NOT switch to harmonic. Rejected: switching coarsenOpenAvg's face-coefficient averaging to harmonic vof-campaign.md:253-260
- Scalar advection uses the projection's own constrained face flux; the scalar apertures weight diffusion only. Rejected: the scalar apertures for advection (not the projection's constraint, so Σ F ≠ 0 per cell and constants are not preserved) flow
- Scalar conservation is exact in the discretization; the solver residual is reported as a defect, never fixed up. Rejected: a post-solve uniform mass correction flow
- Scalar cut-cell geometry is the fan-tetrahedron PL model on the marching-squares samples; the scalar apertures are ungated and snapped at both ends. Rejected: plane-cube
plicVolume(n, φ_c)for SDF sources (inconsistent with the apertures on curved walls, edges and gaps); 4³ subsampling (cs_, quantized to flow - Scalar faces carry the plain aperture two-point flux. Rejected: Johansen–Colella face-centroid interpolation (no measurable change; costs symmetry and compactness) flow
- Scalar small cells under advection: a dynamic implicit-FOU split relative to the bulk Courant number. flow
- ScalarMG coarsens the surrogate with rediscretized coarse FACES and variational coarse WALL terms: the plain average of the level-0 terms at the FINE probe distance (Amendment A1). Rejected: wall terms at the level's own probe distance s_L, the original design (stand-alone contraction 0.79 at the finest G1 and 3.1, divergent, on a periodic flow
- SdflowIbm MPI requires constructing each rank with local ORB block dims (ctor refactor, not a gated add-on). cuda-kokkos-migration.md:558-570
- Sealed scalar cells (fluid or solid) are not unknowns; they are gated on their VOLUME, not their count. Rejected: a "0 sealed" count gate (impossible: the corner slivers whose faces all snap to 0 at the 1e-3 floor grow like (R/h)², 0–11 / 38–46 / 154–159 at R/h 8 flow
- Sequencing: "VoF vs multiphysics first" dissolves — VoF is the next multiphysics phase. vof-campaign.md:480-484
- Sign convention: closed divergence of the corrected field equals Aφ − b = −residual. flow-ghost-projection.md:43
- Sliver mask must pin only cells with cs<1e-6, not every cell with sdf(center)<0. Rejected: the mode-0-style mask (zero every cell with sdf(center)<0, including solid-centred cut cells) for embed mode embed-port-progress.md:27
- Solid cutting an OPEN domain face is FIXED, not rejected — but a sealed inlet pocket IS rejected. Rejected: (a) rejecting the configuration outright, which the work order allowed; (b) fixing only SCALING_ISSUES
- SolverColocated is the ABC approximate projection, NOT Rhie–Chow — user correction. Rejected: describing SolverColocated's coupling as Rhie–Chow vof-campaign.md:485-489
- Staggered converges onto Zick & Homsy; collocated is bias-dominated (irreducible ~0.9%). peclet-examples-gallery.md:165-171
- Staggered variable viscosity on the control volume's own faces; explicit velocity MG refuses variable mu. Rejected: the cell-face mean for every component (h/2 shift); letting an explicit velocity MG run flow
- Staircase coarse operator (binary classification, no volume-fraction coefficients) is the DEFAULT for the IBM volfrac path, removing the dt ceiling. Rejected: the volume-fraction-weighted (area-fraction) coarse operator as coefficients; the plain const-coeff coarse op without staircase classification velocity-mg-design.md:77-98
- Staircase is consolidated as the ONLY IBM velocity-MG coarse op — const and area-fraction paths removed from the code. Rejected: geometry-blind const-coarse (setDiffusionCoarse) and area-fraction (setVelocityVolfracCoarse) IBM coarse operators — both deleted from the code velocity-mg-design.md:100-116
- Star half fix: phibar mean was not bitwise-annihilating even in double — replaced by flux form. Rejected: the phibar=Sum(a*x)/Sum(a) formulation defect-correction-campaign.md:52-54
- Steady acceleration scope: staggered and collocated-ghost only; everything else refused with a named error. Rejected: accelerating gauge-exact collocated (a family of fixed points); saving the history in checkpoints (~14x larger) flow
- Steady marches are accelerated by type-II Anderson in
march_to_steady, measured on the velocity alone; P and the collocated face field are carried (rev 1). Rejected: the c_P-weighted, gauge-centred pressure term (rev 0); per-pocket gauge removal; the unweighted Euclidean norm of (u, P); a metric on the face gradien flow - Steady scalar advection is preconditioned by a V-cycle on the ADVECTIVE surrogate (Amendment A2). Rejected: the symmetric lumped surrogate for steady advection (preconditioned spread β ≈ Pe_h N/2π; 3-D 13 → 40 → 89 iterations at Pe_h 0 / 0.1 / 0.3 and no con flow
- Steady state after acceleration: velocity-residual handover, a 12-block certification budget with an early slow exit, and a stagnation fallback (rev 1 + review R1). Rejected: requiring plain-march reachability as well (Q18: a plain verification tail costs plain steps exactly where acceleration matters — the dense bed at dt flow
- Strict staggered bit-identical guard must be held through every change; AMR must work for both velocity placements or be explicitly scoped. sdflow-octree-amr-next.md:19-20
- TRAP: -DPECLET_FLOW_MREAL_DOUBLE=ON on the cmake command line silently builds float. Rejected: passing -DPECLET_FLOW_MREAL_DOUBLE=ON as a normal cmake cache variable defect-correction-campaign.md:45-46
- Telescoping is default on for the pressure MG since 2026-09-02; the velocity solve does not need it. Rejected: telescoping the velocity solve momentum-solve-residual-stop.md:18
- Ten-Cate periodic-image bug: periodic images are a union, not independent slabs. Rejected: the earlier CSG-slab-per-image geometry construction (implicitly non-union) sdf-scene-campaign.md:131
- The Anderson steady-march accelerator has no instability guard; stability evidence comes only from plain steps (rev 2). Rejected: a Ritz-radius guard with a higher floor, a higher threshold, a longer consecutive count; the fall-back-to-plain consequence; a diagnostic-only radius; flow
- The PV normal equations accumulate only their lower triangle and diagonal. Rejected: the full 6×6 accumulation (dead work) flow
- The agglomerated-bottom MG anomaly required a per-fluid-component null-space projector, a double row-sum, and a looser inner tolerance. Rejected: projecting the all-cell mean (rather than per-connected-fluid-component); leaving MG coefficients in single-precision row sums uncorrected; an inner t agglomerated-bottom-ibm-fix.md:15
- The balanced-force projection is an option on both grids, default ON on collocated variable-rho (V8), OFF elsewhere. Rejected: always-on (the user asked for an option); default off on V8 (loses the settled flow
- The defect-correction rule: Krylov matvec/residual must be the exact double operator in flux form; preconditioners below may stay float. defect-correction-campaign.md:14-17
- The distributed host 'direct' bottom runs redundantly on every rank, from the allgathered bottom openness (WO-H6, designed, not yet implemented). Rejected: a rank-0 solve plus broadcast; GraphAMG design
- The host pressure-bottom factor runs a bitwise host-only schedule, with its own team constant (2). Rejected: running the device team algorithm on the host (≈170 team barriers per plane, every scalar a serial latency-bound dot: 5.6-6.5 ms per factor at its bes flow
- The immersed scalar wall flux is never a two-point / series-resistance flux over the cut cell's centroid distance. Rejected: the centroid two-point wall flux and the series-resistance (GFM, Liu–Fedkiw–Kang) wall and interface flux (first order; at the Maxwell disc, d/h = 128 flow
- The momentum solver is chosen by the operator's CONDITION NUMBER, and the rule names no geometry. Rejected: (a) selecting on whether an immersed solid is present — the rule as first landed; IBM user
- The np>1 VoF colour parity gates gate conservation, not the pointwise field. Rejected: (a) loosening 1e-11 to a number above today's 3.174e-09 — it would have been fitted to tests/kokkos_mpi/test_vof_bc_mpi.cpp,
- The porous "non-finite preconditioner" was a 0/0 in the bottom CG, not float storage (evidence correction). Rejected: attributing the porous non-finite preconditioner to float operator storage (the evidence cited in "Double operator storage is the DEFAULT", QUALITY_PL flow
- The rotational (Timmermans) pressure update must be restored, not the non-rotational Goda form substituted. Rejected: non-rotational Goda pressure update form; diagonal-preconditioned CG in place of geometric MG/MG-PCG; double-precision pressure operator storage migration-faithful-port.md:61
- The scalar linear solve is BiCGStab + one ScalarMG V-cycle on the lumped-probe surrogate, with a max-norm relative stop (default 1e-10). Rejected: fixed RB-GS sweeps (the legacy 50-sweep path); (F)GMRES (restart storage and k reductions per iteration; FGMRES unnecessary for a fixed cycle); the ce flow
- The scalar probe distance is s = 1.1·½Σ|n_a|h_a (0.55–0.95 h), the shortest that never needs the fallback. Rejected: AMReX's κ-dependent short probe dx_eb = max(0.3, (κ² − ¼)/(2κ)) h with renormalized fallback (762 fallbacks, order 0.7–1.2, erratic); a 0.3 h probe (o flow
- The scalar unknown sets follow the snapped apertures; κ = 0 ⇒ all apertures 0 by the strict-sign rule. Rejected: unknown sets from a κ that is not the apertures' own volume (plane-cube
plicVolume: κ = 0 next to an open face, κ > 0 behind all-closed faces, i.e. flow - The scalar-transport and phase-change energy API is physical under an armed extent, converted at the boundary. Rejected: documenting the scalar/energy surface as internal (cell) units — "silently wrong" is the failure class U3's four missed setters already showed; conver flow
- The standalone V-cycle pressure driver does not honor set_pressure_solver_params(n) and is ~30x slower at small grids. flow-thermal-convection-validated.md:25
- The transient ScalarMG level rule switches to the full table at κ_A = 1 + 4 dt'D'Σw_a ≥ 25 (Amendment A3, ruling D-WO9-3). Rejected: κ_A = 13, the design's value, kept by D-WO9-2 only because level 0 there took 11 iterations on one cold first step against G-iter's ≤ 10; κ_A ≈ 49 (co flow
- Tier-3 PV fit: each interfacial cell's PLIC polygon is built once per curvature pass (per-cell cache), never once per target. Rejected: rebuilding the polygon per target (15.6 builds per cell per pass, plicPolygon 50.0 of 81.2 ms of tier 3); a dense per-cell cache over the extended blo flow
- Tier-3 PV terms come from per-cell polygon area moments, accumulated entry-parallel on the device (recorded round-off change). Rejected: per-target Green's-theorem moments (2.6× slower, FP64-heavy); a centroid point fit; a smaller support; one lane accumulating all 42 entries (FP64-issu flow
- UCX_RNDV_THRESH tuning is falsified as an explanation for the np8 anomaly — leave UCX defaults. Rejected: tuning UCX_RNDV_THRESH=256k comm-scaling-plan.md:57
- User decision: port Basilisk embed.h, not Trebotich–Graves, for 2nd-order collocated walls. Rejected: Trebotich–Graves/EBChombo as the primary port target sdflow-collocated-solver.md:186-191
- User directive: ghost-cell IBM must become production-grade (it generalizes to AMR better than cut-cell). ghost-hardening-plan.md:11-14
- V-cycle stale-ghost bug made MG convergence decomposition-dependent; fixed, now iteration count is decomposition-independent. Rejected: reading stale ghosts in the V-cycle residual channel-scaling-rebenchmark.md:67-73
- Variable-viscosity rotational correction stays incremental (constant-μ) under varProps, not full pointwise. Rejected: 'full' pointwise variable-μ rotational correction multiphysics-framework-plan.md:397
- Velocity domain BCs must be applied before divergence in project(). Rejected: applying divergence before the velocity domain BCs cuda-kokkos-migration.md:332-335
- Velocity masking must be OFF with the cut-cell pressure operator. Rejected: masking velocity with the cut-cell operator active suite-distributed-status.md:94-95
- Velocity-diffusion MG rediscretization diverges; velocity RB-GS is the exact default. Rejected: rediscretized velocity-diffusion multigrid coarse operator suite-distributed-status.md:291-296
- Viscous term left plain (not epsilon-weighted) — a deliberate, documented scope choice. Rejected: epsilon-weighting the viscous term porous-eps-conservative-momentum.md:31
- VoF execution model: no new submodule, kernels live in flow/src/vof/. Rejected: a new submodule for VoF vof-campaign.md:491-496
- Volumetric forces at the velocity location; surface forces as control-volume face integrals. Rejected: interpolating every force the same way (a surface force is a face integral, not a cell flow
- WO-H fix: CutcellMG::applyNeumannGhost; PCG selector now throws (MG-PCG is the terminal fallback). vof-campaign.md:236-251
- WY advection CFL default corrected to Weymouth's proven 3D bound 0.25. Rejected: CFL<0.5 (Weymouth's 2D value, mistakenly applied to 3D) vof-campaign.md:128-130
- Weak efficiency must be computed from per-GPU throughput, not raw step time. Rejected: computing weak efficiency directly from step time when cells/GPU varies ±8% channel-scaling-rebenchmark.md:208-209
- What was disproved in the agglomerated-bottom investigation. Rejected: solid-rhs deposit contamination, sliver-row threshold mismatch, and multi-component pockets as causes for THIS case agglomerated-bottom-ibm-fix.md:29
- Zero-aperture staggered velocity points stay live in the momentum solve (not masked). Rejected: masking every velocity point whose projection aperture is 0 (option iv); NaN for sealed-pocket cells in get_p() (poisons np.mean silently) flow
march_to_steady(accelerate=)default is set by a pre-registered measurement rule. Rejected: fixing the default now (True, the architect's proposal; or False) flowmarch_to_steady(accelerate=)defaults to True — the pre-registered rule, measured. Rejected: False (opt-in acceleration) flow- bcStencilPath() and implicitAdv() must agree with the actual solver in use. momentum-solve-residual-stop.md:21
- cell_centers() vs analytic-scene placement in cell units: documented, the fix deferred to 2.0.0. Rejected: changing either convention in a 1.x release (silently moves every cell-unit scene or SDF script: a numerics change and a semantic break the alias ladd RELEASE_PREP
- cylinder-vortex-street dropped from the gallery; confirmed flow bug pins the fix location. Rejected: shipping a sub-resolution "steady" wake result (would misrepresent physics) peclet-examples-gallery.md:106-118
- fillPorousEpsGhosts: mirror-around-1 at inflow/outflow, zero-gradient at walls — one policy for RHS/coeffs/residual. Rejected: reading eps ghosts in three different states across RHS/coeffs/residual porous-cfddem-cuda-two-bugs.md:36
- flow's grid is isotropic unit spacing with no wall-normal stretching. Rejected: wall-normal grid stretching channel-dns-isotropic-grid.md:14
- init_mpi precedes the geometry; the order is enforced by a raise, not by a rebuild. Rejected:
initMpirebuilding the geometry itself, asredistribute()does (a silent rebuild flow - predict_hierarchy(weights=) returns (rows, align) when weights are given; rows alone otherwise. Rejected: a new public function for the alignment (unapproved name); an extra column in every row (breaks the existing output) flow
- set_exact_crossings and set_openness_override remain single-rank-guarded (v1 scope exclusions unchanged). Rejected: extending this MPI landing to cover set_exact_crossings/set_openness_override or the v1-excluded modes flow-ghost-projection-mpi-plan.md:17
- set_face_interp(9) hybrid (aperture projection + gpCenterGrad) is the throat-safe collocated scheme. Rejected: pure collocated ghost projection (mode-0 with gpCenterGrad only) for tight-throat porous media — it inherits the throat defect flow-ghost-projection.md:115
- set_ghost_projection(True) must be called before set_solid. flow-ghost-projection.md:33
- set_pressure_warmstart(True) diverges on the steady Stokes march; bench default is WARMSTART=0. Rejected: set_pressure_warmstart(True) as a benchmark default porous-scaling-benchmark.md:106-109
- ⚠️ UNRESOLVED — interstitial vs superficial drag normalisation. Rejected: nothing — these two statements in the SAME note assign Zick-Homsy and vdH to OPPOSITE ibm-accuracy-sphere-validation.md:45-50
Superseded — history, do not re-derive the old reading¶
- "Intrinsic ~1% gap, don't chase it" corrected: collocated IBM is first-order at curved walls, staggered is second-order. sdflow-collocated-solver.md:46-56
- "No portable GPU wheel" was a policy choice, not a hard limit — single-GPU CUDA wheels are feasible. peclet-cuda-wheel-feasible.md:10-13
- (superseded) fp32-floor-explains-everything hypothesis. vof-campaign.md:366-381
- (superseded) precision-vs-indefiniteness verdict corrected — S3 indefiniteness is real and separate from the float-storage floor. vof-campaign.md:346-347
- 1/2-1/2 constraint truncation exonerated as the plateau cause — a previously-published claim was wrong. collocated-second-order-verdict.md:29-34
- 2nd order finally resolved by ghost-cell projection FD family, not the full Basilisk embed rewrite. sdflow-collocated-solver.md:10-27
- Agreed IBM velocity-MG coarse-op scheme: volume-fraction Helmholtz, coarse-only solid masking, masked volume-weighted transfers. velocity-mg-design.md:37-52
- Aperture weighting (A1) is not indicated as a fix for the confined finite-Re deficit. advective-cutwall-flux-plan.md:26
- Area fractions (proper face α, not min(θ)) extend the stable dt ceiling for the (now-removed) area-fraction coarse op. velocity-mg-design.md:118-124
- Correction/supersession: plan §9.3 U5 was wrong about VoF spacing. physical-units-plan.md:32
- Correction: §9.3 U3's setter list was incomplete, causing silent physical errors. physical-units-plan.md:35
- Defect-correction proposal: float hierarchy demoted to pure preconditioner, evaluate before double-diagonal. vof-campaign.md:293-306
- E3 decided: v3 wall-torque uses the area factor V'/h_b', not h_a'V', correcting the design note's §4.4. physical-units-phase2-aniso.md:34-37
- Earlier "+13-83% above 2024" deviation was a normalization error, not a real discrepancy. ibm-accuracy-sphere-validation.md:79-81
- Falling-drop gate: WO-K's under-resolved-momentum-solve suspicion is refuted. vof-campaign.md:459-464
- Galilean identity (A−idiag·I)·1=0 is false in general — corrects the plan's inventory. defect-correction-campaign.md:27-28
- Ghost's rho scalar is not a partial cut-cell transplant — premise correction. ghost-hardening-plan.md:21-25
- Interstitial vs superficial drag normalization: our K is interstitial (Zick-Homsy); literature (vdH/Tenneti/van Wachem) reports superficial F_D=(1-phi)K, not "friction". ibm-accuracy-sphere-validation.md:45-50
- Old "inter-node reduction tax" diagnosis for the channel 8-GPU scaling drop is superseded. channel-scaling-rebenchmark.md:59-61,
- Old grid-convergence table retired; Galerkin=True / set_pressure_pcg not for production. suite-distributed-status.md:311-316
- Plain incompressible continuity with ε only in drag is the WRONG constraint for a porous bed; volume-averaged (Model-A) continuity is required. multiphysics-framework-plan.md:379
- Ring convergence failure was a solver-tolerance artifact, not a cut-cell/geometry limitation. ibm-accuracy-sphere-validation.md:14-30
- Ring-bed k convergence slowness is intrinsic dense-packing near-contact Stokes stiffness, not a thin-wall/cut-cell IBM defect. ringbed-cfd-surrogate.md:33
- Scoped constant-coefficient (Dodd–Ferrante) pressure driver: opt-in, solid-free boxes, accuracy-gated. USER
- Stale-ghost pressure V-cycle bug invalidated the entire published parallel-scaling page's peclet numbers. parallel-scaling-study.md:206-213
- Steady marches are accelerated by type-II Anderson on the full march state, in a new
march_to_steady— never insidestep(). flow - Steady state is certified by the unchanged stop instrument on PLAIN steps after acceleration. flow
- Success criterion for any A·1=0 repair: match the full-double floor, never demand rtol 1e-8. vof-campaign.md:413-427
- Superseded same-day decision: residual stop default was fixed at 1e-5. momentum-solve-residual-stop.md:32
- The 47%-at-8-GPU "reduction tax" diagnosis is stale, superseded by 2026-08 solver fixes. snellius-parallel-benchmark-campaign.md:25-27
- The earlier "staircase not suited for packed materials" caveat is retracted. velocity-mg-design.md:90-98
- The ten-cate confined-flow deficit was a geometry (oversized periodic slab) bug, not a solver/advection defect. advective-cutwall-flux-plan.md:49
- The velocity V-cycle is the DEFAULT momentum solver, at every rank count and every block size. user
- The ~0.3% collocated accuracy "plateau" is not a truncation ceiling — it is an instability + an invisible pressure-subspace attractor family. collocated-attractor-campaign.md:11
- Wall-band "1/h amplitude growth" was a unit artifact, not a real localization signal. collocated-second-order-verdict.md:36-39
- Weak-scaling ladder must refine a fixed physical box, not grow box length at fixed cross-section (methodology correction). channel-scaling-rebenchmark.md:156-168
- get_ox/oy/oz are openness fields, not origin aliases — NAMING.md correction. suite-quality-plan-1-0-0.md:101-102
- poiseuille-ibm reframed: flat-wall cut-cell IBM is pointwise exact, not a 2.8% error case. peclet-examples-gallery.md:48-50
- rtol rule: max(1e-8, C·eps·0.18N²·Δρ/ρ) — later re-stated as a lower bound, not an achievability guarantee. vof-campaign.md:289-292,
- sdflow accuracy resolved; default cut-cell RB-GS path matches Zick & Homsy; velocity-MG (not pressure) was the drift source. suite-distributed-status.md:268-283
- sdflow-vs-pnm_backend "efficiency gains" correction — internal only, not a real speed gap. suite-distributed-status.md:264-269
dem — XPBD, contacts, packing¶
109 in force, 7 superseded — full text in decisions/dem.md
In force¶
- A body updated in several places is solved through copies: mass splitting for projection-form updates, exclusive holding for the one-shot restitution sweep. Rejected: raw ghost-increment sums for the one-shot (tri e=0.8 KE 0.333 -> 0.555); mass dem/docs/contact_solve_framework.md;
- A multilevel coarse vertex carries the mass of its folded copies, a*m/k. Rejected: solve-view masses (non-conservative at a folded hub); fold after the coarse cycle dem/docs/contact_solve_framework.md
- A periodic self-image contact is owned outright when its twin image is absent. Rejected: the unconditional lower-gid rule for self-image pairs dem/docs/contact_solve_framework.md
- Acceptance bar for solver-internals changes is run-scatter parity + gated defaults, not bit-identity. Rejected: bit-identity as the acceptance bar dem-sweep-efficiency-plan.md:246
- Adaptive multilevel stop uses the quasi-static (QS) residual, not the full fine residual or coarse-only. Rejected: gating the adaptive stop on the full fine residual (over-converges flowing scenes); gating on coarse-only residual (statics degrade) dem-multilevel-contact-solver.md:27
- An analytic non-spherical shape's baseRadius is its circumscribed radius. Rejected: the geometric radius (end and corner contacts invisible to the broad phase and the band) dem/docs/contact_physics_followups.md
- Blanket persistent-contact e=0 is rejected; restitution is one-sided-only when grounded and not rising. Rejected: blanket persistent-contact e=0 for all persistent contacts packing-velocity-position-split.md:17
- Body-body friction accumulates normal impulse across velocity-solve iterations; plane/wall uses one-shot post-gravity load. Rejected: a velocity-approach-only proxy for body-body; accumulating normal impulse for plane/wall contacts packing-velocity-position-split.md:45
- Body-body multi-contact friction is quantitatively too weak (by ~coordination number Z); the fix is deferred sequential-impulse friction — since fixed with gravity on (friction-cone PGS), still live at g = 0 / Jacobi. Rejected: dividing each contact's friction bound by the per-body contact count (Jacobi count-averaging) as adequate for multi-contact bulk friction packing-friction-followup.md:17
- Both-asleep contacts are excluded from colouring by seeding colour = -2. dem-sweep-efficiency-plan.md:95
- Boundary contact alignment must use the absolute wall contact point (rAavg), not rAavg−rBavg. Rejected: using diffCenters = rAavg − rBavg uniformly for boundary and body-body contacts dem-sdf-walls-moving.md:43
- Bug fix: hertzCommitHistory must not wipe carried previous state on the post-migration sentinel. dem-mpi-solver-port-plan.md:50
- Cleared hypotheses during the H100 corruption investigation. Rejected: pair-buffer capacity, sleeping, boundary/ghost-slab handling, compile-flag/toolchain differences, execution-mode (graph/fused/etc.) differences, color porous-scaling-benchmark.md:60-84
- Collision solve moved from count-averaged Jacobi to graph-colored Gauss-Seidel. Rejected: count-averaged Jacobi (min(1,2/count) velocity / 1/count position damping factors) as the primary over-relaxation fix dem-colored-gauss-seidel-solver.md:10-23
- Contact/manifold buffer sizing must scale with per-particle shell point count. Rejected: fixed capacity*16 sizing regardless of shell point count dem-sdf-general-particles.md:65
- Core principle: velocity solve owns all dissipation, position solve only removes overlap, no back-coupling. Rejected: back-coupling from the position correction into velocity packing-velocity-position-split.md:27
- Cube-drum confinement requires a z-periodic barrel with no end caps — corner rounding does not work. Rejected: rounding the cube corner to prevent tunneling at the barrel/cap join; a closed (capped) drum for cubes dem-cubes-gpu-pyvista.md:20-24
- DEM particle radius/halo sizing must derive from baseRadiusscaleglobalScale, not globalScale alone. Rejected: sizing broadphase/halo/margin off globalScale alone; the prior workaround of forcing set_global_scale(rp) multiphysics-framework-plan.md:376
- Direction-aware (vector) orphan accounting is a measured negative result; scalar orphan stays production. Rejected: direction-aware (vector) orphan accounting dem-event-level-restitution.md:83
- Distributed (MPI) sleeping is out of scope for the first pass. Rejected: implementing distributed sleeping in the first pass dem-sweep-efficiency-plan.md:188
- Distributed XPBD contacts are owner-exclusive, with ghost→owner reverse accumulation at every sync. Rejected: redundant two-owner solves; globally consistent colouring of interface contacts (a sync per colour); symmetric Jacobi for interface contacts (count-av dem/docs/mpi_momentum_conservation.md
- Distributed dead-pair Poisson credit is given only by the pair's owner.
- Drum stick/slip is a position-channel Coulomb-bound carry problem, not missing elasticity. Rejected: attributing the drum lag to missing Mindlin sustained-contact elasticity (the prior Hertz-control conclusion) dem-dosta-benchmark.md:272
- During the CUDA→Kokkos migration, the velocity/position split must be ported faithfully; physical validation and the friction fix are separate post-migration tasks. Rejected: changing numerics/friction behavior during the backend migration packing-friction-followup.md:12
- Every pair within contact reach is visible to both owners: drift slack, vote-triggered migration, all periodic images. Rejected: zero slack (pairs lost at 1.857 R drift, np >= 4); per-step migration (a host round
- Forward predicted position, not committed position, through ghost gather. Rejected: gathering committed
d_possuite-distributed-status.md:23-26 - Friction consolidated into one per-contact Coulomb friction in the velocity solve, replacing three overlapping patches. Rejected: Fix A (manifold-only), Fix B (position-solve tangential friction), Fix C (velocity feedback from position solve's friction_lambda_n) packing-velocity-position-split.md:41
- Friction stability fix: Jacobi count-averaging instead of Jacobi-summed impulses. Rejected: Jacobi-summed per-contact friction impulses packing-velocity-position-split.md:53
- Friction-cone PGS fixes body-body friction only with gravity on; the g = 0 path still runs the count-averaged friction. Rejected: treating the "too weak by ~Z" defect as closed everywhere dem
- Fused colour sweeps: CUDA-graph replay stays the solo default; fused auto-on only where capture is unavailable. Rejected: making fused loop-kernels the universal default; a per-block-flag + block0-scan barrier variant (measured slower) dem-perf-campaign.md:33-37
- Gallery fixes: dem OOB writes, wrong docstrings, opt-in reaction torque — root-caused, not worked around. peclet-examples-gallery.md:256-264
- General-particle shells must be voxel-decimated to a target point count. Rejected: using the raw marching-cubes point count directly dem-sdf-general-particles.md:60
- Ghost selection and the drift vote use the domain-clamped ownership coordinate on non-periodic axes. Rejected: measuring visibility against the finite block box (a body outside an unwalled domain is silently never ghosted across a block face) dem/docs/contact_solve_framework.md
- Grain-radius units remain an acceptable, but no longer required, convention. Rejected: requiring grain-radius units (global_scale=1) as the only correct usage dem-global-scale-sphere-limitation.md:23-26
- Grid-SDF particle data is flat and x-fastest. dem-sdf-general-particles.md:49
- Growth-view sizing bug: every maxContacts-sized view must be grown together, not just contacts+manifolds. Rejected: growing only contacts+manifolds while leaving other maxContacts-sized views at the old size dem-sdf-general-particles.md:69
- HCS benchmark contact-solver exonerated via the colored-GS A/B. Rejected: the contact solver as the source of the residual factor-2 stage offset hcs-mfix-benchmark-evidence.md:31-32
- Hertz pair lists are canonically oriented, lower gid first. Rejected: carrying xi by gid without an orientation convention (latent for every mid-run migration, rebalance included); a larger carry cap (measured: not the c dem/docs/contact_solve_framework.md
- Hertz sphere contacts use the sphere's own radius, never the reach radius. Rejected: rad(i) as the contact radius (a sphere mixed with tubes read up to 1.8x its radius after WO-B0) dem
- Incremental colouring gated OFF under MPI, and position conflict detection avoids a host sync. Rejected: enabling incremental colouring under MPI as-is; a host readback for conflict detection dem-sweep-efficiency-plan.md:47
- Interim DEM back-coupling commit reverted on user instruction. Rejected: the interim back-coupling commit 374565d porous-cfddem-cuda-two-bugs.md:76-77
- Interim dx→dv back-coupling was reverted on explicit user instruction — the no-back-coupling clause stands absolutely. Rejected: interim dx→dv back-coupling (commit 374565d) packing-velocity-position-split.md:10
- Island sleeping shipped default-OFF, then found to explode statics to NaN, fixed and flipped to default-ON. Rejected: making a sleeping body exactly immovable (invMass=0) dem-perf-campaign.md:96-109
- Kinetic-separation unloading gate beats eager v0til<0 gate. Rejected: eager v0til<0 unloading gate dem-event-level-restitution.md:47
- Legacy friction applies +-J_t at one point, the contact midpoint.
- Legacy one-shot friction cluster stays gated off on the PGS path. Rejected: running the legacy one-shot friction cluster on the PGS path dem-dosta-benchmark.md:154
- MPI drum geometry must use a rounded profile, not a sharp barrel+flat-cap min-SDF. Rejected: a sharp barrel+flat-cap min-composited SDF for a drum under MPI dem-sdf-walls-moving.md:33
- Mode "ordered" (level-ordered symmetric sweeps) is measured insufficient and kept only for A/B, not shipped as default. Rejected: "ordered" mode as a production stabilization mode dem-multilevel-contact-solver.md:67
- Multilevel coarse bodies are rigid 6-DOF aggregates (projection form, spins included). Rejected: translation-only aggregates (dL = (X_A - X_B) x J); a coarse impulse redirected through the centres (non-associated, breaks the ledger and KE); a spin dem/docs/contact_physics_followups.md
- Multilevel slip gate ships at 8·g·dt, not ungated, persistent+cone, or 2·g·dt. Rejected: ungated aggregation (fake bulk viscosity, silo 16.7); persistent+cone gate (pour CRUSH); slip @ 2 g dt (pour CRUSH) dem-multilevel-contact-solver.md:52
- Never use get_max_overlap() as the sole packing-quality gate. Rejected: using get_max_overlap() alone to validate packing quality porous-scaling-benchmark.md:53-56,
- New per-pair/experimental features must default off and reduce bit-identically. dem-dosta-benchmark.md:107
- Newton-e-alive-on-persistent-contacts plus banking beats bank-owns-restitution. Rejected: bank-owns-restitution / Newton-off dem-event-level-restitution.md:42
- One fence after the whole GS sweep suffices — per-colour fencing is a needless host stall. Rejected: fencing after every colour sweep dem-colored-gauss-seidel-solver.md:36-38
- One-sided grounded contacts are a momentum sink; the resolution is a staged symmetric+one-sided solver. Rejected: "the naive per-pair ballistic gate" (any one-sided contact at the moving/static interface is a momentum sink); pure symmetric PGS (crushes deep static dem-dosta-benchmark.md:182
- Orphan credit is mass-weighted to the heavier endpoint. Rejected: even/unweighted crediting between endpoints dem-event-level-restitution.md:69
- Orphan decay constant is 1/64 per substep, not 1/256. Rejected: decay constant 1/256 dem-event-level-restitution.md:73
- PGS friction bound must come from the converged normal accumulator, not from live approach velocity. Rejected: deriving the Coulomb friction bound from current approach velocity each iteration dem-dosta-benchmark.md:91
- Particle data layout: plain Kokkos SoA Views, backend-default layout, not float4, not Cabana. Rejected: float4 packed layout; adopting Cabana cuda-kokkos-migration.md:152-158
- Per-pair material rebound gap was a material-approximation error, not a solver defect. Rejected: the assumption that the rebound deficit was a solver-level defect dem-dosta-benchmark.md:114
- Persistent-pair keys under MPI are gid-based, not index-based. Rejected: index-based persistent-pair keys under MPI dem-mpi-solver-port-plan.md:22
- Phase-B stabilization budget of 2x is the shipped default. Rejected: Phase-B budget 4x (over-stiffens to -0.075); 1x (fails the violent pour) dem-dosta-benchmark.md:201
- Position solve is translation-only; overlap removal stays decoupled from velocity. dem-colored-gauss-seidel-solver.md:31-34
- Root cause of H100-only DEM corruption: Particles::ensureCapacity never resized materialId. porous-scaling-benchmark.md:85-96
- Round-off-level nondeterminism across threads / GPU is acceptable in dem. Rejected: sorting contacts by gid pair every substep for bitwise thread/GPU reproducibility user,
- Sleep hysteresis must use a wake threshold far above the jitter tail (40x vRest), not close to the sleep threshold. Rejected: wakeScale=4 (causes 32%<->3% oscillation, no freeze); rule (b) contact-flicker wake enabled by default dem-sweep-efficiency-plan.md:100
- Sleepers must carry finite (not exactly zero) inverse mass. Rejected: exactly-zero inverse mass for sleepers (invMass=0) — "made EXACTLY immovable"; an earlier attempted fix ("overload-wake rule d + sleep-overlap gate vi dem-sweep-efficiency-plan.md:133
- Sleeping default flipped ON. Rejected: sleeping default OFF (the prior state) dem-sweep-efficiency-plan.md:146
- Sleeping is implemented as an invMassEff swap around the solve call, not a per-manifold kinematic flag. Rejected: threading an invMassEff flag through ~15 call sites; a per-manifold kinematic flag dem-sweep-efficiency-plan.md:89
- Sleeping pairs must remain in the pair ledger (broadphase/narrowphase keep tracking them). Rejected: dropping sleeping pairs from the pair ledger dem-sweep-efficiency-plan.md:180
- Stabilization iteration cap K=64, not 16. Rejected: K=16 dem-sweep-efficiency-plan.md:106
- Statics fix: persistent-contact tracking + grounded rise-gated inelastic shock; interim back-coupling reverted on user instruction. Rejected: the interim back-coupling approach dem-colored-gauss-seidel-solver.md:64-70
- Strategy B: build standalone Kokkos units, then one clean cut to flip demgpu. Rejected: making cuBQL and Kokkos coexist incrementally in demgpu cuda-kokkos-migration.md:143-146
- Symmetric release beats one-sided grounded release. Rejected: one-sided grounded release dem-event-level-restitution.md:45
- The 'jacobi' velocity solver diagnostic is mass-split Jacobi.
- The Gauss-Seidel colourings are complete by construction: 64 colours, no forced colour, hub copies above 32 edges. Rejected: forcing colour 62 (a same-colour race: CUDA dP 1e-2); leaving edges to the per-body dem/docs/contact_solve_framework.md
- The MPI velocity/position solve reuses the single-GPU driver via a Hooks template, not a separate implementation. Rejected: a rank-local adaptive-stop break under MPI dem-mpi-solver-port-plan.md:15
- The Moreau e = 1 energy gate runs at dt = 1e-4. Rejected: widening the bound to 2e-4 at dt = 1e-2 (would hide a real law defect of that size) session
- The PGS restitution target is Moreau's: -e u- on every closed contact above the resting threshold. Rejected: Newton's target (creates energy); the sequential event one-shot + support solve (large implementation, the architect's option S); a user-facing A/B sw USER
- The adaptive stop of a phase with copies includes the consensus correction. Rejected: gate relaxation to the plateau value; a stop on the fine residual alone dem/docs/contact_solve_framework.md
- The correct fix, if needed, is proper sequential-impulse friction with an accumulated per-contact tangential impulse clamped to the total Coulomb bound. Rejected: the current Jacobi count-averaged friction scheme, for quantitative frictional-packing studies packing-friction-followup.md:26
- The distributed contact solve must conserve linear and angular momentum across rank boundaries. Rejected: accepting redundant two-owner solves of a cross-rank contact (each owner sweeps it from its own state, so the impulses are not equal and opposite; CoM docs/HANDOFF_DEM_MPI_MOMENTUM.md;
- The distributed rank colouring of policy X uses blocks within 2 band, not band + S. Rejected: "blocks within band + S" (two ghost ranks of one body could share a colour and both write it in one interval) dem/docs/contact_solve_framework.md
- The distributed step's local particle order is canonical (ascending source rank), never MPI arrival order. Rejected: accepting arrival-order nondeterminism; changing core's NBX delivery order dem
- The force engine was generalized into a Law/Hooks-templated driver per the device-first + MPI directive. Rejected: a Hertz-only, non-generalized implementation dem-mpi-solver-port-plan.md:40
- The multilevel-stabilizer rebound loss is an under-convergence artifact, not a momentum-sink effect — refuting the project's original premise. Rejected: the mission brief's premise that a momentum-conserving stabilizer sink was deleting the rebound dem-multilevel-contact-solver.md:42
- The overlap projection is accumulated and retractable: projected SOR on each contact's net push, omega_pos = 1.5. Rejected: the non-accumulated POCS held at omega 1 (non-unique fixed point, cannot retract, 2.9x slower); omega 1.7 (hubs slower) dem/docs/contact_solve_framework.md
- The overlap projection is coloured and swept per contact pair, all points of a pair sequentially in one work item. Rejected: per-point colouring with hub copies (20+ copies per ring)
- The overlap projection's diagonal is the translational effective mass invM_A + invM_B. Rejected: computeW's rotational term (a rotation never applied; world arm x body-frame inertia, not frame-indifferent; overstated the stop metric) dem/docs/contact_physics_followups.md
- Two-way shell detection is opt-in; the default stays one-way. Rejected: two-way by default (per-step cost where not needed; USER efficiency directive); merging the two directions (no measured benefit) USER
- USER DIRECTIVE — XPBD is dem's efficiency engine; costly physics refinements are options, default off. Rejected: making the Poisson restitution bank the default (per-step cost where it is not needed); two-way shell detection on by default USER
- Uncapped grid is the default for the fused kernel launch. Rejected: capping the launch grid to fewer blocks dem-perf-campaign.md:31-32
- Verlet-cached broadphase gated to non-periodic single-GPU only. Rejected: enabling the Verlet-cached pair list under periodic ghosts / MPI dem-sweep-efficiency-plan.md:201
- Wall SDF resolution must be finer than the colliding cube, and seeded cubes must start axis-aligned. Rejected: a coarser wall SDF than the cube size; random initial cube orientations at lattice spacing 2.1 dem-cubes-gpu-pyvista.md:25-28
- Wall SDF sign convention: val − residual (container convention), not val + residual. Rejected: object-SDF sign convention (val + residual) applied to a container wall SDF porous-cfddem-cuda-two-bugs.md:43
- Wall friction must accumulate the transmitted force-chain load over velocity iterations, like body-body contacts. Rejected: bounding wall friction by each grain's own one-shot gravity approach load dem-sdf-walls-moving.md:52
- WallSdf sign convention: positive in the void, negative inside the solid wall. dem-sdf-walls-moving.md:15
- dem set_positions (N,4): w==0 does not mean fixed — invMass remap convention. Rejected: assuming w==0 in set_positions means invMass=0 (fixed) stale-build-mphys-trees.md:14
- dem set_positions resets every particle to shape 0 — set_shape_ids must be called after. sdf-scene-campaign.md:32
- dem's ctest MPI launcher is pinned beside mpicxx. Rejected: the PATH lookup; a hard-coded /usr/bin/mpirun fallback only when unset dem
- dem.step() with no argument advances nothing. sdf-scene-campaign.md:19
- globalScale folded into effScaleA/effScaleB throughout body-body narrowphase. Rejected: the prior narrowphase code that omitted globalScale from B's canonical remap dem-global-scale-sphere-limitation.md:10-18
- packing broad-phase: ArborX replaces cuBQL. Rejected: cuBQL (NVIDIA-only BVH) cuda-kokkos-migration.md:82-86
- random-packed-bed example: use effective radius including growth_factor; use annealed pack.py protocol. Rejected: baseRadius*scale alone (omitting growth_factor); phi_ref 0.66 crude-feedback protocol peclet-examples-gallery.md:58-71
- ring_mini is a conservation scene; ring_collide is the ring convergence gate. Rejected: chasing ring_mini's ovl with solver changes (computeW, rotation, more iterations) dem/docs/contact_physics_followups.md
- set_restitution_model default is "newton", bit-identical to prior behaviour. Rejected: making "poisson" the default dem-event-level-restitution.md:11
- set_velocity_use_gs defaults to True; False reverts to legacy Jacobi. dem-colored-gauss-seidel-solver.md:13
- step(0.0) settling must skip the velocity solve, friction, and thermostat, and zero the growth velocity. Rejected: running the full velocity pipeline during a dt==0 settle packing-velocity-position-split.md:57
- step_mpi at np=1 on a periodic domain may change bitwise (wrap pairs were solved twice). Rejected: exempting np = 1 periodic from the ownership rule to keep it bitwise dem/docs/mpi_momentum_conservation.md
Superseded — history, do not re-derive the old reading¶
- Colouring stall-break needs a filtered count-averaged-Jacobi fallback for uncolourable manifolds. dem-colored-gauss-seidel-solver.md:64-67
- DEM velocity solve: over-relaxed min(1, 2/count) average, not raw Jacobi sum — needed together with a resting-contact threshold. porous-cfddem-cuda-two-bugs.md:44
- Drum-lag "faceted-wall" geometry explanation was falsified; root cause is missing sustained-contact tangential elasticity. dem-dosta-benchmark.md:251
- Symmetric PGS alone cannot hold deep statics; one-sided alone breaks ballistic dynamics. dem-dosta-benchmark.md:167
- The overlap projection is never over-relaxed: omega_pos = 1. dem/docs/contact_solve_framework.md
- ghost_band_* ctests run on one host thread; contact order across threads stays unfixed. dem
- step_mpi stays on count-averaged Jacobi — distributed colouring across ghosts is a separate problem. dem-colored-gauss-seidel-solver.md:55-57
voro — tessellation, ConvexCell, mesh optimizer¶
81 in force, 8 superseded — full text in decisions/voro.md
In force¶
- -ffast-math based reciprocal speedups are a ceiling, not shippable. Rejected: shipping -ffast-math-based reciprocal speedups vorflow-cpu-migration-discussion.md:52-54
- 4th-face restored: cert made complete again, per-step displacement gate and brute fallback removed. Rejected: the per-step displacement gate + brute-cert fallback from the TrackAdj-only design vorflow-dynamic-updater-phase01.md:170
- A1 curved-wall shift: in-loop shift and post-pass plane translation rejected on measurement. Rejected: in-loop shift application; post-pass plane translation voronoi-methods-plan.md:50-52
- A2 re-scoped: exact power diagram not needed for non-overlapping packings. Rejected: treating A2 (exact power diagram at large weights) as a load-bearing prerequisite for tracks D/E/F/G voronoi-methods-plan.md:74-78
- Any per-rank branch between two MPI collectives must be a global (allreduced) decision. Rejected: per-rank local skin-trip decision of which collective pattern to run vorflow-dynamic-updater-phase01.md:248
- Backend-aware grid seed density: 2 seeds/cell on CPU (Voronoi), 1/cell on GPU and for Power. Rejected: a single fixed seeds/cell density across backends and weight types vorflow-kokkos-migration.md:1091-1095
- Backend-specialise the Voronoi gather: CPU uses worklist, GPU keeps legacy expanding-shell gather. Rejected: the worklist gather on the device (GPU) path vorflow-worklist-into-tessellator.md:48-58
- Blanket reclip-every-cell (S6) does not pay off — persistent Verlet list must be paired with GATED reclip. Rejected: blanket reclip of every cell each step (S6) as the production strategy vorflow-dynamic-update-strategy-study.md:72-77
- C2b collocated is the ABC approximate projection, NOT Rhie-Chow. Rejected: Rhie-Chow interpolation for the collocated pressure coupling voronoi-methods-plan.md:96-97
- C4 closed: quadratic wall gradient (wallGradientLS) is the default viscous wall flux. Rejected: the plain two-point wall flux as the viscous wall flux voronoi-methods-plan.md:147-153
- Candidate-array shrink tried and reverted — array size cannot shrink below full-sphere gather need. Rejected: shrinking the candidate array below 1024 (tried 512, safe-min ~896) vorflow-kokkos-migration.md:1141-1147
- Clip designs must be valid-by-construction; the topological inconsistency is the bug class to design out, not geometric imprecision. Rejected: fixing topological-inconsistency bugs (e.g. dead-triangle phantom-horizon cascades) by using more-accurate geometric predicates robustness-topology-oriented-sugihara.md:26
- Cold-build construct is DONE at ~14.5 M/s ceiling — do not reopen; Part II (moving points) is the real remaining win. Rejected: further cold-build construct optimization vorflow-gpu-voronoi-build-engine.md:156-161
- Cold-build gather cost (~70 distance tests/cell) is near-optimal, not wasteful — stop chasing gather tweaks. Rejected: Morton/Z-order point ordering; branchless wrap vs int-modulo; caching secR2; shrinking MAXP/MAXT caps; further gather tuning generally vorflow-gpu-voronoi-build-engine.md:34-50
- ConnectivityArena 2-ring surgical retry is also a negative result. Rejected: ConnectivityArena 2-ring candidate set for surgical repair vorflow-dynamic-updater-phase01.md:76
- Construct is bound by intrinsic clip-chain work; packing and warp-cooperative rejected. Rejected: packed/compact cell representation; warp-cooperative register-resident cell construction; explicit adjacency; incremental security radius vorflow-gpu-voronoi-build-engine.md:52-66
- ConvexCell (dual-triangle) chosen as the GPU topology, not the half-edge cell representation. Rejected: half-edge cell representation as the GPU topology (kept only as CPU oracle) vorflow-kokkos-migration.md:1233-1241
- ConvexCell foot-point representation cannot represent live d<0 faces — large-weight power deferred, small-weight solver stays d>0. vorflow-power-cells-deferred.md:20
- ConvexCell geometry decoupled from plane-definition: calculus is a function of {n_k} only. Rejected: 4×T fused kernels (one kernel per geometry-tier × cell-type combination); inlining plane-from-dofs into the hot geometry kernel vorflow-convexcell-geometry-split.md:10-17
- Convexity certificate alone is insufficient — propagation to neighbours is essential. Rejected: independent local repair without propagation (S3 alone) vorflow-dynamic-update-strategy-study.md:52-55
- Cooperative/warp-parallel half-edge cut is a dead end — do not re-attempt. Rejected: cooperative/warp-parallel half-edge cut (team-per-cell intra-cut parallelism) vorflow-kokkos-migration.md:1181-1192
- DEC viscous term shelved — first-order on skewed meshes, unstable explicitly. Rejected: DEC viscous term as an explicit covolume viscous operator voronoi-methods-plan.md:174-179
- Device Power/Laguerre diagrams dropped — no ConvexCell radical-plane geometry yet. Rejected: device Power/Laguerre diagrams under the current ConvexCell foot-point half-space representation vorflow-scratchcell-retired-dynamic-cells-next.md:33-37
- Device kernel must scalarize small dynamically-indexed arrays to registers via #pragma unroll, not leave them local-memory. Rejected: naive analytic dAreaTri implementation with dynamically-indexed local arrays (2.4x slower on GPU) vorflow-convexcell-geometry-split.md:68-72
- Distributed cold build: only build cells for original-index < nBuild; ghosts stay candidates only. Rejected: tessellating ghost cells that get discarded vorflow-worklist-into-tessellator.md:38-45
- Dynamic cell-update study scoped to topology+geometry only, no physics. Rejected: including physics/forces/dynamics in this study vorflow-dynamic-update-strategy-study.md:12-13
- Explicit standing instruction: do not propose Shewchuk/SoS robust predicates as the voro robustness plan. Rejected: Shewchuk/SoS robust (exact) predicates as the robustness plan robustness-topology-oriented-sugihara.md:32
- Filtered prolongator smoothing is required (unfiltered densifies/destabilizes the hierarchy). Rejected: unfiltered prolongator smoothing voro-graph-amg-next.md:28-30
- Fixed-K=64 kNN via ArborX BVH is the cold-build engine; best-first traversal rejected. Rejected: best-first BVH traversal for the cold build vorflow-gpu-voronoi-build-engine.md:20-32
- Free-energy objective (e=−V_ref·log(V)) is the elegant right formulation for graded equal-pressure meshing. Rejected: the earlier relative-energy + explicit log-barrier (μ Σ log(V/V_ref)) formulation as the primary objective voro-mesh-optimizer-wall-force.md:86-91
- GPU lever "warp-shares-one-worklist" is a net loss and was reverted. Rejected: lever #1, warp-shares-one-worklist sorting by sub-position+Morton vorflow-worklist-gather-next.md:19
- GPU tessellator granularity redesign: team/warp-per-cell landed at ~0.6x default, wall is the sequential half-edge cut. vorflow-kokkos-migration.md:1176-1180
- GPU-vs-CPU tessellator optimizations diverge: reducing work helps GPU, cheaper ops help only CPU. Rejected: triangle adjacency (O(1) horizon) and incremental security-radius as GPU optimizations vorflow-kokkos-migration.md:1213-1215
- GraphAMG built standalone, not on top of core::amr::MomentumMG. Rejected: building the mesh-optimizer's O(N) solve on core::amr::MomentumMG voro-graph-amg-next.md:20-25
- GraphAMG is not worth it for the mesh-optimizer solve; colored-GS-CG / Jacobi-CG win in wall-clock. Rejected: GraphAMG as the preconditioner for this mesh-optimizer solve; plain (unpreconditioned) CG voro-mesh-optimizer-wall-force.md:1699-1703
- GraphAMG strength criterion must compare squared Frobenius norm against sqrt of the diagonal product, not the raw product. Rejected:
θ²·ddiag_I·ddiag_Jas the strength-of-connection threshold voro-graph-amg-next.md:35-37 - GraphAMG strength threshold default θ=0.05. voro-graph-amg-next.md:41-42
- GraphAMG λ_max power-iteration seed must be a well-mixed random ±1 vector, not smooth or degenerate. Rejected: a smooth seed vector; an
i·odd & 1seed vector voro-graph-amg-next.md:37-40 - Interface FORCE (gradFacetAreaSq) retired; ConvexCell replacement is geomVolumeAreaGrad. Rejected: gradFacetAreaSq (half-edge-only interface force) vorflow-scratchcell-retired-dynamic-cells-next.md:38-39
- KOKKOS_LAMBDA capturing
thisfor a member read is illegal on CUDA only. voronoi-methods-plan.md:79 - Legacy half-edge Voronoi engine retired; device-only ConvexCell architecture is production. Rejected: the legacy half-edge CPU-oracle engine and its associated test/golden data tree vorflow-dynamic-updater-phase01.md:264
- Legacy half-edge engine kept only as test oracle; production path must stay legacy-free (enforced). Rejected: porting the legacy Incompressible stub faithfully; letting production code include voronoi/simulation vorflow-kokkos-migration.md:1034-1039
- Local Newton-on-positions cannot equalize or grade cell volumes from a random seeding — needs global seed redistribution. Rejected: local Newton-on-positions alone (without global seed redistribution) for equalizing/grading volumes voro-mesh-optimizer-wall-force.md:69-72
- M0/D0 derivation doc deferred by the user — do not start unprompted. Rejected: starting the M2/D0 derivation doc unprompted voronoi-methods-plan.md:234-236
- Montgomery-batch reciprocal reduction reverted — FP32-unsafe. Rejected: the 3-divide-to-1 Montgomery-batch-inversion reciprocal reduction vorflow-cpu-migration-discussion.md:44-56
- Morton (Z-order) grid indexing kept GPU-only, not for CPU backend. Rejected: using Morton grid indexing on the CPU/host backend vorflow-kokkos-migration.md:1104-1109
- No-op-clip avoidance (culling pre-clip candidates) prototyped and rejected. Rejected: the AABB/6-DOP mayCut pre-clip culling test vorflow-gpu-voronoi-build-engine.md:147-154
- Nondeterministic miss root cause: plane-count cap and facet over-buffer both miscounted; fixed to compact/rebuild at exact demand. Rejected: capping on raw plane count without compaction; sizing the facet buffer by an N×18 mean estimate voronoi-methods-plan.md:181-191
- Order-free volume walk without stored adjacency does not help; atan2 is not the bottleneck. Rejected: order-free volume walk without stored adjacency, as a performance win vorflow-gpu-voronoi-build-engine.md:176-189
- Per-sub-position rmin worklist gather replaces the adaptive shell-offset walk, on the host build path. Rejected: the adaptive shell-offset walk vorflow-worklist-into-tessellator.md:14-19
- Phase-3 gate: churn thresholds and dilate() default. vorflow-dynamic-updater-phase01.md:61
- Plan of record §12 rulings (approved 2026-09-03). Rejected: an OpenFOAM writer; picking only one of covolume/collocated; picking only one moving-cell integrator up front voronoi-methods-plan.md:8-13
- Power-cell solver physics deliberately not built yet — user wants it brainstormed first. Rejected: building the solver physics before the design is brainstormed vorflow-power-cells-deferred.md:10
- Production dynamic-update strategy is S5: persistent Verlet skin-list + propagating repair. Rejected: S3/S4 (which re-gather the grid every step) as the production strategy vorflow-dynamic-update-strategy-study.md:80-88
- Reconstructing the clipped cell externally for dV/dn was unnecessary — use the tessellator's published facet areas. Rejected: externally reconstructing the clipped cell (buildConvexCell/initBox+clip) to get dV/dn voro-mesh-optimizer-wall-force.md:53-56
- Robustness approach: topology-oriented (Sugihara), valid-by-construction, NOT exact predicates. Rejected: exact-arithmetic predicates for robustness vorflow-gpu-voronoi-build-engine.md:232-233
- SDF wall force uses Option A (exact flat / first-order curved), user's choice. Rejected: an alternative (presumably higher-order curved) SDF wall-force option, not detailed in the note vorflow-power-cells-deferred.md:16
- SDF wall term still stalls the optimizer — diagnosed as the approximate wall-gradient's first-order error, not the objective. voro-mesh-optimizer-wall-force.md:92-97
- SOTA adjacency-based cell structure loses on GPU; linear findSharing wins for ~28-triangle cells. Rejected: the Ray-et-al/geogram adjacency-pointer cell representation on GPU vorflow-gpu-voronoi-build-engine.md:68-82
- ScratchCell half-edge device cutter retired in favor of ConvexCell. Rejected: the half-edge ScratchCell device cutter vorflow-scratchcell-retired-dynamic-cells-next.md:10-16
- Seeding heuristic: grade a Voronoi mesh by placing seeds at target spacing (shells), not by rejection-sampling a density. Rejected: rejection-sampling seeds proportional to 1/V_ref density (old seed_pore_space) voro-mesh-optimizer-wall-force.md:109-120
- Single-face surgical re-clip is a negative result vs gated gather. Rejected: single-face surgical re-clip (stored∪partner candidate set) vorflow-dynamic-updater-phase01.md:69
- Smoother is 4th-kind Chebyshev, not colored-GS. Rejected: colored Gauss-Seidel smoother (for GPU/MPI reasons, decided earlier); 1st-kind Chebyshev (needs a lower-bound guess) voro-graph-amg-next.md:31-34
- Steepest descent (plain −g), not Newton, is the robust move direction — GN Hessian is rank-deficient. Rejected: relying on the Gauss-Newton Hessian direction (H⁻¹g) when it is rank-deficient voro-mesh-optimizer-wall-force.md:76-79
- Test equivalence contract: 1e-9 volume tolerance + exact neighbour set, NOT bit-exactness — cut order is free to change. Rejected: requiring bit-exact agreement with the legacy serial cutter vorflow-worklist-into-tessellator.md:28-31
- Topology decisions must be computed in FP64; geometry/volume can be FP32. Rejected: doing the topology (convexity) decision in FP32 vorflow-dynamic-update-strategy-study.md:58-61
- Use geomVolumeGrad (3-array), not geomVolumeArea, for force-only computation. Rejected: geomVolumeArea (6-array, single-pass) for force-only use cases vorflow-convexcell-geometry-split.md:48-55
- Use the sqrt-free area-vector formula for physics, not facetAreasPerVertex's magnitude form. Rejected: using facetAreasPerVertex's sqrt-based scalar magnitude for physics computations vorflow-cpu-migration-discussion.md:59-61
- Voro++-style worklist gather is now the default engine on both CPU and GPU backends. Rejected: the whole-block-accept approach for the earlier deficit; the prior assumption that branching would hurt GPU throughput vorflow-worklist-gather-next.md:11
- Voronoi robustness follows Sugihara's topology-oriented approach; exact/robust predicates are explicitly rejected. Rejected: exact/adaptive robust predicates (Shewchuk-style orientation/incircle tests) robustness-topology-oriented-sugihara.md:10
- VoronoiHalo disables periodic self-images (includePeriodicSelf=false) — device tessellator is periodic-native. Rejected: enabling periodic self-images in the halo (redundant with the tessellator's own minimal-image periodicity) vorflow-kokkos-migration.md:1014
- Wall-facet foot uses the general Newton foot n=−φ∇φ/|∇φ|², not the SDF-only n=−φû. Rejected: addSdfWallForce's n=−φû foot (has an extra |∇φ| term) voro-mesh-optimizer-wall-force.md:57-59
- Warp-cooperative clip / shared-memory neighbour staging (lever #2) was deliberately not pursued. Rejected: implementing warp-cooperative clip / shared-memory neighbour staging vorflow-worklist-gather-next.md:22
- Whole-block-accept (rmax) is a net loss on the fine grid and stays gated off by default. Rejected: whole-block-accept (CC_WBA) as a default optimization vorflow-worklist-gather-next.md:30
- dAreaTri kernel renamed to geomVolumeAreaGrad; policy named Voronoi, not PlaneVoronoi (user naming decision). Rejected: the names dAreaTri and PlaneVoronoi vorflow-convexcell-geometry-split.md:74-77
- geomVolumeGrad: sqrt-free 3-array form chosen over per-vertex normalization or a 4th scratch array. Rejected: normalizing inside the per-vertex scatter (6x the sqrts); a separate raw sacc[MAXP] 4th scratch array vorflow-convexcell-geometry-split.md:36-46
- nvcc: no first-capture inside
if constexpr. voronoi-methods-plan.md:29-30 - poke4 caching makes the new (TrackAdj) certificate uniformly beat the old poke design. Rejected: the plain TrackAdj adjacency-derivation-per-query approach (pricier cert) and the OLD poke approach (expensive gather with findSharing) vorflow-dynamic-updater-phase01.md:191
- vorflow get_num_neighbors must read the explicit cellFacetCount, not diff the device cellFacetOffset. Rejected: computing neighbour count as off(i+1)-off(i) over the device cellFacetOffset nanobind-zero-copy-migration.md:28
- voronoi_dynamics Kokkos port is OpenMP-first, no GPU backend this effort. Rejected: doing a GPU backend for voronoi in this effort cuda-kokkos-migration.md:90-91
- voronoi_dynamics renamed to vorflow, not "voronoi". Rejected: naming it "voronoi" cuda-kokkos-migration.md:65-67
Superseded — history, do not re-derive the old reading¶
- C1 gate metric was wrong: cellwise-residual "2nd order" is not the right convergence gate. voronoi-methods-plan.md:85-88
- C3 wall Poiseuille is not exact to round-off; the plan's claim was wrong. voronoi-methods-plan.md:128-130
- Convexity certificate replaced by local-Delaunay (4-poke) test. vorflow-dynamic-updater-phase01.md:106
- Inline reshape repair: tried, reverted as marginal, but the local-Delaunay certificate is retained. vorflow-dynamic-updater-phase01.md:122
- Per-vertex flag/divergence geometry (sort-free, adjacency-free) adopted as the default re-eval kernel, superseding the atan2 and stored-adjacency paths. vorflow-gpu-voronoi-build-engine.md:190-229
- Reframe: the neighbour-query GATHER, not the topology decision/repair, is the core problem to solve next. vorflow-dynamic-update-strategy-study.md:92-94
- The voro mesh optimizer's host-orchestrated first cut was a violation of the device-first principle and had to be re-architected. device-first-mpi-design-principle.md:20
- TrackAdj/adjacency-maintained Lawson certificate replaces the 4-poke local-Delaunay certificate. vorflow-dynamic-updater-phase01.md:140
amr — block octree, mixed-level cut band¶
70 in force, 3 superseded — full text in decisions/amr.md
In force¶
- A multigrid level below the octree's root brick is the SAME octree with its root LIFTED — not a new level type. Rejected: generalising the openness-free
inner_chain (a second level type, host-only, used by no production path); flow's agglomerated CSR bottom ALONE on th amr/docs/amr_mg_depth.md - A pressure stage never hands a rank more coarse-level cells than its FINEST LEAF COUNT — maxBlockCells is the leaf count, not the fine-cell count. Rejected: the fine-cell count of the largest finest-level block amr/docs/amr_mg_core_boundary.md
- AMR NS advection keeps the fluid-fluid scheme unchanged; uf stays the face-averaged form. amr-ghost-collocated-ns-plan.md:83
- AMR gets its own separate Python binding module (tpx_amr), not folded into tpx_mpi. Rejected: extending tpx_mpi to include AMR bindings amr-python-bindings-next.md:14-17,
- AMR keeps ORB block decomposition, not a global SFC partition. Rejected: one global SFC partitioned by index range (p4est/Dendro style) amr-octree-status.md:12-15
- AMR pressure "near-nullspace" stall under advection was an un-deflated incompatible RHS mean plus a stale PCG gate — not an SPD or coarsest-level defect. Rejected: an SPD violation as the cause; the coarsest-MG-level as the cause (both explicitly refuted by measurement) amr-aperture-advection-resolved.md:11
- AMR rebalance weight grid is defined over root cells, not fine cells. Rejected: weighting over fine cells dynamic-load-balancing.md:67
- All world-coordinate evaluation must use the global frame, never per-rank local coordinates. Rejected: per-rank local-frame world-coordinate evaluation amr-distributed-flow-campaign.md:22
- Bind host AMR classes before the Kokkos device path. Rejected: binding the Kokkos device AMR classes first amr-python-bindings-next.md:203-204
- C/F face-value delta is gated per FACE (
regular(i) && regular(j)), never per row. Rejected: the rowRegular ROW gate (superseded below); rowFluid on both builders (the 2026-08-27 amr/docs/amr_cf_flux_gate.md - C/F scheme pressure matrix/MG/PCG stays standard order — placement is (1,2). Rejected: moving the matrix itself to quadratic C/F order amr-ghost-collocated-ns-plan.md:71
- C/F-consistent flow operators fix graded-mesh drag (supersedes the "momentum only" attempt). Rejected: solveQuad projection (quadratic coarse-fine flux) for the graded flow's pressure solve; momentum-only C/F fix amr-octree-status.md:947-958
- Cell-count savings did not reduce march time — the saving is a spent, not lost, quantity. Rejected: H-iters and H-mg as explanations for the flat step time (both REFUTED) amr-mixed-level-cut-band-plan.md:238
- Changing a default that affects numerics re-blesses bed references — treat as a decision, not a tuning knob. amr-march-distributed-campaign.md:18-23
- Cloud-economy variant selection: bed permeability alone is the wrong discriminator. Rejected: N≤24 and N≤16 cloud-economy variants (look better on permeability alone but fail seam/stability gates) amr-mixed-level-cut-band-plan.md:382
- Coarsening/covering construction must use c.find(f.code(i)) suite-wide, not ancestor(level+1). Rejected: ancestor(level+1)+find for covering construction amr-distributed-flow-campaign.md:32
- Collocated pressure coupling is ABC (Almgren-Bell-Colella), never Rhie-Chow. Rejected: Rhie-Chow interpolation for the collocated pressure-velocity coupling amr-octree-status.md:56-68
- Compat-RHS repair works but is rejected for production in favor of deflation, due to a resolution-independent bias. Rejected: the compat-RHS repair (computing divergence on all operator DOF) as the production fix amr-aperture-advection-resolved.md:49
- Cut-cell openness α must be evaluated at the finer neighbour's actual lower corner, not the probe point. Rejected: using the probe point's lower corner for computing sub-face α amr-octree-status.md:871-874
- D1' host parallelism is pure Kokkos over an OpenMP host space, not OpenMP pragmas. Rejected: "my first-draft OpenMP-pragma route" amr-mixed-level-cut-band-plan.md:152
- Distributed MG deadlock fixed by padding the hierarchy to the global-max level count. Rejected: per-rank-local level counts driving a collective loop amr-testing-benchmarking-resume.md:31-49
- Distributed fragmentation guard design: halo label-propagation + Allreduce, not rank-local BFS. Rejected: rank-local BFS for the distributed fragmentation guard amr-distributed-flow-campaign.md:67
- Distributed momentum preconditioner is rank-local Galerkin MG, not Jacobi. Rejected: a Jacobi fallback preconditioner amr-distributed-flow-campaign.md:40
- Extend core's AmrFlow rather than build octree AMR into flow itself. Rejected: "build octree AMR into flow itself" amr-ghost-collocated-ns-plan.md:134
- Fix: remove the stale presPCG_ && !advect_ gate — the PCG's per-iteration deflation already handles the incompatible RHS. Rejected: keeping the presPCG_ && !advect_ gate that forced the (unconverging) V-cycle path under advection amr-aperture-advection-resolved.md:28
- Fragmentation guard: pocket cells pinned and excluded from the mean and gradients, not zero-forced. Rejected: gating pocket creep as exactly zero amr-ghost-collocated-ns-plan.md:112
- GOTCHA/invariant: detect non-finite explicitly — max|u| via std::max(0,NaN) hides blowup. Rejected: relying on max|u| alone to detect solver blowup amr-octree-status.md:781-782
- Gap-floor policy default n=4 is the calibrated floor, not sharper. Rejected: n=8 or sharper (non-monotone, not a reliable improvement) amr-mixed-level-cut-band-plan.md:102
- Gate W is stated on the leak itself, never on m1/m3 — a ratio of two totals cannot measure a defect proportional to φ. Rejected: m1/m3 (max over a codimension-1 set ÷ volume L2) as the worth-it statistic amr/docs/amr_pressure_iteration.md
- Geometric octree-walk kernels kept as an independent oracle alongside the shared-CSR kernels. Rejected: deleting the geometric octree-walk implementations once the shared CSR body existed amr-host-device-kernel-consolidation.md:31-32
- Ghost metadata must be re-installed into builders at the top of every discovery round. amr-distributed-flow-campaign.md:77
- Ghost projection is retired suite-wide; ghost_closure has no production consumer. Rejected: AUTO-selecting ghost projection as a production scheme amr-aperture-advection-resolved.md:36
- Ghost-closure pure functions are lifted into core, not duplicated. Rejected: duplicating the pure closure functions in flow and core separately amr-ghost-collocated-ns-plan.md:36
- Host AMR must stay Kokkos-free; consolidation done via shared MORTON_HD kernel bodies over a templated accessor. Rejected: making the host AMR reference depend on Kokkos amr-host-device-kernel-consolidation.md:14-19
- Host pressure runtime deliberately kept geometric (not switched to shared CSR kernels) for performance reasons. Rejected: switching the host pressure runtime to the shared assembled-CSR kernel amr-host-device-kernel-consolidation.md:33-36
- Implicit-FOU deferred correction defaults ON for AmrFlow advection. Rejected: pure explicit advection (default before this change) amr-octree-status.md:777-782
- Incremental rotational pressure projection replaces non-incremental Chorin (removes dt-dependent error). Rejected: plain non-incremental Chorin projection amr-octree-status.md:763-767
- Inner pressure iterations and the deferred-corrected C/F gradient: both DECLINED, (B) designed and parked on a measurement. Rejected: inner predictor→projection iterations (A), permanently; building (B) now amr/docs/amr_pressure_iteration.md
- Invariant: faceNeighborGather slot layout is [+x,-x,+y,-y,+z,-z]. Rejected: a [-x,+x,-y,+y,-z,+z] slot ordering amr-python-bindings-next.md:34-35
- Island-corner C/F stencils sample a finer tangential neighbour by child-volume average. amr-ghost-collocated-ns-plan.md:109
- M2/D3 verdicts: H-launch accepted as a small-mesh tax; np>1 ~3e-7 residual class accepted. Rejected: reworking H-launch cost immediately (deferred instead to device-assembly campaign) amr-mixed-level-cut-band-plan.md:357
- MG hierarchy must share one h0 (level already encodes width). Rejected: doubling h0 per level amr-octree-status.md:34-35
- MG-as-solver + Picard outer loop: project ONCE per step, not inside the loop. Rejected: projecting inside the Picard outer loop amr-gpu-smoother-flow-port.md:56-67
- Minimum-image period for cloud membership is fineExt·h0, an off-by-one fix not a convention change. Rejected: "none stated" (bug fix, not an alternative choice) amr-mixed-level-cut-band-plan.md:281
- Mixed-level cut-band overlay CSR growth spends the cell savings, not lost — H-iters/H-mg refuted. Rejected: the pre-registered H-iters and H-mg hypotheses for where the mixed-level band's speed benefit comes from amr-march-distributed-campaign.md:30-37
- Multicolor-GS smoother: symmetrize the adjacency before coloring; sweep must be symmetric (SGS), undamped. Rejected: forward-only (non-symmetric) GS colouring/sweep as a BiCGStab preconditioner; damped GS (omega=0.7) amr-gpu-smoother-flow-port.md:40-55
- Mutex-on-miss fix: guard only the pre-freeze emplace, not the wider candidate fixes. Rejected: "Neither candidate fix was needed" (the two originally-proposed candidate fixes for the race) amr-mixed-level-cut-band-plan.md:135
- OpenMP backend is the bit-exact determinism reference; GPU is tolerance-based only. Rejected: the earlier belief that CUDA/HIP were bit-exact to host amr-gpu-smoother-flow-port.md:142-146
- Poisson operator sign convention unified suite-wide: L=∇² (negative-definite). Rejected: A=−∇² convention (used previously in DistributedPoisson/deviceJacobiSweep) amr-octree-status.md:861-865
- Pressure smoother chosen: MG-PCG, NOT multicolor-GS; Chebyshev not pursued for pressure. Rejected: multicolor-GS for the pressure smoother; a Chebyshev pressure driver amr-gpu-smoother-flow-port.md:128-133
- Projection, MG transfers and V-cycle orchestration deliberately NOT consolidated onto a shared body. Rejected: consolidating the projection/MG-transfer/V-cycle code onto a shared body amr-host-device-kernel-consolidation.md:47-52
- Rediscretized coarse momentum operators fail — must coarsen the exact assembled operator (Galerkin). Rejected: rediscretized openness/Neumann Helmholtz coarse operator (with and without the shift-floor fix) amr-gpu-smoother-flow-port.md:153-159
- SOU (second-order-upwind) is the default advection flux; Koren TVD becomes an option. Rejected: Koren TVD as the default (now opt-in) amr-octree-status.md:770-776
- Sign convention: the AMR ghost operator is +L (negative-definite). amr-ghost-collocated-ns-plan.md:44
- Staircase velocity-MG fixed by the clean-fluid exclude mask; Galerkin stays the robust default. amr-gpu-smoother-flow-port.md:29-38
- The C/F scheme DEFAULT is cf=1 (quadratic); cf=0 is the legacy path. Rejected: keeping cf=0 as the default for backward compatibility amr/docs/amr_graded_convergence.md
- The advected value at a 2:1 seam is reconstructed from the UPWIND side with level-aware probes, the tangential sample applied ONCE. Rejected: Martin-Colella's quadratic NORMAL fill (mixes downstream fine cells into the seam value — amplitude and the dt = 1e20 stability margin); minmod-limite amr/docs/amr_cf_convective.md
- The coarsest-grid extent stays at 4 — the depth dependence was measured and is ~1 iteration, not 4. Rejected: flipping the default to extent 8 on the single-sample evidence; escalating the deepest-level observation to a design pass amr/docs/amr_mg_depth.md
- Volume-weighted superficial velocity is required on graded meshes. Rejected: non-volume-weighted superficial velocity on graded meshes amr-ghost-collocated-ns-plan.md:57
- What remains at a 2:1 seam is the JUMP in the flux-error constant, and the lever is MATCHING the two sides, not maximising either. Rejected: chasing the residual graded-vs-coarse penalty with a better sub-face reconstruction amr/docs/amr_cf_convective.md
- Zero pressure after finish_adapt rather than carry the accumulated pressure through coarsening. Rejected: carrying the transferred/accumulated pressure through a coarsening adapt event amr-ghost-collocated-ns-plan.md:121
- amr's stage policy takes minExtent = 4, flow's trigger verbatim — inert while the policy is consulted only after the §6.2 lift stops. Rejected: minExtent = 0 (amr's ladder has no economic trigger — rejected only for consistency with flow, since it measures identical); consulting the policy bef amr/docs/amr_mg_core_boundary.md
- cf=1 (quadratic C/F flux) is not optional on graded meshes. Rejected: standard (cf=0) two-point C/F flux on graded/throat meshes amr-mixed-level-cut-band-plan.md:113
- mpi4py rule: never call a collective inside a rank-0-only block. amr-distributed-flow-campaign.md:84
- np=1 bit-exactness is the gate for every distributed default. amr-distributed-flow-campaign.md:75
- setGhostProjection default is AUTO (tri-state), not always-on or always-off. amr-ghost-collocated-ns-plan.md:98
- setSolid bottleneck diagnosed as SDF evaluation cost, not builder logic. Rejected: a scalar std::function SDF evaluation API (locks in serial host evaluation forever) performance-sota-yardstick.md:21-28
- transferField prolongation gradients must be halo-completed, not block-local. Rejected: block-local prolongation gradients amr-distributed-flow-campaign.md:47
- κ-restrict re-tested on Dirichlet: floor gone but still no win over plain — plain stays default. Rejected: κ-weighted restriction as default (confirmed again) amr-octree-status.md:899-910
- κ-weighted MG restriction evaluated and rejected as default; plain volume-average stays default. Rejected: κ-weighted restriction as the default MG restriction operator amr-octree-status.md:888-898
Superseded — history, do not re-derive the old reading¶
- G.2 decision changed: the whole core/amr tree becomes its own package peclet-amr, depending on core alone. suite-quality-plan-1-0-0.md:68-80
- Graded-mesh flow requires ALL flow operators (momentum, divergence/gradient, advection) to be C/F-consistent — momentum-only fix insufficient. amr-octree-status.md:947-958
- cfDiv/cfGrad row gate must be rowRegular, not rowFluid. amr-mixed-level-cut-band-plan.md:70
core — decomposition, halo, rebalance¶
33 in force, 1 superseded — full text in decisions/core.md
In force¶
- A core header is on the MPI side iff it includes
common/mpi.hpp, held by a CI manifest gate. Rejected: leaving the MPI boundary implicit docs/CORE_BOUNDARY.md - AMR PCG must mask solid AND project onto the fluid range (mask + fluid-only mean), not just deflate the constant mode. Rejected: deflating only the constant/all-cell mean without masking solid cells device-naming-retirement.md:89-95
- Anderson acceleration (
AndersonCore) lives in corepeclet::core::solverfrom the start. Rejected: flow-local first, promoted when amr adopts it flow - Anisotropic coarse-grid partitioning requires cellExtent, not raw cell-count kLargest. Rejected: partitioning by raw cell-count kLargest on an anisotropic coarse grid mg-decomposition-alignment.md:43
- Coarse-level redistribution lives in core; the hierarchies stay in the methods. Rejected: per-method private implementations (three were forming); a core "multigrid stage" that owns the continued hierarchy below the stage point (core cannot amr/docs/amr_mg_core_boundary.md
- Convention: keep NBX tag families >= 64 apart. nbx-round-tag-race.md:28
- Cut-cell geometry and probe kernels are container-free core headers. Rejected: flow-private copies (amr and VoF would fork them); a core Krylov (core's MomentumSolver binds the operator to a CSR type and the vectors to a [0, n)+g flow
- Device-vs-host numerical comparison policy: bit-exact assembly, tolerance-based apply on CUDA/HIP. Rejected: requiring bit-exact apply/V-cycle results on CUDA/HIP (impossible given FMA contraction) kokkos-cuda-constexpr-required.md:27-30
- GPU-aware MPI auto-detection uses query + checksum loopback probe, never blind probing. Rejected: blind device-pointer probing to auto-detect CUDA-aware MPI suite-mpi-gpu-campaign.md:16
- Gate the CUDA-aware MPI device path on an explicit env var, not the MPI query API. Rejected: relying on MPIX_Query_cuda_support() to detect CUDA-aware MPI suite-distributed-status.md:353
- Halo topology vs exchange split: topology stays host MPI plumbing, exchange is the device kernel. device-naming-retirement.md:32-40
- Kokkos CUDA installs MUST set Kokkos_ENABLE_CUDA_CONSTEXPR=ON. Rejected: building the nvidia-cuda Kokkos install without Kokkos_ENABLE_CUDA_CONSTEXPR kokkos-cuda-constexpr-required.md:10-22
- NBX consecutive rounds must use distinct message tags. Rejected: sharing tag 0 across NBX request/reply rounds amr-octree-status.md:786-791
- NBX inter-round tag race fixed by rotating the tag per round; buildTopology now verifies promised==requested cells. Rejected: running consecutive NBX consensus rounds on one communicator with a single fixed tag nbx-round-tag-race.md:17-19
- NBX tag interaction: two standing rules for wire tags. amr-march-distributed-campaign.md:66-77
- No silent
if(MPI_FOUND)guard on the core Python bindings; the stopgap is a loud opt-in. Rejected: the silent guard docs/CORE_BOUNDARY.md - ParticleHalo gather() throws on capacity overflow instead of silently truncating. Rejected: silent truncation of ghost count on overflow cuda-kokkos-migration.md:627-629
- ParticleHalo periodic self-ghosts default OFF for byte-identical compatibility. Rejected: making periodic self-ghosts on by default cuda-kokkos-migration.md:618-621
- Periodic axis needs >=2 ranks. suite-distributed-status.md:27-28
- Port transport-core's device layer first (foundation-first sequencing). Rejected: porting each consumer's halo independently (double-porting) cuda-kokkos-migration.md:79-82
- Rebalance is pure migration (same global mesh, new owners) and must never use transferField. Rejected: using transferField (same-domain old→new octree conservative remap) to implement rebalance migration dynamic-load-balancing.md:62
- The
peclet-coreDISTRIBUTION splits intopeclet-geomandpeclet-halo; the C++ identity does not move. Rejected: a top-levelpeclet::geom/peclet::haloC++ namespace and header path, and docs/CORE_BOUNDARY.md - The halo package is named
peclet.halo, notpeclet.mpi. Rejected:peclet.mpidocs/CORE_BOUNDARY.md - The host backend is sized by the CPU BUDGET (cgroup quota ∧ affinity), not by the visible CPU count. Rejected: (a) documentation alone — the README/Colab bootstrap warning shipped 2026-09-12 and user
- Treat nvcc warnings #20013/#20015 as errors, not style noise. Rejected: treating #20013/#20015 as benign style warnings kokkos-cuda-constexpr-required.md:26-27
- Weighted ORB dynamic load balancing is one shared primitive that lives in the core layer. Rejected: implementing separate load-balancing logic per consumer (AMR, dem) dynamic-load-balancing.md:18
- Weighted ORB split boundary must remain on integer cell boundaries. dynamic-load-balancing.md:65
AndersonStateis views + roles (Velocity / Carried) + extent + ghost + comm; no pressure metric, noinnerTolerance, no Gram blocks GG/GR (rev 1 WO-3b, rev 2 WO-3c). Rejected: keeping the unused pressure metric or innerTolerance / GG / GR until after the tag (a breaking change then) flowpeclet-corebecomes a pure-Python compatibility shell, frozen at its last 1.x with a<2ceiling. Rejected: a code-free 2.0.0 depending on the new packages docs/CORE_BOUNDARY.md- block_decomposer retired/archived, replaced by transport-core (core). cuda-kokkos-migration.md:57-58
- coarsenAlignment bug: natural-max alignment over-constrains ORB; cap alignment at 2^4. Rejected: natural-max alignment for ORB decomposition snapping parallel-scaling-study.md:60-64
- peclet-core sdist must vendor its own SuiteNanobind copy, not depend on the umbrella cmake/. Rejected: the core sdist referencing the umbrella's cmake/ directory for SuiteNanobind release-workflow-prep.md:93
- toVector must repack a strided device subview to a contiguous buffer before cross-space deep_copy. Rejected: cross-space deep_copy directly on a strided device subview dem-cubes-gpu-pyvista.md:30-34
Superseded — history, do not re-derive the old reading¶
- No Rhie-Chow update at cell centres — RC is purely the face term, automatic once uf is separate from interp(u). device-naming-retirement.md:106-108
coupling — CFD-DEM¶
19 in force, 4 superseded — full text in decisions/coupling.md
In force¶
- CFD-DEM couples flow and dem in Python only, via DLPack, with no C++ link. Rejected: a direct C++ link between flow and dem multiphysics-framework-plan.md:408
- Causes ruled out before finding the epsilon-conservative-momentum fix. Rejected: ∂ε/∂t RHS term as the cause; conservative-flux advection compensation alone as sufficient; PCG/Chebyshev/GraphAMG solver choice as the cause porous-eps-conservative-momentum.md:17-19
- Centre-of-rotation convention: NaN follows the body, any finite point (including origin) pins. Rejected: the old zeros-follow rule as ambiguous going forward (kept only for legacy 17-real array decode) sdf-scene-campaign.md:139
- Coupled decomposition uses weight-field-based rebalance, never exposing decomposition objects to Python. Rejected: passing/crossing BlockDecomposer objects to Python multiphysics-framework-plan.md:371
- Drag coupling must be implicit (semi-implicit on the momentum diagonal), not explicit. Rejected: explicit −βu drag forcing multiphysics-framework-plan.md:387
- Exponential-integrator effective drag replaces plain explicit particle-side drag exchange. Rejected: explicit particle-side drag exchange (β·dt/m unconstrained) porous-eps-conservative-momentum.md:46-54
- Kuipers deposit-after-push reorder tested, not adopted. Rejected: Deen/Kuipers synchronous eps-update ordering porous-cfddem-cuda-two-bugs.md:39
- Model-B drag conversion: β_B = β_A/ε; CfdDem defaults changed (advection=True; eps_min 0.4, a floor since superseded — now 0.25). Rejected: eps_min=0.2 or 0.3 porous-cfddem-cuda-two-bugs.md:25-26
- One partition from construction on, chosen by the combined CFD + DEM cost. Rejected: dem adopting flow's
init_mpipartition at start-up (and the interim guard that raised at the first step and told the user to callrebalance()by h user - Reaction torque coupling stays off by default despite being resolved. Rejected: turning reaction-torque coupling on by default sdf-scene-campaign.md:56
- Rebuild all three mphys host trees before diagnosing a coupling test failure. stale-build-mphys-trees.md:10
- The CFD-DEM coupling force is the discrete reaction (route b), not the traction integral. Rejected: hydro_force_torque (the traction integral) as the production coupling force sdf-scene-campaign.md:18
- The July porous CFD-DEM CUDA crash was three real bugs, not a stream race; a genuine cross-module stream race exists and is fenced by HandOff. Rejected: the 2026-07-06 reading that the illegal-address crash was a cross-stream race (it was the DEM pair-buffer overflow plus two flow solver defects; "CUDA memory
- The public force API returns the reaction; the traction is a named diagnostic. Rejected: leaving the traction under the natural name
hydro_force_torque()(a user asking for "the force on my particles" got one ~30 % low with no signal); m USER - USER DECISION — the void-fraction floor eps_min is a division guard, default 0.05, not a packing limit. Rejected: eps_min = 0.25 as a "physical regularisation at random close packing" (true only for sphere mixtures — ellipsoids pack to ε ≈ 0.26, wide bidisperse mi user,
- USER DIRECTIVE: porous=True (volume-averaged NS) is the default for CFD-DEM. Rejected: porous=False (plain incompressible NS with ε only in the drag closure) as the default cfddem-porous-default-directive.md:10
- Volume-averaged gas momentum must be epsilon-weighted with a matched projection pair. Rejected: the old plain-u momentum path with epsilon only in drag/constraint/coefficients porous-eps-conservative-momentum.md:10-31
- porous=False is NOT "Model B" — terminology correction. Rejected: calling porous=False "Model B" porous-cfddem-cuda-two-bugs.md:22
- porous=False is only a justified cheap approximation, never for published benchmark comparisons. Rejected: using porous=False in published benchmark comparisons cfddem-porous-default-directive.md:23
Superseded — history, do not re-derive the old reading¶
- GraphAMG default restricted to !hasBc_ (domain-BC path defect). porous-cfddem-cuda-two-bugs.md:13
- Porosity clip changed from a 0.4 floor to [0,1]-only, per user directive; MFIX-faithful smoothing/drag law added instead. porous-cfddem-cuda-two-bugs.md:59-62
- The cross-module CUDA porous-CFD-DEM crash was an async stream race, not a GraphAMG bug. multiphysics-framework-plan.md:382
- Void-fraction floor eps_min = 0.25: a physical regularisation at the random-close-packing limit. coupling
pnm — pore-network extraction¶
6 in force, 0 superseded — full text in decisions/pnm.md
In force¶
- Core/film throat tier criterion must be geometric (both cells fluid-centered), not an openness threshold. Rejected: an openness-threshold criterion for the core/film tier peclet-pnm-split.md:58-61
- Distributed forest/label algorithm design lessons: pointer-jump must not store gid outside extended block; Jacobi double-buffer required, not in-place. Rejected: storing a gid outside the extended block during pointer jumping; in-place flood fill on device peclet-pnm-split.md:84-91
- Network-flow extraction requires cutcell_pressure=True; fluxes must accumulate on flow basins, not seg-keyed. Rejected: seg-keyed flux accumulation peclet-pnm-split.md:31-34
- Periodic-image decisions must never depend on float centroids — anchor on integer peak-voxel coordinates. Rejected: float-centroid-based periodic-image decisions peclet-pnm-split.md:74-78
- Solid/pore renumbering must reduce min-appearance per label, not first-appearance gid. Rejected: using first-appearance gid as the label peclet-pnm-split.md:94-95
- pnm becomes its own project (peclet.pnm); peclet.flow.pnm removed. Rejected: keeping pore-network extraction inside flow as peclet.flow.pnm peclet-pnm-split.md:11-16
suite-wide — naming, layout, provisioning¶
32 in force, 1 superseded — full text in decisions/suite-wide.md
In force¶
- A host backend that does not size itself must be handed the thread budget. Rejected: keeping the "say nothing on an unconstrained machine" policy for every backend (it is archive/RELEASE_PREP_1.0-1.1.md
- A solver's internal grid-count threshold is a count, not cell-unit API. Rejected: a physical-length form (wrong: the same length means a different level count at a amr
- All coupled methods must share one BlockDecomposer; static-only co-decomposition is rejected. Rejected: "Static-only co-decomposition" multiphysics-framework-plan.md:410
- CMake suite_require_nanobind must be a macro, not a function. Rejected: implementing suite_require_nanobind as a CMake function nanobind-zero-copy-migration.md:15
- Collocated default is AUTO ghost projection (in both flow and AMR), with documented fallbacks. collocated-attractor-campaign.md:53
- Collocated pressure and forces stay in the implicit predictor — never a face acceleration after the viscous solve. Rejected: the Basilisk face-acceleration ("centered.h") form on any collocated path; a text flow
- Convention going forward: never add cell-unit API surface; new setters take physical inputs. Rejected: adding new cell-unit-only API surface physical-units-plan.md:44
- Cross-backend gate for "ported". cuda-kokkos-migration.md:94
- D1–D9: clean break at 1.0.0 — no aliases, two API tiers, no numerics-changing env vars, single version source, honest CI, AMR relocated. Rejected: keeping compatibility aliases; letting env vars change numerics; multiple version sources; deleting AMR suite-quality-plan-1-0-0.md:15-21
- Design: keep index-native kernels, fold the metric into constants at the API boundary via reference scales. Rejected: reworking the kernels themselves to be metric-aware (rejected in favor of index-native kernels + boundary conversion) physical-units-plan.md:16
- Device-resident class duals take a data-structure suffix "View", not a location word. Rejected: a location-word suffix (e.g. "Device") for these class duals peclet-v0.1-release.md:78
- Do not change numerics while porting (faithful port principle). Rejected: changing scheme/numerics mid-port cuda-kokkos-migration.md:304-307
- Every peclet numerical method must run fully on-device and be MPI-distributable; host paths are oracles/tests only. Rejected: host-orchestration bottlenecks — per-iteration host↔device downloads, host assembly, host linear solves device-first-mpi-design-principle.md:10
- Feature-completion option A: Kokkos takes canonical names only after full parity; no merge until then. Rejected: other unnamed options (not detailed in note) — merging/renaming before parity was confirmed cuda-kokkos-migration.md:290-292
- Host serial paths are permitted only as oracles/unit tests, never as the production path. Rejected: any host serial path as a production code path device-first-mpi-design-principle.md:18
- Iteration order follows storage: x fastest on every backend. Rejected: relying on the backend default iteration (silently wrong-strided on host); per-site flow
- KEPT exceptions to the device-naming ban: transfer verbs and prose. peclet-v0.1-release.md:87
- Kokkos device sources must be .cpp, not .cu. Rejected: forcing LANGUAGE CUDA / .cu extension cuda-kokkos-migration.md:109-112
- Kokkos migration requires C++20. Rejected: staying on C++17 cuda-kokkos-migration.md:104-105
- Migration considered complete: user decision option c. Rejected: other unnamed completion options cuda-kokkos-migration.md:582-586
- Naming convention: identifiers name what a thing is, never where it runs; "device"/"Kokkos" are banned qualifiers. Rejected: identifiers naming a thing by its execution location (e.g. "Kokkos"/"Device" qualifiers) peclet-v0.1-release.md:62
- Naming convention: one short lowercase identity, drop "-gpu". Rejected: keeping the "-gpu" suffix; GitLab remotes cuda-kokkos-migration.md:48-63
- No
Device*/*Kokkosclass names for exposed kernels; host code is an unexposed oracle only. Rejected: class names containingDevice*or*Kokkos; exposing host-only kernel code to Python device-naming-retirement.md:10-14 - Provisioning via shared install prefix + find_package, not FetchContent. Rejected: FetchContent cuda-kokkos-migration.md:105-109
- Suite-wide migration from pybind11 to nanobind + scikit-build-core, on a shared zero-copy bridge. Rejected: pybind11 as the binding framework nanobind-zero-copy-migration.md:11-13
- USER DIRECTIVE: peclet must match/exceed SOTA massively-parallel-code performance in every component, including setup. Rejected: judging performance only by the per-step solve/march, ignoring setup-path cost performance-sota-yardstick.md:11-22
- USER DIRECTIVE: peclet.flow is the reference for shared-method design elsewhere in the suite, not Basilisk or the literature. Rejected: taking Basilisk (or a paper) as the reference for a shared method design; the Basilisk face-acceleration form for the collocated projection flow-is-the-method-reference.md:8-19
- USER DIRECTIVE: quality is the prime objective; next release is a clean-break 1.0.0, API-breaking allowed; AMR preserved not deleted. Rejected: preserving backward compatibility / a minor version bump suite-quality-plan-1-0-0.md:11-13
- USER DIRECTIVE: solvers take a physical domain + physical properties; spatial discretization must not influence physical property values. physical-units-plan.md:11
- Wheels for a toolchain without OpenMP ship Kokkos::Threads, not Serial. Rejected: the Kokkos Serial backend (single-threaded, and it was chosen only because the third archive/RELEASE_PREP_1.0-1.1.md
- morton stays on ctypes by design; vorflow's legacy host bindings stay on pybind11. Rejected: migrating morton's bindings to nanobind; migrating vorflow's legacy host bindings to nanobind nanobind-zero-copy-migration.md:17
- nanobind Kokkos+CUDA modules require NOMINSIZE (nanobind's default -Os breaks nvcc). Rejected: nanobind's default -Os compile flag for Kokkos CUDA modules nanobind-zero-copy-migration.md:24
Superseded — history, do not re-derive the old reading¶
- atexit Kokkos::finalize is required on CUDA, not just optional as on OpenMP. nanobind-zero-copy-migration.md:23-25