Vorticity and the vorticity equation — why turbulence must be 3D

Starting from the definition of vorticity, reading the four terms of the vorticity equation one line at a time, and tracing why a 2D flow — where vortex stretching vanishes — cannot be turbulent.

Opening

In Chapter 3 we wrote the Navier–Stokes equations for the velocity u\vec{u}. In this chapter we rewrite the same equations in terms of the vorticity ω\vec{\omega} (omega). Why bother — because in the vorticity equation the pressure term drops out, and a new term called vortex stretching appears in its place. That single term explains two of the five properties of turbulence from Chapter 1 simultaneously: “three-dimensional vorticity fluctuations” and “energy transfer to small scales.” A reader who finishes this chapter should be able to say in one line of math why turbulence must be three-dimensional.

Main 1 — What is vorticity

Vorticity is the curl of the velocity field. Using \nabla (nabla, the gradient/curl operator),

ω=×u\vec{\omega} = \nabla \times \vec{u}

Intuitively it is twice “how fast a fluid particle spins about its own axis.” For a flow rotating as a rigid body, ω\vec{\omega} is a constant vector along the axis of rotation; for a straight uniform flow, ω=0\vec{\omega} = 0.

In tensor notation (Chapter 2),

ωi=ϵijkukxj\omega_i = \epsilon_{ijk} \frac{\partial u_k}{\partial x_j}

where ϵijk\epsilon_{ijk} (epsilon ijk) is the Levi-Civita symbol, defined by:

  • +1+1 for cyclic permutations (123, 231, 312)
  • 1-1 for anti-cyclic permutations (132, 213, 321)
  • 00 if any two indices are equal

You do not need to memorize all six cases. What matters is that this one symbol packages the cross product into index notation cleanly. For example, ω1=u3/x2u2/x3\omega_1 = \partial u_3/\partial x_2 - \partial u_2/\partial x_3 falls out automatically from ϵ123=+1\epsilon_{123}=+1 and ϵ132=1\epsilon_{132}=-1.

Main 2 — The vorticity equation

Taking the curl of the Navier–Stokes equations for an incompressible flow (constant density) with no body forces eliminates the pressure term and gives:

ωit+ujωixj=ωjuixj+ν2ωixjxj\frac{\partial \omega_i}{\partial t} + u_j \frac{\partial \omega_i}{\partial x_j} = \omega_j \frac{\partial u_i}{\partial x_j} + \nu \frac{\partial^2 \omega_i}{\partial x_j \partial x_j}

Read the four terms left to right, one line at a time:

  • ωi/t\partial \omega_i / \partial t — time rate of change of vorticity
  • ujωi/xju_j \, \partial \omega_i / \partial x_jconvection of vorticity by the flow
  • ωjui/xj\omega_j \, \partial u_i / \partial x_jvortex stretching
  • ν2ωi/xjxj\nu \, \partial^2 \omega_i / \partial x_j \partial x_jviscous diffusion, where ν\nu (nu) is the kinematic viscosity (m²/s)

The third term is the protagonist of this chapter. When the velocity stretches along the direction of ω\vec{\omega} (that is, the component of ui/xj\partial u_i / \partial x_j in that direction is positive), the vorticity itself is amplified — the same mechanism that lets a spinning figure skater speed up by pulling their arms in. This stretches large vortices into thinner ones and piles vorticity energy onto smaller and smaller scales. The microscopic identity of the energy cascade we will meet in Chapter 9 is exactly this term.

Main 3 — In 2D, vortex stretching disappears

Now force the flow to be two-dimensional: u=(ux,uy,0)\vec{u} = (u_x, u_y, 0), and nothing depends on zz. Computing the curl, the xx and yy components both vanish and we are left with

ω=(0,0,ωz)\vec{\omega} = (0, 0, \omega_z)

In the vortex-stretching term ωjui/xj\omega_j \, \partial u_i / \partial x_j, only the j=3j=3 component of ωj\omega_j survives, so

ωjuixj=ωzuiz=0\omega_j \frac{\partial u_i}{\partial x_j} = \omega_z \frac{\partial u_i}{\partial z} = 0

because nothing varies in zz.

The consequence is decisive.

In a 2D flow, vortex stretching is zero, so there is no energy cascade to small scales, and therefore none of the five-property definition of turbulence from Chapter 1 can be satisfied.

A 2D flow can still be irregular and diffusive (some literature calls this “2D turbulence”), but its dynamics is an inverse cascade, in which small scales merge into larger ones — fundamentally a different phenomenon from 3D turbulence. This is precisely why industrial CFD always uses three-dimensional meshes.

In Python

Take the simplest 2D flow u(x,y)=(y,0)\vec{u}(x, y) = (y, 0) (uniform shear) and compute ωz\omega_z numerically. The answer is ωz=uy/xux/y=01=1\omega_z = \partial u_y/\partial x - \partial u_x/\partial y = 0 - 1 = -1, constant over the whole domain.

import numpy as np

# 100x100 grid covering [0, 1]^2
N = 100
x = np.linspace(0.0, 1.0, N)
y = np.linspace(0.0, 1.0, N)
X, Y = np.meshgrid(x, y, indexing="xy")

# Uniform shear flow: u_x = y, u_y = 0
u_x = Y
u_y = np.zeros_like(X)

# np.gradient returns derivatives in (row=y, col=x) order
dux_dy, dux_dx = np.gradient(u_x, y, x)
duy_dy, duy_dx = np.gradient(u_y, y, x)

# z-component of vorticity
omega_z = duy_dx - dux_dy

print(f"omega_z min  = {omega_z.min():.6f}")
print(f"omega_z max  = {omega_z.max():.6f}")
print(f"omega_z mean = {omega_z.mean():.6f}")

All three values print close to 1-1. The fact that ωz\omega_z is constant over the entire domain directly reflects “the shear is uniform, so the rotation rate is the same everywhere.” This flow carries vorticity but no vortex stretching, and therefore cannot evolve into turbulence.

To the next chapter

Chapter 5: Reynolds averaging and the RANS equations shifts perspective. So far we have been tracking the instantaneous velocity field u(x,t)\vec{u}(\vec{x}, t), but in real industrial applications it is more useful to separate the mean flow from the fluctuations. How do we put the fluctuations that vortex stretching produced back into the mean equations? — that is the entrance to the so-called closure problem.