Files
CelerisLab/docs/steady_pinball_fiv.md
T

9.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.

Matched D40 resolution comparison (predeclared 2026-10-31)

The first finer case is M2, with exactly the same mass ratio2, reduced velocity5, zero structural damping, initial rest state and physical geometry as the retained D20 M2. Targeting a development response of0.5--1D does not imply this case will reach it. Do not change the structure within this comparison or discard a smaller response. D60 is a supported scaling choice, not an automatically scheduled run.

For s=D/20 use dx'=dx/s, dt'=dt/s^2, U'=.01/s, nu'=.004, rho'=1, fn'=fn/s^2, M'=s^2 M and K'=K/s^2. The same physical force per unit span has F'_lat=F_lat/s. For D40 this gives U=.005, fn=.000025, M=7539.82237, K=.000186037660, Re_D=50, and Tn=40000 steps. The y walls are at .5 and ny-1.5, while x inlet/outlet source nodes are at0 and nx-1. Therefore map x'=sx and y'=.5+s(y-.5), with nx'=s*(1280-1)+1, ny'=s*(512-2)+2. D40 uses2559x1022 and centres (1200,510.5),(1252,540.5),(1252,480.5); every radius, probe and envelope scales with D. The parabolic profile retains the same normalized wall coordinate. This preserves the existing ghost-source boundary convention, without asserting that it is an exact continuum open-boundary location.

Warmup=2048000 and response=2400000 native steps at D40: the SAME256 and300 D/U durations as D20, including60 natural periods after release. Compare the six50-D/U blocks and the common final100-D/U window. Report max absolute y/D, half-range, RMS, frequency and drift; peak-to-peak is not amplitude. No settling claim follows from completion. Keep raw individual CME/Wen/node terms and all crossing/fallback counters. Normalize net force by .5rhoU^2D in each case. Report native crossing/non-crossing force increments separately, plus D40 four-step block means aligned with D20 intervals (diagnostic only, never replace the raw spikes). Report final-window high-frequency variance above fD/U=1, using demeaned FFT Parseval weights, with the same physical cutoff for both cases. Different motion histories confound spike-size comparisons; this is simultaneous space/time/Mach refinement, not proof of a unique coarse-grid cause.

Only one full D40 M2 is initially scheduled, after CPU checks and a32+32-step smoke. Stop on the unchanged geometry/speed/nonfinite/no_donor checks or a7200s whole-case wall cap; save completed rows and status. The velocity cap scales to .025 so its physical bound is unchanged. No force filtering, trajectory clipping, automatic parameter search or extension. Scalar history is288MB; no full fields or DDF snapshots are written. Two FP32 population buffers require about188MiB, before flags, moving tables and context overhead; measure actual peak usage in the smoke and full run. Keep all D20 outcomes. No production source changes.

Commands (one GPU and serial compilation, existing environment): python research/steady_pinball/run.py --case M2 --D 40 --smoke --out <new-smoke-dir> then python research/steady_pinball/run.py --case M2 --D 40 --wall-seconds 7200 --out <new-full-dir>.