CastScience

Science Info and Calculations

Water temperature

How the app projects the lake temperature for the days ahead, and how wide the uncertainty is.

In plain words

Water holds a lot of heat, so a lake changes temperature slowly. Day by day it moves toward the air temperature: when the air is colder than the water the lake cools, and the larger the difference, the faster it cools. That is Newton's law of cooling. Wind speeds it up: it mixes the water and carries heat away from the surface faster, so the app lets the rate grow with wind speed.

The model is fitted to Lake St. Clair itself: Selfridge ANGB (KMTC) daily mean air temperature and wind vs NOAA GLSEA daily lake-average temperature, October 2014-2025, n=299 days. Before a plan is built, it carries the latest measured lake temperature forward day by day to the plan's date.

The heat-balance model

One step per day
Tn+1=Tn+(k0+kwUn)(Tair,n−Tn)T_{n+1} = T_n + \left(k_0 + k_w U_n\right)\left(T_{\text{air},n} - T_n\right)

TnT_n: lake-average water temperature on morning nn, F. TairT_{\text{air}}: the day's mean air temperature, (high + low) / 2, at Selfridge, F. UU: the day's mean wind at the shore station, mph. Fitted for Lake St. Clair (lake record):

k0=0.0135 per dayk_0 = 0.0135\ \text{per day}
kw=0.0058 per day per mphk_w = 0.0058\ \text{per day per mph}

With a wind of 8 mph, k=0.0135+0.0058×8=0.0599k = 0.0135 + 0.0058 \times 8 = 0.0599 per day: the lake closes 6.0% of the gap between water and air each day. In steady weather half the gap is gone after ln⁡0.5/ln⁡(1−k)=11.2\ln 0.5 / \ln(1 - k) = 11.2 days. In continuous form this is dT/dt=k (Tair−T)dT/dt = k\,(T_{\text{air}} - T), with the solution T(t)=Tair+(T0−Tair) e−ktT(t) = T_{\text{air}} + (T_0 - T_{\text{air}})\, e^{-kt} and a time constant 1/k=16.71/k = 16.7 days.

The same form, relaxation toward an equilibrium temperature with an exchange coefficient that grows with wind speed, is the equilibrium-temperature method of Edinger, Duttweiler and Geyer (1968). The app uses the daily mean air temperature in place of the equilibrium temperature Working rule: a simplification; the fit absorbs the difference on October days.

Weather for each day

  • Days already past: observed highs, lows and wind at Selfridge.
  • The next 7 days: the National Weather Service forecast for the shore point.
  • After day 7: NOAA 1991-2020 daily normal high and low for Selfridge (station USW00014804) and a wind of 8 mph Starting value: near the October mean at Selfridge (Wind over water). The app labels these days as climatology-driven.

Sensitivity: an error of 1.5 F in the air temperature moves the projection by k×1.5=0.09k \times 1.5 = 0.09 F on the first day and 1.5 (1−(1−k)7)=0.531.5\,(1 - (1 - k)^7) = 0.53 F after 7 days: the error grows more slowly than 7 times the first day's because the model keeps closing the gap.

Source: SPEC 5.2; reference/python/projection.py and wx_analysis.py. Engine: projectWaterTemp in packages/engine/src/waterTemp.ts.

Golden run

The trip analysis ran the model from 64.346 F on 2026-09-29 with the NWS forecast and then Selfridge normals. The engine reproduces it; largest difference 0.0005 F against a tolerance of 0.01 F (computed now):

Morning afterReference (Python)Engine
2026-10-0562.853 F62.853 F
2026-10-0761.835 F61.835 F
2026-10-0960.962 F60.962 F
2026-10-1160.097 F60.097 F

The 80% band

The heat balance gives the central value; history gives the spread. Across 31 years (GLSEA 1995-2025) the Oct 7-11 lake temperature averaged 60.9 F with a standard deviation of 3.9 F. Knowing the temperature on Sept 29 narrows that, by a straight-line fit (least squares) over the same years:

Oct 7-11 mean lake temperature vs Sept 29 lake temperature, GLSEA 1995-2025 (31 years)
TOct 7-11=6.55+0.844 TSept 29T_{\text{Oct 7-11}} = 6.55 + 0.844\, T_{\text{Sept 29}}
r=0.71,s=2.79 Fr = 0.71, \qquad s = 2.79\ \text{F}

The 80% band is the central value ±1.28 s\pm 1.28\, s; 1.281.28 is the 90th percentile of the standard normal distribution, so 10% of outcomes fall below the band and 10% above it. Here 1.28×2.79=3.61.28 \times 2.79 = 3.6 F. For 2026, with 64.35 F on Sept 29: 60.9±3.660.9 \pm 3.6 F (reference run: 57.3-64.5 F).

The app does the same for every day: the 1995-2025 climatology (mean, 10th and 90th percentile for each day of the year) and the regression slope and residual SD for each month and each lag of 1-30 days, computed from GLSEA when the data are loaded. The Water conditions screen shows the projection inside this band.

Source: SPEC 5.2; data/golden/engine_golden.json (regression); reference/python/temps.py. Engine: linearFit, band80, Z80 in waterTemp.ts.

Known bias

The model runs warm in strong wind. A hindcast of Sept 18-29, 2026 was up to 2.6 F warm during a three-day northeast blow and 0.6 F warm at the end (SPEC 5.2). The coefficients were fitted on October days only. Task 1.8 refits k0k_0 and kwk_w by month on full-year data.

Calculator

Water temperature projection

Runs the app's engine in this browser: projectWaterTemp (packages/engine/src/waterTemp.ts).

Lake St. Clair coefficients (lake record): k0 = 0.0135 per day, kw = 0.0058 per day per mph. Each row is one day of weather; the last column is the lake temperature the next morning. Dates follow the golden run.

DayAir high, FAir low, FWind, mphLake next morning, F
2026-09-3064.29
2026-10-0164.60
2026-10-0264.32
2026-10-0363.76
2026-10-0463.45
2026-10-0562.85
2026-10-0662.14
After 7 days62.14 F
Change-2.20 F
Gap closed on day 16.0%
Table of values
Lake temperature each morning and daily mean air temperature
Days from the startLake, each morningAir, daily mean
day 064.3 F63.4 F
day 164.3 F69.5 F
day 264.6 F61.0 F
day 364.3 F55.0 F
day 463.8 F58.5 F
day 563.4 F53.5 F
day 662.9 F51.0 F
day 762.1 F-

Constants

ConstantValueIn the codeBasis
Base exchange rate k00.0135 per dayheat_k0_per_day (lake record)Fit, 299 October days 2014-2025 (reference/python/wx_analysis.py)
Wind term kw0.0058 per day per mphheat_kw_per_day_mph (lake record)Same fit; task 1.8 refits by month
Wind past the forecast8 mphDEFAULT_DAY_WIND_MPH (waterTemp.ts)Starting value: near the October mean
Normal-distribution z for 80%1.28Z80 (waterTemp.ts)90th percentile of the standard normal (1.2816), rounded
Regression for Oct 7-116.55 + 0.844 x; s = 2.79 Fregression (data/golden)GLSEA 1995-2025, 31 years
Normals stationUSW00014804normals_station (lake record)NOAA NCEI 1991-2020 daily normals

Sources

  • NOAA GLERL, Great Lakes Surface Environmental Analysis (GLSEA), daily lake-average temperature, 1995-2026.
  • Iowa Environmental Mesonet, Selfridge ANGB (KMTC) daily summaries; National Weather Service forecasts; NOAA NCEI U.S. Climate Normals 1991-2020.
  • Edinger, J.E., Duttweiler, D.W. and Geyer, J.C. (1968). The response of water temperatures to meteorological conditions. Water Resources Research 4: 1137-1143.
  • Links: References.