# Rotating cylinder validation plan

##### [**Undermind**](https://undermind.ai)

---

## Rotating cylinder validation against \[Kan99b\]

This plan defines a practical validation campaign for 2D flow past a rotating circular cylinder using the current CelerisLab solver. The reference is the rotating cylinder study of Kang, Choi, and Lee \[Kan99b\]. The goal is not to reproduce their O type far field mesh exactly. The goal is to show that the present rectangular domain with uniform inflow, slip top and bottom boundaries, curved moving wall treatment, and open outlet can recover the same force, shedding, and suppression trends with controlled boundary sensitivity.

The validation focuses on three questions:

- whether the moving curved wall treatment gives the correct mean force trend under rotation
- whether the wake frequency and fluctuation amplitudes are credible before shedding is suppressed
- whether the predicted critical rotation rate for shedding suppression is close to the literature value

## Reference targets from \[Kan99b\]

The paper defines the Reynolds number and spin ratio as

``` math
Re = \frac{U_\infty D}{\nu}, \qquad \alpha = \frac{\omega_{body} D}{2 U_\infty}
```

and uses the standard force coefficients

``` math
C_D = \frac{2 F_x}{\rho U_\infty^2 D}, \qquad C_L = \frac{2 F_y}{\rho U_\infty^2 D}
```

The fluctuation amplitudes are half peak to peak values over one shedding period, not RMS values \[Kan99b\].

The most useful exact anchor point is the tabulated convergence case at $`Re=100`$ and $`\alpha=1.0`$ \[Kan99b\].

| Quantity           | Reference value |
|:-------------------|----------------:|
| $`St`$             |          0.1655 |
| $`\overline{C_L}`$ |         -2.4881 |
| $`\overline{C_D}`$ |          1.1040 |
| $`C'_L`$           |          0.3631 |
| $`C'_D`$           |          0.0993 |

The same work gives the most important trend targets for the broader campaign \[Kan99b\].

| Reynolds number | Expected trend | Practical target |
|:---|:---|---:|
| 60 | shedding suppressed near $`\alpha_L`$ | about 1.4 |
| 100 | shedding suppressed near $`\alpha_L`$ | about 1.8 |
| 160 | shedding suppressed near $`\alpha_L`$ | about 1.9 |
| 60 | low rotation mean lift slope | $`\overline{C_L} \approx -2.50\alpha`$ |
| 100 | low rotation mean lift slope | $`\overline{C_L} \approx -2.48\alpha`$ |
| 160 | low rotation mean lift slope | $`\overline{C_L} \approx -2.46\alpha`$ |

The paper also reports that its outer boundary sensitivity is already very small at far field radius $`R_D=50`$, and that increasing the radius to $`R_D=100`$ changes the main outputs by less than about half a percent for the anchor case \[Kan99b\]. That result motivates an explicit boundary independence check in the present rectangular setup.

## Solver setup for this campaign

The campaign assumes the present code path and keeps all nonessential choices fixed.

| 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 |
| Output cadence for force history | every 100 steps |
| Sensors | none |
| Flow diagnosis | saved flow fields and derived images |

This campaign evaluates SRT, TRT, and MRT separately. The same geometry, flow scales, and post processing rules should be used for all three collision models.

## Parameter mapping in lattice units

The recommended inflow speed is

``` math
U_\infty = 0.03
```

This keeps the Mach number low while leaving enough dynamic range for the force signals.

With $`D=30`$, the required viscosity for each Reynolds number is

``` math
\nu = \frac{U_\infty D}{Re} = \frac{0.9}{Re}
```

which gives the following values.

| $`Re`$ |  $`\nu`$ | SRT equivalent $`\omega = 1 \mathbin{/} (3\nu + 0.5)`$ |
|:-------|---------:|-------------------------------------------------------:|
| 60     | 0.015000 |                                                1.83486 |
| 100    | 0.009000 |                                                1.89753 |
| 160    | 0.005625 |                                                1.93470 |

The body rotation rate in lattice units is

``` math
\omega_{body} = \frac{2 \alpha U_\infty}{D} = 0.002\alpha
```

which gives the following direct conversion table.

| $`\alpha`$ | body omega |
|:-----------|-----------:|
| 0.0        |     0.0000 |
| 0.5        |     0.0010 |
| 1.0        |     0.0020 |
| 1.4        |     0.0028 |
| 1.8        |     0.0036 |
| 1.9        |     0.0038 |
| 2.0        |     0.0040 |

## Computational domain family

