From 0c9e041cd1c8846f4e29ca3a84335bace32192de Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 30 Oct 2026 15:09:14 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20VIV=20predeclare=20=E2=80=94=20crossing?= =?UTF-8?q?=20predicate,=20seed=20time=20level,=20block=20windows,=20count?= =?UTF-8?q?ing,=20stop=20and=20dual=20caps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/validation/leontini_viv_predeclare.md | 76 ++++++++++++---------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/docs/validation/leontini_viv_predeclare.md b/docs/validation/leontini_viv_predeclare.md index 57a69de..26ec7e3 100644 --- a/docs/validation/leontini_viv_predeclare.md +++ b/docs/validation/leontini_viv_predeclare.md @@ -43,7 +43,7 @@ this page is jointly agreed. zeta = 0. Equation of motion uses the structural mass only. - Per-step sequence (binding): known (y_n, v_n) and the last completed force F_last → candidate (y_{n+1}, v_{n+1}) by the update below → `set_body` with - offset y_{n+1} and wall velocity (y_{n+1} − y_n)/dt (interval average; a + offset y_{n+1} and wall velocity (y_{n+1} − y_n)/dt with lattice dt = 1 (interval average; a different quantity from the endpoint v_{n+1}) → `run(1)` → only on success: commit y_n ← y_{n+1}, v_n ← v_{n+1}, F_last ← force read for that step. Any failure leaves the Simulation failed (existing lifecycle). Whether the @@ -63,41 +63,51 @@ this page is jointly agreed. ## Window, failure semantics, acceptance (engineering, development stage) +Clocks: lattice dt = 1; T_n = 1/f_n = 5,000 steps. Response cycles are +counted from the measured signal; T_n is used only for the seed check. + - Start (source-faithful): fluid at rest except the uniform inlet, body at - rest at the declared centre, y(0) = v(0) = 0. -- Seed policy (conditional, declared): exact mirror symmetry can suppress - lift. If max |y| over the last 5 T_n before t = 40 T_n (200,000 steps) is - below .01 D, apply one labelled seed at that step as a structural velocity - increment v += 2 pi f_n (.01 D) (amplitude ≈ .01 D), so the geometry then - moves continuously through the update (never a jump); - `seed_applied=true`, its step and size logged; the run continues under the - same caps. Missing shedding is a diagnostic, never an - "A = 0 pass"; the seed is not changed or repeated after seeing results. -- Response cycles: delimited by consecutive upward crossings of y through the - mean of the previous completed cycle (0 for the first). Per cycle: positive - peak max(y), negative peak min(y), mean offset, amplitude (max − min)/2. - Window value = mean amplitude over 10 cycles; window change = - |W_k − W_{k−1}| / W_{k−1}. -- Settled when the per-cycle peak changes ≤ 2 % between consecutive 10-cycle - windows and the last 5 cycle peaks agree within 1 %. Budget: 150 response - cycles from the start of motion, including the 20 scoring cycles, so - settling must complete by response cycle 130; the score uses the first 20 - cycles after settling. Hard native cap 1,000,000 steps (= 200 T_n) in case - response cycles cannot be detected. Either cap missed → FAIL-CLOSED - (timeout). -- Durations reported: total steps, t U/D, N_resp, measured T_resp (mean - upward-crossing interval); N_resp / f_n only as a labelled secondary clock, - never as the settling unit. -- Growth is not a failure: initial VIV growth is physical. Checked every step - (FAIL-CLOSED): non-finite y, v or force; |y| > 1.0 D (about twice the - largest reference peak, .551 D) or the offset box reached; no_donor > 0; - a failed upload/step/sync. Timeout = a cap missed (above). + rest at the declared centre, y_0 = v_0 = 0, F_last = 0. +- Seed (conditional, one time, declared): at step n_seed = 200,000 + (t = 40 T_n), if max |y| over steps [175,000, 200,000) is below .01 D, then + in that step, after the check and before the candidate update, set + v_n += 2 pi f_n (.01 D) (F_last unchanged) and proceed normally; the + geometry moves continuously through the update. `seed_applied`, step and + size are logged; never repeated or changed. +- Cycle boundary (discrete): step n closes a cycle iff y[n−1] < m and + y[n] ≥ m, where m = time-mean of y over the previous completed cycle + (m = 0 before the first completed cycle); y_0 = 0 is not a crossing, and no + boundary is accepted fewer than 2 samples after the previous one. +- Per cycle: positive peak max(y), negative peak min(y), mean offset + (time-mean of y), amplitude a = (max − min)/2. +- Budget counting: a completed cycle counts toward the 150-cycle budget only + if a ≥ .01 D (pre-seed numerical chatter does not consume it). +- Windows: adjacent non-overlapping blocks of 10 counted cycles + (1–10, 11–20, ...); W_k = mean amplitude of block k. +- Settled at the end of block k (k ≥ 2) iff W_{k−1} ≥ 1e-6 D and + |W_k − W_{k−1}| / W_{k−1} ≤ .02, and the last 5 cycle amplitudes lie + within 1 % of their mean. Otherwise not yet settled (no NaN pass). +- Scoring: the 20 counted cycles after settling. They must remain settled: + each 10-cycle block of the 20 satisfies the same 2 % (against the previous + block) and 1 % rules, else FAIL-CLOSED. Success stop: after the 20th + scoring cycle; the run does not continue to 150. +- Caps (both always armed; the first hit wins and is reported): 150 counted + response cycles including the 20 scoring cycles (so settling must complete + by counted cycle 130) → `timeout_response_cycles`; 1,000,000 native steps + (200 T_n) → `timeout_native_steps`. +- Durations reported: total steps, t U/D, counted and uncounted cycles, + measured T_resp (mean boundary interval); N_resp / f_n only as a labelled + secondary clock. +- Growth is not a failure: initial VIV growth is physical. Checked every + step (FAIL-CLOSED): non-finite y, v or force; |y| > 1.0 D (the tighter + gate; about twice the largest reference peak, .551 D) or the ±1.5 D offset + box reached; no_donor > 0; a failed upload/step/sync. - All failures are reported as they are (no sub-iteration, no RHS or parameter retune, no automatic second case). -- Score over the 20 cycles after settling: target metric A_max/D = - max over those cycles of max(|positive peak|, |negative peak|) about y = 0 - (Qin reports "maximum amplitude"); also reported: mean amplitude, positive - and negative peaks, mean offset, f/f_n (no target). +- Target metric over the 20 scoring cycles: A_max/D = max over those cycles + of max(|positive peak|, |negative peak|) about y = 0 (Qin reports "maximum + amplitude"); also reported: mean amplitude, positive and negative peaks, + mean offset, f/f_n (no target). - Acceptance: |A_max − .520 D| ≤ .052 D (±10 %), stated together with the boundary mismatch and the absence of a quoted reference uncertainty. A pass is "reasonably close" for the stage: not grid convergence, not force-RHS