Skip to content

Commit

Permalink
Infrastructure improvements for radiation (NOAA-GFDL#193)
Browse files Browse the repository at this point in the history
* New metadata for GP scheme.
* Removed redundant importing of kind_phys
* add units to index_for_diagnostic_printout metadata
* Bugfix in GP sampling routines.
  • Loading branch information
dustinswales authored Nov 13, 2020
1 parent 5530a85 commit 3bd9665
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 35 deletions.
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

0 comments on commit 3bd9665

Please sign in to comment.