Because the current solver uses a rectangular box rather than the O type far field mesh of \[Kan99b\], boundary sensitivity must be checked explicitly. With free slip top and bottom boundaries, the lateral confinement error should be much weaker than with no slip walls, so a moderate family of domain sizes is sufficient for the first pass.

The recommended domain family is defined in cylinder diameters.

| Domain | Upstream distance | Downstream distance | Height | Integer grid for $`D=30`$ |
|:---|---:|---:|---:|---:|
| S | 12D | 24D | 16D | 1081 by 481 |
| M | 15D | 30D | 20D | 1351 by 601 |
| L | 20D | 40D | 24D | 1801 by 721 |

The corresponding cylinder centers are

| Domain | Cylinder center |
|:-------|:----------------|
| S      | 360, 240        |
| M      | 450, 300        |
| L      | 600, 360        |

These sizes are measured from the cylinder center to the inlet, outlet, and slip boundaries. The baseline domain should be M. Domain S and L are used only to establish boundary independence.

## Test phases

## Phase A

The first phase chooses a domain that is large enough for the rest of the campaign.

Run only the anchor case

``` math
Re = 100, \qquad \alpha = 1.0
```

with MRT on domains S, M, and L.

For each run, compute

- $`\overline{C_D}`$
- $`\overline{C_L}`$
- $`C'_D`$
- $`C'_L`$
- $`St`$

Pick the smallest domain for which the change from the next larger domain is small enough.

| Quantity           | Domain independence target |
|:-------------------|---------------------------:|
| $`St`$             |        less than 1 percent |
| $`\overline{C_L}`$ |        less than 2 percent |
| $`\overline{C_D}`$ |        less than 2 percent |
| $`C'_L`$           |        less than 3 percent |
| $`C'_D`$           |        less than 3 percent |

If M satisfies these limits against L, the rest of the campaign should use M. If not, use L.

## Phase B

Once the domain is fixed, run the same anchor case with all three collision models.

| Collision model | Required run           |
|:----------------|:-----------------------|
| SRT             | $`Re=100, \alpha=1.0`$ |
| TRT             | $`Re=100, \alpha=1.0`$ |
| MRT             | $`Re=100, \alpha=1.0`$ |

Compare each run to the exact anchor values from \[Kan99b\].

| Quantity           | Preferred agreement band |
|:-------------------|-------------------------:|
| $`St`$             |         within 3 percent |
| $`\overline{C_L}`$ |         within 4 percent |
| $`\overline{C_D}`$ |         within 5 percent |
| $`C'_L`$           |         within 8 percent |
| $`C'_D`$           |        within 10 percent |

This phase also checks collision model consistency. SRT, TRT, and MRT should not disagree strongly if the moving wall and force extraction are implemented correctly.

## Phase C

After the anchor case is established, run the main rotation scan at $`Re=100`$ for all three collision models.

| Case | $`\alpha`$ | body omega |
|:-----|-----------:|-----------:|
| A0   |        0.0 |     0.0000 |
| A1   |        0.5 |     0.0010 |
| A2   |        1.0 |     0.0020 |
| A3   |        1.5 |     0.0030 |
| A4   |        1.7 |     0.0034 |
| A5   |        1.8 |     0.0036 |
| A6   |        1.9 |     0.0038 |
| A7   |        2.0 |     0.0040 |

The expected signatures from the paper are \[Kan99b\]:

- mean lift becomes more negative roughly linearly at low $`\alpha`$
- mean drag decreases as $`\alpha`$ increases
- Strouhal number stays nearly constant while periodic shedding exists
- shedding disappears near $`\alpha \approx 1.8`$

The low rotation linear fit gives a strong consistency check.

``` math
\overline{C_L} \approx -2.48\alpha \qquad Re=100
```

## Phase D

The final phase checks whether the code recovers the Reynolds number dependence of the suppression threshold.

Run the following reduced sets for all three collision models.

| Reynolds number | $`\alpha`$ values                 |
|:----------------|:----------------------------------|
| 60              | 0.0, 0.5, 1.0, 1.2, 1.4, 1.6      |
| 160             | 0.0, 0.5, 1.0, 1.5, 1.8, 1.9, 2.0 |

The expected signatures are \[Kan99b\]:

- $`Re=60`$ should lose periodic shedding near $`\alpha \approx 1.4`$
- $`Re=160`$ should lose periodic shedding near $`\alpha \approx 1.9`$
- the low rotation lift slopes should be about $`-2.50\alpha`$ at $`Re=60`$ and about $`-2.46\alpha`$ at $`Re=160`$

## Run length and output policy

The lattice time step is very small, so dense output is unnecessary. Integrated quantities should be written every 100 steps. Full field dumps should be much less frequent.

