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

Infrastructure improvements for radiation #193

Merged
merged 9 commits into from
Nov 13, 2020
78 changes: 53 additions & 25 deletions gfsphysics/GFS_layer/GFS_typedefs.F90
Original file line number Diff line number Diff line change
Expand Up @@ -658,8 +658,9 @@ 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 :: icice_sw !< sw optical property for ice clouds
integer :: icliq_lw !< lw optical property for liquid clouds
integer :: icice_lw !< lw optical property for ice clouds
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.
Expand All @@ -678,6 +679,11 @@ module GFS_typedefs
!< =1 => sub-grid cloud with prescribed seeds
!< =2 => sub-grid cloud with randomly generated
!< seeds
integer :: idcor !< Decorrelation length type for overlap assumption
!< =0 => Use constant decorrelation length, decorr_con
!< =1 => Use spatially varying decorrelation length (Hogan et al. 2010)
!< =2 => Use spatially and temporally varyint decorrelation length (Oreopoulos et al. 2012)
real(kind_phys) :: dcorr_con !< Decorrelation length constant (km) (if idcor = 0)
logical :: crick_proof !< CRICK-Proof cloud water
logical :: ccnorm !< Cloud condensate normalized by cloud cover
logical :: norad_precip !< radiation precip flag for Ferrier/Moorthi
Expand Down Expand Up @@ -717,6 +723,15 @@ module GFS_typedefs
integer :: imp_physics_zhao_carr_pdf = 98 !< choice of Zhao-Carr microphysics scheme with PDF clouds
integer :: imp_physics_mg = 10 !< choice of Morrison-Gettelman microphysics scheme
integer :: imp_physics_fer_hires = 15 !< choice of Ferrier-Aligo microphysics scheme
integer :: iovr_rand = 0 !< choice of cloud-overlap: random
integer :: iovr_maxrand = 1 !< choice of cloud-overlap: maximum random
integer :: iovr_max = 2 !< choice of cloud-overlap: maximum
integer :: iovr_dcorr = 3 !< choice of cloud-overlap: decorrelation length
integer :: iovr_exp = 4 !< choice of cloud-overlap: exponential
integer :: iovr_exprand = 5 !< choice of cloud-overlap: exponential random
integer :: idcor_con = 0 !< choice for decorrelation-length: Use constant value
integer :: idcor_hogan = 1 !< choice for decorrelation-length: (https://rmets.onlinelibrary.wiley.com/doi/full/10.1002/qj.647)
integer :: idcor_oreopoulos = 2 !< choice for decorrelation-length: (10.5194/acp-12-9097-2012)
!--- Z-C microphysical parameters
real(kind=kind_phys) :: psautco(2) !< [in] auto conversion coeff from ice to snow
real(kind=kind_phys) :: prautco(2) !< [in] auto conversion coeff from cloud to rain
Expand Down Expand Up @@ -3023,8 +3038,10 @@ 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 :: icice_sw = 3 !< sw optical property for ice clouds
integer :: icliq_lw = 1 !< lw optical property for liquid clouds
integer :: icice_lw = 3 !< lw optical property for ice clouds
integer :: iovr = 1 !< cloud-overlap: max-random overlap clouds
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 All @@ -3042,6 +3059,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
!< =1 => sub-grid cloud with prescribed seeds
!< =2 => sub-grid cloud with randomly generated
!< seeds
integer :: idcor = 1 !< Decorrelation length type for overlap assumption
!< =0 => Use constant decorrelation length, decorr_con
!< =1 => Use spatially varying decorrelation length (Hogan et al. 2010)
!< =2 => Use spatially and temporally varyint decorrelation length (Oreopoulos et al. 2012)
real(kind_phys) :: dcorr_con = 2.5 !< Decorrelation length constant (km) (if idcor = 0)
logical :: crick_proof = .false. !< CRICK-Proof cloud water
logical :: ccnorm = .false. !< Cloud condensate normalized by cloud cover
logical :: norad_precip = .false. !< radiation precip flag for Ferrier/Moorthi
Expand Down Expand Up @@ -3437,10 +3459,10 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
cplflx, cplwav, cplwav2atm, cplchm, lsidea, &
!--- radiation parameters
fhswr, fhlwr, levr, nfxr, iaerclm, iflip, isol, ico2, ialb, &
isot, iems, iaer, icliq_sw, iovr_sw, iovr_lw, ictm, isubc_sw,&
isot, iems, iaer, icliq_sw, iovr, ictm, isubc_sw, &
isubc_lw, crick_proof, ccnorm, lwhtr, swhtr, &
#ifdef CCPP
nhfrad, &
nhfrad, idcor, dcorr_con, &
! --- RRTMGP
do_RRTMGP, active_gases, nGases, rrtmgp_root, &
lw_file_gas, lw_file_clouds, rrtmgp_nBandsLW, rrtmgp_nGptsLW,&
Expand Down Expand Up @@ -3788,11 +3810,14 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
endif
#ifdef CCPP
Model%ntrcaer = ntrcaer
Model%idcor = idcor
Model%dcorr_con = dcorr_con
#endif
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%icice_sw = icice_sw
Model%icliq_lw = icliq_lw
Model%icice_lw = icice_lw
Model%iovr = iovr
Model%ictm = ictm
Model%isubc_sw = isubc_sw
Model%isubc_lw = isubc_lw
Expand Down Expand Up @@ -4618,21 +4643,16 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
endif
if (Model%crick_proof) print *,' CRICK-Proof cloud water used in radiation '
if (Model%ccnorm) print *,' Cloud condensate normalized by cloud cover for radiation'

print *,' Radiative heating calculated at',Model%levr, ' layers'
if (Model%iovr_sw == 0) then
print *,' random cloud overlap for Shortwave IOVR_SW=',Model%iovr_sw
elseif (Model%iovr_sw == 4) then
print *,'exponential cloud overlap for Shortwave IOVR_SW=',Model%iovr_lw
else
print *,' max-random cloud overlap for Shortwave IOVR_SW=',Model%iovr_sw
endif
if (Model%iovr_lw == 0) then
print *,' random cloud overlap for Longwave IOVR_LW=',Model%iovr_lw
elseif (Model%iovr_lw == 4) then
print *,'exponential cloud overlap for Longwave IOVR_LW=',Model%iovr_lw
if (Model%iovr == Model%iovr_rand) then
print *,' random cloud overlap for Radiation IOVR=', Model%iovr
elseif (Model%iovr == Model%iovr_dcorr) then
print *,' exponential-decorr cloud overlap for Radiation IOVR=',Model%iovr
elseif (Model%iovr == Model%iovr_exp) then
print *,' exponential cloud overlap for Radiation IOVR=', Model%iovr
elseif (Model%iovr == Model%iovr_exprand) then
print *,' exponential-random cloud overlap for Radiation IOVR=',Model%iovr
else
print *,' max-random cloud overlap for Longwave IOVR_LW=',Model%iovr_lw
print *,' max-random cloud overlap for Radiation IOVR=', Model%iovr
endif
if (Model%isubc_sw == 0) then
print *,' no sub-grid cloud for Shortwave ISUBC_SW=',Model%isubc_sw
Expand All @@ -4646,6 +4666,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
endif
endif

! get_alpha routines for exponential and exponential-random overlap need this(!?!)
if (Model%iovr == Model%iovr_exprand .or. Model%iovr == Model%iovr_exp) then
Model%yearlen = 365
endif

!--- set up cloud schemes and tracer elements
Model%nleffr = -999
Model%nieffr = -999
Expand Down Expand Up @@ -4989,9 +5014,12 @@ subroutine control_print(Model)
print *, ' iems : ', Model%iems
print *, ' iaer : ', Model%iaer
print *, ' icliq_sw : ', Model%icliq_sw
print *, ' iovr_sw : ', Model%iovr_sw
print *, ' iovr_lw : ', Model%iovr_lw
print *, ' icice_sw : ', Model%icice_sw
print *, ' icliq_lw : ', Model%icliq_lw
print *, ' icice_lw : ', Model%icice_lw
print *, ' iovr : ', Model%iovr
print *, ' idcor : ', Model%idcor
print *, ' dcorr_con : ', Model%dcorr_con
print *, ' ictm : ', Model%ictm
print *, ' isubc_sw : ', Model%isubc_sw
print *, ' isubc_lw : ', Model%isubc_lw
Expand Down
90 changes: 81 additions & 9 deletions gfsphysics/GFS_layer/GFS_typedefs.meta
Original file line number Diff line number Diff line change
Expand Up @@ -2545,21 +2545,33 @@
units = flag
dimensions = ()
type = integer
[iovr]
standard_name = flag_for_cloud_overlap_method_for_radiation
long_name = max-random overlap clouds
[icice_sw]
standard_name = flag_for_optical_property_for_ice_clouds_for_shortwave_radiation
long_name = sw optical property for ice clouds
units = flag
dimensions = ()
type = integer
[icliq_lw]
standard_name = flag_for_optical_property_for_liquid_clouds_for_longwave_radiation
long_name = lw optical property for liquid clouds
units = flag
dimensions = ()
type = integer
[iovr_sw]
standard_name = flag_for_cloud_overlap_method_for_shortwave_radiation
long_name = sw: max-random overlap clouds
[icice_lw]
standard_name = flag_for_optical_property_for_ice_clouds_for_longwave_radiation
long_name = lw optical property for ice clouds
units = flag
dimensions = ()
type = integer
[iovr]
standard_name = flag_for_cloud_overlap_method_for_radiation
long_name = flag for cloud overlap method
units = flag
dimensions = ()
type = integer
[iovr_lw]
standard_name = flag_for_cloud_overlap_method_for_longwave_radiation
long_name = lw: max-random overlap clouds
[idcor]
standard_name = flag_for_decorrelation_length_method
long_name = flag for decorrelation length method used in cloud overlap method (iovr)
units = flag
dimensions = ()
type = integer
Expand Down Expand Up @@ -2785,6 +2797,66 @@
units = flag
dimensions = ()
type = integer
[iovr_exp]
standard_name = flag_for_exponential_cloud_overlap_method
long_name = choice of exponential cloud overlap method
units = flag
dimensions = ()
type = integer
[iovr_exprand]
standard_name = flag_for_exponential_random_cloud_overlap_method
long_name = choice of exponential-random cloud overlap method
units = flag
dimensions = ()
type = integer
[iovr_max]
standard_name = flag_for_maximum_cloud_overlap_method
long_name = choice of maximum cloud overlap method
units = flag
dimensions = ()
type = integer
[iovr_rand]
standard_name = flag_for_random_cloud_overlap_method
long_name = choice of random cloud overlap method
units = flag
dimensions = ()
type = integer
[iovr_maxrand]
standard_name = flag_for_maximum_random_cloud_overlap_method
long_name = choice of maximum-random cloud overlap method
units = flag
dimensions = ()
type = integer
[iovr_dcorr]
standard_name = flag_for_decorrelation_length_cloud_overlap_method
long_name = choice of decorrelation-length cloud overlap method
units = flag
dimensions = ()
type = integer
[idcor_con]
standard_name = flag_for_constant_decorrelation_length_method
long_name = choice of decorrelation length computation (costant)
units = flag
dimensions = ()
type = integer
[idcor_hogan]
standard_name = flag_for_hogan_decorrelation_length_method
long_name = choice of decorrelation length computation (hogan)
units = flag
dimensions = ()
type = integer
[idcor_oreopoulos]
standard_name = flag_for_oreopoulos_decorrelation_length_method
long_name = choice of decorrelation length computation (oreopoulos)
units = flag
dimensions = ()
type = integer
[dcorr_con]
standard_name = decorreltion_length_used_by_overlap_method
long_name = decorrelation length (default) used by cloud overlap method (iovr)
units = km
dimensions = ()
type = real
[psautco]
standard_name = coefficient_from_cloud_ice_to_snow
long_name = auto conversion coeff from ice to snow
Expand Down