121 lines
6.8 KiB
Markdown
121 lines
6.8 KiB
Markdown
# Re_D = 50 Kármán inflow: paired pinball VIV / frozen PPO demo
|
||
|
||
Development experiment, frozen before results, 2026-10-31. No new production
|
||
method, structural damping, force filter, policy training, or main merge.
|
||
[Force-spike research index](research/moving_boundary_force_spikes.md).
|
||
|
||
## Plant and structure
|
||
|
||
Base `e9213dd2cc9cfed0e8487a3cf4ebdd94d23dc64d`; fixed-policy contract from
|
||
`580397eaf83c85b233495791ecc51662a374a247`. Reuse `steady_pinball` config,
|
||
coordinate map and exact held-force oscillator. D40, U=.005, nu=.004, MRT,
|
||
2559 x 1022, FP32 unshifted double buffers. Regularized parabolic inlet,
|
||
NEQ extrapolation outlet, bounce-back y walls (.5,1020.5); no BC changes.
|
||
D20 coordinates map x'=2x, y'=.5+2(y-.5).
|
||
Upstream cylinder (400,510.5), radius40, is static. Pinballs radius20 at
|
||
(1200,510.5), (1252,540.5), (1252,480.5) share only transverse translation.
|
||
Lab probes radius10 at (1600,590.5), (1600,510.5), (1600,430.5) stay fixed.
|
||
|
||
One shared `Translation`, travel ±D, max wall speed .025, existing clearance
|
||
and per-step move guards unchanged. M2: m*=2 based on all three disks,
|
||
M=7539.8223686, fn=.000025, K=.000186037660, C=zeta=0; release y=v=0.
|
||
Each native step uses previous-step sum(CME_y+Wen_y), then exact oscillator
|
||
update with held force. Wall speed is interval displacement y[n+1]-y[n].
|
||
Cover/uncover impulses are logged, never added to the selected RHS. This
|
||
estimator remains provisional; existing spike/convergence limitations remain.
|
||
|
||
## Same release state, two clocks
|
||
|
||
A static precursor retains the accepted Kármán sequence: upstream+probes,
|
||
2,048,000-step warmup, 150 x 3,200-step no-pinball target samples, add static
|
||
pinballs/sync, second 2,048,000-step warmup. Save both DDF buffers, flags,
|
||
clock and last instantaneous force. Construct each moving arm fresh at the
|
||
same zero-offset geometry, check flags, copy both buffers and clock, verify
|
||
exact copy hashes. This one-time research initialization is not a moving
|
||
checkpoint or FSI rollback. Initial policy observation and spin are zero.
|
||
|
||
Frozen model SHA256 `148240c1dcb8b11d8e5a0a9e991f6874c4e799c9744707bf0fb32a8efeb0468d`;
|
||
normalizer `534fda818c030a56960e95d0f3ac1e350d887d03db7f80f1d6453195a502b7f0`.
|
||
Only these explicit supplied assets are accepted. Policy is CPU deterministic.
|
||
Native policy signals: packed CME (same `read_force` path), lab area-mean
|
||
velocity, each averaged over SI3200. Convert to original D20 training units:
|
||
forces x2, area-mean velocity x2 x78, then frozen force-first normalization
|
||
and clipping. Fine-grid probe pixel footprint is not exactly identical;
|
||
using the original78 cells avoids a hidden area-count normalization change.
|
||
The moving plant, motion-induced force, lab-frame wake displacement and D40
|
||
resolution remain out of training distribution. No transfer guarantee.
|
||
|
||
A=(8a+(0,-4,4))*.005; EMA alpha=.9^(1/4), reset0 each SI; omega=+A_eff/20.
|
||
This preserves historical physical actuator timescale under dt/4.
|
||
The zero arm substitutes a=(0,.5,-.5), so all spins are identically zero.
|
||
Policy interval averaging does **not** average the native structural RHS.
|
||
|
||
## Bound, output, and interpretation
|
||
|
||
One serial pair, zero then controlled: 400SI=1,280,000 native steps=160D/U
|
||
=32Tn per arm. No retuning/automatic extension. Stop on nonfinite state,
|
||
no_donor, travel/speed/move rejection, or four-hour whole-pair wall cap.
|
||
A failure stops the remaining run; retain valid rows and completed intervals.
|
||
NaN trailing rows are unexecuted, not zero-valued observations.
|
||
|
||
Report first/last80D/U windows, mean offset separately from centered RMS,
|
||
half-range, peak, frequency and drift; native versus SI-averaged force,
|
||
CME/Wen/node/crossing terms and action/observation clipping. Last80D/U is
|
||
the principal descriptive window, not an asserted settled window. If zero
|
||
arm half-range <.1D there, classify weak response and do not claim vibration
|
||
suppression. Report continuous ratios regardless. Cloaking uses retained
|
||
canonical last30 lagged sensor DTW against this precursor's no-pinball target,
|
||
with fixed-body D20 results contextual only. These are development criteria,
|
||
not paper uncertainty, grid convergence, or proof of validated FSI.
|
||
|
||
Save native18-column rows (~184MB/arm), small SI signals, target, config,
|
||
release two buffers (~188MiB), hashes and terminal reports outside checkout.
|
||
No per-step field output. Expected new data <650MB, check actual resources.
|
||
|
||
```
|
||
CUDA_VISIBLE_DEVICES=0 PYTHONPATH=src python research/karman_viv/run.py \
|
||
--model /tmp/celeris-karman-viv-assets/model.zip \
|
||
--norm /tmp/celeris-karman-viv-assets/norm.json --out /tmp/NEW_OUTPUT
|
||
```
|
||
|
||
First `--smoke`: same D40 geometry, warmup32/target2x8/warmup32,
|
||
4x8 response steps each arm; strictly plumbing only. CPU source checks and
|
||
independent exact-tip review precede GPU. Preserve original DynamisLab files.
|
||
|
||
## One predeclared m*=4 exploration (2026-10-31)
|
||
|
||
The m*=2 attempt at `516975ef6482f983ace347cb10de7450d2fbd680` stopped
|
||
at the declared travel guard in both arms: zero 10.469375 D/U, PPO 27.5525 D/U.
|
||
Its principal 80–160 D/U paired window is unavailable. Early attenuation is
|
||
not sustained suppression; control-only DTW is not a paired cloaking result.
|
||
Those results remain unchanged and retained.
|
||
|
||
The sole next candidate doubles M and K together: m*=4, M=15079.644737231,
|
||
K=0.000372075320164, fn=0.000025, C=zeta=0. This increases inertia and stiffness,
|
||
not damping. Half response under an identical prescribed external force is
|
||
the selection rationale only; coupled flow feedback can invalidate it. This
|
||
is an exploratory development case, not independent validation or a sweep.
|
||
|
||
Reuse the exact saved static release, config, target, model and normalizer.
|
||
`--release-dir` checks precursor metadata, config equality, both DDF/flags
|
||
hashes and clock against the original transfer receipt. Each fresh arm still
|
||
checks its upload against that seed. No warmup, moving restart or new release
|
||
file is generated. All fluid/geometry/EMA/SI/RHS settings, 400SI per arm,
|
||
zero damping, ±D guard and other stop conditions above remain unchanged.
|
||
The original failure stops the remaining run rule also remains unchanged.
|
||
|
||
```
|
||
CUDA_VISIBLE_DEVICES=0 PYTHONPATH=src python research/karman_viv/run.py \
|
||
--model /tmp/celeris-karman-viv-assets/model.zip \
|
||
--norm /tmp/celeris-karman-viv-assets/norm.json --out /tmp/NEW_M4_OUTPUT \
|
||
--mass-ratio 4 --release-dir /tmp/celeris-results-karman-viv-516975e/pair
|
||
```
|
||
|
||
Report matched valid windows only, separately retaining mean offset,
|
||
centered RMS, half-range, interval/native forces, crossing/diagnostic counts
|
||
and paired DTW only where both arms have sufficient data. The larger
|
||
controlled force excursions remain unresolved: retained m*=2 data strongly
|
||
associate them with the post-action-reset ramp, not exclusively current-step
|
||
node switching. No force smoothing, action-contract change, enlarged travel
|
||
band or further parameter adjustment follows an unsuccessful outcome.
|