↑ ↓ to move · enter to open

W13 · Physics · Fetch, instability, moisture

lake-effect snow

In early winter the Great Lakes are still holding summer heat. When arctic air blows across them, the open water heats the bottom of the air and feeds it vapor. The air turns over, builds narrow bands of snow clouds, and dumps them on the downwind shore. Three things set how much falls: instability, fetch and the depth of the layer the clouds can grow in.

LAB 1

the ingredients

Forecasters start with one number: the lake surface temperature minus the air temperature at the 850 hPa level, about up. When that difference reaches about , lake-effect snow becomes likely. Then the wind and the distance it travels over open water decide how much heat and moisture the air collects.

profile · fluxes

How to read this: the left graph shows temperature going up from the lake (bottom) to the 850 line, about up. The green line is the real air. The gold dashed line is a bubble of air warmed by the lake, cooling as it rises (forecasters call this path a dry adiabat). Where the gold line stays right of the green one, the amber shading shows the bubble is warmer than the air around it, so it keeps rising and builds snow clouds. The red tick is the rule: snow gets likely once the green dot at 850 sits on or left of it.

The right side shows what the lake hands to the air: heat (amber arrow) and water vapor (blue arrow). Longer arrows mean more, measured in watts per square meter (W/m²). The white bar is how fast snow would pile up.

  • lake-warmed bubble rising
  • surrounding air
  • bubble is warmer, so it keeps rising
  • lake surface
  • ice on the lake

Try this: click Early winter, then Lake frozen, and watch both arrows collapse.

—
ΔT lake − 850 hPa
—
vs the rule
—
Sensible heat flux
—
Latent heat flux
—
Water evaporated per day
—
Toy snowfall rate (15:1)

Bulk flux formulas

H = ρ cp CH U (Tlake − Tair)
E = ρ CE U (qsat(Tlake) − qair) LE = LvE
P = η · E · fetch · 3 / 40 km

Toy model. CH = CE = 1.3×10⁻³. The air near the water is the 850 hPa air brought down at 6.5 K/km and is 70% humid. The band collects vapor from a strip of lake 3 times its own width and drops it over of shore. The efficiency η rises from 0 at ΔT = to 0.5 at ΔT = .

Now

Why

Rising unsaturated air cools at the dry-adiabatic rate, g/cp ≈ 9.8 K per km. The 850 hPa level sits about above the lake, so a parcel lifted from the water cools by about on the way up. If the air up there is colder than that, the warmed parcel stays buoyant the whole way and convection takes off.

The rule is a threshold for the ingredient, not a promise of snow. Dry air, wind shear across the lake, or a low inversion can still keep the bands weak.

CodePython

from math import exp
Rd, cp, Lv = 287.0, 1004.0, 2.5e6
CH = CE = 1.3e-3            # bulk transfer coefficients
DZ = 1350.0                 # m, lake surface to 850 hPa

def qsat(Tc, p=1e5):        # saturation specific humidity
    e = 611.2 * exp(17.67 * Tc / (Tc + 243.5))
    return 0.622 * e / (p - 0.378 * e)

def lake_effect(Tw, T850, U, fetch, ice=0.0):
    dT = Tw - T850                  # instability, K
    Ta = T850 + 0.0065 * DZ         # air just above the water
    rho = 1e5 / (Rd * (Ta + 273.15))
    water = 1 - ice                 # open-water fraction
    H = water * rho * cp * CH * U * (Tw - Ta)
    E = water * rho * CE * U * max(0, qsat(Tw) - 0.7 * qsat(Ta))
    eta = 0.5 * min(1, max(0, (dT - 10) / 8))   # toy
    P = eta * E * fetch * 3 / 40e3  # kg/m²/s = mm/s
    return dT, H, Lv * E, P * 3600  # K, W/m², W/m², mm/h

print(lake_effect(5, -12, 12, 200e3))
LAB 2

fetch and wind direction

Fetch is the distance the air travels over open water. On a long, narrow lake it depends almost entirely on the wind direction. Wind down the long axis gives the longest path and one intense band. Wind across the lake gives a short path and weaker, scattered bands. Drag on the map to aim the wind.

idealized lake · drag to aim the wind

How to read this: the gold line is the air's path across the water (the fetch). The longer it is, the more snow lands on the far shore in the white patches. The faint white dashed line runs down the middle of the snow band, and the arrow in the dial points where the wind blows toward.

—
Fetch along the wind
—
Peak snowfall rate
—
Peak event total
—
Area with heavy snow

