From 761d72c0caf74d6f0866458757d33a752a8a94aa Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Tue, 18 Nov 2025 13:56:28 +0100 Subject: [PATCH 01/10] Add albedo and emissivity to registry --- Registry/Registry.EM_COMMON | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Registry/Registry.EM_COMMON b/Registry/Registry.EM_COMMON index 4d133c9bfa..6413399632 100644 --- a/Registry/Registry.EM_COMMON +++ b/Registry/Registry.EM_COMMON @@ -834,6 +834,14 @@ state real LF_URB2D_S ij misc 1 - i01r "LF_UR # AHE with month and hour dimension flattened to one dimension, Jan = (0:23), Feb = (24:47) state real AHE i{m_hr}j misc 1 - i01r "AHE" "Anthropogenic heat emission" "W m-2" +# Additional urban model parameters - PK2025 +state real ALBR_URB2D ij misc 1 - irh "ALBR_URB2D" "surface albedo of roof" "-" +state real ALBB_URB2D ij misc 1 - irh "ALBB_URB2D" "surface albedo of building wall" "-" +state real ALBG_URB2D ij misc 1 - irh "ALBG_URB2D" "surface albedo of road" "-" +state real EPSR_URB2D ij misc 1 - irh "EPSR_URB2D" "surface emissivity of roof" "-" +state real EPSB_URB2D ij misc 1 - irh "EPSB_URB2D" "surface emissivity of building wall" "-" +state real EPSG_URB2D ij misc 1 - irh "EPSG_URB2D" "surface emissivity of road" "-" + # lsm State Variables state real SMOIS ilj - 1 Z i02rhd=(interp_mask_field:lu_index,iswater)u=(copy_fcnm) "SMOIS" "SOIL MOISTURE" "m3 m-3" From 003f22fe7134e04a072109f68a3676380da4d7fb Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Tue, 18 Nov 2025 15:39:28 +0100 Subject: [PATCH 02/10] Modify urban module to use spatially explicity parameters if provided --- phys/module_sf_urban.F | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/phys/module_sf_urban.F b/phys/module_sf_urban.F index a25e7d899c..270fde0609 100644 --- a/phys/module_sf_urban.F +++ b/phys/module_sf_urban.F @@ -289,6 +289,7 @@ MODULE module_sf_urban ! Kusaka et al. (2001) Bound.-Layer Meteor., vol.101, p329-358 ! ! History: +! 2025/11, modified by Peter Kalverla (NL eScience Center) ! 2014/10, modified by Jiachuan Yang (ASU) ! 2006/06 modified by H. Kusaka (Univ. Tsukuba), M. Tewari ! 2005/10/26, modified by Fei Chen, Mukul Tewari @@ -317,6 +318,8 @@ SUBROUTINE urban(LSOLAR, & ! L CMR_URB,CHR_URB,CMC_URB,CHC_URB, & ! I/O U10,V10,TH2,Q2,UST,mh_urb,stdh_urb,lf_urb, & ! O lp_urb,hgt_urb,frc_urb,lb_urb,zo_check, & ! O + albr_urb, albb_urb,albg_urb, & ! I + epsr_urb,epsb_urb,epsg_urb, & ! I CMCR,TGR,TGRL,SMR,CMGR_URB,CHGR_URB,jmonth, & ! H DRELR,DRELB,DRELG,FLXHUMR,FLXHUMB,FLXHUMG, & lf_urb_s, z0_urb, vegfrac_in) @@ -399,7 +402,15 @@ SUBROUTINE urban(LSOLAR, & ! L REAL, INTENT(INOUT) :: lb_urb ! building surface to plan area ratio [-] REAL, INTENT(INOUT), DIMENSION(4) :: lf_urb ! frontal area index [-] REAL, INTENT(INOUT) :: zo_check ! check for printing ZOC - +!------------------------------------------------------------------------------- +! I: Additional spatially explicit urban model parameters - PK2025 +!------------------------------------------------------------------------------- + REAL, INTENT(IN) :: albr_urb ! surface albedo of roof [-] + REAL, INTENT(IN) :: albb_urb ! surface albedo of building wall [-] + REAL, INTENT(IN) :: albg_urb ! surface albedo of road [-] + REAL, INTENT(IN) :: epsr_urb ! surface emissivity of roof [-] + REAL, INTENT(IN) :: epsb_urb ! surface emissivity of building wall [-] + REAL, INTENT(IN) :: epsg_urb ! surface emissivity of road [-] !------------------------------------------------------------------------------- ! I: Distributed aerodynamics parameters !------------------------------------------------------------------------------- @@ -789,6 +800,13 @@ SUBROUTINE urban(LSOLAR, & ! L !End NUDAPT Modification +! PK2025, use spatially explicit radiation parameters if provided +if (albr_urb /= -999.) ALBR=albr_urb +if (albb_urb /= -999.) ALBB=albb_urb +if (albg_urb /= -999.) ALBG=albg_urb +if (epsr_urb /= -999.) EPSR=epsr_urb +if (epsb_urb /= -999.) EPSB=epsb_urb +if (epsg_urb /= -999.) EPSG=epsg_urb ! Miao, 2007/01/17, cal. ah if(ahoption==1) AH=AH*ahdiuprf(tloc) @@ -2740,7 +2758,7 @@ SUBROUTINE urban_var_init(ISURBAN, TSURFACE0_URB,TLAYER0_URB,TDEEP0_URB,IVGTYP, LH_URB2D(I,J)=0. G_URB2D(I,J)=0. RN_URB2D(I,J)=0. - + !m !FS FRC_URB2D(I,J)=0. UTYPE_URB2D(I,J)=0 From 6de97a337a77e09e0e425920ab344655d517495c Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Thu, 20 Nov 2025 12:37:43 +0100 Subject: [PATCH 03/10] Update CLM code to pass on spatially explicit vars if present --- phys/module_sf_clm.F | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/phys/module_sf_clm.F b/phys/module_sf_clm.F index 3a8c0d6006..cdffade9b7 100644 --- a/phys/module_sf_clm.F +++ b/phys/module_sf_clm.F @@ -58802,6 +58802,8 @@ subroutine clmdrv(zgcmxy ,forc_qxy ,ps ,forc_txy ,tsxy & cmcr_urb2d,tgr_urb2d,tgrl_urb3d,smr_urb3d, & ! urban drelr_urb2d,drelb_urb2d,drelg_urb2d, & ! urban flxhumr_urb2d,flxhumb_urb2d,flxhumg_urb2d, & + albr_urb2d, albb_urb2d, albg_urb2d, & !I explicit radiation PK2025 + epsr_urb2d, epsb_urb2d, epsg_urb2d, & !I explicit radiation PK2025 ! subgrids numc,nump,sabv,sabg,lwup,snl, & snowdp,wtc,wtp,h2osno,t_grnd,t_veg, & @@ -59228,6 +59230,15 @@ subroutine clmdrv(zgcmxy ,forc_qxy ,ps ,forc_txy ,tsxy & REAL, DIMENSION(1:num_road_layers) :: TGL_URB ! road layer temp [K] LOGICAL :: LSOLAR_URB +! Explicit radiation parameters PK2025 + real :: albr_urb,albb_urb,albg_urb,epsr_urb,epsb_urb,epsg_urb + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albr_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albb_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albg_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsr_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsb_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsg_urb2d + !===Yang,2014/10/08,hydrological variable for single layer UCM=== INTEGER :: jmonth, jday REAL :: DRELR_URB @@ -60326,6 +60337,14 @@ subroutine clmdrv(zgcmxy ,forc_qxy ,ps ,forc_txy ,tsxy & lf_urb_s = 0 z0_urb = 0 vegfrac = 0 +! Explicit radiation parameters PK2025 + ! x = merge(ifTrue, ifFalse, Condition) + albr_urb = merge(ALBR_URB2D(I,J), -999., present(ALBR_URB2D)) + albb_urb = merge(ALBB_URB2D(I,J), -999., present(ALBB_URB2D)) + albg_urb = merge(ALBG_URB2D(I,J), -999., present(ALBG_URB2D)) + epsr_urb = merge(EPSR_URB2D(I,J), -999., present(EPSR_URB2D)) + epsb_urb = merge(EPSB_URB2D(I,J), -999., present(EPSB_URB2D)) + epsg_urb = merge(EPSG_URB2D(I,J), -999., present(EPSG_URB2D)) ! ! Call urban @@ -60351,7 +60370,10 @@ subroutine clmdrv(zgcmxy ,forc_qxy ,ps ,forc_txy ,tsxy & UST_URB,mh_urb, stdh_urb, lf_urb, lp_urb, & ! 0 !sw++ ! hgt_urb,frc_urb,lb_urb, check) - hgt_urb,frc_urb,lb_urb, check,CMCR_URB,TGR_URB, & ! H + hgt_urb,frc_urb,lb_urb, check, & ! H + albr_urb, albb_urb,albg_urb, & ! I + epsr_urb,epsb_urb,epsg_urb, & ! I + CMCR_URB,TGR_URB, & ! H TGRL_URB,SMR_URB,CMGR_URB, CHGR_URB, jmonth, & ! H DRELR_URB,DRELB_URB, & ! H DRELG_URB,FLXHUMR_URB,FLXHUMB_URB,FLXHUMG_URB, & From 868454fcc6cce5ee46937dd2bb379dccca19a023 Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Thu, 20 Nov 2025 13:37:55 +0100 Subject: [PATCH 04/10] Update noah code to pass on spatially explicit vars if present; noah has three calls to urban, including a mosaic/tiles one and a fallback inside that subroutine --- phys/module_sf_noahdrv.F | 66 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/phys/module_sf_noahdrv.F b/phys/module_sf_noahdrv.F index 21bced2f46..bfa3631cb5 100644 --- a/phys/module_sf_noahdrv.F +++ b/phys/module_sf_noahdrv.F @@ -68,6 +68,8 @@ SUBROUTINE lsm(DZ8W,QV3D,P8W3D,T3D,TSK, & !Optional Urban TR_URB2D,TB_URB2D,TG_URB2D,TC_URB2D,QC_URB2D, & !H urban UC_URB2D, & !H urban + albr_urb2d, albb_urb2d, albg_urb2d, & !I urban explicit radiation PK2025 + epsr_urb2d, epsb_urb2d, epsg_urb2d, & !I urban explicit radiation PK2025 XXXR_URB2D,XXXB_URB2D,XXXG_URB2D,XXXC_URB2D, & !H urban TRL_URB3D,TBL_URB3D,TGL_URB3D, & !H urban SH_URB2D,LH_URB2D,G_URB2D,RN_URB2D,TS_URB2D, & !H urban @@ -504,6 +506,15 @@ SUBROUTINE lsm(DZ8W,QV3D,P8W3D,T3D,TSK, & REAL, DIMENSION(1:num_road_layers) :: TGL_URB ! road layer temp [K] LOGICAL :: LSOLAR_URB +! Explicit radiation parameters PK2025 + real :: albr_urb,albb_urb,albg_urb,epsr_urb,epsb_urb,epsg_urb + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albr_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albb_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albg_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsr_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsb_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsg_urb2d + !===Yang,2014/10/08,hydrological variable for single layer UCM=== INTEGER :: jmonth, jday, tloc INTEGER :: IRIOPTION, USOIL, DSOIL @@ -1428,6 +1439,16 @@ SUBROUTINE lsm(DZ8W,QV3D,P8W3D,T3D,TSK, & z0_urb = z0_urb2d(I, J) vegfrac = vegfra(I, J) / 100 ! +! Explicit radiation parameters PK2025 + ! x = merge(ifTrue, ifFalse, Condition) + albr_urb = merge(albr_urb2d(i,j), -999., present(albr_urb2d)) + albb_urb = merge(albb_urb2d(i,j), -999., present(albb_urb2d)) + albg_urb = merge(albg_urb2d(i,j), -999., present(albg_urb2d)) + epsr_urb = merge(epsr_urb2d(i,j), -999., present(epsr_urb2d)) + epsb_urb = merge(epsb_urb2d(i,j), -999., present(epsb_urb2d)) + epsg_urb = merge(epsg_urb2d(i,j), -999., present(epsg_urb2d)) +! +! ! Call urban CALL cal_mon_day(julian,julyr,jmonth,jday) CALL urban(LSOLAR_URB, & ! I @@ -1447,7 +1468,10 @@ SUBROUTINE lsm(DZ8W,QV3D,P8W3D,T3D,TSK, & CMR_URB, CHR_URB, CMC_URB, CHC_URB, & U10_URB, V10_URB, TH2_URB, Q2_URB, & ! O UST_URB,mh_urb, stdh_urb, lf_urb, lp_urb, & ! 0 - hgt_urb,frc_urb,lb_urb, check,CMCR_URB,TGR_URB, & ! H + hgt_urb,frc_urb,lb_urb, & ! H + albr_urb, albb_urb,albg_urb, & ! I + epsr_urb,epsb_urb,epsg_urb, & ! I + check,CMCR_URB,TGR_URB, & ! H TGRL_URB,SMR_URB,CMGR_URB,CHGR_URB,jmonth, & ! H DRELR_URB,DRELB_URB, & ! H DRELG_URB,FLXHUMR_URB,FLXHUMB_URB,FLXHUMG_URB, & @@ -2390,6 +2414,8 @@ SUBROUTINE lsm_mosaic(DZ8W,QV3D,P8W3D,T3D,TSK, & !Optional Urban TR_URB2D,TB_URB2D,TG_URB2D,TC_URB2D,QC_URB2D, & !H urban UC_URB2D, & !H urban + albr_urb2d, albb_urb2d, albg_urb2d, & !I urban explicit radiation PK2025 + epsr_urb2d, epsb_urb2d, epsg_urb2d, & !I urban explicit radiation PK2025 XXXR_URB2D,XXXB_URB2D,XXXG_URB2D,XXXC_URB2D, & !H urban TRL_URB3D,TBL_URB3D,TGL_URB3D, & !H urban SH_URB2D,LH_URB2D,G_URB2D,RN_URB2D,TS_URB2D, & !H urban @@ -2836,6 +2862,15 @@ SUBROUTINE lsm_mosaic(DZ8W,QV3D,P8W3D,T3D,TSK, & REAL, DIMENSION(1:num_road_layers) :: TGL_URB ! road layer temp [K] LOGICAL :: LSOLAR_URB +! Explicit radiation parameters PK2025 + real :: albr_urb,albb_urb,albg_urb,epsr_urb,epsb_urb,epsg_urb + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albr_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albb_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albg_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsr_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsb_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsg_urb2d + !===Yang,2014/10/08,hydrological variable for single layer UCM=== INTEGER :: jmonth, jday, tloc INTEGER :: IRIOPTION, USOIL, DSOIL @@ -3883,6 +3918,15 @@ SUBROUTINE lsm_mosaic(DZ8W,QV3D,P8W3D,T3D,TSK, & lf_urb_s = lf_urb2d_s(I, J) z0_urb = z0_urb2d(I, J) vegfrac = vegfra(I, J) / 100. + ! Explicit radiation parameters PK2025 + ! x = merge(ifTrue, ifFalse, Condition) + albr_urb = merge(albr_urb2d(i,j), -999., present(albr_urb2d)) + albb_urb = merge(albb_urb2d(i,j), -999., present(albb_urb2d)) + albg_urb = merge(albg_urb2d(i,j), -999., present(albg_urb2d)) + epsr_urb = merge(epsr_urb2d(i,j), -999., present(epsr_urb2d)) + epsb_urb = merge(epsb_urb2d(i,j), -999., present(epsb_urb2d)) + epsg_urb = merge(epsg_urb2d(i,j), -999., present(epsg_urb2d)) +! ! ! Call urban CALL cal_mon_day(julian,julyr,jmonth,jday) @@ -3903,7 +3947,10 @@ SUBROUTINE lsm_mosaic(DZ8W,QV3D,P8W3D,T3D,TSK, & CMR_URB, CHR_URB, CMC_URB, CHC_URB, & U10_URB, V10_URB, TH2_URB, Q2_URB, & ! O UST_URB,mh_urb, stdh_urb, lf_urb, lp_urb, & ! 0 - hgt_urb,frc_urb,lb_urb, check,CMCR_URB,TGR_URB, & ! H + hgt_urb,frc_urb,lb_urb, & ! H + albr_urb, albb_urb,albg_urb, & ! I + epsr_urb,epsb_urb,epsg_urb, & ! I + check,CMCR_URB,TGR_URB, & ! H TGRL_URB,SMR_URB,CMGR_URB,CHGR_URB,jmonth, & ! H DRELR_URB,DRELB_URB, & ! H DRELG_URB,FLXHUMR_URB,FLXHUMB_URB,FLXHUMG_URB, & @@ -4762,7 +4809,15 @@ SUBROUTINE lsm_mosaic(DZ8W,QV3D,P8W3D,T3D,TSK, & lf_urb_s = lf_urb2d_s(I, J) z0_urb = z0_urb2d(I, J) vegfrac = vegfra(I, J) / 100.0 - + ! Explicit radiation parameters PK2025 + ! x = merge(ifTrue, ifFalse, Condition) + albr_urb = merge(albr_urb2d(i,j), -999., present(albr_urb2d)) + albb_urb = merge(albb_urb2d(i,j), -999., present(albb_urb2d)) + albg_urb = merge(albg_urb2d(i,j), -999., present(albg_urb2d)) + epsr_urb = merge(epsr_urb2d(i,j), -999., present(epsr_urb2d)) + epsb_urb = merge(epsb_urb2d(i,j), -999., present(epsb_urb2d)) + epsg_urb = merge(epsg_urb2d(i,j), -999., present(epsg_urb2d)) +! ! ! Call urban CALL cal_mon_day(julian,julyr,jmonth,jday) @@ -4783,7 +4838,10 @@ SUBROUTINE lsm_mosaic(DZ8W,QV3D,P8W3D,T3D,TSK, & CMR_URB, CHR_URB, CMC_URB, CHC_URB, & U10_URB, V10_URB, TH2_URB, Q2_URB, & ! O UST_URB,mh_urb, stdh_urb, lf_urb, lp_urb, & ! 0 - hgt_urb,frc_urb,lb_urb, check,CMCR_URB,TGR_URB, & ! H + hgt_urb,frc_urb,lb_urb, & ! H + albr_urb, albb_urb,albg_urb, & ! I + epsr_urb,epsb_urb,epsg_urb, & ! I + check,CMCR_URB,TGR_URB, & ! H TGRL_URB,SMR_URB,CMGR_URB,CHGR_URB,jmonth, & ! H DRELR_URB,DRELB_URB, & ! H DRELG_URB,FLXHUMR_URB,FLXHUMB_URB,FLXHUMG_URB, & From 5658ba53a944b3224ce34d04b2b7b1e5f34c6f82 Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Thu, 20 Nov 2025 15:09:32 +0100 Subject: [PATCH 05/10] Update surface driver to pass explicit vars --- phys/module_surface_driver.F | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/phys/module_surface_driver.F b/phys/module_surface_driver.F index 036c006446..ea5ecdadfc 100644 --- a/phys/module_surface_driver.F +++ b/phys/module_surface_driver.F @@ -187,6 +187,8 @@ SUBROUTINE surface_driver( & & ,num_road_layers, dzr, dzb, dzg & !I urban & ,tr_urb2d,tb_urb2d,tg_urb2d,tc_urb2d,qc_urb2d & !H urban & ,uc_urb2d & !H urban + & ,albr_urb2d, albb_urb2d, albg_urb2d & !I urban explicit radiation PK2025 + & ,epsr_urb2d, epsb_urb2d, epsg_urb2d & !I urban explicit radiation PK2025 & ,xxxr_urb2d,xxxb_urb2d,xxxg_urb2d,xxxc_urb2d & !H urban & ,cmcr_urb2d,tgr_urb2d,tgrl_urb3d,smr_urb3d & !H urban & ,julian,julyr,drelr_urb2d,drelb_urb2d,drelg_urb2d & !H urban @@ -1289,6 +1291,14 @@ SUBROUTINE surface_driver( & REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: XXXG_URB2D !urban REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: XXXC_URB2D !urban +! Explicit radiation parameters PK2025 + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albr_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albb_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: albg_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsr_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsb_urb2d + real, optional, dimension( ims:ime, jms:jme ), intent(in) :: epsg_urb2d + REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: DRELR_URB2D REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: DRELB_URB2D REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: DRELG_URB2D @@ -2706,6 +2716,8 @@ SUBROUTINE surface_driver( & ,cmgr_sfcdif,chgr_sfcdif & ,tr_urb2d,tb_urb2d,tg_urb2d,tc_urb2d,qc_urb2d, & !H urban uc_urb2d, & !H urban + albr_urb2d, albb_urb2d, albg_urb2d, & !I urban explicit radiation PK2025 + epsr_urb2d, epsb_urb2d, epsg_urb2d, & !I urban explicit radiation PK2025 xxxr_urb2d,xxxb_urb2d,xxxg_urb2d,xxxc_urb2d, & !H urban trl_urb3d,tbl_urb3d,tgl_urb3d, & !H urban sh_urb2d,lh_urb2d,g_urb2d,rn_urb2d,ts_urb2d, & !H urban @@ -2850,6 +2862,8 @@ SUBROUTINE surface_driver( & ,cmgr_sfcdif,chgr_sfcdif & ,tr_urb2d,tb_urb2d,tg_urb2d,tc_urb2d,qc_urb2d, & !H urban uc_urb2d, & !H urban + albr_urb2d, albb_urb2d, albg_urb2d, & !I urban explicit radiation PK2025 + epsr_urb2d, epsb_urb2d, epsg_urb2d, & !I urban explicit radiation PK2025 xxxr_urb2d,xxxb_urb2d,xxxg_urb2d,xxxc_urb2d, & !H urban trl_urb3d,tbl_urb3d,tgl_urb3d, & !H urban sh_urb2d,lh_urb2d,g_urb2d,rn_urb2d,ts_urb2d, & !H urban @@ -3231,6 +3245,8 @@ SUBROUTINE surface_driver( & lp_urb2d, hi_urb2d, lb_urb2d, hgt_urb2d, & !H multi-layer urban mh_urb2d, stdh_urb2d, lf_urb2d, & !SLUCM lf_urb2d_s, z0_urb2d, vegfra, & !SLUCM + albr_urb2d, albb_urb2d, albg_urb2d, & !I urban explicit radiation PK2025 + epsr_urb2d, epsb_urb2d, epsg_urb2d, & !I urban explicit radiation PK2025 th_phy, rho, p_phy, ust, & !I multi-layer urban gmt, julday, xlong, xlat, & !I multi-layer urban a_u_bep, a_v_bep, a_t_bep, a_q_bep, & !O multi-layer urban @@ -3805,6 +3821,8 @@ SUBROUTINE surface_driver( & cmcr_urb2d,tgr_urb2d,tgrl_urb3d,smr_urb3d, & ! urban drelr_urb2d,drelb_urb2d,drelg_urb2d, & ! urban flxhumr_urb2d,flxhumb_urb2d,flxhumg_urb2d, & + albr_urb2d, albb_urb2d, albg_urb2d, & !I explicit radiation PK2025 + epsr_urb2d, epsb_urb2d, epsg_urb2d, & !I explicit radiation PK2025 ! CLM subgrids numc,nump,sabv,sabg,lwup,snl, & snowdp,wtc,wtp,h2osno,t_grnd,t_veg, & From e31509cf7e248ddffa73fd84d449125ff5aab9f9 Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Thu, 20 Nov 2025 15:10:24 +0100 Subject: [PATCH 06/10] Update solver to pass explicit radiation parameters to surface driver --- dyn_em/module_first_rk_step_part1.F | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dyn_em/module_first_rk_step_part1.F b/dyn_em/module_first_rk_step_part1.F index 9a56bb2414..2690795c5e 100644 --- a/dyn_em/module_first_rk_step_part1.F +++ b/dyn_em/module_first_rk_step_part1.F @@ -777,6 +777,9 @@ SUBROUTINE first_rk_step_part1 ( grid , config_flags & & ,TG_URB2D=grid%tg_urb2d & !H urban & ,TC_URB2D=grid%tc_urb2d ,QC_URB2D=grid%qc_urb2d & !H urban & ,UC_URB2D=grid%uc_urb2d & !H urban + & ,albr_urb2d=grid%albr_urb2d, albb_urb2d=grid%albb_urb2d & !I urban explicit radiation PK2025 + & ,albg_urb2d=grid%albg_urb2d, epsr_urb2d=grid%epsr_urb2d & !I urban explicit radiation PK2025 + & ,epsb_urb2d=grid%epsb_urb2d, epsg_urb2d=grid%epsg_urb2d & !I urban explicit radiation PK2025 & ,XXXR_URB2D=grid%xxxr_urb2d & & ,XXXB_URB2D=grid%xxxb_urb2d & !H urban & ,XXXG_URB2D=grid%xxxg_urb2d & From 851854cb10ba9f1895bc13595260221af9c397dd Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Tue, 9 Dec 2025 15:58:31 +0100 Subject: [PATCH 07/10] Fix registry input streams for new vars --- Registry/Registry.EM_COMMON | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Registry/Registry.EM_COMMON b/Registry/Registry.EM_COMMON index 6413399632..907b532f36 100644 --- a/Registry/Registry.EM_COMMON +++ b/Registry/Registry.EM_COMMON @@ -835,12 +835,12 @@ state real LF_URB2D_S ij misc 1 - i01r "LF_UR state real AHE i{m_hr}j misc 1 - i01r "AHE" "Anthropogenic heat emission" "W m-2" # Additional urban model parameters - PK2025 -state real ALBR_URB2D ij misc 1 - irh "ALBR_URB2D" "surface albedo of roof" "-" -state real ALBB_URB2D ij misc 1 - irh "ALBB_URB2D" "surface albedo of building wall" "-" -state real ALBG_URB2D ij misc 1 - irh "ALBG_URB2D" "surface albedo of road" "-" -state real EPSR_URB2D ij misc 1 - irh "EPSR_URB2D" "surface emissivity of roof" "-" -state real EPSB_URB2D ij misc 1 - irh "EPSB_URB2D" "surface emissivity of building wall" "-" -state real EPSG_URB2D ij misc 1 - irh "EPSG_URB2D" "surface emissivity of road" "-" +state real ALBR_URB2D ij misc 1 - i012rh "ALBR_URB2D" "surface albedo of roof" "-" +state real ALBB_URB2D ij misc 1 - i012rh "ALBB_URB2D" "surface albedo of building wall" "-" +state real ALBG_URB2D ij misc 1 - i012rh "ALBG_URB2D" "surface albedo of road" "-" +state real EPSR_URB2D ij misc 1 - i012rh "EPSR_URB2D" "surface emissivity of roof" "-" +state real EPSB_URB2D ij misc 1 - i012rh "EPSB_URB2D" "surface emissivity of building wall" "-" +state real EPSG_URB2D ij misc 1 - i012rh "EPSG_URB2D" "surface emissivity of road" "-" # lsm State Variables From 0fa49ddb1b7844b455a8f7886e4371a637189909 Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Tue, 6 Jan 2026 16:13:52 +0100 Subject: [PATCH 08/10] Add namelist options to control extra variables --- Registry/Registry.EM_COMMON | 14 ++++++++------ phys/module_sf_urban.F | 31 ++++++++++++++++++++++++------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Registry/Registry.EM_COMMON b/Registry/Registry.EM_COMMON index 907b532f36..7bd9e35c57 100644 --- a/Registry/Registry.EM_COMMON +++ b/Registry/Registry.EM_COMMON @@ -835,12 +835,12 @@ state real LF_URB2D_S ij misc 1 - i01r "LF_UR state real AHE i{m_hr}j misc 1 - i01r "AHE" "Anthropogenic heat emission" "W m-2" # Additional urban model parameters - PK2025 -state real ALBR_URB2D ij misc 1 - i012rh "ALBR_URB2D" "surface albedo of roof" "-" -state real ALBB_URB2D ij misc 1 - i012rh "ALBB_URB2D" "surface albedo of building wall" "-" -state real ALBG_URB2D ij misc 1 - i012rh "ALBG_URB2D" "surface albedo of road" "-" -state real EPSR_URB2D ij misc 1 - i012rh "EPSR_URB2D" "surface emissivity of roof" "-" -state real EPSB_URB2D ij misc 1 - i012rh "EPSB_URB2D" "surface emissivity of building wall" "-" -state real EPSG_URB2D ij misc 1 - i012rh "EPSG_URB2D" "surface emissivity of road" "-" +state real ALBR_URB2D ij misc 1 - i01h "ALBR_URB2D" "surface albedo of roof" "-" +state real ALBB_URB2D ij misc 1 - i01h "ALBB_URB2D" "surface albedo of building wall" "-" +state real ALBG_URB2D ij misc 1 - i01h "ALBG_URB2D" "surface albedo of road" "-" +state real EPSR_URB2D ij misc 1 - i01h "EPSR_URB2D" "surface emissivity of roof" "-" +state real EPSB_URB2D ij misc 1 - i01h "EPSB_URB2D" "surface emissivity of building wall" "-" +state real EPSG_URB2D ij misc 1 - i01h "EPSG_URB2D" "surface emissivity of road" "-" # lsm State Variables @@ -2560,6 +2560,8 @@ rconfig real convtrans_avglen_m namelist,physics 1 30 rconfig integer num_land_cat namelist,physics 1 21 - "num_land_cat" "" "" rconfig integer use_wudapt_lcz namelist,physics 1 0 - "use_wudapt_lcz" "" "" rconfig logical slucm_distributed_drag namelist,physics 1 .false. rh "slucm_distributed_drag" "" "" +rconfig character urb2d_additional_vars namelist,physics 6 "" - "additional explicit urban parameters. Comma-separated list of the following variables: ALBB, ALBR, ALBG, EPSB, EPSR, EPSG." +rconfig integer num_urb2d_additional_vars namelist,physics 1 0 - "number of additional explicit urban parameters supplied for the namelist option urb2d_additional_vars." rconfig integer distributed_ahe_opt namelist,physics 1 0 rh "distributed_ahe_opt" "AHE handling: 0= no AHE, 1=add to first level temperature tendency, 2=add to surface sensible heat flux" "" rconfig integer num_soil_cat namelist,physics 1 16 - "num_soil_cat" "" "" rconfig integer mp_zero_out namelist,physics 1 0 - "mp_zero_out" "microphysics fields set to zero 0=no action taken, 1=all fields but Qv, 2=all fields including Qv" "flag" diff --git a/phys/module_sf_urban.F b/phys/module_sf_urban.F index 270fde0609..bb9ae1d07d 100644 --- a/phys/module_sf_urban.F +++ b/phys/module_sf_urban.F @@ -8,7 +8,7 @@ MODULE module_sf_urban #define FATAL_ERROR(M) call wrf_error_fatal( M ) #define WRITE_MESSAGE(M) call wrf_message( M ) #endif - +USE module_configure USE module_model_constants, ONLY : piconst !=============================================================================== @@ -411,6 +411,9 @@ SUBROUTINE urban(LSOLAR, & ! L REAL, INTENT(IN) :: epsr_urb ! surface emissivity of roof [-] REAL, INTENT(IN) :: epsb_urb ! surface emissivity of building wall [-] REAL, INTENT(IN) :: epsg_urb ! surface emissivity of road [-] + CHARACTER(len=32) :: extra_var_name + INTEGER :: n_extra_vars + !------------------------------------------------------------------------------- ! I: Distributed aerodynamics parameters !------------------------------------------------------------------------------- @@ -801,12 +804,26 @@ SUBROUTINE urban(LSOLAR, & ! L !End NUDAPT Modification ! PK2025, use spatially explicit radiation parameters if provided -if (albr_urb /= -999.) ALBR=albr_urb -if (albb_urb /= -999.) ALBB=albb_urb -if (albg_urb /= -999.) ALBG=albg_urb -if (epsr_urb /= -999.) EPSR=epsr_urb -if (epsb_urb /= -999.) EPSB=epsb_urb -if (epsg_urb /= -999.) EPSG=epsg_urb + CALL nl_get_num_urb2d_additional_vars(1, n_extra_vars) + do iteration = 1, n_extra_vars + CALL nl_get_urb2d_additional_vars(iteration, extra_var_name) + select case(trim(extra_var_name)) + case('ALBB') + if (albb_urb /= -999.) ALBB=albb_urb + case('ALBR') + if (albr_urb /= -999.) ALBR=albr_urb + case('ALBG') + if (albg_urb /= -999.) ALBG=albg_urb + case('EPSB') + if (epsb_urb /= -999.) EPSB=epsb_urb + case('EPSR') + if (epsr_urb /= -999.) EPSR=epsr_urb + case('EPSG') + if (epsg_urb /= -999.) EPSG=epsg_urb + case default + write(*,*) 'WARNING: Unknown urb2d additional variable: ', trim(extra_var_name) + end select +end do ! Miao, 2007/01/17, cal. ah if(ahoption==1) AH=AH*ahdiuprf(tloc) From db6f07a3620abb40a784f259da4a42cb2c2ef801 Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Tue, 6 Jan 2026 16:21:24 +0100 Subject: [PATCH 09/10] clean up merge as ternary statements --- phys/module_sf_clm.F | 13 ++++++------- phys/module_sf_noahdrv.F | 42 ++++++++++++++++++---------------------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/phys/module_sf_clm.F b/phys/module_sf_clm.F index cdffade9b7..c4bb52a9bf 100644 --- a/phys/module_sf_clm.F +++ b/phys/module_sf_clm.F @@ -60338,13 +60338,12 @@ subroutine clmdrv(zgcmxy ,forc_qxy ,ps ,forc_txy ,tsxy & z0_urb = 0 vegfrac = 0 ! Explicit radiation parameters PK2025 - ! x = merge(ifTrue, ifFalse, Condition) - albr_urb = merge(ALBR_URB2D(I,J), -999., present(ALBR_URB2D)) - albb_urb = merge(ALBB_URB2D(I,J), -999., present(ALBB_URB2D)) - albg_urb = merge(ALBG_URB2D(I,J), -999., present(ALBG_URB2D)) - epsr_urb = merge(EPSR_URB2D(I,J), -999., present(EPSR_URB2D)) - epsb_urb = merge(EPSB_URB2D(I,J), -999., present(EPSB_URB2D)) - epsg_urb = merge(EPSG_URB2D(I,J), -999., present(EPSG_URB2D)) + albr_urb = albr_urb2d(i,j) + albb_urb = albb_urb2d(i,j) + albg_urb = albg_urb2d(i,j) + epsr_urb = epsr_urb2d(i,j) + epsb_urb = epsb_urb2d(i,j) + epsg_urb = epsg_urb2d(i,j) ! ! Call urban diff --git a/phys/module_sf_noahdrv.F b/phys/module_sf_noahdrv.F index bfa3631cb5..2387a7788a 100644 --- a/phys/module_sf_noahdrv.F +++ b/phys/module_sf_noahdrv.F @@ -1440,14 +1440,12 @@ SUBROUTINE lsm(DZ8W,QV3D,P8W3D,T3D,TSK, & vegfrac = vegfra(I, J) / 100 ! ! Explicit radiation parameters PK2025 - ! x = merge(ifTrue, ifFalse, Condition) - albr_urb = merge(albr_urb2d(i,j), -999., present(albr_urb2d)) - albb_urb = merge(albb_urb2d(i,j), -999., present(albb_urb2d)) - albg_urb = merge(albg_urb2d(i,j), -999., present(albg_urb2d)) - epsr_urb = merge(epsr_urb2d(i,j), -999., present(epsr_urb2d)) - epsb_urb = merge(epsb_urb2d(i,j), -999., present(epsb_urb2d)) - epsg_urb = merge(epsg_urb2d(i,j), -999., present(epsg_urb2d)) -! + albr_urb = albr_urb2d(i,j) + albb_urb = albb_urb2d(i,j) + albg_urb = albg_urb2d(i,j) + epsr_urb = epsr_urb2d(i,j) + epsb_urb = epsb_urb2d(i,j) + epsg_urb = epsg_urb2d(i,j) ! ! Call urban CALL cal_mon_day(julian,julyr,jmonth,jday) @@ -3919,13 +3917,12 @@ SUBROUTINE lsm_mosaic(DZ8W,QV3D,P8W3D,T3D,TSK, & z0_urb = z0_urb2d(I, J) vegfrac = vegfra(I, J) / 100. ! Explicit radiation parameters PK2025 - ! x = merge(ifTrue, ifFalse, Condition) - albr_urb = merge(albr_urb2d(i,j), -999., present(albr_urb2d)) - albb_urb = merge(albb_urb2d(i,j), -999., present(albb_urb2d)) - albg_urb = merge(albg_urb2d(i,j), -999., present(albg_urb2d)) - epsr_urb = merge(epsr_urb2d(i,j), -999., present(epsr_urb2d)) - epsb_urb = merge(epsb_urb2d(i,j), -999., present(epsb_urb2d)) - epsg_urb = merge(epsg_urb2d(i,j), -999., present(epsg_urb2d)) + albr_urb = albr_urb2d(i,j) + albb_urb = albb_urb2d(i,j) + albg_urb = albg_urb2d(i,j) + epsr_urb = epsr_urb2d(i,j) + epsb_urb = epsb_urb2d(i,j) + epsg_urb = epsg_urb2d(i,j) ! ! ! Call urban @@ -4810,14 +4807,13 @@ SUBROUTINE lsm_mosaic(DZ8W,QV3D,P8W3D,T3D,TSK, & z0_urb = z0_urb2d(I, J) vegfrac = vegfra(I, J) / 100.0 ! Explicit radiation parameters PK2025 - ! x = merge(ifTrue, ifFalse, Condition) - albr_urb = merge(albr_urb2d(i,j), -999., present(albr_urb2d)) - albb_urb = merge(albb_urb2d(i,j), -999., present(albb_urb2d)) - albg_urb = merge(albg_urb2d(i,j), -999., present(albg_urb2d)) - epsr_urb = merge(epsr_urb2d(i,j), -999., present(epsr_urb2d)) - epsb_urb = merge(epsb_urb2d(i,j), -999., present(epsb_urb2d)) - epsg_urb = merge(epsg_urb2d(i,j), -999., present(epsg_urb2d)) -! + albr_urb = albr_urb2d(i,j) + albb_urb = albb_urb2d(i,j) + albg_urb = albg_urb2d(i,j) + epsr_urb = epsr_urb2d(i,j) + epsb_urb = epsb_urb2d(i,j) + epsg_urb = epsg_urb2d(i,j) + ! ! ! Call urban CALL cal_mon_day(julian,julyr,jmonth,jday) From 234a32254b9d5a9db03d39458bd5605bfa771fa6 Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Tue, 27 Jan 2026 12:26:01 +0100 Subject: [PATCH 10/10] update_noahmp_submodule --- phys/noahmp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phys/noahmp b/phys/noahmp index e5c0859874..4d301cba28 160000 --- a/phys/noahmp +++ b/phys/noahmp @@ -1 +1 @@ -Subproject commit e5c0859874407859936739e8be8741f9aed369ee +Subproject commit 4d301cba28f480e55b61721da47f5e230b5fd10c