From 15d00155726bc85578f5a581461759bf575cdc7a Mon Sep 17 00:00:00 2001 From: Clark Evans Date: Tue, 17 Mar 2026 21:59:45 -0600 Subject: [PATCH 1/4] NoahMP ten-layer configuration changes Based on guidance from Cenlin He and the NoahMP team at NSF NCAR-RAL --- .../physics/mpas_atmphys_initialize_real.F | 53 ++++++++++++++++++- .../physics_noahmp/parameters/NoahmpTable.TBL | 4 +- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/core_atmosphere/physics/mpas_atmphys_initialize_real.F b/src/core_atmosphere/physics/mpas_atmphys_initialize_real.F index 8a2969b837..e5882e9110 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_initialize_real.F +++ b/src/core_atmosphere/physics/mpas_atmphys_initialize_real.F @@ -321,6 +321,9 @@ subroutine init_soil_layers_depth(mesh, fg, dims, configs) !case('ruc') ! if(config_nsoillevels .ne. 9) & ! call physics_error_fatal('RUC lsm uses only 9 soil layers currently. Correct config_nsoillevels.') + !case('noahmp') + ! if(config_nsoillevels .ne. 10) & + ! call physics_error_fatal('This version of Noah-MP lsm uses 10 soil layers. Correct config_nsoillevels.') !end select selectcase (config_nsoillevels) @@ -376,6 +379,38 @@ subroutine init_soil_layers_depth(mesh, fg, dims, configs) dzs(nSoilLevels,iCell) = zs2(nSoilLevels) - zs2(nSoilLevels-1) enddo deallocate(zs2) + + case( 10 ) + do iCell = 1, nCellsSolve + iSoil = 1 + zs_fg(iSoil,iCell) = 0.5_RKIND * dzs_fg(iSoil,iCell) + do iSoil = 2, nFGSoilLevels + zs_fg(iSoil,iCell) = zs_fg(iSoil-1,iCell) & + + 0.5_RKIND * dzs_fg(iSoil-1,iCell) & + + 0.5_RKIND * dzs_fg(iSoil,iCell) + enddo + enddo + + do iCell = 1, nCellsSolve + dzs(1,iCell) = 0.05_RKIND + dzs(2,iCell) = 0.10_RKIND + dzs(3,iCell) = 0.10_RKIND + dzs(4,iCell) = 0.10_RKIND + dzs(5,iCell) = 0.30_RKIND + dzs(6,iCell) = 0.35_RKIND + dzs(7,iCell) = 0.50_RKIND + dzs(8,iCell) = 1.00_RKIND + dzs(9,iCell) = 1.00_RKIND + dzs(10,iCell) = 1.50_RKIND + + iSoil = 1 + zs(iSoil,iCell) = 0.5_RKIND * dzs(iSoil,iCell) + do iSoil = 2, nSoilLevels + zs(iSoil,iCell) = zs(iSoil-1,iCell) & + + 0.5_RKIND * dzs(iSoil-1,iCell) & + + 0.5_RKIND * dzs(iSoil,iCell) + enddo + enddo end select end subroutine init_soil_layers_depth @@ -447,6 +482,8 @@ subroutine init_soil_layers_properties(mesh, fg, dminfo, dims, configs) num_st = 0 do iCell = 1, nCellsSolve do ifgSoil = 1, nFGSoilLevels + if(st_fg(ifgSoil,iCell) .le. 0._RKIND) st_fg(ifgSoil,iCell) = tmn(iCell) + if(sm_fg(ifgSoil,iCell) .le. 0._RKIND) sm_fg(ifgSoil,iCell) = 0.20 if(st_fg(ifgSoil,iCell) .le. 0._RKIND) num_st = num_st + 1 if(sm_fg(ifgSoil,iCell) .lt. 0._RKIND) num_sm = num_sm + 1 enddo @@ -468,6 +505,11 @@ subroutine init_soil_layers_properties(mesh, fg, dminfo, dims, configs) ! call physics_error_fatal('RUC lsm uses 9 soil layers. Correct config_nsoillevels.') call init_soil_properties_ruc(mesh, fg, dminfo, dims, configs) + case ( 10 ) + ! if(config_nsoillevels .ne. 10) & + ! call physics_error_fatal('This version of Noah-MP lsm uses 10 soil layers. Correct config_nsoillevels.') + call init_soil_properties_noah(mesh, fg, dminfo, dims, configs) + end select end subroutine init_soil_layers_properties @@ -536,7 +578,16 @@ subroutine init_soil_properties_noah(mesh, fg, dminfo, dims, configs) sm_input(ifgSoil+1,iCell) = sm_fg(ifgSoil,iCell) enddo - zhave(nFGSoilLevels+2,iCell) = 300._RKIND/100._RKIND +!... block to determine max depth (based on 2-m for Noah and 5-m for NoahMP) +! can get away without an else block because this subroutine is only +! called if nSoilLevels is either 4 or 10 + if(nSoilLevels .eq. 4) then + zhave(nFGSoilLevels+2,iCell) = 300._RKIND/100._RKIND + elseif(nSoilLevels .eq. 10) then + zhave(nFGSoilLevels+2,iCell) = 600._RKIND/100._RKIND + else + + endif st_input(nFGSoilLevels+2,iCell) = tmn(iCell) sm_input(nFGSoilLevels+2,iCell) = sm_input(nFGSoilLevels,iCell) diff --git a/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL b/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL index c9d37c5b40..0da210d721 100644 --- a/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL +++ b/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL @@ -157,7 +157,7 @@ ! MRP: microbial respiration parameter (umol CO2/kgC/s) MRP = 0.00, 0.23, 0.23, 0.23, 0.23, 0.23, 0.17, 0.19, 0.19, 0.40, 0.40, 0.37, 0.23, 0.37, 0.30, 0.00, 0.17, 0.40, 0.00, 0.17, 0.23, 0.20, 0.00, 0.00, 0.20, 0.00, 0.00, ! NROOT: number of soil layers with root present - NROOT = 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 2, 2, 1, 3, 3, 3, 2, 1, 1, 0, 0, + NROOT = 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 0, 4, 4, 2, 6, 6, 6, 4, 2, 2, 0, 0, ! RGL: Parameter used in radiation stress function RGL = 999.0, 100.0, 100.0, 100.0, 100.0, 65.0, 100.0, 100.0, 100.0, 65.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 30.0, 999.0, 100.0, 100.0, 100.0, 100.0, 999.0, 100.0, 999.0, 999.0, ! RS: Minimum stomatal resistance (s/m) @@ -353,7 +353,7 @@ ! MRP: microbial respiration parameter (umol CO2/kgC/s) MRP = 0.37, 0.23, 0.37, 0.40, 0.30, 0.19, 0.19, 0.19, 0.40, 0.17, 0.285, 0.23, 0.00, 0.23, 0.00, 0.00, 0.00, 0.23, 0.20, 0.00, ! NROOT: number of soil layers with root present - NROOT = 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 3, 1, 3, 1, 1, 0, 3, 3, 2, + NROOT = 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 4, 6, 2, 6, 2, 2, 0, 6, 6, 4, ! RGL: Parameter used in radiation stress function RGL = 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 100.0, 100.0, 65.0, 100.0, 65.0, 100.0, 999.0, 100.0, 999.0, 999.0, 30.0, 100.0, 100.0, 100.0, ! RS: Minimum stomatal resistance (s/m) From c0c4a3004f9eec2577aa1ce7bebbde51538bd68a Mon Sep 17 00:00:00 2001 From: Clark Evans Date: Wed, 18 Mar 2026 08:42:35 -0600 Subject: [PATCH 2/4] Reverting NoahMP table for CI tests --- .../physics/physics_noahmp/parameters/NoahmpTable.TBL | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL b/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL index 0da210d721..c9d37c5b40 100644 --- a/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL +++ b/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL @@ -157,7 +157,7 @@ ! MRP: microbial respiration parameter (umol CO2/kgC/s) MRP = 0.00, 0.23, 0.23, 0.23, 0.23, 0.23, 0.17, 0.19, 0.19, 0.40, 0.40, 0.37, 0.23, 0.37, 0.30, 0.00, 0.17, 0.40, 0.00, 0.17, 0.23, 0.20, 0.00, 0.00, 0.20, 0.00, 0.00, ! NROOT: number of soil layers with root present - NROOT = 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 0, 4, 4, 2, 6, 6, 6, 4, 2, 2, 0, 0, + NROOT = 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 2, 2, 1, 3, 3, 3, 2, 1, 1, 0, 0, ! RGL: Parameter used in radiation stress function RGL = 999.0, 100.0, 100.0, 100.0, 100.0, 65.0, 100.0, 100.0, 100.0, 65.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 30.0, 999.0, 100.0, 100.0, 100.0, 100.0, 999.0, 100.0, 999.0, 999.0, ! RS: Minimum stomatal resistance (s/m) @@ -353,7 +353,7 @@ ! MRP: microbial respiration parameter (umol CO2/kgC/s) MRP = 0.37, 0.23, 0.37, 0.40, 0.30, 0.19, 0.19, 0.19, 0.40, 0.17, 0.285, 0.23, 0.00, 0.23, 0.00, 0.00, 0.00, 0.23, 0.20, 0.00, ! NROOT: number of soil layers with root present - NROOT = 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 4, 6, 2, 6, 2, 2, 0, 6, 6, 4, + NROOT = 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 3, 1, 3, 1, 1, 0, 3, 3, 2, ! RGL: Parameter used in radiation stress function RGL = 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 100.0, 100.0, 65.0, 100.0, 65.0, 100.0, 999.0, 100.0, 999.0, 999.0, 30.0, 100.0, 100.0, 100.0, ! RS: Minimum stomatal resistance (s/m) From 9a269c18af2d7324a660cc080451979350201b4e Mon Sep 17 00:00:00 2001 From: Clark Evans Date: Wed, 18 Mar 2026 10:09:12 -0600 Subject: [PATCH 3/4] Add back NoahmpTable.TBL changes --- .../physics/physics_noahmp/parameters/NoahmpTable.TBL | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL b/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL index c9d37c5b40..0da210d721 100644 --- a/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL +++ b/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL @@ -157,7 +157,7 @@ ! MRP: microbial respiration parameter (umol CO2/kgC/s) MRP = 0.00, 0.23, 0.23, 0.23, 0.23, 0.23, 0.17, 0.19, 0.19, 0.40, 0.40, 0.37, 0.23, 0.37, 0.30, 0.00, 0.17, 0.40, 0.00, 0.17, 0.23, 0.20, 0.00, 0.00, 0.20, 0.00, 0.00, ! NROOT: number of soil layers with root present - NROOT = 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 2, 2, 1, 3, 3, 3, 2, 1, 1, 0, 0, + NROOT = 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 0, 4, 4, 2, 6, 6, 6, 4, 2, 2, 0, 0, ! RGL: Parameter used in radiation stress function RGL = 999.0, 100.0, 100.0, 100.0, 100.0, 65.0, 100.0, 100.0, 100.0, 65.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 30.0, 999.0, 100.0, 100.0, 100.0, 100.0, 999.0, 100.0, 999.0, 999.0, ! RS: Minimum stomatal resistance (s/m) @@ -353,7 +353,7 @@ ! MRP: microbial respiration parameter (umol CO2/kgC/s) MRP = 0.37, 0.23, 0.37, 0.40, 0.30, 0.19, 0.19, 0.19, 0.40, 0.17, 0.285, 0.23, 0.00, 0.23, 0.00, 0.00, 0.00, 0.23, 0.20, 0.00, ! NROOT: number of soil layers with root present - NROOT = 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 3, 1, 3, 1, 1, 0, 3, 3, 2, + NROOT = 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 4, 6, 2, 6, 2, 2, 0, 6, 6, 4, ! RGL: Parameter used in radiation stress function RGL = 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 100.0, 100.0, 65.0, 100.0, 65.0, 100.0, 999.0, 100.0, 999.0, 999.0, 30.0, 100.0, 100.0, 100.0, ! RS: Minimum stomatal resistance (s/m) From d043852df297280ce9bb61976b1d868228d1273e Mon Sep 17 00:00:00 2001 From: willmayfield Date: Wed, 26 Aug 2026 11:05:27 -0600 Subject: [PATCH 4/4] changes to allow NoahMP to use 10 layer soil --- src/core_atmosphere/physics/Registry_noahmp.xml | 2 +- .../physics/mpas_atmphys_control.F | 17 ++++++++++++++++- .../physics/mpas_atmphys_driver_lsm_noahmp.F | 10 +++++----- .../physics/mpas_atmphys_initialize_real.F | 8 +++++--- .../physics_noahmp/parameters/NoahmpTable.TBL | 2 ++ 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/core_atmosphere/physics/Registry_noahmp.xml b/src/core_atmosphere/physics/Registry_noahmp.xml index 89d980f724..ec4c7b030a 100644 --- a/src/core_atmosphere/physics/Registry_noahmp.xml +++ b/src/core_atmosphere/physics/Registry_noahmp.xml @@ -16,7 +16,7 @@ - diff --git a/src/core_atmosphere/physics/mpas_atmphys_control.F b/src/core_atmosphere/physics/mpas_atmphys_control.F index 6c0b81327a..6329e3e884 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_control.F +++ b/src/core_atmosphere/physics/mpas_atmphys_control.F @@ -419,7 +419,7 @@ subroutine physics_registry_init(mesh,configs,sfc_input) lsm_select: select case(trim(config_lsm_scheme)) - case("sf_noah","sf_noahmp") + case("sf_noah") !initialize the thickness of the soil layers for the Noah scheme: do iCell = 1, nCells dzs(1,iCell) = 0.10_RKIND @@ -428,6 +428,21 @@ subroutine physics_registry_init(mesh,configs,sfc_input) dzs(4,iCell) = 1.00_RKIND enddo + case("sf_noahmp") + !initialize the thickness of the soil layers for the NoahMP scheme: + do iCell = 1, nCells + dzs(1,iCell) = 0.05_RKIND + dzs(2,iCell) = 0.10_RKIND + dzs(3,iCell) = 0.10_RKIND + dzs(4,iCell) = 0.10_RKIND + dzs(5,iCell) = 0.30_RKIND + dzs(6,iCell) = 0.35_RKIND + dzs(7,iCell) = 0.50_RKIND + dzs(8,iCell) = 1.00_RKIND + dzs(9,iCell) = 1.00_RKIND + dzs(10,iCell) = 1.50_RKIND + enddo + case("sf_ruc") do iCell = 1,nCells dzs(1,iCell) = 0.005_RKIND diff --git a/src/core_atmosphere/physics/mpas_atmphys_driver_lsm_noahmp.F b/src/core_atmosphere/physics/mpas_atmphys_driver_lsm_noahmp.F index 3b02af2f60..fc6024e318 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_driver_lsm_noahmp.F +++ b/src/core_atmosphere/physics/mpas_atmphys_driver_lsm_noahmp.F @@ -854,14 +854,14 @@ subroutine lsm_noahmp_toMPAS(diag_physics,diag_physics_noahmp,output_noahmp,sfc_ snicexy(ns,i) = mpas_noahmp%snicexy(i,n) snliqxy(ns,i) = mpas_noahmp%snliqxy(i,n) enddo - do ns = 1,nsnow + do ns = 1,nzsnow n = ns - nsnow zsnsoxy(ns,i) = mpas_noahmp%zsnsoxy(i,n) enddo - do ns = nsnow+1,nzsnow - n = ns - nsoil + 1 - zsnsoxy(ns,i) = mpas_noahmp%zsnsoxy(i,n) - enddo +! do ns = nsnow+1,nzsnow +! n = ns - nsoil + 1 +! zsnsoxy(ns,i) = mpas_noahmp%zsnsoxy(i,n) +! enddo enddo diff --git a/src/core_atmosphere/physics/mpas_atmphys_initialize_real.F b/src/core_atmosphere/physics/mpas_atmphys_initialize_real.F index e5882e9110..a081f9450a 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_initialize_real.F +++ b/src/core_atmosphere/physics/mpas_atmphys_initialize_real.F @@ -504,6 +504,11 @@ subroutine init_soil_layers_properties(mesh, fg, dminfo, dims, configs) !if(config_nsoillevels .ne. 9) & ! call physics_error_fatal('RUC lsm uses 9 soil layers. Correct config_nsoillevels.') call init_soil_properties_ruc(mesh, fg, dminfo, dims, configs) + case ( 10 ) + ! if(config_nsoillevels .ne. 10) & + ! call physics_error_fatal('This version of Noah-MP lsm uses 10 soil layers. Correct config_nsoillevels.') + call init_soil_properties_noah(mesh, fg, dminfo, dims, configs) + case ( 10 ) ! if(config_nsoillevels .ne. 10) & @@ -578,9 +583,6 @@ subroutine init_soil_properties_noah(mesh, fg, dminfo, dims, configs) sm_input(ifgSoil+1,iCell) = sm_fg(ifgSoil,iCell) enddo -!... block to determine max depth (based on 2-m for Noah and 5-m for NoahMP) -! can get away without an else block because this subroutine is only -! called if nSoilLevels is either 4 or 10 if(nSoilLevels .eq. 4) then zhave(nFGSoilLevels+2,iCell) = 300._RKIND/100._RKIND elseif(nSoilLevels .eq. 10) then diff --git a/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL b/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL index 0da210d721..0c4bdf86bc 100644 --- a/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL +++ b/src/core_atmosphere/physics/physics_noahmp/parameters/NoahmpTable.TBL @@ -157,6 +157,7 @@ ! MRP: microbial respiration parameter (umol CO2/kgC/s) MRP = 0.00, 0.23, 0.23, 0.23, 0.23, 0.23, 0.17, 0.19, 0.19, 0.40, 0.40, 0.37, 0.23, 0.37, 0.30, 0.00, 0.17, 0.40, 0.00, 0.17, 0.23, 0.20, 0.00, 0.00, 0.20, 0.00, 0.00, ! NROOT: number of soil layers with root present +! NROOT = 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 2, 2, 1, 3, 3, 3, 2, 1, 1, 0, 0, NROOT = 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 0, 4, 4, 2, 6, 6, 6, 4, 2, 2, 0, 0, ! RGL: Parameter used in radiation stress function RGL = 999.0, 100.0, 100.0, 100.0, 100.0, 65.0, 100.0, 100.0, 100.0, 65.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 30.0, 999.0, 100.0, 100.0, 100.0, 100.0, 999.0, 100.0, 999.0, 999.0, @@ -353,6 +354,7 @@ ! MRP: microbial respiration parameter (umol CO2/kgC/s) MRP = 0.37, 0.23, 0.37, 0.40, 0.30, 0.19, 0.19, 0.19, 0.40, 0.17, 0.285, 0.23, 0.00, 0.23, 0.00, 0.00, 0.00, 0.23, 0.20, 0.00, ! NROOT: number of soil layers with root present +! NROOT = 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 3, 1, 3, 1, 1, 0, 3, 3, 2, NROOT = 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 4, 6, 2, 6, 2, 2, 0, 6, 6, 4, ! RGL: Parameter used in radiation stress function RGL = 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 100.0, 100.0, 65.0, 100.0, 65.0, 100.0, 999.0, 100.0, 999.0, 999.0, 30.0, 100.0, 100.0, 100.0,