Question on SUEWS sensitivity to vegetation parameters

Hi! Thanks for adding me to the forum :slight_smile:

I’m setting up an impact study (following the SUEWS Tutorial 3.1.3) to investigate the effects of various vegetation-related parameters on SUEWS output. So far, I’ve modified surface fractions, LAImax, maxconductance and waterdist parameters. I’m working with input data from Gothenburg.

As expected, I see a large effect of changing surface cover fractions on the output energy fluxes. Increasing tree cover from 5% to 30% increases QE by over 100 W m⁻² on warm days - makes sense. However, changing LAImax for trees (between 2.5 and 7) appears to have a negligible effect, with ΔQE under 0.01 W m⁻² even at a tree cover of 50%.

I’m new to both Python and SUEWS, so I assume that I either made a coding mistake or misunderstand the model behavior :slight_smile: I’ll be grateful for any tips.

Thanks in advance!

Janka

Welcome to the forum, Janka! This is a good question — the near-zero LAI sensitivity does look suspicious.

Your surface fraction results are behaving exactly as expected, which tells us the basic setup is sound. The LAI issue is worth debugging though, because SUEWS uses LAI to scale canopy conductance via the Jarvis-type stomatal model, so a change from 2.5 to 7 should produce a noticeable difference in QE during the growing season.

A few things to check:

  1. Time period — what months are you running? If the simulation covers winter or early spring, the model’s LAI profile may not have reached the maximum values you set. LAImax only matters during peak growing season. Try comparing runs for July–August specifically.

  2. LAI profile propagation — after changing LAImax, check that the daily LAI values in the output actually differ between your runs. If they look identical, the parameter change may not be reaching the model correctly.

  3. Moisture availability — if soil moisture is very low, the stomatal conductance gets clamped regardless of LAI. Check whether your runs are hitting moisture stress limits, especially if the Gothenburg input data covers a dry period.

  4. Other conductance controls — since you also modified maxconductance, double-check that those changes aren’t interacting with the LAI experiment. Running one parameter at a time makes it easier to isolate effects.

To help us dig further, could you share:

  • Your SUEWS version — run supy.show_version() in your notebook (that’s a SuPy utility function)
  • The full config.yaml or equivalent notebook setup you’re using
  • Which months/year the simulation covers

That way we can reproduce what you’re seeing and pinpoint where the LAI change drops out.

Hi,
Many thanks for such a quick and detailed reply! To answer your questions:

  1. I’m running two full years, 2017-2018. For plotting and statistics I’m analysing two periods in the summer of 2018 (warm and wet, hot and dry). LAI has near-zero effects in both (and all other periods I tested).

  2. Output LAI values change according to the LAImax I set (different in each “grid”), nothing suspicious there as far as I can see.

  3. That was my first thought, since I knew that LAI was used in gs calculations. But the effect is near-zero even after precipitation events. Could you clarify how I can check if my runs are hitting moisture stress limits?

  4. I’m modifying one parameter at a time (except when necessary, like when increasing tree cover I decrease paved surface cover accordingly) and leave the other parameters as default.

I’m using SuPy 2025.11.20rc1. Attaching my weather and yaml file - it’s data for a single grid (grid 7) cut out from a multigrid study area, since the impact study itself uses the grid structure. If it helps I can also share my code.

Many thanks again!

kv7.yml (80.1 KB)

kv_2017_data_60.txt (2.9 MB)

Thanks for the detailed follow-up and for sharing your files, Janka — that made it much easier to track down what’s going on.

The good news is there’s nothing wrong with your code or setup. The near-zero LAI sensitivity is actually expected behaviour given how SUEWS computes surface conductance. Here’s why.

How LAI enters the conductance calculation

The Jarvis-type surface resistance model computes a LAI factor (g_\mathrm{LAI}) as:

g_\mathrm{LAI} = \sum_{v} \left[ f_v \cdot \frac{\mathrm{LAI}_v}{\mathrm{LAI}_{\max,v}} \cdot g_{s,\max,v} \right]

where f_v is the surface fraction, \mathrm{LAI}_v is the daily LAI, \mathrm{LAI}_{\max,v} is the configured maximum LAI, and g_{s,\max,v} is MaxConductance for each vegetation type v.

The key is the \mathrm{LAI}/\mathrm{LAI}_{\max} ratio. During peak summer, the phenology model grows LAI up to \mathrm{LAI}_{\max} — which you confirmed is happening — so the ratio becomes:

