4.3 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 existing backflow clamp/blending. 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. 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>.