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