From 15bc496dc67439088d27c6afd0ef1f01daa005c0 Mon Sep 17 00:00:00 2001 From: Cheryl Craig Date: Fri, 14 Feb 2025 16:05:17 -0700 Subject: [PATCH 1/6] Preliminary dme work and create conservation_adjust directory --- .../check_energy/check_energy_chng.F90 | 0 .../check_energy/check_energy_chng.meta | 0 .../check_energy_chng_namelist.xml | 0 .../check_energy/check_energy_fix.F90 | 0 .../check_energy/check_energy_fix.meta | 0 .../check_energy_gmean/check_energy_gmean.F90 | 0 .../check_energy_gmean.meta | 0 .../check_energy/check_energy_save_teout.F90 | 0 .../check_energy/check_energy_save_teout.meta | 0 .../check_energy/check_energy_scaling.F90 | 0 .../check_energy/check_energy_scaling.meta | 0 .../check_energy/check_energy_zero_fluxes.F90 | 0 .../check_energy_zero_fluxes.meta | 0 .../dycore_energy_consistency_adjust.F90 | 0 .../dycore_energy_consistency_adjust.meta | 0 .../dme_adjust/physics_dme_adjust.F90 | 108 ++++++++++++++++++ 16 files changed, 108 insertions(+) rename schemes/{ => conservation_adjust}/check_energy/check_energy_chng.F90 (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_chng.meta (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_chng_namelist.xml (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_fix.F90 (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_fix.meta (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_gmean/check_energy_gmean.F90 (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_gmean/check_energy_gmean.meta (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_save_teout.F90 (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_save_teout.meta (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_scaling.F90 (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_scaling.meta (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_zero_fluxes.F90 (100%) rename schemes/{ => conservation_adjust}/check_energy/check_energy_zero_fluxes.meta (100%) rename schemes/{ => conservation_adjust}/check_energy/dycore_energy_consistency_adjust.F90 (100%) rename schemes/{ => conservation_adjust}/check_energy/dycore_energy_consistency_adjust.meta (100%) create mode 100644 schemes/conservation_adjust/dme_adjust/physics_dme_adjust.F90 diff --git a/schemes/check_energy/check_energy_chng.F90 b/schemes/conservation_adjust/check_energy/check_energy_chng.F90 similarity index 100% rename from schemes/check_energy/check_energy_chng.F90 rename to schemes/conservation_adjust/check_energy/check_energy_chng.F90 diff --git a/schemes/check_energy/check_energy_chng.meta b/schemes/conservation_adjust/check_energy/check_energy_chng.meta similarity index 100% rename from schemes/check_energy/check_energy_chng.meta rename to schemes/conservation_adjust/check_energy/check_energy_chng.meta diff --git a/schemes/check_energy/check_energy_chng_namelist.xml b/schemes/conservation_adjust/check_energy/check_energy_chng_namelist.xml similarity index 100% rename from schemes/check_energy/check_energy_chng_namelist.xml rename to schemes/conservation_adjust/check_energy/check_energy_chng_namelist.xml diff --git a/schemes/check_energy/check_energy_fix.F90 b/schemes/conservation_adjust/check_energy/check_energy_fix.F90 similarity index 100% rename from schemes/check_energy/check_energy_fix.F90 rename to schemes/conservation_adjust/check_energy/check_energy_fix.F90 diff --git a/schemes/check_energy/check_energy_fix.meta b/schemes/conservation_adjust/check_energy/check_energy_fix.meta similarity index 100% rename from schemes/check_energy/check_energy_fix.meta rename to schemes/conservation_adjust/check_energy/check_energy_fix.meta diff --git a/schemes/check_energy/check_energy_gmean/check_energy_gmean.F90 b/schemes/conservation_adjust/check_energy/check_energy_gmean/check_energy_gmean.F90 similarity index 100% rename from schemes/check_energy/check_energy_gmean/check_energy_gmean.F90 rename to schemes/conservation_adjust/check_energy/check_energy_gmean/check_energy_gmean.F90 diff --git a/schemes/check_energy/check_energy_gmean/check_energy_gmean.meta b/schemes/conservation_adjust/check_energy/check_energy_gmean/check_energy_gmean.meta similarity index 100% rename from schemes/check_energy/check_energy_gmean/check_energy_gmean.meta rename to schemes/conservation_adjust/check_energy/check_energy_gmean/check_energy_gmean.meta diff --git a/schemes/check_energy/check_energy_save_teout.F90 b/schemes/conservation_adjust/check_energy/check_energy_save_teout.F90 similarity index 100% rename from schemes/check_energy/check_energy_save_teout.F90 rename to schemes/conservation_adjust/check_energy/check_energy_save_teout.F90 diff --git a/schemes/check_energy/check_energy_save_teout.meta b/schemes/conservation_adjust/check_energy/check_energy_save_teout.meta similarity index 100% rename from schemes/check_energy/check_energy_save_teout.meta rename to schemes/conservation_adjust/check_energy/check_energy_save_teout.meta diff --git a/schemes/check_energy/check_energy_scaling.F90 b/schemes/conservation_adjust/check_energy/check_energy_scaling.F90 similarity index 100% rename from schemes/check_energy/check_energy_scaling.F90 rename to schemes/conservation_adjust/check_energy/check_energy_scaling.F90 diff --git a/schemes/check_energy/check_energy_scaling.meta b/schemes/conservation_adjust/check_energy/check_energy_scaling.meta similarity index 100% rename from schemes/check_energy/check_energy_scaling.meta rename to schemes/conservation_adjust/check_energy/check_energy_scaling.meta diff --git a/schemes/check_energy/check_energy_zero_fluxes.F90 b/schemes/conservation_adjust/check_energy/check_energy_zero_fluxes.F90 similarity index 100% rename from schemes/check_energy/check_energy_zero_fluxes.F90 rename to schemes/conservation_adjust/check_energy/check_energy_zero_fluxes.F90 diff --git a/schemes/check_energy/check_energy_zero_fluxes.meta b/schemes/conservation_adjust/check_energy/check_energy_zero_fluxes.meta similarity index 100% rename from schemes/check_energy/check_energy_zero_fluxes.meta rename to schemes/conservation_adjust/check_energy/check_energy_zero_fluxes.meta diff --git a/schemes/check_energy/dycore_energy_consistency_adjust.F90 b/schemes/conservation_adjust/check_energy/dycore_energy_consistency_adjust.F90 similarity index 100% rename from schemes/check_energy/dycore_energy_consistency_adjust.F90 rename to schemes/conservation_adjust/check_energy/dycore_energy_consistency_adjust.F90 diff --git a/schemes/check_energy/dycore_energy_consistency_adjust.meta b/schemes/conservation_adjust/check_energy/dycore_energy_consistency_adjust.meta similarity index 100% rename from schemes/check_energy/dycore_energy_consistency_adjust.meta rename to schemes/conservation_adjust/check_energy/dycore_energy_consistency_adjust.meta diff --git a/schemes/conservation_adjust/dme_adjust/physics_dme_adjust.F90 b/schemes/conservation_adjust/dme_adjust/physics_dme_adjust.F90 new file mode 100644 index 00000000..ff9bb09c --- /dev/null +++ b/schemes/conservation_adjust/dme_adjust/physics_dme_adjust.F90 @@ -0,0 +1,108 @@ +module dme_adjust + + use ccpp_kinds, only: kind_phys + + implicit none + +contains +!=============================================================================== +!> \section arg_table_dme_adjust_run Argument Table +!! \htmlinclude dme_adjust_run.html +!! + subroutine dme_adjust_run(ncol, pver, pcnst, ps, pint, pdel, lnpint, rpdel, const_props, const_array, qini, liqini, iceini, & + errmsg, errflg) + !----------------------------------------------------------------------- + ! + ! Purpose: Adjust the dry mass in each layer back to the value of physics input state + ! + ! Method: Conserve the integrated mass, momentum and total energy in each layer + ! by scaling the specific mass of consituents, specific momentum (velocity) + ! and specific total energy by the relative change in layer mass. Solve for + ! the new temperature by subtracting the new kinetic energy from total energy + ! and inverting the hydrostatic equation + ! + ! The mass in each layer is modified, changing the relationship of the layer + ! interfaces and midpoints to the surface pressure. The result is no longer in + ! the original hybrid coordinate. + ! + ! This procedure cannot be applied to the "eul" or "sld" dycores because they + ! require the hybrid coordinate. + ! + ! Author: Byron Boville + + ! !REVISION HISTORY: + ! 03.03.28 Boville Created, partly from code by Lin in p_d_adjust + ! + !----------------------------------------------------------------------- + + use ccpp_constituent_prop_mod, only: ccpp_constituent_prop_ptr_t + + implicit none + ! + ! Arguments + ! + integer, intent(in) :: ncol + integer, intent(in) :: pver + integer, intent(in) :: pcnst + real(kind_phys), intent(inout) :: ps(:) + real(kind_phys), intent(inout) :: pint(:,:) + real(kind_phys), intent(inout) :: pdel(:,:) + real(kind_phys), intent(inout) :: lnpint(:,:) + real(kind_phys), intent(inout) :: rpdel(:,:) + type(ccpp_constituent_prop_ptr_t), intent(in) :: const_props(:) + real(kind_phys), intent(inout) :: const_array(:,:,:) + + real(kind_phys), intent(in) :: qini(:,:) ! initial specific humidity + real(kind_phys), intent(in) :: liqini(:,:) ! initial total liquid + real(kind_phys), intent(in) :: iceini(:,:) ! initial total ice + character(len=512), intent(out) :: errmsg + integer, intent(out) :: errflg + + ! + !---------------------------Local workspace----------------------------- + ! + integer :: k,m ! Longitude, level indices + real(kind_phys) :: fdq(ncol) ! mass adjustment factor + + real(kind_phys) :: tot_water (ncol,2) ! total water (initial, present) + real(kind_phys) :: tot_water_chg(ncol) ! total water change + + + integer :: m_cnst + logical :: water_flag + + errmsg = ' ' + errflg = 0 + + ! + !----------------------------------------------------------------------- + ! adjust dry mass in each layer back to input value, while conserving + ! constituents, momentum, and total energy + ps(:) = pint(:,1) + + do k = 1, pver + tot_water(:,1) = qini(:,k) +liqini(:,k)+iceini(:,k) !initial total H2O + tot_water(:,2) = 0.0_kind_phys + do m_cnst=1,pcnst + call const_props(m_cnst)%is_water_species(water_flag) + if(water_flag) then + tot_water(:,2) = tot_water(:,2)+const_array(:,k,m_cnst) + end if + end do + fdq(:) = 1._kind_phys + tot_water(:,2) - tot_water(:,1) + ! adjust constituents to conserve mass in each layer + do m = 1, pcnst + const_array(:,k,m) = const_array(:,k,m) / fdq(:) + end do + ! compute new total pressure variables + pdel (:,k ) = pdel(:,k ) * fdq(:) + ps(:) = ps(:) + pdel(:,k) + pint (:,k+1) = pint(:,k ) + pdel(:,k) + lnpint(:,k+1) = log(pint(:,k+1)) + rpdel (:,k ) = 1._kind_phys/ pdel(:,k ) + !note that mid-level variables (e.g. pmid) are not recomputed + end do + + end subroutine dme_adjust_run + +end module dme_adjust From 0b7a63c77e04a198dc017be971254f0eb268c403 Mon Sep 17 00:00:00 2001 From: Cheryl Craig Date: Wed, 19 Feb 2025 14:16:34 -0700 Subject: [PATCH 2/6] Updates for CAM-SIMA --- .../physics_dme_adjust.F90 | 12 +-- .../physics_dme_adjust.meta | 97 +++++++++++++++++++ suites/suite_cam7.xml | 4 + test/test_suites/suite_physics_dme_adjust.xml | 8 ++ 4 files changed, 115 insertions(+), 6 deletions(-) rename schemes/conservation_adjust/{dme_adjust => physics_dme_adjust}/physics_dme_adjust.F90 (92%) create mode 100644 schemes/conservation_adjust/physics_dme_adjust/physics_dme_adjust.meta create mode 100644 test/test_suites/suite_physics_dme_adjust.xml diff --git a/schemes/conservation_adjust/dme_adjust/physics_dme_adjust.F90 b/schemes/conservation_adjust/physics_dme_adjust/physics_dme_adjust.F90 similarity index 92% rename from schemes/conservation_adjust/dme_adjust/physics_dme_adjust.F90 rename to schemes/conservation_adjust/physics_dme_adjust/physics_dme_adjust.F90 index ff9bb09c..0d7fd80f 100644 --- a/schemes/conservation_adjust/dme_adjust/physics_dme_adjust.F90 +++ b/schemes/conservation_adjust/physics_dme_adjust/physics_dme_adjust.F90 @@ -1,4 +1,4 @@ -module dme_adjust +module physics_dme_adjust use ccpp_kinds, only: kind_phys @@ -6,10 +6,10 @@ module dme_adjust contains !=============================================================================== -!> \section arg_table_dme_adjust_run Argument Table -!! \htmlinclude dme_adjust_run.html +!> \section arg_table_physics_dme_adjust_run Argument Table +!! \htmlinclude physics_dme_adjust_run.html !! - subroutine dme_adjust_run(ncol, pver, pcnst, ps, pint, pdel, lnpint, rpdel, const_props, const_array, qini, liqini, iceini, & + subroutine physics_dme_adjust_run(ncol, pver, pcnst, ps, pint, pdel, lnpint, rpdel, const_props, const_array, qini, liqini, iceini, & errmsg, errflg) !----------------------------------------------------------------------- ! @@ -103,6 +103,6 @@ subroutine dme_adjust_run(ncol, pver, pcnst, ps, pint, pdel, lnpint, rpdel, cons !note that mid-level variables (e.g. pmid) are not recomputed end do - end subroutine dme_adjust_run + end subroutine physics_dme_adjust_run -end module dme_adjust +end module physics_dme_adjust diff --git a/schemes/conservation_adjust/physics_dme_adjust/physics_dme_adjust.meta b/schemes/conservation_adjust/physics_dme_adjust/physics_dme_adjust.meta new file mode 100644 index 00000000..116f9a90 --- /dev/null +++ b/schemes/conservation_adjust/physics_dme_adjust/physics_dme_adjust.meta @@ -0,0 +1,97 @@ +[ccpp-table-properties] + name = physics_dme_adjust + type = scheme + +[ccpp-arg-table] + name = physics_dme_adjust_run + type = scheme +[ ncol ] + standard_name = horizontal_loop_extent + units = count + type = integer + dimensions = () + intent = in +[ pver ] + standard_name = vertical_layer_dimension + units = count + type = integer + dimensions = () + intent = in +[ pcnst ] + standard_name = number_of_ccpp_constituents + units = count + type = integer + dimensions = () + intent = in +[ ps ] + standard_name = surface_air_pressure + units = Pa + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent) + intent = inout +[ pint ] + standard_name = air_pressure_at_interface + units = Pa + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent, vertical_interface_dimension) + intent = inout +[ pdel ] + standard_name = air_pressure_thickness + units = Pa + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent, vertical_layer_dimension) + intent = inout +[ lnpint ] + standard_name = ln_air_pressure_at_interface + units = 1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent, vertical_interface_dimension) + intent = inout +[ rpdel ] + standard_name = reciprocal_of_air_pressure_thickness + units = Pa-1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent, vertical_layer_dimension) + intent = inout +[ const_props ] + standard_name = ccpp_constituent_properties + units = None + type = ccpp_constituent_prop_ptr_t + dimensions = (number_of_ccpp_constituents) + intent = in +[ const_array ] + standard_name = ccpp_constituents + units = none + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent, vertical_layer_dimension, number_of_ccpp_constituents) + intent = inout +[ qini ] + standard_name = water_vapor_mixing_ratio_wrt_moist_air_and_condensed_water_before_coupling + units = kg kg-1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent, vertical_layer_dimension) + intent = in +[ liqini ] + standard_name = total_liquid_water_mixing_ratio_wrt_moist_air_and_condensed_water_before_coupling + units = kg kg-1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent, vertical_layer_dimension) + intent = in +[ iceini ] + standard_name = total_ice_water_mixing_ratio_wrt_moist_air_and_condensed_water_before_coupling + units = kg kg-1 + type = real | kind = kind_phys + dimensions = (horizontal_loop_extent, vertical_layer_dimension) + intent = in +[ 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 ae0daa42..44335e0d 100644 --- a/suites/suite_cam7.xml +++ b/suites/suite_cam7.xml @@ -81,6 +81,10 @@ check_energy_save_teout + + + dme_adjust + diff --git a/test/test_suites/suite_physics_dme_adjust.xml b/test/test_suites/suite_physics_dme_adjust.xml new file mode 100644 index 00000000..2888691e --- /dev/null +++ b/test/test_suites/suite_physics_dme_adjust.xml @@ -0,0 +1,8 @@ + + + + + physics_dme_adjust + + + From ec5106bb80df61e9ec7c967b165b61090c1de04b Mon Sep 17 00:00:00 2001 From: Cheryl Craig Date: Thu, 20 Feb 2025 13:06:42 -0700 Subject: [PATCH 3/6] Update dme_adjust in SDFs --- suites/suite_kessler.xml | 2 +- suites/suite_tj2016.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/suites/suite_kessler.xml b/suites/suite_kessler.xml index 787e543d..2ca0c5be 100644 --- a/suites/suite_kessler.xml +++ b/suites/suite_kessler.xml @@ -34,7 +34,7 @@ thermo_water_update - + thermo_water_update - + thermo_water_update + <-- COMMENTED OUT until qini/liqini/iceini have initialization routines --> - thermo_water_update + <-- COMMENTED OUT until qini/liqini/iceini have initialization routines --> thermo_water_update - <-- COMMENTED OUT until qini/liqini/iceini have initialization routines --> + - <-- COMMENTED OUT until qini/liqini/iceini have initialization routines --> +