Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update for Mike Iacono's RRTMG cloud overlap code #192

Merged
merged 4 commits into from
Oct 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ccpp/framework
51 changes: 46 additions & 5 deletions scm/src/GFS_typedefs.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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() !<
Expand Down Expand Up @@ -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() !<
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 )
Expand Down
20 changes: 16 additions & 4 deletions scm/src/GFS_typedefs.meta
Original file line number Diff line number Diff line change
Expand Up @@ -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 = ()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down