In my simulation, the LAI for grass, evergreen trees and deciduous trees remains constant throughout the year, while MERRA2 shows strong seasonal variability. I have attached the LAI plot and LAI parameter file used in the model.
Could you please advise on the possible reason for this behaviour and how it can be corrected?
In addition, is it possible to prescribe observed satellite-based LAI as a time-varying input in SUEWS? If so, what is the recommended workflow, and does this input override the internal LAI calculation, or is it used only for calibration?
@Sue.Grimmond Thank you for the information. I attempted to calibrate the LAI parameters with MERRA-2 LAI, but I realised that for my site, LAI is not solely a function of temperature, particularly during the summer season, as shown in the figure.
I then tried with the MERRA-2 LAI as input in my forcing file. However, the model still appears to simulate the LAI despite it being provided as input. It would be really helpful if you could kindly advise whether there is any specific configuration that I may need to adjust in the configuration file?
Hi @Divya — thanks for the clear figure. Quick clarification before I reply properly: what does “aTW” stand for in your legend (Winter/Monsoon/Combined aTW)? And roughly which region is the site in? That will help me tailor the guidance.
While you dig up the “aTW” definition, let me address the two substantive points directly — your diagnosis is correct on both counts.
On the physics: the LAI parameterisation in SUEWS is purely thermally driven. It uses growing-degree-day (GDD) and senescence-degree-day (SDD) thresholds on daily mean air temperature, with no precipitation or moisture term anywhere in the equations. So for a site where the annual LAI cycle is controlled by rainfall rather than heat, the scheme cannot reproduce that shape, regardless of how you tune BaseT / GDDFull / SDDFull / LAIPower.
This limitation is documented explicitly in Omidvar et al. (2022), GMD, 15, 3041–3078. Appendix D is particularly worth reading for your case — it contrasts two FLUXNET sites side by side:
Fig. D1 (US-MMS, deciduous broadleaf forest) — precipitation accumulates steadily all year; LAI tracks air temperature cleanly. The thermal scheme works here.
Fig. D2 (US-SRG, grassland) — precipitation is near-zero Jan–Jun, then jumps with the monsoon in July; LAI stays flat through the warm dry spring and only rises after the monsoon rainfall arrives. The thermal scheme cannot capture this.
Your MERRA-2 curve has the US-SRG signature rather than the US-MMS one, so these two figures essentially pre-diagnose your case — and they make it clear that what you are seeing is a known structural limitation of the current scheme, not a calibration issue on your side.
On the forcing side: you are also right, and this one is on us. There is a drift between the documentation (which still lists lai as an optional forcing column) and the current code (which no longer exposes the switch that would let the model consume a prescribed LAI). We will fix that — either by restoring the observed-LAI path or by correcting the docs — and I will link the tracking issue here once it is up.
Thank you for the response and clarification. aTW is an asymmetric Tukey window.
I was trying to calibrate using the methodology adopted by Omidvar et al. (2022) by fitting the LAI with an asymmetric Tukey window. Since I was seeing two LAI cycles, I tried to do two sets of calibrations for each cycle, but it was not working.
Then I checked the temperature profile and found that LAI is not solely dependent on temperature at this site. Also, my site is in Delhi, India.
Quick follow-up. The fix for the silent-LAI issue has now landed on master and is available on TestPyPI if you’d like to try it ahead of the next release:
Forcing contract for the lai column under laimethod: 0:
Every timestep must be >= 0. Missing values, NaN, and the -999 sentinel are all rejected at pre-flight — the run will not start if any row is invalid, so gap-fill your MERRA-2 series first.
lai = 0 is accepted as a genuine observation. At runtime it is clamped up to each vegetation class’s laimin; if you need a true zero honoured (e.g. complete winter dieback), set that class’s laimin to zero in the site config.
The scalar lai column is applied uniformly to all three vegetation classes (grass / evergreen / deciduous). Per-class observed LAI is a separate enhancement.
Apologies — the TypeError you’re hitting is YAML schema drift between an earlier release and current master, not an issue with your file. Between v2026.4.3 and 2026.4.18.dev0 we tightened a few data-model internals without a compatibility guard. Tracked as #1301; the YAML-upgrade converter is #1304.
Stable path for now — whenever you’re on TestPyPI or a dev build, start from the sample config bundled with your installed supy version and copy your site values in. That YAML always matches the validator you have:
Thanks for surfacing this. The migration path turns out to need broader work than we initially scoped, so we’re going to take a bit longer to land the converter properly rather than push out a partial fix.
In the meantime, the workaround we discussed earlier should keep you moving: start from the current release’s sample_config.yml and port your site-specific values across — forcing path, lat/lon, surface fractions, building archetype properties, and so on. The structural shape will be correct under the current validator, so you only need to copy over the values that are genuinely yours.
I’ll come back here as soon as the converter is ready so you can run it directly on your 2026.1.28 YAML.