From 8180eea0ac5980d420ebe8025850098bd66ed4d9 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Tue, 11 Aug 2020 15:46:36 -0600 Subject: [PATCH 1/3] add back mjiacono's changes to GFS_typedefs.F90/meta regarding RRTMG cloud overlap --- scm/src/GFS_typedefs.F90 | 48 +++++++++++++++++++++++++++++++++++---- scm/src/GFS_typedefs.meta | 33 ++++++++++++--------------- 2 files changed, 58 insertions(+), 23 deletions(-) diff --git a/scm/src/GFS_typedefs.F90 b/scm/src/GFS_typedefs.F90 index 6ed22292..7f27b203 100644 --- a/scm/src/GFS_typedefs.F90 +++ b/scm/src/GFS_typedefs.F90 @@ -614,8 +614,21 @@ module GFS_typedefs integer :: iems !< use fixed value of 1.0 integer :: iaer !< default aerosol effect in sw only integer :: icliq_sw !< sw optical property for liquid clouds - integer :: iovr_sw !< sw: max-random overlap clouds - integer :: iovr_lw !< lw: max-random overlap clouds + integer :: iovr_sw !< sw: cloud overlap method for radiation + !< 0 => use random overlap + !< 1 => use maximum-random overlap + !< 2 => use maximum overlap + !< 3 => use decorrelation length overlap (NOAA/Hou) + !< 4 => use exponential overlap (AER) + !< 5 => use exponential-random overlap (AER) + integer :: iovr_lw !< lw: cloud overlap method for radiation + !< 0 => use random overlap + !< 1 => use maximum-random overlap + !< 2 => use maximum overlap + !< 3 => use decorrelation length overlap (NOAA/Hou) + !< 4 => use exponential overlap (AER) + !< 5 => use exponential-random overlap (AER) + integer :: iovr !< max-random overlap clouds for sw & lw (maximum of both) integer :: ictm !< ictm=0 => use data at initial cond time, if not !< available; use latest; no extrapolation. !< ictm=1 => use data at the forecast time, if not @@ -1619,6 +1632,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: adjvisdfd(:) => null() !< real (kind=kind_phys), pointer :: aerodp(:,:) => null() !< real (kind=kind_phys), pointer :: alb1d(:) => null() !< + real (kind=kind_phys), pointer :: alpha(:,:) => null() !< real (kind=kind_phys), pointer :: bexp1d(:) => null() !< real (kind=kind_phys), pointer :: canopy_save(:) => null() !< real (kind=kind_phys), pointer :: cd(:) => null() !< @@ -2030,7 +2044,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: ocss(:) => null() !< real (kind=kind_phys), pointer :: oa4ss(:,:) => null() !< real (kind=kind_phys), pointer :: clxss(:,:) => null() !< - + !-- Ferrier-Aligo MP scheme real (kind=kind_phys), pointer :: f_rain (:,:) => null() !< real (kind=kind_phys), pointer :: f_ice (:,:) => null() !< @@ -2863,8 +2877,20 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & integer :: iems = 0 !< use fixed value of 1.0 integer :: iaer = 1 !< default aerosol effect in sw only integer :: icliq_sw = 1 !< sw optical property for liquid clouds - integer :: iovr_sw = 1 !< sw: max-random overlap clouds - integer :: iovr_lw = 1 !< lw: max-random overlap clouds + integer :: iovr_sw = 1 !< sw: cloud overlap method for radiation + !< 0 => use random overlap + !< 1 => use maximum-random overlap + !< 2 => use maximum overlap + !< 3 => use decorrelation length overlap (NOAA/Hou) + !< 4 => use exponential overlap (AER) + !< 5 => use exponential-random overlap (AER) + integer :: iovr_lw = 1 !< lw: cloud overlap method for radiation + !< 0 => use random overlap + !< 1 => use maximum-random overlap + !< 2 => use maximum overlap + !< 3 => use decorrelation length overlap (NOAA/Hou) + !< 4 => use exponential overlap (AER) + !< 5 => use exponential-random overlap (AER) integer :: ictm = 1 !< ictm=0 => use data at initial cond time, if not !< available; use latest; no extrapolation. !< ictm=1 => use data at the forecast time, if not @@ -3603,6 +3629,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%icliq_sw = icliq_sw Model%iovr_sw = iovr_sw Model%iovr_lw = iovr_lw + Model%iovr = max(Model%iovr_sw,Model%iovr_lw) Model%ictm = ictm Model%isubc_sw = isubc_sw Model%isubc_lw = isubc_lw @@ -4679,6 +4706,7 @@ subroutine control_print(Model) print *, ' icliq_sw : ', Model%icliq_sw print *, ' iovr_sw : ', Model%iovr_sw print *, ' iovr_lw : ', Model%iovr_lw + print *, ' iovr : ', Model%iovr print *, ' ictm : ', Model%ictm print *, ' isubc_sw : ', Model%isubc_sw print *, ' isubc_lw : ', Model%isubc_lw @@ -5982,6 +6010,10 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%adjvisdfd (IM)) allocate (Interstitial%aerodp (IM,NSPC1)) allocate (Interstitial%alb1d (IM)) + if (.not. Model%do_RRTMGP) then + ! RRTMGP uses its own cloud_overlap_param + allocate (Interstitial%alpha (IM,Model%levr+LTP)) + end if allocate (Interstitial%bexp1d (IM)) allocate (Interstitial%cd (IM)) allocate (Interstitial%cd_ice (IM)) @@ -6576,6 +6608,9 @@ subroutine interstitial_rad_reset (Interstitial, Model) ! Interstitial%aerodp = clear_val Interstitial%alb1d = clear_val + if (.not. Model%do_RRTMGP) then + Interstitial%alpha = clear_val + end if Interstitial%cldsa = clear_val Interstitial%cldtaulw = clear_val Interstitial%cldtausw = clear_val @@ -7037,6 +7072,9 @@ subroutine interstitial_print(Interstitial, Model, mpirank, omprank, blkno) write (0,*) 'sum(Interstitial%adjvisdfd ) = ', sum(Interstitial%adjvisdfd ) write (0,*) 'sum(Interstitial%aerodp ) = ', sum(Interstitial%aerodp ) write (0,*) 'sum(Interstitial%alb1d ) = ', sum(Interstitial%alb1d ) + if (.not. Model%do_RRTMGP) then + write (0,*) 'sum(Interstitial%alpha ) = ', sum(Interstitial%alpha ) + end if write (0,*) 'sum(Interstitial%bexp1d ) = ', sum(Interstitial%bexp1d ) write (0,*) 'sum(Interstitial%cd ) = ', sum(Interstitial%cd ) write (0,*) 'sum(Interstitial%cd_ice ) = ', sum(Interstitial%cd_ice ) diff --git a/scm/src/GFS_typedefs.meta b/scm/src/GFS_typedefs.meta index 333fb55d..c1774b22 100644 --- a/scm/src/GFS_typedefs.meta +++ b/scm/src/GFS_typedefs.meta @@ -2320,6 +2320,12 @@ units = flag dimensions = () type = integer +[iovr] + standard_name = flag_for_max_random_overlap_clouds_for_radiation + long_name = max-random overlap clouds + units = flag + dimensions = () + type = integer [iovr_sw] standard_name = flag_for_max_random_overlap_clouds_for_shortwave_radiation long_name = sw: max-random overlap clouds @@ -6598,6 +6604,13 @@ dimensions = (horizontal_dimension) type = real kind = kind_phys +[alpha] + standard_name = cloud_overlap_decorrelation_parameter + long_name = cloud overlap decorrelation parameter for RRTMG (but not for RRTMGP) + units = frac + dimensions = (horizontal_dimension,adjusted_vertical_layer_dimension_for_radiation) + type = real + kind = kind_phys [bexp1d] standard_name = perturbation_of_soil_type_b_parameter long_name = perturbation of soil type "b" parameter @@ -9146,7 +9159,6 @@ dimensions = (horizontal_dimension,vertical_dimension) type = real kind = kind_phys - optional = F [p_lev] standard_name = air_pressure_at_interface_for_RRTMGP_in_hPa long_name = air pressure level @@ -9154,7 +9166,6 @@ dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = real kind = kind_phys - optional = F [t_lay] standard_name = air_temperature_at_layer_for_RRTMGP long_name = air temperature layer @@ -9162,7 +9173,6 @@ dimensions = (horizontal_dimension,vertical_dimension) type = real kind = kind_phys - optional = F [t_lev] standard_name = air_temperature_at_interface_for_RRTMGP long_name = air temperature layer @@ -9170,7 +9180,6 @@ dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = real kind = kind_phys - optional = F [tv_lay] standard_name = virtual_temperature long_name = layer virtual temperature @@ -9178,7 +9187,6 @@ dimensions = (horizontal_dimension,vertical_dimension) type = real kind = kind_phys - optional = F [relhum] standard_name = relative_humidity long_name = layer relative humidity @@ -9202,7 +9210,7 @@ kind = kind_phys [cloud_overlap_param] standard_name = cloud_overlap_param - long_name = cloud overlap parameter + long_name = cloud overlap parameter for RRTMGP (but not for RRTMG) units = km dimensions = (horizontal_dimension,vertical_dimension) type = real @@ -9233,7 +9241,6 @@ dimensions = (horizontal_dimension,vertical_dimension) type = real kind = kind_phys - optional = F [cldtaulw] standard_name = RRTMGP_cloud_optical_depth_layers_at_10mu_band long_name = approx 10mu band layer cloud optical depth @@ -9248,7 +9255,6 @@ dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = real kind = kind_phys - optional = F [fluxlwDOWN_allsky] standard_name = RRTMGP_lw_flux_profile_downward_allsky long_name = RRTMGP downward longwave all-sky flux profile @@ -9256,7 +9262,6 @@ dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = real kind = kind_phys - optional = F [fluxlwUP_clrsky] standard_name = RRTMGP_lw_flux_profile_upward_clrsky long_name = RRTMGP upward longwave clr-sky flux profile @@ -9264,7 +9269,6 @@ dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = real kind = kind_phys - optional = F [fluxlwDOWN_clrsky] standard_name = RRTMGP_lw_flux_profile_downward_clrsky long_name = RRTMGP downward longwave clr-sky flux profile @@ -9300,7 +9304,6 @@ dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = real kind = kind_phys - optional = F [fluxswDOWN_allsky] standard_name = RRTMGP_sw_flux_profile_downward_allsky long_name = RRTMGP downward shortwave all-sky flux profile @@ -9308,7 +9311,6 @@ dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = real kind = kind_phys - optional = F [fluxswUP_clrsky] standard_name = RRTMGP_sw_flux_profile_upward_clrsky long_name = RRTMGP upward shortwave clr-sky flux profile @@ -9316,7 +9318,6 @@ dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = real kind = kind_phys - optional = F [fluxswDOWN_clrsky] standard_name = RRTMGP_sw_flux_profile_downward_clrsky long_name = RRTMGP downward shortwave clr-sky flux profile @@ -9324,21 +9325,18 @@ dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = real kind = kind_phys - optional = F [flxprf_lw] standard_name = RRTMGP_lw_fluxes long_name = lw fluxes total sky / csk and up / down at levels units = W m-2 dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = proflw_type - optional = T [flxprf_sw] standard_name = RRTMGP_sw_fluxes long_name = sw fluxes total sky / csk and up / down at levels units = W m-2 dimensions = (horizontal_dimension,vertical_dimension_plus_one) type = profsw_type - optional = T [aerosolslw] standard_name = RRTMGP_aerosol_optical_properties_for_longwave_bands_01_16 long_name = aerosol optical properties for longwave bands 01-16 @@ -9346,7 +9344,6 @@ dimensions = (horizontal_dimension,vertical_dimension, number_of_lw_bands_rrtmgp,number_of_aerosol_output_fields_for_longwave_radiation) type = real kind = kind_phys - optional = F [aerosolslw(:,:,:,1)] standard_name = RRTMGP_aerosol_optical_depth_for_longwave_bands_01_16 long_name = aerosol optical depth for longwave bands 01-16 @@ -9586,7 +9583,7 @@ dimensions = (number_of_active_gases_used_by_RRTMGP) type = character kind = len=128 - + ######################################################################## [ccpp-arg-table] name = GFS_data_type From 6901d0969e0dd55bc8b0a4b7ab292fa953fef1ae Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Mon, 28 Sep 2020 09:25:03 -0600 Subject: [PATCH 2/3] update submodule pointers --- ccpp/framework | 2 +- ccpp/physics | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ccpp/framework b/ccpp/framework index 83655871..f06e053d 160000 --- a/ccpp/framework +++ b/ccpp/framework @@ -1 +1 @@ -Subproject commit 8365587133b40b1faa2831ac395bf098c3dac4a6 +Subproject commit f06e053db04eaea602d43d6221081ba54fb6cc95 diff --git a/ccpp/physics b/ccpp/physics index 0808cc2e..f91d1bfd 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 0808cc2e8938ba66003b46746858143a9d75addb +Subproject commit f91d1bfde0bcdf69a8efe0917f49a4713e590bef From 91939ecba31542d497577e9a1653dc2045e1ff35 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Mon, 28 Sep 2020 09:56:13 -0600 Subject: [PATCH 3/3] update GFS_typedefs to be consistent with what was merged --- scm/src/GFS_typedefs.F90 | 3 +++ scm/src/GFS_typedefs.meta | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/scm/src/GFS_typedefs.F90 b/scm/src/GFS_typedefs.F90 index 00a925b0..cc197759 100644 --- a/scm/src/GFS_typedefs.F90 +++ b/scm/src/GFS_typedefs.F90 @@ -7025,6 +7025,9 @@ subroutine interstitial_phys_reset (Interstitial, Model) end subroutine interstitial_phys_reset + ! DH* 20200901: this routine is no longer used by CCPP's GFS_debug.F90. When new variables are + ! added to the GFS_interstitial_type, it is best to add the variable to both interstitial_print + ! below and to GFS_interstitialtoscreen in ccpp/physics/physics/GFS_debug.F90 subroutine interstitial_print(Interstitial, Model, mpirank, omprank, blkno) ! implicit none diff --git a/scm/src/GFS_typedefs.meta b/scm/src/GFS_typedefs.meta index 62b573c2..060e62ac 100644 --- a/scm/src/GFS_typedefs.meta +++ b/scm/src/GFS_typedefs.meta @@ -2505,19 +2505,19 @@ dimensions = () type = integer [iovr] - standard_name = flag_for_max_random_overlap_clouds_for_radiation + standard_name = flag_for_cloud_overlap_method_for_radiation long_name = max-random overlap clouds units = flag dimensions = () type = integer [iovr_sw] - standard_name = flag_for_max_random_overlap_clouds_for_shortwave_radiation + standard_name = flag_for_cloud_overlap_method_for_shortwave_radiation long_name = sw: max-random overlap clouds units = flag dimensions = () type = integer [iovr_lw] - standard_name = flag_for_max_random_overlap_clouds_for_longwave_radiation + standard_name = flag_for_cloud_overlap_method_for_longwave_radiation long_name = lw: max-random overlap clouds units = flag dimensions = ()