diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py index b68adbb3f..940a8a36f 100755 --- a/ccpp/config/ccpp_prebuild_config.py +++ b/ccpp/config/ccpp_prebuild_config.py @@ -147,6 +147,9 @@ 'ccpp/physics/physics/cu_gf_driver_pre.F90' , 'ccpp/physics/physics/cu_gf_driver.F90' , 'ccpp/physics/physics/cu_gf_driver_post.F90' , + 'ccpp/physics/physics/cu_unified_driver_pre.F90' , + 'ccpp/physics/physics/cu_unified_driver.F90' , + 'ccpp/physics/physics/cu_unified_driver_post.F90' , 'ccpp/physics/physics/hedmf.f' , 'ccpp/physics/physics/moninshoc.f' , 'ccpp/physics/physics/satmedmfvdif.F' , diff --git a/ccpp/physics b/ccpp/physics index ae12bd549..3dc962cbc 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit ae12bd549d951ebaf45cbe07dc14033cea46ca1c +Subproject commit 3dc962cbc0a89beccd1a4343e5e96d7bf60e6145 diff --git a/scm/src/GFS_typedefs.F90 b/scm/src/GFS_typedefs.F90 index 6ba4a7785..bd53ee1fd 100644 --- a/scm/src/GFS_typedefs.F90 +++ b/scm/src/GFS_typedefs.F90 @@ -1074,6 +1074,7 @@ module GFS_typedefs integer :: imfshalcnv_samf = 2 !< flag for SAMF scale- & aerosol-aware mass-flux shallow convection scheme integer :: imfshalcnv_gf = 3 !< flag for scale- & aerosol-aware Grell-Freitas scheme (GSD) integer :: imfshalcnv_ntiedtke = 4 !< flag for new Tiedtke scheme (CAPS) + integer :: imfshalcnv_unified = 5 !< flag for the unified convection scheme logical :: hwrf_samfdeep !< flag for HWRF SAMF deepcnv scheme (HWRF) logical :: progsigma !< flag for prognostic area fraction in samf ddepcnv scheme (GFS) integer :: imfdeepcnv !< flag for mass-flux deep convection scheme @@ -1087,6 +1088,7 @@ module GFS_typedefs integer :: imfdeepcnv_samf = 2 !< flag for SAMF scale- & aerosol-aware mass-flux deep convection scheme integer :: imfdeepcnv_gf = 3 !< flag for scale- & aerosol-aware Grell-Freitas scheme (GSD) integer :: imfdeepcnv_ntiedtke = 4 !< flag for new Tiedtke scheme (CAPS) + integer :: imfdeepcnv_unified = 5 !< flag for the unified convection scheme logical :: hwrf_samfshal !< flag for HWRF SAMF shalcnv scheme (HWRF) integer :: isatmedmf !< flag for scale-aware TKE-based moist edmf scheme !< 0: initial version of satmedmf (Nov. 2018) @@ -2551,7 +2553,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%cqs2 = clear_val Sfcprop%lh = clear_val end if - if (Model%imfdeepcnv == Model%imfdeepcnv_gf) then + if (Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_unified) then allocate (Sfcprop%conv_act(IM)) allocate (Sfcprop%conv_act_m(IM)) Sfcprop%conv_act = zero @@ -2934,7 +2936,7 @@ subroutine coupling_create (Coupling, IM, Model) Coupling%rrfs_hwp = clear_val endif - if (Model%imfdeepcnv == Model%imfdeepcnv_gf) then + if (Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_unified) then allocate (Coupling%qci_conv (IM,Model%levs)) Coupling%qci_conv = clear_val endif @@ -3370,7 +3372,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: hwrf_samfdeep = .false. !< flag for HWRF SAMF deepcnv scheme logical :: hwrf_samfshal = .false. !< flag for HWRF SAMF shalcnv scheme - logical :: progsigma = .false. !< flag for prognostic updraft area fraction closure in saSAS + logical :: progsigma = .false. !< flag for prognostic updraft area fraction closure in saSAS or Unified conv. logical :: do_mynnedmf = .false. !< flag for MYNN-EDMF logical :: do_mynnsfclay = .false. !< flag for MYNN Surface Layer Scheme ! DH* TODO - move to MYNN namelist section @@ -3880,17 +3882,17 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & write(*,*) 'NO FLAG: pbl is generic' endif - if(imfshalcnv == Model%imfshalcnv_gf) then + if(imfshalcnv == Model%imfshalcnv_gf .or. imfshalcnv == Model%imfshalcnv_unified) then if(me==master) & - write(*,*) 'FLAG: imfshalcnv_gf so scnv not generic' + write(*,*) 'FLAG: imfshalcnv_gf or imfshalcnv_unified so scnv not generic' Model%flag_for_scnv_generic_tend=.false. elseif(me==master) then write(*,*) 'NO FLAG: scnv is generic' endif - if(imfdeepcnv == Model%imfdeepcnv_gf) then + if(imfdeepcnv == Model%imfdeepcnv_gf .or. imfdeepcnv == Model%imfdeepcnv_unified) then if(me==master) & - write(*,*) 'FLAG: imfdeepcnv_gf so dcnv not generic' + write(*,*) 'FLAG: imfdeepcnv_gf or imfdeepcnv_unified so dcnv not generic' Model%flag_for_dcnv_generic_tend=.false. elseif(me==master) then write(*,*) 'NO FLAG: dcnv is generic' @@ -4462,8 +4464,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%hwrf_samfdeep = hwrf_samfdeep Model%hwrf_samfshal = hwrf_samfshal - if (progsigma .and. imfdeepcnv/=2) then - write(*,*) 'Logic error: progsigma requires imfdeepcnv=2' + if ((progsigma .and. imfdeepcnv/=2) .and. (progsigma .and. imfdeepcnv/=5)) then + write(*,*) 'Logic error: progsigma requires imfdeepcnv=2 or 5' stop end if Model%progsigma = progsigma @@ -5407,6 +5409,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & print *,' Grell-Freitas scale & aerosol-aware mass-flux deep conv scheme' elseif(Model%imfdeepcnv == Model%imfdeepcnv_ntiedtke) then print *,' New Tiedtke cumulus scheme' + elseif(Model%imfdeepcnv == Model%imfdeepcnv_unified) then + print *,' New unified cumulus convection scheme' endif endif else @@ -5450,6 +5454,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & print *,' Grell-Freitas scale- & aerosol-aware mass-flux shallow conv scheme (2013)' elseif (Model%imfshalcnv == Model%imfshalcnv_ntiedtke) then print *,' New Tiedtke cumulus scheme' + elseif (Model%imfshalcnv == Model%imfshalcnv_unified) then + print *,' New unified cumulus scheme' else print *,' unknown mass-flux scheme in use - defaulting to no shallow convection' Model%imfshalcnv = -1 @@ -5696,7 +5702,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & endif if(Model%ras .or. Model%cscnv) Model%cnvcld = .false. - if(Model%do_shoc .or. Model%pdfcld .or. Model%do_mynnedmf .or. Model%imfdeepcnv == Model%imfdeepcnv_gf) Model%cnvcld = .false. + if(Model%do_shoc .or. Model%pdfcld .or. Model%do_mynnedmf .or. Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_unified) Model%cnvcld = .false. if(Model%cnvcld) Model%ncnvcld3d = 1 !--- get cnvwind index in phy_f2d; last entry in phy_f2d array @@ -5761,7 +5767,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%lmfshal = (Model%shal_cnv .and. Model%imfshalcnv > 0) Model%lmfdeep2 = (Model%imfdeepcnv == Model%imfdeepcnv_samf & .or. Model%imfdeepcnv == Model%imfdeepcnv_gf & - .or. Model%imfdeepcnv == Model%imfdeepcnv_ntiedtke) + .or. Model%imfdeepcnv == Model%imfdeepcnv_ntiedtke & + .or. Model%imfdeepcnv == Model%imfdeepcnv_unified) !--- END CODE FROM GLOOPR !--- BEGIN CODE FROM GLOOPB @@ -6701,7 +6708,7 @@ subroutine tbd_create (Tbd, IM, Model) allocate (Tbd%hpbl (IM)) Tbd%hpbl = 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) then + 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_unified .or. Model%imfshalcnv == Model%imfshalcnv_unified) then allocate(Tbd%prevsq(IM, Model%levs)) Tbd%prevsq = clear_val endif @@ -6711,7 +6718,7 @@ subroutine tbd_create (Tbd, IM, Model) Tbd%ud_mf = zero endif - if (Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_ntiedtke) then + if (Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_ntiedtke .or. Model%imfdeepcnv == Model%imfdeepcnv_unified) then allocate(Tbd%forcet(IM, Model%levs)) allocate(Tbd%forceq(IM, Model%levs)) allocate(Tbd%prevst(IM, Model%levs)) @@ -6720,7 +6727,7 @@ subroutine tbd_create (Tbd, IM, Model) Tbd%prevst = clear_val end if - if (Model%imfdeepcnv == Model%imfdeepcnv_gf) then + if (Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_unified) then allocate(Tbd%cactiv(IM)) allocate(Tbd%cactiv_m(IM)) allocate(Tbd%aod_gf(IM)) diff --git a/scm/src/GFS_typedefs.meta b/scm/src/GFS_typedefs.meta index d9802be59..58feecd68 100644 --- a/scm/src/GFS_typedefs.meta +++ b/scm/src/GFS_typedefs.meta @@ -979,7 +979,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection) + active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_unified_deep_convection) [conv_act_m] standard_name = consecutive_calls_for_grell_freitas_mid_level_convection long_name = Memory counter for GF midlevel @@ -987,7 +987,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection) + active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_unified_deep_convection) [spec_sh_flux] standard_name = specified_surface_upward_temperature_flux long_name = specified kinematic surface upward sensible heat flux @@ -2713,7 +2713,7 @@ dimensions = (horizontal_loop_extent,vertical_layer_dimension) type = real kind = kind_phys - active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection) + active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_unified_deep_convection) [pfi_lsan] standard_name = ice_flux_due_to_large_scale_precipitation long_name = instantaneous 3D flux of ice from nonconvective precipitation @@ -4802,6 +4802,12 @@ units = flag dimensions = () type = integer +[imfshalcnv_unified] + standard_name = identifier_for_unified_shallow_convection + long_name = flag for Unified shallow convection scheme + units = flag + dimensions = () + type = integer [imfshalcnv_ntiedtke] standard_name = identifier_for_new_tiedtke_shallow_convection long_name = flag for new Tiedtke shallow convection scheme @@ -4832,6 +4838,12 @@ units = flag dimensions = () type = integer +[imfdeepcnv_unified] + standard_name = identifier_for_unified_deep_convection + long_name = flag for Unified deep convection scheme + units = flag + dimensions = () + type = integer [imfdeepcnv_ntiedtke] standard_name = identifier_for_new_tiedtke_deep_convection long_name = flag for new Tiedtke deep convection scheme @@ -7014,7 +7026,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection) + active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_unified_deep_convection) [imap] standard_name = map_of_block_column_number_to_global_i_index long_name = map of local index ix to global index i for this block @@ -7238,7 +7250,7 @@ dimensions = (horizontal_loop_extent,vertical_layer_dimension) type = real kind = kind_phys - active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_new_tiedtke_deep_convection) + active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_unified_deep_convection .or. control_for_deep_convection_scheme == identifier_for_new_tiedtke_deep_convection) [forceq] standard_name = tendendy_of_specific_humidity_due_to_nonphysics long_name = moisture tendency due to dynamics only @@ -7246,7 +7258,7 @@ dimensions = (horizontal_loop_extent,vertical_layer_dimension) type = real kind = kind_phys - active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_new_tiedtke_deep_convection) + active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_unified_deep_convection .or. control_for_deep_convection_scheme == identifier_for_new_tiedtke_deep_convection) [prevst] standard_name = air_temperature_on_previous_timestep long_name = temperature from previous time step @@ -7254,7 +7266,7 @@ dimensions = (horizontal_loop_extent,vertical_layer_dimension) type = real kind = kind_phys - active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_new_tiedtke_deep_convection) + active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_unified_deep_convection .or. control_for_deep_convection_scheme == identifier_for_new_tiedtke_deep_convection) [prevsq] standard_name = specific_humidity_on_previous_timestep long_name = moisture from previous time step @@ -7262,21 +7274,21 @@ dimensions = (horizontal_loop_extent,vertical_layer_dimension) type = real kind = kind_phys - active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_new_tiedtke_deep_convection .or. control_for_deep_convection_scheme == identifer_for_scale_aware_mass_flux_deep_convection .or. control_for_shallow_convection_scheme == identifier_for_scale_aware_mass_flux_shallow_convection) + active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_unified_deep_convection .or. control_for_deep_convection_scheme == identifier_for_new_tiedtke_deep_convection .or. control_for_deep_convection_scheme == identifer_for_scale_aware_mass_flux_deep_convection .or. control_for_shallow_convection_scheme == identifier_for_scale_aware_mass_flux_shallow_convection) [cactiv] standard_name = counter_for_grell_freitas_convection long_name = convective activity memory units = none dimensions = (horizontal_loop_extent) type = integer - active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection) + active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_unified_deep_convection) [cactiv_m] standard_name = counter_for_grell_freitas_mid_level_convection long_name = mid-level convective activity memory units = none dimensions = (horizontal_loop_extent) type = integer - active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection) + active = (control_for_deep_convection_scheme == identifier_for_grell_freitas_deep_convection .or. control_for_deep_convection_scheme == identifier_for_unified_deep_convection) [CLDFRA_BL] standard_name = subgrid_scale_cloud_area_fraction_in_atmosphere_layer long_name = subgrid cloud fraction from PBL scheme