diff --git a/ccpp/physics b/ccpp/physics index c95a1ae3a..8ef88ca46 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit c95a1ae3a8ce59cb09f9383557688a59d462d103 +Subproject commit 8ef88ca46c11535fc7984d39ec38d1582f9db5ff diff --git a/gfsphysics/GFS_layer/GFS_typedefs.F90 b/gfsphysics/GFS_layer/GFS_typedefs.F90 index 9f0bfeac0..5e5fa3fb2 100644 --- a/gfsphysics/GFS_layer/GFS_typedefs.F90 +++ b/gfsphysics/GFS_layer/GFS_typedefs.F90 @@ -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. @@ -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 @@ -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 @@ -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 @@ -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 @@ -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,& @@ -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 @@ -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 @@ -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 @@ -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 diff --git a/gfsphysics/GFS_layer/GFS_typedefs.meta b/gfsphysics/GFS_layer/GFS_typedefs.meta index 5d7927ca4..ed0f84b69 100644 --- a/gfsphysics/GFS_layer/GFS_typedefs.meta +++ b/gfsphysics/GFS_layer/GFS_typedefs.meta @@ -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 @@ -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