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