module convect_deep 3,3 !--------------------------------------------------------------------------------- ! Purpose: ! ! CAM interface to several deep convection interfaces. Currently includes: ! Zhang-McFarlane (default) ! Kerry Emanuel ! ! ! Author: D.B. Coleman, Sep 2004 ! !--------------------------------------------------------------------------------- use shr_kind_mod, only: r8=>shr_kind_r8 use ppgrid, only: pver, pcols, pverp, begchunk, endchunk use cam_logfile, only: iulog implicit none save private ! Make default type private to the module ! Public methods public ::& convect_deep_register, &! register fields in physics buffer convect_deep_init, &! initialize donner_deep module convect_deep_tend, &! return tendencies convect_deep_tend_2, &! return tendencies deep_scheme_does_scav_trans ! = .t. if scheme does scavenging and conv. transport ! Private module data character(len=16) :: deep_scheme ! default set in phys_control.F90, use namelist to change !========================================================================================= contains !========================================================================================= function deep_scheme_does_scav_trans() ! ! Function called by tphysbc to determine if it needs to do scavenging and convective transport ! or if those have been done by the deep convection scheme. Each scheme could have its own ! identical query function for a less-knowledgable interface but for now, we know that KE ! does scavenging & transport, and ZM doesn't ! logical deep_scheme_does_scav_trans if ( deep_scheme .eq. 'ZM' ) then deep_scheme_does_scav_trans = .false. else deep_scheme_does_scav_trans = .true. endif return end function deep_scheme_does_scav_trans !========================================================================================= subroutine convect_deep_register 1,8 !---------------------------------------- ! Purpose: register fields with the physics buffer !---------------------------------------- use phys_buffer, only: pbuf_times, pbuf_add use zm_conv_intr, only: zm_conv_register use phys_control, only: phys_getopts implicit none integer idx ! get deep_scheme setting from phys_control call phys_getopts(deep_scheme_out = deep_scheme) select case ( deep_scheme ) case('ZM') ! Zhang-McFarlane (default) call zm_conv_register end select call pbuf_add('ICWMRDP' , 'physpkg', 1,pver, 1, idx) call pbuf_add('RPRDDP' , 'physpkg', 1,pver, 1, idx) call pbuf_add('NEVAPR_DPCU' , 'physpkg', 1,pver, 1, idx) end subroutine convect_deep_register !========================================================================================= subroutine convect_deep_init(hypi) 1,5 !---------------------------------------- ! Purpose: declare output fields, initialize variables needed by convection !---------------------------------------- use pmgrid, only: plevp use spmd_utils, only: masterproc use zm_conv_intr, only: zm_conv_init use abortutils, only: endrun implicit none real(r8),intent(in) :: hypi(plevp) ! reference pressures at interfaces integer k select case ( deep_scheme ) case('off') ! ==> no deep convection if (masterproc) write(iulog,*)'convect_deep: no deep convection selected' case('ZM') ! 1 ==> Zhang-McFarlane (default) if (masterproc) write(iulog,*)'convect_deep initializing Zhang-McFarlane convection' call zm_conv_init(hypi) case default if (masterproc) write(iulog,*)'WARNING: convect_deep: no deep convection scheme. May fail.' end select end subroutine convect_deep_init !========================================================================================= !subroutine convect_deep_tend(state, ptend, tdt, pbuf) subroutine convect_deep_tend(prec , & 1,18 pblh ,mcon ,cme , & tpert ,dlf ,pflx ,zdu , & rliq , & ztodt ,snow ,& state ,ptend ,landfrac ,pbuf ) use physics_types, only: physics_state, physics_ptend, physics_tend, physics_ptend_init use phys_buffer, only: pbuf_size_max, pbuf_fld, pbuf_get_fld_idx use constituents, only: pcnst use zm_conv_intr, only: zm_conv_tend #if ( defined WACCM_PHYS ) use gw_drag, only: idx_zmdt use cam_history, only: outfld use physconst, only: cpair #endif ! Arguments type(physics_state), intent(in ) :: state ! Physics state variables type(physics_ptend), intent(out) :: ptend ! indivdual parameterization tendencies type(pbuf_fld), intent(inout), dimension(pbuf_size_max) :: pbuf ! physics buffer real(r8), intent(in) :: ztodt ! 2 delta t (model time increment) real(r8), intent(in) :: pblh(pcols) ! Planetary boundary layer height real(r8), intent(in) :: tpert(pcols) ! Thermal temperature excess real(r8), intent(in) :: landfrac(pcols) ! Land fraction real(r8), intent(out) :: mcon(pcols,pverp) ! Convective mass flux--m sub c real(r8), intent(out) :: dlf(pcols,pver) ! scattrd version of the detraining cld h2o tend real(r8), intent(out) :: pflx(pcols,pverp) ! scattered precip flux at each level real(r8), intent(out) :: cme(pcols,pver) ! cmf condensation - evaporation real(r8), intent(out) :: zdu(pcols,pver) ! detraining mass flux real(r8), intent(out) :: prec(pcols) ! total precipitation real(r8), intent(out) :: snow(pcols) ! snow from ZM convection real(r8), intent(out) :: rliq(pcols) ! reserved liquid (not yet in cldliq) for energy integrals real(r8), pointer, dimension(:) :: jctop real(r8), pointer, dimension(:) :: jcbot real(r8), pointer, dimension(:,:,:) :: cld real(r8), pointer, dimension(:,:) :: ql ! wg grid slice of cloud liquid water. real(r8), pointer, dimension(:,:) :: rprd ! rain production rate real(r8), pointer, dimension(:,:,:) :: fracis ! fraction of transported species that are insoluble real(r8), pointer, dimension(:,:) :: evapcdp ! Evaporation of deep convective precipitation real(r8) zero(pcols, pver) integer i, k integer ifld #if ( defined WACCM_PHYS ) real(r8), pointer, dimension(:,:) :: zmdt real(r8) :: ftem(pcols,pver) ! Temporary workspace for outfld variables #endif ifld = pbuf_get_fld_idx('CLDTOP') jctop => pbuf(ifld)%fld_ptr(1,1:pcols,1,state%lchnk,1) ifld = pbuf_get_fld_idx('CLDBOT') jcbot => pbuf(ifld)%fld_ptr(1,1:pcols,1,state%lchnk,1) select case ( deep_scheme ) case('off') ! 0 ==> no deep convection zero = 0 mcon = 0 dlf = 0 pflx = 0 cme = 0 zdu = 0 prec = 0 snow = 0 rliq = 0 ! ! Associate pointers with physics buffer fields ! ifld = pbuf_get_fld_idx('CLD') cld => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,state%lchnk,:) ifld = pbuf_get_fld_idx('ICWMRDP') ql => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,state%lchnk,1) ifld = pbuf_get_fld_idx('RPRDDP') rprd => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,state%lchnk,1) ifld = pbuf_get_fld_idx('FRACIS') fracis => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,state%lchnk,1:pcnst) ifld = pbuf_get_fld_idx('NEVAPR_DPCU') evapcdp => pbuf(ifld)%fld_ptr(1,1:pcols,1:pver,state%lchnk,1) jctop = 0 jcbot = 0 cld = 0 ql = 0 rprd = 0 fracis = 0 evapcdp = 0 call physics_ptend_init(ptend) ptend%name = "convect_deep" case('ZM') ! 1 ==> Zhang-McFarlane (default) call zm_conv_tend(prec , & pblh ,mcon ,cme , & tpert ,dlf ,pflx ,zdu , & rliq , & ztodt ,snow ,& jctop, jcbot , & state ,ptend ,landfrac ,pbuf ) end select #if ( defined WACCM_PHYS ) zmdt => pbuf(idx_zmdt) %fld_ptr(1,:,:,state%lchnk,1) ftem(:state%ncol,:pver) = ptend%s(:state%ncol,:pver)/cpair zmdt(:state%ncol,:pver) = ftem(:state%ncol,:pver) call outfld('ZMDT ',ftem ,pcols ,state%lchnk ) call outfld('ZMDQ ',ptend%q(:,:,1) ,pcols ,state%lchnk ) #endif end subroutine convect_deep_tend !========================================================================================= subroutine convect_deep_tend_2( state, ptend, ztodt, pbuf ) 1,5 use physics_types, only: physics_state, physics_ptend use phys_buffer, only: pbuf_size_max, pbuf_fld use constituents, only: pcnst use zm_conv_intr, only: zm_conv_tend_2 ! Arguments type(physics_state), intent(in ) :: state ! Physics state variables type(physics_ptend), intent(out) :: ptend ! indivdual parameterization tendencies type(pbuf_fld), intent(inout), dimension(pbuf_size_max) :: pbuf ! physics buffer real(r8), intent(in) :: ztodt ! 2 delta t (model time increment) if ( deep_scheme .eq. 'ZM' ) then ! 1 ==> Zhang-McFarlane (default) call zm_conv_tend_2( state, ptend, ztodt, pbuf ) end if end subroutine convect_deep_tend_2 end module