Skip to content

wet canopy fraction is incorrectly a function of vegetation fraction #91

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
barlage opened this issue Jun 7, 2023 · 8 comments
Open
Labels
bug Something isn't working

Comments

@barlage
Copy link
Collaborator

barlage commented Jun 7, 2023

The partitioning of precipitation in precip_heat/CanopyWaterIntercept is scaled by fveg/VegFrac early in the module, but maxliq/CanopyLiqWaterMax (and similar for snow) are not scaled by fveg/VegFrac. This causes a dependence of fwet/CanopyWetFrac on vegetation fraction. I see two possible solutions:

  1. the easy one is to scale capacity by vegetation fraction (I have tested this and it does solve the issue)
  2. multiply by vegetation fraction later when water is input to the soil

I like solution 2 better since it is clearer to understand and the canopy water would be a physical value that is actually on the leaf and not spread across the grid.

@cenlinhe
Copy link
Collaborator

I have fixed this issue using the easy quick solution in this commit in release-v4.5-WRF branch: 0fd17e5
The fix in v5.0 (included in release-v5.0.1) is in this commit: a7dd399

jesusff added a commit to CORDEX-WRF-community/noahmp that referenced this issue Oct 19, 2023
…-devel

To include fixes for NCAR#91, NCAR#92, SLUCM ground flux and snow combination layer index
weiwangncar pushed a commit to wrf-model/WRF that referenced this issue Jan 13, 2024
TYPE: bug fix

KEYWORDS: Noah-MP, snow combine, vegetation fraction scaling, urban ground heat flux

SOURCE: Cenlin He (NCAR/RAL)