\frac{\mathrm{LAI}_{\max}}{\mathrm{LAI}_{\max}} = 1.0

regardless of what value you set for \mathrm{LAI}_{\max}. The numerator and denominator cancel out.

In other words, \mathrm{LAI}_{\max} in SUEWS doesn’t control how much a tree transpires at full canopy — it controls the timing of the seasonal cycle (when the canopy reaches “fully developed”). The actual magnitude of transpiration at full development is controlled by MaxConductance (g_{s,\max}).

Why surface fractions work but LAImax doesn’t

Surface fractions (f_v) enter the same formula as a direct multiplier with no normalisation, so they scale g_\mathrm{LAI} linearly — exactly what you observed with the 100+ W m⁻² QE response.

What to use instead

For your impact study, if you want to simulate “denser canopy → more transpiration”, vary MaxConductance rather than LAImax. In your config, these are set per vegetation type:

  • Evergreen trees: maxconductance: 1.7 mm s⁻¹
  • Deciduous trees: maxconductance: 3.1 mm s⁻¹
  • Grass: maxconductance: 3.7 mm s⁻¹

Increasing maxconductance for trees will directly increase canopy conductance and hence QE — no normalisation to cancel the signal.

The small residual (~0.01 W m⁻²) you saw comes from transition periods in early summer where the LAI growth trajectory differs slightly between runs, but this vanishes once LAI reaches its configured maximum.

Hope this helps!

1 Like

Thanks so much for taking the time to explain this, Ting! That is really helpful, and reassuring to know I wasn’t running a broken code :slight_smile:

Modifying gs max gives a QE response of roughly 5–30 W m⁻² over the periods I’m testing. That’s noticeably weaker than the response to changing tree cover, which makes sense, I think.

In terms of other parameters to explore: besides tree cover, LAImax and gs max, I’ve started looking at water distribution and some soil properties (e.g. soil depth and water storage capacity). If you have recommendations for other parameters that tend to be influence the cooling or water use, I’d be very interested to hear. Do I understand correctly that tree height doesn’t directly influence canopy transpiration?

I’ve been discussing QE responses here, but actually my goal is to evaluate the cooling efficiency of different urban vegetation types. Fredrik mentioned that T2 could be somewhat problematic to model, so if you have any advice on how best to configure or interpret the model for this purpose, I’d really appreciate any tips. (Edit: I see Fredrik has already asked a separate question about it:)

Thanks again!

Glad to hear the MaxConductance approach is working — and that the magnitude makes physical sense compared to the surface fraction response.

Other parameters worth exploring

For cooling and water use, the most influential parameters in SUEWS tend to be:

  • Surface fractions (which you’ve already tested — this is the dominant lever)
  • MaxConductance (g_{s,\max}) — now confirmed working for you
  • Soil storage capacity (soildepth, soilstorecap) — controls how long the soil can sustain transpiration between rain events, so it shapes the dry-spell response rather than peak cooling
  • Water distribution (waterdist) — governs how rainfall/irrigation runoff is redistributed between surfaces, which affects soil moisture availability
  • Irrigation parameters — if you’re comparing irrigated vs non-irrigated green infrastructure scenarios

On tree height: you’re right that it doesn’t directly affect stomatal conductance or the g_\mathrm{LAI} calculation. It enters SUEWS indirectly through the roughness length (z_{0m}) and displacement height (z_d), which determine the aerodynamic resistance R_A. In the Penman-Monteith equation:

Q_E = \frac{s \cdot Q_{n,e} + \rho c_p \cdot \mathrm{VPD} / R_A}{s + \gamma\left(1 + R_S / R_A\right)}

a lower R_A (from taller roughness elements) increases the VPD-driven term in the numerator and also changes the R_S/R_A balance in the denominator. So taller trees can modestly increase QE, but the effect is secondary compared to g_{s,\max} and surface fractions.

On T2 and cooling efficiency

I’ve seen Fredrik’s separate post about T2 — I’ll reply there with more detail on the physics settings and profile scheme configuration. The short version: T2 sensitivity in SUEWS depends heavily on which RSL (roughness sub-layer) method you’re using (rslmethod) and how the vertical temperature profile is constructed. Your config uses rslmethod: 2, which is the more physically-based option, but there are some important considerations for intra-urban comparisons that I’ll cover in that thread.

