Skip to content

Conversation

@zhongwangwei
Copy link
Contributor

Revise canopy interception schemes

Fully revised CLM4.5, CLM5, Noah-MP, MATSIRO, VIC, and JULES canopy interception schemes for improved physical consistency and phase conservation. Major changes include: (1) strict separation and conservation of rain/snow storage and release, (2) improved drainage and unloading logic based on official model documentation and source code, (3) enhanced documentation and bug fixes for mass balance and storage updates, and (4) addition of a minimum precipitation threshold for numerical stability. These updates address previous issues with phase change handling and ensure closer alignment with reference model implementations.
Introduced the MaxWaterInt variable to the list of local variables in the leaf interception subroutine, likely in preparation for additional logic or calculations involving maximum water interception.
Introduce interception balance validation and multiple scheme fixes to prevent canopy water mass-balance drifts and improve debug diagnostics.

- Add INTERCEPTION_BALANCE_TOL parameter and new check_interception_balance(scheme_name, ...) subroutine that validates component consistency (ldew == ldew_rain+ldew_snow), non-negativity, and flux consistency (qintr == qintr_rain+qintr_snow). Called in CoLMDEBUG blocks for CoLM2014, CoLM202x, CLM4, CLM5, NoahMP, MATSIRO, VIC, and JULES.
- Ensure ldew is resynchronized with its rain/snow components at entry (ldew = ldew_rain + ldew_snow) for multiple schemes to avoid initialization/restart inconsistencies.
- Adopt CoLM2014 pattern of keeping ldew as the sum of components after updates; remove duplicate/incorrect in-place ldew arithmetic in several schemes and update component-wise additions where appropriate.
- NoahMP: release canopy water separately by phase and zero per-phase storages when vegetation disappears to preserve phase conservation.
- VIC: fix per-vegetation ↔ grid-scale conversions by consistently using sigf_safe, scale throughfall (tex_*) appropriately, and adjust throughfall/excess handling when snow melts.
- JULES: make snow unloading continuous (not conditional on snowfall), drain excess after phase change (cap rain/snow capacities), and include drained xsc contributions in ground precipitation fluxes.
- MATSIRO & other scheme-specific corrections: resync ldew after weighted updates and remove duplicate updates.

These changes are targeted at improving numerical robustness and making CoLMDEBUG checks meaningful by catching and reporting interception bookkeeping errors early.
Revise MOD_LeafInterception.F90 to correctly handle canopy interception and preserve rain/snow phase conservation. Changes: separate handling of ldew_rain/ldew_snow and preserve phase when vegetation disappears; refactor interception math (ppi/ppl, xsc_rain/xsc_snow, tti/tex calculation) and compute pg and qintr from separated components; add post-interception drainage to clamp ldew_rain and ldew_snow to canopy capacities; add bounds check for can_ratio (clamp to [0,1]) and a debug consistency check; update background unloading rate to JULES value (2.31e-6 s^-1). These fixes prevent unphysical phase conversion and overflow in discrete timesteps and improve physical consistency of throughfall/interception calculations.
Clamp negative precipitation inputs and harden JULES canopy interception logic. Changes include: non-negative clamping of rain/snow/irrigation inputs to avoid mass-balance failures; explicit separation and preservation of liquid/solid canopy storage (ldew_rain / ldew_snow) and updated comment clarifying ldew_snow is frozen water; apply vegetation fraction (sigf) scaling to operate physics on vegetated area and rescale states back to grid-average; compute grid-scale precipitation/storage references (p0_l, w_l) and robust mass-balance checks; ensure continuous snow unloading (background + melt) independent of current snowfall; refine melt/freeze rate math and drain excess after phase change; small refactors and numeric stability fixes (epsilon, tiny, safe sigf). Also added revision history notes and various comment fixes.
Implement JULES-consistent canopy snow behavior: add wind-dependent snow unloading (constant + wind term), clamp negative canopy state, and compute melt/freezing using precomputed dimensionless factors to avoid large intermediate products. Annotate unused/readonly interface args and unit comments, make small numerical and type fixes (use r8 literals, EPSILON), limit EXP() argument to avoid underflow, and allow negative phase-separated interception rates to represent canopy release. Also ensure non-vegetated branch clamps raw precipitation before adding stored water to preserve mass balance.
Add branches for DEF_Interception_scheme == 7 (JULES) and == 8 (CoLM202x) in MOD_LeafTemperaturePC.F90. Each branch applies the same evaporation logic used for other schemes: reduce ldew_rain by evplwet*deltim when possible, otherwise zero ldew_rain and subtract evaporation from ldew_snow, then update ldew. This prevents an abort for these scheme values and ensures consistent interception evaporation behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant