CelerisLab/tests/specs/Kan99b_validation.md

248 lines
6.9 KiB
Markdown

# 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.