LCOV - code coverage report
Current view: | top level - physics/cam - zm_conv_intr.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 364 | 421 | 86.5 %
Date: | 2024-12-17 22:39:59 |  | Functions: | 5 | 5 | 100.0 %

              Line data    Source code
           1             : module zm_conv_intr
           2             : !---------------------------------------------------------------------------------
           3             : ! Purpose:
           4             : !
           5             : ! CAM interface to the Zhang-McFarlane deep convection scheme
           6             : !
           7             : ! Author: D.B. Coleman
           8             : ! January 2010 modified by J. Kay to add COSP simulator fields to physics buffer
           9             : !---------------------------------------------------------------------------------
          10             :    use shr_kind_mod, only: r8=>shr_kind_r8
          11             :    use physconst,    only: cpair, epsilo, gravit, latvap, tmelt, rair
          12             :    use ppgrid,       only: pver, pcols, pverp, begchunk, endchunk
          13             :    use zm_conv_evap,         only: zm_conv_evap_run
          14             :    use zm_convr,             only: zm_convr_init, zm_convr_run
          15             :    use zm_conv_convtran,     only: zm_conv_convtran_run
          16             :    use zm_conv_momtran,      only: zm_conv_momtran_run
          17             :
          18             :    use rad_constituents, only: rad_cnst_get_info, rad_cnst_get_mode_num, rad_cnst_get_aer_mmr, &
          19             :                                rad_cnst_get_aer_props, rad_cnst_get_mode_props !, &
          20             :    use cam_abortutils,   only: endrun
          21             :    use physconst,        only: pi
          22             :    use spmd_utils,       only: masterproc
          23             :    use perf_mod
          24             :    use cam_logfile,  only: iulog
          25             :    use constituents, only: cnst_add
          26             :
          27             :    implicit none
          28             :    private
          29             :    save
          30             :
          31             :    ! Public methods
          32             :
          33             :    public ::&
          34             :       zm_conv_register,           &! register fields in physics buffer
          35             :       zm_conv_readnl,             &! read namelist
          36             :       zm_conv_init,               &! initialize donner_deep module
          37             :       zm_conv_tend,               &! return tendencies
          38             :       zm_conv_tend_2               ! return tendencies
          39             :
          40             :    public zmconv_ke, zmconv_ke_lnd,  zmconv_org  ! needed by convect_shallow
          41             :
          42             :    integer ::& ! indices for fields in the physics buffer
          43             :       zm_mu_idx,      &
          44             :       zm_eu_idx,      &
          45             :       zm_du_idx,      &
          46             :       zm_md_idx,      &
          47             :       zm_ed_idx,      &
          48             :       zm_dp_idx,      &
          49             :       zm_dsubcld_idx, &
          50             :       zm_jt_idx,      &
          51             :       zm_maxg_idx,    &
          52             :       zm_ideep_idx,   &
          53             :       dp_flxprc_idx, &
          54             :       dp_flxsnw_idx, &
          55             :       ixorg,       &
          56             :       dlfzm_idx,     &     ! detrained convective cloud water mixing ratio.
          57             :       difzm_idx,     &     ! detrained convective cloud ice mixing ratio.
          58             :       dnlfzm_idx,    &     ! detrained convective cloud water num concen.
          59             :       dnifzm_idx,    &     ! detrained convective cloud ice num concen.
          60             :       prec_dp_idx,   &
          61             :       snow_dp_idx,   &
          62             :       mconzm_idx           ! convective mass flux
          63             :
          64             :    real(r8), parameter :: unset_r8 = huge(1.0_r8)
          65             :    real(r8) :: zmconv_c0_lnd = unset_r8
          66             :    real(r8) :: zmconv_c0_ocn = unset_r8
          67             :    real(r8) :: zmconv_ke     = unset_r8
          68             :    real(r8) :: zmconv_ke_lnd = unset_r8
          69             :    real(r8) :: zmconv_momcu  = unset_r8
          70             :    real(r8) :: zmconv_momcd  = unset_r8
          71             :    integer  :: zmconv_num_cin            ! Number of negative buoyancy regions that are allowed
          72             :                                          ! before the convection top and CAPE calculations are completed.
          73             :    logical  :: zmconv_org                ! Parameterization for sub-grid scale convective organization for the ZM deep
          74             :                                          ! convective scheme based on Mapes and Neale (2011)
          75             :    real(r8) :: zmconv_dmpdz = unset_r8        ! Parcel fractional mass entrainment rate
          76             :    real(r8) :: zmconv_tiedke_add = unset_r8   ! Convective parcel temperature perturbation
          77             :    real(r8) :: zmconv_capelmt = unset_r8      ! Triggering thereshold for ZM convection
          78             :    logical  :: zmconv_parcel_pbl = .false.             ! switch for parcel pbl calculation
          79             :    real(r8) :: zmconv_tau = unset_r8          ! Timescale for convection
          80             :
          81             :
          82             : !  indices for fields in the physics buffer
          83             :    integer  ::    cld_idx          = 0
          84             :    integer  ::    icwmrdp_idx      = 0
          85             :    integer  ::    rprddp_idx       = 0
          86             :    integer  ::    fracis_idx       = 0
          87             :    integer  ::    nevapr_dpcu_idx  = 0
          88             :    integer  ::    dgnum_idx        = 0
          89             :
          90             :    integer :: nmodes
          91             :    integer :: nbulk
          92             :
          93             : !=========================================================================================
          94             : contains
          95             : !=========================================================================================
          96             :
          97     1490712 : subroutine zm_conv_register
          98             :
          99             : !----------------------------------------
         100             : ! Purpose: register fields with the physics buffer
         101             : !----------------------------------------
         102             :
         103             :   use physics_buffer, only : pbuf_add_field, dtype_r8, dtype_i4
         104             :
         105             :   implicit none
         106             :
         107             :   integer idx
         108             :
         109        1536 :    call pbuf_add_field('ZM_MU', 'physpkg', dtype_r8, (/pcols,pver/), zm_mu_idx)
         110        1536 :    call pbuf_add_field('ZM_EU', 'physpkg', dtype_r8, (/pcols,pver/), zm_eu_idx)
         111        1536 :    call pbuf_add_field('ZM_DU', 'physpkg', dtype_r8, (/pcols,pver/), zm_du_idx)
         112        1536 :    call pbuf_add_field('ZM_MD', 'physpkg', dtype_r8, (/pcols,pver/), zm_md_idx)
         113        1536 :    call pbuf_add_field('ZM_ED', 'physpkg', dtype_r8, (/pcols,pver/), zm_ed_idx)
         114             :
         115             :    ! wg layer thickness in mbs (between upper/lower interface).
         116        1536 :    call pbuf_add_field('ZM_DP', 'physpkg', dtype_r8, (/pcols,pver/), zm_dp_idx)
         117             :
         118             :    ! wg layer thickness in mbs between lcl and maxi.
         119        1536 :    call pbuf_add_field('ZM_DSUBCLD', 'physpkg', dtype_r8, (/pcols/), zm_dsubcld_idx)
         120             :
         121             :    ! wg top level index of deep cumulus convection.
         122        1536 :    call pbuf_add_field('ZM_JT', 'physpkg', dtype_i4, (/pcols/), zm_jt_idx)
         123             :
         124             :    ! wg gathered values of maxi.
         125        1536 :    call pbuf_add_field('ZM_MAXG', 'physpkg', dtype_i4, (/pcols/), zm_maxg_idx)
         126             :
         127             :    ! map gathered points to chunk index
         128        1536 :    call pbuf_add_field('ZM_IDEEP', 'physpkg', dtype_i4, (/pcols/), zm_ideep_idx)
         129             :
         130             : ! Flux of precipitation from deep convection (kg/m2/s)
         131        1536 :    call pbuf_add_field('DP_FLXPRC','global',dtype_r8,(/pcols,pverp/),dp_flxprc_idx)
         132             :
         133             : ! Flux of snow from deep convection (kg/m2/s)
         134        1536 :    call pbuf_add_field('DP_FLXSNW','global',dtype_r8,(/pcols,pverp/),dp_flxsnw_idx)
         135             :
         136        1536 :    call pbuf_add_field('ICWMRDP',    'physpkg',dtype_r8,(/pcols,pver/),icwmrdp_idx)
         137        1536 :    call pbuf_add_field('RPRDDP',     'physpkg',dtype_r8,(/pcols,pver/),rprddp_idx)
         138        1536 :    call pbuf_add_field('NEVAPR_DPCU','physpkg',dtype_r8,(/pcols,pver/),nevapr_dpcu_idx)
         139        1536 :    call pbuf_add_field('PREC_DP',    'physpkg',dtype_r8,(/pcols/),     prec_dp_idx)
         140        1536 :    call pbuf_add_field('SNOW_DP',    'physpkg',dtype_r8,(/pcols/),     snow_dp_idx)
         141             :
         142             :    ! detrained convective cloud water mixing ratio.
         143        1536 :    call pbuf_add_field('DLFZM', 'physpkg', dtype_r8, (/pcols,pver/), dlfzm_idx)
         144             :    ! detrained convective cloud ice mixing ratio.
         145        1536 :    call pbuf_add_field('DIFZM', 'physpkg', dtype_r8, (/pcols,pver/), difzm_idx)
         146             :    ! convective mass fluxes
         147        1536 :    call pbuf_add_field('CMFMC_DP', 'physpkg', dtype_r8, (/pcols,pverp/), mconzm_idx)
         148             :
         149             : !CACNOTE - Is zm_org really a constituent or was it just a handy structure to use for an allocatable which persists in the run?
         150        1536 :    if (zmconv_org) then
         151           0 :       call cnst_add('ZM_ORG',0._r8,0._r8,0._r8,ixorg,longname='organization parameter')
         152             :    endif
         153             :
         154        1536 : end subroutine zm_conv_register
         155             :
         156             : !=========================================================================================
         157             :
         158        1536 : subroutine zm_conv_readnl(nlfile)
         159             :
         160        1536 :    use spmd_utils,      only: mpicom, masterproc, masterprocid, mpi_real8, mpi_integer, mpi_logical
         161             :    use namelist_utils,  only: find_group_name
         162             :    use units,           only: getunit, freeunit
         163             :
         164             :    character(len=*), intent(in) :: nlfile  ! filepath for file containing namelist input
         165             :
         166             :    ! Local variables
         167             :    integer :: unitn, ierr
         168             :    character(len=*), parameter :: subname = 'zm_conv_readnl'
         169             :
         170             :    namelist /zmconv_nl/ zmconv_c0_lnd, zmconv_c0_ocn, zmconv_num_cin, &
         171             :                         zmconv_ke, zmconv_ke_lnd, zmconv_org, &
         172             :                         zmconv_momcu, zmconv_momcd, &
         173             :                         zmconv_dmpdz, zmconv_tiedke_add, zmconv_capelmt, &
         174             :                         zmconv_parcel_pbl, zmconv_tau
         175             :    !-----------------------------------------------------------------------------
         176             :
         177        1536 :    if (masterproc) then
         178           2 :       unitn = getunit()
         179           2 :       open( unitn, file=trim(nlfile), status='old' )
         180           2 :       call find_group_name(unitn, 'zmconv_nl', status=ierr)
         181           2 :       if (ierr == 0) then
         182           2 :          read(unitn, zmconv_nl, iostat=ierr)
         183           2 :          if (ierr /= 0) then
         184           0 :             call endrun(subname // ':: ERROR reading namelist')
         185             :          end if
         186             :       end if
         187           2 :       close(unitn)
         188           2 :       call freeunit(unitn)
         189             :
         190             :    end if
         191             :
         192             :    ! Broadcast namelist variables
         193        1536 :    call mpi_bcast(zmconv_num_cin,           1, mpi_integer, masterprocid, mpicom, ierr)
         194        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_num_cin")
         195        1536 :    call mpi_bcast(zmconv_c0_lnd,            1, mpi_real8,   masterprocid, mpicom, ierr)
         196        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_c0_lnd")
         197        1536 :    call mpi_bcast(zmconv_c0_ocn,            1, mpi_real8,   masterprocid, mpicom, ierr)
         198        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_c0_ocn")
         199        1536 :    call mpi_bcast(zmconv_ke,                1, mpi_real8,   masterprocid, mpicom, ierr)
         200        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_ke")
         201        1536 :    call mpi_bcast(zmconv_ke_lnd,            1, mpi_real8,   masterprocid, mpicom, ierr)
         202        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_ke_lnd")
         203        1536 :    call mpi_bcast(zmconv_momcu,             1, mpi_real8,   masterprocid, mpicom, ierr)
         204        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_momcu")
         205        1536 :    call mpi_bcast(zmconv_momcd,             1, mpi_real8,   masterprocid, mpicom, ierr)
         206        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_momcd")
         207        1536 :    call mpi_bcast(zmconv_org,               1, mpi_logical, masterprocid, mpicom, ierr)
         208        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_org")
         209        1536 :    call mpi_bcast(zmconv_dmpdz,             1, mpi_real8, masterprocid, mpicom, ierr)
         210        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_dmpdz")
         211        1536 :    call mpi_bcast(zmconv_tiedke_add,        1, mpi_real8, masterprocid, mpicom, ierr)
         212        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_tiedke_add")
         213        1536 :    call mpi_bcast(zmconv_capelmt,           1, mpi_real8, masterprocid, mpicom, ierr)
         214        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_capelmt")
         215        1536 :    call mpi_bcast(zmconv_parcel_pbl,        1, mpi_logical, masterprocid, mpicom, ierr)
         216        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_parcel_pbl")
         217        1536 :    call mpi_bcast(zmconv_tau,               1, mpi_real8, masterprocid, mpicom, ierr)
         218        1536 :    if (ierr /= 0) call endrun("zm_conv_readnl: FATAL: mpi_bcast: zmconv_tau")
         219             :
         220        1536 : end subroutine zm_conv_readnl
         221             :
         222             : !=========================================================================================
         223             :
         224        1536 : subroutine zm_conv_init(pref_edge)
         225             :
         226             : !----------------------------------------
         227             : ! Purpose:  declare output fields, initialize variables needed by convection
         228             : !----------------------------------------
         229             :
         230             :   use cam_history,    only: addfld, add_default, horiz_only
         231             :   use ppgrid,         only: pcols, pver
         232             :   use zm_convr,       only: zm_convr_init
         233             :   use pmgrid,         only: plev,plevp
         234             :   use spmd_utils,     only: masterproc
         235             :   use phys_control,   only: phys_deepconv_pbl, phys_getopts, cam_physpkg_is
         236             :   use physics_buffer, only: pbuf_get_index
         237             :
         238             :   implicit none
         239             :
         240             :   real(r8),intent(in) :: pref_edge(plevp)        ! reference pressures at interfaces
         241             :
         242             :   ! local variables
         243             :   real(r8), parameter :: scale_height = 7000._r8  ! std atm scale height (m)
         244             :   real(r8), parameter :: dz_min = 100._r8         ! minimum thickness for using
         245             :                                                   !   zmconv_parcel_pbl=.false.
         246             :   real(r8)            :: dz_bot_layer             ! thickness of bottom layer (m)
         247             :
         248             :   character(len=512) :: errmsg
         249             :   integer            :: errflg
         250             :
         251             :   logical :: no_deep_pbl    ! if true, no deep convection in PBL
         252             :   integer  limcnv           ! top interface level limit for convection
         253             :   integer k, istat
         254             :   logical :: history_budget ! output tendencies and state variables for CAM4
         255             :                             ! temperature, water vapor, cloud ice and cloud
         256             :                             ! liquid budgets.
         257             :   integer :: history_budget_histfile_num ! output history file number for budget fields
         258             :
         259             : !
         260             : ! Register fields with the output buffer
         261             : !
         262             :
         263        1536 :     if (zmconv_org) then
         264           0 :        call addfld ('ZM_ORG     ', (/ 'lev' /), 'A', '-       ','Organization parameter')
         265           0 :        call addfld ('ZM_ORG2D   ', (/ 'lev' /), 'A', '-       ','Organization parameter 2D')
         266             :     endif
         267        1536 :     call addfld ('PRECZ',    horiz_only,   'A', 'm/s','total precipitation from ZM convection')
         268        3072 :     call addfld ('ZMDT',     (/ 'lev' /),  'A', 'K/s','T tendency - Zhang-McFarlane moist convection')
         269        3072 :     call addfld ('ZMDQ',     (/ 'lev' /),  'A', 'kg/kg/s','Q tendency - Zhang-McFarlane moist convection')
         270        3072 :     call addfld ('ZMDICE',   (/ 'lev' /),  'A', 'kg/kg/s','Cloud ice tendency - Zhang-McFarlane convection')
         271        3072 :     call addfld ('ZMDLIQ',   (/ 'lev' /),  'A', 'kg/kg/s','Cloud liq tendency - Zhang-McFarlane convection')
         272        3072 :     call addfld ('EVAPTZM',  (/ 'lev' /),  'A', 'K/s','T tendency - Evaporation/snow prod from Zhang convection')
         273        3072 :     call addfld ('FZSNTZM',  (/ 'lev' /),  'A', 'K/s','T tendency - Rain to snow conversion from Zhang convection')
         274        3072 :     call addfld ('EVSNTZM',  (/ 'lev' /),  'A', 'K/s','T tendency - Snow to rain prod from Zhang convection')
         275        3072 :     call addfld ('EVAPQZM',  (/ 'lev' /),  'A', 'kg/kg/s','Q tendency - Evaporation from Zhang-McFarlane moist convection')
         276             :
         277        3072 :     call addfld ('ZMFLXPRC', (/ 'ilev' /), 'A', 'kg/m2/s','Flux of precipitation from ZM convection'       )
         278        3072 :     call addfld ('ZMFLXSNW', (/ 'ilev' /), 'A', 'kg/m2/s','Flux of snow from ZM convection'                )
         279        3072 :     call addfld ('ZMNTPRPD', (/ 'lev' /) , 'A', 'kg/kg/s','Net precipitation production from ZM convection')
         280        3072 :     call addfld ('ZMNTSNPD', (/ 'lev' /) , 'A', 'kg/kg/s','Net snow production from ZM convection'         )
         281        3072 :     call addfld ('ZMEIHEAT', (/ 'lev' /) , 'A', 'W/kg'   ,'Heating by ice and evaporation in ZM convection')
         282             :
         283        3072 :     call addfld ('CMFMC_DP', (/ 'ilev' /), 'A', 'kg/m2/s','Convection mass flux from ZM deep ')
         284        1536 :     call addfld ('PRECCDZM', horiz_only,   'A', 'm/s','Convective precipitation rate from ZM deep')
         285             :
         286        1536 :     call addfld ('PCONVB',   horiz_only ,  'A', 'Pa'    ,'convection base pressure')
         287        1536 :     call addfld ('PCONVT',   horiz_only ,  'A', 'Pa'    ,'convection top  pressure')
         288             :
         289        1536 :     call addfld ('CAPE',     horiz_only,   'A', 'J/kg', 'Convectively available potential energy')
         290        1536 :     call addfld ('FREQZM',   horiz_only  , 'A', 'fraction', 'Fractional occurance of ZM convection')
         291             :
         292        3072 :     call addfld ('ZMMTT',    (/ 'lev' /),  'A', 'K/s', 'T tendency - ZM convective momentum transport')
         293        3072 :     call addfld ('ZMMTU',    (/ 'lev' /),  'A', 'm/s2', 'U tendency - ZM convective momentum transport')
         294        3072 :     call addfld ('ZMMTV',    (/ 'lev' /),  'A', 'm/s2', 'V tendency - ZM convective momentum transport')
         295             :
         296        3072 :     call addfld ('ZMMU',     (/ 'lev' /),  'A', 'kg/m2/s', 'ZM convection updraft mass flux')
         297        3072 :     call addfld ('ZMMD',     (/ 'lev' /),  'A', 'kg/m2/s', 'ZM convection downdraft mass flux')
         298             :
         299        3072 :     call addfld ('ZMUPGU',   (/ 'lev' /),  'A', 'm/s2', 'zonal force from ZM updraft pressure gradient term')
         300        3072 :     call addfld ('ZMUPGD',   (/ 'lev' /),  'A', 'm/s2', 'zonal force from ZM downdraft pressure gradient term')
         301        3072 :     call addfld ('ZMVPGU',   (/ 'lev' /),  'A', 'm/s2', 'meridional force from ZM updraft pressure gradient term')
         302        3072 :     call addfld ('ZMVPGD',   (/ 'lev' /),  'A', 'm/s2', 'merdional force from ZM downdraft pressure gradient term')
         303             :
         304        3072 :     call addfld ('ZMICUU',   (/ 'lev' /),  'A', 'm/s', 'ZM in-cloud U updrafts')
         305        3072 :     call addfld ('ZMICUD',   (/ 'lev' /),  'A', 'm/s', 'ZM in-cloud U downdrafts')
         306        3072 :     call addfld ('ZMICVU',   (/ 'lev' /),  'A', 'm/s', 'ZM in-cloud V updrafts')
         307        3072 :     call addfld ('ZMICVD',   (/ 'lev' /),  'A', 'm/s', 'ZM in-cloud V downdrafts')
         308             :
         309        3072 :     call addfld ('DIFZM'   ,(/ 'lev' /), 'A','kg/kg/s ','Detrained ice water from ZM convection')
         310        3072 :     call addfld ('DLFZM'   ,(/ 'lev' /), 'A','kg/kg/s ','Detrained liquid water from ZM convection')
         311             :
         312             :     call phys_getopts( history_budget_out = history_budget, &
         313        1536 :                        history_budget_histfile_num_out = history_budget_histfile_num)
         314             :
         315        1536 :     if (zmconv_org) then
         316           0 :        call add_default('ZM_ORG', 1, ' ')
         317           0 :        call add_default('ZM_ORG2D', 1, ' ')
         318             :     endif
         319        1536 :     if ( history_budget ) then
         320           0 :        call add_default('EVAPTZM  ', history_budget_histfile_num, ' ')
         321           0 :        call add_default('EVAPQZM  ', history_budget_histfile_num, ' ')
         322           0 :        call add_default('ZMDT     ', history_budget_histfile_num, ' ')
         323           0 :        call add_default('ZMDQ     ', history_budget_histfile_num, ' ')
         324           0 :        call add_default('ZMDLIQ   ', history_budget_histfile_num, ' ')
         325           0 :        call add_default('ZMDICE   ', history_budget_histfile_num, ' ')
         326           0 :        call add_default('ZMMTT    ', history_budget_histfile_num, ' ')
         327             :     end if
         328             :
         329             : !
         330             : ! Limit deep convection to regions below 40 mb
         331             : ! Note this calculation is repeated in the shallow convection interface
         332             : !
         333        1536 :     limcnv = 0   ! null value to check against below
         334        1536 :     if (pref_edge(1) >= 4.e3_r8) then
         335           0 :        limcnv = 1
         336             :     else
         337       52224 :        do k=1,plev
         338       52224 :           if (pref_edge(k) < 4.e3_r8 .and. pref_edge(k+1) >= 4.e3_r8) then
         339        1536 :              limcnv = k
         340        1536 :              exit
         341             :           end if
         342             :        end do
         343        1536 :        if ( limcnv == 0 ) limcnv = plevp
         344             :     end if
         345             :
         346        1536 :     if (masterproc) then
         347           2 :        write(iulog,*)'ZM_CONV_INIT: Deep convection will be capped at intfc ',limcnv, &
         348           4 :             ' which is ',pref_edge(limcnv),' pascals'
         349             :     end if
         350             :
         351             :     ! If thickness of bottom layer is less than dz_min, and zmconv_parcel_pbl=.false.,
         352             :     ! then issue a warning.
         353        1536 :     dz_bot_layer = scale_height * log(pref_edge(pverp)/pref_edge(pver))
         354        1536 :     if (dz_bot_layer < dz_min .and. .not. zmconv_parcel_pbl) then
         355           0 :        if (masterproc) then
         356           0 :           write(iulog,*)'********** WARNING **********'
         357           0 :           write(iulog,*)' ZM_CONV_INIT: Bottom layer thickness (m) is ', dz_bot_layer
         358           0 :           write(iulog,*)' The namelist variable zmconv_parcel_pbl should be set to .true.'
         359           0 :           write(iulog,*)' when the bottom layer thickness is < ', dz_min
         360           0 :           write(iulog,*)'********** WARNING **********'
         361             :        end if
         362             :     end if
         363             :
         364        1536 :     no_deep_pbl = phys_deepconv_pbl()
         365             : !CACNOTE - Need to check errflg and report errors
         366             :     call zm_convr_init(cpair, epsilo, gravit, latvap, tmelt, rair, &
         367             :                   limcnv,zmconv_c0_lnd, zmconv_c0_ocn, zmconv_ke, zmconv_ke_lnd, &
         368             :                   zmconv_momcu, zmconv_momcd, zmconv_num_cin, zmconv_org, &
         369             :                   no_deep_pbl, zmconv_tiedke_add, &
         370             :                   zmconv_capelmt, zmconv_dmpdz,zmconv_parcel_pbl, zmconv_tau, &
         371        1536 :                   masterproc, iulog, errmsg, errflg)
         372             :
         373        1536 :     cld_idx         = pbuf_get_index('CLD')
         374        1536 :     fracis_idx      = pbuf_get_index('FRACIS')
         375             :
         376        1536 : end subroutine zm_conv_init
         377             : !=========================================================================================
         378             : !subroutine zm_conv_tend(state, ptend, tdt)
         379             :
         380    62805456 : subroutine zm_conv_tend(pblh    ,mcon    ,cme     , &
         381             :      tpert   ,zdu      , &
         382             :      rliq    ,rice    ,ztodt    , &
         383             :      jctop   ,jcbot , &
         384             :      state   ,ptend_all   ,landfrac,  pbuf)
         385             :
         386             :
         387        1536 :    use cam_history,   only: outfld
         388             :    use physics_types, only: physics_state, physics_ptend
         389             :    use physics_types, only: physics_ptend_init, physics_update
         390             :    use physics_types, only: physics_state_copy, physics_state_dealloc
         391             :    use physics_types, only: physics_ptend_sum, physics_ptend_dealloc
         392             :
         393             :    use time_manager,  only: get_nstep, is_first_step
         394             :    use physics_buffer, only : pbuf_get_field, physics_buffer_desc, pbuf_old_tim_idx
         395             :    use constituents,  only: pcnst, cnst_get_ind, cnst_is_convtran1
         396             :    use check_energy,  only: check_energy_chng
         397             :    use physconst,     only: gravit, latice, latvap, tmelt, cpwv, cpliq, rh2o
         398             :
         399             :    use phys_control,  only: cam_physpkg_is
         400             :
         401             :    ! Arguments
         402             :
         403             :    type(physics_state), intent(in),target   :: state          ! Physics state variables
         404             :    type(physics_ptend), intent(out)         :: ptend_all      ! individual parameterization tendencies
         405             :    type(physics_buffer_desc), pointer       :: pbuf(:)
         406             :
         407             :    real(r8), intent(in) :: ztodt                       ! 2 delta t (model time increment)
         408             :    real(r8), intent(in) :: pblh(pcols)                 ! Planetary boundary layer height
         409             :    real(r8), intent(in) :: tpert(pcols)                ! Thermal temperature excess
         410             :    real(r8), intent(in) :: landfrac(pcols)             ! RBN - Landfrac
         411             :
         412             :    real(r8), intent(out) :: mcon(pcols,pverp)  ! Convective mass flux--m sub c
         413             :    real(r8), intent(out) :: cme(pcols,pver)    ! cmf condensation - evaporation
         414             :    real(r8), intent(out) :: zdu(pcols,pver)    ! detraining mass flux
         415             :
         416             :    real(r8), intent(out) :: rliq(pcols) ! reserved liquid (not yet in cldliq) for energy integrals
         417             :    real(r8), intent(out) :: rice(pcols) ! reserved ice (not yet in cldice) for energy integrals
         418             :
         419             :
         420             :    ! Local variables
         421             :    character(len=512) :: errmsg
         422             :    integer            :: errflg
         423             :
         424             :    integer :: i,k,l,m
         425             :    integer :: ilon                      ! global longitude index of a column
         426             :    integer :: ilat                      ! global latitude index of a column
         427             :    integer :: nstep
         428             :    integer :: ixcldice, ixcldliq      ! constituent indices for cloud liquid and ice water.
         429             :    integer :: lchnk                   ! chunk identifier
         430             :    integer :: ncol                    ! number of atmospheric columns
         431             :    integer :: itim_old                ! for physics buffer fields
         432             :
         433             :    real(r8) :: ftem(pcols,pver)              ! Temporary workspace for outfld variables
         434             :    real(r8) :: ntprprd(pcols,pver)    ! evap outfld: net precip production in layer
         435             :    real(r8) :: ntsnprd(pcols,pver)    ! evap outfld: net snow production in layer
         436             :    real(r8) :: tend_s_snwprd  (pcols,pver) ! Heating rate of snow production
         437             :    real(r8) :: tend_s_snwevmlt(pcols,pver) ! Heating rate of evap/melting of snow
         438             :    real(r8) :: fake_dpdry(pcols,pver) ! used in convtran call
         439             :
         440             :    ! physics types
         441     1495368 :    type(physics_state) :: state1        ! locally modify for evaporation to use, not returned
         442    62805456 :    type(physics_ptend),target :: ptend_loc     ! package tendencies
         443             :
         444             :    ! physics buffer fields
         445     1495368 :    real(r8), pointer, dimension(:)   :: prec         ! total precipitation
         446     1495368 :    real(r8), pointer, dimension(:)   :: snow         ! snow from ZM convection
         447     1495368 :    real(r8), pointer, dimension(:,:) :: cld
         448     1495368 :    real(r8), pointer, dimension(:,:) :: ql           ! wg grid slice of cloud liquid water.
         449     1495368 :    real(r8), pointer, dimension(:,:) :: rprd         ! rain production rate
         450     1495368 :    real(r8), pointer, dimension(:,:,:) :: fracis  ! fraction of transported species that are insoluble
         451     1495368 :    real(r8), pointer, dimension(:,:) :: evapcdp      ! Evaporation of deep convective precipitation
         452     1495368 :    real(r8), pointer, dimension(:,:) :: flxprec      ! Convective-scale flux of precip at interfaces (kg/m2/s)
         453     1495368 :    real(r8), pointer, dimension(:,:) :: flxsnow      ! Convective-scale flux of snow   at interfaces (kg/m2/s)
         454     1495368 :    real(r8), pointer :: dlf(:,:)    ! detrained convective cloud water mixing ratio.
         455     1495368 :    real(r8), pointer :: dif(:,:)    ! detrained convective cloud ice mixing ratio.
         456     1495368 :    real(r8), pointer :: dnlf(:,:)   ! detrained convective cloud water num concen.
         457     1495368 :    real(r8), pointer :: dnif(:,:)   ! detrained convective cloud ice num concen.
         458             :    real(r8), pointer :: lambdadpcu(:,:) ! slope of cloud liquid size distr
         459             :    real(r8), pointer :: mudpcu(:,:)     ! width parameter of droplet size distr
         460     1495368 :    real(r8), pointer :: mconzm(:,:)     !convective mass fluxes
         461             :
         462     1495368 :    real(r8), pointer :: mu(:,:)    ! (pcols,pver)
         463     1495368 :    real(r8), pointer :: eu(:,:)    ! (pcols,pver)
         464     1495368 :    real(r8), pointer :: du(:,:)    ! (pcols,pver)
         465     1495368 :    real(r8), pointer :: md(:,:)    ! (pcols,pver)
         466     1495368 :    real(r8), pointer :: ed(:,:)    ! (pcols,pver)
         467     1495368 :    real(r8), pointer :: dp(:,:)    ! (pcols,pver)
         468     1495368 :    real(r8), pointer :: dsubcld(:) ! (pcols)
         469     1495368 :    integer,  pointer :: jt(:)      ! (pcols)
         470     1495368 :    integer,  pointer :: maxg(:)    ! (pcols)
         471     1495368 :    integer,  pointer :: ideep(:)   ! (pcols)
         472             :    integer           :: lengath
         473             :
         474             :    real(r8) :: jctop(pcols)  ! o row of top-of-deep-convection indices passed out.
         475             :    real(r8) :: jcbot(pcols)  ! o row of base of cloud indices passed out.
         476             :
         477             :    real(r8) :: pcont(pcols), pconb(pcols), freqzm(pcols)
         478             :
         479             :    ! history output fields
         480             :    real(r8) :: cape(pcols)        ! w  convective available potential energy.
         481             :    real(r8) :: mu_out(pcols,pver)
         482             :    real(r8) :: md_out(pcols,pver)
         483             :
         484             :    ! used in momentum transport calculation
         485             :    real(r8) :: pguallu(pcols, pver)
         486             :    real(r8) :: pguallv(pcols, pver)
         487             :    real(r8) :: pgdallu(pcols, pver)
         488             :    real(r8) :: pgdallv(pcols, pver)
         489             :    real(r8) :: icwuu(pcols,pver)
         490             :    real(r8) :: icwuv(pcols,pver)
         491             :    real(r8) :: icwdu(pcols,pver)
         492             :    real(r8) :: icwdv(pcols,pver)
         493             :    real(r8) :: seten(pcols, pver)
         494             :    logical  :: l_windt(2)
         495             :    real(r8) :: tfinal1, tfinal2
         496             :    integer  :: ii
         497             :
         498     1495368 :    real(r8),pointer :: zm_org2d(:,:)
         499     1495368 :    real(r8),allocatable :: orgt_alloc(:,:), org_alloc(:,:)
         500             :
         501     2990736 :    real(r8) :: zm_org2d_ncol(state%ncol,pver)
         502     4486104 :    real(r8) :: orgt_ncol(state%ncol,pver), org_ncol(state%ncol,pver)
         503             :
         504             :    logical  :: lq(pcnst)
         505             :
         506             :    !----------------------------------------------------------------------
         507             :
         508             :    ! initialize
         509     1495368 :    lchnk = state%lchnk
         510     1495368 :    ncol  = state%ncol
         511     1495368 :    nstep = get_nstep()
         512             :
         513     1495368 :    ftem = 0._r8
         514     1495368 :    mu_out(:,:) = 0._r8
         515     1495368 :    md_out(:,:) = 0._r8
         516             :
         517     1495368 :    call physics_state_copy(state,state1)             ! copy state to local state1.
         518             :
         519     1495368 :    lq(:) = .FALSE.
         520     1495368 :    lq(1) = .TRUE.
         521     1495368 :    if (zmconv_org) then
         522           0 :       lq(ixorg) = .TRUE.
         523             :    endif
         524     1495368 :    call physics_ptend_init(ptend_loc, state%psetcols, 'zm_convr_run', ls=.true., lq=lq)! initialize local ptend type
         525             :
         526             : !
         527             : ! Associate pointers with physics buffer fields
         528             : !
         529     1495368 :    itim_old = pbuf_old_tim_idx()
         530     5981472 :    call pbuf_get_field(pbuf, cld_idx,         cld,    start=(/1,1,itim_old/), kount=(/pcols,pver,1/) )
         531             :
         532     1495368 :    call pbuf_get_field(pbuf, icwmrdp_idx,     ql )
         533     1495368 :    call pbuf_get_field(pbuf, rprddp_idx,      rprd )
         534     1495368 :    call pbuf_get_field(pbuf, fracis_idx,      fracis, start=(/1,1,1/),    kount=(/pcols, pver, pcnst/) )
         535     1495368 :    call pbuf_get_field(pbuf, nevapr_dpcu_idx, evapcdp )
         536     1495368 :    call pbuf_get_field(pbuf, prec_dp_idx,     prec )
         537     1495368 :    call pbuf_get_field(pbuf, snow_dp_idx,     snow )
         538             :
         539     1495368 :    call pbuf_get_field(pbuf, zm_mu_idx,      mu)
         540     1495368 :    call pbuf_get_field(pbuf, zm_eu_idx,      eu)
         541     1495368 :    call pbuf_get_field(pbuf, zm_du_idx,      du)
         542     1495368 :    call pbuf_get_field(pbuf, zm_md_idx,      md)
         543     1495368 :    call pbuf_get_field(pbuf, zm_ed_idx,      ed)
         544     1495368 :    call pbuf_get_field(pbuf, zm_dp_idx,      dp)
         545     1495368 :    call pbuf_get_field(pbuf, zm_dsubcld_idx, dsubcld)
         546     1495368 :    call pbuf_get_field(pbuf, zm_jt_idx,      jt)
         547     1495368 :    call pbuf_get_field(pbuf, zm_maxg_idx,    maxg)
         548     1495368 :    call pbuf_get_field(pbuf, zm_ideep_idx,   ideep)
         549             :
         550     1495368 :    call pbuf_get_field(pbuf, dlfzm_idx,  dlf)
         551     1495368 :    call pbuf_get_field(pbuf, difzm_idx,  dif)
         552     1495368 :    call pbuf_get_field(pbuf, mconzm_idx, mconzm)
         553             :
         554     1495368 :    allocate(dnlf(pcols,pver), dnif(pcols,pver))
         555             :
         556             : !
         557             : ! Begin with Zhang-McFarlane (1996) convection parameterization
         558             : !
         559     1495368 :    call t_startf ('zm_convr_run')
         560             :
         561     1495368 :    if (zmconv_org) then
         562           0 :       allocate(zm_org2d(pcols,pver))
         563           0 :       allocate(org_alloc(ncol,pver))
         564           0 :       allocate(orgt_alloc(ncol,pver))
         565           0 :       org_ncol(:ncol,:) = state%q(1:ncol,:,ixorg)
         566             :    endif
         567             :
         568             : !REMOVECAM - no longer need these when CAM is retired and pcols no longer exists
         569  2365672176 :    ptend_loc%q(:,:,1) = 0._r8
         570  2365672176 :    ptend_loc%s(:,:) = 0._r8
         571     1495368 :    mcon(:,:) = 0._r8
         572  2365672176 :    dlf(:,:) = 0._r8
         573     1495368 :    cme(:,:) = 0._r8
         574     1495368 :    cape(:) = 0._r8
         575     1495368 :    zdu(:,:) = 0._r8
         576  2365672176 :    rprd(:,:) = 0._r8
         577  2365672176 :    dif(:,:) = 0._r8
         578  2365672176 :    dnlf(:,:) = 0._r8
         579  2365672176 :    dnif(:,:) = 0._r8
         580  2365672176 :    mu(:,:) = 0._r8
         581  2365672176 :    eu(:,:) = 0._r8
         582  2365672176 :    du(:,:) = 0._r8
         583  2365672176 :    md(:,:) = 0._r8
         584  2365672176 :    ed(:,:) = 0._r8
         585  2365672176 :    dp(:,:) = 0._r8
         586    25421256 :    dsubcld(:) = 0._r8
         587     1495368 :    jctop(:) = 0._r8
         588     1495368 :    jcbot(:) = 0._r8
         589    25421256 :    prec(:) = 0._r8
         590     1495368 :    rliq(:) = 0._r8
         591     1495368 :    rice(:) = 0._r8
         592    25421256 :    ideep(:) = 0._r8
         593             : !REMOVECAM_END
         594             :
         595             : !CACNOTE - Need to check errflg and report errors
         596             :    call zm_convr_run(ncol, pver, &
         597             :                     pverp, gravit, latice, cpwv, cpliq, rh2o,  &
         598           0 :                     state%t(:ncol,:), state%q(:ncol,:,1), prec(:ncol),  &
         599           0 :                     pblh(:ncol), state%zm(:ncol,:), state%phis(:ncol), state%zi(:ncol,:), ptend_loc%q(:ncol,:,1), &
         600           0 :                     ptend_loc%s(:ncol,:), state%pmid(:ncol,:), state%pint(:ncol,:), state%pdel(:ncol,:), &
         601             :                     ztodt, mcon(:ncol,:), cme(:ncol,:), cape(:ncol),      &
         602           0 :                     tpert(:ncol), dlf(:ncol,:), zdu(:ncol,:), rprd(:ncol,:), &
         603           0 :                     mu(:ncol,:), md(:ncol,:), du(:ncol,:), eu(:ncol,:), ed(:ncol,:),       &
         604           0 :                     dp(:ncol,:), dsubcld(:ncol), jt(:ncol), maxg(:ncol), ideep(:ncol),    &
         605           0 :                     ql(:ncol,:),  rliq(:ncol), landfrac(:ncol),                          &
         606     2990736 :                     org_ncol(:ncol,:), orgt_ncol(:ncol,:), zm_org2d_ncol(:ncol,:),  &
         607           0 :                     dif(:ncol,:), dnlf(:ncol,:), dnif(:ncol,:),  &
         608     4486104 :                     rice(:ncol), errmsg, errflg)
         609             :
         610             :
         611     1495368 :    if (zmconv_org) then
         612           0 :       ptend_loc%q(:,:,ixorg)=orgt_ncol(:ncol,:)
         613           0 :       zm_org2d(:ncol,:) = zm_org2d_ncol(:ncol,:)
         614             :    endif
         615             :
         616    25421256 :    lengath = count(ideep > 0)
         617     1495368 :    if (lengath > ncol) lengath = ncol  ! should not happen, but force it to not be larger than ncol for safety sake
         618             :
         619    25421256 :    jctop(:) = real(pver,r8)
         620    25421256 :    jcbot(:) = 1._r8
         621     6006230 :    do i = 1,lengath
         622     4510862 :       jctop(ideep(i)) = real(jt(i), r8)
         623     6006230 :       jcbot(ideep(i)) = real(maxg(i), r8)
         624             :    end do
         625             :
         626     1495368 :    call outfld('CAPE', cape, pcols, lchnk)        ! RBN - CAPE output
         627             : !
         628             : ! Output fractional occurance of ZM convection
         629             : !
         630     1495368 :    freqzm(:) = 0._r8
         631     6006230 :    do i = 1,lengath
         632     6006230 :       freqzm(ideep(i)) = 1.0_r8
         633             :    end do
         634     1495368 :    call outfld('FREQZM  ',freqzm          ,pcols   ,lchnk   )
         635             : !
         636             : ! Convert mass flux from reported mb/s to kg/m^2/s
         637             : !
         638  2348597160 :    mcon(:ncol,:pverp) = mcon(:ncol,:pverp) * 100._r8/gravit
         639  2348597160 :    mconzm(:ncol,:pverp) = mcon(:ncol,:pverp)
         640             :
         641     1495368 :    call outfld('CMFMC_DP', mconzm, pcols, lchnk)
         642             :
         643             :    ! Store upward and downward mass fluxes in un-gathered arrays
         644             :    ! + convert from mb/s to kg/m^2/s
         645     6006230 :    do i=1,lengath
         646   425516396 :       do k=1,pver
         647   419510166 :          ii = ideep(i)
         648   419510166 :          mu_out(ii,k) = mu(i,k) * 100._r8/gravit
         649   424021028 :          md_out(ii,k) = md(i,k) * 100._r8/gravit
         650             :       end do
         651             :    end do
         652             :
         653     1495368 :    call outfld('ZMMU', mu_out, pcols, lchnk)
         654     1495368 :    call outfld('ZMMD', md_out, pcols, lchnk)
         655             :
         656  2323627992 :    ftem(:ncol,:pver) = ptend_loc%s(:ncol,:pver)/cpair
         657     1495368 :    call outfld('ZMDT    ',ftem           ,pcols   ,lchnk   )
         658     1495368 :    call outfld('ZMDQ    ',ptend_loc%q(1,1,1) ,pcols   ,lchnk   )
         659     1495368 :    call t_stopf ('zm_convr_run')
         660             :
         661     1495368 :    call outfld('DIFZM'   ,dif            ,pcols, lchnk)
         662     1495368 :    call outfld('DLFZM'   ,dlf            ,pcols, lchnk)
         663             :
         664    24969168 :    pcont(:ncol) = state%ps(:ncol)
         665    24969168 :    pconb(:ncol) = state%ps(:ncol)
         666     6006230 :    do i = 1,lengath
         667     6006230 :        if (maxg(i).gt.jt(i)) then
         668     4510862 :           pcont(ideep(i)) = state%pmid(ideep(i),jt(i))  ! gathered array (or jctop ungathered)
         669     4510862 :           pconb(ideep(i)) = state%pmid(ideep(i),maxg(i))! gathered array
         670             :        endif
         671             :        !     write(iulog,*) ' pcont, pconb ', pcont(i), pconb(i), cnt(i), cnb(i)
         672             :     end do
         673     1495368 :     call outfld('PCONVT  ',pcont          ,pcols   ,lchnk   )
         674     1495368 :     call outfld('PCONVB  ',pconb          ,pcols   ,lchnk   )
         675             :
         676     1495368 :   call physics_ptend_init(ptend_all, state%psetcols, 'zm_conv_tend')
         677             :
         678             :   ! add tendency from this process to tendencies from other processes
         679     1495368 :   call physics_ptend_sum(ptend_loc,ptend_all, ncol)
         680             :
         681             :   ! update physics state type state1 with ptend_loc
         682     1495368 :   call physics_update(state1, ptend_loc, ztodt)
         683             :
         684             :   ! initialize ptend for next process
         685     1495368 :   lq(:) = .FALSE.
         686     1495368 :   lq(1) = .TRUE.
         687     1495368 :   if (zmconv_org) then
         688           0 :      lq(ixorg) = .TRUE.
         689             :   endif
         690     1495368 :   call physics_ptend_init(ptend_loc, state1%psetcols, 'zm_conv_evap_run', ls=.true., lq=lq)
         691             :
         692     1495368 :    call t_startf ('zm_conv_evap_run')
         693             : !
         694             : ! Determine the phase of the precipitation produced and add latent heat of fusion
         695             : ! Evaporate some of the precip directly into the environment (Sundqvist)
         696             : ! Allow this to use the updated state1 and the fresh ptend_loc type
         697             : ! heating and specific humidity tendencies produced
         698             : !
         699             :
         700     1495368 :     call pbuf_get_field(pbuf, dp_flxprc_idx, flxprec    )
         701     1495368 :     call pbuf_get_field(pbuf, dp_flxsnw_idx, flxsnow    )
         702             : !REMOVECAM - no longer need these when CAM is retired and pcols no longer exists
         703  2391093432 :     flxprec(:,:) = 0._r8
         704  2391093432 :     flxsnow(:,:) = 0._r8
         705    25421256 :     snow(:) = 0._r8
         706             : !REMOVECAM_END
         707             :
         708             :     call zm_conv_evap_run(state1%ncol, pver, pverp, &
         709             :          gravit, latice, latvap, tmelt, &
         710             :          cpair, zmconv_ke, zmconv_ke_lnd, zmconv_org, &
         711           0 :          state1%t(:ncol,:),state1%pmid(:ncol,:),state1%pdel(:ncol,:),state1%q(:ncol,:pver,1), &
         712           0 :          landfrac(:ncol), &
         713           0 :          ptend_loc%s(:ncol,:), tend_s_snwprd(:ncol,:), tend_s_snwevmlt(:ncol,:), ptend_loc%q(:ncol,:pver,1), &
         714           0 :          rprd(:ncol,:), cld(:ncol,:), ztodt, &
         715     1495368 :          prec(:ncol), snow(:ncol), ntprprd(:ncol,:), ntsnprd(:ncol,:), flxprec(:ncol,:), flxsnow(:ncol,:) )
         716             :
         717  2323627992 :     evapcdp(:ncol,:pver) = ptend_loc%q(:ncol,:pver,1)
         718             :
         719     1495368 :      if (zmconv_org) then
         720           0 :          ptend_loc%q(:ncol,:pver,ixorg) = min(1._r8,max(0._r8,(50._r8*1000._r8*1000._r8*abs(evapcdp(:ncol,:pver))) &
         721           0 :                                           -(state%q(:ncol,:pver,ixorg)/10800._r8)))
         722           0 :          ptend_loc%q(:ncol,:pver,ixorg) = (ptend_loc%q(:ncol,:pver,ixorg) - state%q(:ncol,:pver,ixorg))/ztodt
         723             :      endif
         724             :
         725             : !
         726             : ! Write out variables from zm_conv_evap_run
         727             : !
         728  2323627992 :    ftem(:ncol,:pver) = ptend_loc%s(:ncol,:pver)/cpair
         729     1495368 :    call outfld('EVAPTZM ',ftem           ,pcols   ,lchnk   )
         730  2323627992 :    ftem(:ncol,:pver) = tend_s_snwprd  (:ncol,:pver)/cpair
         731     1495368 :    call outfld('FZSNTZM ',ftem           ,pcols   ,lchnk   )
         732  2323627992 :    ftem(:ncol,:pver) = tend_s_snwevmlt(:ncol,:pver)/cpair
         733     1495368 :    call outfld('EVSNTZM ',ftem           ,pcols   ,lchnk   )
         734     1495368 :    call outfld('EVAPQZM ',ptend_loc%q(1,1,1) ,pcols   ,lchnk   )
         735     1495368 :    call outfld('ZMFLXPRC', flxprec, pcols, lchnk)
         736     1495368 :    call outfld('ZMFLXSNW', flxsnow, pcols, lchnk)
         737     1495368 :    call outfld('ZMNTPRPD', ntprprd, pcols, lchnk)
         738     1495368 :    call outfld('ZMNTSNPD', ntsnprd, pcols, lchnk)
         739     1495368 :    call outfld('ZMEIHEAT', ptend_loc%s, pcols, lchnk)
         740     1495368 :    call outfld('CMFMC_DP   ',mcon ,  pcols   ,lchnk   )
         741     1495368 :    call outfld('PRECCDZM   ',prec,  pcols   ,lchnk   )
         742             :
         743             :
         744     1495368 :    call t_stopf ('zm_conv_evap_run')
         745             :
         746     1495368 :    call outfld('PRECZ   ', prec   , pcols, lchnk)
         747             :
         748             :   ! add tendency from this process to tend from other processes here
         749     1495368 :   call physics_ptend_sum(ptend_loc,ptend_all, ncol)
         750             :
         751             :   ! update physics state type state1 with ptend_loc
         752     1495368 :   call physics_update(state1, ptend_loc, ztodt)
         753             :
         754             :
         755             :   ! Momentum Transport
         756             :
         757     1495368 :   call physics_ptend_init(ptend_loc, state1%psetcols, 'zm_conv_momtran_run', ls=.true., lu=.true., lv=.true.)
         758             :
         759     1495368 :   l_windt(1) = .true.
         760     1495368 :   l_windt(2) = .true.
         761             : !REMOVECAM - no longer need these when CAM is retired and pcols no longer exists
         762  2365672176 :   ptend_loc%s(:,:) = 0._r8
         763  2365672176 :   ptend_loc%u(:,:) = 0._r8
         764  2365672176 :   ptend_loc%v(:,:) = 0._r8
         765             : !REMOVECAM_END
         766             :
         767     1495368 :   call t_startf ('zm_conv_momtran_run')
         768             :
         769             :   call zm_conv_momtran_run (ncol, pver, pverp,                    &
         770           0 :                    l_windt,state1%u(:ncol,:), state1%v(:ncol,:), 2,  mu(:ncol,:), md(:ncol,:),   &
         771             :                    zmconv_momcu, zmconv_momcd, &
         772           0 :                    du(:ncol,:), eu(:ncol,:), ed(:ncol,:), dp(:ncol,:), dsubcld(:ncol),  &
         773           0 :                    jt(:ncol), maxg(:ncol), ideep(:ncol), 1, lengath,  &
         774           0 :                    nstep,  ptend_loc%u(:ncol,:), ptend_loc%v(:ncol,:),&
         775           0 :                    pguallu(:ncol,:), pguallv(:ncol,:),  pgdallu(:ncol,:), pgdallv(:ncol,:), &
         776     1495368 :                    icwuu(:ncol,:), icwuv(:ncol,:), icwdu(:ncol,:), icwdv(:ncol,:), ztodt, seten(:ncol,:) )
         777     1495368 :   call t_stopf ('zm_conv_momtran_run')
         778             :
         779  2323627992 :   ptend_loc%s(:ncol,:pver) = seten(:ncol,:pver)
         780             :
         781     1495368 :   call physics_ptend_sum(ptend_loc,ptend_all, ncol)
         782             :
         783             :   ! Output ptend variables before they are set to zero with physics_update
         784     1495368 :   call outfld('ZMMTU', ptend_loc%u, pcols, lchnk)
         785     1495368 :   call outfld('ZMMTV', ptend_loc%v, pcols, lchnk)
         786             :
         787             :   ! update physics state type state1 with ptend_loc
         788     1495368 :   call physics_update(state1, ptend_loc, ztodt)
         789             :
         790  2323627992 :   ftem(:ncol,:pver) = seten(:ncol,:pver)/cpair
         791     1495368 :   if (zmconv_org) then
         792           0 :      call outfld('ZM_ORG', state%q(:,:,ixorg), pcols, lchnk)
         793           0 :      call outfld('ZM_ORG2D', zm_org2d, pcols, lchnk)
         794             :   endif
         795     1495368 :   call outfld('ZMMTT', ftem             , pcols, lchnk)
         796             :
         797             :   ! Output apparent force from  pressure gradient
         798     1495368 :   call outfld('ZMUPGU', pguallu, pcols, lchnk)
         799     1495368 :   call outfld('ZMUPGD', pgdallu, pcols, lchnk)
         800     1495368 :   call outfld('ZMVPGU', pguallv, pcols, lchnk)
         801     1495368 :   call outfld('ZMVPGD', pgdallv, pcols, lchnk)
         802             :
         803             :   ! Output in-cloud winds
         804     1495368 :   call outfld('ZMICUU', icwuu, pcols, lchnk)
         805     1495368 :   call outfld('ZMICUD', icwdu, pcols, lchnk)
         806     1495368 :   call outfld('ZMICVU', icwuv, pcols, lchnk)
         807     1495368 :   call outfld('ZMICVD', icwdv, pcols, lchnk)
         808             :
         809             :   ! Transport cloud water and ice only
         810     1495368 :   call cnst_get_ind('CLDLIQ', ixcldliq)
         811     1495368 :   call cnst_get_ind('CLDICE', ixcldice)
         812             :
         813     1495368 :   lq(:)  = .FALSE.
         814    61310088 :   lq(2:) = cnst_is_convtran1(2:)
         815     1495368 :   call physics_ptend_init(ptend_loc, state1%psetcols, 'convtran1', lq=lq)
         816             :
         817             :
         818             :    ! dpdry is not used in this call to convtran since the cloud liquid and ice mixing
         819             :    ! ratios are moist
         820     1495368 :    fake_dpdry(:,:) = 0._r8
         821             :
         822     1495368 :    call t_startf ('convtran1')
         823             :
         824             : !REMOVECAM - no longer need this when CAM is retired and pcols no longer exists
         825 96994054584 :    ptend_loc%q(:,:,:) = 0._r8
         826             : !REMOVECAM_END
         827             :
         828             :    call zm_conv_convtran_run (ncol, pver,          &
         829           0 :                   ptend_loc%lq,state1%q(:ncol,:,:), pcnst,  mu(:ncol,:), md(:ncol,:),   &
         830           0 :                   du(:ncol,:), eu(:ncol,:), ed(:ncol,:), dp(:ncol,:), dsubcld(:ncol),  &
         831           0 :                   jt(:ncol), maxg(:ncol), ideep(:ncol), 1, lengath,  &
         832     1495368 :                   nstep,   fracis(:ncol,:,:),  ptend_loc%q(:ncol,:,:), fake_dpdry(:ncol,:))
         833     1495368 :    call t_stopf ('convtran1')
         834             :
         835     1495368 :    call outfld('ZMDICE ',ptend_loc%q(1,1,ixcldice) ,pcols   ,lchnk   )
         836     1495368 :    call outfld('ZMDLIQ ',ptend_loc%q(1,1,ixcldliq) ,pcols   ,lchnk   )
         837             :
         838             :    ! add tendency from this process to tend from other processes here
         839     1495368 :    call physics_ptend_sum(ptend_loc,ptend_all, ncol)
         840             :
         841     1495368 :    call physics_state_dealloc(state1)
         842     1495368 :    call physics_ptend_dealloc(ptend_loc)
         843             :
         844     1495368 :    if (zmconv_org) then
         845           0 :       deallocate(zm_org2d)
         846             :    end if
         847             :
         848     1495368 :    deallocate(dnlf, dnif)
         849             :
         850     5981472 : end subroutine zm_conv_tend
         851             : !=========================================================================================
         852             :
         853             :
         854    64034568 : subroutine zm_conv_tend_2( state,  ptend,  ztodt, pbuf)
         855             :
         856     1495368 :    use physics_types, only: physics_state, physics_ptend, physics_ptend_init
         857             :    use time_manager,  only: get_nstep
         858             :    use physics_buffer, only: pbuf_get_index, pbuf_get_field, physics_buffer_desc
         859             :    use constituents,   only: pcnst, cnst_is_convtran2
         860             :
         861             : ! Arguments
         862             :    type(physics_state), intent(in )   :: state          ! Physics state variables
         863             :    type(physics_ptend), intent(out)   :: ptend          ! indivdual parameterization tendencies
         864             :
         865             :    type(physics_buffer_desc), pointer :: pbuf(:)
         866             :
         867             :    real(r8), intent(in) :: ztodt                          ! 2 delta t (model time increment)
         868             :
         869             : ! Local variables
         870             :    integer :: i, lchnk, istat
         871             :    integer :: lengath          ! number of columns with deep convection
         872             :    integer :: nstep
         873             :    integer :: ncol
         874             :
         875             :    real(r8), dimension(pcols,pver) :: dpdry
         876             :
         877             :    ! physics buffer fields
         878     1489176 :    real(r8), pointer :: fracis(:,:,:)  ! fraction of transported species that are insoluble
         879     1489176 :    real(r8), pointer :: mu(:,:)    ! (pcols,pver)
         880     1489176 :    real(r8), pointer :: eu(:,:)    ! (pcols,pver)
         881     1489176 :    real(r8), pointer :: du(:,:)    ! (pcols,pver)
         882     1489176 :    real(r8), pointer :: md(:,:)    ! (pcols,pver)
         883     1489176 :    real(r8), pointer :: ed(:,:)    ! (pcols,pver)
         884     1489176 :    real(r8), pointer :: dp(:,:)    ! (pcols,pver)
         885     1489176 :    real(r8), pointer :: dsubcld(:) ! (pcols)
         886     1489176 :    integer,  pointer :: jt(:)      ! (pcols)
         887     1489176 :    integer,  pointer :: maxg(:)    ! (pcols)
         888     1489176 :    integer,  pointer :: ideep(:)   ! (pcols)
         889             :    !-----------------------------------------------------------------------------------
         890             :
         891             :
         892     1489176 :    call physics_ptend_init(ptend, state%psetcols, 'convtran2', lq=cnst_is_convtran2 )
         893             :
         894     1489176 :    call pbuf_get_field(pbuf, fracis_idx,     fracis)
         895     1489176 :    call pbuf_get_field(pbuf, zm_mu_idx,      mu)
         896     1489176 :    call pbuf_get_field(pbuf, zm_eu_idx,      eu)
         897     1489176 :    call pbuf_get_field(pbuf, zm_du_idx,      du)
         898     1489176 :    call pbuf_get_field(pbuf, zm_md_idx,      md)
         899     1489176 :    call pbuf_get_field(pbuf, zm_ed_idx,      ed)
         900     1489176 :    call pbuf_get_field(pbuf, zm_dp_idx,      dp)
         901     1489176 :    call pbuf_get_field(pbuf, zm_dsubcld_idx, dsubcld)
         902     1489176 :    call pbuf_get_field(pbuf, zm_jt_idx,      jt)
         903     1489176 :    call pbuf_get_field(pbuf, zm_maxg_idx,    maxg)
         904     1489176 :    call pbuf_get_field(pbuf, zm_ideep_idx,   ideep)
         905             :
         906             :
         907     1489176 :    lchnk = state%lchnk
         908     1489176 :    ncol  = state%ncol
         909     1489176 :    nstep = get_nstep()
         910             :
         911    25315992 :    lengath = count(ideep > 0)
         912     1489176 :    if (lengath > ncol) lengath = ncol  ! should not happen, but force it to not be larger than ncol for safety sake
         913             :
         914    20848464 :    if (any(ptend%lq(:))) then
         915             :       ! initialize dpdry for call to convtran
         916             :       ! it is used for tracers of dry mixing ratio type
         917     1489176 :       dpdry = 0._r8
         918     5981800 :       do i = 1, lengath
         919   423795832 :          dpdry(i,:) = state%pdeldry(ideep(i),:)/100._r8
         920             :       end do
         921             :
         922     1489176 :       call t_startf ('convtran2')
         923             :
         924             : !REMOVECAM - no longer need this when CAM is retired and pcols no longer exists
         925 96592422888 :    ptend%q(:,:,:) = 0._r8
         926             : !REMOVECAM_END
         927             :
         928             :       call zm_conv_convtran_run (ncol, pver,          &
         929           0 :                   ptend%lq,state%q(:ncol,:,:), pcnst,  mu(:ncol,:), md(:ncol,:),   &
         930           0 :                   du(:ncol,:), eu(:ncol,:), ed(:ncol,:), dp(:ncol,:), dsubcld(:ncol),  &
         931           0 :                   jt(:ncol), maxg(:ncol), ideep(:ncol), 1, lengath,  &
         932     1489176 :                   nstep,   fracis(:ncol,:,:),  ptend%q(:ncol,:,:), dpdry(:ncol,:))
         933     1489176 :       call t_stopf ('convtran2')
         934             :    end if
         935             :
         936     2978352 : end subroutine zm_conv_tend_2
         937             :
         938             : !=========================================================================================
         939             :
         940             :
         941             : end module zm_conv_intr

Generated by: LCOV version 1.14