From 94aa6c23e68b9a5afa9a9aba6e43f60b6d0594a3 Mon Sep 17 00:00:00 2001 From: Haipeng Lin Date: Tue, 9 Sep 2025 15:11:04 -0600 Subject: [PATCH 1/7] Add support for energy checker for ZM deep convection scheme --- .../zm_prepare_flux_for_check_energy.F90 | 60 +++++++++++++++++ .../zm_prepare_flux_for_check_energy.meta | 67 +++++++++++++++++++ suites/suite_cam7.xml | 2 + test/test_suites/suite_zhang_mcfarlane.xml | 9 +++ 4 files changed, 138 insertions(+) create mode 100644 schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 create mode 100644 schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta diff --git a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 new file mode 100644 index 00000000..feb10b7c --- /dev/null +++ b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 @@ -0,0 +1,60 @@ +! Prepare flux variables for energy checker after ZM deep convection +! Has to run after both zm_convr (provides reserved liquid and reserved ice) +! and zm_conv_evap+interstitial to deep (provides snow_dp and prec_dp) have +! been ran. +! The resulting net liquid (lwe) and ice fluxes are combined and provided to +! the check_energy_chng CCPPized scheme. +module zm_prepare_flux_for_check_energy + use ccpp_kinds, only: kind_phys + + implicit none + private + save + + public :: zm_prepare_flux_for_check_energy_run + +contains + +!> \section arg_table_zm_prepare_flux_for_check_energy_run Argument Table +!! \htmlinclude zm_prepare_flux_for_check_energy_run.html + subroutine zm_prepare_flux_for_check_energy_run( & + ncol, & + prec_dp, rliq, snow_dp, rice, & + scheme_name, & + flx_cnd, flx_ice, & + errmsg, errflg) + + ! Input arguments + integer, intent(in) :: ncol + real(kind_phys), intent(in) :: prec_dp(:) ! Deep convection precipitation rate [m s-1] + real(kind_phys), intent(in) :: rliq(:) ! Reserved liquid water tendency [m s-1] + real(kind_phys), intent(in) :: snow_dp(:) ! Deep convection frozen precipitation rate [m s-1] + real(kind_phys), intent(in) :: rice(:) ! Reserved ice tendency [m s-1] + + ! Output arguments + character(len=16), intent(out) :: scheme_name ! Scheme name for energy checking + real(kind_phys), intent(out) :: flx_cnd(:) ! Combined liquid and ice fluxes [m s-1] + real(kind_phys), intent(out) :: flx_ice(:) ! Combined ice fluxes [m s-1] + character(len=512), intent(out) :: errmsg + integer, intent(out) :: errflg + + ! Local variables + integer :: i + + errmsg = '' + errflg = 0 + + ! Set scheme name for energy checking + scheme_name = "convect_deep_zm" + + ! Combine precipitation and reserved liquid for total liquid+ice flux + ! This represents net liquid and ice fluxes through column boundaries + flx_cnd(:ncol) = prec_dp(:ncol) + rliq(:ncol) + + ! Combine frozen precipitation and reserved ice for total ice flux + ! This represents net ice fluxes through column boundaries + flx_ice(:ncol) = snow_dp(:ncol) + rice(:ncol) + + end subroutine zm_prepare_flux_for_check_energy_run + +end module zm_prepare_flux_for_check_energy diff --git a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta new file mode 100644 index 00000000..adb5ea09 --- /dev/null +++ b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta @@ -0,0 +1,67 @@ +[ccpp-table-properties] + name = zm_prepare_flux_for_check_energy + type = scheme + +[ccpp-arg-table] + name = zm_prepare_flux_for_check_energy_run + type = scheme +[ ncol ] + standard_name = horizontal_loop_extent + units = count + type = integer + dimensions = () + intent = in +[ prec_dp ] + standard_name = lwe_precipitation_rate_at_surface_due_to_deep_convection + units = m s-1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent) + intent = in +[ rliq ] + standard_name = vertically_integrated_cloud_liquid_water_tendency_due_to_all_convection_to_be_applied_later_in_time_loop + units = m s-1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent) + intent = in +[ snow_dp ] + standard_name = lwe_frozen_precipitation_rate_at_surface_due_to_deep_convection + units = m s-1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent) + intent = in +[ rice ] + standard_name = vertically_integrated_cloud_ice_tendency_due_to_all_convection_to_be_applied_later_in_time_loop + units = m s-1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent) + intent = in +[ scheme_name ] + standard_name = scheme_name + units = none + type = character | kind = len=16 + dimensions = () + intent = out +[ flx_cnd ] + standard_name = net_liquid_and_lwe_ice_fluxes_through_top_and_bottom_of_atmosphere_column + units = m s-1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent) + intent = out +[ flx_ice ] + standard_name = net_lwe_ice_fluxes_through_top_and_bottom_of_atmosphere_column + units = m s-1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent) + intent = out +[ errmsg ] + standard_name = ccpp_error_message + units = none + type = character | kind = len=512 + dimensions = () + intent = out +[ errflg ] + standard_name = ccpp_error_code + units = 1 + type = integer + dimensions = () + intent = out diff --git a/suites/suite_cam7.xml b/suites/suite_cam7.xml index 689b66ef..cb709a1b 100644 --- a/suites/suite_cam7.xml +++ b/suites/suite_cam7.xml @@ -38,6 +38,7 @@ geopotential_temp + check_energy_zero_fluxes zm_conv_options zm_convr zm_convr_tendency_diagnostics @@ -69,6 +70,7 @@ zm_diagnostics + zm_prepare_flux_for_check_energy check_energy_scaling check_energy_chng diff --git a/test/test_suites/suite_zhang_mcfarlane.xml b/test/test_suites/suite_zhang_mcfarlane.xml index 1797a46e..f1e19070 100644 --- a/test/test_suites/suite_zhang_mcfarlane.xml +++ b/test/test_suites/suite_zhang_mcfarlane.xml @@ -5,6 +5,10 @@ initialize_constituents to_be_ccppized_temporary set_cloud_fraction_top + + + check_energy_zero_fluxes + zm_conv_options zm_convr zm_convr_tendency_diagnostics @@ -34,6 +38,11 @@ qneg geopotential_temp zm_diagnostics + + + zm_prepare_flux_for_check_energy + check_energy_scaling + check_energy_chng From 09a513e26e9bd98f0fefd9a688aa89cccb65ef3d Mon Sep 17 00:00:00 2001 From: Haipeng Lin Date: Tue, 9 Sep 2025 15:37:02 -0600 Subject: [PATCH 2/7] Add energy checker to CAM4 suite; remove from ZM suite as snapshot is incompatible --- suites/suite_cam4.xml | 1 + test/test_suites/suite_zhang_mcfarlane.xml | 9 --------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/suites/suite_cam4.xml b/suites/suite_cam4.xml index 7c3fc7f8..57cc89e1 100644 --- a/suites/suite_cam4.xml +++ b/suites/suite_cam4.xml @@ -73,6 +73,7 @@ zm_diagnostics + zm_prepare_flux_for_check_energy check_energy_scaling check_energy_chng diff --git a/test/test_suites/suite_zhang_mcfarlane.xml b/test/test_suites/suite_zhang_mcfarlane.xml index f1e19070..1797a46e 100644 --- a/test/test_suites/suite_zhang_mcfarlane.xml +++ b/test/test_suites/suite_zhang_mcfarlane.xml @@ -5,10 +5,6 @@ initialize_constituents to_be_ccppized_temporary set_cloud_fraction_top - - - check_energy_zero_fluxes - zm_conv_options zm_convr zm_convr_tendency_diagnostics @@ -38,11 +34,6 @@ qneg geopotential_temp zm_diagnostics - - - zm_prepare_flux_for_check_energy - check_energy_scaling - check_energy_chng From 1c87fdc58cb5fa06a28a5fdc41f60e6dada028be Mon Sep 17 00:00:00 2001 From: Haipeng Lin Date: Tue, 16 Sep 2025 11:24:15 -0400 Subject: [PATCH 3/7] Update schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 Co-authored-by: Jesse Nusbaumer --- schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 index feb10b7c..3a5cf0d9 100644 --- a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 +++ b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 @@ -2,7 +2,7 @@ ! Has to run after both zm_convr (provides reserved liquid and reserved ice) ! and zm_conv_evap+interstitial to deep (provides snow_dp and prec_dp) have ! been ran. -! The resulting net liquid (lwe) and ice fluxes are combined and provided to +! The resulting net liquid and (lwe) ice fluxes are combined and provided to ! the check_energy_chng CCPPized scheme. module zm_prepare_flux_for_check_energy use ccpp_kinds, only: kind_phys From c12b8f476c4affbcf0c11136f51ec78c45a4fd4d Mon Sep 17 00:00:00 2001 From: Haipeng Lin Date: Tue, 16 Sep 2025 11:27:13 -0400 Subject: [PATCH 4/7] Update rice standard name in response to review comments. --- schemes/zhang_mcfarlane/zm_convr.meta | 2 +- schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/schemes/zhang_mcfarlane/zm_convr.meta b/schemes/zhang_mcfarlane/zm_convr.meta index 0bc4c1c5..d3b01f8d 100644 --- a/schemes/zhang_mcfarlane/zm_convr.meta +++ b/schemes/zhang_mcfarlane/zm_convr.meta @@ -441,7 +441,7 @@ dimensions = (horizontal_loop_extent) intent = in [ rice ] - standard_name = vertically_integrated_cloud_ice_tendency_due_to_all_convection_to_be_applied_later_in_time_loop + standard_name = vertically_integrated_lwe_cloud_ice_tendency_due_to_all_convection_to_be_applied_later_in_time_loop units = m s-1 type = real | kind = kind_phys dimensions = (horizontal_loop_extent) diff --git a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta index adb5ea09..74a92f93 100644 --- a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta +++ b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta @@ -30,7 +30,7 @@ dimensions = (horizontal_loop_extent) intent = in [ rice ] - standard_name = vertically_integrated_cloud_ice_tendency_due_to_all_convection_to_be_applied_later_in_time_loop + standard_name = vertically_integrated_lwe_cloud_ice_tendency_due_to_all_convection_to_be_applied_later_in_time_loop units = m s-1 type = real | kind = kind_phys dimensions = (horizontal_loop_extent) From 9cd83840c5135c0e8ec5434d55420cc225730a02 Mon Sep 17 00:00:00 2001 From: Haipeng Lin Date: Wed, 13 May 2026 07:55:56 -0400 Subject: [PATCH 5/7] After removing rice --- .../zm_prepare_flux_for_check_energy.F90 | 14 ++++++-------- .../zm_prepare_flux_for_check_energy.meta | 6 ------ 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 index 3a5cf0d9..f1bf21b8 100644 --- a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 +++ b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 @@ -1,5 +1,5 @@ ! Prepare flux variables for energy checker after ZM deep convection -! Has to run after both zm_convr (provides reserved liquid and reserved ice) +! Has to run after both zm_convr (provides reserved liquid) ! and zm_conv_evap+interstitial to deep (provides snow_dp and prec_dp) have ! been ran. ! The resulting net liquid and (lwe) ice fluxes are combined and provided to @@ -19,7 +19,7 @@ module zm_prepare_flux_for_check_energy !! \htmlinclude zm_prepare_flux_for_check_energy_run.html subroutine zm_prepare_flux_for_check_energy_run( & ncol, & - prec_dp, rliq, snow_dp, rice, & + prec_dp, rliq, snow_dp, & scheme_name, & flx_cnd, flx_ice, & errmsg, errflg) @@ -29,12 +29,11 @@ subroutine zm_prepare_flux_for_check_energy_run( & real(kind_phys), intent(in) :: prec_dp(:) ! Deep convection precipitation rate [m s-1] real(kind_phys), intent(in) :: rliq(:) ! Reserved liquid water tendency [m s-1] real(kind_phys), intent(in) :: snow_dp(:) ! Deep convection frozen precipitation rate [m s-1] - real(kind_phys), intent(in) :: rice(:) ! Reserved ice tendency [m s-1] ! Output arguments character(len=16), intent(out) :: scheme_name ! Scheme name for energy checking - real(kind_phys), intent(out) :: flx_cnd(:) ! Combined liquid and ice fluxes [m s-1] - real(kind_phys), intent(out) :: flx_ice(:) ! Combined ice fluxes [m s-1] + real(kind_phys), intent(out) :: flx_cnd(:) ! Liquid fluxes [m s-1] + real(kind_phys), intent(out) :: flx_ice(:) ! Ice fluxes [m s-1] character(len=512), intent(out) :: errmsg integer, intent(out) :: errflg @@ -51,9 +50,8 @@ subroutine zm_prepare_flux_for_check_energy_run( & ! This represents net liquid and ice fluxes through column boundaries flx_cnd(:ncol) = prec_dp(:ncol) + rliq(:ncol) - ! Combine frozen precipitation and reserved ice for total ice flux - ! This represents net ice fluxes through column boundaries - flx_ice(:ncol) = snow_dp(:ncol) + rice(:ncol) + ! Frozen precipitation represents net ice fluxes through column boundaries + flx_ice(:ncol) = snow_dp(:ncol) end subroutine zm_prepare_flux_for_check_energy_run diff --git a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta index 74a92f93..e40f5fbf 100644 --- a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta +++ b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.meta @@ -29,12 +29,6 @@ type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in -[ rice ] - standard_name = vertically_integrated_lwe_cloud_ice_tendency_due_to_all_convection_to_be_applied_later_in_time_loop - units = m s-1 - type = real | kind = kind_phys - dimensions = (horizontal_loop_extent) - intent = in [ scheme_name ] standard_name = scheme_name units = none From 8124a7c5f1a2601c84cddfe99230305c1f27c9c5 Mon Sep 17 00:00:00 2001 From: Haipeng Lin Date: Wed, 13 May 2026 07:57:13 -0400 Subject: [PATCH 6/7] Revert change to zm_convr.meta: it will not be relevant --- schemes/zhang_mcfarlane/zm_convr.meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemes/zhang_mcfarlane/zm_convr.meta b/schemes/zhang_mcfarlane/zm_convr.meta index d3b01f8d..0bc4c1c5 100644 --- a/schemes/zhang_mcfarlane/zm_convr.meta +++ b/schemes/zhang_mcfarlane/zm_convr.meta @@ -441,7 +441,7 @@ dimensions = (horizontal_loop_extent) intent = in [ rice ] - standard_name = vertically_integrated_lwe_cloud_ice_tendency_due_to_all_convection_to_be_applied_later_in_time_loop + standard_name = vertically_integrated_cloud_ice_tendency_due_to_all_convection_to_be_applied_later_in_time_loop units = m s-1 type = real | kind = kind_phys dimensions = (horizontal_loop_extent) From 6c09d3d8be1d4b7087444ea2818835e0fc715523 Mon Sep 17 00:00:00 2001 From: Haipeng Lin Date: Wed, 13 May 2026 07:58:18 -0400 Subject: [PATCH 7/7] Remove SAVE from module; move kind_phys --- schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 index f1bf21b8..59c6a385 100644 --- a/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 +++ b/schemes/zhang_mcfarlane/zm_prepare_flux_for_check_energy.F90 @@ -5,11 +5,8 @@ ! The resulting net liquid and (lwe) ice fluxes are combined and provided to ! the check_energy_chng CCPPized scheme. module zm_prepare_flux_for_check_energy - use ccpp_kinds, only: kind_phys - implicit none private - save public :: zm_prepare_flux_for_check_energy_run @@ -24,6 +21,8 @@ subroutine zm_prepare_flux_for_check_energy_run( & flx_cnd, flx_ice, & errmsg, errflg) + use ccpp_kinds, only: kind_phys + ! Input arguments integer, intent(in) :: ncol real(kind_phys), intent(in) :: prec_dp(:) ! Deep convection precipitation rate [m s-1]