# Sah04 confined-cylinder validation against [Sah04]

## Goal

This validation should use a small set of direct periodic anchors from [Sah04], plus a small secondary block for near-onset flow-state checks.

The main design rules are:

- do not use interpolated values from figures as hard targets
- do not use points on or extremely near critical curves as primary pass fail anchors
- report realized blockage and realized Reynolds number, not just nominal inputs
- use finer grids for high blockage so the narrow wall gaps are not under-resolved

This keeps the primary matrix small but still representative across moderate and high confinement.

## What counts as a hard benchmark from [Sah04]

The strongest periodic-flow anchors are the direct DNS values stated in the paper for developed unsteady states.

| Case | Blockage `beta` | Reynolds number | `St` target | Why it is a hard anchor |
|---|---:|---:|---:|---|
| S1 | 0.3 | 100 | 0.2115 | direct periodic DNS value |
| S2 | 0.5 | 200 | 0.3513 | direct periodic DNS value |
| S3 | 0.8 | 160 | `T ≈ 1.806`, so `St ≈ 0.5537` | direct case given in the paper |
| S4 | 0.9 | 200 | 0.5314 | direct periodic DNS value |

These should be the primary Sah04 validation anchors.

## What should not be a hard target

The following are useful for qualitative or secondary checks, but not for the main validation gate:

- critical onset values from Table IV
- any `St` or force value obtained by reading or interpolating a plot
- cases chosen only to complete a rectangular parameter grid
- points too close to the codimension two region or nearby neutral stability boundaries

This matters because the paper's stability map has several sensitive regions, especially at high blockage and near symmetry breaking. In the stability figure from [Sah04] shown above, those boundaries are exactly where a small setup difference can change the observed state.

## Geometry and blockage mapping

Keep the confined-channel layout and no-slip walls.

The validation table must always report both nominal and realized blockage.

With `D = 30` lattice units, the recommended realizations are:

| Case | `beta_nominal` | Suggested `H` | `beta_real` | Notes |
|---|---:|---:|---:|---|
| S1 | 0.3 | 100 | 0.3000 | exact |
| S2 | 0.5 | 60 | 0.5000 | exact |
| S3 | 0.8 | 38 or 37 | 0.7895 or 0.8108 | pick one and report it explicitly |
| S4 | 0.9 | 33 | 0.9091 | use this, not `H = 35` |

Do not silently rename `beta_real` as the paper blockage.

## Grid density policy

High blockage cases need more wall-normal resolution than the base grid.

Minimum rule:

- for `beta < 0.8`, the baseline grid with `D = 30` is acceptable for the first pass
- for `beta >= 0.8`, increase grid density by at least 2 times in each spatial direction before treating the result as validation quality

A practical way to do this is to keep geometry similarity while doubling the characteristic resolution:

- base cases: `D = 30`
- high blockage validation cases: at least `D = 60`

Recommended high blockage realizations on the refined grid:

| Case | `beta_nominal` | Suggested refined `D` | Suggested refined `H` | `beta_real` |
|---|---:|---:|---:|---:|
| S3 | 0.8 | 60 | 75 | 0.8000 |
| S4 | 0.9 | 60 | 67 | 0.8955 |

The point of this refinement is not only bulk accuracy. It is also to resolve the narrow cylinder wall gaps and reduce the risk that blockage effects are dominated by lattice geometry error.

## Primary matrix

This is the main Sah04 validation set.

| Case | `beta_nominal` | Primary target | Role |
|---|---:|---|---|
| S1 | 0.3 | `Re = 100`, `St = 0.2115` | moderate blockage periodic anchor |
| S2 | 0.5 | `Re = 200`, `St = 0.3513` | medium blockage periodic anchor |
| S3 | 0.8 | `Re = 160`, `St ≈ 0.5537` | high blockage periodic anchor |
| S4 | 0.9 | `Re = 200`, `St = 0.5314` | very high blockage periodic anchor |

This matrix is smaller than the older grid, but it covers:

- moderate confinement
- stronger confinement
- high blockage periodic shedding
- very high blockage periodic shedding

## Secondary onset block

These cases are recommended as flow-state checks, not hard `St` benchmarks.

| Case | `beta_nominal` | Suggested `Re` | Why it is useful | How to judge it |
|---|---:|---:|---|---|
| SO1 | 0.5 | about 130 | safely above first onset without sitting on the boundary | confirm sustained periodic state |
| SO2 | 0.7 | about 120 | tests near-onset behavior in a more sensitive blockage range | confirm sustained periodic state |

These points exist to answer a different question from the primary matrix:

- does the solver enter and maintain the right flow regime once slightly above onset

For SO1 and SO2, judge by:

- persistent nonzero `C'_L`
- a clean dominant spectral peak
- repeatable periodic wake structure

Do not fail these runs because the measured `St` differs slightly from a value read from a nearby figure.

## Inlet and wall policy

Sah04 is a confined-channel benchmark, so inlet consistency matters more than inlet variety.

| Collision | Wall | Inlet | Status |
|---|---|---|---|
| SRT | no slip | `channel_stabilized` | primary |
| TRT | no slip | `channel_stabilized` | primary |
| MRT | no slip | `channel_stabilized` | primary |

Keep the inlet family fixed across collision models in the primary matrix.

Secondary inlet comparison, only after the primary set is working:

| Collision | Optional inlet | Status |
|---|---|---|
| MRT | `regularized` or `zou_he_local` | exploratory |
| SRT or TRT | `equilibrium` or `regularized` | exploratory |

## Realized Reynolds number check

This is mandatory for Sah04.

For each run, record:

- nominal inlet definition
- developed downstream velocity profile
- measured `U_max,real`
- measured bulk velocity if available
- `beta_nominal`
- `beta_real`
- `Re_nominal`
- `Re_real`

Use the paper-consistent label

\[
Re_{real} = \frac{U_{max,real} D}{\nu}
\]

for the final comparison table.

If `Re_real` drifts materially from the intended target, treat that as a setup problem before treating it as a Strouhal miss.

## Run policy

| Case block | Total steps | Burn | Statistics |
|---|---:|---:|---:|
| S1 and S2 | 100000 to 160000 | first 35 to 40 percent | last 60 to 65 percent |
| S3 and S4 | 180000 to 260000 | first 45 percent | last 55 percent |
| SO1 and SO2 | 140000 to 220000 | first 45 percent | last 55 percent |

For high blockage refined runs, prefer the longer end of the window.

## Evaluation rule

Use a two-layer rule.

### Primary periodic anchors

| Case | Hard target use |
|---|---|
| S1 to S4 | hard periodic benchmark anchors |

Preferred agreement band:

- within 5 percent when `Re_real` is close to target and the spectrum is clean
- within 10 percent still acceptable if the run is clearly periodic and the residual mismatch is explainable by `Re_real` drift or geometry realization

### Secondary onset block

| Case | Hard target use |
|---|---|
| SO1 and SO2 | no hard `St` gate |

Success means:

- the flow is clearly unsteady and periodic
- the dominant frequency is stable over long windows
- the wake classification is consistent with being above onset

## Deliverables

For each run, deliver:

- one row with `beta_nominal`, `beta_real`, `Re_nominal`, `Re_real`, `nu`, collision, wall type, inlet scheme, and grid resolution
- one downstream velocity-profile plot
- one force-history CSV
- one `St` estimate with the exact analysis window stated
- selected wake images for flow classification

## Recommended minimum set

If compute budget is tight, run this order first:

| Priority | Runs |
|---|---|
| 1 | MRT on S1 to S4 |
| 2 | SRT on S2 and S4 |
| 3 | TRT on S2 and S4 |
| 4 | SO1 and SO2 only after the primary anchors are behaving |

## MRT-only runner mapping

The current executable entrypoint is `tests/run_sah04_st_matrix.py`, and it is now aligned to this document's primary S1-S4 matrix:

- collision is fixed to `MRT`
- inlet is fixed to `parabolic + channel_stabilized`
- case set is `S1-S4` only
- output rows include `case_id`, `collision`, `inlet_scheme`, `grid`, `steps`, `burn_in`, `St`, `St_error_pct`, `Re_real`, `beta_real`
- default hard gate is 5% (`--gate-pct` can relax it to 10%)

Example commands:

```bash
conda run -n pycuda_3_10 python tests/run_sah04_st_matrix.py \
  --json-out tests/output/sah04_mrt/summary.json

conda run -n pycuda_3_10 python tests/run_sah04_st_matrix.py \
  --case S3 --gate-pct 10 --final-vorticity-dir tests/output/sah04_mrt/vorticity
```

## Reference

[Sah04] M. Sahin and R. G. Owens, “A numerical investigation of wall effects up to high blockage ratios on two-dimensional flow past a confined circular cylinder,” 2004.
