SWATGenXSWATGenX
ResearchDocs
Open Explorer Work with us

SWAT+ methods — water temperature

Channel water temperature in SWAT+: what the model computes

Every SWATGenX model runs the SWAT+ channel water-temperature model on its default parameters. In the engine we ship, each reach computes its own heat balance and passes the result to the reach below. This page explains what the model calculates, what our engine corrects in it, and what it does not do.

▶ 1:29 — how SWAT+ computes channel water temperature

Schematic: one channel reach mixes its inflows, exchanges heat with the atmosphere, and moves toward the equilibrium temperature. The water and its computed temperature flow on to the reach below.SnowmeltSurface runoffLateral flowGroundwaterUpstream channelsland inflows: a temperatureestimated from airupstream channels: thetemperature computed thereReachheat balance, each dayAtmospheresun (shaded), long-wave, dew point, windwater_tempdaily · monthly · yearlywater flows onits temperature tooReach belowreceives the computed temperature

A schematic of the method, not model output.

What the model calculates

For each channel and each day, the engine:

  1. Combines the water entering the reach. Water from the land around the reach arrives at a temperature estimated from air temperature. Water from the channels above it arrives at the temperature computed for them, mixed in proportion to their flows; where no channel above it is flowing, the air-temperature estimate stands in.
  2. Finds the equilibrium temperature the water would reach with the atmosphere, from incoming short-wave radiation (reduced by a shade factor), long-wave radiation corrected for cloud, dew point, and a heat-exchange coefficient that rises with wind speed.
  3. Moves the water toward that equilibrium over the time it takes to travel through the reach.

The result is written to each channel's daily, monthly and yearly output. In the text files it is the water_temp column. In NetCDF output it is the variable v59, labelled water_temp. v58, labelled temp_out (the outflow temperature), holds the same value.

How the engine computes it

Each step links to the line of the engine source that performs it, in engine version ship/v1.0-51.5, the version SWATGenX runs. The source is on our public engine fork.

  • A default from air temperature. Where nothing better is available, water temperature is 5.0 + 0.75 × the day's mean air temperature (°C). This is the equation SWAT has long used, developed by Stefan and Preud'homme (1993). source
  • The equilibrium temperature, which the water would reach if it exchanged heat with the air long enough: Te = Td + Hs / K + (Ha − 305.5 − 4.48 Td) / K. Here:
    • Td is the dew point, capped at the air temperature;
    • Hs is the incoming short-wave radiation after shading;
    • Ha is the long-wave radiation from the atmosphere, corrected for cloud;
    • K is a heat-exchange coefficient that rises with wind speed u through the wind function 9.2 + 0.46 u2 (Edinger et al., 1974).

    The approach, with its shade factor, is described by Noa-Yarasca, Babbar-Sebens and Jordan (2023). source

  • Relaxation toward it. Over the reach's travel time t, the water moves toward Te by the exact solution T = Te + (T0 − Te) e−m, with m = K t / (ρ c d). Here ρ c is the heat capacity of water per unit volume, and d is the flow depth, at least 0.1 m. The result always lies between the starting temperature T0 and Te, whatever the flow. source
  • A floor just above freezing. The result is kept at 0.001 °C or above, so ice is not represented. source

Whose model it is

The temperature model is upstream SWAT+ work, described by Peters et al. (2025). The component-mixing model is by Kristin Peters (source), and the equilibrium-temperature heat exchange by Efrain Noa-Yarasca (source; Noa-Yarasca et al., 2023), with the wind function from Edinger et al. (1974). We ship it as part of the SWAT+ engine we build and maintain.

What our engine corrects

Our engine corrects three issues in the temperature code; each is described in the engine source.

  • The result never reached the output. Two later steps overwrote the heat balance with a simple air-temperature estimate, so the reported temperature was that estimate. From engine version v1.0-50, the reported temperature is the heat-balance result.
  • An unstable calculation step. The step toward equilibrium could overshoot when flow was low, and the channel storage temperature reached more than 1,000 °C. We replaced it with the exact solution, which is stable at any flow.
  • The temperature stayed in its reach. The reach below received the air-temperature estimate, not the temperature computed upstream. In engine version v1.0-51.2 and later, which SWATGenX has run since 2026-10-12, each reach passes the temperature it computes to the reach below.

On a 2,058-channel model of the White River in Michigan, the first two fixes took the number of channel-days above 60 °C in the storage temperature from 55,113 to zero. They also widened the July spread of outflow temperature between reaches (the interquartile range) from 0.26 °F (0.15 °C) to 8.1 °F (4.5 °C).

Models run on an engine older than v1.0-50 report the air-temperature estimate under the same column name, and models run on an engine older than v1.0-51.2 pass that estimate to the reach below.

How engine releases and model builds are checked: quality checks.

What the model does not do

  • Claim accuracy. We have not validated the temperature output for general use, and we make no claim about how closely it matches a particular river.
  • Use a calibrated setup. Every model runs the default temperature parameters. Model calibration is against streamflow.
  • Link to groundwater. The temperature of groundwater inflow does not come from an aquifer model.
  • Model reservoirs or ice. There is no reservoir or impoundment temperature, and the model floors water temperature just above 0 °C, so it does not represent ice.

For the streamflow side of future climate, see climate change and watershed flow.

Questions

Is the water temperature output validated against measurements?

No. Every model runs the default temperature parameters. We have not validated the output for general use, and we make no claim about how closely it matches a particular river.

Which output holds water temperature?

The water_temp column of each channel's daily, monthly and yearly output files. In NetCDF output it is variable v59, labelled water_temp. v58, labelled temp_out (the outflow temperature), holds the same value.

Does the temperature computed for one reach pass to the reach below?

Yes, in engine version v1.0-51.2 and later, which SWATGenX has run since 2026-10-12. Each reach's outflow carries the temperature computed for it, and a reach fed by several channels mixes their temperatures in proportion to their flows. Models run on an older engine pass an air-temperature estimate to the reach below instead.

Does the model represent ice, or the temperature of lakes and reservoirs?

No. Channel water temperature is kept at 0.001 °C or above, so ice is not represented, and reservoirs and impoundments have no temperature model.

References

  1. Peters, K., Kiesel, J., Oswald, I., Guse, B., Noa-Yarasca, E., Arnold, J.G., Osorio Leyton, J.M., Bieger, K. and Fohrer, N. (2025). The integration of hydrological and heat exchange processes improves stream temperature simulations in an ecohydrological model. Hydrological Processes 39(4), e70059. doi.org/10.1002/hyp.70059
  2. Edinger, J.E., Brady, D.K. and Geyer, J.C. (1974). Heat exchange and transport in the environment. Report No. 14. osti.gov/biblio/5874507
  3. Noa-Yarasca, E., Babbar-Sebens, M. and Jordan, C. (2023). An improved model of shade-affected stream temperature in Soil & Water Assessment Tool. Hydrology and Earth System Sciences 27, 739–759. doi.org/10.5194/hess-27-739-2023
  4. Stefan, H.G. and Preud'homme, E.B. (1993). Stream temperature estimation from air temperature. JAWRA Journal of the American Water Resources Association 29, 27–45. doi.org/10.1111/j.1752-1688.1993.tb01502.x