From d96a34ecc6cb6771727d7ff98af78ca3c3faea4e Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Wed, 13 May 2020 17:09:55 -0600 Subject: [PATCH 1/4] support HWRF Noah LSM and GFDL surface layer; add files to ccpp_prebuild.py, add SDFs for new schemes individually, together, and part of HWRF, update GFS_typedefs and FV3GFS_io --- ccpp/config/ccpp_prebuild_config.py | 6 + ccpp/suites/suite_FV3_GFS_v15p2_HWRF_LSM.xml | 95 ++++++ .../suite_FV3_GFS_v15p2_HWRF_LSM_SL.xml | 95 ++++++ ccpp/suites/suite_FV3_GFS_v15p2_HWRF_SL.xml | 93 ++++++ ccpp/suites/suite_HAFS_v0_hwrf.xml | 90 ++++++ gfsphysics/GFS_layer/GFS_typedefs.F90 | 278 ++++++++++++++--- gfsphysics/GFS_layer/GFS_typedefs.meta | 294 +++++++++++++++++- io/FV3GFS_io.F90 | 14 +- 8 files changed, 903 insertions(+), 62 deletions(-) create mode 100644 ccpp/suites/suite_FV3_GFS_v15p2_HWRF_LSM.xml create mode 100644 ccpp/suites/suite_FV3_GFS_v15p2_HWRF_LSM_SL.xml create mode 100644 ccpp/suites/suite_FV3_GFS_v15p2_HWRF_SL.xml create mode 100644 ccpp/suites/suite_HAFS_v0_hwrf.xml diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py index 83b6500bb..bee32f4a5 100755 --- a/ccpp/config/ccpp_prebuild_config.py +++ b/ccpp/config/ccpp_prebuild_config.py @@ -100,6 +100,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', @@ -146,6 +148,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', # derived data type definitions 'FV3/gfsphysics/GFS_layer/GFS_typedefs.F90', 'FV3/gfsphysics/CCPP_layer/CCPP_typedefs.F90', @@ -187,6 +190,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' ], @@ -235,6 +239,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/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 new file mode 100644 index 000000000..70ea71dc7 --- /dev/null +++ b/ccpp/suites/suite_HAFS_v0_hwrf.xml @@ -0,0 +1,90 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + GFS_rrtmg_pre + rrtmg_lw_pre + rrtmg_lw + rrtmg_lw_post + rrtmg_sw_pre + rrtmg_sw + rrtmg_sw_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 + mp_fer_hires + GFS_MP_generic_post + maximum_hourly_diagnostics + + + + + GFS_stochastics + + + + diff --git a/gfsphysics/GFS_layer/GFS_typedefs.F90 b/gfsphysics/GFS_layer/GFS_typedefs.F90 index dc77aa92b..cf850ecbf 100644 --- a/gfsphysics/GFS_layer/GFS_typedefs.F90 +++ b/gfsphysics/GFS_layer/GFS_typedefs.F90 @@ -237,6 +237,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 @@ -321,7 +323,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 @@ -724,18 +727,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 @@ -753,6 +771,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) @@ -1236,7 +1262,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() ! @@ -1615,6 +1640,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() !< @@ -1627,6 +1653,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() !< @@ -1637,6 +1664,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() !< @@ -1659,8 +1687,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() !< @@ -1697,6 +1727,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() !< @@ -1800,6 +1832,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() !< @@ -1813,7 +1847,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() !< @@ -1829,27 +1865,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 !< @@ -1859,6 +1908,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() !< @@ -1877,6 +1927,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() !< @@ -2330,6 +2381,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)) @@ -2366,7 +2433,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 @@ -2851,7 +2918,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) @@ -2877,6 +2951,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) @@ -3148,13 +3229,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, & @@ -3452,8 +3538,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) @@ -3476,11 +3562,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 @@ -4014,6 +4116,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' @@ -4245,9 +4349,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, & @@ -4565,28 +4669,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 @@ -4982,12 +5095,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 @@ -5018,8 +5131,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)) @@ -5032,8 +5144,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 @@ -5894,7 +6005,7 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%lake (IM)) allocate (Interstitial%ocean (IM)) allocate (Interstitial%islmsk (IM)) - allocate (Interstitial%islmsk_cice (IM)) + allocate (Interstitial%islmsk_cice (IM)) allocate (Interstitial%wet (IM)) allocate (Interstitial%kbot (IM)) allocate (Interstitial%kcnv (IM)) @@ -6061,6 +6172,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 @@ -6257,7 +6396,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 @@ -6574,6 +6713,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 @@ -6917,6 +7084,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 a9308fffe..0148f6c57 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 @@ -2636,6 +2657,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 @@ -2662,10 +2689,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 @@ -2678,6 +2730,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 @@ -2763,6 +2839,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 @@ -4533,13 +4634,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 @@ -5664,8 +5758,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 @@ -6073,6 +6165,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 @@ -6150,6 +6249,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 @@ -6297,6 +6403,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 @@ -6528,6 +6641,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 @@ -6542,6 +6662,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 @@ -6854,6 +6981,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 @@ -7591,6 +7730,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 @@ -7680,6 +7833,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 @@ -7687,6 +7847,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 @@ -7811,12 +7978,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 @@ -7838,6 +8026,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 @@ -7845,6 +8040,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 @@ -7852,6 +8054,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 @@ -7866,12 +8089,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 @@ -7914,6 +8158,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 @@ -7956,6 +8207,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 @@ -8009,6 +8267,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) @@ -8133,6 +8398,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 @@ -8639,5 +8911,3 @@ dimensions = () type = real kind = kind_phys - intent = in - optional = F diff --git a/io/FV3GFS_io.F90 b/io/FV3GFS_io.F90 index 652955816..9bc87a818 100644 --- a/io/FV3GFS_io.F90 +++ b/io/FV3GFS_io.F90 @@ -243,7 +243,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) @@ -647,7 +647,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)) @@ -819,7 +819,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' @@ -1042,7 +1042,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 @@ -1552,7 +1552,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)) @@ -1716,7 +1716,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' @@ -1890,7 +1890,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 From eab67f586860e0a68e86e481928de827e828f970 Mon Sep 17 00:00:00 2001 From: Dom Heinzeller Date: Thu, 28 May 2020 15:18:22 -0600 Subject: [PATCH 2/4] Update .gitmodules and submodule pointer for code review and testing --- .gitmodules | 6 ++++-- ccpp/physics | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 2fd86e7d8..a7a1e4cea 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,5 +8,7 @@ branch = master [submodule "ccpp/physics"] path = ccpp/physics - url = https://github.com/NCAR/ccpp-physics - branch = dtc/hwrf-physics + #url = https://github.com/NCAR/ccpp-physics + #branch = dtc/hwrf-physics + url = https://github.com/grantfirl/ccpp-physics + branch = hwrf_sfc_PR diff --git a/ccpp/physics b/ccpp/physics index 0d4717a39..997d37806 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 0d4717a39525cdc5b5655701dc67a29274340cd4 +Subproject commit 997d3780684c580824b32287505441b574b3204d From 89566cb9d6211dc7eb2d7695adc166b61ddf1d01 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Thu, 28 May 2020 16:02:23 -0600 Subject: [PATCH 3/4] update submodule pointer for ccpp/physics --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 997d37806..c7c2c3c1f 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 997d3780684c580824b32287505441b574b3204d +Subproject commit c7c2c3c1f1c568d55bdaf4ed44537ba9053846f4 From 2791a636e6d40744c0c5b383cfa7fe7364f690d6 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Fri, 29 May 2020 09:59:40 -0600 Subject: [PATCH 4/4] update submodule pointer for ccpp/physics and revert changes to .gitmodules --- .gitmodules | 6 ++---- ccpp/physics | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.gitmodules b/.gitmodules index a7a1e4cea..2fd86e7d8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,7 +8,5 @@ branch = master [submodule "ccpp/physics"] path = ccpp/physics - #url = https://github.com/NCAR/ccpp-physics - #branch = dtc/hwrf-physics - url = https://github.com/grantfirl/ccpp-physics - branch = hwrf_sfc_PR + url = https://github.com/NCAR/ccpp-physics + branch = dtc/hwrf-physics diff --git a/ccpp/physics b/ccpp/physics index c7c2c3c1f..76a02b8e8 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit c7c2c3c1f1c568d55bdaf4ed44537ba9053846f4 +Subproject commit 76a02b8e80c4b96e4cd6a60c8fdacd78fd9726e7