Skip to content
cfd-lab:~/en/posts/2026-04-28-rankine-vorte…● online

Translated from the author's Korean original. Read the original (한국어)

NOTE #025DAY TUE 유체역학DATE 2026.04.28UPDATED 2026.10.19READ 5 min read#Vortex#Vorticity#Fluid-Dynamics#Flow-Phenomena#Helmholtz

Two Faces of a Whirl — Free Vortex, Forced Vortex, and Helmholtz

A leaf that keeps one face toward the drain is only revolving. The spin, and the vorticity 2ω, sit in the yellow core.

Pull the plug from a bathtub and the water spins. We call that scene "the water rotates." A fluid dynamicist, looking at most of that same region, will say the opposite: nothing there is rotating (irrotational). The contradiction is fake. Inside it lives the real definition of a vortex. The same picture holds a free vortex at 1/r1/r and a forced vortex at ωr\omega r. Vorticity — twice the spin rate of a fluid particle — is the difference. Helmholtz's theorem is why that vortex is so hard to kill.

Is a bathtub whirl really 'rotation'?#

Two meanings hide inside one word. One is revolution: motion in a circle around some point. The other is spin: the particle turning on its own axis.

In a bathtub whirl, water particles revolve. Spin, far from the drain, is almost absent. A small leaf traces a circle and never turns its body. The same face always points toward the drain.

In fluid mechanics, "rotation" means spin. A free vortex is non-rotating everywhere except at the singular center.

Shrinking the core radius RR narrows the yellow spinning region, and raising Umax⁡U_{\max} raises the core vorticity 2Umax⁡/R2U_{\max}/R.

Yellow tracers sit inside the forced-vortex core and rotate as a solid body (ω = 2U/R). Blue tracers outside follow u_θ = ΓR/r — circular streamlines but zero local spin. The Rankine combined vortex is the simplest model for a bath-tub drain or tornado.

Yellow particles spin in place. Blue particles revolve while keeping one face toward the drain, and the inset curve is linear for r≤Rr \le R and 1/r1/r outside.

Forced vs. free: same picture, different soul#

Stir a bucket long enough and the entire liquid spins as a rigid body. This is the forced vortex. Each particle revolves and spins together.

uθ(r)=ω ru_\theta(r) = \omega \, r

Here uθu_\theta is the tangential speed, ω\omega the rigid-body angular velocity, rr the distance from the axis. Speed is proportional to radius.

The whirl that arises in an ideal (inviscid) fluid is the free vortex, also called the potential vortex.

uθ(r)=Γ2πru_\theta(r) = \frac{\Gamma}{2\pi r}

Γ\Gamma is the circulation, the line integral of velocity around a closed loop. Speed falls as 1/r1/r and blows up at the center. Viscosity tames that singularity in a real fluid.

ForcedFree
Speedωr\omega rΓ/2πr\Gamma / 2\pi r
Spinyesno
Energy inputcontinuousonce at birth
Everyday examplestirred cupbathtub, tornado

Same circular streamlines, opposite spin. One scalar quantifies the difference.

What vorticity measures#

Vorticity ω\boldsymbol{\omega} is the curl of the velocity field.

ω=∇×u\boldsymbol{\omega} = \nabla \times \mathbf{u}

In two dimensions only the zz-component survives:

ωz=∂v∂x−∂u∂y\omega_z = \frac{\partial v}{\partial x} - \frac{\partial u}{\partial y}

where u,vu, v are velocity components in x,yx, y. The value equals twice the angular velocity of a fluid particle's spin.

Plug in the forced vortex: ωz=2ω\omega_z = 2\omega, uniform across the whole region. Plug in the free vortex: ωz=0\omega_z = 0 everywhere except the center. Identical round streamlines, opposite spin.

Rankine combined vortex — the tornado blueprint#

Real whirls follow neither formula alone. Near the center, viscosity is strong and the fluid spins like a solid. Far away, viscosity drops out and the free-vortex law takes over. The splice is the Rankine combined vortex.