Longest chord of an ellipse

fetch(φ) = 2ab / √(b² cos²φ + a² sin²φ)

The lake is an ellipse with half-length a = and half-width b = , roughly the shape of Lake Erie. φ is the angle between the wind and the long axis. The longest straight path over water in that direction is the chord through the center.

The band's rate uses Lab 1's toy formula at Lab 1's current temperatures, wind and ice, with this fetch in place of Lab 1's fetch slider. Snow ratio 15:1. Along the band the snow peaks about inland and tails off downwind. Across it, it falls off with a width scale of .

Now

Why direction matters so much

Lake Erie runs from west-southwest to east-northeast, and Buffalo sits at its eastern tip. A west-southwest wind sends air down the whole length of the lake straight at the city. Lake Ontario does the same to the Tug Hill Plateau east of the lake when the wind blows from the west. A shift of 30° or so moves the band to a different town, or breaks it into weaker streamers. A well-aligned single band can drop of snow per hour or more on a narrow strip while towns nearby see sun.

CodePython

from math import cos, sin, radians, exp
a, b, axis = 180e3, 45e3, 70     # m, m, bearing of long axis

def fetch(wind_from_deg):
    phi = radians(wind_from_deg + 180 - axis)
    return 2*a*b / ((b*cos(phi))**2 + (a*sin(phi))**2) ** 0.5

def band_shape(s, n, s0=25e3, sig=10e3):
    if s <= 0: return 0.0           # s: along band, n: across
    x = s / s0
    return x * exp(1 - x) * exp(-n*n / (2*sig*sig))

def footprint(rate_mm_h, hours, slr=15, thr_cm=30.48):
    peak_cm = rate_mm_h * hours * slr / 10
    cells = sum(1 for i in range(400) for j in range(-100, 100)
                if peak_cm * band_shape((i + .5)*1e3, (j + .5)*500) >= thr_cm)
    return peak_cm, cells * 0.5     # cm, km²

print(fetch(250) / 1e3, fetch(340) / 1e3)   # 360 km, 90 km
LAB 3

inside the band

A slice along the wind. Warm water heats the air from below and plumes rise. They can only climb until they hit the inversion, a lid of warmer air aloft. A higher lid allows deeper clouds and heavier snow. Where the band comes ashore and climbs higher ground, the extra lift squeezes out more snow.

cross-section along the wind

How to read this: the wind blows left to right, from the lake onto land. Amber dots are lake-warmed air rising, and they can only climb to the gold dashed lid. White specks are falling snow, and the white bars on the ground show where it falls hardest.

  • rising warm air
  • falling snow
  • ground bars: snowfall rate there
  • inversion: a lid of warmer air

Try this: drag Inversion height up and watch the clouds deepen and the ground bars grow.

—
Cloud depth
—
Cloud-top temperature
—
Liquid rate at the shore
—
Snow rate at the shore
—
Snow rate on the hills
—
12-hour total on the hills

Depth, lift and ratio

liquid = 2 mm/h × (Zi − 500 m)/1500 m × (1 + h/1000 m)
snow depth = liquid × (snow : liquid ratio)

Toy scaling. Cloud base is at and the cloud fills the layer up to the inversion Zi, so more depth means more condensing air. Terrain of height h adds lift. Cloud-top temperature assumes at the surface and 7 K/km cooling inside the cloud.

Now

Why the ratio matters

The same water can fall as very different depths of snow. Typical ratios run from about 10:1 to 20:1. Lake-effect snow is often on the fluffy end, because star-shaped dendrite crystals grow fastest near and stack loosely. Wet snow near freezing packs closer to 10:1.

The bands switch off when the supply does: when the lake freezes over, when the wind swings and the fetch shrinks, or when warmer air aloft cuts the instability. Lake Erie is the shallowest Great Lake and often freezes over by midwinter. Deeper Lake Ontario rarely does, so its bands can keep going all winter.

CodePython

def band_rate(Zi, hill, slr):
    # Zi: inversion height (m), hill: terrain height (m)
    depth = max(0.0, Zi - 500.0)               # cloud depth, m
    liquid = 2.0 * depth / 1500 * (1 + hill / 1000)   # mm/h
    snow = liquid * slr                        # mm/h of snow
    t_top = -3.0 - 0.007 * Zi                  # °C, toy
    return depth, liquid, snow, t_top

for Zi in (1000, 2200, 3500):
    print(Zi, band_rate(Zi, 0, 15), band_rate(Zi, 400, 15))