diff --git a/src/core_atmosphere/Registry.xml b/src/core_atmosphere/Registry.xml index 4281c40bba..de255ecac5 100644 --- a/src/core_atmosphere/Registry.xml +++ b/src/core_atmosphere/Registry.xml @@ -2215,6 +2215,11 @@ description="number of microphysics time-steps per physics time-steps" possible_values="Positive integers"/> + + + + diff --git a/src/core_atmosphere/mpas_atm_core.F b/src/core_atmosphere/mpas_atm_core.F index f7d04a1f0c..67b6f53c37 100644 --- a/src/core_atmosphere/mpas_atm_core.F +++ b/src/core_atmosphere/mpas_atm_core.F @@ -390,6 +390,7 @@ subroutine atm_mpas_init_block(dminfo, stream_manager, block, mesh, dt) type (mpas_pool_type), pointer :: state type (mpas_pool_type), pointer :: diag type (mpas_pool_type), pointer :: tend + type (mpas_pool_type), pointer :: tend_physics type (mpas_pool_type), pointer :: sfc_input type (mpas_pool_type), pointer :: diag_physics type (mpas_pool_type), pointer :: diag_physics_noahmp @@ -566,6 +567,7 @@ subroutine atm_mpas_init_block(dminfo, stream_manager, block, mesh, dt) if (moist_physics) then !initialization of some input variables in registry: call mpas_pool_get_subpool(block % structs, 'tend', tend) + call mpas_pool_get_subpool(block % structs, 'tend_physics', tend_physics) call mpas_pool_get_subpool(block % structs, 'diag_physics', diag_physics) call mpas_pool_get_subpool(block % structs, 'diag_physics_noahmp', diag_physics_noahmp) call mpas_pool_get_subpool(block % structs, 'ngw_input', ngw_input) @@ -576,7 +578,7 @@ subroutine atm_mpas_init_block(dminfo, stream_manager, block, mesh, dt) call physics_run_init(block % configs, mesh, state, clock, stream_manager) !initialization of all physics: - call physics_init(dminfo, stream_manager, clock, block % configs, mesh, diag, tend, state, 1, & + call physics_init(dminfo, stream_manager, clock, block % configs, mesh, diag, tend, tend_physics, state, 1, & diag_physics, diag_physics_noahmp, ngw_input, atm_input, sfc_input, output_noahmp) endif #endif diff --git a/src/core_atmosphere/physics/mpas_atmphys_init.F b/src/core_atmosphere/physics/mpas_atmphys_init.F index 5e851ad923..5183f5a974 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_init.F +++ b/src/core_atmosphere/physics/mpas_atmphys_init.F @@ -73,13 +73,14 @@ module mpas_atmphys_init ! Laura D. Fowler (laura@ucar.edu) / 2024-02-14. ! * added call to subroutine init_lsm_noahmp to initialize the Noah-MP land surface scheme. ! Laura D. Fowler (laura@ucar.edu) / 2024-03-11. - +! * added initialization of the integer variable mp_top_level to the physics_init code. +! Bill Skamarock / 2025-10-17 contains !================================================================================================================= - subroutine physics_init(dminfo,stream_manager,clock,configs,mesh,diag,tend,state,time_lev,diag_physics, & + subroutine physics_init(dminfo,stream_manager,clock,configs,mesh,diag,tend,tend_physics,state,time_lev,diag_physics, & diag_physics_noahmp,ngw_input,atm_input,sfc_input,output_noahmp) !================================================================================================================= @@ -98,6 +99,7 @@ subroutine physics_init(dminfo,stream_manager,clock,configs,mesh,diag,tend,state type(mpas_pool_type),intent(inout):: state type(mpas_pool_type),intent(inout):: diag type(mpas_pool_type),intent(inout):: tend + type(mpas_pool_type),intent(inout):: tend_physics type(mpas_pool_type),intent(inout):: diag_physics type(mpas_pool_type),intent(inout):: diag_physics_noahmp type(mpas_pool_type),intent(inout):: ngw_input @@ -149,13 +151,16 @@ subroutine physics_init(dminfo,stream_manager,clock,configs,mesh,diag,tend,state integer,dimension(:),pointer:: jindx1_tau, jindx2_tau real(kind=RKIND),dimension(:),pointer:: ddy_j1tau, ddy_j2tau real(kind=RKIND),dimension(:),pointer:: latCell + real(kind=RKIND),pointer:: config_microphysics_top + integer,pointer:: mp_top_level !local variables and arrays: type(MPAS_Time_Type):: currTime logical:: init_done integer:: ierr,julday - integer:: iCell,iLag + integer:: iCell,iLag,k + real(kind=RKIND):: layer_height !----------------------------------------------------------------------------------------------------------------- !call mpas_log_write('') @@ -170,6 +175,7 @@ subroutine physics_init(dminfo,stream_manager,clock,configs,mesh,diag,tend,state call mpas_pool_get_config(configs,'config_sfclayer_scheme' ,config_sfclayer_scheme ) call mpas_pool_get_config(configs,'config_radt_lw_scheme' ,config_radt_lw_scheme ) call mpas_pool_get_config(configs,'config_radt_sw_scheme' ,config_radt_sw_scheme ) + call mpas_pool_get_config(configs,'config_microphysics_top' ,config_microphysics_top ) call mpas_pool_get_dimension(mesh,'nCellsSolve',nCellsSolve) call mpas_pool_get_dimension(mesh,'nLags' ,nLags ) @@ -237,6 +243,7 @@ subroutine physics_init(dminfo,stream_manager,clock,configs,mesh,diag,tend,state call mpas_pool_get_dimension(mesh,'nVertLevels',nVertLevels ) call mpas_pool_get_array(mesh,'rdzw' ,rdzw ) call mpas_pool_get_array(mesh,'dzu' ,dzu ) + call mpas_pool_get_array(tend_physics,'mp_top_level',mp_top_level) currTime = mpas_get_clock_time(clock,MPAS_NOW,ierr) call mpas_get_time(curr_time=currTime,DoY=julday,ierr=ierr) @@ -265,6 +272,17 @@ subroutine physics_init(dminfo,stream_manager,clock,configs,mesh,diag,tend,state enddo endif +! set the level above which microphysics tendencies will be ignored + mp_top_level = 0 + layer_height = 0.5/rdzw(1) + if(layer_height .le. config_microphysics_top) mp_top_level = 1 + do k=2,nVertLevels + layer_height = layer_height + dzu(k) + if(layer_height .le. config_microphysics_top) mp_top_level = k + end do + call mpas_log_write('physics init: config_microphysics_top and level $r $i ', & + realArgs=(/config_microphysics_top/),intArgs=(/mp_top_level/)) + !initialization of counters i_acsw* and i_aclw*. i_acsw* and i_aclw* track the number of times !the accumulated long and short-wave radiation fluxes exceed their prescribed theshold values. if(.not. config_do_restart) then diff --git a/src/core_atmosphere/physics/mpas_atmphys_interface.F b/src/core_atmosphere/physics/mpas_atmphys_interface.F index 71e46dfcd2..535819ffc8 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_interface.F +++ b/src/core_atmosphere/physics/mpas_atmphys_interface.F @@ -64,7 +64,8 @@ module mpas_atmphys_interface ! Laura D. Fowler (laura@ucar.edu) / 2016-04-11. ! * corrected the calculation of the surface pressure, mainly extrapolation of the air density to the surface. ! Laura D. Fowler (laura@ucar.edu) / 2016-04-25. - +! * changed microphysics update such that the microphsyics tendency is ignored above level mp_top_level +! Bill Skamarock / 2025/10/17 contains @@ -810,6 +811,7 @@ subroutine microphysics_to_MPAS(configs,mesh,state,time_lev,diag,diag_physics,te real(kind=RKIND),dimension(:,:),pointer :: rthmpten,rqvmpten,rqcmpten,rqrmpten,rqimpten,rqsmpten,rqgmpten real(kind=RKIND),dimension(:,:),pointer :: rncmpten,rnimpten,rnrmpten,rnifampten,rnwfampten real(kind=RKIND),dimension(:,:,:),pointer:: scalars + integer,pointer:: mp_top_level !local variables: integer:: icount @@ -823,6 +825,8 @@ subroutine microphysics_to_MPAS(configs,mesh,state,time_lev,diag,diag_physics,te call mpas_pool_get_array(mesh,'zz' ,zz ) call mpas_pool_get_array(mesh,'zgrid',zgrid) + call mpas_pool_get_array(tend_physics,'mp_top_level',mp_top_level) + call mpas_pool_get_array(diag,'exner' ,exner ) call mpas_pool_get_array(diag,'exner_base' ,exner_b ) call mpas_pool_get_array(diag,'pressure_base' ,pressure_b ) @@ -849,7 +853,7 @@ subroutine microphysics_to_MPAS(configs,mesh,state,time_lev,diag,diag_physics,te !update variables needed in the dynamical core: do j = jts,jte - do k = kts,kte + do k = kts,mp_top_level do i = its,ite !initializes tendency of coupled potential temperature potential temperature, and @@ -881,6 +885,18 @@ subroutine microphysics_to_MPAS(configs,mesh,state,time_lev,diag,diag_physics,te enddo enddo + ! no microphysics updates above mp_top_level + ! why are we not applying this to theta and qv? + if(kte .gt. mp_top_level) then + do i = its,ite + do k = mp_top_level+1,kte + qc(k,i) = 0. + qr(k,i) = 0. + rt_diabatic_tend(k,i) = 0. + end do + enddo + endif + !update surface pressure and calculates the surface pressure tendency: do j = jts,jte do i = its,ite @@ -917,7 +933,7 @@ subroutine microphysics_to_MPAS(configs,mesh,state,time_lev,diag,diag_physics,te call mpas_pool_get_array(diag_physics,'refl10cm',refl10cm) do j = jts,jte - do k = kts,kte + do k = kts,mp_top_level do i = its,ite qi(k,i) = qi_p(i,k,j) qs(k,i) = qs_p(i,k,j) @@ -932,6 +948,22 @@ subroutine microphysics_to_MPAS(configs,mesh,state,time_lev,diag,diag_physics,te enddo enddo + ! no microphysics updates above mp_top_level + if(kte .gt. mp_top_level) then + do i = its,ite + do k = mp_top_level+1,kte + qi(k,i) = 0. + qs(k,i) = 0. + qg(k,i) = 0. + rainprod(k,i) = 0. + evapprod(k,i) = 0. + re_cloud(k,i) = re_qc_bg + re_ice(k,i) = re_qi_bg + re_snow(k,i) = re_qs_bg + end do + end do + end if + mp2_select: select case(trim(mp_scheme)) case("mp_thompson","mp_thompson_aerosols") call mpas_pool_get_dimension(state,'index_ni',index_ni) @@ -993,8 +1025,8 @@ subroutine microphysics_to_MPAS(configs,mesh,state,time_lev,diag,diag_physics,te call mpas_pool_get_array(tend_physics,'rqsmpten',rqsmpten) call mpas_pool_get_array(tend_physics,'rqgmpten',rqgmpten) - do k = kts,kte do i = its,ite + do k = kts,mp_top_level rthmpten(k,i) = (theta_m(k,i)/(1._RKIND+R_v/R_d*max(0._RKIND,qv(k,i)))-rthmpten(k,i))/dt_dyn rqvmpten(k,i) = (qv(k,i)-rqvmpten(k,i))/dt_dyn rqcmpten(k,i) = (qc(k,i)-rqcmpten(k,i))/dt_dyn @@ -1005,6 +1037,21 @@ subroutine microphysics_to_MPAS(configs,mesh,state,time_lev,diag,diag_physics,te enddo enddo + ! no microphysics tendency above level mp_top_level + if(kte .gt. mp_top_level) then + do i = its, ite + do k = mp_top_level+1, kte + rthmpten(k,i) = 0. + rqvmpten(k,i) = 0. + rqcmpten(k,i) = 0. + rqrmpten(k,i) = 0. + rqimpten(k,i) = 0. + rqsmpten(k,i) = 0. + rqgmpten(k,i) = 0. + end do + end do + endif + mp2_tend_select: select case(trim(mp_scheme)) case("mp_thompson","mp_thompson_aerosols") call mpas_pool_get_array(tend_physics,'rnimpten',rnimpten)