6.4 KiB
Uncontrolled steady pinball: development protocol
Frozen before results: 1280 x 512 D2Q9/FP32/MRT, unshifted double buffer; rho=1, mean U=.01, nu=.004, D=20, Re_D=50. Centres are (600,255.5), (626,270.5), (626,240.5), radius10. No upstream cylinder. Passive probes stay at (800,295.5), (800,255.5), (800,215.5), radius5. Every omega is zero. Parabolic inlet, regularized NEQ damping1; y bounce-back planes .5/510.5; NEQ-extrapolated outlet with backflow clamp (the configured blend is inactive in this MRT route). Initial fluid is parabolic equilibrium. Fixed warmup is 4 NX/U=512000 steps.
Geometry and fluid parameters follow DynamisLab 609116ec26f19766f5e9ce2b0df427d4e24faae8,
legacy_test/core/legacy_env_builder.py:build_steady_cloak and the retained
config_lbm_pinball_legacy_re50d_u001.json. This is a modern Celeris reconstruction,
not a bitwise Legacy reproduction: Legacy uses shifted incompressible MRT, a
different curved interpolation and prescribed parabolic outlet velocity. Current
Celeris uses standard MRT, two-branch BFL and extrapolated outlet velocity.
The fixed-hold control uses the SAME modern settings as the free case.
Shared translation and ownership
Translation(..., shared=True) is explicitly transverse only. Reusing one
envelope INSTANCE declares common motion; equal but separate envelopes are not
linked. Before initialization and every positive Simulation.run, group members
must have identical applied offsets, effective target offsets and interval wall
velocities. Stage each member with set_body, then call run(1) once. An incomplete
or inconsistent target group is rejected before device uploads and can be fixed.
Existing pending-target direct-stepper restrictions remain.
Only members of that group may have overlapping whole swept bands. Their fixed surface clearance must exceed4 lattice cells. This conservative bound exceeds 2 sqrt(2)+MAX_STEP = 3.329: M1 changed cells lie in old/new disks and read one-link neighbors; M2 reads at most two links outside its new disk. Old/new relative displacement is at most .5. Thus reads cannot reach another member's old/new solid or M1 write region. M1 writes are disjoint. M2 writes opposite population slots inside its own new disk, also disjoint. Separate first_slot ranges still allocate each body's logical band/debug storage. Shared band cells alone do not write anything: M1 returns unless membership changes; M2 returns unless a cut link exists. Unrelated moving/static body and probe overlaps still reject.
This is a sufficient restricted-group condition, not support for near-contact or independent motion. The r4, distance8.3, dy=.5 counterexample remains rejected. CPU tests enumerate candidate donors/write footprints over subcell phases; GPU tests compare fixed vs hold and member-order permutations through crossings at wall speed .01 over the full +/-D envelope (8000 steps). The initial .5-speed fixture failed with NaNs; a single-circle control also failed at step69. That Mach~.866 fixture was unsuitable as a low-Mach numerical gate. Its failure is retained; the geometric MAX_STEP proof is unchanged, not a stability guarantee. CUDA kernels and arithmetic are unchanged.
New structural parameters (not inherited from the paper)
One transverse state y,v; total assembly M=10 rho (3 pi D^2/4)=9424.77796, fn=U/(5D)=.0001, Tn=10000, zeta=.01, K=M(2 pi fn)^2, C=2 zeta M(2 pi fn). Initial y=v=0, no seed or later kick. Force is the sum of the three instantaneous CME_y+Wen_y values from the previous fluid step; node impulses are logged separately and never added. The damped oscillator is integrated exactly for that piecewise-constant force over dt=1. Wall velocity is y[n+1]-y[n], not the endpoint oscillator velocity. No filtering or retuning.
Observe600000 steps=60Tn=300 D/U after warmup, in each of free and fixed-hold cases. Final20Tn is a descriptive comparison window; ten-Tn blocks expose drift. No settled/periodic claim follows merely from reaching the cap. Stop on |y|>D, nonfinite values, no_donor, rejected displacement or speed>.05. Report any quiet response honestly. No automatic extension. --smoke uses32 warmup+32 steps only.
Native-step rows retain y,v, each body's CME/Wen/node terms and refill counters; each600000x15 FP64 file is72MB. No full-field output or policy training. Compile and run on one device serially, keep original outputs and dirty trees untouched. This stage makes no claim of physical grid convergence or vibration suppression.
Run from checkout with PYTHONPATH=src and the existing Python environment:
python research/steady_pinball/run.py --smoke --out <new-external-directory>
then separately --out <new-free-directory> and --fixed --out <new-fixed-directory>.
Zero-damping development follow-up (predeclared 2026-10-31)
The original d0bcefa run and its zeta=.01 results remain historical evidence.
The current runner exposes three fixed --case choices, all with C=0 as requested:
| Case | M / (rho 3 pi D^2/4) | fn | M | K | Purpose |
|---|---|---|---|---|---|
| Z0 | 10 | .0001 | 9424.77796 | .00372075320 | Remove damping only |
| M2 | 2 | .0001 | 1884.95559 | .000744150640 | Reduce mass and stiffness together at fixed fn |
| R2 | 2 | .00006 | 1884.95559 | .000267894231 | Change stiffness only relative to M2 |
R2 deliberately places fn at the retained fixed-body lift peak, f=.00006 (St=.12 on mean U). This is an informed development choice, not independent physical validation or a promise of lock-in. All geometries, fluid settings, 512000-step fixed warmup, y0=v0=0, force time level and unfiltered RHS are unchanged. No run result may select a replacement parameter or an automatic extension.
Each case has a 600000-step cap, the same 300 D/U physical duration. This equals 60 natural periods for Z0/M2 and 36 for R2. Compare the common final200000 native steps, and six100000-step blocks, retaining actual natural/response frequencies and ongoing drift. Do not call those blocks ten R2 periods. No settled-VIV claim follows from a larger displacement. Report all three outcomes, including quiet responses or stopped cases, alongside the existing fixed and damped-free records.
Unchanged stops: |y|>D, invalid move/speed, nonfinite values or no_donor. A 1800s per-case wall cap and GPU headroom check bound resource use. Preserve partial rows; do not add damping, clip trajectories, filter forces, or relax any stop. Each case adds72MB of scalar history, no full fields. The separate Legacy/modern baseline diagnosis does not change this FSI protocol.