From 25330edc814d276ee62fc59984a0c5233888ef42 Mon Sep 17 00:00:00 2001 From: drnimbusrain Date: Thu, 2 May 2024 18:49:03 +0000 Subject: [PATCH] Initial commit of canopy resistane (rca) in Noah-MP for AQM. --- .../Land/Noahmp/module_sf_noahmplsm.F90 | 25 +++++++++++++++---- physics/SFC_Models/Land/Noahmp/noahmpdrv.F90 | 12 ++++++--- physics/SFC_Models/Land/Noahmp/noahmpdrv.meta | 8 ++++++ 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/physics/SFC_Models/Land/Noahmp/module_sf_noahmplsm.F90 b/physics/SFC_Models/Land/Noahmp/module_sf_noahmplsm.F90 index 6abd59f69..b93d6799c 100644 --- a/physics/SFC_Models/Land/Noahmp/module_sf_noahmplsm.F90 +++ b/physics/SFC_Models/Land/Noahmp/module_sf_noahmplsm.F90 @@ -449,7 +449,7 @@ subroutine noahmp_sflx (parameters, & ghb , irg , irc , irb , tr , evc , & ! out : chleaf , chuc , chv2 , chb2 , fpice , pahv , & pahg , pahb , pah , esnow , canhs , laisun , & - laisha , rb , qsfcveg , qsfcbare & + laisha , rb , qsfcveg , qsfcbare, rca & #ifdef CCPP ,errmsg, errflg) #else @@ -602,6 +602,7 @@ subroutine noahmp_sflx (parameters, & real (kind=kind_phys) , intent(out) :: t2mb !< 2-m air temperature over bare ground part [k] real (kind=kind_phys), intent(out) :: rssun !< sunlit leaf stomatal resistance (s/m) real (kind=kind_phys), intent(out) :: rssha !< shaded leaf stomatal resistance (s/m) + real (kind=kind_phys), intent(out) :: rca !total canopy/stomatal resistance (s/m) real (kind=kind_phys), intent(out) :: bgap real (kind=kind_phys), intent(out) :: wgap real (kind=kind_phys), dimension(1:2) , intent(out) :: albd !< albedo (direct) @@ -854,7 +855,7 @@ subroutine noahmp_sflx (parameters, & fsrg ,rssun ,rssha ,albd ,albi ,albsnd,albsni, bgap ,wgap, tgv,tgb,& q1 ,q2v ,q2b ,q2e ,chv ,chb , & !out emissi ,pah ,canhs, & - shg,shc,shb,evg,evb,ghv,ghb,irg,irc,irb,tr,evc,chleaf,chuc,chv2,chb2 ) !out + shg,shc,shb,evg,evb,ghv,ghb,irg,irc,irb,tr,evc,chleaf,chuc,chv2,chb2,rca ) !out qsfcveg = eah*ep_2/(sfcprs + epsm1*eah) qsfcbare = qsfc @@ -1697,7 +1698,7 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in t2mv ,t2mb ,fsrv , & fsrg ,rssun ,rssha ,albd ,albi,albsnd ,albsni,bgap ,wgap,tgv,tgb,& q1 ,q2v ,q2b ,q2e ,chv ,chb, emissi,pah,canhs,& - shg,shc,shb,evg,evb,ghv,ghb,irg,irc,irb,tr,evc,chleaf,chuc,chv2,chb2 ) !out + shg,shc,shb,evg,evb,ghv,ghb,irg,irc,irb,tr,evc,chleaf,chuc,chv2,chb2,rca ) !out !jref:end ! -------------------------------------------------------------------------------------------------- @@ -1846,6 +1847,8 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in real (kind=kind_phys) , intent(out) :: fsrg !< ground reflected solar radiation (w/m2) real (kind=kind_phys), intent(out) :: rssun !< sunlit leaf stomatal resistance (s/m) real (kind=kind_phys), intent(out) :: rssha !< shaded leaf stomatal resistance (s/m) + real (kind=kind_phys), intent(out) :: rca !total canopy/stomatal resistance (s/m) + !jref:end - out for debug !jref:start; output @@ -2263,7 +2266,8 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in csigmaf1, & !out !jref:start qc ,qsfc ,psfc , & !in - q2v ,chv2, chleaf, chuc) !inout + q2v ,chv2, chleaf, chuc, & !inout + rca) !out ! new coupling code @@ -3712,7 +3716,8 @@ subroutine vege_flux(parameters,nsnow ,nsoil ,isnow ,vegtyp ,veg , & t2mv ,psnsun ,psnsha ,canhs , & !out csigmaf1, & !out qc ,qsfc ,psfc , & !in - q2v ,cah2 ,chleaf ,chuc ) !inout + q2v ,cah2 ,chleaf ,chuc, & !inout + rca) !out ! -------------------------------------------------------------------------------------------------- ! use newton-raphson iteration to solve for vegetation (tv) and @@ -3862,6 +3867,7 @@ subroutine vege_flux(parameters,nsnow ,nsoil ,isnow ,vegtyp ,veg , & real (kind=kind_phys), intent(out) :: rssun !sunlit leaf stomatal resistance (s/m) real (kind=kind_phys), intent(out) :: rssha !shaded leaf stomatal resistance (s/m) + real (kind=kind_phys), intent(out) :: rca !total canopy/stomatal resistance (s/m) real (kind=kind_phys) :: mol !monin-obukhov length (m) real (kind=kind_phys) :: dtv !change in tv, last iteration (k) @@ -4203,6 +4209,15 @@ subroutine vege_flux(parameters,nsnow ,nsoil ,isnow ,vegtyp ,veg , & end if end if +! total stomatal/canopy resistance Based on Bonan et al. (2011) conductance (1/Rs) equation + if(rssun .le. 0.0 .or. rssha .le. 0.0 .or. & + laisune .eq. 0.0 .or. laishae .eq. 0.0) then + rca = 0.0 + else + rca = ((1.0/(rssun+rb)*laisune) + ((1.0/(rssha+rb))*laishae)) + rca = 1.0/rca !resistance + end if + ! prepare for sensible heat flux above veg. cah = 1./rahc diff --git a/physics/SFC_Models/Land/Noahmp/noahmpdrv.F90 b/physics/SFC_Models/Land/Noahmp/noahmpdrv.F90 index 6aff50666..f064c6750 100644 --- a/physics/SFC_Models/Land/Noahmp/noahmpdrv.F90 +++ b/physics/SFC_Models/Land/Noahmp/noahmpdrv.F90 @@ -157,7 +157,7 @@ subroutine noahmpdrv_run & sncovr1, qsurf, gflux, drain, evap, hflx, ep, runoff, & cmm, chh, evbs, evcw, sbsno, pah, ecan, etran, edir, snowc,& stm, snohf,smcwlt2, smcref2, wet1, t2mmp, q2mp,zvfun, & - ztmax, errmsg, errflg, & + ztmax, rca, errmsg, errflg, & canopy_heat_storage_ccpp, & rainfall_ccpp, & sw_absorbed_total_ccpp, & @@ -400,6 +400,8 @@ subroutine noahmpdrv_run & real(kind=kind_phys), dimension(:) , intent(out) :: q2mp ! combined q2m from tiles real(kind=kind_phys), dimension(:) , intent(out) :: zvfun ! real(kind=kind_phys), dimension(:) , intent(out) :: ztmax ! thermal roughness length + real(kind=kind_phys), dimension(:) , intent(out) :: rca ! total canopy/stomatal resistance (s/m) + character(len=*) , intent(out) :: errmsg integer , intent(out) :: errflg @@ -623,6 +625,8 @@ subroutine noahmpdrv_run & real (kind=kind_phys) :: canopy_heat_storage ! out | within-canopy heat [W/m2] real (kind=kind_phys) :: spec_humid_sfc_veg ! out | surface specific humidty over vegetation [kg/kg] real (kind=kind_phys) :: spec_humid_sfc_bare ! out | surface specific humidty over bare soil [kg/kg] + + real (kind=kind_phys) :: canopy_resistance ! out | total canopy/stomatal resistance (s/m) real (kind=kind_phys) :: ustarx ! inout |surface friction velocity real (kind=kind_phys) :: prslkix ! in exner function @@ -1015,10 +1019,10 @@ subroutine noahmpdrv_run & precip_adv_heat_total ,snow_sublimation ,canopy_heat_storage , & lai_sunlit ,lai_shaded ,leaf_air_resistance , & #ifdef CCPP - spec_humid_sfc_veg ,spec_humid_sfc_bare , & + spec_humid_sfc_veg ,spec_humid_sfc_bare ,canopy_resistance , & errmsg ,errflg ) #else - spec_humid_sfc_veg ,spec_humid_sfc_bare ) + spec_humid_sfc_veg ,spec_humid_sfc_bare ,canopy_resistance ) #endif #ifdef CCPP @@ -1056,7 +1060,7 @@ subroutine noahmpdrv_run & chxy (i) = ch_noahmp zorl (i) = z0_total * 100.0 ! convert to cm ztmax (i) = z0h_total - + rca (i) = canopy_resistance smc (i,:) = soil_moisture_vol slc (i,:) = soil_liquid_vol snowxy (i) = float(snow_levels) diff --git a/physics/SFC_Models/Land/Noahmp/noahmpdrv.meta b/physics/SFC_Models/Land/Noahmp/noahmpdrv.meta index 39eed1493..7fa13f3af 100644 --- a/physics/SFC_Models/Land/Noahmp/noahmpdrv.meta +++ b/physics/SFC_Models/Land/Noahmp/noahmpdrv.meta @@ -1360,6 +1360,14 @@ type = real kind = kind_phys intent = out +[rca] + standard_name = aerodynamic_resistance_in_canopy + long_name = canopy resistance + units = s m-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP