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 diff --git a/scm/src/GFS_typedefs.F90 b/scm/src/GFS_typedefs.F90 index 6075f59f..cc197759 100644 --- a/scm/src/GFS_typedefs.F90 +++ b/scm/src/GFS_typedefs.F90 @@ -615,8 +615,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 @@ -1622,6 +1635,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() !< @@ -2035,7 +2049,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() !< @@ -2872,8 +2886,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 @@ -3606,6 +3632,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 @@ -4676,6 +4703,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 @@ -5984,6 +6012,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)) @@ -6578,6 +6610,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 @@ -6990,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 @@ -7040,6 +7078,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 3cf97c39..060e62ac 100644 --- a/scm/src/GFS_typedefs.meta +++ b/scm/src/GFS_typedefs.meta @@ -2504,14 +2504,20 @@ units = flag dimensions = () type = integer +[iovr] + 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 = () @@ -6927,6 +6933,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 @@ -9574,7 +9587,7 @@ active = (flag_for_rrtmgp_radiation_scheme) [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 @@ -9607,7 +9620,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