DESCRIPTION OF CHANGES:
There are a few bug fixes for Noah-MP related processes:
(1) the snow layer index in snow COMBINE module was wrong, causing model crash when snow layer changes by more than 1 layer within one timestep; This has been fixed by using the correct layer index. 
(2) the ground heat flux sign in Noah-MP column model (positive: downward) is inconsistent with that in urban canopy model (positive: upward), leading to wrong diagnostic grid-mean ground heat flux calculation for urban grid. This only affects the diagnostic value for output. See this issue: #1921 and NCAR/hrldas#114
(3) there is a bug in vegetation fraction (FVEG) scaling for stomata resistance calculation (NCAR/noahmp#92) and canopy interception calculation (NCAR/noahmp#91).

LIST OF MODIFIED FILES: list of changed files (use `git diff --name-status master` to get formatted list):
phys/noahmp/src/module_sf_noahmplsm.F
phys/noahmp/src/module_sf_noahmpdrv.F

TESTS CONDUCTED: 
1. Tested successfully in NCAR Cheyenne HPC for 13-km run over the entire CONUS region
2. The Jenkins tests are all passing.

RELEASE NOTE:  Noah-MP bug fix for snow combination, vegetation fraction scaling, and urban ground heat flux sign.
@chenghaow
Copy link

@barlage @cenlinhe I see a potential consistency issue in how CanopyLiqWaterMax and InterceptCanopyRain are calculated in src/CanopyWaterInterceptMod.F90. If the input LAI and SAI are already grid-averaged (which should be the case), then it makes sense to me that

InterceptCanopyRain = VegFrac * RainfallRefHeight * PrecipAreaFrac ! max interception capability

as VegFrac captures the LAI effect when OptDynamicVeg = 2/3/8:

VegFrac = 1.0 - exp(-0.52 * (LeafAreaIndex + StemAreaIndex))

But I'm not sure about the following line

CanopyLiqWaterMax = VegFrac * CanopyLiqHoldCap * (LeafAreaIndEff + StemAreaIndEff)

Given that CanopyLiqHoldCap is defined as "maximum intercepted liquid water per unit veg area index [mm]",

CanopyLiqHoldCap => noahmp%water%param%CanopyLiqHoldCap ,& ! in, maximum intercepted liquid water per unit veg area index [mm]

if LeafAreaIndEff and StemAreaIndEff are already grid-averages, wouldn't multiplying by another VegFrac double count the LAI effect?

@cenlinhe
Copy link
Collaborator

cenlinhe commented Apr 5, 2025

For Noah-MP, the LAI and SAI used currently in the model should be the stand-scale LAI and SAI rather than grid-mean LAI and SAI. The LAI and SAI in the parameter table is the stand-scale value (or e.g., 100% veg covered grid LAI value from remote sensing).

@chenghaow
Copy link

Thanks Cenlin. In this case, the following calculation for CanopyLiqWaterMax makes sense to me, as VegFrac scales this up to grid-mean

CanopyLiqWaterMax = VegFrac * CanopyLiqHoldCap * (LeafAreaIndEff + StemAreaIndEff)

But for InterceptCanopyRain

InterceptCanopyRain = VegFrac * RainfallRefHeight * PrecipAreaFrac ! max interception capability

which essentially is
InterceptCanopyRain = (1.0 - exp(-0.52 * (LeafAreaIndex + StemAreaIndex))) * RainfallRefHeight * PrecipAreaFrac

Then it would only apply at the stand scale, not the grid-mean, because not all precipitation would be intercepted if LAI is low. Does that mean we need to multiply it by an additional vegetation fraction?

@cenlinhe
Copy link
Collaborator

cenlinhe commented Apr 5, 2025

Hi Chenghao, this is a good point. I am not sure how the original VegFrac parameterization (1.0 - exp(-0.52 * (LeafAreaIndex + StemAreaIndex)) in the dynamic veg growth scheme was derived, in terms of whether it relates the stand-scale LAI to grid-level VegFrac or grid-level LAI to grid-level VegFrac. If it is the former, the current formulation should be fine. If it is the latter, we need to convert the stand-scale LAI in the dynamic vegetation growth scheme to grid-level LAI first inside dynamic vegetation growth scheme, and then use that VegFrac parameterization to compute grid-level VegFrac.

@barlage @tslin2 @CharlesZheZhang What do you think?

@CharlesZheZhang
Copy link
Collaborator

Hi Cenlin and Chenghao, I can find the VegFrac parameterization from the NoahMP paper in 2011 (http://dx.doi.org/10.1029/2010JD015139) Eq. 11, also see Dickinson 1984 (https://agupubs-onlinelibrary-wiley-com.cuucar.idm.oclc.org/doi/pdf/10.1029/GM029) see below definition:

Image

While by definition, LAI is the surface area of transpiring vegetation per unit vegetated area, so it has a unit of m2/m2 or no unit. So it should be in stand-scale and we use this VegFrac to scale it to model grid.
Hope this can help.

@cenlinhe
Copy link
Collaborator

cenlinhe commented Apr 6, 2025

Thank you, Zhe! Looks like in the current Noah-MP dynamic veg scheme, it follows the Dickinson 1984 definition and formulation, so the equation mentioned above by Chenghao is to connect stand-scale LAI to grid-level vegetation fraction (?). However, those empirical coefficients used in the formulation can be re-tuned or re-optimized. In fact, the whole dynamic veg scheme may need a comprehensive analysis for parameterization optimization before applying to specific cases.

@chenghaow
Copy link

Thanks, Zhe and Cenlin. I'd like to further clarify my earlier comment:

For a stand-scale LAI + SAI, the maximum intercepted liquid water should be calculated as CanopyLiqHoldCap * (LeafAreaIndEff + StemAreaIndEff). To scale this up to the grid-level, you need to multiply it by VegFrac. This is exactly what the following code does

CanopyLiqWaterMax = VegFrac * CanopyLiqHoldCap * (LeafAreaIndEff + StemAreaIndEff)

Similarly, the stand-scale intercepted rainfall should be determined by both stand-scale LAI + SAI and precipitation rate, which should be something like RainfallRefHeight * PrecipAreaFrac * Factor, where Factor is an empirical extinction term that captures the exponential decay in how interception saturates with increasing LAI + SAI. Usually we use the form (1.0 - exp(-k * (LAI + SAI))). This is similar to how VegFrac is calculated in Noah-MP. So essentially the following code

InterceptCanopyRain = VegFrac * RainfallRefHeight * PrecipAreaFrac ! max interception capability

calculates the stand-scale intercepted rainfall rate, not the grid-scale rate.

If my interpretation is correct, we likely need an additional scaling factor to convert this stand-scale InterceptCanopyRain to grid-scale...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants