Skip to content
cfd-lab:~/en/posts/2026-09-24-kelvin-wake-a…● online

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

NOTE #164DAY THU 유체역학DATE 2026.09.24UPDATED 2026.10.19READ 8 min read#Kelvin-Wake#Froude-Number#Free-Surface#Flow-Phenomena#Historical

Four times the speed, still 19.47 degrees — where water depth blows the Kelvin wedge open to 90

Depth, not speed, sets the wake angle: it is pinned at 19.47 degrees in deep water and swings to 90 degrees the moment the depth Froude number reaches one.

The Seine, 1803, and the problem of pushing a boat upstream#

On 9 August 1803 Robert Fulton ran a steamboat on the Seine. The plaque on the riverbank names three men who watched: Bossut, Carnot, Prony. All three were fluid dynamicists.

The steam engine had existed since 1776. Several people had already bolted one onto a boat. One thing kept failing. The boats could not work their way upstream. What Fulton solved was not the engine. It was the resistance.

This article takes one piece of that resistance apart: the geometry of the waves a hull drags behind it. In deep water the wake half-angle refuses to move off 19.47 degrees no matter how hard you push the boat. Drop the depth to 2 m and the same angle opens to 89 degrees. We will follow a single dispersion relation all the way to that number.

Resistance that had to be measured because nobody could compute it#

In 1752 d'Alembert showed that a body in inviscid irrotational flow feels exactly zero drag. Theory and reality had split open. The field lost its tool for predicting resistance.

Bossut filled the gap with towing-tank experiments. He pulled model hulls at fixed speed and read the tension. Prony organised the data. What Fulton inherited was that experimental tradition.

Much of what they measured was not friction. It was energy that the boat's own waves carried away behind it. Start with where those waves can exist.

Drop the depth slider from 500 m toward 2 m and the yellow wedge opens. The speed slider alone leaves the angle where it is.

Fr_h = 0.000 (subcritical)half-angle = 0.00°transverse λ = 0.0 m

Push V up with h fixed at “deep”: the yellow wedge never budges from 19.47°. Now drag h down toward 2 m and raise V until Fr_h → 1: the wedge opens to 90°, then closes again once Fr_h > 1.

Move the speed slider alone and the yellow wedge does not twitch. The angle only changes once you drag the depth down from 500 m toward 2 m. Two controls, but only one of them sets the angle.

Only the waves that stand still survive#

In a frame riding with the hull the wake is stationary. To look stationary, a wave's phase speed must match the component of the ship's speed along its own direction of travel.

Let θ\theta be the angle between the wavenumber vector and the ship's track. The condition reads:

Vcos⁡θ=c(k)=gktanh⁡khV\cos\theta = c(k) = \sqrt{\frac{g}{k}\tanh kh}

VV is ship speed, kk wavenumber, hh depth, gg gravity. The right side is the surface-wave dispersion relation.

That one equation carries the whole article. In deep water (kh≫1kh \gg 1), tanh⁡kh→1\tanh kh \to 1 and c=g/kc = \sqrt{g/k} — depth drops out. In shallow water (kh≪1kh \ll 1), tanh⁡kh→kh\tanh kh \to kh and c→ghc \to \sqrt{gh} — wavenumber drops out. Everything interesting lives between those two limits.

Phase speed cannot beat gh\sqrt{gh}. With a finite bottom, no wave however long can beat that speed. Once the ship exceeds it, there is no way left to balance the left side.

Where the energy actually goes#

Crests travel at the phase speed, but energy travels at the group velocity. In finite depth:

cg(k)=c2(1+2khsinh⁡2kh)c_g(k) = \frac{c}{2}\left(1 + \frac{2kh}{\sinh 2kh}\right)

The bracket runs from 1 in deep water to 2 in shallow water, so cgc_g ranges from c/2c/2 up to cc.

That group velocity builds the wake. Follow a wave component launched τ\tau seconds ago. The ship has advanced VτV\tau; the energy has run cgτc_g\tau along the wavenumber direction. Measured from the ship, that component now sits (V−cgcos⁡θ)τ(V - c_g\cos\theta)\tau astern and cgsin⁡θ⋅τc_g\sin\theta \cdot \tau off to the side.

τ\tau cancels. The direction in which a given component shows up does not depend on its age.

tan⁡α(θ)=cgsin⁡θV−cgcos⁡θ\tan\alpha(\theta) = \frac{c_g\sin\theta}{V - c_g\cos\theta}

α\alpha is the ray angle measured from the ship's track. The wedge angle is the maximum of α\alpha as θ\theta sweeps from 00 to 90°90°. Stationary phase selects exactly that direction, energy piles up there, and it shows on the surface as a sharp boundary.

Where 19.47 degrees comes from#

Run the deep-water case. With c=g/kc = \sqrt{g/k}, the stationary condition gives c=Vcos⁡θc = V\cos\theta and cg=c/2=Vcos⁡θ/2c_g = c/2 = V\cos\theta/2. Substitute and VV cancels outright.

tan⁡α=sin⁡θcos⁡θ2−cos⁡2θ\tan\alpha = \frac{\sin\theta\cos\theta}{2 - \cos^2\theta}

Speed has vanished from the expression. This function peaks at cos⁡2θ=2/3\cos^2\theta = 2/3, that is θ=35.26°\theta = 35.26°, where it equals 1/(22)1/(2\sqrt{2}). As an angle, 19.47°19.47°.

Two metres per second or eight, the answer is the same. All speed changes is the wavelength. The deep-water transverse wavelength is λ=2πV2/g\lambda = 2\pi V^2/g, quadratic in speed. The shape holds; only the scale grows.

With cos⁡2θ=2/3\cos^2\theta = 2/3, cos⁡θ=2/3\cos\theta = \sqrt{2/3} and sin⁡θ=1/3\sin\theta = \sqrt{1/3}. The numerator is sin⁡θcos⁡θ=2/3\sin\theta\cos\theta = \sqrt{2}/3 and the denominator is 2−2/3=4/32 - 2/3 = 4/3. The ratio is 2/4=1/(22)\sqrt{2}/4 = 1/(2\sqrt{2}). The arctangent of that is 19.47°. VV sits in both numerator and denominator and cancels. At g=9.81g = 9.81, V=2V = 2 m/s gives 2π×4/9.81=2.562\pi \times 4 / 9.81 = 2.56 m. Quadrupling speed to 8 m/s multiplies V2V^2 by 16 and the wavelength becomes 40.99 m. Doubling speed to 4 m/s multiplies wavelength by 4, and 10.25 / 2.56 = 4. The table rows 2.56, 10.25 and 40.99 are that ratio.

Dropping the depth to 2 m and rerunning the same calculation#

Now keep tanh⁡kh\tanh kh intact and solve numerically. Bisect the stationary condition for k(θ)k(\theta), feed it to the group velocity to build α(θ)\alpha(\theta), then sweep for the maximum.

import math
 
g = 9.81
 
def c_phase(k, h):
    return math.sqrt(g / k * math.tanh(k * h))
 
def solve_k(v, h):
    if v >= math.sqrt(g * h) - 1e-12:
        return None
    lo, hi = 1e-8, 1.0
    while c_phase(hi, h) > v:
        hi *= 2.0
        if hi > 1e6:
            return None
    for _ in range(200):
        mid = 0.5 * (lo + hi)
        if c_phase(mid, h) > v:
            lo = mid
        else:
            hi = mid
    return 0.5 * (lo + hi)
 
def group_velocity(k, h):
    kh = k * h
    if kh > 20.0:
        f = 1.0
    else:
        f = 1.0 + 2.0 * kh / math.sinh(2.0 * kh)
    return 0.5 * c_phase(k, h) * f
 
def ray_angle(theta, v, h):
    k = solve_k(v * math.cos(theta), h)
    if k is None:
        return None
    cg = group_velocity(k, h)
    num = cg * math.sin(theta)
    den = v - cg * math.cos(theta)
    if den <= 0.0:
        return 0.5 * math.pi
    return math.atan2(num, den)
 
