module convect_shallow 4,7 !----------------------------------------------- ! ! Purpose: ! ! ! ! CAM interface to the shallow convection scheme ! ! ! ! Author: D.B. Coleman ! ! Sungsu Park. Jan. 2010. ! ! ! !----------------------------------------------- ! use shr_kind_mod, only : r8=>shr_kind_r8 use physconst, only : cpair, zvir use ppgrid, only : pver, pcols, pverp use zm_conv, only : zm_conv_evap use cam_history, only : outfld, addfld, add_default, phys_decomp use cam_logfile, only : iulog use phys_control, only : phys_getopts implicit none private save public :: & convect_shallow_register, & ! Register fields in physics buffer convect_shallow_init, & ! Initialize shallow module convect_shallow_tend, & ! Return tendencies convect_shallow_use_shfrc ! ! The following namelist variable controls which shallow convection package is used. ! 'Hack' = Hack shallow convection (default) ! 'UW' = UW shallow convection by Sungsu Park and Christopher S. Bretherton ! 'off' = No shallow convection character(len=16) :: shallow_scheme ! Default set in phys_control.F90, use namelist to change character(len=16) :: microp_scheme ! Microphysics scheme logical :: history_budget ! Output tendencies and state variables for CAM4 T, qv, ql, qi contains !=============================================================================== ! ! ! !=============================================================================== ! subroutine convect_shallow_register 1,10 !-------------------------------------------------- ! ! Purpose : Register fields with the physics buffer ! !-------------------------------------------------- ! use phys_buffer, only : pbuf_times, pbuf_add implicit none integer idx call phys_getopts( shallow_scheme_out = shallow_scheme, microp_scheme_out = microp_scheme ) call pbuf_add( 'ICWMRSH' , 'physpkg' , 1, pver, 1, idx ) call pbuf_add( 'RPRDSH' , 'physpkg' , 1, pver, 1, idx ) call pbuf_add( 'RPRDTOT' , 'physpkg' , 1, pver, 1, idx ) call pbuf_add( 'CLDTOP' , 'physpkg' , 1, 1, 1, idx ) call pbuf_add( 'CLDBOT' , 'physpkg' , 1, 1, 1, idx ) call pbuf_add( 'cush' , 'global' , 1, 1, pbuf_times, idx ) call pbuf_add( 'NEVAPR_SHCU', 'physpkg', 1, pver, 1, idx ) if( shallow_scheme .eq. 'UW' ) then call pbuf_add( 'shfrc' , 'physpkg' , 1, pver, 1, idx ) endif end subroutine convect_shallow_register !=============================================================================== ! ! ! !=============================================================================== ! subroutine convect_shallow_init(hypi) 1,75 !------------------------------------------------------------------------------- ! ! Purpose : Declare output fields, and initialize variables needed by convection ! !------------------------------------------------------------------------------- ! use cam_history, only : addfld, add_default, phys_decomp use ppgrid, only : pcols, pver use hk_conv, only : mfinti use uw_conv, only : init_uw_conv use uwshcu, only : init_uwshcu use physconst, only : rair, gravit, latvap, rhoh2o, rh2o, zvir, tmelt, & cappa, epsilo, latice, mwdry, mwh2o use pmgrid, only : plev, plevp use spmd_utils, only : masterproc use abortutils, only : endrun use phys_control, only : cam_physpkg_is implicit none real(r8), intent(in) :: hypi(plevp) ! Reference pressures at interfaces integer limcnv ! Top interface level limit for convection integer k character(len=16) :: eddy_scheme ! ------------------------------------------------- ! ! Variables for detailed abalysis of UW-ShCu scheme ! ! ------------------------------------------------- ! call addfld( 'qt_pre_Cu ', 'kg/kg' , pver , 'I' , 'qt_preCU' , phys_decomp ) call addfld( 'sl_pre_Cu ', 'J/kg' , pver , 'I' , 'sl_preCU' , phys_decomp ) call addfld( 'slv_pre_Cu ', 'J/kg' , pver , 'I' , 'slv_preCU' , phys_decomp ) call addfld( 'u_pre_Cu ', 'm/s' , pver , 'I' , 'u_preCU' , phys_decomp ) call addfld( 'v_pre_Cu ', 'm/s' , pver , 'I' , 'v_preCU' , phys_decomp ) call addfld( 'qv_pre_Cu ', 'kg/kg' , pver , 'I' , 'qv_preCU' , phys_decomp ) call addfld( 'ql_pre_Cu ', 'kg/kg' , pver , 'I' , 'ql_preCU' , phys_decomp ) call addfld( 'qi_pre_Cu ', 'kg/kg' , pver , 'I' , 'qi_preCU' , phys_decomp ) call addfld( 't_pre_Cu ', 'K' , pver , 'I' , 't_preCU' , phys_decomp ) call addfld( 'rh_pre_Cu ', '%' , pver , 'I' , 'rh_preCU' , phys_decomp ) call addfld( 'qt_aft_Cu ', 'kg/kg' , pver , 'I' , 'qt_afterCU' , phys_decomp ) call addfld( 'sl_aft_Cu ', 'J/kg' , pver , 'I' , 'sl_afterCU' , phys_decomp ) call addfld( 'slv_aft_Cu ', 'J/kg' , pver , 'I' , 'slv_afterCU' , phys_decomp ) call addfld( 'u_aft_Cu ', 'm/s' , pver , 'I' , 'u_afterCU' , phys_decomp ) call addfld( 'v_aft_Cu ', 'm/s' , pver , 'I' , 'v_afterCU' , phys_decomp ) call addfld( 'qv_aft_Cu ', 'kg/kg' , pver , 'I' , 'qv_afterCU' , phys_decomp ) call addfld( 'ql_aft_Cu ', 'kg/kg' , pver , 'I' , 'ql_afterCU' , phys_decomp ) call addfld( 'qi_aft_Cu ', 'kg/kg' , pver , 'I' , 'qi_afterCU' , phys_decomp ) call addfld( 't_aft_Cu ', 'K' , pver , 'I' , 't_afterCU' , phys_decomp ) call addfld( 'rh_aft_Cu ', '%' , pver , 'I' , 'rh_afterCU' , phys_decomp ) call addfld( 'tten_Cu ', 'K/s' , pver , 'I' , 'Temprtaure tendency by cumulus convection' , phys_decomp ) call addfld( 'rhten_Cu ', '%/s' , pver , 'I' , 'RH tendency by cumumus convection' , phys_decomp ) ! ------------------------------------------- ! ! Common Output for Shallow Convection Scheme ! ! ------------------------------------------- ! call addfld( 'CMFDT ' , 'K/s ', pver , 'A' , 'T tendency - shallow convection' , phys_decomp ) call addfld( 'CMFDQ ' , 'kg/kg/s ', pver , 'A' , 'QV tendency - shallow convection' , phys_decomp ) call addfld( 'CMFDLIQ ' , 'kg/kg/s ', pver , 'A' , 'Cloud liq tendency - shallow convection' , phys_decomp ) call addfld( 'CMFDICE ' , 'kg/kg/s ', pver , 'A' , 'Cloud ice tendency - shallow convection' , phys_decomp ) call addfld( 'CMFDQR ' , 'kg/kg/s ', pver , 'A' , 'Q tendency - shallow convection rainout' , phys_decomp ) call addfld( 'EVAPTCM ' , 'K/s ', pver , 'A' , 'T tendency - Evaporation/snow prod from Hack convection' , phys_decomp ) call addfld( 'FZSNTCM ' , 'K/s ', pver , 'A' , 'T tendency - Rain to snow conversion from Hack convection' , phys_decomp ) call addfld( 'EVSNTCM ' , 'K/s ', pver , 'A' , 'T tendency - Snow to rain prod from Hack convection' , phys_decomp ) call addfld( 'EVAPQCM ' , 'kg/kg/s ', pver , 'A' , 'Q tendency - Evaporation from Hack convection' , phys_decomp ) call addfld( 'QC ' , 'kg/kg/s ', pver , 'A' , 'Q tendency - shallow convection LW export' , phys_decomp ) call addfld( 'PRECSH ' , 'm/s ', 1, 'A' , 'Shallow Convection precipitation rate' , phys_decomp ) call addfld( 'CMFMC ' , 'kg/m2/s ', pverp, 'A' , 'Moist shallow convection mass flux' , phys_decomp ) call addfld( 'CMFSL ' , 'W/m2 ', pverp, 'A' , 'Moist shallow convection liquid water static energy flux' , phys_decomp ) call addfld( 'CMFLQ ' , 'W/m2 ', pverp, 'A' , 'Moist shallow convection total water flux' , phys_decomp ) call addfld( 'CIN ' , 'J/kg ', 1 , 'A' , 'Convective inhibition' , phys_decomp ) call addfld( 'CBMF ' , 'kg/m2/s ', 1 , 'A' , 'Cloud base mass flux' , phys_decomp ) call addfld( 'CLDTOP ' , '1 ', 1 , 'I' , 'Vertical index of cloud top' , phys_decomp ) call addfld( 'CLDBOT ' , '1 ', 1 , 'I' , 'Vertical index of cloud base' , phys_decomp ) call addfld( 'PCLDTOP ' , '1 ', 1 , 'A' , 'Pressure of cloud top' , phys_decomp ) call addfld( 'PCLDBOT ' , '1 ', 1 , 'A' , 'Pressure of cloud base' , phys_decomp ) call addfld( 'FREQSH ' , 'fraction', 1 , 'A' , 'Fractional occurance of shallow convection' , phys_decomp ) call addfld( 'HKFLXPRC' , 'kg/m2/s ', pverp, 'A' , 'Flux of precipitation from HK convection' , phys_decomp ) call addfld( 'HKFLXSNW' , 'kg/m2/s ', pverp, 'A' , 'Flux of snow from HK convection' , phys_decomp ) call addfld( 'HKNTPRPD' , 'kg/kg/s ', pver , 'A' , 'Net precipitation production from HK convection' , phys_decomp ) call addfld( 'HKNTSNPD' , 'kg/kg/s ', pver , 'A' , 'Net snow production from HK convection' , phys_decomp ) call addfld( 'HKEIHEAT' , 'W/kg' , pver , 'A' , 'Heating by ice and evaporation in HK convection' , phys_decomp ) call add_default( 'CMFDT ', 1, ' ' ) call add_default( 'CMFDQ ', 1, ' ' ) call add_default( 'CMFDQR ', 1, ' ' ) call add_default( 'QC ', 1, ' ' ) call add_default( 'PRECSH ', 1, ' ' ) call add_default( 'CMFMC ', 1, ' ' ) call add_default( 'FREQSH ', 1, ' ' ) call phys_getopts( eddy_scheme_out = eddy_scheme, history_budget_out = history_budget ) if( history_budget ) then call add_default( 'CMFDLIQ ', 1, ' ' ) call add_default( 'CMFDICE ', 1, ' ' ) if( cam_physpkg_is('cam3') .or. cam_physpkg_is('cam4') ) then call add_default( 'EVAPQCM ', 1, ' ' ) call add_default( 'EVAPTCM ', 1, ' ' ) end if end if select case (shallow_scheme) case('off') ! None if( masterproc ) write(iulog,*) 'convect_shallow_init: shallow convection OFF' continue case('Hack') ! Hack scheme if( masterproc ) write(iulog,*) 'convect_shallow_init: Hack shallow convection' ! Limit shallow convection to regions below 40 mb ! Note this calculation is repeated in the deep convection interface if( hypi(1) >= 4.e3_r8 ) then limcnv = 1 else do k = 1, plev if( hypi(k) < 4.e3_r8 .and. hypi(k+1) >= 4.e3_r8 ) then limcnv = k goto 10 end if end do limcnv = plevp end if 10 continue if( masterproc ) then write(iulog,*) 'MFINTI: Convection will be capped at intfc ', limcnv, ' which is ', hypi(limcnv), ' pascals' end if call mfinti( rair, cpair, gravit, latvap, rhoh2o, limcnv) ! Get args from inti.F90 case('UW') ! Park and Bretherton shallow convection scheme if( masterproc ) write(iulog,*) 'convect_shallow_init: UW shallow convection scheme (McCaa)' if( eddy_scheme .ne. 'diag_TKE' ) then write(iulog,*) 'ERROR: shallow convection scheme ', shallow_scheme, ' is incompatible with eddy scheme ', eddy_scheme call endrun( 'convect_shallow_init: shallow_scheme and eddy_scheme are incompatible' ) endif call init_uwshcu( r8, latvap, cpair, latice, zvir, rair, gravit, mwh2o/mwdry ) end select end subroutine convect_shallow_init !=============================================================================== ! ! ! !=============================================================================== ! function convect_shallow_use_shfrc() 2 !----------------------------------------------------------------------- ! ! Purpose: Return true cloud fraction should use shallow convection ! ! calculated convective clouds. ! ! convect_shallow_use_shfrc() = .true. for shallow_scheme = 'UW' ! ! convect_shallow_use_shfrc() = .false. for all other schemes ! ! ! ! Author: D. B. Coleman ! !----------------------------------------------------------------------- ! implicit none logical :: convect_shallow_use_shfrc ! Return value if ( shallow_scheme .eq. 'UW' ) then convect_shallow_use_shfrc = .true. else convect_shallow_use_shfrc = .false. endif return end function convect_shallow_use_shfrc !=============================================================================== ! ! ! !=============================================================================== ! subroutine convect_shallow_tend( ztodt , qpert , pblht , & 1,96 cmfmc , cmfmc2 , precc , & qc , qc2 , rliq , rliq2 , & snow , state , ptend_all, pbuf ) use cam_history, only : outfld use physics_types, only : physics_state, physics_ptend, physics_tend use physics_types, only : physics_ptend_init, physics_tend_init, physics_update use physics_types, only : physics_state_copy use physics_types, only : physics_ptend_sum use phys_buffer, only : pbuf_size_max, pbuf_fld, pbuf_old_tim_idx, pbuf_get_fld_idx use constituents, only : pcnst, cnst_get_ind, cnst_get_type_byind use hk_conv, only : cmfmca use uw_conv, only : compute_uw_conv use uwshcu, only : compute_uwshcu_inv use time_manager, only : get_nstep, is_first_step use wv_saturation, only : fqsatd, aqsat use physconst, only : latice, latvap, rhoh2o ! ---------------------- ! ! Input-Output Arguments ! ! ---------------------- ! type(physics_state), intent(in) :: state ! Physics state variables real(r8), intent(in) :: ztodt ! 2 delta-t [ s ] real(r8), intent(in) :: pblht(pcols) ! PBL height [ m ] type(physics_ptend), intent(out) :: ptend_all ! Indivdual parameterization tendencies real(r8), intent(out) :: cmfmc2(pcols,pverp) ! Updraft mass flux by shallow convection [ kg/s/m2 ] real(r8), intent(out) :: precc(pcols) ! Shallow convective precipitation (rain+snow) rate at surface [ m/s ] real(r8), intent(out) :: snow(pcols) ! Shallow convective snow rate at surface [ m/s ] real(r8), intent(out) :: rliq2(pcols) ! Vertically-integrated reserved cloud condensate [ m/s ] real(r8), intent(out) :: qc2(pcols,pver) ! Same as qc but only from shallow convection scheme type(pbuf_fld), intent(inout), dimension(pbuf_size_max) :: pbuf ! Physics buffer real(r8), intent(inout) :: qpert(pcols,pcnst) ! PBL perturbation specific humidity real(r8), intent(inout) :: cmfmc(pcols,pverp) ! Moist deep + shallow convection cloud mass flux [ kg/s/m2 ] real(r8), intent(inout) :: qc(pcols,pver) ! dq/dt due to export of cloud water into environment by shallow and deep convection [ kg/kg/s ] real(r8), intent(inout) :: rliq(pcols) ! Vertical integral of qc [ m/s ] ! --------------- ! ! Local Variables ! ! --------------- ! integer :: i, k, m integer :: n, x integer :: ilon ! Global longitude index of a column integer :: ilat ! Global latitude index of a column integer :: lchnk ! Chunk identifier integer :: ncol ! Number of atmospheric columns integer :: nstep ! Current time step index integer :: ixcldice, ixcldliq ! Constituent indices for cloud liquid and ice water. integer :: ixnumice, ixnumliq ! Constituent indices for cloud liquid and ice number concentration real(r8) :: ftem(pcols,pver) ! Temporary workspace for outfld variables real(r8) :: cnt2(pcols) ! Top level of shallow convective activity real(r8) :: cnb2(pcols) ! Bottom level of convective activity real(r8) :: tpert(pcols) ! PBL perturbation theta real(r8) :: ntprprd(pcols,pver) ! Net precip production in layer real(r8) :: ntsnprd(pcols,pver) ! Net snow production in layer real(r8) :: flxprec(pcols,pverp) ! Convective-scale flux of precip at interfaces [ kg/m2/s ] real(r8) :: flxsnow(pcols,pverp) ! Convective-scale flux of snow at interfaces [ kg/m2/s ] real(r8) :: tend_s_snwprd(pcols,pver) ! Heating rate of snow production real(r8) :: tend_s_snwevmlt(pcols,pver) ! Heating rate of evap/melting of snow real(r8) :: slflx(pcols,pverp) ! Shallow convective liquid water static energy flux real(r8) :: qtflx(pcols,pverp) ! Shallow convective total water flux real(r8) :: cmfdqs(pcols, pver) ! Shallow convective snow production real(r8) :: zero(pcols) ! Array of zeros real(r8) :: cbmf(pcols) ! Shallow cloud base mass flux [ kg/s/m2 ] real(r8) :: freqsh(pcols) ! Frequency of shallow convection occurence real(r8) :: pcnt(pcols) ! Top pressure level of shallow + deep convective activity real(r8) :: pcnb(pcols) ! Bottom pressure level of shallow + deep convective activity real(r8) :: cmfsl(pcols,pverp ) ! Convective flux of liquid water static energy real(r8) :: cmflq(pcols,pverp ) ! Convective flux of total water in energy unit real(r8) :: ftem_preCu(pcols,pver) ! Saturation vapor pressure after shallow Cu convection real(r8) :: tem2(pcols,pver) ! Saturation specific humidity and RH real(r8) :: t_preCu(pcols,pver) ! Temperature after shallow Cu convection real(r8) :: tten(pcols,pver) ! Temperature tendency after shallow Cu convection real(r8) :: rhten(pcols,pver) ! RH tendency after shallow Cu convection real(r8) :: iccmr_UW(pcols,pver) ! In-cloud Cumulus LWC+IWC [ kg/m2 ] real(r8) :: icwmr_UW(pcols,pver) ! In-cloud Cumulus LWC [ kg/m2 ] real(r8) :: icimr_UW(pcols,pver) ! In-cloud Cumulus IWC [ kg/m2 ] real(r8) :: ptend_tracer(pcols,pver,pcnst) ! Tendencies of tracers real(r8) :: sum1, sum2, sum3, pdelx real(r8), dimension(pcols,pver) :: sl, qt, slv real(r8), dimension(pcols,pver) :: sl_preCu, qt_preCu, slv_preCu type(physics_state) :: state1 ! Locally modify for evaporation to use, not returned type(physics_ptend) :: ptend_loc ! Local tendency from processes, added up to return as ptend_all type(physics_tend ) :: tend ! Physics tendencies ( empty, needed for physics_update call ) integer itim, ifld real(r8), pointer, dimension(:,:) :: cld real(r8), pointer, dimension(:,:) :: concld real(r8), pointer, dimension(:,:) :: icwmr ! In cloud water + ice mixing ratio real(r8), pointer, dimension(:,:) :: rprddp ! dq/dt due to deep convective rainout real(r8), pointer, dimension(:,:) :: rprdsh ! dq/dt due to deep and shallow convective rainout real(r8), pointer, dimension(:,:) :: evapcsh ! Evaporation of shallow convective precipitation >= 0. real(r8), pointer, dimension(:) :: cnt real(r8), pointer, dimension(:) :: cnb real(r8), pointer, dimension(:) :: cush real(r8), pointer, dimension(:,:) :: tke real(r8), pointer, dimension(:,:) :: shfrc ! ----------------------- ! ! Main Computation Begins ! ! ----------------------- ! zero = 0._r8 nstep = get_nstep() lchnk = state%lchnk ncol = state%ncol call physics_state_copy( state, state1 ) ! Copy state to local state1. call physics_ptend_init( ptend_loc ) ! Initialize local ptend type call physics_ptend_init( ptend_all ) ! Initialize output ptend type call physics_tend_init( tend ) ! Tendency type here is a null place holder ! Associate pointers with physics buffer fields itim = pbuf_old_tim_idx() ifld = pbuf_get_fld_idx('CLD') cld => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) itim = pbuf_old_tim_idx() ifld = pbuf_get_fld_idx('CONCLD') concld => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,itim) ifld = pbuf_get_fld_idx('ICWMRSH') icwmr => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ifld = pbuf_get_fld_idx('RPRDDP') rprddp => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ifld = pbuf_get_fld_idx('RPRDSH') rprdsh => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ifld = pbuf_get_fld_idx('NEVAPR_SHCU') evapcsh => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,lchnk,1) ifld = pbuf_get_fld_idx('CLDTOP') cnt => pbuf(ifld)%fld_ptr(1,1:pcols,1,lchnk,1) ifld = pbuf_get_fld_idx('CLDBOT') cnb => pbuf(ifld)%fld_ptr(1,1:pcols,1,lchnk,1) if( convect_shallow_use_shfrc() ) then ! Park-Bretherton UW Shallow Convection Schemes shfrc => pbuf(pbuf_get_fld_idx('shfrc'))%fld_ptr(1,1:pcols,1:pver,lchnk,1) endif ! Initialization tpert(:ncol) = 0._r8 qpert(:ncol,2:pcnst) = 0._r8 call cnst_get_ind( 'CLDLIQ', ixcldliq ) call cnst_get_ind( 'CLDICE', ixcldice ) select case (shallow_scheme) case('off') ! None cmfmc2 = 0._r8 ptend_loc%q = 0._r8 ptend_loc%s = 0._r8 rprdsh = 0._r8 rprddp = 0._r8 cmfdqs = 0._r8 precc = 0._r8 slflx = 0._r8 qtflx = 0._r8 icwmr = 0._r8 rliq2 = 0._r8 qc2 = 0._r8 cmfsl = 0._r8 cmflq = 0._r8 cnt2 = 0._r8 cnb2 = 0._r8 evapcsh = 0._r8 case('Hack') ! Hack scheme call cmfmca( lchnk , ncol , & nstep , ztodt , state%pmid , state%pdel , & state%rpdel , state%zm , tpert , qpert , state%phis , & pblht , state%t , state%q , ptend_loc%s , ptend_loc%q , & cmfmc2 , rprdsh , cmfsl , cmflq , precc , & qc2 , cnt2 , cnb2 , icwmr , rliq2 , & state%pmiddry, state%pdeldry, state%rpdeldry ) case('UW') ! UW shallow convection scheme cush => pbuf(pbuf_get_fld_idx('cush'))%fld_ptr(1,1:pcols,1,lchnk,itim) tke => pbuf(pbuf_get_fld_idx('tke'))%fld_ptr(1,1:pcols,1:pverp,lchnk,itim) if( nstep .le. 1 ) then cush(:) = 1.e3_r8 tke(:,:) = 0.01_r8 end if call compute_uwshcu_inv( pcols , pver , ncol , pcnst , ztodt , & state%pint, state%zi, state%pmid , state%zm , state%pdel , & state%u , state%v , state%q(:,:,1) , state%q(:,:,ixcldliq), state%q(:,:,ixcldice), & state%t , state%s , state%q(:,:,:) , & tke , cld , concld , pblht , cush , & cmfmc2 , slflx , qtflx , & ptend_loc%q(:,:,1) , ptend_loc%q(:,:,ixcldliq), ptend_loc%q(:,:,ixcldice), & ptend_loc%s , ptend_loc%u , ptend_loc%v , ptend_tracer , & rprdsh , cmfdqs , precc , snow , & evapcsh , shfrc , iccmr_UW , icwmr_UW , & icimr_UW , cbmf , qc2 , rliq2 , & cnt2 , cnb2 , fqsatd , lchnk , state%pdeldry ) ! --------------------------------------------------------------------- ! ! Here, 'rprdsh = qrten', 'cmfdqs = qsten' both in unit of [ kg/kg/s ] ! ! In addition, define 'icwmr' which includes both liquid and ice. ! ! --------------------------------------------------------------------- ! icwmr(:ncol,:) = iccmr_UW(:ncol,:) rprdsh(:ncol,:) = rprdsh(:ncol,:) + cmfdqs(:ncol,:) do m = 4, pcnst ptend_loc%q(:ncol,:pver,m) = ptend_tracer(:ncol,:pver,m) enddo ! Conservation check ! do i = 1, ncol ! do m = 1, pcnst ! sum1 = 0._r8 ! sum2 = 0._r8 ! sum3 = 0._r8 ! do k = 1, pver ! if(cnst_get_type_byind(m).eq.'wet') then ! pdelx = state%pdel(i,k) ! else ! pdelx = state%pdeldry(i,k) ! endif ! sum1 = sum1 + state%q(i,k,m)*pdelx ! sum2 = sum2 +(state%q(i,k,m)+ptend_loc%q(i,k,m)*ztodt)*pdelx ! sum3 = sum3 + ptend_loc%q(i,k,m)*pdelx ! enddo ! if( m .gt. 3 .and. abs(sum1) .gt. 1.e-13_r8 .and. abs(sum2-sum1)/sum1 .gt. 1.e-12_r8 ) then !! if( m .gt. 3 .and. abs(sum3) .gt. 1.e-13_r8 ) then ! write(iulog,*) 'Sungsu : convect_shallow.F90 does not conserve tracers : ', m, sum1, sum2, abs(sum2-sum1)/sum1 !! write(iulog,*) 'Sungsu : convect_shallow.F90 does not conserve tracers : ', m, sum3 ! endif ! enddo ! enddo ! ------------------------------------------------- ! ! Convective fluxes of 'sl' and 'qt' in energy unit ! ! ------------------------------------------------- ! cmfsl(:ncol,:pverp) = slflx(:ncol,:pverp) cmflq(:ncol,:pverp) = qtflx(:ncol,:pverp) * latvap ! -------------------------------------- ! ! uwshcu does momentum transport as well ! ! -------------------------------------- ! ptend_loc%lu = .TRUE. ptend_loc%lv = .TRUE. call outfld( 'PRECSH' , precc , pcols, lchnk ) end select ptend_loc%name = 'cmfmca' ptend_loc%ls = .TRUE. ptend_loc%lq(:) = .TRUE. ! --------------------------------------------------------! ! Calculate fractional occurance of shallow convection ! ! --------------------------------------------------------! ! Modification : I should check whether below computation of freqsh is correct. freqsh(:) = 0._r8 do i = 1, ncol if( maxval(cmfmc2(i,:pver)) <= 0._r8 ) then freqsh(i) = 1._r8 end if end do ! ------------------------------------------------------------------------------ ! ! Merge shallow convection output with prior results from deep convection scheme ! ! ------------------------------------------------------------------------------ ! ! ----------------------------------------------------------------------- ! ! Combine cumulus updraft mass flux : 'cmfmc2'(shallow) + 'cmfmc'(deep) ! ! ----------------------------------------------------------------------- ! cmfmc(:ncol,:pver) = cmfmc(:ncol,:pver) + cmfmc2(:ncol,:pver) ! -------------------------------------------------------------- ! ! 'cnt2' & 'cnb2' are from shallow, 'cnt' & 'cnb' are from deep ! ! 'cnt2' & 'cnb2' are the interface indices of cloud top & base: ! ! cnt2 = float(kpen) ! ! cnb2 = float(krel - 1) ! ! Note that indices decreases with height. ! ! -------------------------------------------------------------- ! do i = 1, ncol if( cnt2(i) < cnt(i)) cnt(i) = cnt2(i) if( cnb2(i) > cnb(i)) cnb(i) = cnb2(i) pcnt(i) = state%pmid(i,cnt(i)) pcnb(i) = state%pmid(i,cnb(i)) end do ! ----------------------------------------------- ! ! This quantity was previously known as CMFDQR. ! ! Now CMFDQR is the shallow rain production only. ! ! ----------------------------------------------- ! ifld = pbuf_get_fld_idx( 'RPRDTOT' ) pbuf(ifld)%fld_ptr(1,1:ncol,1:pver,lchnk,1) = rprdsh(:ncol,:pver) + rprddp(:ncol,:pver) ! ----------------------------------------------------------------------- ! ! Add shallow reserved cloud condensate to deep reserved cloud condensate ! ! qc [ kg/kg/s] , rliq [ m/s ] ! ! ----------------------------------------------------------------------- ! qc(:ncol,:pver) = qc(:ncol,:pver) + qc2(:ncol,:pver) rliq(:ncol) = rliq(:ncol) + rliq2(:ncol) ! ---------------------------------------------------------------------------- ! ! Output new partition of cloud condensate variables, as well as precipitation ! ! ---------------------------------------------------------------------------- ! if( microp_scheme .eq. 'MG' ) then call cnst_get_ind( 'NUMLIQ', ixnumliq ) call cnst_get_ind( 'NUMICE', ixnumice ) endif ftem(:ncol,:pver) = ptend_loc%s(:ncol,:pver)/cpair call outfld( 'CMFDT ', ftem , pcols , lchnk ) call outfld( 'CMFDQ ', ptend_loc%q(1,1,1) , pcols , lchnk ) call outfld( 'CMFDICE', ptend_loc%q(1,1,ixcldice) , pcols , lchnk ) call outfld( 'CMFDLIQ', ptend_loc%q(1,1,ixcldliq) , pcols , lchnk ) call outfld( 'CMFMC' , cmfmc , pcols , lchnk ) call outfld( 'QC' , qc2 , pcols , lchnk ) call outfld( 'CMFDQR' , rprdsh , pcols , lchnk ) call outfld( 'CMFSL' , cmfsl , pcols , lchnk ) call outfld( 'CMFLQ' , cmflq , pcols , lchnk ) call outfld( 'DQP' , qc2 , pcols , lchnk ) call outfld( 'CBMF' , cbmf , pcols , lchnk ) call outfld( 'CLDTOP' , cnt , pcols , lchnk ) call outfld( 'CLDBOT' , cnb , pcols , lchnk ) call outfld( 'PCLDTOP', pcnt , pcols , lchnk ) call outfld( 'PCLDBOT', pcnb , pcols , lchnk ) call outfld( 'FREQSH' , freqsh , pcols , lchnk ) ! ---------------------------------------------------------------- ! ! Add tendency from this process to tend from other processes here ! ! ---------------------------------------------------------------- ! call physics_ptend_sum( ptend_loc, ptend_all, state ) ! ----------------------------------------------------------------------------- ! ! For diagnostic purpose, print out 'QT,SL,SLV,T,RH' just before cumulus scheme ! ! ----------------------------------------------------------------------------- ! sl_preCu(:ncol,:pver) = state1%s(:ncol,:pver) - latvap * state1%q(:ncol,:pver,ixcldliq) & - ( latvap + latice) * state1%q(:ncol,:pver,ixcldice) qt_preCu(:ncol,:pver) = state1%q(:ncol,:pver,1) + state1%q(:ncol,:pver,ixcldliq) & + state1%q(:ncol,:pver,ixcldice) slv_preCu(:ncol,:pver) = sl_preCu(:ncol,:pver) * ( 1._r8 + zvir * qt_preCu(:ncol,:pver) ) t_preCu(:ncol,:) = state1%t(:ncol,:pver) call aqsat( state1%t, state1%pmid, tem2, ftem, pcols, ncol, pver, 1, pver ) ftem_preCu(:ncol,:) = state1%q(:ncol,:,1) / ftem(:ncol,:) * 100._r8 call outfld( 'qt_pre_Cu ', qt_preCu , pcols, lchnk ) call outfld( 'sl_pre_Cu ', sl_preCu , pcols, lchnk ) call outfld( 'slv_pre_Cu ', slv_preCu , pcols, lchnk ) call outfld( 'u_pre_Cu ', state1%u , pcols, lchnk ) call outfld( 'v_pre_Cu ', state1%v , pcols, lchnk ) call outfld( 'qv_pre_Cu ', state1%q(:ncol,:pver,1) , pcols, lchnk ) call outfld( 'ql_pre_Cu ', state1%q(:ncol,:pver,ixcldliq) , pcols, lchnk ) call outfld( 'qi_pre_Cu ', state1%q(:ncol,:pver,ixcldice) , pcols, lchnk ) call outfld( 't_pre_Cu ', state1%t , pcols, lchnk ) call outfld( 'rh_pre_Cu ', ftem_preCu , pcols, lchnk ) ! ----------------------------------------------- ! ! Update physics state type state1 with ptend_loc ! ! ----------------------------------------------- ! call physics_update( state1, tend, ptend_loc, ztodt ) ! ----------------------------------------------------------------------------- ! ! For diagnostic purpose, print out 'QT,SL,SLV,t,RH' just after cumulus scheme ! ! ----------------------------------------------------------------------------- ! sl(:ncol,:pver) = state1%s(:ncol,:pver) - latvap * state1%q(:ncol,:pver,ixcldliq) & - ( latvap + latice) * state1%q(:ncol,:pver,ixcldice) qt(:ncol,:pver) = state1%q(:ncol,:pver,1) + state1%q(:ncol,:pver,ixcldliq) & + state1%q(:ncol,:pver,ixcldice) slv(:ncol,:pver) = sl(:ncol,:pver) * ( 1._r8 + zvir * qt(:ncol,:pver) ) call aqsat( state1%t, state1%pmid, tem2, ftem, pcols, ncol, pver, 1, pver ) ftem(:ncol,:) = state1%q(:ncol,:,1) / ftem(:ncol,:) * 100._r8 call outfld( 'qt_aft_Cu ', qt , pcols, lchnk ) call outfld( 'sl_aft_Cu ', sl , pcols, lchnk ) call outfld( 'slv_aft_Cu ', slv , pcols, lchnk ) call outfld( 'u_aft_Cu ', state1%u , pcols, lchnk ) call outfld( 'v_aft_Cu ', state1%v , pcols, lchnk ) call outfld( 'qv_aft_Cu ', state1%q(:ncol,:pver,1) , pcols, lchnk ) call outfld( 'ql_aft_Cu ', state1%q(:ncol,:pver,ixcldliq) , pcols, lchnk ) call outfld( 'qi_aft_Cu ', state1%q(:ncol,:pver,ixcldice) , pcols, lchnk ) call outfld( 't_aft_Cu ', state1%t , pcols, lchnk ) call outfld( 'rh_aft_Cu ', ftem , pcols, lchnk ) tten(:ncol,:) = ( state1%t(:ncol,:pver) - t_preCu(:ncol,:) ) / ztodt rhten(:ncol,:) = ( ftem(:ncol,:) - ftem_preCu(:ncol,:) ) / ztodt call outfld( 'tten_Cu ', tten , pcols, lchnk ) call outfld( 'rhten_Cu ', rhten , pcols, lchnk ) ! --------------------------------- ! ! initialize ptend for next process ! ! --------------------------------- ! call physics_ptend_init(ptend_loc) ! ------------------------------------------------------------------------ ! ! UW-Shallow Cumulus scheme includes ! ! evaporation physics inside in it. So when 'shallow_scheme = UW', we must ! ! NOT perform below 'zm_conv_evap'. ! ! ------------------------------------------------------------------------ ! if( shallow_scheme .eq. 'Hack' ) then ! ------------------------------------------------------------------------------- ! ! Determine the phase of the precipitation produced and add latent heat of fusion ! ! Evaporate some of the precip directly into the environment (Sundqvist) ! ! Allow this to use the updated state1 and a fresh ptend_loc type ! ! Heating and specific humidity tendencies produced ! ! ------------------------------------------------------------------------------- ! ptend_loc%name = 'zm_conv_evap' ptend_loc%ls = .TRUE. ptend_loc%lq(1) = .TRUE. call zm_conv_evap( state1%ncol, state1%lchnk, & state1%t, state1%pmid, state1%pdel, state1%q(:pcols,:pver,1), & ptend_loc%s, tend_s_snwprd, tend_s_snwevmlt, & ptend_loc%q(:pcols,:pver,1), & rprdsh, cld, ztodt, & precc, snow, ntprprd, ntsnprd , flxprec, flxsnow ) ! ------------------------------------------ ! ! record history variables from zm_conv_evap ! ! ------------------------------------------ ! evapcsh(:ncol,:pver) = ptend_loc%q(:ncol,:pver,1) ftem(:ncol,:pver) = ptend_loc%s(:ncol,:pver) / cpair call outfld( 'EVAPTCM ' , ftem , pcols, lchnk ) ftem(:ncol,:pver) = tend_s_snwprd(:ncol,:pver) / cpair call outfld( 'FZSNTCM ' , ftem , pcols, lchnk ) ftem(:ncol,:pver) = tend_s_snwevmlt(:ncol,:pver) / cpair call outfld( 'EVSNTCM ' , ftem , pcols, lchnk ) call outfld( 'EVAPQCM ' , ptend_loc%q(1,1,1) , pcols, lchnk ) call outfld( 'PRECSH ' , precc , pcols, lchnk ) call outfld( 'HKFLXPRC' , flxprec , pcols, lchnk ) call outfld( 'HKFLXSNW' , flxsnow , pcols, lchnk ) call outfld( 'HKNTPRPD' , ntprprd , pcols, lchnk ) call outfld( 'HKNTSNPD' , ntsnprd , pcols, lchnk ) call outfld( 'HKEIHEAT' , ptend_loc%s , pcols, lchnk ) ! ---------------------------------------------------------------- ! ! Add tendency from this process to tend from other processes here ! ! ---------------------------------------------------------------- ! call physics_ptend_sum( ptend_loc, ptend_all, state ) ! -------------------------------------------- ! ! Do not perform evaporation process for UW-Cu ! ! -------------------------------------------- ! end if ! ------------------------------------------------------------- ! ! Update name of parameterization tendencies to send to tphysbc ! ! ------------------------------------------------------------- ! ptend_all%name = 'convect_shallow' end subroutine convect_shallow_tend end module convect_shallow