uθ(r)={Umax⁡R r,r≤RUmax⁡ Rr,r>Ru_\theta(r) = \begin{cases} \dfrac{U_{\max}}{R}\, r, & r \le R \\[6pt] \dfrac{U_{\max}\, R}{r}, & r > R \end{cases}

RR is the core radius and Umax⁡U_{\max} the peak tangential speed at the core boundary. The two pieces match at r=Rr = R. Tornado wind profiles, wing-tip vortices, and the suction whirl above a drain all sit close to this shape. Inside the core: rotational. Outside: irrotational.

Drop the code defaults straight into the formulas. Umax⁡=1U_{\max} = 1 and R=0.5R = 0.5. At r=Rr = R both pieces give uθ=1u_\theta = 1. At r=0.25r = 0.25 the inner piece gives Umax⁡r/R=0.5U_{\max} r / R = 0.5. At r=1r = 1 the outer piece gives Umax⁡R/r=0.5U_{\max} R / r = 0.5. Same distance from the axis, same speed, opposite slope.

Circulation on an outer loop does not grow with radius. For r>Rr > R, uθ=Umax⁡R/ru_\theta = U_{\max} R / r, so Γ=2πruθ=2πRUmax⁡\Gamma = 2\pi r u_\theta = 2\pi R U_{\max}. The numbers give 2π×0.5×1=π2\pi \times 0.5 \times 1 = \pi. Core vorticity is ωz=2Umax⁡/R=4\omega_z = 2 U_{\max}/R = 4. Core area is πR2=π/4\pi R^2 = \pi/4, and 4×π/4=π4 \times \pi/4 = \pi. The area integral and the loop integral close on the same circulation. How that Γ\Gamma becomes lift is the subject of a spinning ball.

Helmholtz's theorem — the immortality of vortices#

In an inviscid fluid the only force on a particle is pressure, and pressure points at the particle's center. No torque. A particle that is not spinning never starts, and a particle that is spinning never stops. That is Helmholtz's vortex theorem in one line.

Kelvin's theorem is the sharper statement. Circulation Γ\Gamma on a closed material curve does not change in time.

DΓDt=0\frac{D\Gamma}{Dt} = 0

D/DtD/Dt is the material derivative, the one that follows a fluid parcel. Vortex tubes cannot be cut or ended. Stretch one and it spins faster, the same move as a figure skater pulling her arms in. Real fluids have viscosity, so vortices eventually diffuse, but in water or air they last for days. That is why an aircraft's condensation vortex stays visible long after the plane is gone.

The door velocity potential opens#

In an irrotational region (ω=0\boldsymbol{\omega} = 0) a vector identity hands over one line:

∇×u=0⟹u=∇ϕ\nabla \times \mathbf{u} = 0 \quad \Longrightarrow \quad \mathbf{u} = \nabla \phi

The scalar ϕ\phi is the velocity potential. If the flow is also incompressible, ∇⋅u=0\nabla \cdot \mathbf{u} = 0, then

∇2ϕ=0\nabla^2 \phi = 0

Laplace's equation. Inviscid, irrotational, incompressible flow reduces to a single scalar. That is how nineteenth-century fluid mechanics handled airfoils, sources, and sinks on paper. The free vortex itself is ϕ=(Γ/2π) θ\phi = (\Gamma / 2\pi)\, \theta, a potential proportional to the angle.

Two vortices in code#

Plotting Rankine speed and discrete vorticity makes the split obvious.

import numpy as np
 
def rankine_speed(r, R_core, U_max):
    """Tangential speed of a Rankine combined vortex."""
    speed = np.where(r <= R_core,
                     U_max * r / R_core,
                     U_max * R_core / np.maximum(r, 1e-9))
    return speed
 
def vorticity_field(u, v, dx, dy):
    """Discrete curl in 2D: omega_z = dv/dx - du/dy."""
    dvdx = (v[1:-1, 2:] - v[1:-1, :-2]) / (2 * dx)
    dudy = (u[2:, 1:-1] - u[:-2, 1:-1]) / (2 * dy)
    return dvdx - dudy
 
# Sample on a 200x200 grid
N, L = 200, 2.0
x = np.linspace(-L, L, N)
y = np.linspace(-L, L, N)
X, Y = np.meshgrid(x, y)
R = np.hypot(X, Y)
THETA = np.arctan2(Y, X)
 
U_max, R_core = 1.0, 0.5
u_theta = rankine_speed(R, R_core, U_max)
u =  -u_theta * np.sin(THETA)
v =   u_theta * np.cos(THETA)
 
dx = dy = x[1] - x[0]
omega = vorticity_field(u, v, dx, dy)
 
# Mean vorticity inside and outside the core
mask_in  = R[1:-1, 1:-1] <  R_core
mask_out = R[1:-1, 1:-1] >  1.5 * R_core
print(f"core mean omega_z ~ {omega[mask_in].mean():.3f}")   # ~ 2 * U_max / R_core
print(f"outer mean omega_z ~ {omega[mask_out].mean():.3f}") # ~ 0

Inside the core, ωz≈2Umax⁡/R\omega_z \approx 2 U_{\max}/R and stays nearly constant. Outside, it drops to zero. The same circular flow carries a sharp boundary at r=Rr = R.

The grid is the same set of numbers. N=200N = 200 and L=2L = 2, so the box runs from −2-2 to 22 and the spacing is 4/1994/199. A core of 0.50.5 is about twenty-five cells from the origin. The outer mask opens at 1.5R=0.751.5 R = 0.75, so cells between RR and 0.750.75 stay out of both averages. The comment expects 44 inside and 00 outside.

Where the core radius should sit#

Cut the core too small and 2Umax⁡/R2U_{\max}/R outgrows the mesh. With Umax⁡=1U_{\max} = 1 and R=0.5R = 0.5, vorticity is 44. Halve RR and the same formula gives 88. A centered difference across that jump dirties the core mean with a value that is neither 44 nor 88. That is why the outer mask starts at 1.5R1.5R.

Push the core to the edge of the domain and the 1/r1/r tail disappears. Circulation Γ=2πRUmax⁡\Gamma = 2\pi R U_{\max} can still be written down, but there is no irrotational stretch where a leaf keeps one face toward the center. Whether the Bernoulli constant stays flat across those streamlines is a separate calculation, the one in which total pressure fell while dissipation stayed at zero.

Share if you found it helpful.