def wedge_scan(v, h, n=8000):
    best, best_t = 0.0, 0.0
    for i in range(1, n):
        th = 0.5 * math.pi * i / n
        a = ray_angle(th, v, h)
        if a is not None and a > best:
            best, best_t = a, th
    return math.degrees(best), math.degrees(best_t)
 
print("  V[m/s]   h[m]    Fr_h    wedge[deg]  theta*[deg]   lambda_t[m]")
cases = [(2.0, 500.0), (4.0, 500.0), (8.0, 500.0),
         (2.0, 2.0), (3.5, 2.0), (4.0, 2.0), (4.3, 2.0),
         (4.43, 2.0), (5.5, 2.0), (8.0, 2.0)]
for v, h in cases:
    frh = v / math.sqrt(g * h)
    a, t = wedge_scan(v, h)
    k0 = solve_k(v, h)
    lam = (2 * math.pi / k0) if k0 else float('inf')
    ls = f"{lam:10.2f}" if k0 else "       inf"
    print(f"{v:7.2f} {h:7.1f} {frh:7.3f} {a:11.2f} {t:11.2f} {ls}")
 
print()
print("supercritical branch vs Mach-like angle arcsin(1/Fr_h)")
print("   Fr_h    wedge[deg]   asin(1/Fr_h)[deg]   diff")
for v, h in [(5.0, 2.0), (5.5, 2.0), (6.5, 2.0), (8.0, 2.0)]:
    frh = v / math.sqrt(g * h)
    a, _ = wedge_scan(v, h)
    m = math.degrees(math.asin(1.0 / frh))
    print(f"{frh:7.3f} {a:11.2f} {m:17.2f} {a-m:8.3f}")
  V[m/s]   h[m]    Fr_h    wedge[deg]  theta*[deg]   lambda_t[m]
   2.00   500.0   0.029       19.47       35.27       2.56
   4.00   500.0   0.057       19.47       35.27      10.25
   8.00   500.0   0.114       19.47       35.27      40.99
   2.00     2.0   0.452       19.47       35.26       2.56
   3.50     2.0   0.790       23.74       23.94       8.80
   4.00     2.0   0.903       35.13       16.47      14.91
   4.30     2.0   0.971       54.46        9.50      29.17
   4.43     2.0   1.000       89.08        0.91        inf
   5.50     2.0   1.242       53.63       36.36        inf
   8.00     2.0   1.806       33.61       56.39        inf
 
supercritical branch vs Mach-like angle arcsin(1/Fr_h)
   Fr_h    wedge[deg]   asin(1/Fr_h)[deg]   diff
  1.129       62.35             62.36   -0.007
  1.242       53.63             53.64   -0.013
  1.467       42.94             42.96   -0.014
  1.806       33.61             33.62   -0.015

Drag the Fr_h slider from the table's 0.452 toward 1.000 and the peak of α(θ)\alpha(\theta) leaves θ∗=35.27°\theta^* = 35.27°, sliding left.

peak α = 19.47° at θ* = 35.27°subcritical branch

Below Fr_h ≈ 0.7 the peak sits fixed at θ* = 35.27°, α = 19.47°. Drag Fr_h toward 1 and watch θ* slide to zero while α climbs to 90°. Past 1 a forbidden band opens on the left and the peak tracks asin(1/Fr_h).

Between 0.1 and 0.7 the peak stays pinned at 35.27° and the wedge holds 19.47°. Only near 1 does the peak climb toward the table's 89.08°.

The first three rows are deep water. Quadruple the speed and the wedge angle agrees to two decimal places. Only the wavelength moves, from 2.56 m to 40.99 m — a factor of 16.

Row four is the interesting one. Even at h=2h = 2 m the answer is still 19.47 degrees, with Fr_h = 0.452. A short 2.56 m wave gives kh=4.9kh = 4.9, so as far as that wave is concerned the water is deep. What matters is depth relative to wavelength, not depth on its own.

