CH-Earth / summa

Structure for Unifying Multiple Modeling Alternatives:
http://www.ral.ucar.edu/projects/summa
GNU General Public License v3.0
80 stars 105 forks source link

Revisit Noah-MP phenology computations - SAI/LAI interpolation #479

Open wknoben opened 3 years ago

wknoben commented 3 years ago

In particular the current checks if either SAI or LAI are < 0.05 can lead to odd-looking behaviour. If this is the case, these values are set to 0 (to avoid computational issues) which can lead to strange jumps in SAI/LAI/VAI values.

image

https://github.com/NCAR/summa/blob/372c3fbeb3825e3b3d635461a8e552f9f0895aec/build/source/noah-mp/module_sf_noahmplsm.F#L571 https://github.com/NCAR/summa/blob/372c3fbeb3825e3b3d635461a8e552f9f0895aec/build/source/noah-mp/module_sf_noahmplsm.F#L572

wknoben commented 3 years ago

Adding to the above, the check that sets LAI to 0 if SAI is 0 (no leaves if no stem) conceptually makes sense but leads to odd situations when combined with the check that sets SAI to 0 when SAI < 0.05. See attached figure where vegetation cover drops to zero for a few days, as a consequence of SAI being ~0.04 during this period.

image

This has rather odd consequences for variables scalarTotalET and scalarNetRadiation which are incorrectly set to zero during the "no vegetation" period (see figure). debug_zero_lai_radiation_terms

This is incorrect because scalarGroundEvaporation, and scalarLWNetGround and scalarGroundAbsorbedSolar respectively, are not zero and this should be reflected in the total and net variables:

https://github.com/NCAR/summa/blob/372c3fbeb3825e3b3d635461a8e552f9f0895aec/build/source/engine/vegNrgFlux.f90#L1441 https://github.com/NCAR/summa/blob/372c3fbeb3825e3b3d635461a8e552f9f0895aec/build/source/engine/vegNrgFlux.f90#L1442

Print statements immediately after these lines in vegNrgFlux suggest that the values are calculated correctly during regular runs and that scalarTotalET and scalarNetRadiation are forced to 0 somewhere outside the vegNrgFlux routine. So far I've not been able to debug this further.

2013  3  3  0  0
[...]
 scalarGroundEvaporation   =   -1.0814032319471842E-005
 scalarCanopyEvaporation   =   -2.7013861726593477E-006
 scalarCanopyTranspiration =   -6.2494890050882896E-009
 scalarTotalET             =   -1.3521667981136277E-005

 scalarGroundEvaporation   =   -1.2802567131006620E-005
 scalarCanopyEvaporation   =    0.0000000000000000     
 scalarCanopyTranspiration =    0.0000000000000000     
 scalarTotalET             =   -1.2802567131006620E-005

 scalarGroundEvaporation   =   -1.0284009929032995E-005
 scalarCanopyEvaporation   =    0.0000000000000000     
 scalarCanopyTranspiration =    0.0000000000000000     
 scalarTotalET             =   -1.0284009929032995E-005

Speculation

Currently speculating that this issue somehow relates to the computeVegFlux variable, which is set to False in vegPhenlgy if VAI < 0.05: https://github.com/NCAR/summa/blob/372c3fbeb3825e3b3d635461a8e552f9f0895aec/build/source/engine/vegPhenlgy.f90#L184

computeVegFlux is used multiple times throughout the code base to skip certain parts of the routine if no vegetation is exposed to the atmosphere. Possibly a consequence of skipping some of these routines is that the scalarNetRadiation and scalarTotalET variables are not correctly written into the output files. Unsure if this line of reasoning is correct.

Possible workaround

Disabling the PHENOLOGY lines that force SAI or LAI to 0 if below 0.05 seems to provide a temporary workaround. Extensive testing currently incomplete:

debug_zero_lai_radiation_terms_workaround

wknoben commented 3 years ago

Likely related to #327