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