With k=2π/λk = 2\pi/\lambda, h=2h = 2 m and λ=2.56\lambda = 2.56 m give kh=2π×2/2.56=4.9kh = 2\pi \times 2 / 2.56 = 4.9. tanh⁡(4.9)\tanh(4.9) sits on 1, so the dispersion relation collapses back to the deep-water form. That is why a 2 m bottom still returns 19.47°. At V=4.30V = 4.30 m/s and λ=29.17\lambda = 29.17 m, kh=2π×2/29.17kh = 2\pi \times 2 / 29.17 falls to about 0.43. tanh⁡kh\tanh kh leaves 1 and the table angle is 54.46°. The rows run 23.74° at Fr_h = 0.790, 35.13° at 0.903, 54.46° at 0.971 and 89.08° at 1.000. An angle that refused to move when speed was quadrupled in deep water opens from 23.74° to 89.08° between 4.30 m/s and 4.43 m/s.

Past Fr_h of about 0.79 the angle starts to move: 35.13 degrees at 0.903, 54.46 at 0.971, and 89.08 at 1.000. That last value falls 0.9 degrees short of 90 because the θ\theta grid is finite. Read it together with θ∗\theta^*, which has collapsed to 0.91 degrees. The peak is converging on θ=0\theta = 0.

Above the critical speed the wedge narrows again#

Once Fr_h exceeds 1, only directions satisfying Vcos⁡θ≤ghV\cos\theta \le \sqrt{gh} survive — that is, θ>arccos⁡(1/Frh)\theta > \arccos(1/\mathrm{Fr}_h). A forbidden band opens up ahead of the beam. Transverse waves disappear entirely, which is what the inf entries in the λt\lambda_t column mean.

The wedge built from the surviving divergent waves narrows: 53.63 degrees at 1.242, 33.61 at 1.806. The second table checks those against arcsin⁡(1/Frh)\arcsin(1/\mathrm{Fr}_h). All four cases agree to within 0.015 degrees.

This is the same formula as the Mach cone in supersonic flow, with gh\sqrt{gh} standing in for the sound speed. Transverse waves vanishing once Fr_h passes 1, leaving only divergent waves, is the same split a hydraulic jump in a kitchen sink makes at Froude number 1, between subcritical and supercritical flow.

This is the wall Fulton hit on the Seine. In a 2 m river the critical speed is 4.43 m/s, roughly 8.6 knots. Near it the wake spreads across the full channel width. The waves cannot leave the boat, so the energy pushed into them comes straight back as resistance.

Where this angle decides your CFD grid#

In a free-surface run the domain width is the tangent of the wedge angle. The tangent of 19.47° is 0.354, so one length LL astern the half-width is 0.354L0.354L. At Fr_h = 0.971 the table angle is 54.46°, and the tangent is near 1.40. The same station becomes 1.40L1.40L, about four times wider. Park the side wall at the deep-water habit of 0.354L0.354L and reflected waves mix into the hull pressure. The resistance coefficient drifts off without a warning.

The wavelength budget moves with it. At Fr_h = 0.971 the transverse wave is 29.17 m. Forty cells per wavelength puts that one wave past a thousand cells. The row h=2h = 2 m, V=2V = 2 m/s has λ=2.56\lambda = 2.56 m and kh=4.9kh = 4.9, so the same 40-cell rule is only about a hundred cells. Same hull, same speed, and the grid line still lengthens once depth pushes khkh toward critical. The deep-water 19.47° does not depend on speed, hull form or viscosity. A narrow angle means the scheme smeared the waves. A wide one means dispersion error got in.

Close the domain before critical and the wake hits the wall#

Fulton had no dispersion relation. The tension gauge in Bossut's tank pointed at V=ghV = \sqrt{gh} first. In 2 m of water that speed is 4.43 m/s, about 8.6 knots. Once Fr_h passes 0.79 the wedge leaves 19.47° and reaches 89.08° at 1.000. If the waves cannot leave the hull, the energy put into them comes back as resistance.

The first question about hull resistance is not the speed itself. It is whether this depth is deep for the wavelength that hull makes. At h=2h = 2 m and λ=2.56\lambda = 2.56 m, kh=4.9kh = 4.9 and the angle is still 19.47°. On the same depth, once the wavelength stretches to 29.17 m the wedge spreads across the channel. Closing the side wall from the speed number alone is the same mistake as sorting a flow by viscosity alone in where the Reynolds number splits regimes.

Share if you found it helpful.