diff --git a/.gitmodules b/.gitmodules index d253f6966..8e4dd18da 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,12 @@ [submodule "atmos_cubed_sphere"] path = atmos_cubed_sphere - url = https://github.com/NOAA-EMC/GFDL_atmos_cubed_sphere - branch = dev/emc + url = https://github.com/NCAR/GFDL_atmos_cubed_sphere + branch = dtc/develop [submodule "ccpp/framework"] path = ccpp/framework url = https://github.com/NCAR/ccpp-framework - branch = master + branch = dtc/develop [submodule "ccpp/physics"] path = ccpp/physics - url = https://github.com/NCAR/ccpp-physics - branch = master + url = https://github.com/dustinswales/ccpp-physics + branch = dtc/develop diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 000000000..0d5230f89 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,14 @@ +# Lines starting with '#' are comments. +# Each line is a file pattern followed by one or more owners. + +# These owners will be the default owners for everything in the repo. +#* @defunkt +* @climbfuji @llpcarson @grantfirl @JulieSchramm + +# Order is important. The last matching pattern has the most precedence. +# So if a pull request only touches javascript files, only these owners +# will be requested to review. +#*.js @octocat @github/js + +# You can also use email addresses if you prefer. +#docs/* docs@example.com diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py index d30d8d1e7..713a2c863 100755 --- a/ccpp/config/ccpp_prebuild_config.py +++ b/ccpp/config/ccpp_prebuild_config.py @@ -186,6 +186,7 @@ 'FV3/ccpp/physics/physics/rte-rrtmgp/rte/mo_rte_kind.F90', 'FV3/ccpp/physics/physics/rte-rrtmgp/rte/mo_rte_lw.F90', 'FV3/ccpp/physics/physics/rte-rrtmgp/rte/mo_rte_sw.F90', + 'FV3/ccpp/physics/physics/rte-rrtmgp/rte/mo_rte_config.F90', 'FV3/ccpp/physics/physics/rte-rrtmgp/rte/mo_source_functions.F90', 'FV3/ccpp/physics/physics/rte-rrtmgp/rte/kernels/mo_fluxes_broadband_kernels.F90', 'FV3/ccpp/physics/physics/rte-rrtmgp/rte/kernels/mo_optical_props_kernels.F90', @@ -197,7 +198,6 @@ 'FV3/ccpp/physics/physics/rte-rrtmgp/extensions/mo_heating_rates.F90', 'FV3/ccpp/physics/physics/rte-rrtmgp/extensions/mo_rrtmgp_clr_all_sky.F90', 'FV3/ccpp/physics/physics/rte-rrtmgp/extensions/cloud_optics/mo_cloud_optics.F90', - 'FV3/ccpp/physics/physics/rte-rrtmgp/extensions/cloud_optics/mo_cloud_sampling.F90', # derived data type definitions 'FV3/gfsphysics/GFS_layer/GFS_typedefs.F90', 'FV3/gfsphysics/CCPP_layer/CCPP_typedefs.F90', @@ -296,25 +296,28 @@ # for testing the and sections 'FV3/ccpp/physics/physics/GFS_suite_init_finalize_test.F90' : [ 'slow_physics' ], # RRTMGP - 'FV3/ccpp/physics/physics/rrtmg_lw_cloud_optics.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmg_sw_cloud_optics.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_aux.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_lw_gas_optics.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_lw_cloud_optics.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_sw_gas_optics.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_sw_cloud_optics.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_sw_aerosol_optics.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_lw_rte.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_lw_cloud_sampling.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_sw_rte.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_sw_cloud_sampling.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_lw_aerosol_optics.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/GFS_rrtmgp_setup.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/GFS_rrtmgp_pre.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/rrtmgp_lw_pre.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/GFS_rrtmgp_sw_pre.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/GFS_rrtmgp_lw_post.F90' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/GFS_rrtmgp_sw_post.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmg_lw_cloud_optics.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmg_sw_cloud_optics.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/mo_cloud_sampling.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_aux.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_lw_gas_optics.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_lw_cloud_optics.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_sw_gas_optics.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_sw_cloud_optics.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_sw_aerosol_optics.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_lw_rte.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_gfdlmp_lw_cloud_sampling.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_sw_rte.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_gfdlmp_sw_cloud_sampling.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_lw_aerosol_optics.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/GFS_rrtmgp_setup.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/GFS_rrtmgp_pre.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/GFS_rrtmgp_gfdlmp_pre.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/GFS_cloud_diagnostics.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/rrtmgp_lw_pre.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/GFS_rrtmgp_sw_pre.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/GFS_rrtmgp_lw_post.F90' : [ 'slow_physics' ], + 'FV3/ccpp/physics/physics/GFS_rrtmgp_sw_post.F90' : [ 'slow_physics' ], } # Default build dir, relative to current working directory, @@ -358,27 +361,23 @@ 'rrtmgp_sw_rte' : { 'rrtmgp_sw_rte_run' : [ 'components_of_surface_downward_shortwave_fluxes', - 'sw_fluxes_sfc', - 'sw_fluxes_toa', ], }, 'GFS_rrtmgp_sw_post' : { 'GFS_rrtmgp_sw_post_run' : [ + 'tendency_of_air_temperature_due_to_shortwave_heating_assuming_clear_sky_on_radiation_time_step_and_radiation_levels', 'components_of_surface_downward_shortwave_fluxes', - 'sw_fluxes_sfc', - 'sw_fluxes_toa', ], }, 'rrtmgp_lw_rte' : { 'rrtmgp_lw_rte_run' : [ - 'lw_fluxes_sfc', - 'lw_fluxes_toa', + 'RRTMGP_jacobian_of_lw_flux_profile_upward', + 'RRTMGP_jacobian_of_lw_flux_profile_downward', ], - }, + }, 'GFS_rrtmgp_lw_post' : { 'GFS_rrtmgp_lw_post_run' : [ - 'lw_fluxes_sfc', - 'lw_fluxes_toa', + 'tendency_of_air_temperature_due_to_longwave_heating_assuming_clear_sky_on_radiation_time_step_and_radiation_levels', ], }, 'GFS_rrtmgp_post' : { @@ -386,6 +385,12 @@ 'components_of_surface_downward_shortwave_fluxes', ], }, + 'GFS_suite_interstitial_2' : { + 'GFS_suite_interstitial_2_run' : [ + 'RRTMGP_jacobian_of_lw_flux_profile_upward', + 'RRTMGP_lw_flux_profile_upward_allsky', + ], + }, 'rrtmg_sw' : { 'rrtmg_sw_run' : [ 'tendency_of_air_temperature_due_to_shortwave_heating_assuming_clear_sky_on_radiation_time_step_and_radiation_levels', diff --git a/ccpp/framework b/ccpp/framework index d31bdb7ac..a1fe9c109 160000 --- a/ccpp/framework +++ b/ccpp/framework @@ -1 +1 @@ -Subproject commit d31bdb7ac597bc75fb3252cb49edccfce7eb4000 +Subproject commit a1fe9c1091f2122a8e748154a9ce79c3020468fd diff --git a/ccpp/physics b/ccpp/physics index 571ff99bd..e9c11d88e 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 571ff99bdadb418ef978c1ed329023548c3a26ae +Subproject commit e9c11d88e0f72dee5fafd4194b76ecd51ee9d311 diff --git a/ccpp/suites/suite_FV3_GFS_v15p2_RRTMGP.xml b/ccpp/suites/suite_FV3_GFS_v15p2_RRTMGP.xml new file mode 100644 index 000000000..688821f81 --- /dev/null +++ b/ccpp/suites/suite_FV3_GFS_v15p2_RRTMGP.xml @@ -0,0 +1,102 @@ + + + + + + + fv_sat_adj + + + + + GFS_time_vary_pre + GFS_rrtmgp_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + GFS_rrtmgp_pre + GFS_rrtmgp_gfdlmp_pre + GFS_cloud_diagnostics + GFS_rrtmgp_sw_pre + rrtmgp_sw_gas_optics + rrtmgp_sw_aerosol_optics + rrtmgp_sw_cloud_optics + rrtmgp_gfdlmp_sw_cloud_sampling + rrtmgp_sw_rte + GFS_rrtmgp_sw_post + rrtmgp_lw_pre + rrtmgp_lw_gas_optics + rrtmgp_lw_aerosol_optics + rrtmgp_lw_cloud_optics + rrtmgp_gfdlmp_lw_cloud_sampling + rrtmgp_lw_rte + GFS_rrtmgp_lw_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 + 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_GFS_v16beta_RRTMGP.xml b/ccpp/suites/suite_FV3_GFS_v16beta_RRTMGP.xml new file mode 100644 index 000000000..0a0e34227 --- /dev/null +++ b/ccpp/suites/suite_FV3_GFS_v16beta_RRTMGP.xml @@ -0,0 +1,102 @@ + + + + + + + fv_sat_adj + + + + + GFS_time_vary_pre + GFS_rrtmgp_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + GFS_rrtmgp_pre + GFS_rrtmgp_gfdlmp_pre + GFS_cloud_diagnostics + GFS_rrtmgp_sw_pre + rrtmgp_sw_gas_optics + rrtmgp_sw_aerosol_optics + rrtmgp_sw_cloud_optics + rrtmgp_gfdlmp_sw_cloud_sampling + rrtmgp_sw_rte + GFS_rrtmgp_sw_post + rrtmgp_lw_pre + rrtmgp_lw_gas_optics + rrtmgp_lw_aerosol_optics + rrtmgp_lw_cloud_optics + rrtmgp_gfdlmp_lw_cloud_sampling + rrtmgp_lw_rte + GFS_rrtmgp_lw_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 + sfc_diag + sfc_diag_post + GFS_surface_generic_post + GFS_PBL_generic_pre + satmedmfvdifq + 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_GSD_SAR_v1.xml b/ccpp/suites/suite_FV3_GSD_SAR_v1.xml new file mode 100644 index 000000000..ac70ebc1b --- /dev/null +++ b/ccpp/suites/suite_FV3_GSD_SAR_v1.xml @@ -0,0 +1,83 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + GFS_rrtmg_pre + rrtmg_sw_pre + mynnrad_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + mynnrad_post + rrtmg_lw_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 + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + cires_ugwp + cires_ugwp_post + GFS_GWD_generic_post + rayleigh_damp + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_suite_interstitial_4 + GFS_MP_generic_pre + mp_thompson_pre + mp_thompson + mp_thompson_post + GFS_MP_generic_post + maximum_hourly_diagnostics + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_FV3_RRFS_v0.xml b/ccpp/suites/suite_FV3_RRFS_v0.xml new file mode 100644 index 000000000..7a37e9382 --- /dev/null +++ b/ccpp/suites/suite_FV3_RRFS_v0.xml @@ -0,0 +1,83 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + GFS_rrtmg_pre + rrtmg_sw_pre + mynnrad_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + mynnrad_post + rrtmg_lw_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 + noahmpdrv + sfc_sice + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + cires_ugwp + cires_ugwp_post + GFS_GWD_generic_post + rayleigh_damp + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_suite_interstitial_4 + GFS_MP_generic_pre + mp_thompson_pre + mp_thompson + mp_thompson_post + GFS_MP_generic_post + maximum_hourly_diagnostics + + + + + GFS_stochastics + + + + diff --git a/gfsphysics/GFS_layer/GFS_typedefs.F90 b/gfsphysics/GFS_layer/GFS_typedefs.F90 index df37e2562..b5c784aa2 100644 --- a/gfsphysics/GFS_layer/GFS_typedefs.F90 +++ b/gfsphysics/GFS_layer/GFS_typedefs.F90 @@ -670,14 +670,14 @@ module GFS_typedefs character(len=128) :: sw_file_clouds !< RRTMGP file containing coefficients used to compute clouds optical properties integer :: rrtmgp_nBandsSW !< Number of RRTMGP SW bands. integer :: rrtmgp_nGptsSW !< Number of RRTMGP SW spectral points. - integer :: rrtmgp_cld_optics !< Flag to control which RRTMGP routine to compute cloud-optics. - !< = 0 ; Use RRTMG implementation - !< = 1 ; Use RRTMGP (pade) - !< = 2 ; USE RRTMGP (LUT) + logical :: doG_cldoptics !< Use legacy RRTMG cloud-optics? + logical :: doGP_cldoptics_PADE !< Use RRTMGP cloud-optics: PADE approximation? + logical :: doGP_cldoptics_LUT !< Use RRTMGP cloud-optics: LUTs? integer :: rrtmgp_nrghice !< Number of ice-roughness categories integer :: rrtmgp_nGauss_ang !< Number of angles used in Gaussian quadrature logical :: do_GPsw_Glw ! If set to true use rrtmgp for SW calculation, rrtmg for LW. character(len=128) :: active_gases_array(100) !< character array for each trace gas name + logical :: use_LW_jacobian !< If true, use Jacobian of LW to update radiation tendency. #endif !--- microphysical switch integer :: ncld !< choice of cloud scheme @@ -1896,6 +1896,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: tsfc_land(:) => null() !< real (kind=kind_phys), pointer :: tsfc_ocean(:) => null() !< real (kind=kind_phys), pointer :: tsfg(:) => null() !< + real (kind=kind_phys), pointer :: sktp1r(:) => null() !< real (kind=kind_phys), pointer :: tsnow(:) => null() !< real (kind=kind_phys), pointer :: tsurf(:) => null() !< real (kind=kind_phys), pointer :: tsurf_ice(:) => null() !< @@ -1950,6 +1951,9 @@ module GFS_typedefs real (kind=kind_phys), pointer :: t_lay(:,:) => null() !< real (kind=kind_phys), pointer :: relhum(:,:) => null() !< real (kind=kind_phys), pointer :: tv_lay(:,:) => null() !< + real (kind=kind_phys), pointer :: deltaZ(:,:) => null() !< + real (kind=kind_phys), pointer :: cloud_overlap_param(:,:) => null() !< Cloud overlap parameter + real (kind=kind_phys), pointer :: precip_overlap_param(:,:) => null() !< Precipitation overlap parameter real (kind=kind_phys), pointer :: tracer(:,:,:) => null() !< real (kind=kind_phys), pointer :: aerosolslw(:,:,:,:) => null() !< Aerosol radiative properties in each LW band. real (kind=kind_phys), pointer :: aerosolssw(:,:,:,:) => null() !< Aerosol radiative properties in each SW band. @@ -1962,12 +1966,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: cld_resnow(:,:) => null() !< Cloud snow effective radius real (kind=kind_phys), pointer :: cld_rwp(:,:) => null() !< Cloud rain water path real (kind=kind_phys), pointer :: cld_rerain(:,:) => null() !< Cloud rain effective radius - real (kind=kind_phys), pointer :: hsw0(:,:) => null() !< RRTMGP shortwave heating-rate (clear-sky) - real (kind=kind_phys), pointer :: hswc(:,:) => null() !< RRTMGP shortwave heating-rate (all-sky) - real (kind=kind_phys), pointer :: hswb(:,:,:) => null() !< RRTMGP shortwave heating-rate (all-sky), by band - real (kind=kind_phys), pointer :: hlw0(:,:) => null() !< RRTMGP longwave heating-rate (clear-sky) - real (kind=kind_phys), pointer :: hlwc(:,:) => null() !< RRTMGP longwave heating-rate (all-sky) - real (kind=kind_phys), pointer :: hlwb(:,:,:) => null() !< RRTMGP longwave heating-rate (all-sky), by band + real (kind=kind_phys), pointer :: precip_frac(:,:) => null() !< Precipitation fraction real (kind=kind_phys), pointer :: fluxlwUP_allsky(:,:) => null() !< RRTMGP upward longwave all-sky flux profile real (kind=kind_phys), pointer :: fluxlwDOWN_allsky(:,:) => null() !< RRTMGP downward longwave all-sky flux profile real (kind=kind_phys), pointer :: fluxlwUP_clrsky(:,:) => null() !< RRTMGP upward longwave clr-sky flux profile @@ -1976,6 +1975,8 @@ module GFS_typedefs real (kind=kind_phys), pointer :: fluxswDOWN_allsky(:,:) => null() !< RRTMGP downward shortwave all-sky flux profile real (kind=kind_phys), pointer :: fluxswUP_clrsky(:,:) => null() !< RRTMGP upward shortwave clr-sky flux profile real (kind=kind_phys), pointer :: fluxswDOWN_clrsky(:,:) => null() !< RRTMGP downward shortwave clr-sky flux profile + real (kind=kind_phys), pointer :: fluxlwUP_jac(:,:) => null() !< RRTMGP upward Jacobian of longwave flux + real (kind=kind_phys), pointer :: fluxlwDOWN_jac(:,:) => null() !< RRTMGP downward Jacobian of longwave flux real (kind=kind_phys), pointer :: sfc_emiss_byband(:,:) => null() !< real (kind=kind_phys), pointer :: sec_diff_byband(:,:) => null() !< real (kind=kind_phys), pointer :: sfc_alb_nir_dir(:,:) => null() !< @@ -1993,10 +1994,14 @@ module GFS_typedefs type(ty_gas_optics_rrtmgp) :: sw_gas_props !< RRTMGP DDT type(ty_cloud_optics) :: lw_cloud_props !< RRTMGP DDT type(ty_cloud_optics) :: sw_cloud_props !< RRTMGP DDT + type(ty_optical_props_1scl) :: lw_optical_props_precipByBand !< RRTMGP DDT + type(ty_optical_props_1scl) :: lw_optical_props_precip !< RRTMGP DDT type(ty_optical_props_1scl) :: lw_optical_props_cloudsByBand !< RRTMGP DDT type(ty_optical_props_1scl) :: lw_optical_props_clouds !< RRTMGP DDT type(ty_optical_props_1scl) :: lw_optical_props_clrsky !< RRTMGP DDT type(ty_optical_props_1scl) :: lw_optical_props_aerosol !< RRTMGP DDT + type(ty_optical_props_2str) :: sw_optical_props_precipByBand !< RRTMGP DDT + type(ty_optical_props_2str) :: sw_optical_props_precip !< RRTMGP DDT type(ty_optical_props_2str) :: sw_optical_props_cloudsByBand !< RRTMGP DDT type(ty_optical_props_2str) :: sw_optical_props_clouds !< RRTMGP DDT type(ty_optical_props_2str) :: sw_optical_props_clrsky !< RRTMGP DDT @@ -2898,13 +2903,14 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & character(len=128) :: sw_file_clouds = '' !< RRTMGP file containing coefficients used to compute clouds optical properties integer :: rrtmgp_nBandsSW = 14 !< Number of RRTMGP SW bands. integer :: rrtmgp_nGptsSW = 224 !< Number of RRTMGP SW spectral points. - integer :: rrtmgp_cld_optics = 0 !< Flag to control which RRTMGP routine to compute cloud-optics. - !< = 0 ; Use RRTMGP implementation - !< = 1 ; Use RRTMGP (pade) - !< = 2 ; USE RRTMGP (LUT) + logical :: doG_cldoptics = .false. !< Use legacy RRTMG cloud-optics? + logical :: doGP_cldoptics_PADE = .false. !< Use RRTMGP cloud-optics: PADE approximation? + logical :: doGP_cldoptics_LUT = .false. !< Use RRTMGP cloud-optics: LUTs? integer :: rrtmgp_nrghice = 0 !< Number of ice-roughness categories integer :: rrtmgp_nGauss_ang=1 !< Number of angles used in Gaussian quadrature logical :: do_GPsw_Glw = .false. + logical :: use_LW_jacobian = .false. !< Use Jacobian of LW to update LW radiation tendencies. + #endif !--- Z-C microphysical parameters integer :: ncld = 1 !< choice of cloud scheme @@ -3260,8 +3266,9 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & do_RRTMGP, active_gases, nGases, rrtmgp_root, & lw_file_gas, lw_file_clouds, rrtmgp_nBandsLW, rrtmgp_nGptsLW,& sw_file_gas, sw_file_clouds, rrtmgp_nBandsSW, rrtmgp_nGptsSW,& - rrtmgp_cld_optics, rrtmgp_nrghice, rrtmgp_nGauss_ang, & - do_GPsw_Glw, & + doG_cldoptics, doGP_cldoptics_PADE, doGP_cldoptics_LUT, & + rrtmgp_nrghice, rrtmgp_nGauss_ang, do_GPsw_Glw, & + use_LW_jacobian, & #endif ! IN CCN forcing iccn, & @@ -3528,7 +3535,10 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%sw_file_clouds = sw_file_clouds Model%rrtmgp_nBandsSW = rrtmgp_nBandsSW Model%rrtmgp_nGptsSW = rrtmgp_nGptsSW - Model%rrtmgp_cld_optics = RRTMGP_CLD_OPTICS + Model%doG_cldoptics = doG_cldoptics + Model%doGP_cldoptics_PADE = doGP_cldoptics_PADE + Model%doGP_cldoptics_LUT = doGP_cldoptics_LUT + Model%use_LW_jacobian = use_LW_jacobian ! RRTMGP incompatible with levr /= levs if (Model%do_RRTMGP .and. Model%levr /= Model%levs) then write(0,*) "Logic error, RRTMGP only works with levr = levs" @@ -4175,9 +4185,9 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & stop endif - if (Model%lsm == Model%lsm_noahmp .and. Model%iopt_snf == 4) then - if (Model%imp_physics /= Model%imp_physics_gfdl) stop 'iopt_snf == 4 must use GFDL MP' - endif +! if (Model%lsm == Model%lsm_noahmp .and. Model%iopt_snf == 4) then +! if (Model%imp_physics /= Model%imp_physics_gfdl) stop 'iopt_snf == 4 must use GFDL MP' +! endif print *,' nst_anl=',Model%nst_anl,' use_ufo=',Model%use_ufo,' frac_grid=',Model%frac_grid,& ' ignore_lake=',ignore_lake @@ -4670,7 +4680,10 @@ subroutine control_print(Model) print *, ' sw_file_clouds : ', Model%sw_file_clouds print *, ' rrtmgp_nBandsSW : ', Model%rrtmgp_nBandsSW print *, ' rrtmgp_nGptsSW : ', Model%rrtmgp_nGptsSW - print *, ' rrtmgp_cld_optics : ', Model%rrtmgp_cld_optics + print *, ' doG_cldoptics : ', Model%doG_cldoptics + print *, ' doGP_cldoptics_PADE: ', Model%doGP_cldoptics_PADE + print *, ' doGP_cldoptics_LUT : ', Model%doGP_cldoptics_LUT + print *, ' use_LW_jacobian : ', Model%use_LW_jacobian endif #endif print *, ' ' @@ -6135,6 +6148,7 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%tsfc_land (IM)) allocate (Interstitial%tsfc_ocean (IM)) allocate (Interstitial%tsfg (IM)) + allocate (Interstitial%sktp1r (IM)) allocate (Interstitial%tsurf (IM)) allocate (Interstitial%tsurf_ice (IM)) allocate (Interstitial%tsurf_land (IM)) @@ -6166,6 +6180,9 @@ subroutine interstitial_create (Interstitial, IM, Model) if (Model%do_RRTMGP) then allocate (Interstitial%tracer (IM, Model%levs,Model%ntrac)) allocate (Interstitial%tv_lay (IM, Model%levs)) + allocate (Interstitial%deltaZ (IM, Model%levs)) + allocate (Interstitial%cloud_overlap_param (IM, Model%levs)) + allocate (Interstitial%precip_overlap_param (IM, Model%levs)) allocate (Interstitial%relhum (IM, Model%levs)) allocate (Interstitial%p_lev (IM, Model%levs+1)) allocate (Interstitial%p_lay (IM, Model%levs)) @@ -6179,6 +6196,8 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%fluxswDOWN_allsky (IM, Model%levs+1)) allocate (Interstitial%fluxswUP_clrsky (IM, Model%levs+1)) allocate (Interstitial%fluxswDOWN_clrsky (IM, Model%levs+1)) + allocate (Interstitial%fluxlwDOWN_jac (IM, Model%levs+1)) + allocate (Interstitial%fluxlwUP_jac (IM, Model%levs+1)) allocate (Interstitial%aerosolslw (IM, Model%levs, Model%rrtmgp_nBandsLW, NF_AELW)) allocate (Interstitial%aerosolssw (IM, Model%levs, Model%rrtmgp_nBandsSW, NF_AESW)) allocate (Interstitial%cld_frac (IM, Model%levs)) @@ -6190,12 +6209,7 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%cld_resnow (IM, Model%levs)) allocate (Interstitial%cld_rwp (IM, Model%levs)) allocate (Interstitial%cld_rerain (IM, Model%levs)) - allocate (Interstitial%hsw0 (IM, Model%levs)) - allocate (Interstitial%hswc (IM, Model%levs)) - allocate (Interstitial%hswb (IM, Model%levs, Model%rrtmgp_nGptsSW)) - allocate (Interstitial%hlw0 (IM, Model%levs)) - allocate (Interstitial%hlwc (IM, Model%levs)) - allocate (Interstitial%hlwb (IM, Model%levs, Model%rrtmgp_nGptsLW)) + allocate (Interstitial%precip_frac (IM, Model%levs)) allocate (Interstitial%icseed_lw (IM)) allocate (Interstitial%icseed_sw (IM)) allocate (Interstitial%flxprf_lw (IM, Model%levs+1)) @@ -6534,6 +6548,9 @@ subroutine interstitial_rad_reset (Interstitial, Model) if (Model%do_RRTMGP) then Interstitial%tracer = clear_val Interstitial%tv_lay = clear_val + Interstitial%deltaZ = clear_val + Interstitial%cloud_overlap_param = clear_val + Interstitial%precip_overlap_param = clear_val Interstitial%relhum = clear_val Interstitial%p_lev = clear_val Interstitial%p_lay = clear_val @@ -6558,12 +6575,7 @@ subroutine interstitial_rad_reset (Interstitial, Model) Interstitial%cld_resnow = clear_val Interstitial%cld_rwp = clear_val Interstitial%cld_rerain = clear_val - Interstitial%hsw0 = clear_val - Interstitial%hswc = clear_val - Interstitial%hswb = clear_val - Interstitial%hlw0 = clear_val - Interstitial%hlwc = clear_val - Interstitial%hlwb = clear_val + Interstitial%precip_frac = clear_val Interstitial%icseed_lw = clear_val Interstitial%icseed_sw = clear_val Interstitial%sfc_emiss_byband = clear_val diff --git a/gfsphysics/GFS_layer/GFS_typedefs.meta b/gfsphysics/GFS_layer/GFS_typedefs.meta index 4343bdd2e..36fc58448 100644 --- a/gfsphysics/GFS_layer/GFS_typedefs.meta +++ b/gfsphysics/GFS_layer/GFS_typedefs.meta @@ -2326,12 +2326,30 @@ units = count dimensions = () type = integer -[rrtmgp_cld_optics] - standard_name = rrtmgp_cloud_optics_flag - long_name = Flag to control which RRTMGP cloud-optics scheme (Model%rrtmgp_cld_optics) +[doG_cldoptics] + standard_name = flag_to_calc_lw_cld_optics_using_RRTMG + long_name = logical flag to control cloud optics scheme. units = flag - dimensions = () - type = integer + dimensions = () + type = logical +[doGP_cldoptics_PADE] + standard_name = flag_to_calc_lw_cld_optics_using_RRTMGP_PADE + long_name = logical flag to control cloud optics scheme. + units = flag + dimensions = () + type = logical +[doGP_cldoptics_LUT] + standard_name = flag_to_calc_lw_cld_optics_using_RRTMGP_LUT + long_name = logical flag to control cloud optics scheme. + units = flag + dimensions = () + type = logical +[use_LW_jacobian] + standard_name = flag_to_calc_RRTMGP_LW_jacobian + long_name = logical flag to control RRTMGP LW calculation + units = flag + dimensions = () + type = logical [rrtmgp_nrghice] standard_name = number_of_rrtmgp_ice_roughness long_name = number of ice-roughness categories in RRTMGP calculation (Model%rrtmgp_nrghice) @@ -8518,6 +8536,14 @@ type = real kind = kind_phys optional = F +[deltaZ] + standard_name = layer_thickness + long_name = layer_thickness + units = m + dimensions = (horizontal_dimension,vertical_dimension) + type = real + kind = kind_phys + optional = F [tracer] standard_name = chemical_tracers long_name = chemical tracers @@ -8526,54 +8552,22 @@ type = real kind = kind_phys optional = F -[hsw0] - standard_name = RRTMGP_sw_heating_rate_clear_sky - long_name = RRTMGP shortwave clear sky heating rate - units = K s-1 - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys - optional = T -[hswc] - standard_name = RRTMGP_sw_heating_rate_all_sky - long_name = RRTMGP shortwave all sky heating rate - units = K s-1 +[cloud_overlap_param] + standard_name = cloud_overlap_param + long_name = cloud overlap parameter + units = km dimensions = (horizontal_dimension,vertical_dimension) type = real kind = kind_phys optional = F -[hswb] - standard_name = RRTMGP_sw_heating_rate_spectral - long_name = RRTMGP shortwave total sky heating rate (spectral) - units = K s-1 - dimensions = (horizontal_dimension,vertical_dimension,number_of_sw_spectral_points_rrtmgp) - type = real - kind = kind_phys - optional = T -[hlw0] - standard_name = RRTMGP_lw_heating_rate_clear_sky - long_name = RRTMGP longwave clear sky heating rate - units = K s-1 - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys - optional = T -[hlwc] - standard_name = RRTMGP_lw_heating_rate_all_sky - long_name = RRTMGP longwave all sky heating rate - units = K s-1 +[precip_overlap_param] + standard_name = precip_overlap_param + long_name = precipitation overlap parameter + units = km dimensions = (horizontal_dimension,vertical_dimension) type = real kind = kind_phys optional = F -[hlwb] - standard_name = RRTMGP_lw_heating_rate_spectral - long_name = RRTMGP longwave total sky heating rate (spectral) - units = K s-1 - dimensions = (horizontal_dimension,vertical_dimension,number_of_lw_spectral_points_rrtmgp) - type = real - kind = kind_phys - optional = T [ipsdsw0] standard_name = initial_permutation_seed_sw long_name = initial seed for McICA SW @@ -8588,69 +8582,6 @@ dimensions = () type = integer optional = F -[cld_frac] - standard_name = RRTMGP_total_cloud_fraction - long_name = layer total cloud fraction - units = frac - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys -[cld_lwp] - standard_name = RRTMGP_cloud_liquid_water_path - long_name = layer cloud liquid water path - units = g m-2 - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys -[cld_reliq] - standard_name = RRTMGP_mean_effective_radius_for_liquid_cloud - long_name = mean effective radius for liquid cloud - units = micron - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys -[cld_iwp] - standard_name = RRTMGP_cloud_ice_water_path - long_name = layer cloud ice water path - units = g m-2 - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys -[cld_reice] - standard_name = RRTMGP_mean_effective_radius_for_ice_cloud - long_name = mean effective radius for ice cloud - units = micron - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys -[cld_rwp] - standard_name = RRTMGP_cloud_rain_water_path - long_name = cloud rain water path - units = g m-2 - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys -[cld_rerain] - standard_name = RRTMGP_mean_effective_radius_for_rain_drop - long_name = mean effective radius for rain drop - units = micron - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys -[cld_swp] - standard_name = RRTMGP_cloud_snow_water_path - long_name = cloud snow water path - units = g m-2 - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys -[cld_resnow] - standard_name = RRTMGP_mean_effective_radius_for_snow_flake - long_name = mean effective radius for snow flake - units = micron - dimensions = (horizontal_dimension,vertical_dimension) - type = real - kind = kind_phys [cldtausw] standard_name = RRTMGP_cloud_optical_depth_layers_at_0_55mu_band long_name = approx .55mu band layer cloud optical depth @@ -8666,6 +8597,14 @@ dimensions = (horizontal_dimension,vertical_dimension) type = real kind = kind_phys +[precip_frac] + standard_name = precipitation_fraction_by_layer + long_name = precipitation fraction in each layer + units = frac + dimensions = (horizontal_dimension,vertical_dimension) + type = real + kind = kind_phys + optional = F [fluxlwUP_allsky] standard_name = RRTMGP_lw_flux_profile_upward_allsky long_name = RRTMGP upward longwave all-sky flux profile @@ -8682,6 +8621,27 @@ type = real kind = kind_phys optional = F +[sktp1r] + standard_name = surface_skin_temperature_at_previous_time_step + long_name = surface skin temperature at previous time step + units = K + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[fluxlwUP_jac] + standard_name = RRTMGP_jacobian_of_lw_flux_profile_upward + long_name = RRTMGP Jacobian upward longwave flux profile + units = W m-2 K-1 + dimensions = (horizontal_dimension,vertical_dimension_plus_one) + type = real + kind = kind_phys +[fluxlwDOWN_jac] + standard_name = RRTMGP_jacobian_of_lw_flux_profile_downward + long_name = RRTMGP Jacobian downward of longwave flux profile + units = W m-2 K-1 + dimensions = (horizontal_dimension,vertical_dimension_plus_one) + type = real + kind = kind_phys [fluxlwUP_clrsky] standard_name = RRTMGP_lw_flux_profile_upward_clrsky long_name = RRTMGP upward longwave clr-sky flux profile @@ -8911,6 +8871,31 @@ dimensions = () type = ty_optical_props_1scl optional = F +[lw_optical_props_precip] + standard_name = longwave_optical_properties_for_precipitation + long_name = Fortran DDT containing RRTMGP optical properties + units = DDT + dimensions = () + type = ty_optical_props_1scl + optional = F +[lw_optical_props_precipByBand] + standard_name = longwave_optical_properties_for_precipitation_by_band + long_name = Fortran DDT containing RRTMGP optical properties + units = DDT + dimensions = () + type = ty_optical_props_1scl +[sw_optical_props_precipByBand] + standard_name = shortwave_optical_properties_for_precipitation_by_band + long_name = Fortran DDT containing RRTMGP optical properties + units = DDT + dimensions = () + type = ty_optical_props_2str +[sw_optical_props_precip] + standard_name = shortwave_optical_properties_for_precipitation + long_name = Fortran DDT containing RRTMGP optical properties + units = DDT + dimensions = () + type = ty_optical_props_2str [sfc_emiss_byband] standard_name = surface_emissivity_in_each_RRTMGP_LW_band long_name = surface emissivity in each RRTMGP LW band