diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py
index 53c7c8b55..586182c88 100755
--- a/ccpp/config/ccpp_prebuild_config.py
+++ b/ccpp/config/ccpp_prebuild_config.py
@@ -127,6 +127,8 @@
'FV3/ccpp/physics/physics/module_sf_mynn.F90',
'FV3/ccpp/physics/physics/module_SF_JSFC.F90',
'FV3/ccpp/physics/physics/module_BL_MYJPBL.F90',
+ 'FV3/ccpp/physics/physics/module_sf_noahlsm.F90',
+ 'FV3/ccpp/physics/physics/module_sf_noahlsm_glacial_only.F90',
'FV3/ccpp/physics/physics/module_sf_noahmp_glacier.f90',
'FV3/ccpp/physics/physics/module_sf_noahmplsm.f90',
'FV3/ccpp/physics/physics/cires_ugwp_module.F90',
@@ -173,6 +175,7 @@
'FV3/ccpp/physics/physics/namelist_soilveg_ruc.F90',
'FV3/ccpp/physics/physics/set_soilveg_ruc.F90',
'FV3/ccpp/physics/physics/module_soil_pre.F90',
+ 'FV3/ccpp/physics/physics/module_sf_exchcoef.f90',
# RRTMGP
'FV3/ccpp/physics/physics/rte-rrtmgp/rrtmgp/mo_gas_concentrations.F90',
'FV3/ccpp/physics/physics/rte-rrtmgp/rrtmgp/mo_gas_optics.F90',
@@ -241,6 +244,7 @@
'FV3/ccpp/physics/physics/get_prs_fv3.F90' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/gfdl_cloud_microphys.F90' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/gfdl_fv_sat_adj.F90' : [ 'fast_physics' ],
+ 'FV3/ccpp/physics/physics/gfdl_sfc_layer.F90' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/gscond.f' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/gwdc.f' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/gwdps.f' : [ 'slow_physics' ],
@@ -289,6 +293,8 @@
'FV3/ccpp/physics/physics/sfc_cice.f' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/sfc_diff.f' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/sfc_drv.f' : [ 'slow_physics' ],
+ 'FV3/ccpp/physics/physics/sfc_noah_wrfv4_interstitial.F90' : [ 'slow_physics' ],
+ 'FV3/ccpp/physics/physics/sfc_noah_wrfv4.F90' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/sfc_noahmp_drv.f' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/sfc_nst.f' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/sfc_ocean.F' : [ 'slow_physics' ],
diff --git a/ccpp/physics b/ccpp/physics
index 0d4717a39..76a02b8e8 160000
--- a/ccpp/physics
+++ b/ccpp/physics
@@ -1 +1 @@
-Subproject commit 0d4717a39525cdc5b5655701dc67a29274340cd4
+Subproject commit 76a02b8e80c4b96e4cd6a60c8fdacd78fd9726e7
diff --git a/ccpp/suites/suite_FV3_GFS_v15p2_HWRF_LSM.xml b/ccpp/suites/suite_FV3_GFS_v15p2_HWRF_LSM.xml
new file mode 100644
index 000000000..4dda5eb5c
--- /dev/null
+++ b/ccpp/suites/suite_FV3_GFS_v15p2_HWRF_LSM.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+ fv_sat_adj
+
+
+
+
+ GFS_time_vary_pre
+ GFS_rrtmg_setup
+ GFS_rad_time_vary
+ GFS_phys_time_vary
+
+
+
+
+ GFS_suite_interstitial_rad_reset
+ GFS_rrtmg_pre
+ rrtmg_sw_pre
+ rrtmg_sw
+ rrtmg_sw_post
+ rrtmg_lw_pre
+ rrtmg_lw
+ rrtmg_lw_post
+ GFS_rrtmg_post
+
+
+
+
+ GFS_suite_interstitial_phys_reset
+ GFS_suite_stateout_reset
+ get_prs_fv3
+ GFS_suite_interstitial_1
+ GFS_surface_generic_pre
+ GFS_surface_composites_pre
+ dcyc2t3
+ GFS_surface_composites_inter
+ GFS_suite_interstitial_2
+
+
+
+ sfc_diff
+ GFS_surface_loop_control_part1
+ sfc_nst_pre
+ sfc_nst
+ sfc_nst_post
+ sfc_noah_wrfv4_pre
+ sfc_noah_wrfv4
+ sfc_noah_wrfv4_post
+ sfc_sice
+ GFS_surface_loop_control_part2
+
+
+
+ GFS_surface_composites_post
+ sfc_diag
+ sfc_diag_post
+ GFS_surface_generic_post
+ GFS_PBL_generic_pre
+ hedmf
+ GFS_PBL_generic_post
+ GFS_GWD_generic_pre
+ cires_ugwp
+ cires_ugwp_post
+ GFS_GWD_generic_post
+ rayleigh_damp
+ GFS_suite_stateout_update
+ ozphys_2015
+ h2ophys
+ GFS_DCNV_generic_pre
+ get_phi_fv3
+ GFS_suite_interstitial_3
+ samfdeepcnv
+ GFS_DCNV_generic_post
+ GFS_SCNV_generic_pre
+ samfshalcnv
+ GFS_SCNV_generic_post
+ GFS_suite_interstitial_4
+ cnvc90
+ GFS_MP_generic_pre
+ gfdl_cloud_microphys
+ GFS_MP_generic_post
+ maximum_hourly_diagnostics
+
+
+
+
+ GFS_stochastics
+
+
+
+
diff --git a/ccpp/suites/suite_FV3_GFS_v15p2_HWRF_LSM_SL.xml b/ccpp/suites/suite_FV3_GFS_v15p2_HWRF_LSM_SL.xml
new file mode 100644
index 000000000..6feb22484
--- /dev/null
+++ b/ccpp/suites/suite_FV3_GFS_v15p2_HWRF_LSM_SL.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+ fv_sat_adj
+
+
+
+
+ GFS_time_vary_pre
+ GFS_rrtmg_setup
+ GFS_rad_time_vary
+ GFS_phys_time_vary
+
+
+
+
+ GFS_suite_interstitial_rad_reset
+ GFS_rrtmg_pre
+ rrtmg_sw_pre
+ rrtmg_sw
+ rrtmg_sw_post
+ rrtmg_lw_pre
+ rrtmg_lw
+ rrtmg_lw_post
+ GFS_rrtmg_post
+
+
+
+
+ GFS_suite_interstitial_phys_reset
+ GFS_suite_stateout_reset
+ get_prs_fv3
+ GFS_suite_interstitial_1
+ GFS_surface_generic_pre
+ GFS_surface_composites_pre
+ dcyc2t3
+ GFS_surface_composites_inter
+ GFS_suite_interstitial_2
+
+
+
+ gfdl_sfc_layer
+ GFS_surface_loop_control_part1
+ sfc_nst_pre
+ sfc_nst
+ sfc_nst_post
+ sfc_noah_wrfv4_pre
+ sfc_noah_wrfv4
+ sfc_noah_wrfv4_post
+ sfc_sice
+ GFS_surface_loop_control_part2
+
+
+
+ GFS_surface_composites_post
+ sfc_diag
+ sfc_diag_post
+ GFS_surface_generic_post
+ GFS_PBL_generic_pre
+ hedmf
+ GFS_PBL_generic_post
+ GFS_GWD_generic_pre
+ cires_ugwp
+ cires_ugwp_post
+ GFS_GWD_generic_post
+ rayleigh_damp
+ GFS_suite_stateout_update
+ ozphys_2015
+ h2ophys
+ GFS_DCNV_generic_pre
+ get_phi_fv3
+ GFS_suite_interstitial_3
+ samfdeepcnv
+ GFS_DCNV_generic_post
+ GFS_SCNV_generic_pre
+ samfshalcnv
+ GFS_SCNV_generic_post
+ GFS_suite_interstitial_4
+ cnvc90
+ GFS_MP_generic_pre
+ gfdl_cloud_microphys
+ GFS_MP_generic_post
+ maximum_hourly_diagnostics
+
+
+
+
+ GFS_stochastics
+
+
+
+
diff --git a/ccpp/suites/suite_FV3_GFS_v15p2_HWRF_SL.xml b/ccpp/suites/suite_FV3_GFS_v15p2_HWRF_SL.xml
new file mode 100644
index 000000000..30f4efbdd
--- /dev/null
+++ b/ccpp/suites/suite_FV3_GFS_v15p2_HWRF_SL.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+ fv_sat_adj
+
+
+
+
+ GFS_time_vary_pre
+ GFS_rrtmg_setup
+ GFS_rad_time_vary
+ GFS_phys_time_vary
+
+
+
+
+ GFS_suite_interstitial_rad_reset
+ GFS_rrtmg_pre
+ rrtmg_sw_pre
+ rrtmg_sw
+ rrtmg_sw_post
+ rrtmg_lw_pre
+ rrtmg_lw
+ rrtmg_lw_post
+ GFS_rrtmg_post
+
+
+
+
+ GFS_suite_interstitial_phys_reset
+ GFS_suite_stateout_reset
+ get_prs_fv3
+ GFS_suite_interstitial_1
+ GFS_surface_generic_pre
+ GFS_surface_composites_pre
+ dcyc2t3
+ GFS_surface_composites_inter
+ GFS_suite_interstitial_2
+
+
+
+ gfdl_sfc_layer
+ GFS_surface_loop_control_part1
+ sfc_nst_pre
+ sfc_nst
+ sfc_nst_post
+ lsm_noah
+ sfc_sice
+ GFS_surface_loop_control_part2
+
+
+
+ GFS_surface_composites_post
+ sfc_diag
+ sfc_diag_post
+ GFS_surface_generic_post
+ GFS_PBL_generic_pre
+ hedmf
+ GFS_PBL_generic_post
+ GFS_GWD_generic_pre
+ cires_ugwp
+ cires_ugwp_post
+ GFS_GWD_generic_post
+ rayleigh_damp
+ GFS_suite_stateout_update
+ ozphys_2015
+ h2ophys
+ GFS_DCNV_generic_pre
+ get_phi_fv3
+ GFS_suite_interstitial_3
+ samfdeepcnv
+ GFS_DCNV_generic_post
+ GFS_SCNV_generic_pre
+ samfshalcnv
+ GFS_SCNV_generic_post
+ GFS_suite_interstitial_4
+ cnvc90
+ GFS_MP_generic_pre
+ gfdl_cloud_microphys
+ GFS_MP_generic_post
+ maximum_hourly_diagnostics
+
+
+
+
+ GFS_stochastics
+
+
+
+
diff --git a/ccpp/suites/suite_HAFS_v0_hwrf.xml b/ccpp/suites/suite_HAFS_v0_hwrf.xml
index 9c0b77113..70ea71dc7 100644
--- a/ccpp/suites/suite_HAFS_v0_hwrf.xml
+++ b/ccpp/suites/suite_HAFS_v0_hwrf.xml
@@ -37,12 +37,14 @@
- sfc_diff
+ gfdl_sfc_layer
GFS_surface_loop_control_part1
sfc_nst_pre
sfc_nst
sfc_nst_post
- lsm_noah
+ sfc_noah_wrfv4_pre
+ sfc_noah_wrfv4
+ sfc_noah_wrfv4_post
sfc_sice
GFS_surface_loop_control_part2
diff --git a/gfsphysics/GFS_layer/GFS_typedefs.F90 b/gfsphysics/GFS_layer/GFS_typedefs.F90
index 295d748be..8d7554a99 100644
--- a/gfsphysics/GFS_layer/GFS_typedefs.F90
+++ b/gfsphysics/GFS_layer/GFS_typedefs.F90
@@ -243,6 +243,8 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: fice (:) => null() !< ice fraction over open water grid
! real (kind=kind_phys), pointer :: hprim (:) => null() !< topographic standard deviation in m
real (kind=kind_phys), pointer :: hprime (:,:) => null() !< orographic metrics
+ real (kind=kind_phys), pointer :: z0base (:) => null() !< background or baseline surface roughness length in m
+ real (kind=kind_phys), pointer :: semisbase(:)=> null() !< background surface emissivity
!--- In (radiation only)
real (kind=kind_phys), pointer :: sncovr (:) => null() !< snow cover in fraction
@@ -327,7 +329,8 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: smoiseq (:,:) => null() !<
real (kind=kind_phys), pointer :: zsnsoxy (:,:) => null() !<
-
+! -- In/Out for HWRF NOAH LSM
+ real (kind=kind_phys), pointer :: snotime (:) => null()
!--- NSSTM variables (only allocated when [Model%nstf_name(1) > 0])
real (kind=kind_phys), pointer :: tref (:) => null() !< nst_fld%Tref - Reference Temperature
@@ -752,18 +755,33 @@ module GFS_typedefs
integer :: lsm_noah=1 !< flag for NOAH land surface model
integer :: lsm_noahmp=2 !< flag for NOAH land surface model
integer :: lsm_ruc=3 !< flag for RUC land surface model
+ integer :: lsm_noah_wrfv4 = 4 !< flag for NOAH land surface from WRF v4.0
integer :: lsoil !< number of soil layers
+ integer :: ivegsrc !< ivegsrc = 0 => USGS,
+ !< ivegsrc = 1 => IGBP (20 category)
+ !< ivegsrc = 2 => UMD (13 category)
+ !< ivegsrc = 3 => NLCD40 (40 category, NOAH WRFv4 only)
+ !< ivegsrc = 4 => USGS-RUC (28 category, NOAH WRFv4 only)
+ !< ivegsrc = 5 => MODI-RUC (21 category, NOAH WRFv4 only)
+ integer :: isot !< isot = 0 => Zobler soil type ( 9 category)
+ !< isot = 1 => STATSGO soil type (19 category, AKA 'STAS'(?))
+ !< isot = 2 => STAS-RUC soil type (19 category, NOAH WRFv4 only)
#ifdef CCPP
integer :: lsoil_lsm !< number of soil layers internal to land surface model
integer :: lsnow_lsm !< maximum number of snow layers internal to land surface model
integer :: lsnow_lsm_lbound!< lower bound for snow arrays, depending on lsnow_lsm
- logical :: rdlai
+ logical :: rdlai !< read LAI from input file (for RUC LSM or NOAH LSM WRFv4)
+ logical :: ua_phys !< flag for using University of Arizona? extension to NOAH LSM WRFv4
+ logical :: usemonalb !< flag to read surface diffused shortwave albedo from input file for NOAH LSM WRFv4
+ real(kind=kind_phys) :: aoasis !< potential evaporation multiplication factor for NOAH LSM WRFv4
+ integer :: fasdas !< flag to use "flux-adjusting surface data assimilation system"; 0 = OFF, 1 = ON
+ integer :: isurban !< vegetation/land use type corresponding to the urban environment for the chosen ivegsrc
+ integer :: isice !< vegetation/land use type corresponding to permanent ice/snow for the chosen ivegsrc
+ integer :: iswater !< vegetation/land use type corresponding to water bodies for the chosen ivegsrc
+ integer :: iopt_thcnd !< option to treat thermal conductivity in Noah LSM (new in 3.8)
+ !< = 1, original (default)
+ !< = 2, McCumber and Pielke for silt loam and sandy loam
#endif
- integer :: ivegsrc !< ivegsrc = 0 => USGS,
- !< ivegsrc = 1 => IGBP (20 category)
- !< ivegsrc = 2 => UMD (13 category)
- integer :: isot !< isot = 0 => Zobler soil type ( 9 category)
- !< isot = 1 => STATSGO soil type (19 category)
! -- the Noah MP options
integer :: iopt_dveg ! 1-> off table lai 2-> on 3-> off;4->off;5 -> on
@@ -781,6 +799,14 @@ module GFS_typedefs
logical :: use_ufo !< flag for gcycle surface option
+#ifdef CCPP
+ ! GFDL Surface Layer options
+ logical :: lcurr_sf !flag for taking ocean currents into account in GFDL surface layer
+ logical :: pert_cd !flag for perturbing the surface drag coefficient for momentum in surface layer scheme (1 = True)
+ integer :: ntsflg !flag for updating skin temperature in the GFDL surface layer scheme
+ real(kind=kind_phys) :: sfenth !enthalpy flux factor 0 zot via charnock ..>0 zot enhanced>15m/s
+#endif
+
!--- tuning parameters for physical parameterizations
logical :: ras !< flag for ras convection scheme
logical :: flipv !< flag for vertical direction flip (ras)
@@ -1264,7 +1290,6 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: phy_myj_qz0(:) => null() !
real (kind=kind_phys), pointer :: phy_myj_uz0(:) => null() !
real (kind=kind_phys), pointer :: phy_myj_vz0(:) => null() !
- real (kind=kind_phys), pointer :: phy_myj_z0base(:) => null() !
real (kind=kind_phys), pointer :: phy_myj_akhs(:) => null() !
real (kind=kind_phys), pointer :: phy_myj_akms(:) => null() !
real (kind=kind_phys), pointer :: phy_myj_chkqlm(:) => null() !
@@ -1643,6 +1668,7 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: aerodp(:,:) => null() !<
real (kind=kind_phys), pointer :: alb1d(:) => null() !<
real (kind=kind_phys), pointer :: bexp1d(:) => null() !<
+ real (kind=kind_phys), pointer :: canopy_save(:) => null() !<
real (kind=kind_phys), pointer :: cd(:) => null() !<
real (kind=kind_phys), pointer :: cd_ice(:) => null() !<
real (kind=kind_phys), pointer :: cd_land(:) => null() !<
@@ -1655,6 +1681,7 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: chh_ice(:) => null() !<
real (kind=kind_phys), pointer :: chh_land(:) => null() !<
real (kind=kind_phys), pointer :: chh_ocean(:) => null() !<
+ real (kind=kind_phys), pointer :: chk_land(:) => null() !<
real (kind=kind_phys), pointer :: clcn(:,:) => null() !<
real (kind=kind_phys), pointer :: cldf(:) => null() !<
real (kind=kind_phys), pointer :: cldsa(:,:) => null() !<
@@ -1665,6 +1692,7 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: clw(:,:,:) => null() !<
real (kind=kind_phys), pointer :: clw_surf(:) => null() !<
real (kind=kind_phys), pointer :: clx(:,:) => null() !<
+ real (kind=kind_phys), pointer :: cmc(:) => null() !<
real (kind=kind_phys), pointer :: cmm_ice(:) => null() !<
real (kind=kind_phys), pointer :: cmm_land(:) => null() !<
real (kind=kind_phys), pointer :: cmm_ocean(:) => null() !<
@@ -1687,8 +1715,10 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: dkt(:,:) => null() !<
real (kind=kind_phys), pointer :: dlength(:) => null() !<
real (kind=kind_phys), pointer :: dqdt(:,:,:) => null() !<
+ real (kind=kind_phys), pointer :: dqsdt2(:) => null() !<
real (kind=kind_phys), pointer :: dqsfc1(:) => null() !<
real (kind=kind_phys), pointer :: drain(:) => null() !<
+ real (kind=kind_phys), pointer :: drain_in_m_sm1(:) => null() !<
real (kind=kind_phys), pointer :: dtdt(:,:) => null() !<
real (kind=kind_phys), pointer :: dtdtc(:,:) => null() !<
real (kind=kind_phys), pointer :: dtsfc1(:) => null() !<
@@ -1726,6 +1756,8 @@ module GFS_typedefs
logical, pointer :: flag_cice(:) => null() !<
logical, pointer :: flag_guess(:) => null() !<
logical, pointer :: flag_iter(:) => null() !<
+ logical, pointer :: flag_lsm(:) => null() !<
+ logical, pointer :: flag_lsm_glacier(:)=> null() !<
real (kind=kind_phys), pointer :: ffmm_ice(:) => null() !<
real (kind=kind_phys), pointer :: ffmm_land(:) => null() !<
real (kind=kind_phys), pointer :: ffmm_ocean(:) => null() !<
@@ -1838,6 +1870,8 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: qss_ice(:) => null() !<
real (kind=kind_phys), pointer :: qss_land(:) => null() !<
real (kind=kind_phys), pointer :: qss_ocean(:) => null() !<
+ real (kind=kind_phys), pointer :: qs1(:) => null() !<
+ real (kind=kind_phys), pointer :: qv1(:) => null() !<
logical :: radar_reset !<
real (kind=kind_phys) :: raddt !<
real (kind=kind_phys), pointer :: rainmp(:) => null() !<
@@ -1851,7 +1885,9 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: rb_ocean(:) => null() !<
logical :: reset !<
real (kind=kind_phys), pointer :: rhc(:,:) => null() !<
+ real (kind=kind_phys), pointer :: rho1(:) => null() !<
real (kind=kind_phys), pointer :: runoff(:) => null() !<
+ real (kind=kind_phys), pointer :: runoff_in_m_sm1(:) => null() !<
real (kind=kind_phys), pointer :: save_q(:,:,:) => null() !<
real (kind=kind_phys), pointer :: save_t(:,:) => null() !<
real (kind=kind_phys), pointer :: save_u(:,:) => null() !<
@@ -1867,27 +1903,40 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: sigmafrac(:,:) => null() !<
real (kind=kind_phys), pointer :: sigmatot(:,:) => null() !<
logical :: skip_macro !<
+ real (kind=kind_phys), pointer :: slc_save(:,:) => null() !<
integer, pointer :: slopetype(:) => null() !<
+ real (kind=kind_phys), pointer :: smcmax(:) => null() !<
+ real (kind=kind_phys), pointer :: smc_save(:,:) => null() !<
real (kind=kind_phys), pointer :: snowc(:) => null() !<
real (kind=kind_phys), pointer :: snowd_ice(:) => null() !<
real (kind=kind_phys), pointer :: snowd_land(:) => null() !<
+ real (kind=kind_phys), pointer :: snowd_land_save(:) => null() !<
real (kind=kind_phys), pointer :: snowd_ocean(:) => null() !<
+ real (kind=kind_phys), pointer :: snow_depth(:) => null() !<
real (kind=kind_phys), pointer :: snohf(:) => null() !<
+ real (kind=kind_phys), pointer :: snohf_snow(:) => null() !<
+ real (kind=kind_phys), pointer :: snohf_frzgra(:) => null() !<
+ real (kind=kind_phys), pointer :: snohf_snowmelt(:) => null() !<
real (kind=kind_phys), pointer :: snowmp(:) => null() !<
real (kind=kind_phys), pointer :: snowmt(:) => null() !<
+ real (kind=kind_phys), pointer :: soilm_in_m(:) => null() !<
integer, pointer :: soiltype(:) => null() !<
+ real (kind=kind_phys), pointer :: stc_save(:,:) => null() !<
+ real (kind=kind_phys), pointer :: sthick (:) => null() !<
real (kind=kind_phys), pointer :: stress(:) => null() !<
real (kind=kind_phys), pointer :: stress_ice(:) => null() !<
real (kind=kind_phys), pointer :: stress_land(:) => null() !<
real (kind=kind_phys), pointer :: stress_ocean(:) => null() !<
real (kind=kind_phys), pointer :: t2mmp(:) => null() !<
real (kind=kind_phys), pointer :: theta(:) => null() !<
+ real (kind=kind_phys), pointer :: th1(:) => null() !<
real (kind=kind_phys), pointer :: tice(:) => null() !<
real (kind=kind_phys), pointer :: tlvl(:,:) => null() !<
real (kind=kind_phys), pointer :: tlyr(:,:) => null() !<
real (kind=kind_phys), pointer :: tprcp_ice(:) => null() !<
real (kind=kind_phys), pointer :: tprcp_land(:) => null() !<
real (kind=kind_phys), pointer :: tprcp_ocean(:) => null() !<
+ real (kind=kind_phys), pointer :: tprcp_rate_land(:) => null() !<
integer :: tracers_start_index !<
integer :: tracers_total !<
integer :: tracers_water !<
@@ -1897,6 +1946,7 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: tsfa(:) => null() !<
real (kind=kind_phys), pointer :: tsfc_ice(:) => null() !<
real (kind=kind_phys), pointer :: tsfc_land(:) => null() !<
+ real (kind=kind_phys), pointer :: tsfc_land_save(:) => null() !<
real (kind=kind_phys), pointer :: tsfc_ocean(:) => null() !<
real (kind=kind_phys), pointer :: tsfg(:) => null() !<
real (kind=kind_phys), pointer :: tsnow(:) => null() !<
@@ -1915,6 +1965,7 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: wcbmax(:) => null() !<
real (kind=kind_phys), pointer :: weasd_ocean(:) => null() !<
real (kind=kind_phys), pointer :: weasd_land(:) => null() !<
+ real (kind=kind_phys), pointer :: weasd_land_save(:) => null() !<
real (kind=kind_phys), pointer :: weasd_ice(:) => null() !<
real (kind=kind_phys), pointer :: wind(:) => null() !<
real (kind=kind_phys), pointer :: work1(:) => null() !<
@@ -2433,6 +2484,22 @@ subroutine sfcprop_create (Sfcprop, IM, Model)
endif
#ifdef CCPP
+ ! HWRF NOAH LSM allocate and init when used
+ !
+ if (Model%lsm == Model%lsm_noah_wrfv4 ) then
+ allocate(Sfcprop%snotime(IM))
+ Sfcprop%snotime = clear_val
+ end if
+
+ if (Model%do_myjsfc.or.Model%do_myjpbl.or.(Model%lsm == Model%lsm_noah_wrfv4)) then
+ allocate(Sfcprop%z0base(IM))
+ Sfcprop%z0base = clear_val
+ end if
+ if (Model%lsm == Model%lsm_noah_wrfv4) then
+ allocate(Sfcprop%semisbase(IM))
+ Sfcprop%semisbase = clear_val
+ end if
+
if (Model%lsm == Model%lsm_ruc) then
! For land surface models with different numbers of levels than the four NOAH levels
allocate (Sfcprop%wetness (IM))
@@ -2469,7 +2536,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model)
allocate (Sfcprop%xlaixy (IM))
Sfcprop%xlaixy = clear_val
end if
-
+
end if
if (Model%do_mynnsfclay) then
! For MYNN surface layer scheme
@@ -2975,7 +3042,14 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
#ifdef CCPP
integer :: lsoil_lsm = -1 !< number of soil layers internal to land surface model; -1 use lsoil
integer :: lsnow_lsm = 3 !< maximum number of snow layers internal to land surface model
- logical :: rdlai = .false.
+ logical :: rdlai = .false. !< read LAI from input file (for RUC LSM or NOAH LSM WRFv4)
+ logical :: ua_phys = .false. !< flag for using University of Arizona? extension to NOAH LSM WRFv4
+ logical :: usemonalb = .true. !< flag to read surface diffused shortwave albedo from input file for NOAH LSM WRFv4
+ real(kind=kind_phys) :: aoasis = 1.0 !< potential evaporation multiplication factor for NOAH LSM WRFv4
+ integer :: fasdas = 0 !< flag to use "flux-adjusting surface data assimilation system"; 0 = OFF, 1 = ON
+ integer :: iopt_thcnd = 1 !< option to treat thermal conductivity in Noah LSM (new in 3.8)
+ !< = 1, original (default)
+ !< = 2, McCumber and Pielke for silt loam and sandy loam
#endif
integer :: ivegsrc = 2 !< ivegsrc = 0 => USGS,
!< ivegsrc = 1 => IGBP (20 category)
@@ -3001,6 +3075,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
logical :: use_ufo = .false. !< flag for gcycle surface option
+#ifdef CCPP
+ logical :: lcurr_sf = .false. !< flag for taking ocean currents into account in GFDL surface layer
+ logical :: pert_cd = .false. !< flag for perturbing the surface drag coefficient for momentum in surface layer scheme
+ integer :: ntsflg = 0 !< flag for updating skin temperature in the GFDL surface layer scheme
+ real(kind=kind_phys) :: sfenth = 0.0 !< enthalpy flux factor 0 zot via charnock ..>0 zot enhanced>15m/s
+#endif
+
!--- tuning parameters for physical parameterizations
logical :: ras = .false. !< flag for ras convection scheme
logical :: flipv = .true. !< flag for vertical direction flip (ras)
@@ -3283,13 +3364,18 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
!--- land/surface model control
#ifdef CCPP
lsm, lsoil, lsoil_lsm, lsnow_lsm, rdlai, &
- nmtvr, ivegsrc, use_ufo, &
+ nmtvr, ivegsrc, use_ufo, iopt_thcnd, ua_phys, usemonalb, &
+ aoasis, fasdas, &
#else
lsm, lsoil, nmtvr, ivegsrc, use_ufo, &
#endif
! Noah MP options
iopt_dveg,iopt_crs,iopt_btr,iopt_run,iopt_sfc, iopt_frz, &
iopt_inf, iopt_rad,iopt_alb,iopt_snf,iopt_tbot,iopt_stc, &
+#ifdef CCPP
+ ! GFDL surface layer options
+ lcurr_sf, pert_cd, ntsflg, sfenth, &
+#endif
!--- physical parameterizations
ras, trans_trac, old_monin, cnvgwd, mstrat, moist_adj, &
cscnv, cal_pre, do_aw, do_shoc, shocaftcnv, shoc_cld, &
@@ -3612,8 +3698,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
Model%lsoil = lsoil
#ifdef CCPP
! Consistency check for RUC LSM
- if (Model%lsm == Model%lsm_ruc .and. Model%nscyc>0) then
- write(0,*) 'Logic error: RUC LSM cannot be used with surface data cycling at this point (fhcyc>0)'
+ if ((Model%lsm == Model%lsm_ruc .or. Model%lsm == Model%lsm_noah_wrfv4) .and. Model%nscyc>0) then
+ write(0,*) 'Logic error: RUC LSM and NOAH WRFv4 LSM cannot be used with surface data cycling at this point (fhcyc>0)'
stop
end if
! Flag to read leaf area index from input files (initial conditions)
@@ -3636,11 +3722,27 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
! Set lower bound for LSM model, runs from negative (above surface) to surface (zero)
Model%lsnow_lsm_lbound = -Model%lsnow_lsm+1
end if
+ Model%isurban = -999 !GJF isurban is only used in NOAH WRFv4 and is initialized in sfc_noah_GFS_interstitial.F90/sfc_noah_GFS_pre_init
+ Model%isice = -999 !GJF isice is only used in NOAH WRFv4 and is initialized in sfc_noah_GFS_interstitial.F90/sfc_noah_GFS_pre_init
+ Model%iswater = -999 !GJF iswater is only used in NOAH WRFv4 and is initialized in sfc_noah_GFS_interstitial.F90/sfc_noah_GFS_pre_init
+ Model%iopt_thcnd = iopt_thcnd
+ Model%ua_phys = ua_phys
+ Model%usemonalb = usemonalb
+ Model%aoasis = aoasis
+ Model%fasdas = fasdas
#endif
Model%ivegsrc = ivegsrc
Model%isot = isot
Model%use_ufo = use_ufo
+#ifdef CCPP
+! GFDL surface layer options
+ Model%lcurr_sf = lcurr_sf
+ Model%pert_cd = pert_cd
+ Model%ntsflg = ntsflg
+ Model%sfenth = sfenth
+#endif
+
! Noah MP options from namelist
!
Model%iopt_dveg = iopt_dveg
@@ -4173,6 +4275,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
#ifdef CCPP
elseif (Model%lsm == Model%lsm_ruc) then
print *,' RUC Land Surface Model used'
+ elseif (Model%lsm == Model%lsm_noah_wrfv4) then
+ print *,' NOAH WRFv4 Land Surface Model used'
#else
elseif (Model%lsm == Model%lsm_ruc) then
print *,' RUC Land Surface Model only available through CCPP - job aborted'
@@ -4404,9 +4508,9 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
Model%pdfcld = .false.
Model%shcnvcw = .false.
Model%ncnd = 5
- Model%nleffr = 1
- Model%nieffr = 2
- Model%nseffr = 3
+ Model%nleffr = 1
+ Model%nieffr = 2
+ Model%nseffr = 3
if (Model%me == Model%master) print *,' Using Thompson double moment', &
' microphysics',' ltaerosol = ',Model%ltaerosol, &
' ttendlim =',Model%ttendlim, &
@@ -4742,28 +4846,37 @@ subroutine control_print(Model)
print *, ' rdlai : ', Model%rdlai
print *, ' lsoil_lsm : ', Model%lsoil_lsm
print *, ' lsnow_lsm : ', Model%lsnow_lsm
+ print *, ' iopt_thcnd : ', Model%iopt_thcnd
+ print *, ' ua_phys : ', Model%ua_phys
+ print *, ' usemonalb : ', Model%usemonalb
+ print *, ' aoasis : ', Model%aoasis
+ print *, ' fasdas : ', Model%fasdas
#endif
print *, ' ivegsrc : ', Model%ivegsrc
print *, ' isot : ', Model%isot
if (Model%lsm == Model%lsm_noahmp) then
- print *, ' Noah MP LSM is used, the options are'
- print *, ' iopt_dveg : ', Model%iopt_dveg
- print *, ' iopt_crs : ', Model%iopt_crs
- print *, ' iopt_btr : ', Model%iopt_btr
- print *, ' iopt_run : ', Model%iopt_run
- print *, ' iopt_sfc : ', Model%iopt_sfc
- print *, ' iopt_frz : ', Model%iopt_frz
- print *, ' iopt_inf : ', Model%iopt_inf
- print *, ' iopt_rad : ', Model%iopt_rad
- print *, ' iopt_alb : ', Model%iopt_alb
- print *, ' iopt_snf : ', Model%iopt_snf
- print *, ' iopt_tbot : ', Model%iopt_tbot
- print *, ' iopt_stc : ', Model%iopt_stc
-
- endif
-
+ print *, ' Noah MP LSM is used, the options are'
+ print *, ' iopt_dveg : ', Model%iopt_dveg
+ print *, ' iopt_crs : ', Model%iopt_crs
+ print *, ' iopt_btr : ', Model%iopt_btr
+ print *, ' iopt_run : ', Model%iopt_run
+ print *, ' iopt_sfc : ', Model%iopt_sfc
+ print *, ' iopt_frz : ', Model%iopt_frz
+ print *, ' iopt_inf : ', Model%iopt_inf
+ print *, ' iopt_rad : ', Model%iopt_rad
+ print *, ' iopt_alb : ', Model%iopt_alb
+ print *, ' iopt_snf : ', Model%iopt_snf
+ print *, ' iopt_tbot : ', Model%iopt_tbot
+ print *, ' iopt_stc : ', Model%iopt_stc
+ endif
print *, ' use_ufo : ', Model%use_ufo
+#ifdef CCPP
+ print *, ' lcurr_sf : ', Model%lcurr_sf
+ print *, ' pert_cd : ', Model%pert_cd
+ print *, ' ntsflg : ', Model%ntsflg
+ print *, ' sfenth : ', Model%sfenth
+#endif
print *, ' '
print *, 'tuning parameters for physical parameterizations'
print *, ' ras : ', Model%ras
@@ -5153,12 +5266,12 @@ subroutine tbd_create (Tbd, IM, Model)
Tbd%forceq = clear_val
Tbd%prevst = clear_val
Tbd%prevsq = clear_val
- end if
+ end if
- if (Model%imfdeepcnv == Model%imfdeepcnv_gf) then
- allocate(Tbd%cactiv(IM))
- Tbd%cactiv = zero
- end if
+ if (Model%imfdeepcnv == Model%imfdeepcnv_gf) then
+ allocate(Tbd%cactiv(IM))
+ Tbd%cactiv = zero
+ end if
!--- MYNN variables:
if (Model%do_mynnedmf) then
@@ -5189,8 +5302,7 @@ subroutine tbd_create (Tbd, IM, Model)
allocate (Tbd%phy_myj_thz0 (IM))
allocate (Tbd%phy_myj_qz0 (IM))
allocate (Tbd%phy_myj_uz0 (IM))
- allocate (Tbd%phy_myj_vz0 (IM))
- allocate (Tbd%phy_myj_z0base (IM))
+ allocate (Tbd%phy_myj_vz0 (IM))
allocate (Tbd%phy_myj_akhs (IM))
allocate (Tbd%phy_myj_akms (IM))
allocate (Tbd%phy_myj_chkqlm (IM))
@@ -5203,8 +5315,7 @@ subroutine tbd_create (Tbd, IM, Model)
Tbd%phy_myj_thz0 = clear_val
Tbd%phy_myj_qz0 = clear_val
Tbd%phy_myj_uz0 = clear_val
- Tbd%phy_myj_vz0 = clear_val
- Tbd%phy_myj_z0base = clear_val
+ Tbd%phy_myj_vz0 = clear_val
Tbd%phy_myj_akhs = clear_val
Tbd%phy_myj_akms = clear_val
Tbd%phy_myj_chkqlm = clear_val
@@ -6288,6 +6399,34 @@ subroutine interstitial_create (Interstitial, IM, Model)
allocate (Interstitial%t2mmp (IM))
allocate (Interstitial%q2mp (IM))
end if
+ if (Model%lsm == Model%lsm_noah_wrfv4) then
+ allocate (Interstitial%canopy_save (IM))
+ allocate (Interstitial%chk_land (IM))
+ allocate (Interstitial%cmc (IM))
+ allocate (Interstitial%dqsdt2 (IM))
+ allocate (Interstitial%drain_in_m_sm1 (IM))
+ allocate (Interstitial%flag_lsm (IM))
+ allocate (Interstitial%flag_lsm_glacier(IM))
+ allocate (Interstitial%qs1 (IM))
+ allocate (Interstitial%qv1 (IM))
+ allocate (Interstitial%rho1 (IM))
+ allocate (Interstitial%runoff_in_m_sm1 (IM))
+ allocate (Interstitial%slc_save (IM,Model%lsoil))
+ allocate (Interstitial%smcmax (IM))
+ allocate (Interstitial%smc_save (IM,Model%lsoil))
+ allocate (Interstitial%snowd_land_save (IM))
+ allocate (Interstitial%snow_depth (IM))
+ allocate (Interstitial%snohf_snow (IM))
+ allocate (Interstitial%snohf_frzgra (IM))
+ allocate (Interstitial%snohf_snowmelt (IM))
+ allocate (Interstitial%soilm_in_m (IM))
+ allocate (Interstitial%stc_save (IM,Model%lsoil))
+ allocate (Interstitial%sthick (Model%lsoil))
+ allocate (Interstitial%th1 (IM))
+ allocate (Interstitial%tprcp_rate_land (IM))
+ allocate (Interstitial%tsfc_land_save (IM))
+ allocate (Interstitial%weasd_land_save (IM))
+ end if
!
! Set components that do not change
Interstitial%frain = Model%dtf/Model%dtp
@@ -6484,7 +6623,7 @@ subroutine interstitial_rad_reset (Interstitial, Model)
!
class(GFS_interstitial_type) :: Interstitial
type(GFS_control_type), intent(in) :: Model
- !
+
Interstitial%aerodp = clear_val
Interstitial%alb1d = clear_val
Interstitial%cldsa = clear_val
@@ -6853,6 +6992,34 @@ subroutine interstitial_phys_reset (Interstitial, Model)
Interstitial%t2mmp = clear_val
Interstitial%q2mp = clear_val
end if
+ if (Model%lsm == Model%lsm_noah_wrfv4) then
+ Interstitial%canopy_save = clear_val
+ Interstitial%chk_land = huge
+ Interstitial%cmc = clear_val
+ Interstitial%dqsdt2 = clear_val
+ Interstitial%drain_in_m_sm1 = clear_val
+ Interstitial%flag_lsm = .false.
+ Interstitial%flag_lsm_glacier= .false.
+ Interstitial%qs1 = huge
+ Interstitial%qv1 = huge
+ Interstitial%rho1 = clear_val
+ Interstitial%runoff_in_m_sm1 = clear_val
+ Interstitial%slc_save = clear_val
+ Interstitial%smcmax = clear_val
+ Interstitial%smc_save = clear_val
+ Interstitial%snowd_land_save = huge
+ Interstitial%snow_depth = clear_val
+ Interstitial%snohf_snow = clear_val
+ Interstitial%snohf_frzgra = clear_val
+ Interstitial%snohf_snowmelt = clear_val
+ Interstitial%soilm_in_m = clear_val
+ Interstitial%stc_save = clear_val
+ Interstitial%sthick = clear_val
+ Interstitial%th1 = clear_val
+ Interstitial%tprcp_rate_land = huge
+ Interstitial%tsfc_land_save = huge
+ Interstitial%weasd_land_save = huge
+ end if
!
! Set flag for resetting maximum hourly output fields
Interstitial%reset = mod(Model%kdt-1, nint(Model%avg_max_length/Model%dtp)) == 0
@@ -7204,6 +7371,31 @@ subroutine interstitial_print(Interstitial, Model, mpirank, omprank, blkno)
write (0,*) 'sum(Interstitial%t2mmp ) = ', sum(Interstitial%t2mmp )
write (0,*) 'sum(Interstitial%q2mp ) = ', sum(Interstitial%q2mp )
end if
+ if (Model%lsm == Model%lsm_noah_wrfv4) then
+ write (0,*) 'sum(Interstitial%canopy_save ) = ', sum(Interstitial%canopy_save )
+ write (0,*) 'sum(Interstitial%chk_land ) = ', sum(Interstitial%chk_land )
+ write (0,*) 'sum(Interstitial%cmc ) = ', sum(Interstitial%cmc )
+ write (0,*) 'sum(Interstitial%dqsdt2 ) = ', sum(Interstitial%dqsdt2 )
+ write (0,*) 'sum(Interstitial%drain_in_m_sm1 ) = ', sum(Interstitial%drain_in_m_sm1 )
+ write (0,*) 'Interstitial%flag_lsm(1) = ', Interstitial%flag_lsm(1)
+ write (0,*) 'Interstitial%flag_lsm_glacier(1) = ', Interstitial%flag_lsm_glacier(1)
+ write (0,*) 'sum(Interstitial%qs1 ) = ', sum(Interstitial%qs1 )
+ write (0,*) 'sum(Interstitial%qv1 ) = ', sum(Interstitial%qv1 )
+ write (0,*) 'sum(Interstitial%rho1 ) = ', sum(Interstitial%rho1 )
+ write (0,*) 'sum(Interstitial%runoff_in_m_sm1 ) = ', sum(Interstitial%runoff_in_m_sm1 )
+ write (0,*) 'sum(Interstitial%smcmax ) = ', sum(Interstitial%smcmax )
+ write (0,*) 'sum(Interstitial%snowd_land_save ) = ', sum(Interstitial%snowd_land_save )
+ write (0,*) 'sum(Interstitial%snow_depth ) = ', sum(Interstitial%snow_depth )
+ write (0,*) 'sum(Interstitial%snohf_snow ) = ', sum(Interstitial%snohf_snow )
+ write (0,*) 'sum(Interstitial%snohf_frzgra ) = ', sum(Interstitial%snohf_frzgra )
+ write (0,*) 'sum(Interstitial%snohf_snowmelt ) = ', sum(Interstitial%snohf_snowmelt )
+ write (0,*) 'sum(Interstitial%soilm_in_m ) = ', sum(Interstitial%soilm_in_m )
+ write (0,*) 'sum(Interstitial%sthick ) = ', sum(Interstitial%sthick )
+ write (0,*) 'sum(Interstitial%th1 ) = ', sum(Interstitial%th1 )
+ write (0,*) 'sum(Interstitial%tprcp_rate_land ) = ', sum(Interstitial%tprcp_rate_land )
+ write (0,*) 'sum(Interstitial%tsfc_land_save ) = ', sum(Interstitial%tsfc_land_save )
+ write (0,*) 'sum(Interstitial%weasd_land_save ) = ', sum(Interstitial%weasd_land_save )
+ end if
write (0,*) 'Interstitial_print: end'
!
end subroutine interstitial_print
diff --git a/gfsphysics/GFS_layer/GFS_typedefs.meta b/gfsphysics/GFS_layer/GFS_typedefs.meta
index 502ef4d89..40a86bf1f 100644
--- a/gfsphysics/GFS_layer/GFS_typedefs.meta
+++ b/gfsphysics/GFS_layer/GFS_typedefs.meta
@@ -541,6 +541,20 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[z0base]
+ standard_name = baseline_surface_roughness_length
+ long_name = baseline surface roughness length for momentum in meter
+ units = m
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
+[semisbase]
+ standard_name = baseline_surface_longwave_emissivity
+ long_name = baseline surface lw emissivity in fraction
+ units = frac
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[sncovr]
standard_name = surface_snow_area_fraction_over_land
long_name = surface snow area fraction
@@ -1108,6 +1122,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[snotime]
+ standard_name = time_since_last_snowfall
+ long_name = elapsed time since last snowfall
+ units = s
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[wetness]
standard_name = normalized_soil_wetness_for_land_surface_model
long_name = normalized soil wetness for lsm
@@ -2766,6 +2787,12 @@
units = flag
dimensions = ()
type = integer
+[lsm_noah_wrfv4]
+ standard_name = flag_for_noah_wrfv4_land_surface_scheme
+ long_name = flag for NOAH WRFv4 land surface model
+ units = flag
+ dimensions = ()
+ type = integer
[lsoil]
standard_name = soil_vertical_dimension
long_name = number of soil layers
@@ -2792,10 +2819,35 @@
type = integer
[rdlai]
standard_name = flag_for_reading_leaf_area_index_from_input
- long_name = flag for reading leaf area index from initial conditions for RUC LSM
+ long_name = flag for reading leaf area index from initial conditions
units = flag
dimensions = ()
type = logical
+[ua_phys]
+ standard_name = flag_for_noah_lsm_ua_extension
+ long_name = flag for using University of Arizona(?) extension for NOAH LSM WRFv4 (see module_sf_noahlsm.F)
+ units = flag
+ dimensions = ()
+ type = logical
+[usemonalb]
+ standard_name = flag_for_reading_surface_diffused_shortwave_albedo_from_input
+ long_name = flag for reading surface diffused shortwave albedo for NOAH LSM WRFv4 (see module_sf_noahlsm.F)
+ units = flag
+ dimensions = ()
+ type = logical
+[aoasis]
+ standard_name = potential_evaporation_multiplicative_factor
+ long_name = potential evaporation multiplicative factor for NOAH LSM WRFv4 (see module_sf_noahlsm.F)
+ units = none
+ dimensions = ()
+ type = real
+ kind = kind_phys
+[fasdas]
+ standard_name = flag_flux_adjusting_surface_data_assimilation_system
+ long_name = flag to use the flux adjusting surface data assimilation system for NOAH LSM WRFv4 (see module_sf_noahlsm.F)
+ units = flag
+ dimensions = ()
+ type = integer
[ivegsrc]
standard_name = vegetation_type_dataset_choice
long_name = land use dataset choice
@@ -2808,6 +2860,30 @@
units = index
dimensions = ()
type = integer
+[isurban]
+ standard_name = urban_vegetation_category
+ long_name = index of the urban vegetation category in the chosen vegetation dataset
+ units = index
+ dimensions = ()
+ type = integer
+[isice]
+ standard_name = ice_vegetation_category
+ long_name = index of the permanent snow/ice category in the chosen vegetation dataset
+ units = index
+ dimensions = ()
+ type = integer
+[iswater]
+ standard_name = water_vegetation_category
+ long_name = index of the water body vegetation category in the chosen vegetation dataset
+ units = index
+ dimensions = ()
+ type = integer
+[iopt_thcnd]
+ standard_name = flag_for_thermal_conductivity_option
+ long_name = choice for thermal conductivity option (see module_sf_noahlsm)
+ units = index
+ dimensions = ()
+ type = integer
[spec_adv]
standard_name = flag_for_individual_cloud_species_advected
long_name = flag for individual cloud species advected
@@ -2893,6 +2969,31 @@
units = index
dimensions = ()
type = integer
+[lcurr_sf]
+ standard_name = flag_for_ocean_currents_in_surface_layer_scheme
+ long_name = flag for taking ocean currents into account in surface layer scheme
+ units = flag
+ dimensions = ()
+ type = logical
+[pert_cd]
+ standard_name = flag_for_perturbation_of_surface_drag_coefficient_for_momentum_in_air
+ long_name = flag for perturbing the surface drag coefficient for momentum in surface layer scheme
+ units = flag
+ dimensions = ()
+ type = logical
+[ntsflg]
+ standard_name = flag_for_updating_skin_temperatuer_in_surface_layer_scheme
+ long_name = flag for updating skin temperature in the surface layer scheme
+ units = flag
+ dimensions = ()
+ type = integer
+[sfenth]
+ standard_name = enthalpy_flux_factor
+ long_name = enthalpy flux factor used in surface layer scheme
+ units = none
+ dimensions = ()
+ type = real
+ kind = kind_phys
[ras]
standard_name = flag_for_ras_deep_convection
long_name = flag for ras convection scheme
@@ -4649,13 +4750,6 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
-[phy_myj_z0base]
- standard_name = baseline_surface_roughness_length
- long_name = baseline surface roughness length for momentum in meter
- units = m
- dimensions = (horizontal_dimension)
- type = real
- kind = kind_phys
[phy_myj_akhs]
standard_name = heat_exchange_coefficient_for_MYJ_schemes
long_name = surface heat exchange_coefficient for MYJ schemes
@@ -5787,8 +5881,6 @@
dimensions = (horizontal_dimension,vertical_dimension_minus_one)
type = real
kind = kind_phys
- intent = out
- optional = F
[ndust]
standard_name = number_of_dust_bins_for_diagnostics
long_name = number of dust bins for diagnostics
@@ -6196,6 +6288,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[canopy_save]
+ standard_name = canopy_water_amount_save
+ long_name = canopy water amount before entering a physics scheme
+ units = kg m-2
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[cd]
standard_name = surface_drag_coefficient_for_momentum_in_air
long_name = surface exchange coeff for momentum
@@ -6273,6 +6372,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[chk_land]
+ standard_name = surface_conductance_for_heat_and_moisture_in_air_over_land
+ long_name = surface conductance for heat & moisture over land
+ units = m s-1
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[cf_upi]
standard_name = convective_cloud_fraction_for_microphysics
long_name = convective cloud fraction for microphysics
@@ -6420,6 +6526,13 @@
dimensions = (horizontal_dimension,4)
type = real
kind = kind_phys
+[cmc]
+ standard_name = canopy_water_amount_in_m
+ long_name = canopy water amount in m
+ units = m
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[cmm_ocean]
standard_name = surface_drag_wind_speed_for_momentum_in_air_over_ocean
long_name = momentum exchange coefficient over ocean
@@ -6651,6 +6764,13 @@
dimensions = (horizontal_dimension,vertical_dimension)
type = real
kind = kind_phys
+[dqsdt2]
+ standard_name = saturation_specific_humidity_slope
+ long_name = saturation specific humidity slope at lowest model layer
+ units = K-1
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[dqsfc1]
standard_name = instantaneous_surface_upward_latent_heat_flux
long_name = surface upward latent heat flux
@@ -6665,6 +6785,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[drain_in_m_sm1]
+ standard_name = subsurface_runoff_flux_in_m_sm1
+ long_name = subsurface runoff flux in m s-1
+ units = m s-1
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[dtdt]
standard_name = tendency_of_air_temperature_due_to_model_physics
long_name = air temperature tendency due to model physics
@@ -6984,6 +7111,18 @@
units = flag
dimensions = (horizontal_dimension)
type = logical
+[flag_lsm]
+ standard_name = flag_for_calling_land_surface_model
+ long_name = flag for calling land surface model
+ units = flag
+ dimensions = (horizontal_dimension)
+ type = logical
+[flag_lsm_glacier]
+ standard_name = flag_for_calling_land_surface_model_glacier
+ long_name = flag for calling land surface model over glacier
+ units = flag
+ dimensions = (horizontal_dimension)
+ type = logical
[ffmm_ocean]
standard_name = Monin_Obukhov_similarity_function_for_momentum_over_ocean
long_name = Monin-Obukhov similarity function for momentum over ocean
@@ -7770,6 +7909,20 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[qs1]
+ standard_name = saturation_specific_humidity_at_lowest_model_layer
+ long_name = saturation specific humidity at lowest model layer
+ units = kg kg-1
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
+[qv1]
+ standard_name = bounded_specific_humidity_at_lowest_model_layer_over_land
+ long_name = specific humidity at lowest model layer over land bounded between a nonzero epsilon and saturation
+ units = kg kg-1
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[radar_reset]
standard_name = flag_for_resetting_radar_reflectivity_calculation
long_name = flag for resetting radar reflectivity calculation
@@ -7859,6 +8012,13 @@
dimensions = (horizontal_dimension,vertical_dimension)
type = real
kind = kind_phys
+[rho1]
+ standard_name = air_density_at_lowest_model_layer
+ long_name = air density at lowest model layer
+ units = kg m-3
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[runoff]
standard_name = surface_runoff_flux
long_name = surface runoff flux
@@ -7866,6 +8026,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[runoff_in_m_sm1]
+ standard_name = surface_runoff_flux_in_m_sm1
+ long_name = surface runoff flux in m s-1
+ units = m s-1
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[save_q(:,:,index_for_liquid_cloud_condensate)]
standard_name = cloud_condensed_water_mixing_ratio_save
long_name = ratio of mass of cloud water to mass of dry air plus vapor (without condensates) before entering a physics scheme
@@ -7990,12 +8157,33 @@
units = flag
dimensions = ()
type = logical
+[slc_save]
+ standard_name = volume_fraction_of_unfrozen_soil_moisture_save
+ long_name = liquid soil moisture before entering a physics scheme
+ units = frac
+ dimensions = (horizontal_dimension,soil_vertical_dimension)
+ type = real
+ kind = kind_phys
[slopetype]
standard_name = surface_slope_classification
long_name = surface slope type at each grid cell
units = index
dimensions = (horizontal_dimension)
type = integer
+[smcmax]
+ standard_name = soil_porosity
+ long_name = volumetric soil porosity
+ units = frac
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
+[smc_save]
+ standard_name = volume_fraction_of_soil_moisture_save
+ long_name = total soil moisture before entering a physics scheme
+ units = frac
+ dimensions = (horizontal_dimension,soil_vertical_dimension)
+ type = real
+ kind = kind_phys
[snowc]
standard_name = surface_snow_area_fraction
long_name = surface snow area fraction
@@ -8017,6 +8205,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[snowd_land_save]
+ standard_name = surface_snow_thickness_water_equivalent_over_land_save
+ long_name = water equivalent snow depth over land before entering a physics scheme
+ units = mm
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[snowd_ice]
standard_name = surface_snow_thickness_water_equivalent_over_ice
long_name = water equivalent snow depth over ice
@@ -8024,6 +8219,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[snow_depth]
+ standard_name = actual_snow_depth
+ long_name = actual snow depth
+ units = m
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[snohf]
standard_name = snow_freezing_rain_upward_latent_heat_flux
long_name = latent heat flux due to snow and frz rain
@@ -8031,6 +8233,27 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[snohf_snow]
+ standard_name = latent_heat_flux_from_precipitating_snow
+ long_name = latent heat flux due to precipitating snow
+ units = W m-2
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
+[snohf_frzgra]
+ standard_name = latent_heat_flux_from_freezing_rain
+ long_name = latent heat flux due to freezing rain
+ units = W m-2
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
+[snohf_snowmelt]
+ standard_name = latent_heat_flux_due_to_snowmelt
+ long_name = latent heat flux due to snowmelt phase change
+ units = W m-2
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[snowmp]
standard_name = lwe_thickness_of_snow_amount
long_name = explicit snow fall on physics timestep
@@ -8045,12 +8268,33 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[soilm_in_m]
+ standard_name = soil_moisture_content_in_m
+ long_name = soil moisture in meters
+ units = m
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[soiltype]
standard_name = soil_type_classification
long_name = soil type at each grid cell
units = index
dimensions = (horizontal_dimension)
type = integer
+[stc_save]
+ standard_name = soil_temperature_save
+ long_name = soil temperature before entering a physics scheme
+ units = K
+ dimensions = (horizontal_dimension,soil_vertical_dimension)
+ type = real
+ kind = kind_phys
+[sthick]
+ standard_name = soil_layer_thickness
+ long_name = soil layer thickness
+ units = m
+ dimensions = (soil_vertical_dimension)
+ type = real
+ kind = kind_phys
[stress]
standard_name = surface_wind_stress
long_name = surface wind stress
@@ -8093,6 +8337,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[th1]
+ standard_name = potential_temperature_at_lowest_model_layer
+ long_name = potential_temperature_at_lowest_model_layer
+ units = K
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[tice]
standard_name = sea_ice_temperature_interstitial
long_name = sea ice surface skin temperature use as interstitial
@@ -8135,6 +8386,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[tprcp_rate_land]
+ standard_name = total_precipitation_rate_on_dynamics_timestep_over_land
+ long_name = total precipitation rate in each time step over land
+ units = kg m-2 s-1
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[tracers_start_index]
standard_name = start_index_of_other_tracers
long_name = beginning index of the non-water tracer species
@@ -8188,6 +8446,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[tsfc_land_save]
+ standard_name = surface_skin_temperature_over_land_interstitial_save
+ long_name = surface skin temperature over land before entering a physics scheme (temporary use as interstitial)
+ units = K
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[tsfc_ice]
standard_name = surface_skin_temperature_over_ice_interstitial
long_name = surface skin temperature over ice (temporary use as interstitial)
@@ -8312,6 +8577,13 @@
dimensions = (horizontal_dimension)
type = real
kind = kind_phys
+[weasd_land_save]
+ standard_name = water_equivalent_accumulated_snow_depth_over_land_save
+ long_name = water equiv of acc snow depth over land before entering a physics scheme
+ units = mm
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
[weasd_ice]
standard_name = water_equivalent_accumulated_snow_depth_over_ice
long_name = water equiv of acc snow depth over ice
@@ -9322,5 +9594,3 @@
dimensions = ()
type = real
kind = kind_phys
- intent = in
- optional = F
diff --git a/io/FV3GFS_io.F90 b/io/FV3GFS_io.F90
index 7574f072b..9ce9b3dce 100644
--- a/io/FV3GFS_io.F90
+++ b/io/FV3GFS_io.F90
@@ -246,7 +246,7 @@ subroutine FV3GFS_IPD_checksum (Model, IPD_Data, Atm_block)
temp2d(i,j,33) = IPD_Data(nb)%Sfcprop%tprcp(ix)
temp2d(i,j,34) = IPD_Data(nb)%Sfcprop%srflag(ix)
#ifdef CCPP
- if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp) then
+ if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. Model%lsm == Model%lsm_noah_wrfv4) then
#endif
temp2d(i,j,35) = IPD_Data(nb)%Sfcprop%slc(ix,1)
temp2d(i,j,36) = IPD_Data(nb)%Sfcprop%slc(ix,2)
@@ -658,7 +658,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
allocate(sfc_name3(nvar_s3+nvar_s3mp))
allocate(sfc_var2(nx,ny,nvar_s2m+nvar_s2o+nvar_s2mp+nvar_s2r))
- if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. (.not.warm_start)) then
+ if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. Model%lsm == Model%lsm_noah_wrfv4 .or. (.not.warm_start)) then
allocate(sfc_var3(nx,ny,Model%lsoil,nvar_s3))
else if (Model%lsm == Model%lsm_ruc) then
allocate(sfc_var3(nx,ny,Model%lsoil_lsm,nvar_s3))
@@ -830,7 +830,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
#ifdef CCPP
- if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. (.not.warm_start)) then
+ if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. Model%lsm == Model%lsm_noah_wrfv4 .or. (.not.warm_start)) then
!--- names of the 3D variables to save
sfc_name3(1) = 'stc'
sfc_name3(2) = 'smc'
@@ -1053,7 +1053,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
endif
#ifdef CCPP
- if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. (.not.warm_start)) then
+ if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. Model%lsm == Model%lsm_noah_wrfv4 .or. (.not.warm_start)) then
!--- 3D variables
do lsoil = 1,Model%lsoil
Sfcprop(nb)%stc(ix,lsoil) = sfc_var3(i,j,lsoil,1) !--- stc
@@ -1563,7 +1563,7 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta
allocate(sfc_name2(nvar2m+nvar2o+nvar2mp+nvar2r))
allocate(sfc_name3(nvar3+nvar3mp))
allocate(sfc_var2(nx,ny,nvar2m+nvar2o+nvar2mp+nvar2r))
- if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp) then
+ if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. Model%lsm == Model%lsm_noah_wrfv4) then
allocate(sfc_var3(nx,ny,Model%lsoil,nvar3))
elseif (Model%lsm == Model%lsm_ruc) then
allocate(sfc_var3(nx,ny,Model%lsoil_lsm,nvar3))
@@ -1727,7 +1727,7 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta
nullify(var2_p)
#ifdef CCPP
- if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp) then
+ if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. Model%lsm == Model%lsm_noah_wrfv4) then
!--- names of the 3D variables to save
sfc_name3(1) = 'stc'
sfc_name3(2) = 'smc'
@@ -1901,7 +1901,7 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta
endif
#ifdef CCPP
- if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp) then
+ if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. Model%lsm == Model%lsm_noah_wrfv4) then
!--- 3D variables
do lsoil = 1,Model%lsoil
sfc_var3(i,j,lsoil,1) = Sfcprop(nb)%stc(ix,lsoil) !--- stc