docs: S0 draft — fail-closed motion commit, derived centres, candidate tolerances, S1 scope

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-30 06:15:13 +00:00
1 parent f976682b7f
commit 2c1ad7f793
1 file changed
+55 -10
+55 -10
View File
@@ -82,12 +82,21 @@ fluid pull from a solid slot of a moving body is BFL-written.
## 4. State, masks and authority ## 4. State, masks and authority
- Host `ObjectState` is the single authority for `offset = (dx, dy)`, - Host `ObjectState` is the single authority for one displacement
`velocity = (vx, vy)` and `omega`. Velocity is supplied, never differenced `offset = (dx, dy)` relative to the immutable base centre, plus
from offsets. `velocity = (vx, vy)` and `omega`. Centres are always derived
- Per body a small device **motion record** `{c^{n-1}, c^n, u^n}` is uploaded (`c = base + offset`), never stored as independent state. Velocity is
with the action buffer; action-slot meaning is not overloaded. (CANDIDATE supplied, never differenced from offsets.
layout; OPEN.) - `c^{n-1}` is derived from the last *committed* offset, `c^n` from the
offset being applied. Per body a small device **motion record**
`{c^{n-1}, c^n, u^n}` is uploaded with the action buffer; action-slot meaning
is not overloaded. (CANDIDATE layout; OPEN.)
- Fail-closed commit: an enqueued upload is not a completed one. The new
offset becomes the committed offset only after the stream synchronization
that follows the upload and the step group succeeds. Any upload or later
synchronization failure leaves host and device motion state unknown: the
simulation is marked unusable (existing `_require_usable` lifecycle), and
no API may report a host/device match afterwards.
- Membership is never read from a flag that M1 is overwriting. The host - Membership is never read from a flag that M1 is overwriting. The host
verifies at `add_body` that every swept-band cell has base flag FLUID, so the verifies at `add_body` that every swept-band cell has base flag FLUID, so the
band's base state is known without reading `flag_gpu`. band's base state is known without reading `flag_gpu`.
@@ -97,7 +106,9 @@ fluid pull from a solid slot of a moving body is BFL-written.
## 5. Refill of fresh cells (CANDIDATE) ## 5. Refill of fresh cells (CANDIDATE)
- Stored time level: everything in `ddf` at M1 is post-collision `G^{n-1}`; the - Stored time level: everything in `ddf` at M1 is post-collision `G^{n-1}`; the
refill writes all 9 slots at that same level. refill writes all 9 slots at that same level, so every slot of a fresh cell
that the following pull or a q < 1/2 link may read is defined. Donor values
are read at the same level `G^{n-1}` (old-fluid cells, untouched by M1).
- `G = f_eq(rho_bar, u_w(x)) + G_neq(x_d)` where `rho_bar` = mean density of - `G = f_eq(rho_bar, u_w(x)) + G_neq(x_d)` where `rho_bar` = mean density of
valid neighbours and `x_d` = the valid neighbour best aligned with the outward valid neighbours and `x_d` = the valid neighbour best aligned with the outward
normal `(x - c^n)/|x - c^n|`; `G_neq(x_d) = G(x_d) - f_eq(rho(x_d), u(x_d))`. normal `(x - c^n)/|x - c^n|`; `G_neq(x_d) = G(x_d) - f_eq(rho(x_d), u(x_d))`.
@@ -146,6 +157,12 @@ switch cancels with the switching momentum. Whether `sum u_w dm` approximates
impulse, per crossing cycle). Momentum conservation is also distinct from impulse, per crossing cycle). Momentum conservation is also distinct from
Galilean invariance, which G4 tests. Galilean invariance, which G4 tests.
External reference note: waLBerla's covered/refill momentum switches
(`conserveMomentumWhenMapping`, `conserveMomentumWhenRestoring`) default to
false (Astra), so their existence does not establish which combination its
validation cases use. A bookkeeping identity alone does not select the
physical force either.
Accumulators (separate, per body, per step window; all reported raw): Accumulators (separate, per body, per step window; all reported raw):
`link_cme`, `link_wen_correction` (= `sum u_w dm`), `node_cover`, `link_cme`, `link_wen_correction` (= `sum u_w dm`), `node_cover`,
`node_uncover`, plus counters of crossings and refill fallbacks, so force `node_uncover`, plus counters of crossings and refill fallbacks, so force
@@ -182,8 +199,11 @@ mass), `zeta = c/c_crit = 0.01`, `U* = U/(f_N D)` with `f_N` the natural
frequency in fluid assuming an inviscid added-mass term; the paper also frequency in fluid assuming an inviscid added-mass term; the paper also
reports frequencies normalised by the in-vacuo value. Our runner derives `k` reports frequencies normalised by the in-vacuo value. Our runner derives `k`
from that in-fluid `f_N` (added-mass coefficient as stated in the paper) and from that in-fluid `f_N` (added-mass coefficient as stated in the paper) and
never from the vacuum formula; `c_crit` definition to be confirmed (OPEN). Stability/convergence is gated by a halved-time-step run, not never from the vacuum formula; `c_crit` convention and the original
assumed from the mass ratio. comparison data are still OPEN. Stability/convergence is gated by fluid
time/space refinement of the coupled run, not assumed from the mass ratio;
structural sub-stepping does not substitute for fluid-coupling time
refinement.
## 9. Gates (map; tolerances OPEN, declared before runs) ## 9. Gates (map; tolerances OPEN, declared before runs)
@@ -196,7 +216,32 @@ KC 5 in-line (needs 2-component offset) · G6 Leontini free transverse VIV
(m* = 10, ζ = 0.01, Re = 200, definitions pending) · G7 time-level contract (m* = 10, ζ = 0.01, Re = 200, definitions pending) · G7 time-level contract
frozen before the oscillator. frozen before the oscillator.
## 10. Remaining decisions Candidate pre-run engineering tolerances (Astra; for discussion, not
literature limits or measured outcomes; norms, averaging window, convergence
protocol and physical reference uncertainty must be fixed before adoption, and
none may be weakened after seeing runs):
normalised momentum-ledger residual FP32 ≤ 5e-6 (FP64 oracle ≤ 2e-13);
10-cycle relative mass drift ≤ 1e-4; prescribed-motion grid study D = 40/80/160
with final-step amplitude change ≤ 2 % and phase ≤ 2°; enlarged domain
amplitude change ≤ 1 %; matched-frame force RMS ≤ 2 % and improving with
refinement; VIV refinement amplitude ≤ 2 %, frequency ≤ 1 %, five consecutive
cycle amplitudes within 1 %.
## 10. Proposed minimal S1 scope (host only; held until cross-review)
- `add_body` moving-circle declaration: base centre, declared offset box
(x/y), speed bound; swept-band computation and band-placement validation.
- `set_body(offset=..., velocity=..., omega=...)` validation before mutation
(section 7) and the fail-closed commit of section 4.
- Motion-record host layout and upload path; exclusion of moving bodies from
the packed `CurvedBoundaryKernel` links (stationary packing unchanged).
- Explicit rejections for unsupported modes.
- Host tests (Astra runs them): rejection-before-mutation, band geometry,
derived centres, fail-closed behaviour under an injected upload/sync
failure, stationary packing byte-identical. No kernels, no GPU runs, no
y-only VIV oscillator (S4), no force RHS.
## 11. Remaining decisions
Structural RHS (section 6); motion-record layout; refill details; coupling Structural RHS (section 6); motion-record layout; refill details; coupling
scheme; benchmark definitions and digitized reference data; tolerances; scheme; benchmark definitions and digitized reference data; tolerances;