diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py
index f954a07f5..f649535ac 100755
--- a/ccpp/config/ccpp_prebuild_config.py
+++ b/ccpp/config/ccpp_prebuild_config.py
@@ -171,7 +171,6 @@
'ccpp/physics/physics/sfc_diag.f',
'ccpp/physics/physics/sfc_diag_post.F90',
'ccpp/physics/physics/sfc_drv_ruc.F90',
- 'ccpp/physics/physics/lsm_ruc_sfc_sice_interstitial.F90',
'ccpp/physics/physics/sfc_cice.f',
'ccpp/physics/physics/sfc_diff.f',
'ccpp/physics/physics/sfc_drv.f',
diff --git a/ccpp/physics b/ccpp/physics
index d12329a9a..bafcc9ebb 160000
--- a/ccpp/physics
+++ b/ccpp/physics
@@ -1 +1 @@
-Subproject commit d12329a9ada515766ccb81771e8ba299ea3a8464
+Subproject commit bafcc9ebb6788696666e7592cf7577db81e5fbbe
diff --git a/ccpp/suites/suite_FV3_GSD_SAR.xml b/ccpp/suites/suite_FV3_GSD_SAR.xml
index 08541847a..29f6d3707 100644
--- a/ccpp/suites/suite_FV3_GSD_SAR.xml
+++ b/ccpp/suites/suite_FV3_GSD_SAR.xml
@@ -45,9 +45,6 @@
sfc_nst
sfc_nst_post
lsm_ruc
- lsm_ruc_sfc_sice_pre
- sfc_sice
- lsm_ruc_sfc_sice_post
GFS_surface_loop_control_part2
diff --git a/ccpp/suites/suite_FV3_GSD_v0.xml b/ccpp/suites/suite_FV3_GSD_v0.xml
index 06c4d7dcd..7838db77b 100644
--- a/ccpp/suites/suite_FV3_GSD_v0.xml
+++ b/ccpp/suites/suite_FV3_GSD_v0.xml
@@ -45,9 +45,6 @@
sfc_nst
sfc_nst_post
lsm_ruc
- lsm_ruc_sfc_sice_pre
- sfc_sice
- lsm_ruc_sfc_sice_post
GFS_surface_loop_control_part2
diff --git a/ccpp/suites/suite_FV3_GSD_v0_drag_suite.xml b/ccpp/suites/suite_FV3_GSD_v0_drag_suite.xml
index 7d55abfd2..21d45de21 100644
--- a/ccpp/suites/suite_FV3_GSD_v0_drag_suite.xml
+++ b/ccpp/suites/suite_FV3_GSD_v0_drag_suite.xml
@@ -45,9 +45,6 @@
sfc_nst
sfc_nst_post
lsm_ruc
- lsm_ruc_sfc_sice_pre
- sfc_sice
- lsm_ruc_sfc_sice_post
GFS_surface_loop_control_part2
diff --git a/ccpp/suites/suite_FV3_GSD_v0_mynnsfc.xml b/ccpp/suites/suite_FV3_GSD_v0_mynnsfc.xml
index b3b629550..d19d991f2 100644
--- a/ccpp/suites/suite_FV3_GSD_v0_mynnsfc.xml
+++ b/ccpp/suites/suite_FV3_GSD_v0_mynnsfc.xml
@@ -45,9 +45,6 @@
sfc_nst
sfc_nst_post
lsm_ruc
- lsm_ruc_sfc_sice_pre
- sfc_sice
- lsm_ruc_sfc_sice_post
GFS_surface_loop_control_part2
diff --git a/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite.xml b/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite.xml
index 8a717abc3..8a8d69b88 100644
--- a/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite.xml
+++ b/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite.xml
@@ -45,9 +45,6 @@
sfc_nst
sfc_nst_post
lsm_ruc
- lsm_ruc_sfc_sice_pre
- sfc_sice
- lsm_ruc_sfc_sice_post
GFS_surface_loop_control_part2
diff --git a/ccpp/suites/suite_FV3_HRRR.xml b/ccpp/suites/suite_FV3_HRRR.xml
index 4487b8e27..c74fe17f8 100644
--- a/ccpp/suites/suite_FV3_HRRR.xml
+++ b/ccpp/suites/suite_FV3_HRRR.xml
@@ -45,9 +45,6 @@
sfc_nst
sfc_nst_post
lsm_ruc
- lsm_ruc_sfc_sice_pre
- sfc_sice
- lsm_ruc_sfc_sice_post
GFS_surface_loop_control_part2
diff --git a/ccpp/suites/suite_FV3_RAP.xml b/ccpp/suites/suite_FV3_RAP.xml
index 9440efa69..da3fe46bf 100644
--- a/ccpp/suites/suite_FV3_RAP.xml
+++ b/ccpp/suites/suite_FV3_RAP.xml
@@ -45,9 +45,6 @@
sfc_nst
sfc_nst_post
lsm_ruc
- lsm_ruc_sfc_sice_pre
- sfc_sice
- lsm_ruc_sfc_sice_post
GFS_surface_loop_control_part2
diff --git a/gfsphysics/GFS_layer/GFS_diagnostics.F90 b/gfsphysics/GFS_layer/GFS_diagnostics.F90
index a289df88a..cf19c7cd3 100644
--- a/gfsphysics/GFS_layer/GFS_diagnostics.F90
+++ b/gfsphysics/GFS_layer/GFS_diagnostics.F90
@@ -3030,24 +3030,24 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop
if (Model%lsm == Model%lsm_ruc) then
idx = idx + 1
ExtDiag(idx)%axes = 2
- ExtDiag(idx)%name = 'snowfall_acc'
- ExtDiag(idx)%desc = 'total accumulated frozen precipitation'
+ ExtDiag(idx)%name = 'snowfall_acc_land'
+ ExtDiag(idx)%desc = 'total accumulated frozen precipitation over land'
ExtDiag(idx)%unit = 'kg m-2'
ExtDiag(idx)%mod_name = 'gfs_sfc'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
- ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%snowfallac(:)
+ ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%snowfallac_land(:)
enddo
idx = idx + 1
ExtDiag(idx)%axes = 2
- ExtDiag(idx)%name = 'swe_snowfall_acc'
- ExtDiag(idx)%desc = 'accumulated water equivalent of frozen precipitation'
+ ExtDiag(idx)%name = 'snowfall_acc_ice'
+ ExtDiag(idx)%desc = 'total accumulated frozen precipitation over ice'
ExtDiag(idx)%unit = 'kg m-2'
ExtDiag(idx)%mod_name = 'gfs_sfc'
allocate (ExtDiag(idx)%data(nblks))
do nb = 1,nblks
- ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%acsnow(:)
+ ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%snowfallac_ice(:)
enddo
endif
#endif
diff --git a/gfsphysics/GFS_layer/GFS_typedefs.F90 b/gfsphysics/GFS_layer/GFS_typedefs.F90
index b5b50b6af..2fef16ee4 100644
--- a/gfsphysics/GFS_layer/GFS_typedefs.F90
+++ b/gfsphysics/GFS_layer/GFS_typedefs.F90
@@ -255,7 +255,8 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: semisbase(:) => null() !< background surface emissivity
!--- In (radiation only)
- real (kind=kind_phys), pointer :: sncovr (:) => null() !< snow cover in fraction
+ real (kind=kind_phys), pointer :: sncovr (:) => null() !< snow cover in fraction over land
+ real (kind=kind_phys), pointer :: sncovr_ice (:) => null() !< snow cover in fraction over ice (RUC LSM only)
real (kind=kind_phys), pointer :: snoalb (:) => null() !< maximum snow albedo in fraction
real (kind=kind_phys), pointer :: alvsf (:) => null() !< mean vis albedo with strong cosz dependency
real (kind=kind_phys), pointer :: alnsf (:) => null() !< mean nir albedo with strong cosz dependency
@@ -365,20 +366,22 @@ module GFS_typedefs
#ifdef CCPP
! Soil properties for RUC LSM (number of levels different from NOAH 4-layer model)
- real (kind=kind_phys), pointer :: wetness(:) => null() !< normalized soil wetness for lsm
- real (kind=kind_phys), pointer :: sh2o(:,:) => null() !< volume fraction of unfrozen soil moisture for lsm
- real (kind=kind_phys), pointer :: keepsmfr(:,:) => null() !< RUC LSM: frozen moisture in soil
- real (kind=kind_phys), pointer :: smois(:,:) => null() !< volumetric fraction of soil moisture for lsm
- real (kind=kind_phys), pointer :: tslb(:,:) => null() !< soil temperature for land surface model
- real (kind=kind_phys), pointer :: flag_frsoil(:,:) => null() !< RUC LSM: flag for frozen soil physics
+ real (kind=kind_phys), pointer :: wetness(:) => null() !< normalized soil wetness for lsm
+ real (kind=kind_phys), pointer :: sh2o(:,:) => null() !< volume fraction of unfrozen soil moisture for lsm
+ real (kind=kind_phys), pointer :: keepsmfr(:,:) => null() !< RUC LSM: frozen moisture in soil
+ real (kind=kind_phys), pointer :: smois(:,:) => null() !< volumetric fraction of soil moisture for lsm
+ real (kind=kind_phys), pointer :: tslb(:,:) => null() !< soil temperature for land surface model
+ real (kind=kind_phys), pointer :: flag_frsoil(:,:) => null() !< RUC LSM: flag for frozen soil physics
!
- real (kind=kind_phys), pointer :: clw_surf(:) => null() !< RUC LSM: moist cloud water mixing ratio at surface
- real (kind=kind_phys), pointer :: qwv_surf(:) => null() !< RUC LSM: water vapor mixing ratio at surface
- real (kind=kind_phys), pointer :: cndm_surf(:) => null() !< RUC LSM: surface condensation mass
- real (kind=kind_phys), pointer :: rhofr(:) => null() !< RUC LSM: density of frozen precipitation
- real (kind=kind_phys), pointer :: tsnow(:) => null() !< RUC LSM: snow temperature at the bottom of the first soil layer
- real (kind=kind_phys), pointer :: snowfallac(:) => null() !< ruc lsm diagnostics
- real (kind=kind_phys), pointer :: acsnow(:) => null() !< ruc lsm diagnostics
+ real (kind=kind_phys), pointer :: clw_surf_land(:) => null() !< RUC LSM: moist cloud water mixing ratio at surface over land
+ real (kind=kind_phys), pointer :: clw_surf_ice(:) => null() !< RUC LSM: moist cloud water mixing ratio at surface over ice
+ real (kind=kind_phys), pointer :: qwv_surf_land(:) => null() !< RUC LSM: water vapor mixing ratio at surface over land
+ real (kind=kind_phys), pointer :: qwv_surf_ice(:) => null() !< RUC LSM: water vapor mixing ratio at surface over ice
+ real (kind=kind_phys), pointer :: rhofr(:) => null() !< RUC LSM: density of frozen precipitation
+ real (kind=kind_phys), pointer :: tsnow_land(:) => null() !< RUC LSM: snow temperature at the bottom of the first snow layer over land
+ real (kind=kind_phys), pointer :: tsnow_ice(:) => null() !< RUC LSM: snow temperature at the bottom of the first snow layer over ice
+ real (kind=kind_phys), pointer :: snowfallac_land(:) => null() !< ruc lsm diagnostics over land
+ real (kind=kind_phys), pointer :: snowfallac_ice(:) => null() !< ruc lsm diagnostics over ice
! MYNN surface layer
real (kind=kind_phys), pointer :: ustm (:) => null() !u* including drag
@@ -804,7 +807,6 @@ module GFS_typedefs
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)
- integer :: kice=2 !< number of layers in sice
#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
@@ -821,6 +823,9 @@ module GFS_typedefs
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
+ integer :: kice !< number of layers in ice model
+#else
+ integer :: kice=2 !< number of layers in sice
#endif
! -- the Noah MP options
@@ -1422,7 +1427,7 @@ module GFS_typedefs
!--- Out (radiation only)
real (kind=kind_phys), pointer :: htrsw (:,:) => null() !< swh total sky sw heating rate in k/sec
real (kind=kind_phys), pointer :: htrlw (:,:) => null() !< hlw total sky lw heating rate in k/sec
- real (kind=kind_phys), pointer :: sfalb (:) => null() !< mean surface diffused sw albedo
+ real (kind=kind_phys), pointer :: sfalb (:) => null() !< mean surface diffused sw albedo
real (kind=kind_phys), pointer :: coszen(:) => null() !< mean cos of zenith angle over rad call period
real (kind=kind_phys), pointer :: tsflw (:) => null() !< surface air temp during lw calculation in k
@@ -1768,13 +1773,11 @@ module GFS_typedefs
real (kind=kind_phys), pointer :: cld1d(:) => null() !<
real (kind=kind_phys), pointer :: clouds(:,:,:) => null() !<
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() !<
- real (kind=kind_phys), pointer :: cndm_surf(:) => null() !<
real (kind=kind_phys), pointer :: cnv_dqldt(:,:) => null() !<
real (kind=kind_phys), pointer :: cnv_fice(:,:) => null() !<
real (kind=kind_phys), pointer :: cnv_mfd(:,:) => null() !<
@@ -2025,7 +2028,6 @@ module GFS_typedefs
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() !<
real (kind=kind_phys), pointer :: tsurf(:) => null() !<
real (kind=kind_phys), pointer :: tsurf_ice(:) => null() !<
real (kind=kind_phys), pointer :: tsurf_land(:) => null() !<
@@ -2349,7 +2351,6 @@ subroutine sfcprop_create (Sfcprop, IM, Model)
Sfcprop%hprime = clear_val
!--- In (radiation only)
- allocate (Sfcprop%sncovr (IM))
allocate (Sfcprop%snoalb (IM))
allocate (Sfcprop%alvsf (IM))
allocate (Sfcprop%alnsf (IM))
@@ -2358,7 +2359,6 @@ subroutine sfcprop_create (Sfcprop, IM, Model)
allocate (Sfcprop%facsf (IM))
allocate (Sfcprop%facwf (IM))
- Sfcprop%sncovr = clear_val
Sfcprop%snoalb = clear_val
Sfcprop%alvsf = clear_val
Sfcprop%alnsf = clear_val
@@ -2403,6 +2403,9 @@ subroutine sfcprop_create (Sfcprop, IM, Model)
allocate (Sfcprop%hice (IM))
allocate (Sfcprop%weasd (IM))
allocate (Sfcprop%sncovr (IM))
+ if (Model%lsm == Model%lsm_ruc) then
+ allocate (Sfcprop%sncovr_ice (IM))
+ end if
allocate (Sfcprop%canopy (IM))
allocate (Sfcprop%ffmm (IM))
allocate (Sfcprop%ffhh (IM))
@@ -2416,6 +2419,9 @@ subroutine sfcprop_create (Sfcprop, IM, Model)
Sfcprop%hice = clear_val
Sfcprop%weasd = clear_val
Sfcprop%sncovr = clear_val
+ if (Model%lsm == Model%lsm_ruc) then
+ Sfcprop%sncovr_ice = clear_val
+ end if
Sfcprop%canopy = clear_val
Sfcprop%ffmm = clear_val
Sfcprop%ffhh = clear_val
@@ -2606,33 +2612,37 @@ subroutine sfcprop_create (Sfcprop, IM, Model)
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))
- allocate (Sfcprop%sh2o (IM,Model%lsoil_lsm))
- allocate (Sfcprop%keepsmfr (IM,Model%lsoil_lsm))
- allocate (Sfcprop%smois (IM,Model%lsoil_lsm))
- allocate (Sfcprop%tslb (IM,Model%lsoil_lsm))
- allocate (Sfcprop%flag_frsoil (IM,Model%lsoil_lsm))
- allocate (Sfcprop%clw_surf (IM))
- allocate (Sfcprop%qwv_surf (IM))
- allocate (Sfcprop%cndm_surf (IM))
- allocate (Sfcprop%rhofr (IM))
- allocate (Sfcprop%tsnow (IM))
- allocate (Sfcprop%snowfallac (IM))
- allocate (Sfcprop%acsnow (IM))
+ allocate (Sfcprop%wetness (IM))
+ allocate (Sfcprop%sh2o (IM,Model%lsoil_lsm))
+ allocate (Sfcprop%keepsmfr (IM,Model%lsoil_lsm))
+ allocate (Sfcprop%smois (IM,Model%lsoil_lsm))
+ allocate (Sfcprop%tslb (IM,Model%lsoil_lsm))
+ allocate (Sfcprop%flag_frsoil (IM,Model%lsoil_lsm))
+ allocate (Sfcprop%clw_surf_land (IM))
+ allocate (Sfcprop%clw_surf_ice (IM))
+ allocate (Sfcprop%qwv_surf_land (IM))
+ allocate (Sfcprop%qwv_surf_ice (IM))
+ allocate (Sfcprop%rhofr (IM))
+ allocate (Sfcprop%tsnow_land (IM))
+ allocate (Sfcprop%tsnow_ice (IM))
+ allocate (Sfcprop%snowfallac_land (IM))
+ allocate (Sfcprop%snowfallac_ice (IM))
!
- Sfcprop%wetness = clear_val
- Sfcprop%sh2o = clear_val
- Sfcprop%keepsmfr = clear_val
- Sfcprop%smois = clear_val
- Sfcprop%tslb = clear_val
- Sfcprop%clw_surf = clear_val
- Sfcprop%qwv_surf = clear_val
- Sfcprop%cndm_surf = clear_val
- Sfcprop%flag_frsoil = clear_val
- Sfcprop%rhofr = clear_val
- Sfcprop%tsnow = clear_val
- Sfcprop%snowfallac = clear_val
- Sfcprop%acsnow = clear_val
+ Sfcprop%wetness = clear_val
+ Sfcprop%sh2o = clear_val
+ Sfcprop%keepsmfr = clear_val
+ Sfcprop%smois = clear_val
+ Sfcprop%tslb = clear_val
+ Sfcprop%clw_surf_land = clear_val
+ Sfcprop%clw_surf_ice = clear_val
+ Sfcprop%qwv_surf_land = clear_val
+ Sfcprop%qwv_surf_ice = clear_val
+ Sfcprop%flag_frsoil = clear_val
+ Sfcprop%rhofr = clear_val
+ Sfcprop%tsnow_land = clear_val
+ Sfcprop%tsnow_ice = clear_val
+ Sfcprop%snowfallac_land = clear_val
+ Sfcprop%snowfallac_ice = clear_val
!
if (Model%rdlai) then
allocate (Sfcprop%xlaixy (IM))
@@ -3173,6 +3183,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
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
+ integer :: kice = 2 !< number of layers in ice; default is 2 (GFS sice)
#endif
integer :: ivegsrc = 2 !< ivegsrc = 0 => USGS,
!< ivegsrc = 1 => IGBP (20 category)
@@ -3503,7 +3514,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
avg_max_length, &
!--- land/surface model control
#ifdef CCPP
- lsm, lsoil, lsoil_lsm, lsnow_lsm, rdlai, &
+ lsm, lsoil, lsoil_lsm, lsnow_lsm, kice, rdlai, &
nmtvr, ivegsrc, use_ufo, iopt_thcnd, ua_phys, usemonalb, &
aoasis, fasdas, &
#else
@@ -3968,6 +3979,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
allocate (Model%zs(Model%lsoil_lsm))
Model%zs = clear_val
end if
+ ! Set number of ice model layers
+ Model%kice = kice
!
if (lsnow_lsm /= 3) then
write(0,*) 'Logic error: NoahMP expects the maximum number of snow layers to be exactly 3 (see sfc_noahmp_drv.f)'
@@ -5145,6 +5158,7 @@ subroutine control_print(Model)
print *, ' usemonalb : ', Model%usemonalb
print *, ' aoasis : ', Model%aoasis
print *, ' fasdas : ', Model%fasdas
+ print *, ' kice : ', Model%kice
#endif
print *, ' ivegsrc : ', Model%ivegsrc
print *, ' isot : ', Model%isot
diff --git a/gfsphysics/GFS_layer/GFS_typedefs.meta b/gfsphysics/GFS_layer/GFS_typedefs.meta
index 84e447237..4dfb5046e 100644
--- a/gfsphysics/GFS_layer/GFS_typedefs.meta
+++ b/gfsphysics/GFS_layer/GFS_typedefs.meta
@@ -606,6 +606,14 @@
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
+[sncovr_ice]
+ standard_name = surface_snow_area_fraction_over_ice
+ long_name = surface snow area fraction over ice
+ units = frac
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
+ active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
[snoalb]
standard_name = upper_bound_on_max_albedo_over_deep_snow
long_name = maximum snow albedo
@@ -1266,27 +1274,35 @@
dimensions = (horizontal_loop_extent,soil_vertical_dimension_for_land_surface_model)
type = real
kind = kind_phys
- active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
-[clw_surf]
- standard_name = cloud_condensed_water_mixing_ratio_at_surface
- long_name = moist cloud water mixing ratio at surface
+ active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
+[clw_surf_land]
+ standard_name = cloud_condensed_water_mixing_ratio_at_surface_over_land
+ long_name = moist cloud water mixing ratio at surface over land
units = kg kg-1
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
- active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
-[qwv_surf]
- standard_name = water_vapor_mixing_ratio_at_surface
- long_name = water vapor mixing ratio at surface
+ active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
+[clw_surf_ice]
+ standard_name = cloud_condensed_water_mixing_ratio_at_surface_over_ice
+ long_name = moist cloud water mixing ratio at surface over ice
units = kg kg-1
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
-[cndm_surf]
- standard_name = surface_condensation_mass
- long_name = surface condensation mass
- units = kg m-2
+[qwv_surf_land]
+ standard_name = water_vapor_mixing_ratio_at_surface_over_land
+ long_name = water vapor mixing ratio at surface over land
+ units = kg kg-1
+ dimensions = (horizontal_loop_extent)
+ type = real
+ kind = kind_phys
+ active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
+[qwv_surf_ice]
+ standard_name = water_vapor_mixing_ratio_at_surface_over_ice
+ long_name = water vapor mixing ratio at surface over ice
+ units = kg kg-1
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
@@ -1307,25 +1323,33 @@
type = real
kind = kind_phys
active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
-[tsnow]
- standard_name = snow_temperature_bottom_first_layer
- long_name = snow temperature at the bottom of the first snow layer
+[tsnow_land]
+ standard_name = snow_temperature_bottom_first_layer_over_land
+ long_name = snow temperature at the bottom of the first snow layer over land
+ units = K
+ dimensions = (horizontal_dimension)
+ type = real
+ kind = kind_phys
+ active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
+[tsnow_ice]
+ standard_name = snow_temperature_bottom_first_layer_over_ice
+ long_name = snow temperature at the bottom of the first snow layer over ice
units = K
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
-[snowfallac]
- standard_name = total_accumulated_snowfall
+[snowfallac_land]
+ standard_name = total_accumulated_snowfall_over_land
long_name = run-total snow accumulation on the ground
units = kg m-2
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
- active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
-[acsnow]
- standard_name = accumulated_water_equivalent_of_frozen_precip
- long_name = snow water equivalent of run-total frozen precip
+ active = (flag_for_land_surface_scheme == flag_for_ruc_land_surface_scheme)
+[snowfallac_ice]
+ standard_name = total_accumulated_snowfall_over_ice
+ long_name = run-total snow accumulation on the ice
units = kg m-2
dimensions = (horizontal_loop_extent)
type = real
diff --git a/io/FV3GFS_io.F90 b/io/FV3GFS_io.F90
index 08f792b05..a710941e2 100644
--- a/io/FV3GFS_io.F90
+++ b/io/FV3GFS_io.F90
@@ -530,9 +530,9 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
#ifdef CCPP
if (Model%lsm == Model%lsm_ruc .and. warm_start) then
if(Model%rdlai) then
- nvar_s2r = 7
+ nvar_s2r = 11
else
- nvar_s2r = 6
+ nvar_s2r = 10
end if
nvar_s3 = 5
else
@@ -872,13 +872,17 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
#ifdef CCPP
else if (Model%lsm == Model%lsm_ruc .and. warm_start) then
sfc_name2(nvar_s2m+19) = 'wetness'
- sfc_name2(nvar_s2m+20) = 'clw_surf'
- sfc_name2(nvar_s2m+21) = 'qwv_surf'
- sfc_name2(nvar_s2m+22) = 'tsnow'
- sfc_name2(nvar_s2m+23) = 'snowfall_acc'
- sfc_name2(nvar_s2m+24) = 'swe_snowfall_acc'
+ sfc_name2(nvar_s2m+20) = 'clw_surf_land'
+ sfc_name2(nvar_s2m+21) = 'clw_surf_ice'
+ sfc_name2(nvar_s2m+22) = 'qwv_surf_land'
+ sfc_name2(nvar_s2m+23) = 'qwv_surf_ice'
+ sfc_name2(nvar_s2m+24) = 'tsnow_land'
+ sfc_name2(nvar_s2m+25) = 'tsnow_ice'
+ sfc_name2(nvar_s2m+26) = 'snowfall_acc_land'
+ sfc_name2(nvar_s2m+27) = 'snowfall_acc_ice'
+ sfc_name2(nvar_s2m+28) = 'sncovr_ice'
if (Model%rdlai) then
- sfc_name2(nvar_s2m+25) = 'lai'
+ sfc_name2(nvar_s2m+29) = 'lai'
endif
else if (Model%lsm == Model%lsm_ruc .and. Model%rdlai) then
sfc_name2(nvar_s2m+19) = 'lai'
@@ -1142,17 +1146,21 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
#ifdef CCPP
if (Model%lsm == Model%lsm_ruc .and. warm_start) then
!--- Extra RUC variables
- Sfcprop(nb)%wetness(ix) = sfc_var2(i,j,nvar_s2m+19)
- Sfcprop(nb)%clw_surf(ix) = sfc_var2(i,j,nvar_s2m+20)
- Sfcprop(nb)%qwv_surf(ix) = sfc_var2(i,j,nvar_s2m+21)
- Sfcprop(nb)%tsnow(ix) = sfc_var2(i,j,nvar_s2m+22)
- Sfcprop(nb)%snowfallac(ix) = sfc_var2(i,j,nvar_s2m+23)
- Sfcprop(nb)%acsnow(ix) = sfc_var2(i,j,nvar_s2m+24)
+ Sfcprop(nb)%wetness(ix) = sfc_var2(i,j,nvar_s2m+19)
+ Sfcprop(nb)%clw_surf_land(ix) = sfc_var2(i,j,nvar_s2m+20)
+ Sfcprop(nb)%clw_surf_ice(ix) = sfc_var2(i,j,nvar_s2m+21)
+ Sfcprop(nb)%qwv_surf_land(ix) = sfc_var2(i,j,nvar_s2m+22)
+ Sfcprop(nb)%qwv_surf_ice(ix) = sfc_var2(i,j,nvar_s2m+23)
+ Sfcprop(nb)%tsnow_land(ix) = sfc_var2(i,j,nvar_s2m+24)
+ Sfcprop(nb)%tsnow_ice(ix) = sfc_var2(i,j,nvar_s2m+25)
+ Sfcprop(nb)%snowfallac_land(ix) = sfc_var2(i,j,nvar_s2m+26)
+ Sfcprop(nb)%snowfallac_ice(ix) = sfc_var2(i,j,nvar_s2m+27)
+ Sfcprop(nb)%sncovr_ice(ix) = sfc_var2(i,j,nvar_s2m+28)
if (Model%rdlai) then
- Sfcprop(nb)%xlaixy(ix) = sfc_var2(i,j,nvar_s2m+25)
+ Sfcprop(nb)%xlaixy(ix) = sfc_var2(i,j,nvar_s2m+29)
endif
else if (Model%lsm == Model%lsm_ruc .and. Model%rdlai) then
- Sfcprop(nb)%xlaixy(ix) = sfc_var2(i,j,nvar_s2m+19)
+ Sfcprop(nb)%xlaixy(ix) = sfc_var2(i,j,nvar_s2m+19)
elseif (Model%lsm == Model%lsm_noahmp) then
!--- Extra Noah MP variables
#else
@@ -1282,7 +1290,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
!--- if sncovr does not exist in the restart, need to create it
if (sfc_var2(i,j,32) < -9990.0_r8) then
- if (Model%me == Model%master ) call mpp_error(NOTE, 'gfs_driver::surface_props_input - computing sncovr')
+ if (Model%me == Model%master ) call mpp_error(NOTE, 'gfs_driver::surface_props_input - computing sncovr')
!--- compute sncovr from existing variables
!--- code taken directly from read_fix.f
!$omp parallel do default(shared) private(nb, ix, vegtyp, rsnow)
@@ -1301,6 +1309,13 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
endif
enddo
enddo
+ !--- For RUC LSM: create sncovr_ice from sncovr
+ if (Model%lsm == Model%lsm_ruc) then
+ if (Model%me == Model%master ) call mpp_error(NOTE, 'gfs_driver::surface_props_input - fill sncovr_ice with sncovr')
+ do nb = 1, Atm_block%nblks
+ Sfcprop(nb)%sncovr_ice(:) = Sfcprop(nb)%sncovr(:)
+ end do
+ endif
endif
! if (Model%frac_grid) then
@@ -1730,9 +1745,9 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta
#ifdef CCPP
if (Model%lsm == Model%lsm_ruc) then
if (Model%rdlai) then
- nvar2r = 7
+ nvar2r = 11
else
- nvar2r = 6
+ nvar2r = 10
endif
nvar3 = 5
else
@@ -1869,13 +1884,17 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta
#ifdef CCPP
if (Model%lsm == Model%lsm_ruc) then
sfc_name2(nvar2m+19) = 'wetness'
- sfc_name2(nvar2m+20) = 'clw_surf'
- sfc_name2(nvar2m+21) = 'qwv_surf'
- sfc_name2(nvar2m+22) = 'tsnow'
- sfc_name2(nvar2m+23) = 'snowfall_acc'
- sfc_name2(nvar2m+24) = 'swe_snowfall_acc'
+ sfc_name2(nvar2m+20) = 'clw_surf_land'
+ sfc_name2(nvar2m+21) = 'clw_surf_ice'
+ sfc_name2(nvar2m+22) = 'qwv_surf_land'
+ sfc_name2(nvar2m+23) = 'qwv_surf_ice'
+ sfc_name2(nvar2m+24) = 'tsnow_land'
+ sfc_name2(nvar2m+25) = 'tsnow_ice'
+ sfc_name2(nvar2m+26) = 'snowfall_acc_land'
+ sfc_name2(nvar2m+27) = 'snowfall_acc_ice'
+ sfc_name2(nvar2m+28) = 'sncovr_ice'
if (Model%rdlai) then
- sfc_name2(nvar2m+25) = 'lai'
+ sfc_name2(nvar2m+29) = 'lai'
endif
else if(Model%lsm == Model%lsm_noahmp) then
#else
@@ -2094,13 +2113,17 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta
if (Model%lsm == Model%lsm_ruc) then
!--- Extra RUC variables
sfc_var2(i,j,nvar2m+19) = Sfcprop(nb)%wetness(ix)
- sfc_var2(i,j,nvar2m+20) = Sfcprop(nb)%clw_surf(ix)
- sfc_var2(i,j,nvar2m+21) = Sfcprop(nb)%qwv_surf(ix)
- sfc_var2(i,j,nvar2m+22) = Sfcprop(nb)%tsnow(ix)
- sfc_var2(i,j,nvar2m+23) = Sfcprop(nb)%snowfallac(ix)
- sfc_var2(i,j,nvar2m+24) = Sfcprop(nb)%acsnow(ix)
+ sfc_var2(i,j,nvar2m+20) = Sfcprop(nb)%clw_surf_land(ix)
+ sfc_var2(i,j,nvar2m+21) = Sfcprop(nb)%clw_surf_ice(ix)
+ sfc_var2(i,j,nvar2m+22) = Sfcprop(nb)%qwv_surf_land(ix)
+ sfc_var2(i,j,nvar2m+23) = Sfcprop(nb)%qwv_surf_ice(ix)
+ sfc_var2(i,j,nvar2m+24) = Sfcprop(nb)%tsnow_land(ix)
+ sfc_var2(i,j,nvar2m+25) = Sfcprop(nb)%tsnow_ice(ix)
+ sfc_var2(i,j,nvar2m+26) = Sfcprop(nb)%snowfallac_land(ix)
+ sfc_var2(i,j,nvar2m+27) = Sfcprop(nb)%snowfallac_ice(ix)
+ sfc_var2(i,j,nvar2m+28) = Sfcprop(nb)%sncovr_ice(ix)
if (Model%rdlai) then
- sfc_var2(i,j,nvar2m+25) = Sfcprop(nb)%xlaixy(ix)
+ sfc_var2(i,j,nvar2m+29) = Sfcprop(nb)%xlaixy(ix)
endif
else if (Model%lsm == Model%lsm_noahmp) then