diff --git a/README.md b/README.md index 993659b3..de0a3fb9 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,12 @@ -![image](https://user-images.githubusercontent.com/43385564/236596277-45d492e7-79fd-4006-83e2-3044106afd94.png) +![noahmp_logo_update](https://github.com/NCAR/noahmp/assets/43385564/1fb47fc2-99bd-4360-9ed0-6d5656c29626) [![DOI](https://zenodo.org/badge/236657733.svg)](https://zenodo.org/badge/latestdoi/236657733) -# Noah-MP Community Model Repository +# Noah-MP® Community Model Repository - -Noah-MP is a widely-used state-of-the-art land surface model used in many research and operational weather/climate models (e.g., HRLDAS, WRF, MPAS, WRF-Hydro/NWM, NOAA/UFS, NASA/LIS, etc.). +Noah-MP® is a widely-used state-of-the-art land surface model used in many research and operational weather/climate models (e.g., HRLDAS, WRF, MPAS, WRF-Hydro/NWM, NOAA/UFS, NASA/LIS, etc.). This is the official Noah-MP land surface model unified repository for code downloading and contribution. Noah-MP is a community open-source model developed with the contributions from the entire scientific community. For development, maintenance, and release of the community Noah-MP GitHub code, please contact: Cenlin He (cenlinhe@ucar.edu) and Fei Chen (feichen@ucar.edu). @@ -27,7 +26,7 @@ Technical documentation freely available at http://dx.doi.org/10.5065/ew8g-yr95 **Original Noah-MP model description paper**: Niu, G. Y., Yang, Z. L., Mitchell, K. E., Chen, F., Ek, M. B., Barlage, M., ... & Xia, Y. (2011). The community Noah land surface model with multiparameterization options (Noah‐MP): 1. Model description and evaluation with local‐scale measurements. Journal of Geophysical Research: Atmospheres, 116(D12). -**Noah-MP version 5.0 model description paper**: He, C., Valayamkunnath, P., Barlage, M., Chen, F., Gochis, D., Cabell, R., Schneider, T., Rasmussen, R., Niu, G.-Y., Yang, Z.-L., Niyogi, D., and Ek, M.: Modernizing the open-source community Noah-MP land surface model (version 5.0) with enhanced modularity, interoperability, and applicability, EGUsphere [preprint], https://doi.org/10.5194/egusphere-2023-675, 2023. +**Noah-MP version 5.0 model description paper**: He, C., Valayamkunnath, P., Barlage, M., Chen, F., Gochis, D., Cabell, R., Schneider, T., Rasmussen, R., Niu, G.-Y., Yang, Z.-L., Niyogi, D., and Ek, M.: Modernizing the open-source community Noah with multi-parameterization options (Noah-MP) land surface model (version 5.0) with enhanced modularity, interoperability, and applicability, Geosci. Model Dev., 16, 5131–5151, https://doi.org/10.5194/gmd-16-5131-2023, 2023. ## Noah-MP GitHub structure diff --git a/src/CanopyHydrologyMod.F90 b/src/CanopyHydrologyMod.F90 index 264da434..24fab3b4 100644 --- a/src/CanopyHydrologyMod.F90 +++ b/src/CanopyHydrologyMod.F90 @@ -31,6 +31,7 @@ subroutine CanopyHydrology(noahmp) LeafAreaIndEff => noahmp%energy%state%LeafAreaIndEff ,& ! in, leaf area index, after burying by snow StemAreaIndEff => noahmp%energy%state%StemAreaIndEff ,& ! in, stem area index, after burying by snow FlagFrozenCanopy => noahmp%energy%state%FlagFrozenCanopy ,& ! in, used to define latent heat pathway + VegFrac => noahmp%energy%state%VegFrac ,& ! in, greeness vegetation fraction SnowfallDensity => noahmp%water%state%SnowfallDensity ,& ! in, bulk density of snowfall [kg/m3] CanopyLiqHoldCap => noahmp%water%param%CanopyLiqHoldCap ,& ! in, maximum intercepted liquid water per unit veg area index [mm] CanopyLiqWater => noahmp%water%state%CanopyLiqWater ,& ! inout, intercepted canopy liquid water [mm] @@ -67,7 +68,7 @@ subroutine CanopyHydrology(noahmp) ! canopy liquid water ! maximum canopy intercepted water - CanopyLiqWaterMax = CanopyLiqHoldCap * (LeafAreaIndEff + StemAreaIndEff) + CanopyLiqWaterMax = VegFrac * CanopyLiqHoldCap * (LeafAreaIndEff + StemAreaIndEff) ! canopy evaporation, transpiration, and dew if ( FlagFrozenCanopy .eqv. .false. ) then ! Barlage: change to FlagFrozenCanopy @@ -92,7 +93,7 @@ subroutine CanopyHydrology(noahmp) ! canopy ice ! maximum canopy intercepted ice - CanopyIceMax = 6.6 * (0.27 + 46.0/SnowfallDensity) * (LeafAreaIndEff + StemAreaIndEff) + CanopyIceMax = VegFrac * 6.6 * (0.27 + 46.0/SnowfallDensity) * (LeafAreaIndEff + StemAreaIndEff) ! canopy sublimation and frost SublimCanopyIce = min( CanopyIce/MainTimeStep, SublimCanopyIce ) diff --git a/src/CanopyWaterInterceptMod.F90 b/src/CanopyWaterInterceptMod.F90 index c235b07c..274d0c26 100644 --- a/src/CanopyWaterInterceptMod.F90 +++ b/src/CanopyWaterInterceptMod.F90 @@ -79,7 +79,7 @@ subroutine CanopyWaterIntercept(noahmp) ! ----------------------- canopy liquid water ------------------------------ ! maximum canopy water - CanopyLiqWaterMax = CanopyLiqHoldCap * (LeafAreaIndEff + StemAreaIndEff) + CanopyLiqWaterMax = VegFrac * CanopyLiqHoldCap * (LeafAreaIndEff + StemAreaIndEff) ! average rain interception and throughfall if ( (LeafAreaIndEff+StemAreaIndEff) > 0.0 ) then @@ -102,7 +102,7 @@ subroutine CanopyWaterIntercept(noahmp) ! ----------------------- canopy ice ------------------------------ ! maximum canopy ice - CanopyIceMax = 6.6 * (0.27 + 46.0/SnowfallDensity) * (LeafAreaIndEff + StemAreaIndEff) + CanopyIceMax = VegFrac * 6.6 * (0.27 + 46.0/SnowfallDensity) * (LeafAreaIndEff + StemAreaIndEff) ! average snow interception and throughfall if ( (LeafAreaIndEff+StemAreaIndEff) > 0.0 ) then diff --git a/src/ResistanceCanopyStomataBallBerryMod.F90 b/src/ResistanceCanopyStomataBallBerryMod.F90 index 72b84b5e..d479bec0 100644 --- a/src/ResistanceCanopyStomataBallBerryMod.F90 +++ b/src/ResistanceCanopyStomataBallBerryMod.F90 @@ -82,6 +82,7 @@ subroutine ResistanceCanopyStomataBallBerry(noahmp, IndexShade) PressureAtmosO2 => noahmp%energy%state%PressureAtmosO2 ,& ! in, atmospheric o2 pressure [Pa] PressureAtmosCO2 => noahmp%energy%state%PressureAtmosCO2 ,& ! in, atmospheric co2 pressure [Pa] ResistanceLeafBoundary => noahmp%energy%state%ResistanceLeafBoundary ,& ! in, leaf boundary layer resistance [s/m] + VegFrac => noahmp%energy%state%VegFrac ,& ! in, greeness vegetation fraction RadPhotoActAbsSunlit => noahmp%energy%flux%RadPhotoActAbsSunlit ,& ! in, average absorbed par for sunlit leaves [W/m2] RadPhotoActAbsShade => noahmp%energy%flux%RadPhotoActAbsShade ,& ! in, average absorbed par for shaded leaves [W/m2] ResistanceStomataSunlit => noahmp%energy%state%ResistanceStomataSunlit ,& ! out, sunlit leaf stomatal resistance [s/m] @@ -99,8 +100,8 @@ subroutine ResistanceCanopyStomataBallBerry(noahmp, IndexShade) CF = PressureAirRefHeight / (8.314 * TemperatureAirRefHeight) * 1.0e06 ! unit conversion factor ResistanceStomataTmp = 1.0 / ConductanceLeafMin * CF PhotosynLeafTmp = 0.0 - if ( IndexShade == 0 ) RadPhotoActAbsTmp = RadPhotoActAbsSunlit ! Sunlit case - if ( IndexShade == 1 ) RadPhotoActAbsTmp = RadPhotoActAbsShade ! Shaded case + if ( IndexShade == 0 ) RadPhotoActAbsTmp = RadPhotoActAbsSunlit / max(VegFrac,1.0e-6) ! Sunlit case + if ( IndexShade == 1 ) RadPhotoActAbsTmp = RadPhotoActAbsShade / max(VegFrac,1.0e-6) ! Shaded case ! only compute when there is radiation absorption if ( RadPhotoActAbsTmp > 0.0 ) then diff --git a/src/ResistanceCanopyStomataJarvisMod.F90 b/src/ResistanceCanopyStomataJarvisMod.F90 index 86575dee..39388bd1 100644 --- a/src/ResistanceCanopyStomataJarvisMod.F90 +++ b/src/ResistanceCanopyStomataJarvisMod.F90 @@ -53,6 +53,7 @@ subroutine ResistanceCanopyStomataJarvis(noahmp, IndexShade) VaporPresDeficitFac => noahmp%energy%param%VaporPresDeficitFac ,& ! in, Parameter used in vapor pressure deficit function TemperatureCanopy => noahmp%energy%state%TemperatureCanopy ,& ! in, vegetation temperature [K] PressureVaporCanAir => noahmp%energy%state%PressureVaporCanAir ,& ! in, canopy air vapor pressure [Pa] + VegFrac => noahmp%energy%state%VegFrac ,& ! in, greeness vegetation fraction RadPhotoActAbsSunlit => noahmp%energy%flux%RadPhotoActAbsSunlit ,& ! in, average absorbed par for sunlit leaves [W/m2] RadPhotoActAbsShade => noahmp%energy%flux%RadPhotoActAbsShade ,& ! in, average absorbed par for shaded leaves [W/m2] ResistanceStomataSunlit => noahmp%energy%state%ResistanceStomataSunlit ,& ! out, sunlit leaf stomatal resistance [s/m] @@ -67,8 +68,8 @@ subroutine ResistanceCanopyStomataJarvis(noahmp, IndexShade) ResistanceTemp = 0.0 ResistanceVapDef = 0.0 ResistanceStomataTmp = 0.0 - if ( IndexShade == 0 ) RadPhotoActAbsTmp = RadPhotoActAbsSunlit ! Sunlit case - if ( IndexShade == 1 ) RadPhotoActAbsTmp = RadPhotoActAbsShade ! Shaded case + if ( IndexShade == 0 ) RadPhotoActAbsTmp = RadPhotoActAbsSunlit / max(VegFrac,1.0e-6) ! Sunlit case + if ( IndexShade == 1 ) RadPhotoActAbsTmp = RadPhotoActAbsShade / max(VegFrac,1.0e-6) ! Shaded case ! compute MixingRatioTmp and MixingRatioSat SpecHumidityTmp = 0.622 * PressureVaporCanAir / (PressureAirRefHeight - 0.378*PressureVaporCanAir) ! specific humidity diff --git a/src/SnowLayerCombineMod.F90 b/src/SnowLayerCombineMod.F90 index 917e27df..909542f2 100644 --- a/src/SnowLayerCombineMod.F90 +++ b/src/SnowLayerCombineMod.F90 @@ -61,7 +61,7 @@ subroutine SnowLayerCombine(noahmp) SnowIce(J+1) = SnowIce(J+1) + SnowIce(J) ThicknessSnowSoilLayer(J+1) = ThicknessSnowSoilLayer(J+1) + ThicknessSnowSoilLayer(J) else - if ( NumSnowLayerOld < -1 ) then ! MB/KM: change to NumSnowLayerNeg + if ( NumSnowLayerNeg < -1 ) then ! MB/KM: change to NumSnowLayerNeg SnowLiqWater(J-1) = SnowLiqWater(J-1) + SnowLiqWater(J) SnowIce(J-1) = SnowIce(J-1) + SnowIce(J) ThicknessSnowSoilLayer(J-1) = ThicknessSnowSoilLayer(J-1) + ThicknessSnowSoilLayer(J)