CelerisLab/tests/Sah04_St_validation_matrix.md

7.1 KiB
Raw Blame History

Sah04 St validation matrix

Undermind

Sah04 St validation matrix

A Strouhal based matrix should lean on cases where [Sah04] gives an explicit frequency target, or a target that can be derived directly from a stated shedding period. With cylinder diameter fixed at D = 30, that rules out a strict low to mid to high blockage Cartesian grid if every cell is meant to carry a hard 5 percent St gate. The paper simply does not publish a dense 3 by 3 table of supercritical confined flow frequencies. The most defensible 27 run plan is therefore a nine case matrix chosen to maximize paper anchored St targets, then run with SRT, TRT, and MRT on each case.

Fixed setup

  • Geometry follows [Sah04]
  • Upstream length is 40D
  • Downstream length is 40D
  • Total fluid length is 80D
  • With D = 30, use nx = 80D + 2 = 2402
  • Cylinder radius is 15
  • Cylinder x center is 40D + 0.5 = 1200.5
  • Inlet profile is parabolic
  • Reynolds number is defined with U_max and D
  • Strouhal number is defined as St = fD U_max^-1
  • For all cases, keep U_max fixed and set viscosity from Re = U_max D nu^-1

Blockage levels

The table below gives the three blockage levels to use with D fixed at 30.

Blockage tier Nominal beta H ny Realized beta Cylinder center
Low 0.5 60 62 0.5000 1200.5, 30.5
Mid 0.8 38 40 0.7895 1200.5, 19.5
High 0.9 33 35 0.9091 1200.5, 17.0

The low blockage tier is exact on the D = 30 grid. The two higher blockage tiers use the nearest integer channel heights. This keeps the matrix practical while staying close to the [Sah04] confined flow regime where supercritical St values are actually reported.

Nine Sah04 cases

Run every row below with SRT, TRT, and MRT. That gives 27 total runs.

Case Blockage tier Re Target St Target class
1 Low beta 0.5 124.09 0.3393 Direct from Table IV
2 Low beta 0.5 160 0.3450 Interpolated between Table IV and Re 200
3 Low beta 0.5 200 0.3513 Direct from Section IV.B
4 Mid beta 0.8 110.24 0.5363 Direct from Table IV
5 Mid beta 0.8 160 0.5537 Derived from stated period T ≈ 1.806
6 Mid beta 0.8 200 0.5510 Derived from stated period T ≈ 1.815
7 High beta 0.9 162.82 0.5202 Direct from Table IV
8 High beta 0.9 180 0.5254 Interpolated between Table IV and Re 200
9 High beta 0.9 200 0.5314 Direct from Section IV.B

How to use the targets

The nine cases are not equal in evidential weight.

  • Hard pass fail cases

    • Case 1
    • Case 3
    • Case 4
    • Case 5
    • Case 6
    • Case 7
    • Case 9

    These have targets stated directly in [Sah04], or obtained directly from a shedding period stated in the paper. A 5 percent St gate is reasonable here.

  • Soft trend cases

    • Case 2
    • Case 8

    These are useful to see whether each collision model follows the same St trend between two paper anchored points. They should not carry the same weight as the hard cases.

Use one sampling and averaging policy across the whole matrix so the comparisons stay clean.

  • D = 30 for all runs

  • record_every = 5

  • double buffer streaming

  • same inlet formulation and force extraction for all collisions

  • same FFT windowing and same St extraction routine for all runs

    The automated runner tests/run_sah04_st_matrix.py uses a band around the paper target shedding frequency f0 = St_target * U_max / D and reports two Strouhal numbers: raw (plain band-limited dominant peak) and guided (same band with a mild Gaussian weight toward f0 to reduce harmonic ambiguity in narrow channels). The 5% / 10% hard-case rules apply to guided St; raw is for diagnosing pick ambiguity (e.g. supercritical mid/high cases).

For the lower Re onset cases, the frequency estimate is more sensitive to burn in and window length. A conservative default is:

  • Cases 1, 4, 7

    • 80k total steps
    • 30k burn
  • Cases 2, 3, 5, 6, 8, 9

    • 60k total steps
    • 20k burn

If TRT is visibly noisier on the onset cases, extend TRT alone to the longer window rather than changing the matrix.

Runner (repo): tests/run_sah04_st_matrix.py

  • Full MRT sweep: conda run -n pycuda_3_10 python tests/run_sah04_st_matrix.py --collision MRT
  • All collisions (27 runs): ... --collision all
  • Quick wiring check: add --smoke (short steps; St only qualitative)
  • Single case: --case 4 ; JSON: --json-out path.json
  • Override length: --steps / --burn (ignored with --smoke)
  • Long archive: --dump-npz-dir DIR writes case{id}_{COLL}.npz (lift, drag samples, LBM step index per sample, post-burn freqs_hz / power, band mask, guided Gaussian weight) plus .meta.json

Long runs (cases 6 and 9)

For spectrum stability checks (not the 9-case matrix gate), a minimal set is six runs: MRT/TRT/SRT × case 6 and case 9. Suggested first budget: steps 200000, burn 80000, record_every=5 (same as matrix), with --dump-npz-dir so raw vs guided can be recomputed offline from power_post_burn and the saved band weights.

Evaluation rule

Judge each collision model on the hard cases first.

  • Primary rule

    • At least 5 of the 7 hard cases within 5 percent in St
    • No hard case worse than 10 percent
  • Secondary rule

    • Cases 2 and 8 should lie between their neighboring hard target values in the correct order
    • SRT, TRT, and MRT should preserve the same beta and Re trend even when their absolute errors differ slightly

Why this matrix and not a strict Cartesian 3 by 3

Sah04

Exact beta alternative

If exact blockage ratios on the D = 30 grid matter more than supercritical St anchor density, use beta = 0.1, 0.3, and 0.5 instead. That gives exact channel heights H = 300, 100, and 60. The tradeoff is that [Sah04] supplies far fewer direct supercritical St targets in that lower blockage band, so the resulting matrix is less suitable for a clean 5 percent St gate.


References

Sah04