# Rotating cylinder validation against [Kan99b]

## Goal

This validation should stay small, direct, and defensible.

The main design rules are:

- use the paper's direct numeric anchor at `Re = 100, alpha = 1.0` as the main hard benchmark
- use a low-rotation case to test the lift trend
- use suppression cases to test flow classification, not exact threshold fitting
- do not treat values read from figures near `alpha_L` as tight amplitude targets

This keeps the matrix representative without overfitting to sensitive threshold points.

## Strong numeric anchors from [Kan99b]

The strongest exact benchmark in the paper is the convergence case at `Re = 100, alpha = 1.0`.

| Quantity | Reference value |
|---|---:|
| `St` | 0.1655 |
| `mean C_L` | -2.4881 |
| `mean C_D` | 1.1040 |
| `C'_L` | 0.3631 |
| `C'_D` | 0.0993 |

For low rotation at `Re = 100`, the paper also gives the mean lift trend

\[
\overline{C_L} \approx -2.48\alpha
\]

which is a good secondary benchmark for small `alpha`.

The suppression thresholds are given as trends:

| Reynolds number | Expected `alpha_L` |
|---|---:|
| 60 | about 1.4 |
| 100 | about 1.8 |
| 160 | about 1.9 |

These threshold values should be used as regime guides, not as tight one-point numeric targets. In the suppression curve from [Kan99b] shown above, the boundary is exactly the kind of place where a small solver difference can change the observed state.

## Fixed solver setup

| Item | Setting |
|---|---|
| Dimension | 2D |
| Lattice | D2Q9 |
| Streaming | double buffer |
| Curved boundary | current Bouzidi moving wall implementation |
| Inlet profile | uniform |
| Top and bottom boundaries | free slip |
| Outlet | neq extrapolation |
| LES | off |
| Precision | FP32 |
| Cylinder diameter | `D = 30` lattice units |
| Cylinder radius | `R = 15` lattice units |
| Rotation input | update body omega only |

The baseline domain remains the current medium far field unless a later boundary sensitivity check shows otherwise.

## Inlet recommendation by collision model

Kan99b is an open-flow validation, not a confined-channel benchmark.

| Collision | Recommended inlet | Secondary choice | Avoid as primary |
|---|---|---|---|
| SRT | `equilibrium` | `regularized` | `zou_he_local` |
| TRT | `regularized` | `equilibrium` | `zou_he_local` until the anchor is stable |
| MRT | `regularized` or `zou_he_local` | `equilibrium` | `channel_stabilized` |

Keep one inlet family per collision model across the primary matrix.

## Lattice-unit mapping

Use

\[
U_\infty = 0.03
\]

With `D = 30`,

\[
\nu = \frac{U_\infty D}{Re} = \frac{0.9}{Re}
\]

| `Re` | `nu` | SRT equivalent `omega` |
|---|---:|---:|
| 60 | 0.015000 | 1.83486 |
| 100 | 0.009000 | 1.89753 |
| 160 | 0.005625 | 1.93470 |

The body rotation rate is

\[
\omega_{body} = \frac{2 \alpha U_\infty}{D} = 0.002\alpha
\]

| `alpha` | body omega |
|---|---:|
| 0.5 | 0.0010 |
| 1.0 | 0.0020 |
| 1.6 | 0.0032 |
| 2.0 | 0.0040 |

## Primary matrix

This is the recommended main validation set.

| Case | `Re` | `alpha` | Role |
|---|---:|---:|---|
| K1 | 100 | 0.5 | low-rotation lift trend check |
| K2 | 100 | 1.0 | strongest hard anchor |
| K3 | 60 | 1.6 | low-Re suppression classification |
| K4 | 100 | 2.0 | mid-Re suppression classification |
| K5 | 160 | 2.0 | high-Re suppression classification |

Optional baseline if needed for debugging or plots:

| Case | `Re` | `alpha` | Status |
|---|---:|---:|---|
| K0 | 100 | 0.0 | optional |

