From 79ab819cc0840e0833e704cd0880f8a1d48c4320 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Wed, 8 Apr 2020 17:48:41 -0600 Subject: [PATCH] initial transfer of GFS_typedefs modifications from SCM to FV3 for NOAH HAFS LSM --- gfsphysics/GFS_layer/GFS_typedefs.F90 | 219 ++++++++++++++++++---- gfsphysics/GFS_layer/GFS_typedefs.meta | 244 +++++++++++++++++++++++-- 2 files changed, 412 insertions(+), 51 deletions(-) diff --git a/gfsphysics/GFS_layer/GFS_typedefs.F90 b/gfsphysics/GFS_layer/GFS_typedefs.F90 index 215ab9942..1dfe9c392 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 @@ -276,6 +278,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: slc (:,:) => null() !< liquid soil moisture real (kind=kind_phys), pointer :: smc (:,:) => null() !< total soil moisture real (kind=kind_phys), pointer :: stc (:,:) => null() !< soil temperature + real (kind=kind_phys), pointer :: sthick (:) => null() !< soil layer thickness (m) !--- Out real (kind=kind_phys), pointer :: t2m (:) => null() !< 2 meter temperature @@ -724,18 +727,30 @@ 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_hafs = 4 !< flag for NOAH land surface model for HAFS application integer :: lsoil !< number of soil layers #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 -#endif + logical :: rdlai !< read LAI from input file (for RUC LSM or NOAH LSM HAFS) + logical :: ua_phys !< flag for using University of Arizona? extension to NOAH LSM HAFS + logical :: usemonalb !< flag to read surface diffused shortwave albedo from input file for NOAH LSM HAFS + real(kind=kind_phys) :: aoasis !< potential evaporation multiplication factor for NOAH LSM HAFS + integer :: fasdas !< flag to use "flux-adjusting surface data assimilation system"; 0 = OFF, 1 = ON integer :: ivegsrc !< ivegsrc = 0 => USGS, !< ivegsrc = 1 => IGBP (20 category) !< ivegsrc = 2 => UMD (13 category) + !< ivegsrc = 3 => NLCD40 (40 category, NOAH/HAFS only) + !< ivegsrc = 4 => USGS-RUC (28 category, NOAH/HAFS only) + !< ivegsrc = 5 => MODI-RUC (21 category, NOAH/HAFS only) integer :: isot !< isot = 0 => Zobler soil type ( 9 category) - !< isot = 1 => STATSGO soil type (19 category) + !< isot = 1 => STATSGO soil type (19 category, AKA 'STAS'(?)) + !< isot = 2 => STAS-RUC soil type (19 category, NOAH/HAFS only) + integer :: isurban !< vegetation/land use type corresponding to the urban environment 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 ! -- the Noah MP options integer :: iopt_dveg ! 1-> off table lai 2-> on 3-> off;4->off;5 -> on @@ -1232,7 +1247,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() ! @@ -1611,6 +1625,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() !< @@ -1623,6 +1638,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() !< @@ -1633,6 +1649,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() !< @@ -1655,8 +1672,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() !< @@ -1693,6 +1712,7 @@ module GFS_typedefs logical, pointer :: flag_cice(:) => null() !< logical, pointer :: flag_guess(:) => null() !< logical, pointer :: flag_iter(:) => null() !< + logical, pointer :: flag_lsm(:) => 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() !< @@ -1796,6 +1816,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() !< @@ -1809,7 +1831,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() !< @@ -1825,27 +1849,39 @@ 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 :: 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 !< @@ -1855,6 +1891,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() !< @@ -1878,6 +1915,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() !< @@ -2155,6 +2193,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%slc (IM,Model%lsoil)) allocate (Sfcprop%smc (IM,Model%lsoil)) allocate (Sfcprop%stc (IM,Model%lsoil)) + allocate (Sfcprop%sthick (Model%lsoil)) Sfcprop%hice = clear_val Sfcprop%weasd = clear_val @@ -2168,6 +2207,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%slc = clear_val Sfcprop%smc = clear_val Sfcprop%stc = clear_val + Sfcprop%sthick = clear_val !--- Out allocate (Sfcprop%t2m (IM)) @@ -2331,6 +2371,15 @@ subroutine sfcprop_create (Sfcprop, IM, Model) endif #ifdef CCPP + if (Model%do_myjsfc.or.Model%do_myjpbl.or.(Model%lsm == Model%lsm_noah_hafs)) then + allocate(Sfcprop%z0base(IM)) + Sfcprop%z0base = clear_val + end if + if (Model%lsm == Model%lsm_noah_hafs) 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)) @@ -2367,7 +2416,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 @@ -2850,7 +2899,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 HAFS) + logical :: ua_phys = .false. !< flag for using University of Arizona? extension to NOAH LSM HAFS + logical :: usemonalb = .true. !< flag to read surface diffused shortwave albedo from input file for NOAH LSM HAFS + real(kind=kind_phys) :: aoasis = 1.0 !< potential evaporation multiplication factor for NOAH LSM HAFS + 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) @@ -3145,7 +3201,8 @@ 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 @@ -3447,8 +3504,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_hafs) .and. Model%nscyc>0) then + write(0,*) 'Logic error: RUC LSM and NOAH HAFS 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) @@ -3471,6 +3528,12 @@ 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/HAFS 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 @@ -3996,6 +4059,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_hafs) then + print *,' NOAH/HAFS Land Surface Model used' #else elseif (Model%lsm == Model%lsm_ruc) then print *,' RUC Land Surface Model only available through CCPP - job aborted' @@ -4223,9 +4288,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, & @@ -4542,27 +4607,30 @@ 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 print *, ' ' print *, 'tuning parameters for physical parameterizations' @@ -4955,12 +5023,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 @@ -4991,8 +5059,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)) @@ -5005,8 +5072,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 @@ -5867,7 +5933,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)) @@ -6039,6 +6105,32 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%t2mmp (IM)) allocate (Interstitial%q2mp (IM)) end if + if (Model%lsm == Model%lsm_noah_hafs) 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%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%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 @@ -6235,7 +6327,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 @@ -6557,6 +6649,32 @@ subroutine interstitial_phys_reset (Interstitial, Model) Interstitial%t2mmp = clear_val Interstitial%q2mp = clear_val end if + if (Model%lsm == Model%lsm_noah_hafs) 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%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%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 @@ -6905,6 +7023,29 @@ 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_hafs) 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,*) '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%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 7d964fd9a..34836278f 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 @@ -723,6 +737,13 @@ 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 [t2m] standard_name = temperature_at_2m long_name = 2 meter temperature @@ -2636,6 +2657,12 @@ units = flag dimensions = () type = integer +[lsm_noah_hafs] + standard_name = flag_for_noah_hafs_land_surface_scheme + long_name = flag for NOAH HAFS 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 HAFS (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 HAFS (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 HAFS (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 HAFS (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,18 @@ 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 +[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 @@ -4515,13 +4579,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 @@ -5646,8 +5703,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 @@ -6055,6 +6110,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 @@ -6132,6 +6194,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 @@ -6279,6 +6348,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 @@ -6510,6 +6586,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 @@ -6524,6 +6607,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 @@ -6864,6 +6954,12 @@ 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 [ffmm_ocean] standard_name = Monin_Obukhov_similarity_function_for_momentum_over_ocean long_name = Monin-Obukhov similarity function for momentum over ocean @@ -7601,6 +7697,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 @@ -7690,6 +7800,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 @@ -7697,6 +7814,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 @@ -7821,12 +7945,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 @@ -7848,6 +7993,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 @@ -7855,6 +8007,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 @@ -7862,6 +8021,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 @@ -7876,12 +8056,26 @@ 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 [stress] standard_name = surface_wind_stress long_name = surface wind stress @@ -7924,6 +8118,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 @@ -7966,6 +8167,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 @@ -8019,6 +8227,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) @@ -8150,6 +8365,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 @@ -8656,5 +8878,3 @@ dimensions = () type = real kind = kind_phys - intent = in - optional = F