From e9f5120db05a800cf492ee4b1c08ce28f130f2db Mon Sep 17 00:00:00 2001 From: Stefan Poll Date: Thu, 3 Sep 2026 17:12:30 +0200 Subject: [PATCH 1/2] eCLM-ParFlow: Couple urban landunits - bugfix: pfl_psi/pfl_h2osoi_liq were distributed over filter_soilc, but eCLM run over filter_hydrologyc, leading to soilwater_parflow wrote nan into h2osoi_liq for pervious road - distribute over filter_nolakec testing col%hydrologically_active, the predicate filterMod uses for filter_hydrologyc, originally leading to undefined TWS --- src/clm5/main/clm_driver.F90 | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/clm5/main/clm_driver.F90 b/src/clm5/main/clm_driver.F90 index b7f36c920d..befbba7a45 100644 --- a/src/clm5/main/clm_driver.F90 +++ b/src/clm5/main/clm_driver.F90 @@ -1306,13 +1306,14 @@ subroutine clm_drv_init(bounds, & end do #ifdef COUP_OAS_PFL - ! TSMP/bldsva/intf_oas3/clm3_5/mct/receive_fld_2pfl.F90 - ! COUP_OAS_PFL - do f = 1, num_soilc - c = filter_soilc(f) - g = col%gridcell(c) - pfl_psi(c,:) = atm2lnd_inst%pfl_psi_grc(g,:) - pfl_h2osoi_liq(c,:) = atm2lnd_inst%pfl_h2osoi_liq_grc(g,:) + ! Cover every column that soilwater_parflow will later overwrite. + do f = 1, num_nolakec + c = filter_nolakec(f) + if (col%hydrologically_active(c)) then + g = col%gridcell(c) + pfl_psi(c,:) = atm2lnd_inst%pfl_psi_grc(g,:) + pfl_h2osoi_liq(c,:) = atm2lnd_inst%pfl_h2osoi_liq_grc(g,:) + end if end do #endif end associate From b2e76ba518fafe0eb678c12cd84d2664d34909bc Mon Sep 17 00:00:00 2001 From: Stefan Poll Date: Thu, 3 Sep 2026 17:18:49 +0200 Subject: [PATCH 2/2] eCLM-ParFlow: Route impervious urban runoff into ParFlow - impervious urban runoff left the domain as river runoff without entering ParFlow - route it into ParFlow layer 1 - zeroed qflx_surf/qflx_qrgwl and write it to qflx_drain as for every other coupled column --- src/clm5/biogeophys/SoilHydrologyMod.F90 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/clm5/biogeophys/SoilHydrologyMod.F90 b/src/clm5/biogeophys/SoilHydrologyMod.F90 index d9f251602a..8caa89fb3d 100644 --- a/src/clm5/biogeophys/SoilHydrologyMod.F90 +++ b/src/clm5/biogeophys/SoilHydrologyMod.F90 @@ -2373,6 +2373,7 @@ subroutine ParFlowDrainage(bounds, num_hydrologyc, filter_hydrologyc, & qflx_drain => waterflux_inst%qflx_drain_col , & ! sub-surface runoff (mm H2O /s) qflx_drain_perched => waterflux_inst%qflx_drain_perched_col , & ! perched wt sub-surface runoff (mm H2O /s) qflx_qrgwl => waterflux_inst%qflx_qrgwl_col , & ! qflx_surf at glaciers, wetlands, lakes (mm H2O /s) + qflx_surf => waterflux_inst%qflx_surf_col , & ! surface runoff (mm H2O /s) qflx_rsub_sat => waterflux_inst%qflx_rsub_sat_col , & ! soil saturation excess [mm h2o/s] qflx_infl => waterflux_inst%qflx_infl_col , & ! infiltration (mm H2O /s) qflx_rootsoi => waterflux_inst%qflx_rootsoi_col , & ! vegetation/soil water exchange (mm H2O/s) (+ = to atm) @@ -2409,6 +2410,17 @@ subroutine ParFlowDrainage(bounds, num_hydrologyc, filter_hydrologyc, & qflx_drain(c) = 0._r8 ! This must be done for roofs and impervious road (walls will be zero) qflx_qrgwl(c) = qflx_snwcp_liq(c) + + ! Instead of leaving as river runoff, impervious urban runoff enters + ! ParFlow through layer 1. It is zeroed here so it is not counted twice. + qflx_parflow(c,1:nlevsoi) = 0._r8 + qflx_parflow(c,1) = qflx_surf(c) + qflx_qrgwl(c) + qflx_surf(c) = 0._r8 + qflx_qrgwl(c) = 0._r8 + + qflx_drain(c) = -sum(qflx_parflow(c,:)) + + qflx_parflow(c,1:nlevsoi) = qflx_parflow(c,1:nlevsoi) * sec_per_hr * m_per_mm * (1._r8/dz(c,1:nlevsoi)) end if end do end associate