This matrix covers:

- one periodic low-rotation trend point
- one exact hard anchor with full force data
- suppression behavior at low, medium, and high Reynolds number

## How to judge each case

### K1

Use K1 to check the low-rotation lift law.

Target:

\[
\overline{C_L} \approx -2.48 \times 0.5 \approx -1.24
\]

This is a trend check, not a strict fluctuation-amplitude benchmark.

### K2

Use K2 as the hard benchmark case.

Preferred agreement band:

| Quantity | Preferred band |
|---|---:|
| `St` | within 3 percent |
| `mean C_L` | within 4 percent |
| `mean C_D` | within 5 percent |
| `C'_L` | within 8 percent |
| `C'_D` | within 10 percent |

### K3 to K5

Use K3 to K5 as suppression classification cases.

Primary success signature:

- `C'_L` collapses toward zero in the final window
- no sustained alternating wake remains
- flow classification agrees with the expected suppressed regime

These are not exact threshold-fitting cases. Do not over-interpret a small residual fluctuation if the wake is otherwise clearly in the suppressed class.

## Optional threshold bracket check

If later you want a more explicit threshold study, use pairs around `alpha_L` rather than a single point on the boundary.

Recommended pairs:

| `Re` | Lower point | Upper point |
|---|---:|---:|
| 60 | 1.3 | 1.5 |
| 100 | 1.7 | 1.9 |
| 160 | 1.8 | 2.0 |

These should still be treated as regime-location checks, not hard force targets.

## Run policy

| Case type | Total steps | Warmup | Statistics |
|---|---:|---:|---:|
| K1 and K2 | 180000 to 220000 | first 40 percent | last 60 percent |
| K3 to K5 | 220000 to 280000 | first 50 percent | last 50 percent |

The final statistics window should contain at least 20 shedding periods whenever the case remains periodic.

## TRT re-entry rule

Bring TRT back in this order:

1. K2 only
2. if K2 is stable and credible, run K1
3. only then run K3 to K5

This prevents TRT from expanding the matrix before the hard anchor is trustworthy.

## Deliverables

For each collision model, deliver:

- one table of run settings including collision, inlet scheme, wall type, `Re`, `alpha`, `nu`, and body omega
- one CSV per run with force history
- selected field images for wake classification
- one summary table with `mean C_D`, `mean C_L`, `C'_D`, `C'_L`, and `St`
- one short note stating whether suppression behavior matches [Kan99b]

## Recommended primary settings summary

| Collision | Wall | Inlet | Status |
|---|---|---|---|
| SRT | free slip | `equilibrium` | primary |
| TRT | free slip | `regularized` | primary if K2 is stable |
| MRT | free slip | `regularized` or `zou_he_local` | primary |

## MRT-only runner mapping

The current executable entrypoint is `tests/run_kan99b_rotating_cylinder.py`, and this round uses MRT-only scheduling:

- primary matrix is `K1-K5` with `MRT + regularized` inlet
- one extra control run is added at K2 with `MRT + zou_he_local`
- all runs keep `uniform` inlet profile, `free_slip` y-wall, `neq_extrap` outlet
- output rows include `case_id`, `variant`, `collision`, `inlet_scheme`, `grid`, `steps`, `burn_in`, `St`, `St_error_pct` (for K2), and force metrics
- K2 gate uses this document's per-metric tolerances for `St`, `mean C_L`, `mean C_D`, `C'_L`, `C'_D`

Example commands:

```bash
conda run -n pycuda_3_10 python tests/run_kan99b_rotating_cylinder.py \
  --json-out tests/output/kan99b_validation/summary_runs.json

conda run -n pycuda_3_10 python tests/run_kan99b_rotating_cylinder.py \
  --case K2 --save-vorticity
```

## Reference

[Kan99b] S. Kang, H. Choi, and S. Lee, “Laminar flow past a rotating circular cylinder,” 1999.