1 Like

Many thanks again. It seems I’m looking at the right parameters then!

Just a follow-up question about:

Can you elaborate on how to check this? Thanks.

In the SUEWS hourly output, check SMD (soil moisture deficit, in mm) — when it’s high, the soil is dry and transpiration is limited. You can also look at g_smd in the conductance diagnostics, which is the soil moisture stress factor (0–1). When g_smd drops close to zero, moisture is the binding constraint on conductance regardless of other parameters.

Comparing SMD time series between your runs will show whether soil moisture is diverging or staying similar.

Thanks! I’ve been plotting SMD already, but haven’t checked the g_smd yet - will do.

1 Like

Just a follow up question on this - what does LAImax actually control then? There must be a reason LAImax has three different values for the three vegetation types instead of a single relative parameter defining whether LAImax is reached or not. In your first answer you mentioned that a change from 2.5 to 7 should produce a noticeable difference in QE during the growing season. Still not sure how to interprete the results.

Good question — let me clarify what LAImax actually controls in the model. My earlier comment that a change from 2.5 to 7 “should produce a noticeable difference” was loosely worded — I was thinking about the growth dynamics, but the actual effect on QE is negligible for the reasons below.

What controls seasonal timing

The timing of the seasonal LAI cycle is driven by the GDD (growing degree day) parameters: BaseT, GDDFull, SDDFull, and the LAIPower growth/senescence coefficients. These determine when leaves start growing, how fast, and when senescence begins. LAImax doesn’t appear in the growth equation itself.

What LAImax does is act as a clamp — the phenology model computes a daily LAI increment from temperature and the previous day’s LAI, and then the result is clipped to stay within [\mathrm{LAI}_{\min},\, \mathrm{LAI}_{\max}]. Each vegetation type has different bounds because they have genuinely different leaf area ranges (evergreen trees: 4.0–5.1, deciduous trees: 1.0–5.5, grass: 1.6–5.9 in your config).

Why the clamp doesn’t propagate to QE

LAImax also appears as a normalisation constant in the conductance formula:

g_\mathrm{LAI} = \sum_v \left[ f_v \cdot \frac{\mathrm{LAI}_v}{\mathrm{LAI}_{\max,v}} \cdot g_{s,\max,v} \right]

These two roles cancel: a higher LAImax lets LAI grow to a higher value, but that higher value is divided by the same higher LAImax. At peak summer when LAI has reached its clamp, the ratio is always 1.0. During the growth phase there’s a marginal difference in how many days LAI takes to hit the ceiling, but this is a small effect — which explains the ~0.01 W m⁻² residual you observed.

So in practice, LAImax is effectively a rescaler with minimal impact on model outputs. The real levers remain MaxConductance for transpiration magnitude, surface fractions for vegetated area, and the GDD parameters for seasonal timing.

A follow-up question on this topic. So LAI does NOT have an effect radiation (as stated in some of the publications, e.g. Omvidar et al.) but it just is used to shift albedo for e.g. grass from alb_min and alb_max? Thus, we do not see any changes in Qstar when we change LAI_max?

Shifting albedo is how LAI affects radiation in SUEWS — they’re the same thing. So yes, LAI does affect Q* as Omidvar et al. describe.

The reason you don’t see Q* changes when varying LAImax: it only normalises the interpolation rate between AlbMin and AlbMax. The bounds themselves stay fixed, so at peak season the result is the same.

Aaand one more follow-up question, as I’m learning a lot from the answers :slight_smile:

The parameter that gives by far the strongest response is tree cover. I modify it by changing the relevant sfr_surf in df_state_init, in the same way that albedo is modified in the tutorial. Specifically, I replace trees with paved surfaces and vice versa. Is this the correct approach? Could it cause problems that other parameters derived from the input surface model data (e.g. roughness parameters) remain unchanged while I modify the surface cover fractions?

It depends on which roughness scheme you’re using (RoughLenMomMethod in the config):

  • Method 1: z0 and zd are fixed inputs — changing sfr_surf won’t update them automatically
  • Methods 2–4: z0 and zd are recalculated from the surface fractions internally

If you’re using method 1, you’d need to update the roughness parameters manually when changing surface cover. With methods 2–4, your current approach is fine.

If this wasn’t clear from the documentation, let us know which part was confusing — that helps us improve it.

1 Like