Wind Resource Explained

On this page

Problem statement

A wind atlas says one site has a mean wind speed of 8.4 m/s at 100 m and another 5.1, and it is natural to conclude the first is 63% better. The power in its wind is 3.8 times larger. The power in the wind rises with the cube of the speed, the speed rises with height at a rate that depends on the ground and the time of day, and the mean of a skewed distribution is a poor summary of the hours that do the work.

Wind resource assessment is mostly about keeping those three effects — the cube, the distribution and the shear — in the calculation rather than collapsing them into one mean speed too early.

Quick answer

The kinetic power flowing through one square metre of rotor is

P / A = ½ · ρ · v³        (W/m², with ρ ≈ 1.225 kg/m³ at sea level)

Average that over the year hour by hour — never cube the average speed.

import requests, numpy as np, pandas as pd

def wind(lat, lon, *heights):
    j = requests.get("https://archive-api.open-meteo.com/v1/archive", params={
        "latitude": lat, "longitude": lon,
        "start_date": "2023-01-01", "end_date": "2023-12-31",
        "hourly": ",".join(f"wind_speed_{h}m" for h in heights),
        "wind_speed_unit": "ms", "timezone": "UTC"}, timeout=120).json()
    d = pd.DataFrame(j["hourly"])
    d.index = pd.to_datetime(d.pop("time"))
    return d

sites = {"Ringkøbing": (56.09, 8.24), "Hamburg": (53.55, 9.99), "Albacete": (38.99, -1.86)}
print(f"{'site':<12}{'mean v':>8}{'½ρ·mean(v³)':>14}{'½ρ·mean(v)³':>14}{'ratio':>7}")
for name, (lat, lon) in sites.items():
    v = wind(lat, lon, 100)["wind_speed_100m"].to_numpy()
    true_pd = 0.5 * 1.225 * np.mean(v ** 3)
    naive = 0.5 * 1.225 * v.mean() ** 3
    print(f"{name:<12}{v.mean():>8.2f}{true_pd:>14,.0f}{naive:>14,.0f}{true_pd / naive:>7.2f}")
site          mean v   ½ρ·mean(v³)   ½ρ·mean(v)³  ratio
Ringkøbing      8.37           631           359   1.76
Hamburg         6.61           297           177   1.68
Albacete        5.12           167            82   2.03

Cubing the mean underestimates the energy in the wind by a factor of 1.7 to 2. And the sites differ by far more than their mean speeds suggest.

Hub-height speeds, distributions and measured shear

1. Get hourly speeds at or near hub height

Modern hub heights are 100–170 m. A 10 m station or a 10 m model level is a measurement of the ground's roughness as much as of the wind.

2. Describe the distribution, not just the mean

The Weibull distribution fits most sites: a scale c near the mean and a shape k that says how spread out the speeds are. A low k means more calm hours and more strong ones — and more energy for the same mean.

3. Extrapolate with a shear exponent measured at the site

The power law v(h) = v_ref · (h / h_ref)^α is the standard way to move between heights. α = 1/7 is a textbook value for open terrain; measured values range from 0.1 over the sea to 0.3 or more over forest and at night.

4. Correct for air density

Density falls about 1% per 100 m of elevation and changes with temperature. A site at 700 m has 7–8% less power in the wind at the same speed as one at the coast.

5. Look at direction for layout, not for energy

The wind rose decides the turbine spacing (more in the prevailing direction) and the wake losses. It changes the energy of a single turbine very little.

6. Pass the speeds through a power curve

A turbine does not capture ½ρv³. It captures nothing below cut-in, a rising fraction up to rated speed, and a flat maximum above it. The energy yield depends on how the distribution sits on that curve.

Wind power density at sea level against wind speed, rising with the cube of the speed. ½ρv³ at sea level4 m/s39 W/m²6 m/s1328 m/s314 — 8× the 4 m/s value10 m/s61312 m/s1,05814 m/s1,68101000 W/m²2000 W/m²Doubling the speed multiplies the power in the wind by eight spatialworkflow.io
Doubling the speed multiplies the power in the wind by eight.

Weibull parameters, daily shear and air density

Example 1 — the Weibull parameters

from scipy import stats

print(f"{'site':<12}{'k':>6}{'c (m/s)':>9}{'calm < 3 m/s':>14}{'> 12 m/s':>10}")
for name, (lat, lon) in sites.items():
    v = wind(lat, lon, 100)["wind_speed_100m"].to_numpy()
    k, _, c = stats.weibull_min.fit(v[v > 0], floc=0)
    print(f"{name:<12}{k:>6.2f}{c:>9.2f}{(v < 3).mean():>14.0%}{(v > 12).mean():>10.0%}")
site             k  c (m/s)  calm < 3 m/s  > 12 m/s
Ringkøbing    2.19     9.44            7%       17%
Hamburg       2.29     7.46           12%        5%
Albacete      1.83     5.75           26%        1%

The Albacete site has a lower k — a more spread-out distribution — and a quarter of the year below 3 m/s, where a turbine produces nothing at all.

Example 2 — shear changes with the time of day

d = wind(53.55, 9.99, 10, 100)
ok = (d.wind_speed_10m > 1) & (d.wind_speed_100m > 1)
alpha = np.log(d.wind_speed_100m[ok] / d.wind_speed_10m[ok]) / np.log(100 / 10)
by_hour = alpha.groupby(alpha.index.hour).median()
print(f"annual median α: {alpha.median():.3f}")
print(f"lowest at {by_hour.idxmin():02d}:00 UTC ({by_hour.min():.3f}), "
      f"highest at {by_hour.idxmax():02d}:00 UTC ({by_hour.max():.3f})")
print(f"textbook 1/7 = {1 / 7:.3f}")
annual median α: 0.223
lowest at 11:00 UTC (0.138), highest at 02:00 UTC (0.274)
textbook 1/7 = 0.143

In the afternoon, sunshine stirs the lower atmosphere and the wind is nearly the same at 10 m and 100 m. At night the ground cools, the air near it stratifies and the upper wind decouples from the lower. A single α is an average over two different atmospheres.

Example 3 — air density at elevation

j = requests.get("https://archive-api.open-meteo.com/v1/archive", params={
    "latitude": 38.99, "longitude": -1.86,
    "start_date": "2023-01-01", "end_date": "2023-12-31",
    "hourly": "surface_pressure,temperature_2m", "timezone": "UTC"},
    timeout=120).json()
p = np.array(j["hourly"]["surface_pressure"]) * 100        # hPa → Pa
t = np.array(j["hourly"]["temperature_2m"]) + 273.15
rho = p / (287.05 * t)
print(f"Albacete, {j['elevation']:.0f} m: mean density {rho.mean():.3f} kg/m³ "
      f"({rho.mean() / 1.225 - 1:+.1%} against the 1.225 standard)")
print(f"range over the year: {rho.min():.3f}–{rho.max():.3f} kg/m³")
Albacete, 688 m: mean density 1.133 kg/m³ (-7.5% against the 1.225 standard)
range over the year: 1.045–1.228 kg/m³

Power curves are published at the standard 1.225 kg/m³. At this site every hour of wind carries less energy than the curve assumes, and the correction is not small next to the differences between candidate turbines.

Wind shear on a summer afternoon and a summer night at Hamburg, with median exponents 0.12 and 0.29. the same site, two atmospheressummer afternoon✕sun heats the ground✕air mixes vertically✕median α 0.12✕117 m speed ≈ 1.34 × 10 msummer night✓ground cools✓layers decouple✓median α 0.29✓117 m speed ≈ 2.04 × 10 mHamburg 2023, ERA5 10 m and 100 m; the annual median α is 0.223 spatialworkflow.io
Two atmospheres a day: well mixed in the afternoon, stratified at night.

Why the cube dominates everything

Why the cube dominates everything

A site with 10% higher speeds has about 33% more power in the wind. Errors propagate the same way: a 5% bias in a wind atlas is a 15% bias in energy before the power curve softens it. This is why the rest of the method — heights, shear, density — matters more than it would for almost any other variable.

Why the distribution matters as much as the mean

Because the cube is convex, spread increases the mean of v³. Two sites with the same mean speed and different Weibull shapes carry different energy, and the difference is systematic: gustier, more variable sites carry more.

Why a turbine blunts all of this

The power curve is roughly cubic only between cut-in and rated speed. Above rated the extra energy is thrown away; below cut-in there is none. So a turbine converts the cube into something much flatter, and the ratio between two sites in turbine output is smaller than the ratio in wind power density. That is the subject of the Weibull energy guide.

Two Weibull wind speed distributions with the same mean of 6 m/s and shapes k = 1.8 and k = 2.6, with the energy each carries. same mean speed, different energy0 m/s6 m/s12 m/s18 m/sk = 2.6: narrow, few galesk = 1.8: more calms and more galesmean of v³ is 39% higher for k = 1.8 than for k = 2.6 at the same mean speed spatialworkflow.io
Same mean speed, different shape: the spread-out distribution carries more energy.

Reanalysis cells, forests, offshore and icing

  • Reanalysis grid cells (ERA5 is about 30 km) smooth out hills and coastlines; local ridges can be much windier than the cell.
  • Forest canopies raise the effective ground level by most of the tree height (the displacement height) and push α well above 0.2.
  • Offshore α is often 0.1 or less, and density is high; both favour the site.
  • Icing and extreme gusts do not change the mean energy much but decide turbine class and downtime.
  • Direction sectors: for layout, fit Weibull parameters per 30° sector; the energy of one turbine rarely needs it.

FAQ

How much power is in the wind?

½ρv³ watts per square metre of area perpendicular to the flow: about 600 W/m² at 10 m/s at sea level.

Why can't I use the mean wind speed?

Power depends on v³, and the mean of the cube is 1.7–2 times the cube of the mean for typical wind distributions.

What is the Weibull k parameter?

The shape of the distribution. Low k means more spread; for the same mean speed a lower k carries more energy.

What shear exponent should I use?

One measured at the site or computed from two model heights. 1/7 is a textbook value that underestimates shear over most land.

Does air density matter?

Yes: power is proportional to density, which falls about 1% per 100 m of elevation and varies with temperature.

Does wind direction change the energy yield?

Barely, for one turbine. It matters for the layout of many turbines because of wakes.