diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py
index 6258c4b7a..83b6500bb 100755
--- a/ccpp/config/ccpp_prebuild_config.py
+++ b/ccpp/config/ccpp_prebuild_config.py
@@ -94,6 +94,8 @@
'FV3/ccpp/physics/physics/module_mp_thompson.F90',
'FV3/ccpp/physics/physics/module_mp_thompson_make_number_concentrations.F90',
'FV3/ccpp/physics/physics/module_MP_FER_HIRES.F90',
+ 'FV3/ccpp/physics/physics/HWRF_mersenne_twister.F90',
+ 'FV3/ccpp/physics/physics/HWRF_mcica_random_numbers.F90',
'FV3/ccpp/physics/physics/module_bl_mynn.F90',
'FV3/ccpp/physics/physics/module_sf_mynn.F90',
'FV3/ccpp/physics/physics/module_SF_JSFC.F90',
@@ -218,8 +220,8 @@
'FV3/ccpp/physics/physics/ozphys.f' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/ozphys_2015.f' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/precpd.f' : [ 'slow_physics' ],
- 'FV3/ccpp/physics/physics/radlw_main.f' : [ 'slow_physics' ],
- 'FV3/ccpp/physics/physics/radsw_main.f' : [ 'slow_physics' ],
+ 'FV3/ccpp/physics/physics/radlw_main.F90' : [ 'slow_physics' ],
+ 'FV3/ccpp/physics/physics/radsw_main.F90' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/rascnv.F90' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/rayleigh_damp.f' : [ 'slow_physics' ],
'FV3/ccpp/physics/physics/rrtmg_lw_post.F90' : [ 'slow_physics' ],
diff --git a/ccpp/suites/suite_FV3_GFS_HWRF_RRTMG.xml b/ccpp/suites/suite_FV3_GFS_HWRF_RRTMG.xml
new file mode 100644
index 000000000..4921942f7
--- /dev/null
+++ b/ccpp/suites/suite_FV3_GFS_HWRF_RRTMG.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+ fv_sat_adj
+
+
+
+
+ GFS_time_vary_pre
+ GFS_rrtmg_setup
+ GFS_rad_time_vary
+ GFS_phys_time_vary
+
+
+
+
+ GFS_suite_interstitial_rad_reset
+ GFS_rrtmg_pre
+ rrtmg_lw_pre
+ rrtmg_lw
+ rrtmg_lw_post
+ rrtmg_sw_pre
+ rrtmg_sw
+ rrtmg_sw_post
+ GFS_rrtmg_post
+
+
+
+
+ GFS_suite_interstitial_phys_reset
+ GFS_suite_stateout_reset
+ get_prs_fv3
+ GFS_suite_interstitial_1
+ GFS_surface_generic_pre
+ GFS_surface_composites_pre
+ dcyc2t3
+ GFS_surface_composites_inter
+ GFS_suite_interstitial_2
+
+
+
+ sfc_diff
+ GFS_surface_loop_control_part1
+ sfc_nst_pre
+ sfc_nst
+ sfc_nst_post
+ lsm_noah
+ sfc_sice
+ GFS_surface_loop_control_part2
+
+
+
+ GFS_surface_composites_post
+ dcyc2t3_post
+ sfc_diag
+ sfc_diag_post
+ GFS_surface_generic_post
+ GFS_PBL_generic_pre
+ hedmf
+ GFS_PBL_generic_post
+ GFS_GWD_generic_pre
+ cires_ugwp
+ cires_ugwp_post
+ GFS_GWD_generic_post
+ rayleigh_damp
+ GFS_suite_stateout_update
+ ozphys_2015
+ h2ophys
+ GFS_DCNV_generic_pre
+ get_phi_fv3
+ GFS_suite_interstitial_3
+ samfdeepcnv
+ GFS_DCNV_generic_post
+ GFS_SCNV_generic_pre
+ samfshalcnv
+ GFS_SCNV_generic_post
+ GFS_suite_interstitial_4
+ cnvc90
+ GFS_MP_generic_pre
+ gfdl_cloud_microphys
+ GFS_MP_generic_post
+ maximum_hourly_diagnostics
+
+
+
+
+ GFS_stochastics
+
+
+
+
diff --git a/ccpp/suites/suite_FV3_HAFS_FA_HRRTMG.xml b/ccpp/suites/suite_FV3_HAFS_FA_HRRTMG.xml
new file mode 100644
index 000000000..4eed50c3a
--- /dev/null
+++ b/ccpp/suites/suite_FV3_HAFS_FA_HRRTMG.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+ GFS_time_vary_pre
+ GFS_rrtmg_setup
+ GFS_rad_time_vary
+ GFS_phys_time_vary
+
+
+
+
+ GFS_suite_interstitial_rad_reset
+ GFS_rrtmg_pre
+ rrtmg_lw_pre
+ rrtmg_lw
+ rrtmg_lw_post
+ rrtmg_sw_pre
+ rrtmg_sw
+ rrtmg_sw_post
+ GFS_rrtmg_post
+
+
+
+
+ GFS_suite_interstitial_phys_reset
+ GFS_suite_stateout_reset
+ get_prs_fv3
+ GFS_suite_interstitial_1
+ GFS_surface_generic_pre
+ GFS_surface_composites_pre
+ dcyc2t3
+ GFS_surface_composites_inter
+ GFS_suite_interstitial_2
+
+
+
+ sfc_diff
+ GFS_surface_loop_control_part1
+ sfc_nst_pre
+ sfc_nst
+ sfc_nst_post
+ lsm_noah
+ sfc_sice
+ GFS_surface_loop_control_part2
+
+
+
+ GFS_surface_composites_post
+ dcyc2t3_post
+ sfc_diag
+ sfc_diag_post
+ GFS_surface_generic_post
+ GFS_PBL_generic_pre
+ hedmf
+ GFS_PBL_generic_post
+ GFS_GWD_generic_pre
+ cires_ugwp
+ cires_ugwp_post
+ GFS_GWD_generic_post
+ rayleigh_damp
+ GFS_suite_stateout_update
+ ozphys
+ get_phi_fv3
+ GFS_MP_generic_pre
+ mp_fer_hires
+ GFS_MP_generic_post
+ maximum_hourly_diagnostics
+
+
+
+
+ GFS_stochastics
+
+
+
+
diff --git a/gfsphysics/GFS_layer/GFS_diagnostics.F90 b/gfsphysics/GFS_layer/GFS_diagnostics.F90
index 95f7f51e7..9fa5c754e 100644
--- a/gfsphysics/GFS_layer/GFS_diagnostics.F90
+++ b/gfsphysics/GFS_layer/GFS_diagnostics.F90
@@ -3278,37 +3278,38 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop
!! Cloud effective radii from Microphysics
!if (Model%imp_physics == Model%imp_physics_thompson .or. Model%imp_physics == Model%imp_physics_wsm6) then
- ! idx = idx + 1
- ! ExtDiag(idx)%axes = 3
- ! ExtDiag(idx)%name = 'cleffr'
- ! ExtDiag(idx)%desc = 'effective radius of cloud liquid water particle'
- ! ExtDiag(idx)%unit = 'um'
- ! ExtDiag(idx)%mod_name = 'gfs_phys'
- ! allocate (ExtDiag(idx)%data(nblks))
- ! do nb = 1,nblks
- ! ExtDiag(idx)%data(nb)%var3 => Tbd(nb)%phy_f3d(:,:,Model%nleffr)
- ! enddo
- ! idx = idx + 1
- ! ExtDiag(idx)%axes = 3
- ! ExtDiag(idx)%name = 'cieffr'
- ! ExtDiag(idx)%desc = 'effective radius of stratiform cloud ice particle in um'
- ! ExtDiag(idx)%unit = 'um'
- ! ExtDiag(idx)%mod_name = 'gfs_phys'
- ! allocate (ExtDiag(idx)%data(nblks))
- ! do nb = 1,nblks
- ! ExtDiag(idx)%data(nb)%var3 => Tbd(nb)%phy_f3d(:,:,Model%nieffr)
- ! enddo
- ! idx = idx + 1
- ! ExtDiag(idx)%axes = 3
- ! ExtDiag(idx)%name = 'cseffr'
- ! ExtDiag(idx)%desc = 'effective radius of stratiform cloud snow particle in um'
- ! ExtDiag(idx)%unit = 'um'
- ! ExtDiag(idx)%mod_name = 'gfs_phys'
- ! allocate (ExtDiag(idx)%data(nblks))
- ! do nb = 1,nblks
- ! ExtDiag(idx)%data(nb)%var3 => Tbd(nb)%phy_f3d(:,:,Model%nseffr)
- ! enddo
- !endif
+ if (Model%imp_physics == Model%imp_physics_fer_hires) then
+ idx = idx + 1
+ ExtDiag(idx)%axes = 3
+ ExtDiag(idx)%name = 'cleffr'
+ ExtDiag(idx)%desc = 'effective radius of cloud liquid water particle'
+ ExtDiag(idx)%unit = 'um'
+ ExtDiag(idx)%mod_name = 'gfs_phys'
+ allocate (ExtDiag(idx)%data(nblks))
+ do nb = 1,nblks
+ ExtDiag(idx)%data(nb)%var3 => Tbd(nb)%phy_f3d(:,:,Model%nleffr)
+ enddo
+ idx = idx + 1
+ ExtDiag(idx)%axes = 3
+ ExtDiag(idx)%name = 'cieffr'
+ ExtDiag(idx)%desc = 'effective radius of stratiform cloud ice particle in um'
+ ExtDiag(idx)%unit = 'um'
+ ExtDiag(idx)%mod_name = 'gfs_phys'
+ allocate (ExtDiag(idx)%data(nblks))
+ do nb = 1,nblks
+ ExtDiag(idx)%data(nb)%var3 => Tbd(nb)%phy_f3d(:,:,Model%nieffr)
+ enddo
+ idx = idx + 1
+ ExtDiag(idx)%axes = 3
+ ExtDiag(idx)%name = 'cseffr'
+ ExtDiag(idx)%desc = 'effective radius of stratiform cloud snow particle in um'
+ ExtDiag(idx)%unit = 'um'
+ ExtDiag(idx)%mod_name = 'gfs_phys'
+ allocate (ExtDiag(idx)%data(nblks))
+ do nb = 1,nblks
+ ExtDiag(idx)%data(nb)%var3 => Tbd(nb)%phy_f3d(:,:,Model%nseffr)
+ enddo
+ endif
!MYNN
if (Model%do_mynnedmf) then
diff --git a/gfsphysics/GFS_layer/GFS_typedefs.F90 b/gfsphysics/GFS_layer/GFS_typedefs.F90
index 8250bea53..039ef040e 100644
--- a/gfsphysics/GFS_layer/GFS_typedefs.F90
+++ b/gfsphysics/GFS_layer/GFS_typedefs.F90
@@ -773,6 +773,8 @@ module GFS_typedefs
#ifdef CCPP
real(kind=kind_phys) :: rhgrd !< fer_hires microphysics only
logical :: spec_adv !< flag for individual cloud species advected
+ integer :: icloud !< cloud effect to the optical depth in radiation; this also controls the cloud fraction options
+ !< 3: with cloud effect, and use cloud fraction option 3, based on Sundqvist et al. (1989)
#endif
logical :: do_aw !< AW scale-aware option in cs convection
logical :: do_awdd !< AW scale-aware option in cs convection
@@ -2786,8 +2788,10 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
real(kind=kind_phys) :: avg_max_length = 3600. !< reset value in seconds for max hourly
!--- Ferrier-Aligo microphysical parameters
#ifdef CCPP
- real(kind=kind_phys) :: rhgrd = 0.98 !< fer_hires microphysics only
- logical :: spec_adv = .true. !< Individual cloud species advected
+ real(kind=kind_phys) :: rhgrd = 0.98 !< fer_hires microphysics only
+ logical :: spec_adv = .true. !< Individual cloud species advected
+ integer :: icloud = 0 !< cloud effect to the optical depth in radiation; this also controls the cloud fraction options
+ !< 3: with cloud effect from FA, and use cloud fraction option 3, based on Sundqvist et al. (1989)
#endif
!--- M-G microphysical parameters
integer :: fprcp = 0 !< no prognostic rain and snow (MG)
@@ -3160,7 +3164,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
prslrd0, ral_ts, ldiag_ugwp, do_ugwp, do_tofd, &
! --- Ferrier-Aligo
#ifdef CCPP
- spec_adv, rhgrd, &
+ spec_adv, rhgrd, icloud, &
#endif
!--- mass flux deep convection
clam_deep, c0s_deep, c1_deep, betal_deep, &
@@ -3418,6 +3422,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
#ifdef CCPP
Model%rhgrd = rhgrd
Model%spec_adv = spec_adv
+ Model%icloud = icloud
#endif
!--- gfdl MP parameters
@@ -4122,11 +4127,15 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, &
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
else
print *,' max-random cloud overlap for Longwave IOVR_LW=',Model%iovr_lw
endif
@@ -4509,6 +4518,7 @@ subroutine control_print(Model)
print *, ' Ferrier-Aligo microphysical parameters'
print *, ' spec_adv : ', Model%spec_adv
print *, ' rhgrd : ', Model%rhgrd
+ print *, ' icloud : ', Model%icloud
print *, ' '
endif
#endif
diff --git a/gfsphysics/GFS_layer/GFS_typedefs.meta b/gfsphysics/GFS_layer/GFS_typedefs.meta
index adb24a3fc..724df5152 100644
--- a/gfsphysics/GFS_layer/GFS_typedefs.meta
+++ b/gfsphysics/GFS_layer/GFS_typedefs.meta
@@ -2174,14 +2174,14 @@
dimensions = ()
type = integer
[iovr_sw]
- standard_name = flag_for_max_random_overlap_clouds_for_shortwave_radiation
- long_name = sw: max-random overlap clouds
+ standard_name = flag_for_cloud_overlapping_method_for_shortwave_radiation
+ long_name = control flag for cloud overlapping method for SW
units = flag
dimensions = ()
type = integer
[iovr_lw]
- standard_name = flag_for_max_random_overlap_clouds_for_longwave_radiation
- long_name = lw: max-random overlap clouds
+ standard_name = flag_for_cloud_overlapping_method_for_longwave_radiation
+ long_name = control flag for cloud overlapping method for LW
units = flag
dimensions = ()
type = integer
@@ -2192,14 +2192,14 @@
dimensions = ()
type = integer
[isubc_sw]
- standard_name = flag_for_sw_clouds_without_sub_grid_approximation
- long_name = flag for sw clouds without sub-grid approximation
+ standard_name = flag_for_sw_clouds_grid_approximation
+ long_name = flag for sw clouds sub-grid approximation
units = flag
dimensions = ()
type = integer
[isubc_lw]
- standard_name = flag_for_lw_clouds_without_sub_grid_approximation
- long_name = flag for lw clouds without sub-grid approximation
+ standard_name = flag_for_lw_clouds_sub_grid_approximation
+ long_name = flag for lw clouds sub-grid approximation
units = flag
dimensions = ()
type = integer
@@ -3903,6 +3903,12 @@
dimensions = ()
type = real
kind = kind_phys
+[icloud]
+ standard_name = cloud_effect_to_optical_depth_and_cloud_fraction
+ long_name = cloud effect to the optical depth and cloud fraction in radiation
+ units = flag
+ dimensions = ()
+ type = integer
[gwd_opt]
standard_name = gwd_opt
long_name = flag to choose gwd scheme