Why a Spinning Ball Curves — Circulation, Magnus, and the Kutta–Joukowski Theorem
The real reason rotating bodies generate lift, and the invisible role of the starting vortex
The day a spinning shell refused to fly straight#
In 1853, the Berlin physicist Heinrich Magnus brought a question gunners had been asking for centuries into the wind tunnel. A spinning artillery shell does not fly straight — it curves sideways. He hung a vertical, rotating cylinder in the flow and measured a steady lateral force perpendicular to the spin axis. Rotation was making lift.
The "why?" remained. In an inviscid fluid the surface slips freely, so what makes the upper side faster and the lower side slower? The answer is one word: circulation. This post starts from the definition of circulation, shows why a rotating cylinder is pulled upward, and follows the trail to the Kutta–Joukowski theorem, which generalizes the conclusion to every two-dimensional lifting body. At the end we face the one thing inviscid theory cannot answer on its own — how circulation is born from a fluid that started at rest — and resolve it through the starting vortex.
Circulation — one closed-curve integral#
Circulation has a one-line definition.
The tangential component of velocity, integrated once around a closed curve . Here is the velocity vector and is the differential tangent to the curve.
Stokes' theorem turns it into a surface integral.
is the vorticity and the differential normal area enclosed by . So circulation is the total amount of vorticity trapped inside the loop.
Two facts are worth fixing. A loop can enclose zero vorticity at every point and still have nonzero circulation — a free vortex (a point where vorticity is concentrated) does exactly this for any loop drawn around it. And the units differ: vorticity is [1/s], circulation is [m²/s] — vorticity multiplied by area.
Why a rotating cylinder is pulled upward#
In incompressible, irrotational, inviscid flow, the cleanest way to build a steady solution is to superpose elementary ones. Uniform flow plus a doublet gives a stationary cylinder. Adding a point vortex at the center turns it into a rotating cylinder.
Packed into one complex potential,
with the convention that positive is clockwise rotation. The tangential surface velocity at is
On the top () the two terms add with the same sign and grows. On the bottom () they cancel. Faster flow on top means lower pressure on top by Bernoulli,
and the integrated pressure difference around the cylinder leaves a net upward force.
Try the simulation directly below.
As you crank up from zero, the yellow stagnation points slide downward. At they merge into a single point and detach from the cylinder — past this critical spin the topology of the flow flips entirely.
The Kutta–Joukowski theorem — L′ = ρU∞Γ#
Integrating the surface pressure gives a clean answer. In inviscid steady flow the drag is exactly zero, and the lift per unit span is
Lanchester proposed it as a conjecture in 1894; in the early 1900s Kutta in Germany and Joukowski in Russia independently turned it into a theorem.
Two things make this formula powerful. First, the body shape is gone. Any 2D cross section with the same circulation around it produces the same lift. Second, lift scales with circulation, not with rotation itself. A wing that does not spin still develops a circulation around its profile and, with it, lift.
The starting vortex, and the silent role of viscosity#
A contradiction shows up here. A fluid at rest has zero vorticity everywhere, so any closed loop has zero circulation. Kelvin's circulation theorem — circulation around a material curve in inviscid, body-force-conservative flow stays constant in time — insists that zero must remain zero forever.
So how does an airplane lift off?
The answer is viscosity. The instant a wing accelerates from rest, inviscid theory demands an infinite velocity at the sharp trailing edge. A real fluid bleeds that kinetic energy through viscosity, and a vortex separates from the trailing edge — the starting vortex, rotating counterclockwise.
Kelvin's theorem still requires that the total circulation around a loop large enough to contain both the wing and its wake equals zero. So a clockwise circulation of equal magnitude is left around the airfoil — the bound vortex — and that bound circulation is the in .
Press start motion below.
Increase the angle of attack and the clockwise bound circulation grows; an equal-magnitude counterclockwise starting vortex sheds off the trailing edge. Their sum stays zero. The lift on a wing that looks inviscid is the post-shedding state read through inviscid eyes.
Code: surface speed and lift coefficient#
The Magnus picture fits onto one page of NumPy: streamfunction, surface pressure coefficient, and lift coefficient in one go.
import numpy as np
def cylinder_streamfunction(x, y, U_inf, gamma, R):
"""Stream function: ψ = U sinθ (r - R²/r) + Γ/(2π) ln(r/R), Γ>0 = clockwise."""
r = np.hypot(x, y)
theta = np.arctan2(y, x)
safe = np.maximum(r, 1e-9)
psi_uniform = U_inf * np.sin(theta) * (safe - R ** 2 / safe)
psi_vortex = (gamma / (2 * np.pi)) * np.log(safe / R)
return psi_uniform + psi_vortex
def surface_pressure_coeff(theta, U_inf, gamma, R):
"""Surface (r = R) pressure coefficient Cp = 1 - (u/U∞)^2."""
u_theta = -2 * U_inf * np.sin(theta) - gamma / (2 * np.pi * R)
return 1.0 - (u_theta / U_inf) ** 2
def magnus_lift_coefficient(gamma, U_inf, R):
"""L' = ρU∞Γ → C_L = 2Γ/(U∞·d) with diameter d = 2R."""
return gamma / (U_inf * R)
# A quick three-shot run (ρ = 1 implied)
U_inf, R = 10.0, 0.5
for gamma in [0.0, np.pi * U_inf * R, 4 * np.pi * U_inf * R]:
theta = np.linspace(-np.pi, np.pi, 360)
cp = surface_pressure_coeff(theta, U_inf, gamma, R)
L_per_span = U_inf * gamma
cl = magnus_lift_coefficient(gamma, U_inf, R)
print(f"Γ={gamma:6.2f} C_L={cl:5.2f}"
f" Cp_top={cp[270]:+.2f} Cp_bot={cp[90]:+.2f}"
f" L'/ρ={L_per_span:6.2f}")When the lift is exactly zero and Cp is symmetric on top and bottom. Push to the critical and the two stagnation points collide into one — the red dot in the visualization above.
Three lines worth keeping#
- Lift comes from circulation, not from rotation itself. The per-span formula holds for every 2D lifting body.
- A rotating cylinder is exactly modeled as uniform flow + doublet + point vortex. The top side speeds up, the bottom slows down, and Bernoulli does the rest.
- Without viscosity there is no lift. The starting vortex shed at the trailing edge keeps Kelvin's theorem honest while leaving an equal, opposite bound vortex around the wing — that bound circulation is what flight rides on.
Share if you found it helpful.