diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 8d90054332..9ef11201b2 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -169,6 +169,11 @@ module GFS_typedefs real (kind=kind_phys), pointer :: vvl (:,:) => null() !< layer mean vertical velocity in pa/sec real (kind=kind_phys), pointer :: tgrs (:,:) => null() !< model layer mean temperature in k real (kind=kind_phys), pointer :: qgrs (:,:,:) => null() !< layer mean tracer concentration +!3D-SA-TKE + real (kind=kind_phys), pointer :: def_1 (:,:) => null() !< deformation + real (kind=kind_phys), pointer :: def_2 (:,:) => null() !< deformation + real (kind=kind_phys), pointer :: def_3 (:,:) => null() !< deformation +!3D-SA-TKE-end ! dissipation estimate real (kind=kind_phys), pointer :: diss_est(:,:) => null() !< model layer mean temperature in k ! soil state variables - for soil SPPT - sfc-perts, mgehne @@ -1181,6 +1186,7 @@ module GFS_typedefs logical :: shinhong !< flag for scale-aware Shinhong vertical turbulent mixing scheme logical :: do_ysu !< flag for YSU turbulent mixing scheme logical :: dspheat !< flag for tke dissipative heating + logical :: sa3dtke !< flag for scale-aware 3D tke scheme logical :: hurr_pbl !< flag for hurricane-specific options in PBL scheme logical :: lheatstrg !< flag for canopy heat storage parameterization logical :: lseaspray !< flag for sea spray parameterization @@ -1377,6 +1383,7 @@ module GFS_typedefs real(kind=kind_phys) :: elmx !< maximum allowed dissipation mixing length in boundary layer mass flux scheme integer :: sfc_rlm !< choice of near surface mixing length in boundary layer mass flux scheme integer :: tc_pbl !< control for TC applications in the PBL scheme + integer :: use_lpt !< control for using Liquid Potential Temp for TC applications in the GFSPBL scheme !--- parameters for canopy heat storage (CHS) parameterization real(kind=kind_phys) :: h0facu !< CHS factor for sensible heat flux in unstable surface layer @@ -1798,6 +1805,11 @@ module GFS_typedefs real (kind=kind_phys), pointer :: hpbl (:) => null() !< Planetary boundary layer height real (kind=kind_phys), pointer :: ud_mf (:,:) => null() !< updraft mass flux +!-- Diagnostic variable that passes to dyn_core (SA-3D-TKE) + real (kind=kind_phys), pointer :: dku3d_h (:,:) => null() !< Horizontal eddy diffusitivity for momentum + real (kind=kind_phys), pointer :: dku3d_e (:,:) => null() !< Eddy diffusitivity for momentum for tke + + !--- dynamical forcing variables for Grell-Freitas convection real (kind=kind_phys), pointer :: forcet (:,:) => null() !< real (kind=kind_phys), pointer :: forceq (:,:) => null() !< @@ -2273,11 +2285,21 @@ subroutine statein_create (Statein, Model) allocate (Statein%wgrs (IM,Model%levs)) endif allocate (Statein%qgrs (IM,Model%levs,Model%ntrac)) +!3D-SA-TKE + allocate (Statein%def_1 (IM,Model%levs)) + allocate (Statein%def_2 (IM,Model%levs)) + allocate (Statein%def_3 (IM,Model%levs)) +!3D-SA-TKE-end Statein%qgrs = clear_val Statein%pgr = clear_val Statein%ugrs = clear_val Statein%vgrs = clear_val +!3D-SA-TKE + Statein%def_1 = clear_val + Statein%def_2 = clear_val + Statein%def_3 = clear_val +!3D-SA-TKE-end if(Model%lightning_threat) then Statein%wgrs = clear_val @@ -3736,6 +3758,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: shinhong = .false. !< flag for scale-aware Shinhong vertical turbulent mixing scheme logical :: do_ysu = .false. !< flag for YSU vertical turbulent mixing scheme logical :: dspheat = .false. !< flag for tke dissipative heating + logical :: sa3dtke = .false. !< flag for scale-aware 3D tke scheme logical :: hurr_pbl = .false. !< flag for hurricane-specific options in PBL scheme logical :: lheatstrg = .false. !< flag for canopy heat storage parameterization logical :: lseaspray = .false. !< flag for sea spray parameterization @@ -3918,6 +3941,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & real(kind=kind_phys) :: elmx = 300. !< maximum allowed dissipation mixing length in boundary layer mass flux scheme integer :: sfc_rlm = 0 !< choice of near surface mixing length in boundary layer mass flux scheme integer :: tc_pbl = 0 !< control for TC applications in the PBL scheme + integer :: use_lpt = 0 !< control for using Liquid Potential Temp for TC applications in the GFSPBL scheme !--- parameters for canopy heat storage (CHS) parameterization real(kind=kind_phys) :: h0facu = 0.25 @@ -4162,6 +4186,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & do_spp, n_var_spp, & lndp_type, n_var_lndp, lndp_each_step, & pert_mp,pert_clds,pert_radtend, & + !--- Scale-aware 3D TKE scheme + sa3dtke, & !--- Rayleigh friction prslrd0, ral_ts, ldiag_ugwp, do_ugwp, do_tofd, & ! --- Ferrier-Aligo @@ -4184,7 +4210,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & diag_flux, diag_log, & ! vertical diffusion xkzm_m, xkzm_h, xkzm_s, xkzminv, moninq_fac, dspfac, & - bl_upfr, bl_dnfr, rlmx, elmx, sfc_rlm, tc_pbl, & + bl_upfr, bl_dnfr, rlmx, elmx, sfc_rlm, tc_pbl, use_lpt, & !--- canopy heat storage parameterization h0facu, h0facs, & !--- cellular automata @@ -5141,6 +5167,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%diag_flux = diag_flux !--- flux method in 2-m diagnostics (for stable conditions) Model%diag_log = diag_log +!--- SA-3D-TKE option + Model%sa3dtke = sa3dtke !--- vertical diffusion Model%xkzm_m = xkzm_m @@ -5155,6 +5183,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%elmx = elmx Model%sfc_rlm = sfc_rlm Model%tc_pbl = tc_pbl + Model%use_lpt = use_lpt !--- canopy heat storage parametrization Model%h0facu = h0facu @@ -6904,6 +6933,7 @@ subroutine control_print(Model) print *, ' shinhong : ', Model%shinhong print *, ' do_ysu : ', Model%do_ysu print *, ' dspheat : ', Model%dspheat + print *, ' sa3dtke : ', Model%sa3dtke print *, ' lheatstrg : ', Model%lheatstrg print *, ' lseaspray : ', Model%lseaspray print *, ' cnvcld : ', Model%cnvcld @@ -7000,6 +7030,7 @@ subroutine control_print(Model) print *, ' elmx : ', Model%elmx print *, ' sfc_rlm : ', Model%sfc_rlm print *, ' tc_pbl : ', Model%tc_pbl + print *, ' use_lpt : ', Model%use_lpt print *, ' ' print *, 'parameters for canopy heat storage parametrization' print *, ' h0facu : ', Model%h0facu @@ -7352,6 +7383,12 @@ subroutine tbd_create (Tbd, Model) allocate (Tbd%hpbl (IM)) Tbd%hpbl = clear_val +! Allocate horizontal component of dku for dyn_core (SA-3D-TKE) + allocate (Tbd%dku3d_h (IM,Model%levs)) + Tbd%dku3d_h = clear_val + allocate (Tbd%dku3d_e (IM,Model%levs)) + Tbd%dku3d_e = clear_val + if (Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_ntiedtke .or. Model%imfdeepcnv == Model%imfdeepcnv_samf .or. Model%imfshalcnv == Model%imfshalcnv_samf .or. Model%imfdeepcnv == Model%imfdeepcnv_c3 .or. Model%imfshalcnv == Model%imfshalcnv_c3) then allocate (Tbd%prevsq(IM, Model%levs)) Tbd%prevsq = clear_val diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index 04562b7db7..0037163db6 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -119,6 +119,48 @@ type = real kind = kind_phys active = (do_lightning_threat_index_calculations) +[def_1] + standard_name = square_of_vertical_shear_due_to_dynamics + long_name = square of vertical shear calculated from dynamics + units = m2 s-2 + dimensions = (horizontal_dimension,vertical_layer_dimension) + type = real + kind = kind_phys +[def_1(:,1)] + standard_name = square_of_vertical_shear_due_to_dynamics_at_surface_adjacent_layer + long_name = square of vertical shear calculated from dynamics at lowest model layer + units = m2 s-2 + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[def_2] + standard_name = square_of_horizontal_shear_due_to_dynamics + long_name = square of horizontal shear calculated from dynamics + units = m2 s-2 + dimensions = (horizontal_dimension,vertical_layer_dimension) + type = real + kind = kind_phys +[def_2(:,1)] + standard_name = square_of_horizontal_shear_due_to_dynamics_at_surface_adjacent_layer + long_name = square of horizontal shear calculated from dynamics at lowest model layer + units = m2 s-2 + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[def_3] + standard_name = horizontal_transfer_rate_of_tke_due_to_dynamics + long_name = rate of horizontal TKE transfer and pressure correlation calculated from dynamics + units = m2 s-3 + dimensions = (horizontal_dimension,vertical_layer_dimension) + type = real + kind = kind_phys +[def_3(:,1)] + standard_name = horizontal_transfer_rate_tke_due_to_dynamics_at_surface_adjacent_layer + long_name = rate of horizontal TKE transfer and pressure correlation calculated from dynamics at lowest model layer + units = m2 s-3 + dimensions = (horizontal_dimension) + type = real + kind = kind_phys [vvl] standard_name = lagrangian_tendency_of_air_pressure long_name = layer mean vertical velocity @@ -5525,6 +5567,12 @@ units = flag dimensions = () type = logical +[sa3dtke] + standard_name = do_scale_aware_3d_tke + long_name = flag for scale-aware 3d tke scheme + units = flag + dimensions = () + type = logical [hurr_pbl] standard_name = flag_hurricane_PBL long_name = flag for hurricane-specific options in PBL scheme @@ -6112,6 +6160,12 @@ units = none dimensions = () type = integer +[use_lpt] + standard_name = control_for_using_LPT_for_TC_applications_in_the_PBL_scheme + long_name = control for using LPT in TC applications in the PBL scheme + units = none + dimensions = () + type = integer [h0facu] standard_name = multiplicative_tuning_parameter_for_reduced_surface_heat_fluxes_due_to_canopy_heat_storage long_name = canopy heat storage factor for sensible heat flux in unstable surface layer @@ -8005,6 +8059,20 @@ dimensions = (horizontal_dimension) type = real kind = kind_phys +[dku3d_h] + standard_name = horizontal_atmosphere_momentum_diffusivity_for_dynamics + long_name = horizontal atmospheric momentum diffusivity for dynamics + units = m2 s-1 + dimensions = (horizontal_dimension,vertical_layer_dimension) + type = real + kind = kind_phys +[dku3d_e] + standard_name = horizontal_atmosphere_tke_diffusivity_for_dynamics + long_name = horizontal atmospheric tke diffusivity for dynamics + units = m2 s-1 + dimensions = (horizontal_dimension,vertical_layer_dimension) + type = real + kind = kind_phys [ud_mf] standard_name = instantaneous_atmosphere_updraft_convective_mass_flux long_name = (updraft mass flux) * delt diff --git a/ccpp/physics b/ccpp/physics index 8a5f4f57f1..65a25474e9 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 8a5f4f57f108215ab093b26660f42b38f17ea6cf +Subproject commit 65a25474e96977737532f86d199c39dc74b5dc28 diff --git a/fv3/atmos_cubed_sphere b/fv3/atmos_cubed_sphere index ac7c36b12a..4f1a5ef4b8 160000 --- a/fv3/atmos_cubed_sphere +++ b/fv3/atmos_cubed_sphere @@ -1 +1 @@ -Subproject commit ac7c36b12af82a3ea114825f1272ddb21d29085b +Subproject commit 4f1a5ef4b83461a79a62c8d965ebc2b26cf5eba8 diff --git a/fv3/atmos_model.F90 b/fv3/atmos_model.F90 index 0cd5d45e33..159dc6f50c 100644 --- a/fv3/atmos_model.F90 +++ b/fv3/atmos_model.F90 @@ -270,7 +270,8 @@ subroutine update_atmos_radiation_physics (Atmos) call set_atmosphere_pelist() call mpp_clock_begin(getClock) if (GFS_control%do_skeb) call atmosphere_diss_est (GFS_control%skeb_npass) ! do smoothing for SKEB - call atmos_phys_driver_statein (GFS_Control, GFS_Statein, Atm_block, flip_vc) + ! SA-3D-TKE added GFS_Tbd (kyf) + call atmos_phys_driver_statein (GFS_Control, GFS_Statein, GFS_Tbd, Atm_block, flip_vc) call mpp_clock_end(getClock) !--- if dycore only run, set up the dummy physics output state as the input state @@ -752,7 +753,8 @@ subroutine atmos_model_init (Atmos, Time_init, Time, Time_step) endif ! Populate the GFS_Statein container with the prognostic state ! in Atm_block, which contains the initial conditions/restart data. - call atmos_phys_driver_statein (GFS_control, GFS_statein, Atm_block, flip_vc) + ! SA-3D-TKE added GFS_Tbd (kyf) + call atmos_phys_driver_statein (GFS_control, GFS_statein, GFS_Tbd, Atm_block, flip_vc) ! When asked to calculate 3-dim. tendencies, set Stateout variables to ! Statein variables here in order to capture the first call to dycore