diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 00c6e6edb..2d216e975 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -34,4 +34,5 @@ | thomasmelvin | Thomas Melvin | Met Office | 2026-01-15 | | tinyendian | Wolfgang Hayek | Earth Sciences New Zealand | 2026-02-02 | | DanStoneMO | Daniel Stone | Met Office | 2026-02-26 | -| ericaneininger | Erica Neininger | Met Office | 2026-03-02 | \ No newline at end of file +| ericaneininger | Erica Neininger | Met Office | 2026-03-02 | +| MichaelWhitall | Michael Whitall | Met Office | 2026-03-26 | diff --git a/interfaces/physics_schemes_interface/rose-meta/um-cloud/HEAD/rose-meta.conf b/interfaces/physics_schemes_interface/rose-meta/um-cloud/HEAD/rose-meta.conf index ed341bd31..2cdb2322a 100644 --- a/interfaces/physics_schemes_interface/rose-meta/um-cloud/HEAD/rose-meta.conf +++ b/interfaces/physics_schemes_interface/rose-meta/um-cloud/HEAD/rose-meta.conf @@ -399,6 +399,22 @@ ns=namelist/Science/UM Cloud sort-key=Panel-A10 type=logical +[namelist:cloud=l_ensure_max_in_cloud_pc2] +compulsory=true +description=Impose a max limit on in-cloud water contents (liquid and ice) +help=The max allowed in-cloud water content qc/cf is calculated interactively; + =it scales with the mean total-water q+qcl+qcf in the column below + =the current level. It also scales with the cloud-fraction, so that + =the limit is lower at points with very tiny cloud-amounts + =(these points are the ones most likely to have ill-constrained + = in-cloud water content, since the transport scheme applied + = independently to condensate mass and cloud-fraction can create tiny + = inconsistent values of the two near the edges of advected clouds). +!kind=default +ns=namelist/Science/UM Cloud +sort-key=Panel-A09b +type=logical + [namelist:cloud=max_sigmas] compulsory=true description=Max width of bimodal cloud-scheme Gaussian PDFs @@ -569,6 +585,7 @@ trigger=namelist:cloud=mphys_erosion: 'pc2' ; =namelist:cloud=i_bm_ez_opt: 'pc2', 'bimodal' ; =namelist:cloud=l_bm_sigma_s_grad: 'pc2', 'bimodal' ; =namelist:cloud=l_bm_tweaks: 'pc2', 'bimodal' ; + =namelist:cloud=l_ensure_max_in_cloud_pc2: 'pc2' ; =namelist:cloud=max_sigmas: 'pc2', 'bimodal' ; =namelist:cloud=min_sigx_ft: 'pc2', 'bimodal' ; =namelist:cloud=turb_var_fac_bm: 'pc2', 'bimodal' ; diff --git a/interfaces/physics_schemes_interface/rose-meta/um-cloud/versions.py b/interfaces/physics_schemes_interface/rose-meta/um-cloud/versions.py index 01798ad2b..88b7d209b 100644 --- a/interfaces/physics_schemes_interface/rose-meta/um-cloud/versions.py +++ b/interfaces/physics_schemes_interface/rose-meta/um-cloud/versions.py @@ -31,3 +31,17 @@ def upgrade(self, config, meta_config=None): # Add settings return config, self.reports """ + +class vn31_t243(MacroUpgrade): + # Upgrade macro for Issue #243 by Mike Whitall + + BEFORE_TAG = "vn3.1" + AFTER_TAG = "vn3.1_t243" + + def upgrade(self, config, meta_config=None): + # Add settings + + nml = "namelist:cloud" + self.add_setting(config, [nml,"l_ensure_max_in_cloud_pc2"], ".false.") + + return config, self.reports diff --git a/interfaces/physics_schemes_interface/rose-meta/um-microphysics/HEAD/rose-meta.conf b/interfaces/physics_schemes_interface/rose-meta/um-microphysics/HEAD/rose-meta.conf index 0c542ee37..15b5e389d 100644 --- a/interfaces/physics_schemes_interface/rose-meta/um-microphysics/HEAD/rose-meta.conf +++ b/interfaces/physics_schemes_interface/rose-meta/um-microphysics/HEAD/rose-meta.conf @@ -211,6 +211,19 @@ value-titles=Assumed homogenous sub-grid areas, =Assumed sub-grid spatial correlations values='homog','correl' +[namelist:microphysics=l_improve_precfrac_checks] +compulsory=true +description=Improved safety-checks on the prognostic precip fraction +help=a) Variable max limit on the in-rainshaft precip-mass better-targets small + = noise values generated by the advection scheme. + =b) Avoid wrong application of the check where precip-mass is negative + =c) Reset precip-fraction to zero where precip-mass is zero. + =d) Extra call to the checking routine before convection if needed +!kind=default +ns=namelist/Science/UM Microphysics +sort-key=Panel-A01g +type=logical + [namelist:microphysics=l_mcr_precfrac] compulsory=true description=Include prognostic rain/graupel fraction @@ -237,6 +250,7 @@ help=Switch to include a prognostic field for the fraction of the ns=namelist/Science/UM Microphysics sort-key=Panel-A01e trigger=namelist:microphysics=i_update_precfrac: .true. ; + =namelist:microphysics=l_improve_precfrac_checks: .true. ; type=logical [namelist:microphysics=l_proc_fluxes] diff --git a/interfaces/physics_schemes_interface/rose-meta/um-microphysics/versions.py b/interfaces/physics_schemes_interface/rose-meta/um-microphysics/versions.py index 01798ad2b..17e496c6e 100644 --- a/interfaces/physics_schemes_interface/rose-meta/um-microphysics/versions.py +++ b/interfaces/physics_schemes_interface/rose-meta/um-microphysics/versions.py @@ -31,3 +31,17 @@ def upgrade(self, config, meta_config=None): # Add settings return config, self.reports """ + +class vn31_t243(MacroUpgrade): + # Upgrade macro for Issue #243 by Mike Whitall + + BEFORE_TAG = "vn3.1" + AFTER_TAG = "vn3.1_t243" + + def upgrade(self, config, meta_config=None): + # Add settings + + nml = "namelist:microphysics" + self.add_setting(config, [nml,"l_improve_precfrac_checks"], ".false.") + + return config, self.reports diff --git a/interfaces/physics_schemes_interface/source/algorithm/iau/iau_pc2_assimilation_alg_mod.X90 b/interfaces/physics_schemes_interface/source/algorithm/iau/iau_pc2_assimilation_alg_mod.X90 index 79c8fbfc8..f231927ad 100644 --- a/interfaces/physics_schemes_interface/source/algorithm/iau/iau_pc2_assimilation_alg_mod.X90 +++ b/interfaces/physics_schemes_interface/source/algorithm/iau/iau_pc2_assimilation_alg_mod.X90 @@ -33,6 +33,7 @@ module iau_pc2_assimilation_alg_mod !>@param[in,out] cloud_fields Fields for cloud scheme !>@param[in] theta Potential temperature !>@param[in] theta_earlier Copy of potential temperature before incrementing + !>@param[in] exner Exner pressure on w3 space !>@param[in] exner_wth Exner pressure on wtheta space !>@param[in] exner_earlier_wth Copy of exner pressure on wtheta before incrementing !>@param[in] m_v Vapour mass mixing ratio @@ -44,7 +45,7 @@ module iau_pc2_assimilation_alg_mod !>@param[in] m_g Graupel mixing ratio !>@param[in] mg_earlier Copy of graupel mixing ratio before incrementing !>@param[in] dt Timestep length (s) - subroutine iau_pc2_assimilation( exner_wth,exner_earlier_wth, & + subroutine iau_pc2_assimilation( exner, exner_wth,exner_earlier_wth, & theta, theta_earlier, & m_v, mv_earlier , & m_cl, mcl_earlier, & @@ -60,6 +61,7 @@ module iau_pc2_assimilation_alg_mod type( field_collection_type ), intent(inout) :: cloud_fields type( field_type ), intent(inout) :: theta type( field_type ), intent(in) :: theta_earlier + type( field_type ), intent(in) :: exner type( field_type ), intent(in) :: exner_wth type( field_type ), intent(in) :: exner_earlier_wth type( field_type ), intent(inout) :: m_v @@ -167,6 +169,7 @@ module iau_pc2_assimilation_alg_mod bcf, & theta, & exner_wth, & + exner, & ! Responses theta_inc_wth, & mv_inc_wth, & diff --git a/interfaces/physics_schemes_interface/source/algorithm/iau/update_iau_inc_alg_mod.X90 b/interfaces/physics_schemes_interface/source/algorithm/iau/update_iau_inc_alg_mod.X90 index e2b227be6..46b1d6b36 100644 --- a/interfaces/physics_schemes_interface/source/algorithm/iau/update_iau_inc_alg_mod.X90 +++ b/interfaces/physics_schemes_interface/source/algorithm/iau/update_iau_inc_alg_mod.X90 @@ -264,7 +264,7 @@ module update_iau_inc_alg_mod ! PC2 cloud and humidity adjustments if ( iau_pc2 ) then - call iau_pc2_assimilation( exner_wth, exner_earlier_wth, & + call iau_pc2_assimilation( exner, exner_wth, exner_earlier_wth, & theta, theta_earlier, & m_v, mv_earlier , & m_cl, mcl_earlier, & diff --git a/interfaces/physics_schemes_interface/source/algorithm/pc2_checks_alg_mod.x90 b/interfaces/physics_schemes_interface/source/algorithm/pc2_checks_alg_mod.x90 index 3cd40a3ce..4c02397f7 100644 --- a/interfaces/physics_schemes_interface/source/algorithm/pc2_checks_alg_mod.x90 +++ b/interfaces/physics_schemes_interface/source/algorithm/pc2_checks_alg_mod.x90 @@ -29,6 +29,7 @@ contains !> See UMDP30 for full scheme details. !>@param[in] mr Start of timestep mixing ratios !>@param[in] theta Potential temperature (theta) in wth space + !>@param[in] exner Exner pressure on w3 space !>@param[in] derived_fields Group of derived fields !>@param[in] cloud_fields Group of cloud fields !>@param[out] dtheta_pc2_inc Potential temperature response in wth space @@ -41,6 +42,7 @@ contains subroutine pc2_checks_alg( mr, & theta, & + exner, & derived_fields, & cloud_fields, & dtheta_pc2_inc, & @@ -59,8 +61,7 @@ contains implicit none type( field_type ), intent( in ) :: mr ( nummr ) - type( field_type ), intent( in ) :: theta - + type( field_type ), intent( in ) :: theta, exner type( field_collection_type ), intent(in) :: derived_fields, cloud_fields type( field_type ), intent(out) :: dtheta_pc2_inc @@ -108,6 +109,7 @@ contains bulk_fraction, & theta, & exner_in_wth, & + exner, & ! Responses dtheta_pc2_inc, & dmv_pc2_inc, & diff --git a/interfaces/physics_schemes_interface/source/kernel/conv_comorph_kernel_mod.F90 b/interfaces/physics_schemes_interface/source/kernel/conv_comorph_kernel_mod.F90 index ba4cb4bac..45d8ba8bc 100644 --- a/interfaces/physics_schemes_interface/source/kernel/conv_comorph_kernel_mod.F90 +++ b/interfaces/physics_schemes_interface/source/kernel/conv_comorph_kernel_mod.F90 @@ -774,8 +774,8 @@ subroutine conv_comorph_code(nlayers, seg_len, & fldname_n_cor_ins, & fldname_cor_ins_du - use aerosol_config_mod, only: glomap_mode, & - glomap_mode_dust_and_clim, & + use aerosol_config_mod, only: glomap_mode, & + glomap_mode_dust_and_clim, & glomap_mode_ukca use log_mod, only : log_event, log_scratch_space, LOG_LEVEL_ERROR @@ -785,13 +785,15 @@ subroutine conv_comorph_code(nlayers, seg_len, & ! UM modules containing switches or global constants !--------------------------------------- use bl_option_mod, only: max_tke - use cloud_inputs_mod, only: l_pc2_homog_conv_pressure - use cv_run_mod, only: l_mom, & - l_conv_prog_dtheta, l_conv_prog_dq, & + use cloud_inputs_mod, only: l_pc2_homog_conv_pressure, & + l_cloud_call_b4_conv, & + l_ensure_max_in_cloud_pc2 + use cv_run_mod, only: l_mom, & + l_conv_prog_dtheta, l_conv_prog_dq, & tau_conv_prog_dtheta, tau_conv_prog_dq use jules_surface_mod, only: srf_ex_cnv_gust, IP_SrfExWithCnv - use mphys_inputs_mod, only: l_mcr_qgraup, l_mcr_qrain, l_mcr_precfrac, & - l_mcr_qcf2 + use mphys_inputs_mod, only: l_mcr_qgraup, l_mcr_qrain, l_mcr_qcf2, & + l_mcr_precfrac, l_improve_precfrac_checks use nlsizes_namelist_mod, only: row_length, rows, bl_levels use planet_constants_mod, only: p_zero, kappa, planet_radius, g use timestep_mod, only: timestep @@ -2008,28 +2010,28 @@ subroutine conv_comorph_code(nlayers, seg_len, & end do end do + do i = 1, row_length + do k = 1, nlayers + precfrac_star(i,1,k) = precfrac(map_wth(1,i)+k) + end do + end do + ! The "latest" (_star) fields used by convection are values ! interpolated to departure points by SL advection. ! The interpolation is not guaranteed to preserve consistency ! between the cloud fraction and cloud water fields. ! However, various things can go wrong within CoMorph if they - ! are inconsistent; especially the routine calc_env_partitions, - ! which attempts to calculate the internal properties of - ! the in-cloud and clear sub-regions of the grid-box. - ! E.g. a common problem is if qcf is large but CFF is small, - ! the in-cloud qcf can get implausibly large, which can - ! cause the phase-change calculations to yield nonsense. + ! are inconsistent. ! Therefore, apply safety checks to the cloud-fractions ! before passing them into convection... - do i = 1, row_length - do k = 1, nlayers - precfrac_star(i,1,k) = precfrac(map_wth(1,i)+k) - end do - end do - CALL fracs_consistency ( qcl_conv, qcf_conv, qcf2_conv, & + if ( ( .not. (l_cloud_call_b4_conv .and. l_ensure_max_in_cloud_pc2) ) .or. & + ( l_mcr_precfrac .and. ( .not. l_improve_precfrac_checks ) ) ) then + ! Don't need to do this if similar checks already switched on elsewhere + CALL fracs_consistency( qcl_conv, qcf_conv, qcf2_conv, & qrain_conv, qgraup_conv, & cf_liquid_conv, cf_frozen_conv, bulk_cf_conv, & precfrac_star ) + end if ! Note: if not using PC2, the cloud-fraction _star fields do exist ! but are just set to values after slow_physics diff --git a/interfaces/physics_schemes_interface/source/kernel/lsp_precfrac_checks_kernel_mod.F90 b/interfaces/physics_schemes_interface/source/kernel/lsp_precfrac_checks_kernel_mod.F90 new file mode 100644 index 000000000..92af839e5 --- /dev/null +++ b/interfaces/physics_schemes_interface/source/kernel/lsp_precfrac_checks_kernel_mod.F90 @@ -0,0 +1,149 @@ +!------------------------------------------------------------------------------ +! (c) Crown copyright 2019 Met Office. All rights reserved. +! The file LICENCE, distributed with this code, contains details of the terms +! under which the code may be used. +!------------------------------------------------------------------------------ +!> @brief Interface to prognostic precip fraction checks routine + +module lsp_precfrac_checks_kernel_mod + +use argument_mod, only: arg_type, & + GH_FIELD, GH_REAL, & + GH_READ, GH_WRITE, & + CELL_COLUMN +use fs_continuity_mod, only: WTHETA, W3 +use kernel_mod, only: kernel_type + +implicit none + +private + +!------------------------------------------------------------------------------ +! Public types +!------------------------------------------------------------------------------ +!> The type declaration for the kernel. +!> Contains the metadata needed by the Psy layer + +type, public, extends(kernel_type) :: lsp_precfrac_checks_kernel_type + private + type(arg_type) :: meta_args(8) = (/ & + arg_type(GH_FIELD, GH_REAL, GH_READ, W3), & ! exner_w3 + arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! mv_wth + arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! ml_wth + arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! mi_wth + arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! ms_wth + arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! mr_wth + arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! mg_wth + arg_type(GH_FIELD, GH_REAL, GH_WRITE, WTHETA) & ! precfrac_wth + /) + integer :: operates_on = CELL_COLUMN +contains + procedure, nopass :: lsp_precfrac_checks_code +end type + +public :: lsp_precfrac_checks_code + +contains + +!> @brief Interface to prognostic precip fraction checks routine +!> @details Performs sanity-checks on the prognostic fractional coverage of +!> falling rain and graupel. Ensure the in-precip-shaft precip +!> concentration ( m_rain [+m_graupel] )/precfrac +!> has a plausible value, and ensure 0 <= precfrac <= 1. +!> @param[in] nlayers Number of layers +!> @param[in] exner_w3 Exner pressure in w3 space +!> @param[in] mv_wth Vapour mass mixing ratio +!> @param[in] ml_wth Liquid cloud mass mixing ratio +!> @param[in] mi_wth Ice cloud mass mixing ratio +!> @param[in] ms_wth Snow mass mixing ratio +!> @param[in] mr_wth Rain mass mixing ratio +!> @param[in] mg_wth Graupel mass mixing ratio +!> @param[in,out] precfrac_wth Prognostic precip fraction +!> @param[in] ndf_w3 Degrees of freedom per cell; w3 space +!> @param[in] undf_w3 Unique of degrees of freedom; w3 space +!> @param[in] map_w3 Dofmap celofl at column base; w3 space +!> @param[in] ndf_wth Degrees of freedom per cell; wth space +!> @param[in] undf_wth Unique of degrees of freedom; wth space +!> @param[in] map_wth Dofmap celofl at column base; wth space + +subroutine lsp_precfrac_checks_code( nlayers, & + exner_w3, & + mv_wth, ml_wth, mi_wth, & + ms_wth, mr_wth, mg_wth, & + precfrac_wth, & + ndf_w3, undf_w3, map_w3, & + ndf_wth, undf_wth, map_wth ) + + use constants_mod, only: r_def, i_def, r_um, i_um + + ! UM modules + use nlsizes_namelist_mod, only: row_length, rows, model_levels + use atm_fields_bounds_mod, only: pdims + use planet_constants_mod, only: p_zero, kappa + use lsp_precfrac_checks_mod, only: lsp_precfrac_checks + + implicit none + + ! Arguments + + integer(kind=i_def), intent(in) :: ndf_w3 + integer(kind=i_def), intent(in) :: undf_w3 + integer(kind=i_def), intent(in), dimension(ndf_w3) :: map_w3 + integer(kind=i_def), intent(in) :: ndf_wth + integer(kind=i_def), intent(in) :: undf_wth + integer(kind=i_def), intent(in), dimension(ndf_wth) :: map_wth + + integer(kind=i_def), intent(in) :: nlayers + + real(kind=r_def), intent(in), dimension(undf_w3) :: exner_w3 + real(kind=r_def), intent(in), dimension(undf_wth) :: mv_wth + real(kind=r_def), intent(in), dimension(undf_wth) :: ml_wth + real(kind=r_def), intent(in), dimension(undf_wth) :: mi_wth + real(kind=r_def), intent(in), dimension(undf_wth) :: ms_wth + real(kind=r_def), intent(in), dimension(undf_wth) :: mr_wth + real(kind=r_def), intent(in), dimension(undf_wth) :: mg_wth + real(kind=r_def), intent(inout), dimension(undf_wth) :: precfrac_wth + + ! Arguments converted to r_um precision for input to lsp_precfrac_checks + real(r_um), dimension(row_length,rows,model_levels) :: & + p_rho_levels, q, qcl, qcf, qcf2, qrain, qgraup, precfrac + + ! Loop counter + integer(i_um) :: k + + + ! Copy / convert fields for input to lsp_precfrac_checks + do k = 1, nlayers + + ! Pressure at layer boundaries + p_rho_levels(1,1,k) = p_zero * real( exner_w3(map_w3(1)+k-1), r_um ) & + **(1.0_r_um/kappa) + + ! Water species masses + q(1,1,k) = real( mv_wth(map_wth(1)+k), r_um ) + qcl(1,1,k) = real( ml_wth(map_wth(1)+k), r_um ) + qcf2(1,1,k) = real( mi_wth(map_wth(1)+k), r_um ) + qcf(1,1,k) = real( ms_wth(map_wth(1)+k), r_um ) + qrain(1,1,k) = real( mr_wth(map_wth(1)+k), r_um ) + qgraup(1,1,k) = real( mg_wth(map_wth(1)+k), r_um ) + + ! Input value of prognostic precip fraction + precfrac(1,1,k) = real( precfrac_wth(map_wth(1)+k), r_um ) + + end do + + ! Call the checking routine + CALL lsp_precfrac_checks( pdims, p_rho_levels, & + q, qcl, qcf, qcf2, qrain, qgraup, & + precfrac ) + + ! Recast back to LFRic space + do k = 1, nlayers + ! Updated value of prognostic precip fraction + precfrac_wth(map_wth(1)+k) = real( precfrac(1,1,k), r_def ) + end do + precfrac_wth(map_wth(1)+0) = precfrac_wth(map_wth(1)+1) + +end subroutine lsp_precfrac_checks_code + +end module lsp_precfrac_checks_kernel_mod diff --git a/interfaces/physics_schemes_interface/source/kernel/pc2_checks_kernel_mod.F90 b/interfaces/physics_schemes_interface/source/kernel/pc2_checks_kernel_mod.F90 index 0024375ff..8a04a6554 100644 --- a/interfaces/physics_schemes_interface/source/kernel/pc2_checks_kernel_mod.F90 +++ b/interfaces/physics_schemes_interface/source/kernel/pc2_checks_kernel_mod.F90 @@ -11,7 +11,7 @@ module pc2_checks_kernel_mod GH_FIELD, GH_REAL, & GH_READ, GH_WRITE, & CELL_COLUMN -use fs_continuity_mod, only: WTHETA +use fs_continuity_mod, only: WTHETA, W3 use kernel_mod, only: kernel_type implicit none @@ -25,7 +25,7 @@ module pc2_checks_kernel_mod type, public, extends(kernel_type) :: pc2_checks_kernel_type private - type(arg_type) :: meta_args(17) = (/ & + type(arg_type) :: meta_args(18) = (/ & arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! mv_wth arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! ml_wth arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! mi_wth @@ -35,6 +35,7 @@ module pc2_checks_kernel_mod arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! bcf_wth arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! theta_wth arg_type(GH_FIELD, GH_REAL, GH_READ, WTHETA), & ! exner_wth + arg_type(GH_FIELD, GH_REAL, GH_READ, W3), & ! exner_w3 arg_type(GH_FIELD, GH_REAL, GH_WRITE, WTHETA), & ! dtheta_response arg_type(GH_FIELD, GH_REAL, GH_WRITE, WTHETA), & ! dmv_response_wth arg_type(GH_FIELD, GH_REAL, GH_WRITE, WTHETA), & ! dmcl_response_wth @@ -68,6 +69,7 @@ module pc2_checks_kernel_mod !> @param[in] bcf_wth Bulk cloud fraction !> @param[in] theta_wth Potential temperature field !> @param[in] exner_wth Exner pressure in potential temperature space +!> @param[in] exner_w3 Exner pressure in w3 space !> @param[in,out] dtheta_response_wth Change in theta !> @param[in,out] dmv_response_wth Change in water vapour !> @param[in,out] dmcl_response_wth Change in liquid water content @@ -82,6 +84,13 @@ module pc2_checks_kernel_mod !! for potential temperature space !> @param[in] map_wth Dofmap for the cell at the base of the column !! for potential temperature space +!> @param[in] ndf_w3 Number of degrees of freedom per cell +!! for density space +!> @param[in] undf_w3 Number unique of degrees of freedom +!! for density space +!> @param[in] map_w3 Dofmap for the cell at the base of the +!! column for density space + subroutine pc2_checks_code( nlayers, & ! Atm fields @@ -94,6 +103,7 @@ subroutine pc2_checks_code( nlayers, & bcf_wth, & theta_wth, & exner_wth, & + exner_w3, & ! Responses dtheta_response_wth, & dmv_response_wth, & @@ -104,7 +114,8 @@ subroutine pc2_checks_code( nlayers, & dcff_response_wth, & dbcf_response_wth, & ! Other - ndf_wth, undf_wth, map_wth ) + ndf_wth, undf_wth, map_wth, & + ndf_w3, undf_w3, map_w3 ) use constants_mod, only: r_def, i_def, r_um, i_um @@ -125,8 +136,8 @@ subroutine pc2_checks_code( nlayers, & ! Arguments integer(kind=i_def), intent(in) :: nlayers - integer(kind=i_def), intent(in) :: ndf_wth - integer(kind=i_def), intent(in) :: undf_wth + integer(kind=i_def), intent(in) :: ndf_wth, ndf_w3 + integer(kind=i_def), intent(in) :: undf_wth, undf_w3 real(kind=r_def), intent(in), dimension(undf_wth) :: mv_wth real(kind=r_def), intent(in), dimension(undf_wth) :: ml_wth @@ -137,8 +148,10 @@ subroutine pc2_checks_code( nlayers, & real(kind=r_def), intent(in), dimension(undf_wth) :: cff_wth real(kind=r_def), intent(in), dimension(undf_wth) :: theta_wth real(kind=r_def), intent(in), dimension(undf_wth) :: exner_wth + real(kind=r_def), intent(in), dimension(undf_w3) :: exner_w3 integer(kind=i_def), intent(in), dimension(ndf_wth) :: map_wth + integer(kind=i_def), intent(in), dimension(ndf_w3) :: map_w3 ! The changes to the fields as a result real(kind=r_def), intent(inout), dimension(undf_wth) :: dtheta_response_wth @@ -153,7 +166,8 @@ subroutine pc2_checks_code( nlayers, & real(r_um), dimension(row_length,rows,model_levels) :: & qv_work, qcl_work, qcf_work, & cfl_work, cff_work, bcf_work, & - t_work, theta_work, pressure, qcf2_work + t_work, theta_work, qcf2_work, & + p_theta_levels, p_rho_levels integer(i_um) :: k @@ -168,13 +182,16 @@ subroutine pc2_checks_code( nlayers, & ! Initialisation of prognostic variables and arrays !----------------------------------------------------------------------- - do k = 1, model_levels + do k = 1, nlayers t_work(1,1,k) = theta_wth(map_wth(1) + k) * & exner_wth(map_wth(1) + k) ! Pressure at centre of theta levels - pressure(1,1,k) = p_zero*(exner_wth(map_wth(1) + k)) & + p_theta_levels(1,1,k) = p_zero*(exner_wth(map_wth(1) + k)) & + **(1.0_r_um/kappa) + ! pressure at layer boundaries + p_rho_levels(1,1,k) = p_zero*(exner_w3(map_w3(1) + k-1)) & **(1.0_r_um/kappa) ! Moist prognostics @@ -190,7 +207,7 @@ subroutine pc2_checks_code( nlayers, & end do - call pc2_checks( pressure, & + call pc2_checks( p_theta_levels, p_rho_levels, & t_work, bcf_work, cfl_work, cff_work, & qv_work, qcl_work, qcf_work, l_mr_physics,& row_length, rows, model_levels, & @@ -198,7 +215,7 @@ subroutine pc2_checks_code( nlayers, & wtrac) ! Recast back to LFRic space - do k = 1, model_levels + do k = 1, nlayers ! *_work arrays have been updated ! New theta found from new temperature. diff --git a/interfaces/physics_schemes_interface/source/support/um_physics_init_mod.f90 b/interfaces/physics_schemes_interface/source/support/um_physics_init_mod.f90 index b1ca9c1fe..eb55883cb 100644 --- a/interfaces/physics_schemes_interface/source/support/um_physics_init_mod.f90 +++ b/interfaces/physics_schemes_interface/source/support/um_physics_init_mod.f90 @@ -99,6 +99,9 @@ module um_physics_init_mod falliceshear_method_constant, & falliceshear_method_off, & subgrid_qv, ice_width_in => ice_width,& + cloud_call_b4_conv, & + l_ensure_max_in_cloud_pc2_in & + => l_ensure_max_in_cloud_pc2, & i_pc2_erosion_numerics_in & => i_pc2_erosion_numerics, & dbsdtbs_turb_0_in => dbsdtbs_turb_0, & @@ -161,6 +164,8 @@ module um_physics_init_mod cic_input_in => cic_input, & c_r_correl_in => c_r_correl, & l_proc_fluxes_in => l_proc_fluxes, & + l_improve_precfrac_checks_in & + => l_improve_precfrac_checks, & l_mcr_precfrac_in => l_mcr_precfrac, & i_update_precfrac_in => i_update_precfrac,& i_update_precfrac_homog, & @@ -348,14 +353,14 @@ subroutine um_physics_init() rhcrit, ice_fraction_method,falliceshear_method, cff_spread_rate, & l_subgrid_qv, ice_width, min_liq_overlap, i_eacf, not_mixph, & i_pc2_checks_cld_frac_method, l_ensure_min_in_cloud_qcf, & - i_pc2_init_logic, dbsdtbs_turb_0, & + l_ensure_max_in_cloud_pc2, i_pc2_init_logic, dbsdtbs_turb_0, & i_pc2_erosion_method, i_pc2_homog_g_method, i_pc2_init_method, & check_run_cloud, i_pc2_erosion_numerics, & cloud_pc2_tol, cloud_pc2_tol_2, & forced_cu_fac, i_pc2_conv_coupling, allicetdegc, starticetkelvin, & ent_coef_bm, ez_max_bm, i_bm_ez_opt, l_bm_sigma_s_grad, & l_bm_tweaks, max_sigmas, min_sigx_ft, turb_var_fac_bm, & - l_pc2_homog_conv_pressure, & + l_pc2_homog_conv_pressure, l_cloud_call_b4_conv, & i_bm_ez_orig, i_bm_ez_subcrit, i_bm_ez_entpar use cloud_config_mod, only: cld_fsd_hill use comorph_um_namelist_mod, only: ass_min_radius, autoc_opt, & @@ -435,7 +440,8 @@ subroutine um_physics_init() l_mcr_qgraup, casim_max_sed_length, fixed_number, wvarfac, & l_orograin, l_orogrime, l_orograin_block, & fcrit, nsigmasf, nscalesf, l_progn_tnuc, mp_czero, mp_tau_lim, & - l_proc_fluxes, l_subgrid_graupel_frac, l_mcr_precfrac, & + l_proc_fluxes, l_improve_precfrac_checks, l_subgrid_graupel_frac, & + l_mcr_precfrac, & i_update_precfrac, i_homog_areas, i_sg_correl, heavy_rain_evap_fac use mphys_psd_mod, only: x1g, x2g, x4g, x1gl, x2gl, x4gl use mphys_switches, only: set_mphys_switches, & @@ -1074,6 +1080,8 @@ subroutine um_physics_init() i_bm_ez_opt = i_bm_ez_entpar END SELECT + l_cloud_call_b4_conv = cloud_call_b4_conv + ! Used by radiation to determine convective cloud, so potentially needed ! with any cloud scheme allicetdegc = -20.0_r_um @@ -1105,6 +1113,7 @@ subroutine um_physics_init() i_pc2_conv_coupling = 3 i_pc2_erosion_method = pc2eros_hybrid_sidesonly l_ensure_min_in_cloud_qcf = .false. + l_ensure_max_in_cloud_pc2 = l_ensure_max_in_cloud_pc2_in select case(pc2_init_logic) case(pc2_init_logic_original) i_pc2_init_logic = pc2init_logic_original @@ -1246,6 +1255,8 @@ subroutine um_physics_init() case ( i_update_precfrac_correl ) i_update_precfrac = i_sg_correl end select + ! Switch for extra checks on precip fraction + l_improve_precfrac_checks = l_improve_precfrac_checks_in end if select case (graupel_scheme) diff --git a/rose-stem/app/lfric_atm/opt/rose-app-comorph_dev.conf b/rose-stem/app/lfric_atm/opt/rose-app-comorph_dev.conf index 660928785..773da902f 100644 --- a/rose-stem/app/lfric_atm/opt/rose-app-comorph_dev.conf +++ b/rose-stem/app/lfric_atm/opt/rose-app-comorph_dev.conf @@ -22,6 +22,7 @@ i_bm_ez_opt='entpar' i_pc2_erosion_numerics='analytic' l_bm_sigma_s_grad=.true. l_bm_tweaks=.true. +l_ensure_max_in_cloud_pc2=.true. max_sigmas=2.0 min_sigx_ft=0.15 pc2_init_logic='smooth' @@ -50,6 +51,7 @@ cic_input=1.23e3 graupel_scheme='modified' heavy_rain_evap_fac=2.5e7 i_update_precfrac='correl' +l_improve_precfrac_checks=.true. l_mcr_precfrac=.true. l_proc_fluxes=.true. diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_clim_gal9_chem-C12_azspice_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_clim_gal9_chem-C12_azspice_gnu_fast-debug-32bit.txt index 0920e465c..924c5e73e 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_clim_gal9_chem-C12_azspice_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_clim_gal9_chem-C12_azspice_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D66653 -Inner product checksum theta = 518E9990 -Inner product checksum u = 6AF43E1A -Inner product checksum mr1 = 3FD1D04B -Inner product checksum mr2 = 3745B69A -Inner product checksum mr3 = 353019A0 -Inner product checksum mr4 = 36BDF494 +Inner product checksum rho = 46D6664F +Inner product checksum theta = 518E9BAC +Inner product checksum u = 6AF38E74 +Inner product checksum mr1 = 3FD1C648 +Inner product checksum mr2 = 373968FE +Inner product checksum mr3 = 3559FB30 +Inner product checksum mr4 = 36CD91F8 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_casim-C12_azspice_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_casim-C12_azspice_gnu_fast-debug-32bit.txt index 77784af5b..eb91c2c48 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_casim-C12_azspice_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_casim-C12_azspice_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D8578E -Inner product checksum theta = 518BD702 -Inner product checksum u = 6A8A9FF5 -Inner product checksum mr1 = 3FCD79BE -Inner product checksum mr2 = 38309A00 -Inner product checksum mr3 = 353B5ACC -Inner product checksum mr4 = 36D670E9 -Inner product checksum mr5 = 2E296A8A -Inner product checksum mr6 = 3534119C +Inner product checksum rho = 46D8583F +Inner product checksum theta = 518BD8F9 +Inner product checksum u = 6A8B1E21 +Inner product checksum mr1 = 3FCD076C +Inner product checksum mr2 = 3826B15F +Inner product checksum mr3 = 358616E1 +Inner product checksum mr4 = 36D7E4D3 +Inner product checksum mr5 = 2E9D5993 +Inner product checksum mr6 = 353320CB diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_coma9-C12_azspice_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_coma9-C12_azspice_gnu_fast-debug-32bit.txt index fba375852..286e5196e 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_coma9-C12_azspice_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_coma9-C12_azspice_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D8451F -Inner product checksum theta = 518BD5CF -Inner product checksum u = 6A871C80 -Inner product checksum mr1 = 3FCF8CE1 -Inner product checksum mr2 = 37E92CD1 -Inner product checksum mr3 = 378E0B27 -Inner product checksum mr4 = 378C60AF -Inner product checksum mr5 = 369846E2 +Inner product checksum rho = 46D84A00 +Inner product checksum theta = 518BDE99 +Inner product checksum u = 6A870ADF +Inner product checksum mr1 = 3FCFBDF8 +Inner product checksum mr2 = 37DC1FBD +Inner product checksum mr3 = 379D78C5 +Inner product checksum mr4 = 3792C608 +Inner product checksum mr5 = 36962782 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9-C48_MG_azspice_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9-C48_MG_azspice_gnu_fast-debug-32bit.txt index 10d9b44ca..170392212 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9-C48_MG_azspice_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9-C48_MG_azspice_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D7FCF3 -Inner product checksum theta = 5392A6CA -Inner product checksum u = 6A97B62D -Inner product checksum mr1 = 41CD09D2 -Inner product checksum mr2 = 39C5EB06 -Inner product checksum mr3 = 37B3A951 -Inner product checksum mr4 = 395FCEA4 +Inner product checksum rho = 48D7FD07 +Inner product checksum theta = 5392A6C7 +Inner product checksum u = 6A97BBE1 +Inner product checksum mr1 = 41CD0962 +Inner product checksum mr2 = 39CC2E4F +Inner product checksum mr3 = 37B33934 +Inner product checksum mr4 = 395DCD09 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_coarse_aero-C48_MG_azspice_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_coarse_aero-C48_MG_azspice_gnu_fast-debug-32bit.txt index fe9f49f4c..22bca2fa8 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_coarse_aero-C48_MG_azspice_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_coarse_aero-C48_MG_azspice_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D7FDA1 -Inner product checksum theta = 5392A6E1 -Inner product checksum u = 6A97B426 -Inner product checksum mr1 = 41CD1068 -Inner product checksum mr2 = 39CDCF8E -Inner product checksum mr3 = 37B22A3E -Inner product checksum mr4 = 3960D144 +Inner product checksum rho = 48D7FDB1 +Inner product checksum theta = 5392A6DB +Inner product checksum u = 6A97BB43 +Inner product checksum mr1 = 41CD0E1C +Inner product checksum mr2 = 39CEE5DE +Inner product checksum mr3 = 37AC3072 +Inner product checksum mr4 = 395D6E02 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_debug-C48_MG_azspice_gnu_full-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_debug-C48_MG_azspice_gnu_full-debug-32bit.txt index 95689700c..d09f26df3 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_debug-C48_MG_azspice_gnu_full-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_debug-C48_MG_azspice_gnu_full-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D81494 +Inner product checksum rho = 48D81496 Inner product checksum theta = 53952668 -Inner product checksum u = 6AA4D6DC -Inner product checksum mr1 = 41C8318B -Inner product checksum mr2 = 3999AAE7 -Inner product checksum mr3 = 3778FB0C -Inner product checksum mr4 = 39305110 +Inner product checksum u = 6AA4D6E4 +Inner product checksum mr1 = 41C8317C +Inner product checksum mr2 = 3999DFDC +Inner product checksum mr3 = 377BCCF8 +Inner product checksum mr4 = 3930682A Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_eda-C12_azspice_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_eda-C12_azspice_gnu_fast-debug-32bit.txt index 0d92b82da..26854fd0c 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_eda-C12_azspice_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_eda-C12_azspice_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D8193D -Inner product checksum theta = 518BAFDA -Inner product checksum u = 6A8CB83F -Inner product checksum mr1 = 3FD1216C -Inner product checksum mr2 = 37EA1582 -Inner product checksum mr3 = 35979016 -Inner product checksum mr4 = 36F53919 +Inner product checksum rho = 46D819D6 +Inner product checksum theta = 518BB128 +Inner product checksum u = 6A8CE019 +Inner product checksum mr1 = 3FD0FF90 +Inner product checksum mr2 = 37EC4CAC +Inner product checksum mr3 = 35A7AA8C +Inner product checksum mr4 = 3706B82D Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_eda_jada-C12_azspice_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_eda_jada-C12_azspice_gnu_fast-debug-32bit.txt index c009453d0..3ce6ab52f 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_eda_jada-C12_azspice_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_gal9_eda_jada-C12_azspice_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D81432 -Inner product checksum theta = 518BD0DB -Inner product checksum u = 6A88AA11 -Inner product checksum mr1 = 3FD40165 -Inner product checksum mr2 = 37D52121 -Inner product checksum mr3 = 35A5B57C -Inner product checksum mr4 = 36D99E7A +Inner product checksum rho = 46D81174 +Inner product checksum theta = 518BD32F +Inner product checksum u = 6A883AE0 +Inner product checksum mr1 = 3FD3C7D3 +Inner product checksum mr2 = 37DDCD3B +Inner product checksum mr3 = 35A9CFE5 +Inner product checksum mr4 = 370D16A0 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_coma9_toga-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_coma9_toga-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt index 9e5fe63b7..0bf391c5a 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_coma9_toga-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_coma9_toga-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ Inner product checksum rho = 42F50044 -Inner product checksum theta = 4E044D1A -Inner product checksum u = 5FBD689A -Inner product checksum mr1 = 3CDAE952 -Inner product checksum mr2 = 3464C7F6 -Inner product checksum mr3 = 3198450A -Inner product checksum mr4 = 2EF57FE6 +Inner product checksum theta = 4E04492E +Inner product checksum u = 5FB93DC7 +Inner product checksum mr1 = 3CE04336 +Inner product checksum mr2 = 34C87990 +Inner product checksum mr3 = 2FEE0D80 +Inner product checksum mr4 = 2F0845E9 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_comorph_dev_bomex-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_comorph_dev_bomex-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt index 05fd6514b..0d28c696d 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_comorph_dev_bomex-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_comorph_dev_bomex-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ Inner product checksum rho = 42F8B1D8 -Inner product checksum theta = 4D84DAFD -Inner product checksum u = 601AD40F -Inner product checksum mr1 = 3C825A8B -Inner product checksum mr2 = 33EB5DE2 -Inner product checksum mr3 = 317D3117 +Inner product checksum theta = 4D84DAD5 +Inner product checksum u = 601AD416 +Inner product checksum mr1 = 3C8299D3 +Inner product checksum mr2 = 33C20664 +Inner product checksum mr3 = 3190C1DF Inner product checksum mr4 = 0 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_comorph_dev_toga-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_comorph_dev_toga-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt index 9f49c2720..be1e04029 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_comorph_dev_toga-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_scm_comorph_dev_toga-BiP2x2-50000x50000_azspice_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ Inner product checksum rho = 42F50044 -Inner product checksum theta = 4E044E7D -Inner product checksum u = 5FD4B116 -Inner product checksum mr1 = 3CCA582B -Inner product checksum mr2 = 33C805E1 -Inner product checksum mr3 = 30364C90 -Inner product checksum mr4 = 2F0E3313 +Inner product checksum theta = 4E044F6A +Inner product checksum u = 5FDA0621 +Inner product checksum mr1 = 3CCA2A54 +Inner product checksum mr2 = 333E5ADE +Inner product checksum mr3 = 3011680A +Inner product checksum mr4 = 2EE9C3C7 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt index 935dab390..fffbbb4c6 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D65C71 -Inner product checksum theta = 5399FF3C -Inner product checksum u = 6B12FB2B -Inner product checksum mr1 = 41CC3802 -Inner product checksum mr2 = 3967ECD4 -Inner product checksum mr3 = 37C2B69E -Inner product checksum mr4 = 3941B53E +Inner product checksum rho = 48D65C72 +Inner product checksum theta = 5399FF3B +Inner product checksum u = 6B12FBC5 +Inner product checksum mr1 = 41CC371F +Inner product checksum mr2 = 3965F8A2 +Inner product checksum mr3 = 37C07854 +Inner product checksum mr4 = 39418E68 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt index 5f9dc4d3a..6fe5d9a64 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D65C63 -Inner product checksum theta = 5399FF3D -Inner product checksum u = 6B12FB74 -Inner product checksum mr1 = 41CC353D -Inner product checksum mr2 = 3961D6B7 -Inner product checksum mr3 = 37C2B434 -Inner product checksum mr4 = 39414ED7 +Inner product checksum rho = 48D65C65 +Inner product checksum theta = 5399FF3C +Inner product checksum u = 6B12FC00 +Inner product checksum mr1 = 41CC350D +Inner product checksum mr2 = 3962B7A8 +Inner product checksum mr3 = 37C0BC56 +Inner product checksum mr4 = 394186EF Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt index 86e53b19c..d22de1212 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_clim_gal9_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D65C66 -Inner product checksum theta = 5399FF39 -Inner product checksum u = 6B12FCF8 -Inner product checksum mr1 = 41CC350C -Inner product checksum mr2 = 39652046 -Inner product checksum mr3 = 37C39FEA -Inner product checksum mr4 = 394124EC +Inner product checksum rho = 48D65C64 +Inner product checksum theta = 5399FF38 +Inner product checksum u = 6B12FC2A +Inner product checksum mr1 = 41CC3377 +Inner product checksum mr2 = 396591BE +Inner product checksum mr3 = 37C68CC8 +Inner product checksum mr4 = 3941C653 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_casim-C12_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_casim-C12_ex1a_cce_fast-debug-32bit.txt index b2f8542fb..645a172e1 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_casim-C12_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_casim-C12_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D85C1E -Inner product checksum theta = 518BD68E -Inner product checksum u = 6A8AB4A2 -Inner product checksum mr1 = 3FCD6B98 -Inner product checksum mr2 = 3834A23C -Inner product checksum mr3 = 35462D21 -Inner product checksum mr4 = 36C2FB8E -Inner product checksum mr5 = 2E9A3459 -Inner product checksum mr6 = 355C98F6 +Inner product checksum rho = 46D857DA +Inner product checksum theta = 518BD56C +Inner product checksum u = 6A8ACAEE +Inner product checksum mr1 = 3FCD12D8 +Inner product checksum mr2 = 383D371C +Inner product checksum mr3 = 356C38FE +Inner product checksum mr4 = 36B70D94 +Inner product checksum mr5 = 2E37B0B8 +Inner product checksum mr6 = 3528CC68 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_coma9-C12_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_coma9-C12_ex1a_cce_fast-debug-32bit.txt index 8d6f364b6..852b75075 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_coma9-C12_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_coma9-C12_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D8450A -Inner product checksum theta = 518BD8F0 -Inner product checksum u = 6A87D5CF -Inner product checksum mr1 = 3FCF848A -Inner product checksum mr2 = 37EF578A -Inner product checksum mr3 = 37A268D4 -Inner product checksum mr4 = 37A12861 -Inner product checksum mr5 = 36AF6891 +Inner product checksum rho = 46D8491C +Inner product checksum theta = 518BDA18 +Inner product checksum u = 6A875D74 +Inner product checksum mr1 = 3FD037AA +Inner product checksum mr2 = 37E45EEA +Inner product checksum mr3 = 37A49128 +Inner product checksum mr4 = 3799249C +Inner product checksum mr5 = 36C549BC Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_comorph_dev-C12_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_comorph_dev-C12_ex1a_cce_fast-debug-32bit.txt index 528c8a616..5ffff47fe 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_comorph_dev-C12_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_comorph_dev-C12_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D832D6 -Inner product checksum theta = 518BE1F6 -Inner product checksum u = 6A86BC76 -Inner product checksum mr1 = 3FD120E6 -Inner product checksum mr2 = 37FAD7AC -Inner product checksum mr3 = 376811C0 -Inner product checksum mr4 = 37BFF8BC -Inner product checksum mr5 = 3697AF6E +Inner product checksum rho = 46D834C9 +Inner product checksum theta = 518BE164 +Inner product checksum u = 6A866B2C +Inner product checksum mr1 = 3FD13488 +Inner product checksum mr2 = 37EB3E86 +Inner product checksum mr3 = 378081FF +Inner product checksum mr4 = 37BDE8A8 +Inner product checksum mr5 = 36A76308 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_comorph_tb-C12_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_comorph_tb-C12_ex1a_cce_fast-debug-32bit.txt index c17987500..5998a6348 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_comorph_tb-C12_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_comorph_tb-C12_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D8528E -Inner product checksum theta = 518BDFC0 -Inner product checksum u = 6A84BE51 -Inner product checksum mr1 = 3FCE1718 -Inner product checksum mr2 = 37F0E036 -Inner product checksum mr3 = 37746CB5 -Inner product checksum mr4 = 375B7784 -Inner product checksum mr5 = 35F5451D +Inner product checksum rho = 46D8566A +Inner product checksum theta = 518BE072 +Inner product checksum u = 6A854AA7 +Inner product checksum mr1 = 3FCE8FC1 +Inner product checksum mr2 = 37E5AD28 +Inner product checksum mr3 = 3798AB00 +Inner product checksum mr4 = 37658838 +Inner product checksum mr5 = 35FDB4A2 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt index 1e17cfead..35e510cc5 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 40DB0770E3192095 -Inner product checksum theta = 42317AE3AD158CC4 -Inner product checksum u = 455118036F27A992 -Inner product checksum mr1 = 3FF9FB92A4B6D4E0 -Inner product checksum mr2 = 3EFA9528278A8038 -Inner product checksum mr3 = 3EB5BDCF89E24FCD -Inner product checksum mr4 = 3EE810E99B341094 +Inner product checksum rho = 40DB073C6A935A0D +Inner product checksum theta = 42317B1D5525D632 +Inner product checksum u = 45511BA08AD540CC +Inner product checksum mr1 = 3FF9FF82BCEADE50 +Inner product checksum mr2 = 3EF8FA146C56E38F +Inner product checksum mr3 = 3EB70D07F77CA232 +Inner product checksum mr4 = 3EE15CECED48546C Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9-C48_MG_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9-C48_MG_ex1a_cce_fast-debug-32bit.txt index 5caec27d7..7f6e4fe31 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9-C48_MG_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9-C48_MG_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D7FDC2 -Inner product checksum theta = 5392A6CA -Inner product checksum u = 6A97C06C -Inner product checksum mr1 = 41CCFFD6 -Inner product checksum mr2 = 39CB289D -Inner product checksum mr3 = 37B0138E -Inner product checksum mr4 = 3962555F +Inner product checksum rho = 48D7FDFF +Inner product checksum theta = 5392A6A7 +Inner product checksum u = 6A97C269 +Inner product checksum mr1 = 41CD0CA6 +Inner product checksum mr2 = 39CA4B57 +Inner product checksum mr3 = 37B03F99 +Inner product checksum mr4 = 39629386 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt index 5caec27d7..7f6e4fe31 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D7FDC2 -Inner product checksum theta = 5392A6CA -Inner product checksum u = 6A97C06C -Inner product checksum mr1 = 41CCFFD6 -Inner product checksum mr2 = 39CB289D -Inner product checksum mr3 = 37B0138E -Inner product checksum mr4 = 3962555F +Inner product checksum rho = 48D7FDFF +Inner product checksum theta = 5392A6A7 +Inner product checksum u = 6A97C269 +Inner product checksum mr1 = 41CD0CA6 +Inner product checksum mr2 = 39CA4B57 +Inner product checksum mr3 = 37B03F99 +Inner product checksum mr4 = 39629386 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt index 64f8b7725..d05607865 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D7FE02 -Inner product checksum theta = 5392A6B8 -Inner product checksum u = 6A97C654 -Inner product checksum mr1 = 41CD029C -Inner product checksum mr2 = 39CE5000 -Inner product checksum mr3 = 37ACA3FB -Inner product checksum mr4 = 396055DE +Inner product checksum rho = 48D7FDFF +Inner product checksum theta = 5392A698 +Inner product checksum u = 6A97C6EA +Inner product checksum mr1 = 41CD0712 +Inner product checksum mr2 = 39CAFF56 +Inner product checksum mr3 = 37B2E244 +Inner product checksum mr4 = 395D3AD2 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_2T-C48_MG_ex1a_cce_full-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_2T-C48_MG_ex1a_cce_full-debug-32bit.txt index f9df60826..f5dbb0ae2 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_2T-C48_MG_ex1a_cce_full-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_2T-C48_MG_ex1a_cce_full-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D7FCFF -Inner product checksum theta = 5392A6F0 -Inner product checksum u = 6A97B7D3 -Inner product checksum mr1 = 41CD0DDA -Inner product checksum mr2 = 39CD2EE0 -Inner product checksum mr3 = 37B6DDF3 -Inner product checksum mr4 = 3963190E +Inner product checksum rho = 48D7FD10 +Inner product checksum theta = 5392A6D8 +Inner product checksum u = 6A97B83C +Inner product checksum mr1 = 41CD0458 +Inner product checksum mr2 = 39CC4F60 +Inner product checksum mr3 = 37B54182 +Inner product checksum mr4 = 3962BD3A Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt index f05ae48b9..fe0532d62 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D7FDF2 -Inner product checksum theta = 5392A6C1 -Inner product checksum u = 6A97C07E -Inner product checksum mr1 = 41CD05C2 -Inner product checksum mr2 = 39C9FA29 -Inner product checksum mr3 = 37B66B12 -Inner product checksum mr4 = 39605796 +Inner product checksum rho = 48D7FDF3 +Inner product checksum theta = 5392A6B2 +Inner product checksum u = 6A97C85C +Inner product checksum mr1 = 41CD0441 +Inner product checksum mr2 = 39CD5116 +Inner product checksum mr3 = 37AC1640 +Inner product checksum mr4 = 395FDBC7 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero-C48_MG_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero-C48_MG_ex1a_cce_fast-debug-32bit.txt index 7d15a5c26..5dd3887b6 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero-C48_MG_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero-C48_MG_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D7FE88 -Inner product checksum theta = 5392A6C2 -Inner product checksum u = 6A97BFB9 -Inner product checksum mr1 = 41CD0697 -Inner product checksum mr2 = 39C8DC60 -Inner product checksum mr3 = 37B00779 -Inner product checksum mr4 = 395B6E15 +Inner product checksum rho = 48D7FEDC +Inner product checksum theta = 5392A6DA +Inner product checksum u = 6A97BF7C +Inner product checksum mr1 = 41CD0852 +Inner product checksum mr2 = 39CBE3F6 +Inner product checksum mr3 = 37B117E0 +Inner product checksum mr4 = 39623BA6 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero_threaded-C48_MG_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero_threaded-C48_MG_ex1a_cce_fast-debug-32bit.txt index bbc606f94..b5f821a0a 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero_threaded-C48_MG_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero_threaded-C48_MG_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D7FC63 -Inner product checksum theta = 5392A688 -Inner product checksum u = 6A97C7E2 -Inner product checksum mr1 = 41CCE1BA -Inner product checksum mr2 = 39CC1EA5 -Inner product checksum mr3 = 37B52B9E -Inner product checksum mr4 = 3971E51F +Inner product checksum rho = 48D7FC3E +Inner product checksum theta = 5392A67E +Inner product checksum u = 6A97C1AD +Inner product checksum mr1 = 41CCDE39 +Inner product checksum mr2 = 39CA936C +Inner product checksum mr3 = 37AC458A +Inner product checksum mr4 = 39702A67 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero_threaded-C48_MG_ex1a_gnu_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero_threaded-C48_MG_ex1a_gnu_fast-debug-32bit.txt index 6fbce5e9f..bed876bee 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero_threaded-C48_MG_ex1a_gnu_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_coarse_aero_threaded-C48_MG_ex1a_gnu_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D7FB44 -Inner product checksum theta = 5392A6B6 -Inner product checksum u = 6A97B404 -Inner product checksum mr1 = 41CCE89F -Inner product checksum mr2 = 39CC1B52 -Inner product checksum mr3 = 37AE1DF8 -Inner product checksum mr4 = 397813E2 +Inner product checksum rho = 48D7FB5A +Inner product checksum theta = 5392A6C4 +Inner product checksum u = 6A97B625 +Inner product checksum mr1 = 41CCE43F +Inner product checksum mr2 = 39CDF614 +Inner product checksum mr3 = 37B14178 +Inner product checksum mr4 = 3971B938 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_debug-C48_MG_ex1a_cce_full-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_debug-C48_MG_ex1a_cce_full-debug-32bit.txt index 4b358888f..e1aef793a 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_debug-C48_MG_ex1a_cce_full-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_debug-C48_MG_ex1a_cce_full-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 48D81494 +Inner product checksum rho = 48D81495 Inner product checksum theta = 53952667 -Inner product checksum u = 6AA4D6DD -Inner product checksum mr1 = 41C83143 -Inner product checksum mr2 = 399A84AB -Inner product checksum mr3 = 377973DB -Inner product checksum mr4 = 3930117B +Inner product checksum u = 6AA4D6E0 +Inner product checksum mr1 = 41C83150 +Inner product checksum mr2 = 399AB5B0 +Inner product checksum mr3 = 377C1713 +Inner product checksum mr4 = 39302C17 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_eda-C12_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_eda-C12_ex1a_cce_fast-debug-32bit.txt index 7a5e3cff4..f99a51386 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_eda-C12_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_eda-C12_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D818B8 -Inner product checksum theta = 518BB117 -Inner product checksum u = 6A8D23A8 -Inner product checksum mr1 = 3FD1137A -Inner product checksum mr2 = 37DB360D -Inner product checksum mr3 = 35A031F6 -Inner product checksum mr4 = 370B3EBC +Inner product checksum rho = 46D818EE +Inner product checksum theta = 518BAF66 +Inner product checksum u = 6A8DA562 +Inner product checksum mr1 = 3FD1418C +Inner product checksum mr2 = 37DF2730 +Inner product checksum mr3 = 3597B59A +Inner product checksum mr4 = 36EAE896 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_mol-C12_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_mol-C12_ex1a_cce_fast-debug-32bit.txt index 440c859d0..f523ebca0 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_mol-C12_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_nwp_gal9_mol-C12_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 46D85DEA -Inner product checksum theta = 5193AF22 -Inner product checksum u = 6A865782 -Inner product checksum mr1 = 3FD05C10 -Inner product checksum mr2 = 37AECC7C -Inner product checksum mr3 = 35555AD4 -Inner product checksum mr4 = 36CEE5C2 +Inner product checksum rho = 46D85F53 +Inner product checksum theta = 5193AF07 +Inner product checksum u = 6A85C2A3 +Inner product checksum mr1 = 3FD02DEC +Inner product checksum mr2 = 37AB2996 +Inner product checksum mr3 = 354F828B +Inner product checksum mr4 = 370FAD22 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_coma9_toga-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_coma9_toga-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt index d5bf03e15..3971404b1 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_coma9_toga-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_coma9_toga-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ Inner product checksum rho = 42F50046 -Inner product checksum theta = 4E044C03 -Inner product checksum u = 5FBFF00A -Inner product checksum mr1 = 3CE0BFD7 -Inner product checksum mr2 = 348932BD -Inner product checksum mr3 = 31279BBD -Inner product checksum mr4 = 2EEB9616 +Inner product checksum theta = 4E044BA2 +Inner product checksum u = 5FBCF5F1 +Inner product checksum mr1 = 3CDD10BA +Inner product checksum mr2 = 346ED7F6 +Inner product checksum mr3 = 2F457DFD +Inner product checksum mr4 = 2EF4970D Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_comorph_dev_bomex-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_comorph_dev_bomex-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt index 0adc19059..573448daf 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_comorph_dev_bomex-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_comorph_dev_bomex-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ Inner product checksum rho = 42F8B1D6 -Inner product checksum theta = 4D84DAEF -Inner product checksum u = 601AD41A -Inner product checksum mr1 = 3C829C2B -Inner product checksum mr2 = 3407BDD6 -Inner product checksum mr3 = 314F5B36 +Inner product checksum theta = 4D84DAD5 +Inner product checksum u = 601AD43A +Inner product checksum mr1 = 3C82B38C +Inner product checksum mr2 = 340A8C07 +Inner product checksum mr3 = 318E31E9 Inner product checksum mr4 = 0 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_comorph_dev_toga-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_comorph_dev_toga-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt index 528031ecb..fd8d640dd 100644 --- a/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_comorph_dev_toga-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt +++ b/rose-stem/site/meto/kgos/lfric_atm/ex1a/checksum_lfric_atm_scm_comorph_dev_toga-BiP2x2-50000x50000_ex1a_cce_fast-debug-32bit.txt @@ -1,9 +1,9 @@ Inner product checksum rho = 42F50046 -Inner product checksum theta = 4E044E4C -Inner product checksum u = 5FDD4323 -Inner product checksum mr1 = 3CC7B2CE -Inner product checksum mr2 = 331179D2 -Inner product checksum mr3 = 2FF24AD6 -Inner product checksum mr4 = 2F26E792 +Inner product checksum theta = 4E044DF6 +Inner product checksum u = 5FD8D1EC +Inner product checksum mr1 = 3CC9BFD2 +Inner product checksum mr2 = 340CF3E9 +Inner product checksum mr3 = 30C68FC6 +Inner product checksum mr4 = 2F07FC10 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/lfric_coupled/ex1a/checksum_lfric_coupled_nwp_gal9-C48_ex1a_cce_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/lfric_coupled/ex1a/checksum_lfric_coupled_nwp_gal9-C48_ex1a_cce_fast-debug-64bit.txt index c3d509995..e7a6fd649 100644 --- a/rose-stem/site/meto/kgos/lfric_coupled/ex1a/checksum_lfric_coupled_nwp_gal9-C48_ex1a_cce_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/lfric_coupled/ex1a/checksum_lfric_coupled_nwp_gal9-C48_ex1a_cce_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 411B5407F4CE40FD -Inner product checksum theta = 42735B1EDCE5682D -Inner product checksum u = 456F41EDCEE58D54 -Inner product checksum mr1 = 4036855990B99604 -Inner product checksum mr2 = 3F4021291625C39B -Inner product checksum mr3 = 3F00980BB1AF46A0 -Inner product checksum mr4 = 3F368688EE9DBAD2 +Inner product checksum rho = 411B540E326FF4C2 +Inner product checksum theta = 42735B1B06F23386 +Inner product checksum u = 456F4255BFE30275 +Inner product checksum mr1 = 4036848E97FDEC51 +Inner product checksum mr2 = 3F401A637BE6BCBA +Inner product checksum mr3 = 3F00B8550ED8EF58 +Inner product checksum mr4 = 3F367C81C9617D6E Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/science/gungho/source/algorithm/physics/fast_physics_alg_mod.X90 b/science/gungho/source/algorithm/physics/fast_physics_alg_mod.X90 index 851921548..3a1695316 100644 --- a/science/gungho/source/algorithm/physics/fast_physics_alg_mod.X90 +++ b/science/gungho/source/algorithm/physics/fast_physics_alg_mod.X90 @@ -45,6 +45,8 @@ module fast_physics_alg_mod cv_scheme_gregory_rowntree, & cv_scheme_comorph use cloud_config_mod, only: scheme, scheme_pc2, cloud_call_b4_conv + use microphysics_config_mod, & + only: l_mcr_precfrac, l_improve_precfrac_checks use stochastic_physics_config_mod, & only: blpert_type, blpert_type_off use planet_config_mod, only: p_zero, cp, Rd @@ -55,7 +57,8 @@ module fast_physics_alg_mod only: clone_bundle use field_collection_mod, only: field_collection_type ! Moisture species - use mr_indices_mod, only: nummr, imr_v, imr_cl + use mr_indices_mod, only: nummr, imr_v, imr_cl, imr_ci, & + imr_s, imr_r, imr_g use sci_enforce_lower_bound_kernel_mod, & only: enforce_lower_bound_kernel_type use moisture_conservation_alg_mod, & @@ -68,6 +71,7 @@ module fast_physics_alg_mod only: evap_condense_kernel_type #ifdef UM_PHYSICS use cld_alg_mod, only: cld_alg + use lsp_precfrac_checks_kernel_mod, only: lsp_precfrac_checks_kernel_type ! UM BL scheme use bl_imp_alg_mod, only: bl_imp_alg ! UM conv scheme @@ -186,6 +190,7 @@ contains type( field_type ), pointer :: dmv_stph => null() type( field_type ), pointer :: departure_exner_wth + type( field_type ), pointer :: precfrac => null() #endif type( field_type), pointer :: theta_star => null() type( field_type), pointer :: u_star => null() @@ -242,6 +247,19 @@ contains call invoke( setval_X(departure_exner_wth,exner_in_wth) ) end if + ! Optional sanity-checks on the prognostic precip fraction after advection + if ( l_mcr_precfrac .and. l_improve_precfrac_checks ) then + call microphysics_fields%get_field('precfrac', precfrac) + call invoke( lsp_precfrac_checks_kernel_type( exner, & + mr(imr_v), & + mr(imr_cl), & + mr(imr_ci), & + mr(imr_s), & + mr(imr_r), & + mr(imr_g), & + precfrac ) ) + end if + !-------------------------------------------------------------------- ! UM convection scheme !-------------------------------------------------------------------- diff --git a/science/gungho/source/algorithm/physics/slow_physics_alg_mod.X90 b/science/gungho/source/algorithm/physics/slow_physics_alg_mod.X90 index f6523d797..bb2939314 100644 --- a/science/gungho/source/algorithm/physics/slow_physics_alg_mod.X90 +++ b/science/gungho/source/algorithm/physics/slow_physics_alg_mod.X90 @@ -1138,6 +1138,7 @@ contains inc_X_plus_Y(theta_updated,dtheta) ) call pc2_checks_alg( mr, & ! Current state IN theta_updated, & ! Current state IN + exner, & ! Current state IN derived_fields, & ! Current state IN cloud_fields, & ! Current state IN dtheta_pc2_checks, & ! Increments OUT diff --git a/science/gungho/source/algorithm/timestepping/semi_implicit_timestep_alg_mod.X90 b/science/gungho/source/algorithm/timestepping/semi_implicit_timestep_alg_mod.X90 index eb7dc2d09..225a4f4b3 100644 --- a/science/gungho/source/algorithm/timestepping/semi_implicit_timestep_alg_mod.X90 +++ b/science/gungho/source/algorithm/timestepping/semi_implicit_timestep_alg_mod.X90 @@ -129,7 +129,8 @@ module semi_implicit_timestep_alg_mod use map_physics_fields_alg_mod, only: map_physics_fields_alg ! Moisture species - use mr_indices_mod, only: nummr + use mr_indices_mod, only: nummr, imr_v, imr_cl, imr_ci, & + imr_s, imr_r, imr_g use moist_dyn_mod, only: num_moist_factors, gas_law ! Field indices @@ -143,6 +144,7 @@ module semi_implicit_timestep_alg_mod use cld_alg_mod, only: cld_alg use aerosol_ukca_alg_mod, only: aerosol_ukca_alg use casim_activate_alg_mod, only: casim_activate_alg + use lsp_precfrac_checks_kernel_mod, only: lsp_precfrac_checks_kernel_type #endif use cld_incs_mod, only: cld_incs_init, cld_incs_output @@ -629,6 +631,10 @@ contains type(field_type), pointer :: ageofair +#ifdef UM_PHYSICS + type(field_type), pointer :: precfrac +#endif + type(operator_type), pointer :: mm_wt type(operator_type), pointer :: mm_vel @@ -659,6 +665,7 @@ contains character(str_def) :: prime_mesh_name integer(i_def) :: lbc_option logical(l_def) :: microphysics_casim + logical(l_def) :: l_mcr_precfrac logical(l_def) :: murk_lbc real(r_def) :: tau_r integer(tik) :: id @@ -684,7 +691,10 @@ contains if (lbc_option == lbc_option_um2lfric_file .or. & (use_physics .and. cloud == cloud_um)) then microphysics_nml => modeldb%configuration%get_namelist('microphysics') - call microphysics_nml%get_value( 'microphysics_casim', microphysics_casim ) + call microphysics_nml%get_value( 'microphysics_casim', & + microphysics_casim ) + call microphysics_nml%get_value( 'l_mcr_precfrac', & + l_mcr_precfrac ) end if if (element_order_h == 0 .and. element_order_v == 0) then @@ -1092,6 +1102,7 @@ contains ! ---------------------------------------------------------------------- #ifdef UM_PHYSICS if (use_physics .and. cloud == cloud_um ) then + call cld_alg( self%dtheta_cld, mr, & self%state(igh_t), self%state(igh_p), self%state(igh_d), & derived_fields, turbulence_fields, & @@ -1099,11 +1110,25 @@ contains self%state_n(igh_t), self%mr_n, & model_clock%get_step(), cast_dt, .false. ) call invoke(inc_X_plus_Y(self%state(igh_t), self%dtheta_cld)) + + if (l_mcr_precfrac) then + call microphysics_fields%get_field('precfrac', precfrac) + call invoke( lsp_precfrac_checks_kernel_type( exner, & + mr(imr_v), & + mr(imr_cl), & + mr(imr_ci), & + mr(imr_s), & + mr(imr_r), & + mr(imr_g), & + precfrac ) ) + end if + if (microphysics_casim) then call casim_activate_alg( self%state(igh_t), mr, derived_fields, & cloud_fields, microphysics_fields, & convection_fields, initialise=.false. ) end if ! microphysics_casim + end if #endif diff --git a/science/physics_schemes/source/convection/comorph/interface/um/fracs_consistency.F90 b/science/physics_schemes/source/convection/comorph/interface/um/fracs_consistency.F90 index e47cae947..778e79c3b 100644 --- a/science/physics_schemes/source/convection/comorph/interface/um/fracs_consistency.F90 +++ b/science/physics_schemes/source/convection/comorph/interface/um/fracs_consistency.F90 @@ -15,6 +15,10 @@ module fracs_consistency_mod contains ! Routine to apply consistency-checks on the cloud and precip fractions. +! Applied on input to and output from CoMorph. +! Note that the PC2 cloud-scheme and prognostic precip fraction scheme +! optionally do their own more stringent cloud-fraction checks; +! the call to this routine before CoMorph can be skipped if those are on. subroutine fracs_consistency( qcl_star, qcf_star, qcf2_star, & qrain_star, qgraup_star, & cf_liquid_star, cf_frozen_star, bulk_cf_star, & diff --git a/science/physics_schemes/source/large_scale_cloud/cloud_inputs_mod.F90 b/science/physics_schemes/source/large_scale_cloud/cloud_inputs_mod.F90 index e0d335161..419eb1425 100644 --- a/science/physics_schemes/source/large_scale_cloud/cloud_inputs_mod.F90 +++ b/science/physics_schemes/source/large_scale_cloud/cloud_inputs_mod.F90 @@ -114,7 +114,9 @@ module cloud_inputs_mod logical :: l_ensure_min_in_cloud_qcf = .false. ! Reduce CFF when qcf is low to ! ensure a minimum qcf/CFF. - +logical :: l_ensure_max_in_cloud_pc2 = .false. + ! Increase cloud-fractions so-as to remove + ! silly large in-cloud water contents qc/cf logical :: l_micro_eros = .false. ! If false, erosion is done as part of ! the convection scheme @@ -315,7 +317,7 @@ module cloud_inputs_mod namelist/RUN_Cloud/ rhcrit, i_eacf, forced_cu, forced_cu_fac, & cloud_pc2_tol, cloud_pc2_tol_2, & dbsdtbs_turb_0, falliceshear_method, & - l_ensure_min_in_cloud_qcf, & + l_ensure_min_in_cloud_qcf, l_ensure_max_in_cloud_pc2, & i_pc2_conv_coupling, i_pc2_erosion_method, i_pc2_erosion_numerics, & l_micro_eros, & starticeTKelvin, alliceTdegC, cff_spread_rate, ice_width, & @@ -506,6 +508,9 @@ subroutine print_nlist_run_cloud() write(lineBuffer,'(A,L1)')' l_ensure_min_in_cloud_qcf = ', & l_ensure_min_in_cloud_qcf call umPrint(lineBuffer,src='cloud_inputs_mod') +write(lineBuffer,'(A,L1)')' l_ensure_max_in_cloud_pc2 = ', & + l_ensure_max_in_cloud_pc2 +call umPrint(lineBuffer,src='cloud_inputs_mod') write(lineBuffer,'(A,L1)')' l_pc2_check_init = ',l_pc2_check_init call umPrint(lineBuffer,src='cloud_inputs_mod') write(lineBuffer,'(A,I0)')' i_pc2_conv_coupling = ',i_pc2_conv_coupling diff --git a/science/physics_schemes/source/large_scale_cloud/pc2_checks.F90 b/science/physics_schemes/source/large_scale_cloud/pc2_checks.F90 index 6ec464276..b1a0982de 100644 --- a/science/physics_schemes/source/large_scale_cloud/pc2_checks.F90 +++ b/science/physics_schemes/source/large_scale_cloud/pc2_checks.F90 @@ -16,7 +16,7 @@ module pc2_checks_mod subroutine pc2_checks( & ! Pressure related fields - p_theta_levels, & + p_theta_levels, p_rho_levels, & ! Prognostic Fields t, cf, cfl, cff, q, qcl, qcf, & ! Logical control @@ -25,6 +25,7 @@ subroutine pc2_checks( & row_length, rows, model_levels, offx, offy, halo_i, halo_j, qcf2, wtrac) use mphys_inputs_mod, only: l_casim, l_mcr_qcf2 +use atm_fields_bounds_mod, only: pdims_s use mphys_ice_mod, only: thomo use planet_constants_mod, only: lcrcp, lfrcp, lsrcp, r, repsilon @@ -40,7 +41,8 @@ subroutine pc2_checks( & use yomhook, only: lhook, dr_hook use parkind1, only: jprb, jpim use cloud_inputs_mod, only: i_pc2_checks_cld_frac_method, & - l_ensure_min_in_cloud_qcf + l_ensure_min_in_cloud_qcf, & + l_ensure_max_in_cloud_pc2 use science_fixes_mod, only: l_pc2_checks_sdfix use qsat_mod, only: qsat_wat, qsat_wat_mix @@ -82,11 +84,15 @@ subroutine pc2_checks( & integer, intent(in) :: & row_length, rows, model_levels, offx, offy, halo_i, halo_j +! pressure at all points (Pa) - theta-levels and rho-levels real(kind=real_umphys), intent(in) :: & p_theta_levels(1-offx:row_length+offx, & 1-offy:rows+offy, & 1:model_levels) -! pressure at all points (Pa) +real(kind=real_umphys), intent(in) :: & + p_rho_levels ( pdims_s%i_start:pdims_s%i_end, & + pdims_s%j_start:pdims_s%j_end, & + pdims_s%k_start:pdims_s%k_end ) logical, intent(in) :: & l_mixing_ratio @@ -173,6 +179,20 @@ subroutine pc2_checks( & 1:rows) ! Saturated specific humidity for dry bulb temperature T +! Max allowed in-cloud condensate mixing-ratio divided by cloud-fraction +! (max in-cloud condensate = qc_max * CF) +! Used to compute a corresponding minimum allowed cloud-fraction +! imposed as a safety check to avoid advection creating +! clouds with zero fraction but non-zero mixing-ratio +real(kind=real_umphys) :: qc_max ( row_length, rows, model_levels ) + +! Dimensionless factor scaling the max allowed in-cloud condensate +! We impose qc/cf < qc_max_fac * q_tot * cf +real(kind=real_umphys), parameter :: qc_max_fac = 10.0 + ! gives 5 g kg-1 when CF = 0.05 and q_tot = 10 g kg-1 +! Smallest non-zero number, used to avoid div-by-zero +real(kind=real_umphys), parameter :: min_float = tiny(qc_max) + ! Water tracer to water ratios real(kind=real_umphys), allocatable :: ratio_q(:,:,:,:) ! For q real(kind=real_umphys), allocatable :: ratio_qcl(:,:,:,:) ! For qcl @@ -204,9 +224,9 @@ subroutine pc2_checks( & allocate(ratio_q(row_length,rows,model_levels,n_wtrac)) allocate(ratio_qcl(row_length,rows,model_levels,n_wtrac)) do i_wt = 1, n_wtrac -!$OMP PARALLEL do DEFAULT(none) SCHEDULE(STATIC) & +!$OMP PARALLEL DO DEFAULT(NONE) SCHEDULE(STATIC) & !$OMP SHARED(i_wt, model_levels, rows, row_length, ratio_q, ratio_qcl, & -!$OMP wtrac, q, qcl) private(i, j, k) +!$OMP wtrac, q, qcl) PRIVATE(i, j, k) do k = 1,model_levels do j = 1, rows do i = 1, row_length @@ -217,14 +237,77 @@ subroutine pc2_checks( & end do end do end do -!$OMP end PARALLEL do +!$OMP END PARALLEL DO end do end if +if ( l_ensure_max_in_cloud_pc2 ) then + ! Compute max allowed in-cloud water-content. + ! Make this scale with the grid-mean total-water content + +!$OMP PARALLEL DEFAULT(NONE) PRIVATE( i, j, k ) & +!$OMP SHARED( l_mcr_qcf2, row_length, rows, model_levels, & +!$OMP qc_max, q, qcl, qcf, qcf2, cf, p_rho_levels ) + +!$OMP DO SCHEDULE(STATIC) + do k = 1, model_levels + ! Sum condensate species that are always used (ignoring negative values) + do j = 1, rows + do i = 1, row_length + qc_max(i,j,k) = max( q(i,j,k), 0.0 ) & + + max( qcl(i,j,k), 0.0 ) & + + max( qcf(i,j,k), 0.0 ) + end do + end do + if ( l_mcr_qcf2 ) then + ! Add on optional 2nd ice category (ignoring negative values) + do j = 1, rows + do i = 1, row_length + qc_max(i,j,k) = qc_max(i,j,k) + max( qcf2(i,j,k), 0.0 ) + end do + end do + end if + ! Apply dimensionless scaling factor and tiny min limit to avoid div-by-zero + do j = 1, rows + do i = 1, row_length + qc_max(i,j,k) = max( qc_max(i,j,k) * qc_max_fac, min_float ) + end do + end do + end do ! k = 1, model_levels +!$OMP END DO + + ! Setting qc_max to scale with q_total seems to unduly over-restrict in-cloud + ! ice contents at upper-levels, where typical ratios of qc / q_vap are + ! bigger (especially where deep convection is detraining high concentrations + ! of ice into otherwise very dry air). + ! To avoid this, replace qc_max with its vertical mean over the layers + ! below (just a way of not making it so much smaller higher-up, + ! without introducing additional ad-hoc thresholds). +!$OMP DO SCHEDULE(STATIC) + do j = 1, rows + do k = 2, model_levels-1 + do i = 1, row_length + qc_max(i,j,k) = ( qc_max(i,j,k-1) & + * ( p_rho_levels(i,j,1) - p_rho_levels(i,j,k) ) & + + qc_max(i,j,k) & + * ( p_rho_levels(i,j,k) - p_rho_levels(i,j,k+1) ) & + ) / ( p_rho_levels(i,j,1) - p_rho_levels(i,j,k+1) ) + end do + end do + do i = 1, row_length + qc_max(i,j,model_levels) = qc_max(i,j,model_levels-1) + end do + end do +!$OMP END DO + +!$OMP END PARALLEL + +end if ! ( l_ensure_max_in_cloud_pc2 ) + ! Loop round levels to be processed ! Levels_do1: -!$OMP PARALLEL do DEFAULT(SHARED) SCHEDULE(STATIC) private(i, j, k, al, & +!$OMP PARALLEL DO DEFAULT(SHARED) SCHEDULE(STATIC) PRIVATE(i, j, k, al, & !$OMP alpha, sd, cfl_old, qsl_t, i_wt) do k = 1,model_levels @@ -263,13 +346,55 @@ subroutine pc2_checks( & sd=al*(qsl_t(i,j)-q(i,j,k)) ! ---------------------------------------------------------------------- - ! 3. Checks are applied here for liquid cloud + ! 3. Optionally impose max limits on in-cloud water contents + ! ---------------------------------------------------------------------- + ! We do this check first as the checks on the cloud-fractions being + ! sensible need to be done afterwards. + ! Impose a minimum limit on the cloud-fractions so-as to enforce + ! a consistent maximum limit on the in-cloud condensed water contents. + ! We make the max in-cloud water content scale with cloud-fraction, + ! so-as to mainly affect "noise" present in very small cloud amounts, + ! while leaving genuine occurences of high water contents alone. + ! We impose: + ! qc/cf < qc_max * cf + ! => cf^2 > qc / qc_max + ! The checks don't make sense if the condensed water masses + ! have gone negative, so we treat negative values as zeros here. + ! Note: this check also removes instances of + ! frac < 0 which SL advection can create. + ! Also note that if the condensed water contents get unreasonably + ! large, this check can create instances of cloud-fractions > 1, + ! but any such instances will be removed by subequent checks. + if ( l_ensure_max_in_cloud_pc2 ) then + cfl(i,j,k) = max( cfl(i,j,k), & + sqrt( max(qcl(i,j,k),0.0)/qc_max(i,j,k) ) ) + if ( l_mcr_qcf2 ) then + ! Include 2nd ice category + cff(i,j,k) = max( cff(i,j,k), & + sqrt( ( max(qcf(i,j,k),0.0) & + + max(qcf2(i,j,k),0.0) )/qc_max(i,j,k) ) ) + cf(i,j,k) = max( cf(i,j,k), & + sqrt( ( max(qcl(i,j,k),0.0) & + + max(qcf(i,j,k),0.0) & + + max(qcf2(i,j,k),0.0) )/qc_max(i,j,k) ) ) + else + ! qcl and qcf only + cff(i,j,k) = max( cff(i,j,k), & + sqrt( max(qcf(i,j,k),0.0)/qc_max(i,j,k) ) ) + cf(i,j,k) = max( cf(i,j,k), & + sqrt( ( max(qcl(i,j,k),0.0) & + + max(qcf(i,j,k),0.0) )/qc_max(i,j,k) ) ) + end if + end if ! ( l_ensure_max_in_cloud_pc2 ) + + ! ---------------------------------------------------------------------- + ! 4. Checks are applied here for liquid cloud ! ---------------------------------------------------------------------- ! Earlier versions checked whether saturation deficit is zero (or less ! than zero). If so, then the liquid cloud fraction was forced to one. ! This check has been suspended for numerical reasons. - ! if (SD <= 0.0 .or. CFL(i,j,k) > 1.0) then + ! if (sd <= 0.0 .or. cfl(i,j,k) > 1.0) then ! Instead, check simply whether input values of liquid cloud fraction ! are, or are between, zero and one. If not, adjust them to zero or one. @@ -422,7 +547,7 @@ subroutine pc2_checks( & end if ! ---------------------------------------------------------------------- - ! 4. Check that ice content and ice cloud fraction are sensible. + ! 5. Check that ice content and ice cloud fraction are sensible. ! ---------------------------------------------------------------------- ! Check whether ice content is zero (or less than zero). If so then @@ -478,7 +603,7 @@ subroutine pc2_checks( & end if if ((qcf(i,j,k) +qcf2(i,j,k))> 0.0 .and. cff(i,j,k) == 0.0) then - cff(i,j,k) = (qcf(i,j,k)+qcf2(i,j,k)) * one_over_qcf0 + cff(i,j,k) = min( (qcf(i,j,k)+qcf2(i,j,k)) * one_over_qcf0, 1.0 ) ! CF is not adjusted here but is checked below end if @@ -524,7 +649,7 @@ subroutine pc2_checks( & ! some ice cloud fraction. if (qcf(i,j,k) > 0.0 .and. cff(i,j,k) == 0.0) then - cff(i,j,k) = qcf(i,j,k) * one_over_qcf0 + cff(i,j,k) = min( qcf(i,j,k) * one_over_qcf0, 1.0 ) ! CF is not adjusted here but is checked below end if @@ -539,7 +664,7 @@ subroutine pc2_checks( & end if ! l_mcr_qcf2 ! ---------------------------------------------------------------------- - ! 5. Check that total cloud fraction is sensible. + ! 6. Check that total cloud fraction is sensible. ! ---------------------------------------------------------------------- ! Total cloud fraction must be bounded by @@ -557,7 +682,7 @@ subroutine pc2_checks( & end if ! ---------------------------------------------------------------------- - ! 6. Homogeneous nucleation. + ! 7. Homogeneous nucleation. ! ---------------------------------------------------------------------- ! This process is switched off for runs with CASIM as it is dealt with @@ -588,7 +713,7 @@ subroutine pc2_checks( & end do !j end do !k -!$OMP end PARALLEL do +!$OMP END PARALLEL DO if (l_wtrac) then diff --git a/science/physics_schemes/source/large_scale_cloud/pc2_initiation_ctl.F90 b/science/physics_schemes/source/large_scale_cloud/pc2_initiation_ctl.F90 index 21988067e..9f0e19094 100644 --- a/science/physics_schemes/source/large_scale_cloud/pc2_initiation_ctl.F90 +++ b/science/physics_schemes/source/large_scale_cloud/pc2_initiation_ctl.F90 @@ -359,7 +359,7 @@ subroutine pc2_initiation_ctl ( & ! Call checking routine ! Pass field arrays without halo cells. -call pc2_checks(p_theta_levels, & +call pc2_checks(p_theta_levels, p, & t, cf, cfl, cff, q, qcl, qcf, & l_mixing_ratio, & tdims%i_len, tdims%j_len, tdims%k_end, & @@ -511,7 +511,7 @@ subroutine pc2_initiation_ctl ( & ! Call first checking routine again ! Pass field arrays without halo cells. -call pc2_checks(p_theta_levels, & +call pc2_checks(p_theta_levels, p, & t, cf, cfl, cff, q, qcl, qcf, & l_mixing_ratio, & tdims%i_len, tdims%j_len, tdims%k_end, & diff --git a/science/physics_schemes/source/large_scale_precipitation/lsp_precfrac_checks.F90 b/science/physics_schemes/source/large_scale_precipitation/lsp_precfrac_checks.F90 new file mode 100644 index 000000000..6e71e3beb --- /dev/null +++ b/science/physics_schemes/source/large_scale_precipitation/lsp_precfrac_checks.F90 @@ -0,0 +1,301 @@ +! *****************************COPYRIGHT******************************* +! (C) Crown copyright Met Office. All rights reserved. +! For further details please refer to the file COPYRIGHT.txt +! which you should have received as part of this distribution. +! *****************************COPYRIGHT******************************* +! +! Subroutine to do safety / consistency checks on the prognostic +! precipitation fraction. +! This needs to be called at the end of the model timetep, to sort out +! instances where the dynamics has caused precip mass to go non-zero +! at grid-points where precip fraction is currently zero. + +! Code Owner: Please refer to the UM file CodeOwners.txt +! This file belongs in section: Large_Scale_Precipitation + +module lsp_precfrac_checks_mod + +implicit none + +character(len=*), parameter, private :: ModuleName='LSP_PRECFRAC_CHECKS_MOD' + +contains + +subroutine lsp_precfrac_checks( dims, p_rho_levels, & + q, qcl, qcf, qcf2, qrain, qgraup, & + precfrac ) + +use atm_fields_bounds_mod, only: array_dims, tdims, pdims_s +use um_types, only: real_umphys +use mphys_inputs_mod, only: l_mcr_qcf2, l_mcr_qrain, l_mcr_qgraup, & + l_subgrid_graupel_frac, & + l_improve_precfrac_checks +use pc2_constants_mod, only: max_in_cloud_qcf +use yomhook, only: lhook, dr_hook +use parkind1, only: jprb, jpim + +implicit none + +! Dimensions of the input arrays (this is passed through the argument +! list to allow this routine to be called on versions of the fields +! with or without processor halos; pass in tdims_l for dims if they have +! extended halos, or just tdims if they have no halos, etc). +! Note that we don't update any halos present, so we only loop over +! tdims in the calculations, regardless of dims. +type(array_dims), intent(in) :: dims + +! Pressure on rho-levels, used to compute vertical mean q_total +real(kind=real_umphys), intent(in) :: p_rho_levels & + ( pdims_s%i_start:pdims_s%i_end, & + pdims_s%j_start:pdims_s%j_end, & + pdims_s%k_start:pdims_s%k_end ) + +! Water-vapour mass, used to calculate limit on in-fraction precip-mass +real(kind=real_umphys), intent(in) :: q ( dims%i_start:dims%i_end, & + dims%j_start:dims%j_end, & + dims%k_start:dims%k_end ) + +! Condensed water species masses +real(kind=real_umphys), intent(in) :: qcl ( dims%i_start:dims%i_end, & + dims%j_start:dims%j_end, & + dims%k_start:dims%k_end ) +real(kind=real_umphys), intent(in) :: qcf ( dims%i_start:dims%i_end, & + dims%j_start:dims%j_end, & + dims%k_start:dims%k_end ) +real(kind=real_umphys), intent(in) :: qcf2 ( dims%i_start:dims%i_end, & + dims%j_start:dims%j_end, & + dims%k_start:dims%k_end ) +real(kind=real_umphys), intent(in) :: qrain ( dims%i_start:dims%i_end, & + dims%j_start:dims%j_end, & + dims%k_start:dims%k_end ) +real(kind=real_umphys), intent(in) :: qgraup ( dims%i_start:dims%i_end, & + dims%j_start:dims%j_end, & + dims%k_start:dims%k_end ) + +! Prognostic precipitation fraction to be checked / updated +real(kind=real_umphys), intent(in out) :: precfrac ( dims%i_start:dims%i_end, & + dims%j_start:dims%j_end, & + dims%k_start:dims%k_end ) + +! Max allowed in-precip-fraction condensate mixing-ratio divided by +! precip-fraction +! (max in-fraction condensate = qp_max * PF) +! Used to compute a corresponding minimum allowed precip-fraction +! imposed as a safety check to avoid advection creating instances of +! near-zero fraction but non-zero mixing-ratio +real(kind=real_umphys) :: qp_max ( tdims%i_start:tdims%i_end, & + tdims%j_start:tdims%j_end, & + 1:tdims%k_end ) + +! Dimensionless factor scaling the max allowed in-precip-fraction condensate +! We impose qp/pf < qp_max_fac * q_tot * pf +real(kind=real_umphys), parameter :: qp_max_fac = 1000.0_real_umphys + ! gives 5 g kg-1 when CF = 0.0005 and q_tot = 10 g kg-1 + +! Smallest non-zero number, used to avoid div-by-zero +real(kind=real_umphys), parameter :: min_float = tiny(qp_max) + +! Zero and one stored in native precision +real(kind=real_umphys), parameter :: zero = 0.0_real_umphys +real(kind=real_umphys), parameter :: one = 1.0_real_umphys + +! Loop counters +integer :: i, j, k + +integer(kind=jpim), parameter :: zhook_in = 0 +integer(kind=jpim), parameter :: zhook_out = 1 +real(kind=jprb) :: zhook_handle + +character(len=*), parameter :: RoutineName='LSP_PRECFRAC_CHECKS' + + +if (lhook) call dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + + +!$OMP PARALLEL DEFAULT(NONE) PRIVATE( i, j, k ) & +!$OMP SHARED( l_mcr_qrain, l_mcr_qcf2, l_mcr_qgraup, tdims, qp_max, & +!$OMP q, qcl, qcf, qcf2, qrain, qgraup, p_rho_levels, & +!$OMP l_subgrid_graupel_frac, l_improve_precfrac_checks, precfrac ) + +if ( l_improve_precfrac_checks ) then + ! Improved version of precip fraction checking; uses variable max + ! in-rainshaft precip-mass (scales with mean total-water in the column + ! and with the precip-fraction) instead of a fixed constant. + ! Also adds checks to ignore negative values on precip-mass, and removes + ! instances of non-zero precip-fraction where precip-mass has gone to zero. + + ! Compute max in-precip-fraction water content + ! (pending scaling by precip-fraction). + ! Make this scale with the grid-mean total-water content +!$OMP DO SCHEDULE(STATIC) + do k = 1, tdims%k_end + ! Sum condensate species that are always used (ignoring negative values) + do j = tdims%j_start, tdims%j_end + do i = tdims%i_start, tdims%i_end + qp_max(i,j,k) = max( q(i,j,k), zero ) & + + max( qcl(i,j,k), zero ) & + + max( qcf(i,j,k), zero ) + end do + end do + ! Add on the 3 optional species if used + if ( l_mcr_qcf2 ) then + do j = tdims%j_start, tdims%j_end + do i = tdims%i_start, tdims%i_end + qp_max(i,j,k) = qp_max(i,j,k) + max( qcf2(i,j,k), zero ) + end do + end do + end if + if ( l_mcr_qrain ) then + do j = tdims%j_start, tdims%j_end + do i = tdims%i_start, tdims%i_end + qp_max(i,j,k) = qp_max(i,j,k) + max( qrain(i,j,k), zero ) + end do + end do + end if + if ( l_mcr_qgraup ) then + do j = tdims%j_start, tdims%j_end + do i = tdims%i_start, tdims%i_end + qp_max(i,j,k) = qp_max(i,j,k) + max( qgraup(i,j,k), zero ) + end do + end do + end if + ! Apply dimensionless scaling factor and tiny limit to avoid div-by-zero + do j = tdims%j_start, tdims%j_end + do i = tdims%i_start, tdims%i_end + qp_max(i,j,k) = max( qp_max(i,j,k) * qp_max_fac, min_float ) + end do + end do + end do ! k = 1, tdims%k_end +!$OMP END DO + + ! Setting qp_max to scale with q_total seems to unduly over-restrict + ! in-precip-fraction graupel at upper-levels, where typical ratios of + ! qp / q_vap are bigger (especially where deep convection is detraining high + ! concentrations of graupel into otherwise very dry air). + ! This check is spuriously inflating precfrac where there + ! is convectively-generated graupel. + ! To avoid this, replace qp_max with its vertical mean over the layers + ! below (just a way of not making it so much smaller higher-up, + ! without introducing additional ad-hoc thresholds). +!$OMP DO SCHEDULE(STATIC) + do j = tdims%j_start, tdims%j_end + do k = 2, tdims%k_end-1 + do i = tdims%i_start, tdims%i_end + qp_max(i,j,k) = ( qp_max(i,j,k-1) & + * ( p_rho_levels(i,j,1) - p_rho_levels(i,j,k) ) & + + qp_max(i,j,k) & + * ( p_rho_levels(i,j,k) - p_rho_levels(i,j,k+1) ) & + ) / ( p_rho_levels(i,j,1) - p_rho_levels(i,j,k+1) ) + end do + end do + do i = tdims%i_start, tdims%i_end + qp_max(i,j,tdims%k_end) = qp_max(i,j,tdims%k_end-1) + end do + end do +!$OMP END DO + + ! Impose a minimum limit on the precip-fraction so-as to enforce + ! a consistent maximum limit on the in-fraction precip water content. + ! We make the max in-fraction water content scale with precip-fraction, + ! so-as to mainly affect "noise" present in very small precip-fractions, + ! while leaving genuine occurences of high water contents alone. + ! We impose: + ! qp/pf < qp_max * pf + ! => pf^2 > qp / qp_max + ! The checks don't make sense if the condensed water masses + ! have gone negative, so we treat negative values as zeros here. + ! Note: this check also removes instances of + ! frac < 0 or frac > 1 which SL advection can create. + + if ( l_mcr_qgraup .and. l_subgrid_graupel_frac ) then + ! Graupel included in the prognostic precip fraction as well as rain +!$OMP DO SCHEDULE(STATIC) + do k = 1, tdims%k_end + do j = tdims%j_start, tdims%j_end + do i = tdims%i_start, tdims%i_end + precfrac(i,j,k) = min( max( precfrac(i,j,k), & + sqrt( ( max( qrain(i,j,k), zero ) & + + max( qgraup(i,j,k), zero ) ) & + / qp_max(i,j,k) ) & + ), one ) + if ( .not. ( qrain(i,j,k) > zero .or. qgraup(i,j,k) > zero ) ) then + ! Reset to zero if no precip mass + precfrac(i,j,k) = zero + end if + end do + end do + end do +!$OMP END DO NOWAIT + else + ! Only rain included in the prognostic precip fraction +!$OMP DO SCHEDULE(STATIC) + do k = 1, tdims%k_end + do j = tdims%j_start, tdims%j_end + do i = tdims%i_start, tdims%i_end + precfrac(i,j,k) = min( max( precfrac(i,j,k), & + sqrt( max( qrain(i,j,k), zero ) & + / qp_max(i,j,k) ) & + ), one ) + if ( .not. ( qrain(i,j,k) > zero ) ) then + ! Reset to zero if no precip mass + precfrac(i,j,k) = zero + end if + end do + end do + end do +!$OMP END DO NOWAIT + end if + +else ! ( .NOT. l_improve_precfrac_checks ) + ! Original version of the checks; just imposes a fixed max limit on + ! in-rainshaft precip-mass (taken from pc2_constants qcf limit), + ! and keeps precfrac between 0 and 1 + + if ( l_subgrid_graupel_frac ) then + ! Graupel included in the "precip" fraction +!$OMP DO SCHEDULE(STATIC) + do k = 1, tdims%k_end + do j = tdims%j_start, tdims%j_end + do i = tdims%i_start, tdims%i_end + precfrac(i,j,k) = max( precfrac(i,j,k), & + ( qrain(i,j,k) & + + qgraup(i,j,k) ) / max_in_cloud_qcf ) + end do + end do + end do +!$OMP END DO + else + ! "Precip" fraction only includes rain +!$OMP DO SCHEDULE(STATIC) + do k = 1, tdims%k_end + do j = tdims%j_start, tdims%j_end + do i = tdims%i_start, tdims%i_end + precfrac(i,j,k) = max( precfrac(i,j,k), & + qrain(i,j,k) / max_in_cloud_qcf ) + end do + end do + end do +!$OMP END DO + end if + + ! Ensure fraction is between 0 and 1 +!$OMP DO SCHEDULE(STATIC) + do k = 1, tdims%k_end + do j = tdims%j_start, tdims%j_end + do i = tdims%i_start, tdims%i_end + precfrac(i,j,k) = max( min( precfrac(i,j,k), one ), zero ) + end do + end do + end do +!$OMP END DO + +end if ! ( .NOT. l_improve_precfrac_checks ) + +!$OMP END PARALLEL + + +if (lhook) call dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +return +end subroutine lsp_precfrac_checks + +end module lsp_precfrac_checks_mod diff --git a/science/physics_schemes/source/large_scale_precipitation/mphys_inputs_mod.F90 b/science/physics_schemes/source/large_scale_precipitation/mphys_inputs_mod.F90 index 2300a8438..44e13af63 100644 --- a/science/physics_schemes/source/large_scale_precipitation/mphys_inputs_mod.F90 +++ b/science/physics_schemes/source/large_scale_precipitation/mphys_inputs_mod.F90 @@ -225,6 +225,14 @@ module mphys_inputs_mod ! Apply the prognostic precipitation fraction for graupel as well as rain logical :: l_subgrid_graupel_frac = .false. +! Improved safety-checks on the prognostic precip fraction: +! a) Variable max limit on the in-rainshaft precip-mass better-targets small +! noise values generated by the advection scheme. +! b) Avoid wrong application of the check where precip-mass is negative +! c) Reset precip-fraction to zero where precip-mass is zero. +! d) Extra call to the checking routine before convection if needed +logical :: l_improve_precfrac_checks = .false. + ! Apply microphysics increments to the precip fluxes as well as prognostics ! on level k (fixes a numerical problem where most of the rain or graupel ! falls straight through a model-level in 1 sub-step, so that there's not @@ -356,8 +364,8 @@ module mphys_inputs_mod fcrit, nsigmasf, nscalesf, wvarfac, heavy_rain_evap_fac, & l_casim, casim_moments_choice, & casim_iopt_act, l_mphys_nonshallow, & - l_mcr_precfrac, l_subgrid_graupel_frac, l_proc_fluxes, & - i_update_precfrac, & + l_mcr_precfrac, l_subgrid_graupel_frac, l_improve_precfrac_checks, & + l_proc_fluxes, i_update_precfrac, & mp_czero, mp_tau_lim, l_casim_warmstart, l_micro_in_rim !=========================================================================== @@ -548,6 +556,9 @@ subroutine print_nlist_run_precip() call umPrint(lineBuffer,src='mphys_inputs_mod') write(lineBuffer,'(A,L1)')' l_subgrid_graupel_frac = ',l_subgrid_graupel_frac call umPrint(lineBuffer,src='mphys_inputs_mod') +write(lineBuffer,'(A,L1)')' l_improve_precfrac_checks = ', & + l_improve_precfrac_checks +call umPrint(lineBuffer,src='mphys_inputs_mod') write(lineBuffer,'(A,L1)')' l_proc_fluxes = ',l_proc_fluxes call umPrint(lineBuffer,src='mphys_inputs_mod') write(lineBuffer,fmt='(A,I0)')'i_update_precfrac =', i_update_precfrac