The recommended policy is

| Output type | Cadence |
|:---|:---|
| force and torque history | every 100 steps |
| full field dump during warmup | every 2000 steps |
| full field dump during statistics window | every 1000 steps |
| final image export for report | selected representative times only |

The minimum full field content is

- density
- $`u_x`$
- $`u_y`$

Derived images should be generated in post processing.

| Image | Purpose |
|:---|:---|
| vorticity | identify alternating vortex shedding and its suppression |
| velocity magnitude | show wake width and accelerated side of the rotating cylinder |
| streamwise velocity | show wake recovery and reverse flow region |

No sensors are required for this campaign. Flow images plus the integrated force history are sufficient.

## Statistics window

The force history should be split into a warmup window and a statistics window. Near the suppression threshold, transients decay slowly, so longer runs are needed.

| Case type | Total steps | Warmup | Statistics |
|:---|---:|---:|---:|
| anchor case | 180000 to 220000 | first 40 percent | last 60 percent |
| near critical $`\alpha`$ | 220000 to 280000 | first 50 percent | last 50 percent |
| clearly periodic or clearly steady case | 140000 to 180000 | first 40 percent | last 60 percent |

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

## Post processing rules

Compute the force coefficients from the saved force history using

``` math
C_D = \frac{2 F_x}{\rho U_\infty^2 D}, \qquad C_L = \frac{2 F_y}{\rho U_\infty^2 D}
```

For periodic cases, compute

- $`\overline{C_D}`$ and $`\overline{C_L}`$ as time averages over the statistics window
- $`C'_D`$ and $`C'_L`$ as half peak to peak values over each period, then average those amplitudes over the statistics window
- $`St`$ from the dominant frequency of $`C_L`$

The preferred frequency estimate is FFT of $`C_L`$. A zero crossing estimate may be used as a cross check.

A case should be classified as steady when both conditions hold:

- the last part of the $`C_L`$ signal no longer shows a sustained periodic component above noise level
- the vorticity images no longer show an alternating Karman street

A practical threshold for suppression is that the measured $`C'_L`$ in the final window falls below 5 percent of the $`\alpha=0`$ value at the same Reynolds number and collision model.

## Deliverables for the coder

The coder should deliver the following for each completed phase.

- one configuration table listing domain, collision model, Reynolds number, viscosity, $`\alpha`$, body omega, and total step count
- one CSV file per run with force history sampled every 100 steps
- one folder of selected field snapshots
- one post processing table with $`\overline{C_D}`$, $`\overline{C_L}`$, $`C'_D`$, $`C'_L`$, and $`St`$
- one summary plot of $`\overline{C_L}`$ versus $`\alpha`$
- one summary plot of $`\overline{C_D}`$ versus $`\alpha`$
- one summary plot of $`C'_L`$ versus $`\alpha`$
- one summary plot of $`St`$ versus $`\alpha`$
- one domain sensitivity comparison for the anchor case
- one short note stating whether shedding suppression occurs near the expected $`\alpha_L`$

Executable driver for this deliverable set:

- [tests/run_kan99b_rotating_cylinder.py](tests/run_kan99b_rotating_cylinder.py)

Example commands:

```bash
conda run -n pycuda_3_10 python tests/run_kan99b_rotating_cylinder.py --phase a
conda run -n pycuda_3_10 python tests/run_kan99b_rotating_cylinder.py --phase b --domain M
conda run -n pycuda_3_10 python tests/run_kan99b_rotating_cylinder.py --phase all --minimal --domain M
```

## Minimum run set

If compute budget is tight, the minimum useful run set is the following.

| Phase | Runs |
|:---|:---|
| domain choice | MRT on S, M, L for $`Re=100, \alpha=1.0`$ |
| anchor comparison | SRT, TRT, MRT on the chosen domain for $`Re=100, \alpha=1.0`$ |
| main trend check | SRT, TRT, MRT on the chosen domain for $`Re=100`$ with $`\alpha = 0.0, 1.0, 1.5, 1.8, 2.0`$ |
| threshold check | SRT, TRT, MRT on the chosen domain for $`Re=60, \alpha=1.4`$ and $`Re=160, \alpha=1.9`$ |

This reduced set is enough to answer the main validation question. A larger scan can be added only after the anchor and threshold cases behave correctly.

---

## References

\[Kan99b\] S. Kang, H. Choi, and S. Lee, “Laminar flow past a rotating circular cylinder,” Oct. 07, 1999. doi: [10.1063/1.870190](https://doi.org/10.1063/1.870190).
