test: DFG Re20 steady rule per review (1 % band, range and slope, 0.5 s samples)

Samples every 0.5 s at synchronized root steps; trailing 5 s window (11
samples); range and |slope*window| each at most 1 % of the official band
width. States the fluid-on-cylinder force sign, reports cd_positive,
defaults to the refined case and uses the review's label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 71221837f9)
This commit is contained in:
Claude authored and Codex committed 2026-10-20 21:59:15 +08:00
1 parent 46dc6ba086
commit 6a03f463bc
3 files changed
+47 -28

No files matched your search

+10 -7
View File
@@ -6,7 +6,7 @@ inflow, initial state, layout and observation are those of the pinned Re100 runn
(`run_refined_dfg.py`, `re100_helpers.py`, both unchanged); only the lattice
viscosity is set for Re 20 (root tau 0.56, fine 0.62, uniform 0.62, lattice speed 0.01).
This is a comparison with the official intervals, not a full benchmark
Label: "compared against the official reference bands", not a full benchmark
certification: the outlet is pressure-NEQ (`neq_extrap`), not do-nothing, and the
inlet is local Zou-He.
@@ -22,10 +22,13 @@ inlet is local Zou-He.
## Bounds and steady rule (frozen before any run)
- End time t* = 60 (30 s physical): 240,000 refined root steps, 480,000 uniform steps.
- One sample every t* = 0.5; trailing window t* = 10 (5 s, 20 samples).
- Steady: in the window, max - min of each of Cd, Cl, p_diff is at most one tenth of
its official interval width (0.002, 0.00006, 0.00004). Absolute ranges, so the
small Cl is never used as a divisor.
- One sample every t* = 1 (0.5 s) at the end of a synchronized root step; trailing
window t* = 10 (last 5 s, 11 samples).
- Steady: in the window, both max - min and |least-squares slope x window| of each
of Cd, Cl, p_diff are at most 1 % of its official interval width (2e-4, 6e-6,
4e-6). Absolute limits, so the small Cl is never a divisor. Never relaxed after a run.
- Force sign: fluid on cylinder, x along the inflow, y up from the bottom wall; Cd > 0
and the official Cl > 0 (`cd_positive` is reported).
- Not steady at t* = 60: status `NOT_STEADY`, no interval verdict. Health limits
(Mach <= 0.2, rho in [0.5, 1.5]) stop the run with `UNHEALTHY`.
- Steady: `WITHIN_INTERVALS` or `OUTSIDE_INTERVALS`, with the per-quantity verdict.
@@ -34,10 +37,10 @@ inlet is local Zou-He.
```
python tests/validation/run_dfg_re20.py --output <new-dir> --plan
CUDA_VISIBLE_DEVICES=<n> python tests/validation/run_dfg_re20.py --case both \
CUDA_VISIBLE_DEVICES=<n> python tests/validation/run_dfg_re20.py --case refined \
--collision SRT --output <new-dir> --max-wall-seconds <cap>
```
`--plan` writes `plan.json` only. A GPU run writes `plan.json` and `result.json`
Run `--case uniform` only if the refined result is outside a band. `--plan` writes `plan.json` only. A GPU run writes `plan.json` and `result.json`
(per case: lattice parameters, every sample, window ranges, status, verdict).
Host contract tests: `tests/unit/test_dfg_re20.py`.