!--------------------------------------------------------------------
! Kain-Fritsch + CuP Cumulus Parameterization
!
! Module contents:
!   kf_cup_cps* - the top-level driver routine
!   kf_cup_para* - the guts of the KF scheme
!   tpmix2
!   dtfrznew
!   condload
!   prof5
!   tpmix2dd
!   envirtht
!   kf_cup_init*
!   kf_lutab
!   cupCloudFraction*
!   cup_jfd*
!   cupSlopeSigma*
!   findCp*
!   findIndex*
!   findRs*
!   findRsi*
!
! * = Subroutine either modified or added for CuP compared to the
!     original kfeta scheme.
!--------------------------------------------------------------------

!--------------------------------------------------------------------
!TODO's:
! - Add variable descriptions with units and other code docs
! - Should we vary rBinSize based on t2 to get more sensitivity when cold?
! - Figure out appropriate limiting values for the slopes and sigmas
!   that ensure the jfd sums to one and gives at least some
!   perturbations.
! - Figure out how to make minimum frequency settings dependent upon
!   the chosen bin sizes.
! - Tie cloud radius calc. to dx or the shallow trigger.
! - When run with a small dx, deep convection should never be allowed
!   to trigger. Right now, it can.
! - Figure out how to do cloud fraction feedback.
! - Figure out how to handle combination of liquid and ice for cloud
!   fraction calculation.
! - Clean up cldfratend_cup once we are sure that it will never be
!   used again.
! - When fluxes are negative, wstar goes negative and then the
!   time scales go negative for tstar and taucloud. The neg. cancels
!   out for the cloud fraction, but it is troublesome none the less.
! - Deep convective clouds don't necessarily develop concurrent
!   condensed phase mass. This has impacts for radiation and should
!   be investigated.
!--------------------------------------------------------------------


MODULE module_cu_kfcup 2

   USE module_wrf_error

   IMPLICIT NONE

!--------------------------------------------------------------------
! Lookup table variables:
      INTEGER, PARAMETER, PRIVATE :: KFNT=250,KFNP=220
      REAL, DIMENSION(KFNT,KFNP),PRIVATE, SAVE :: TTAB,QSTAB
      REAL, DIMENSION(KFNP),PRIVATE, SAVE :: THE0K
      REAL, DIMENSION(200),PRIVATE, SAVE :: ALU
      REAL, PRIVATE, SAVE :: RDPR,RDTHK,PLUTOP

! Note:  KF Lookup table is used by subroutines KF_cup_PARA, TPMIX2,
!        TPMIX2DD, ENVIRTHT
! End of Lookup table variables:

      real, parameter, private :: eps=0.622 !used to be epsilon
      !real, parameter, private :: reallysmall=1e-30 !for div by 0 checks
      real, parameter, private :: reallysmall=5e-4 !for div by 0 checks

! if ==1, apply barahona and nenes (2007) entrainment adjustment to activation 
! at cloud base ; if =/1, do not apply this
      integer, parameter, private :: qndrop_cldbase_entrain_opt = 1
! if ==1, updraft qndrop above cloud base is reduced by entrainment (dilution) ; 
! if /=1, no dilution
      integer, parameter, private :: qndrop_incloud_entrain_opt = 1
! minimum vertical velocity (m/s) passed to activate routine
      real, parameter, private :: w_act_min = 0.2

! for testing -- multiply aerosol number/volume by this before activation calculation
!     real, parameter, private :: naero_adjust_factor = 1.0
! for testing -- if ==1, set aerosol size to dcen_sect for activation calcs
!                if /=1, do not adjust aerosol size
!     integer, parameter, private :: vaero_dsect_adjust_opt = 0


CONTAINS


   SUBROUTINE KF_cup_CPS( grid_id,                           & ! rce 10-may-2012 1,13
              ids,ide, jds,jde, kds,kde                      &
             ,ims,ime, jms,jme, kms,kme                      &
             ,its,ite, jts,jte, kts,kte                      &
             ,DT,KTAU,DX                                     &
             ,rho,RAINCV,NCA                                 &
             ,U,V,TH,T,W,dz8w,Pcps,pi                        &
             ,W0AVG,XLV0,XLV1,XLS0,XLS1,CP,R,G,EP1           &
             ,EP2,SVP1,SVP2,SVP3,SVPT0                       &
             ,STEPCU,CU_ACT_FLAG,warm_rain,CUTOP,CUBOT       &
             ,QV                                             &
             ,xland                                          & !LD 18-Oct-2011 
             ,psfc,z,z_at_w,ht,tsk,hfx,qfx,mavail            & !CuP, wig, 24-Aug-2006
             ,sf_sfclay_physics                              & !CuP, wig, 24-Aug-2006
             ,br,regime,pblh,kpbl,t2,q2                      & !CuP, wig, 24-Aug-2006
             ,slopeSfc,slopeEZ,sigmasfc,sigmaEZ              & !CuP, wig, 24-Aug-2006
             ,cupflag,cldfra_cup,cldfratend_cup              & !CuP, wig, 18-Sep-2006
             ,shall,taucloud,tactive                         & !CuP, wig, 18-Sep-2006
             ,activeFrac                                     & !CuP, lkb 5-May-2010
             ,tstar, lnterms                                 & !CuP, wig 4-Oct-2006
             ,lnint                                          & !CuP, wig 4-Oct-2006
             ,numBins, thBinSize, rBinSize                   & !CuP, lkb 4-Nov-2009
             ,minDeepFreq, minShallowFreq                    & !CuP, lkb 4-Nov-2009
             ,wCloudBase                                     & !CuP, lkb 4-April-2010
             ,wact_cup                                       & !CuP, rce 10-may-2012
             ,wulcl_cup                                      & !CuP, rce 10-may-2012
             ,wup_cup                                        & !CuP, rce 15-mar-2013
             ,qc_ic_cup                                      & !CuP, rce 10-may-2012
             ,qndrop_ic_cup                                  & !CuP, rce 10-may-2012
             ,qc_iu_cup                                      & !CuP, rce 10-may-2012
             ,fcvt_qc_to_pr_cup                              & !CuP, rce 10-may-2012
             ,fcvt_qc_to_qi_cup                              & !CuP, rce 10-may-2012
             ,fcvt_qi_to_pr_cup                              & !CuP, rce 10-may-2012
             ,mfup_cup                                       & !CuP, rce 10-may-2012
             ,mfup_ent_cup                                   & !CuP, rce 10-may-2012
             ,mfdn_cup                                       & !CuP, rce 10-may-2012
             ,mfdn_ent_cup                                   & !CuP, rce 10-may-2012
             ,updfra_cup                                     & !CuP, rce 10-may-2012
             ,tcloud_cup                                     & !CuP, rce 10-may-2012
             ,shcu_aerosols_opt                              & !CuP, rce 10-may-2012
            ! optionals
             ,chem_opt                                       & !CuP, rce 10-may-2012
             ,chem                                           & !CuP, rce 10-may-2012
             ,F_QV    ,F_QC    ,F_QR    ,F_QI    ,F_QS       &
             ,RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN            &
             ,RQICUTEN,RQSCUTEN                              &
                                                             )
!
   USE module_state_description, only:  num_chem
#if ( WRF_CHEM == 1 )
   USE module_state_description, only:  cbmz_mosaic_4bin, cbmz_mosaic_4bin_aq, &
                                        cbmz_mosaic_8bin, cbmz_mosaic_8bin_aq, &
                                        saprc99_mosaic_8bin_vbs2_aq_kpp,       &
                                        saprc99_mosaic_8bin_vbs2_kpp
   USE module_data_mosaic_asect, only:  maxd_acomp, maxd_aphase, maxd_atype, maxd_asize, &
                                        ntype_aer, nsize_aer, ncomp_aer, &
                                        ai_phase, msectional, massptr_aer, numptr_aer, &
                                        dlo_sect, dhi_sect, dens_aer, hygro_aer, sigmag_aer
#endif

!-------------------------------------------------------------
   IMPLICIT NONE
!-------------------------------------------------------------
   INTEGER,      INTENT(IN   ) :: grid_id,                   & !rce 10-may-2012
                                  ids,ide, jds,jde, kds,kde, &
                                  ims,ime, jms,jme, kms,kme, &
                                  its,ite, jts,jte, kts,kte

   INTEGER,      INTENT(IN   ) :: STEPCU
   LOGICAL,      INTENT(IN   ) :: warm_rain

   REAL,         INTENT(IN   ) :: XLV0,XLV1,XLS0,XLS1
   REAL,         INTENT(IN   ) :: CP,R,G,EP1,EP2
   REAL,         INTENT(IN   ) :: SVP1,SVP2,SVP3,SVPT0

   INTEGER,      INTENT(IN   ) :: KTAU, &
                                          sf_sfclay_physics, & !CuP, wig, 24-Aug-2006
                                          shcu_aerosols_opt    !CuP, rce, 10-may-2012

   INTEGER,  DIMENSION( ims:ime , jms:jme )                , & !CuP, wig, 24-Aug-2006
          INTENT(IN   ) ::                                   & !CuP, wig, 24-Aug-2006
                                                       kpbl    !Note that this is different from kpbl in the main KF scheme below. CuP, wig, 24-Aug-2006

   REAL,  DIMENSION( ims:ime , jms:jme )                   , & !CuP, wig, 24-Aug-2006
          INTENT(IN   ) ::                                   & !CuP, wig, 24-Aug-2006
                                                       psfc, & !CuP, wig, 24-Aug-2006
                                                         ht, & !CuP, wig, 24-Aug-2006
                                                        tsk, & !CuP, wig, 24-Aug-2006
                                                        hfx, & !CuP, wig, 24-Aug-2006
                                                        qfx, & !CuP, wig, 24-Aug-2006
                                                     mavail, & !CuP, wig, 24-Aug-2006
                                                         br, & !CuP, wig, 24-Aug-2006
                                                     regime, & !CuP, wig, 24-Aug-2006
                                                       pblh, & !CuP, wig, 24-Aug-2006
                                                         t2, & !CuP, wig, 24-Aug-2006
                                                         q2, &    !CuP, wig, 24-Aug-2006
                                                      xland       !LD 18-Oct-2011

   REAL,  DIMENSION( ims:ime , kms:kme , jms:jme )         , &
          INTENT(IN   ) ::                                   &
                                                          U, &
                                                          V, &
                                                          W, &
                                                         TH, &
                                                          T, &
                                                         QV, &
                                                       dz8w, &
                                                       Pcps, &
                                                        rho, &
                                                         pi, &
                                                          z, & !CuP, wig, 24-Aug-2006
                                                     z_at_w    !CuP, wig 5-Oct-2006
!
   REAL,  DIMENSION( ims:ime , kms:kme , jms:jme )         , &
          INTENT(INOUT) ::                                   &
                                                      W0AVG, &
                                                 cldfra_cup, & !CuP, wig, 18-Sep-2006
                                             cldfratend_cup    !CuP, wig, 18-Sep-2006

   REAL,  INTENT(IN   ) :: DT, DX
!
   REAL, DIMENSION( ims:ime , jms:jme ),                     &
          INTENT(INOUT) ::                           RAINCV  

   REAL,    DIMENSION( ims:ime , jms:jme ),                  &
            INTENT(INOUT) ::                            NCA, &
                                                      shall    !CuP, wig, 18-Sep-2006 This has to be "real" because "integer" would only output zeros to the history file.

   REAL, DIMENSION( ims:ime , jms:jme ),                     &
          INTENT(OUT) ::                              CUBOT, &
                                                      CUTOP, &
                                                   slopeSfc, & !CuP, wig, 24-Aug-2006
                                                    slopeEZ, & !CuP, wig, 24-Aug-2006
                                                   sigmaSfc, & !CuP, wig, 24-Aug-2006
                                                    sigmaEZ, & !CuP, wig, 24-Aug-2006
                                                   taucloud, & !CuP, wig, 1-Oct-2006
                                                    tactive, & !CuP, wig, 1-Oct-2006
                                                      tstar, & !CuP, wig, 4-Oct-2006
                                                      lnint, & !CuP, wig, 4-Oct-2006
                                                 activeFrac, & !CuP, lkb, 5-May-2010
                                                 wCloudBase    !CuP, lkb, 10-April-2010

   REAL, DIMENSION( ims:ime , jms:jme ),                     &
        INTENT(INOUT) ::                           wact_cup, & !CuP, rce 10-may-2012
                                                  wulcl_cup, & !CuP, rce 10-may-2012
                                                 tcloud_cup    !CuP, rce 10-may-2012

   REAL, DIMENSION( ims:ime , kms:kme, jms:jme ),            &
         INTENT(INOUT) ::                                    &
                                                    wup_cup, & !CuP, rce 15-mar-2013
                                                  qc_ic_cup, & !CuP, rce 10-may-2012
                                              qndrop_ic_cup, & !CuP, rce 10-may-2012
                                                  qc_iu_cup, & !CuP, rce 10-may-2012
                                          fcvt_qc_to_pr_cup, & !CuP, rce 10-may-2012
                                          fcvt_qc_to_qi_cup, & !CuP, rce 10-may-2012
                                          fcvt_qi_to_pr_cup, & !CuP, rce 10-may-2012
                                                   mfup_cup, & !CuP, rce 10-may-2012
                                               mfup_ent_cup, & !CuP, rce 10-may-2012
                                                   mfdn_cup, & !CuP, rce 10-may-2012
                                               mfdn_ent_cup, & !CuP, rce 10-may-2012
                                                 updfra_cup    !CuP, rce 10-may-2012

   REAL, DIMENSION( ims:ime , kms:kme, jms:jme ),            &
         INTENT(OUT) ::                                      &
                                                    lnterms    !CuP, wig 4-Oct-2006

   LOGICAL, DIMENSION( ims:ime , jms:jme ),                  &
          INTENT(INOUT) ::                      CU_ACT_FLAG, &
                                                    cupflag    !CuP, wig 9-Oct-2006
   INTEGER, INTENT(IN) :: numBins
   REAL, INTENT(IN) :: thBinSize, rBinSize
   REAL, INTENT(IN) :: minDeepFreq, minShallowFreq
!
! Optional arguments
!
   INTEGER, OPTIONAL, INTENT(IN   ) ::             chem_opt    !CuP, rce 10-may-2012

   REAL, DIMENSION( ims:ime , kms:kme, jms:jme, 1:num_chem ),&
         OPTIONAL, INTENT(IN) ::                             &
                                                       chem    !CuP, rce 10-may-2012

   REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),           &
         OPTIONAL,                                           &
         INTENT(INOUT) ::                                    &
                                                   RTHCUTEN, &
                                                   RQVCUTEN, &
                                                   RQCCUTEN, &

                                                   RQRCUTEN, &
                                                   RQICUTEN, &
                                                   RQSCUTEN

!
! Flags relating to the optional tendency arrays declared above
! Models that carry the optional tendencies will provdide the
! optional arguments at compile time; these flags all the model
! to determine at run-time whether a particular tracer is in
! use or not.
!
   LOGICAL, OPTIONAL ::                                      &
                                                   F_QV      &
                                                  ,F_QC      &
                                                  ,F_QR      &
                                                  ,F_QI      &
                                                  ,F_QS


! LOCAL VARS

   LOGICAL :: flag_qr, flag_qi, flag_qs
   LOGICAL :: flag_chem   ! rce 10-may-2012

   REAL, DIMENSION( kts:kte ) ::                             &
                                                        U1D, &
                                                        V1D, &
                                                        T1D, &
                                                       th1d, & !wig, CuP, 24-Aug-2006
                                                        z1d, & !wig, CuP, 15-Sep-2006
                                                   z_at_w1d, & !wig, CuP 5-Oct-2006
                                                       DZ1D, &
                                                       QV1D, &
                                                        P1D, &
                                                      RHO1D, &
                                                    W0AVG1D, &
                                               cldfra_cup1d, & !wig, CuP, 20-Sep-2006
                                           cldfratend_cup1d, & !wig, CuP, 20-Sep-2006
                                                   qndrop1d, & !rce, CuP, 11-may-2012
                                                       qc1d, & !rce, CuP, 11-may-2012
                                                       qi1d, & !rce, CuP, 11-may-2012
                                              fcvt_qc_to_pr, & !rce, CuP, 11-may-2012
                                              fcvt_qc_to_qi, & !rce, CuP, 11-may-2012
                                              fcvt_qi_to_pr    !rce, CuP, 11-may-2012

   REAL, DIMENSION( kts:kte )::                              &
                                                       DQDT, &
                                                      DQIDT, &
                                                      DQCDT, &
                                                      DQRDT, &
                                                      DQSDT, &
                                                       DTDT

   REAL, DIMENSION( kts:kte, 1:num_chem ) ::                 &
                                                     chem1d    !rce, CuP, 11-may-2012

   REAL    ::         TST,tv,PRS,RHOE,W0,SCR1,DXSQ,tmp,RTHCUMAX


   INTEGER :: i,j,k,NTST,ICLDCK

! Local vars specific to CuP... wig, 24-Aug-2006
!~sensitivity test for 41   integer, parameter :: numBins = 21   !Number of perturbations for each variable (theta & qvapor)
!!   integer, parameter :: numBins =  41 !41!Number of perturbations for each variable (theta & qvapor)
!!                                        !  Should be an odd value.
!!   real, parameter :: thBinSize  = 0.1   !0.1  !Size of potential temp. perturbation increment (K)
!!   real, parameter :: rBinSize   = 1.0e-4 !1e-4 !Size of mxing ratio perturbation increment (kg/kg)
!   real, parameter :: minFreq    = 1e-5 !Minimum frequency required for a perturbation to be used ~should be dependent upon bin sizes
!!   real, parameter :: minDeepFreq= 50e-2 !Cumulative freq. threshold before deep convection is allowed ~this was 5e-2 before

   integer :: ipert, ishall, jpert, kcubot, kcutop
   !!real :: activeFrac, biggestDeepFreq, cumDeepFreq, cumShallFreq,  &
   real :: biggestDeepFreq, cumDeepFreq, cumShallFreq,  &
           cubot_deep, cutop_deep, nca_deep, raincv_deep,           &
           cubot_shall, cutop_shall, nca_shall, raincv_shall,       &
           minFreq, wstar, wLCL
   real, dimension(numBins) :: r_perturb, th_perturb
   real, dimension(numBins, numBins) :: jfd
   real, dimension(kts:kte) :: dqdt_deep, dqidt_deep, dqcdt_deep,    &
                               dqrdt_deep, dqsdt_deep, dtdt_deep,    &
                               dqdt_shall, dqidt_shall, dqcdt_shall, &
                               dqrdt_shall, dqsdt_shall, dtdt_shall, &
                               qlg, qlg_shall, qig, qig_shall
   character(len=200) :: message

! rce 11-may-2012 mods start -------------------------------------------
   integer :: idiagee, idiagff
   integer :: ipert_deepsv, jpert_deepsv
   integer :: kcubotmin, kcubotmax, kcutopmin, kcutopmax
   integer :: kupdrbot_deep, kupdrbot_shall
   integer :: l

   logical :: ltmpa

   real :: tmpa, tmpb, tmpc, tmpd, tmpe, tmpf, tmpg, tmph, tmpi, tmpj
   real :: tmpr, tmps, tmpx, tmpy, tmpz
   real :: tmpcf
   real :: tmp_nca, tmp_updfra
   real :: tmpveca(1:999)
   real :: updfra, updfra_deep, updfra_shall
   real :: wact, wact_deep, wact_shall
   real :: wcb_v2, wcb_v2_shall, wcb_v2_deep
   real :: wulcl, wulcl_deep, wulcl_shall
   real :: wcloudbase_shall, wcloudbase_deep

   real, dimension(kts:kte) ::                   &
           qlg_deep, qig_deep,                   &
           qndrop_ic_deep, qndrop_ic_shall,      &
           qc_ic_deep, qc_ic_shall,              &
           qi_ic_deep, qi_ic_shall,              &
           fcvt_qc_to_pr_deep, fcvt_qc_to_pr_shall, &
           fcvt_qc_to_qi_deep, fcvt_qc_to_qi_shall, &
           fcvt_qi_to_pr_deep, fcvt_qi_to_pr_shall, &
           cumshallfreq1d,                       &
           umfout, uerout, udrout,               &
           umf_deep, uer_deep, udr_deep,         &
           umf_shall, uer_shall, udr_shall,      &
           dmfout, derout, ddrout,               &
           dmf_deep, der_deep, ddr_deep,         &  ! only deep has downdraft
           wup, wup_deep, wup_shall
! rce 11-may-2012 mods end ---------------------------------------------
   
!
   DXSQ=DX*DX
!----------------------
   NTST=STEPCU
   TST=float(NTST*2)
   flag_qr = .FALSE.
   flag_qi = .FALSE.
   flag_qs = .FALSE.
   IF ( PRESENT(F_QR) ) flag_qr = F_QR
   IF ( PRESENT(F_QI) ) flag_qi = F_QI
   IF ( PRESENT(F_QS) ) flag_qs = F_QS

! flag_chem is .TRUE. only when chem is present, shcu_aerosols_opt >= 2, and chem_opt is appropriate
   flag_chem = .FALSE.
#if ( WRF_CHEM == 1 )
   if ( PRESENT( chem ) .and. shcu_aerosols_opt >= 2) then
      if ( chem_opt == cbmz_mosaic_4bin    .or. &
           chem_opt == cbmz_mosaic_4bin_aq .or. &
           chem_opt == cbmz_mosaic_8bin    .or. &
           chem_opt == cbmz_mosaic_8bin_aq .or. &
           chem_opt == saprc99_mosaic_8bin_vbs2_aq_kpp .or. & 
           chem_opt == saprc99_mosaic_8bin_vbs2_kpp ) then !BSINGH (04/08/2014): Added for non-aq vbs 

         flag_chem = .TRUE.
      else
         CALL wrf_error_fatal( 'kf_cup_cps - bad chem_opt for shcu_aerosols_opt >= 2' )
      end if
   end if
#endif

   idiagff = 0 ; idiagee = 0  ! rce 11-may-2012 start
   if ((ide-ids <= 3) .and. (jde-jds <= 3)) then
      idiagff = 1  ! turn on diagnostics at i=j=1 for single column runs
!     idiagff = 0  ! (do this to turn off extra diagnostics)
   end if  ! rce 11-may-2012 end

!
  DO J = jts,jte
      DO K=kts,kte
         DO I= its,ite
!            SCR1=-5.0E-4*G*rho(I,K,J)*(w(I,K,J)+w(I,K+1,J))
!            TV=T(I,K,J)*(1.+EP1*QV(I,K,J))
!            RHOE=Pcps(I,K,J)/(R*TV)
!            W0=-101.9368*SCR1/RHOE
            W0=0.5*(w(I,K,J)+w(I,K+1,J))  !~this can probably be passed in instead of recalced
            W0AVG(I,K,J)=(W0AVG(I,K,J)*(TST-1.)+W0)/TST
!            CLDFRA_CUP(I,K,j) = 0.0   ! Start with 0 cloud fraction, added by LK Berg 10/29/09 01/11/2012
         ENDDO
      ENDDO
   ENDDO
!
!...CHECK FOR CONVECTIVE INITIATION EVERY 5 MINUTES (OR NTST/2)...
!
!----------------------
   ICLDCK=MOD(KTAU,NTST)

! rce 11-may-2012 mods start -------------------------------------------
   if (idiagff > 0) then
      if (ktau <= 1) then
      write(*,'(a,i5,1p,4e11.3)') 'kfcup_control numbins, ...binsize, min...freq', numbins, thbinsize, rbinsize, mindeepfreq, minshallowfreq
      write(*,'(a,3i5)') 'kfcup_control -- qndrop_cldbase_entrain_opt, ...incloud', &
         qndrop_cldbase_entrain_opt, qndrop_incloud_entrain_opt
      write(*,'(a,1p,2e11.35)') 'kfcup_control -- w_act_min', w_act_min
      write(*,'(a,2i5/(a,3(i9,i5)))') 'kfcup_control -- grid_id, ktau', grid_id, ktau, &
         'kfcup_control -- d indices', ids,ide, jds,jde, kds,kde, &
         'kfcup_control -- m indices', ims,ime, jms,jme, kms,kme, &
         'kfcup_control -- e indices', its,ite, jts,jte, kts,kte
      end if

      write(*,'(a)') 'kfcup', 'kfcup', 'kfcup--------------------------------------------------------------------------------'
      write(*,'(a,l5)') 'kfcup -- flag_chem', flag_chem
      write(*,'(a,3i5,l5,3i5,f10.1,1p,2e10.2)') 'kfcup a00 ktau,ntst,icldck; cupflag,ishall,bot/top; nca,cldfra', &
         ktau, ntst, icldck, cupflag(its,jts), nint(shall(its,jts)), nint(cubot(its,jts)), nint(cutop(its,jts)), nca(its,jts), &
         maxval(cldfra_cup(its,kts:kte-2,jts)), maxval(rqvcuten(its,kts:kte-2,jts))
      write(*,'(a,i5,1p,4e11.3)') 'kfcup numbins, ...binsize, min...freq', numbins, thbinsize, rbinsize, mindeepfreq, minshallowfreq
   end if ! (idiagff > 0)
! rce 11-may-2012 mods end ---------------------------------------------

   if ((ide-ids <= 3) .and. (jde-jds <= 3)) then  ! rce 11-may-2012
      ! for single column, skip ktau=1
      ltmpa = (ICLDCK .EQ. 0) .and. (KTAU .gt. 1)
   else
      ltmpa = (ICLDCK .EQ. 0) .or. (KTAU .eq. 1)
   end if

main_test_on_ktau_ntst: &  ! rce 11-may-2012
   IF ( ltmpa ) then
!  IF(ICLDCK.EQ.0 .or. KTAU .eq. 1) then

!
!write(message,*)'~trying convection...'
!call wrf_message(message)
     DO J = jts,jte
     DO I= its,ite
        CU_ACT_FLAG(i,j) = .true.
     ENDDO
     ENDDO

main_loop_on_j: &  ! rce 11-may-2012
     DO J = jts,jte
main_loop_on_i: &  ! rce 11-may-2012
       DO I=its,ite

         idiagee = 0  ! rce 11-may-2012
         if (idiagff > 0) then
            ! turn on diagnostics at i=j=1 for single column runs
            if (i==its .and. j==jts) idiagee = 1
         end if

         ishall = int(shall(i,j)) !CuP, wig 19-Sep-2006
!write(message,*)'~i,j,nca,shall=',i,j,nca(i,j),ishall
!call wrf_message(message)

main_test_on_nca: &  ! rce 11-may-2012
         IF ( NCA(I,J) .ge. 0.5*DT ) then    !byang 26 aug 2011
! A previous call to KF triggered a cloud, and now we have to wait for
! the appropriate time scale before triggering another cloud.
            CU_ACT_FLAG(i,j) = .false.

         ELSE
!call wrf_message("~doing convection...")
            DO k=kts,kte
               DQDT(k)=0.
               DQIDT(k)=0.
               DQCDT(k)=0.
               DQRDT(k)=0.
               DQSDT(k)=0.
               DTDT(k)=0.
            ENDDO
            RAINCV(I,J)=0.
            CUTOP(I,J)=KTS
            CUBOT(I,J)=KTE+1

            qc_ic_cup(i,:,j) = 0.0  ! rce 11-may-2012 start
            qndrop_ic_cup(i,:,j) = 0.0
            qc_iu_cup(i,:,j) = 0.0
            fcvt_qc_to_pr_cup(i,:,j) = 0.0
            fcvt_qc_to_qi_cup(i,:,j) = 0.0
            fcvt_qi_to_pr_cup(i,:,j) = 0.0
            wup_cup(i,:,j) = 0.0
            wact_cup(i,j) = 0.0
            wulcl_cup(i,j) = 0.0
            tcloud_cup(i,j) = 0.0
            updfra_cup(i,:,j) = 0.0
            mfup_cup(i,:,j) = 0.0
            mfup_ent_cup(i,:,j) = 0.0
            mfdn_cup(i,:,j) = 0.0
            mfdn_ent_cup(i,:,j) = 0.0  ! rce 11-may-2012 end
!
! assign vars from 3D to 1D
            DO K=kts,kte
               U1D(K) =U(I,K,J)
               V1D(K) =V(I,K,J)
               T1D(K) =T(I,K,J)
               th1d(k) = th(i,k,j)  !wig, CuP 24-Aug-2006
               RHO1D(K) =rho(I,K,J)
               QV1D(K)=QV(I,K,J)
               P1D(K) =Pcps(I,K,J)
               W0AVG1D(K) =W0AVG(I,K,J)
               z1d(k) = z(i,k,j)    !wig, CuP 15-Sep-2006
               z_at_w1d(k) = z_at_w(i,k,j)    !wig, CuP 15-Sep-2006
               DZ1D(k)=dz8w(I,K,J)
               cldfra_cup1d(k) = cldfra_cup(i,k,j) !wig, CuP 20-Sep-2006
            ENDDO

            if ( flag_chem ) then  ! rce 11-may-2012 start
               do l = 1, num_chem
               do k = kts, kte
                  chem1d(k,l) = chem(i,k,j,l)
               end do
               end do
            end if
            qndrop1d = 0.0
            qc1d = 0.0
            qi1d = 0.0
            fcvt_qc_to_pr = 0.0
            fcvt_qc_to_qi = 0.0
            fcvt_qi_to_pr = 0.0
            wup = 0.0
            wact = 0.0
            updfra = 0.0
            ipert_deepsv = -999
            jpert_deepsv = -999  ! rce 11-may-2012 end
! 
! CuP, wig: begin, Aug-2006
! Get the slopes and std. dev. for CuP

!!$!~beg
!!$print*,dx, psfc(i,j), p1d, rho1d
!!$print*,                 dz1d, z1d, ht(i,j)                  
!!$print*,                 t1d, th1d, tsk(i,j), u1d, v1d
!!$print*,                 qv1d, hfx(i,j), qfx(i,j), mavail(i,j)       
!!$print*,                 sf_sfclay_physics, br(i,j), regime(i,j), pblh(i,j)
!!$print*,                 kpbl(i,j), t2(i,j), q2(i,j)                
!!$print*,                 slopeSfc(i,j), slopeEZ(i,j)                 
!!$print*,                 sigmaSfc(i,j), sigmaEZ(i,j)             
!!$print*,                 wstar, cupflag(i,j)                        
!!$print*,                 kms, kme, kts, kte 
!!$
!!$print*,'~entering cupSlopeSigma',i,j
!!$!~end
            call cupSlopeSigma(dx, psfc(i,j), p1d, rho1d,           &
                 dz1d, z1d, ht(i,j),                                &
                 t1d, th1d, tsk(i,j), u1d, v1d,                     &
                 qv1d, hfx(i,j),xland(i,j), qfx(i,j), mavail(i,j),  &  ! add xland LD 19-Oct-2011
                 sf_sfclay_physics, br(i,j), regime(i,j), pblh(i,j),&
                 kpbl(i,j), t2(i,j), q2(i,j),                       &
                 slopeSfc(i,j), slopeEZ(i,j),                       &
                 sigmaSfc(i,j), sigmaEZ(i,j),                       &
                 wstar, cupflag(i,j), shall(i,j),                   &
                 kms, kme, kts, kte                                 )

            if (idiagee>0) then  ! rce 11-may-2012
               write(*,'(a,l5,i5)')         'kfcup cupslopesigma cupflag, ishall', cupflag(i,j), nint(shall(i,j))
               write(*,'(a,i10,1p,5e10.2)') 'kfcup kpbl, pblh, ht, z1d, dz', kpbl(i,j), pblh(i,j), ht(i,j), z1d(1), dz1d(1)
               write(*,'(a,    1p,5e10.2)') 'kfcup hfx, qfx, regime // w0', hfx(i,j), qfx(i,j), regime(i,j)
               write(*,'(     1p,10e10.2)') w0avg1d(kts:kts+19)
            end if

! If the CuP scheme is activated, use the CuP perturbations.
! Otherwise, default to the standard KF algorithm.
main_test_on_cupflag: &  ! rce 11-may-2012
            if( cupflag(i,j) ) then
!
! Get the joint frequency distribution and the associated perturbations
!
!~The pert. calcs can be pulled out of the i/j do loops for speed, but
!~are left in right now in case we want to vary the pert. values based
!~on environmental conditions.
               call cup_jfd(slopeSfc(i,j), slopeEZ(i,j),            &
                    sigmaSfc(i,j), sigmaEZ(i,j),                    &
                    numBins, thBinSize, rBinSize,                   &
                    th_perturb, r_perturb, jfd                      )
!
! Determine the minimum frequency of occurance that we will allow to
! contribute to the results. This serves two purposes. It prevents large
! excursions from the mean that might creep in from mal-conditioned
! PBL structures. And, it also speeds up overall calculation time by
! limiting which bins to send to the KF scheme for lifting.
!
               minFreq = minShallowFreq*jfd(int(numBins/2)+1, int(numBins/2)+1)
               !!minFreq = 1e-2*jfd(int(numBins/2)+1, int(numBins/2)+1)
               if (idiagee>0) write(*,'(a,2i5,1p,2e11.3)') 'kfcup minfreq stuff', &
                  int(numBins/2)+1, int(numBins/2)+1, minshallowfreq, minfreq  ! rce 11-may-2012
!
! Setup some vars and then loop through all the perturbation
! possibilities...
!
               biggestDeepFreq = -999.
               cumDeepFreq     = 0.
               cumShallFreq    = 0.
               dqdt_shall      = 0.
               dqidt_shall     = 0.
               dqcdt_shall     = 0.
               dqrdt_shall     = 0.
               dqsdt_shall     = 0.
               dtdt_shall      = 0.
               raincv_shall    = 0.
               cubot_shall     = 0.
               cutop_shall     = 0.
               qlg_shall       = 0.
               qig_shall       = 0.
               wCloudBase(i,j) = 0.

! rce 11-may-2012 mods start -------------------------------------------
               cumShallFreq1d  = 0.
               qndrop_ic_shall = 0.
               qc_ic_shall     = 0.
               qi_ic_shall     = 0.
               fcvt_qc_to_pr_shall = 0.
               fcvt_qc_to_qi_shall = 0.
               fcvt_qi_to_pr_shall = 0.
               wact_shall      = 0.
               wulcl_shall     = 0.
               wCloudBase_shall= 0.
               updfra_shall    = 0.
               umf_shall       = 0.
               uer_shall       = 0.
               udr_shall       = 0.
               wcb_v2          = 0.
               wcb_v2_shall    = 0.
               kcubotmin       = 99
               kcubotmax       =  0
               kcutopmin       = 99
               kcutopmax       =  0
               wup_deep        = 0.
               wup_shall       = 0.
! rce 11-may-2012 mods end ---------------------------------------------


PERTLOOPS:     do jpert = 1,numBins
               do ipert = 1,numBins
!
! Only consider the perturbations that exceed a threshold value. Also,
! skip this perturbation if we already know deep convection will be
! output and the current probability is lower than a previous deep
! convective possibility.
!
                  if( (jfd(ipert,jpert) < minFreq) .or. &
                       !!(jfd(ipert,jpert) > 0.001) .or.     & ! lkb, 18-Aug-2008
                       !!(th_perturb(ipert) <= 0) .or.     & ! lkb, 18-Aug-2008 : Commented out for tests run on 11/3/09 looking at lower freq. of DC
                       !!(r_perturb(ipert) <= 0) .or.     & ! lkb, 18-Aug-2008 : COmmented out for tests run on 11/3/09 
                       (cumDeepFreq > minDeepFreq .and. & ! lkb, 18-Aug_2008
                       jfd(ipert,jpert) < biggestDeepFreq) ) cycle
                  

 
!                   write(*,*) raincv ,'in if before KF_cup_PARA'   !LD, 20-April-2011
                  if (idiagee>0) then  ! rce 11-may-2012
                     write(*,'(a,2i5,1p,2e11.3)') 'kfcup calling kf_cup_para'
                     write(98,'(///a,i5,2i5,5x,a,2i5,1pe11.3)') 'kfcup calling kf_cup_para, ktau, i, j', ktau, i, j, &
                        'ijpert, jdf', ipert, jpert, jfd(ipert,jpert)
                  end if
 
                  CALL KF_cup_PARA( GRID_ID, KTAU,          & ! rce 11-may-2012
                       I, J,                                &
                       U1D,V1D,T1D,QV1D,P1D,DZ1D,           &
                       W0AVG1D,DT,DX,DXSQ,RHO1D,            &
                       XLV0,XLV1,XLS0,XLS1,CP,R,G,          &
                       EP2,SVP1,SVP2,SVP3,SVPT0,            &
                       pblh(i,j),z_at_w1d,cupflag(i,j),     & !wig, 21-Feb-2008
                       th_perturb(ipert),r_perturb(jpert),  & !wig, 25-Aug-2006
                       jfd(ipert,jpert),                    & !lkb, 15-Aug-2008
                       ishall,qlg,qig,                      & !wig, 20-Sep-2006
                       DQDT,DQIDT,DQCDT,DQRDT,DQSDT,DTDT,   &
                       RAINCV,NCA,NTST,                     &  !LD add PRATEC 21-April-2011
                       flag_QI,flag_QS,warm_rain,           &
                       CUTOP,CUBOT, wLCL,                   &
                       ids,ide, jds,jde, kds,kde,           &
                       ims,ime, jms,jme, kms,kme,           &
                       its,ite, jts,jte, kts,kte,           &
                       idiagee, updfra, wulcl, wup,         &
                       umfout, uerout, udrout,              & ! rce 11-may-2012
                       dmfout, derout, ddrout,              & !         "
                       shcu_aerosols_opt,                   & !         "
                       flag_chem, num_chem,                 & !         "
                       wact, qndrop1d, qc1d, qi1d,          & !         "
                       fcvt_qc_to_qi, fcvt_qc_to_pr,        & !         "
                       fcvt_qi_to_pr, chem1d,               & !         "
#if ( WRF_CHEM == 1 )
                       maxd_acomp, maxd_aphase,             & !         "
                       maxd_atype, maxd_asize,              & !         "
                       ntype_aer, nsize_aer, ncomp_aer,     & !         "
                       ai_phase, msectional,                & !         "
                       massptr_aer, numptr_aer,             & !         "
                       dlo_sect, dhi_sect,                  & !         "
                       dens_aer, hygro_aer, sigmag_aer      ) !         "
#else
                       1, 1,                                & !         "
                       1, 1                                 ) ! rce 11-may-2012
#endif

                  if (idiagee>0) then  ! rce 11-may-2012
                     if (ishall==0 .or. ishall==1) then
                        write(*,'(a,3i5,1p,e11.3,a)') 'kfcup 1 ishall, cubot/top, nca', &
                           ishall, nint(cubot(i,j)), nint(cutop(i,j)), nca(i,j), '  triggered'
                     else
                        write(*,'(a,3i5,1p,e11.3,a)') 'kfcup 1 ishall, cubot/top, nca', &
                           ishall, nint(cubot(i,j)), nint(cutop(i,j)), nca(i,j)
                     end if
                  end if

! if( raincv(i,j).ne. 0 ) then         &!LD, 20-April-2011
!                      write(*,*) raincv,'after cup_PARA' !LD, 20-April-2011
!                  end if                               &!LD, 20-April-2011 

! Move these tendency applications to after the averaging for all the
! different CuP perturbations.
!!$            IF(PRESENT(rthcuten).AND.PRESENT(rqvcuten)) THEN
!!$              DO K=kts,kte
!!$                 RTHCUTEN(I,K,J)=DTDT(K)/pi(I,K,J)
!!$!              RTHCUMAX=max(abs(RTHCUTEN(I,K,J)),RTHCUMAX)
!!$                 RQVCUTEN(I,K,J)=DQDT(K)
!!$              ENDDO
!!$            ENDIF
!
! If deep convection triggered, accumulate the deep convective
! probability. This will also be the case if no convection occurred
! and then the results would be small. Save the results if this deep
! possibility is more probable than previous possibilities...
!
                  if( ishall == 0 ) then
                     cumDeepFreq = cumDeepFreq + jfd(ipert,jpert)
                     if( jfd(ipert,jpert) > biggestDeepFreq ) then
                        biggestDeepFreq = jfd(ipert,jpert)
                        do k = kts, kte      ! Added by lkb
                           dqdt_deep(k)       = dqdt(k)
                           dqidt_deep(k)      = dqidt(k)
                           dqcdt_deep(k)      = dqcdt(k)
                           dqrdt_deep(k)      = dqrdt(k)
                           dqsdt_deep(k)      = dqsdt(k)
                           dtdt_deep(k)       = dtdt(k)
                        enddo
                        nca_deep        = nca(i,j)
                        raincv_deep     = raincv(i,j)
                        cubot_deep      = cubot(i,j)
                        cutop_deep      = cutop(i,j)

                        ipert_deepsv = ipert  ! rce 11-may-2012 start
                        jpert_deepsv = jpert
                        qlg_deep        = qlg
                        qig_deep        = qig
                        qndrop_ic_deep  = qndrop1d
                        qc_ic_deep      = qc1d
                        qi_ic_deep      = qi1d
                        fcvt_qc_to_pr_deep = fcvt_qc_to_pr
                        fcvt_qc_to_qi_deep = fcvt_qc_to_qi
                        fcvt_qi_to_pr_deep = fcvt_qi_to_pr
                        updfra_deep     = updfra
                        wup_deep        = wup
                        wact_deep       = wact
                        wulcl_deep      = wulcl
                        wcb_v2_deep     = max( wlcl, wulcl )
                        wcloudbase_deep = wlcl

                        kcubot = nint(cubot_deep)
                        kupdrbot_deep = kcubot
                        do k = kcubot-1, kts, -1
                           if ((umfout(k) > 0.0) .or. (uerout(k) > 0.0)) kupdrbot_deep = k
                        end do
                        do k = kts, kte
                           umf_deep(k) = max( 0.0, umfout(k) )
                           uer_deep(k) = max( 0.0, uerout(k) )
                           udr_deep(k) = max( 0.0, udrout(k) )
                           dmf_deep(k) = min( 0.0, dmfout(k) )
                           der_deep(k) = max( 0.0, derout(k) )
                           ddr_deep(k) = max( 0.0, ddrout(k) )
                        enddo  ! rce 11-may-2012 end
                     end if
!
! Or if shallow convection ocurred and we need to accumulate
! frequency weighted running sums of the results...
!
                  else if( ishall == 1 ) then
                     cumShallFreq = cumShallFreq + jfd(ipert,jpert)     ! lkb-9/02/08 changed to just use JFD
                     !!dqdt_shall   = dqdt_shall + dqdt*jfd(ipert,jpert)
                     
                    do k = kts, kte            ! Added by lkb
                        !!!dqdt_shall   = dqdt_shall + dqdt*jfd(ipert,jpert)
                        dqdt_shall(k)   = dqdt_shall(k) + dqdt(k)
                        !!!dqidt_shall  = dqidt_shall + dqidt*jfd(ipert,jpert)
                        dqidt_shall(k)  = dqidt_shall(k) + dqidt(k)
                        !!!dqcdt_shall  = dqcdt_shall + dqcdt*jfd(ipert,jpert)
                        dqcdt_shall(k)  = dqcdt_shall(k) + dqcdt(k)
                        !!!dqrdt_shall  = dqrdt_shall + dqrdt*jfd(ipert,jpert)
                        dqrdt_shall(k)  = dqrdt_shall(k) + dqrdt(k)
                        !!!dqsdt_shall  = dqsdt_shall + dqsdt*jfd(ipert,jpert)
                        dqsdt_shall(k)  = dqsdt_shall(k) + dqsdt(k)
                        !!!dtdt_shall(k)   = dtdt_shall(k) + dtdt(k)*jfd(ipert,jpert)
                        dtdt_shall(k)   = dtdt_shall(k) + dtdt(k)
! in kf_cup_para, when you have shallow conv,
!    ainc (and so updraft area and mass fluxes) get multiplied by jfd(ipert,jpert)
!       which is passed in as "freq"
!    thus the following variables that are averaged over perts 
!       should not be weighted by jfd (same for updfra_shall) 
                        umf_shall(k)    = umf_shall(k) + max( 0.0, umfout(k) )  ! rce 11-may-2012 start
                        uer_shall(k)    = uer_shall(k) + max( 0.0, uerout(k) )
                        udr_shall(k)    = udr_shall(k) + max( 0.0, udrout(k) )  ! rce 11-may-2012 end
                     enddo
                     nca_shall    = nca(i,j)!NINT(TIMEC_SHALL/DT)*DT ! add 01/11/2012 real(ntst)*DT !add dt 01/11/2012 All shallow clouds have a 40 min time scale per KF code.
                     raincv_shall = raincv_shall + raincv(i,j)*jfd(ipert,jpert)
                     !!!raincv_shall = raincv_shall + raincv(i,j)
                     cubot_shall  = cubot_shall + z1d(nint(cubot(i,j)))*jfd(ipert,jpert) !Average the heights, then back out index later
                     cutop_shall  = cutop_shall + z1d(nint(cutop(i,j)))*jfd(ipert,jpert) !ditto
                     qlg_shall    = qlg_shall + qlg*jfd(ipert,jpert)
                     !!!qlg_shall    = qlg_shall + qlg
                     qig_shall    = qig_shall + qig*jfd(ipert,jpert)
                     !!!qig_shall    = qig_shall + qig
!                    wCloudBase(i,j) = wLCL * jfd(ipert,jpert) + wCloudBase(i,j)  ! rce 11-may-2012 start
                     wCloudBase_shall= wLCL * jfd(ipert,jpert) + wCloudBase_shall
                     do k = max( kts, nint(cubot(i,j)) ), min( kte, nint(cutop(i,j)) )
                        ! these are "in cloud" values, so only do them for cubot <= k <= cutop
                        cumshallfreq1d(k)  = cumshallfreq1d(k)  + jfd(ipert,jpert)
                        qndrop_ic_shall(k) = qndrop_ic_shall(k) + qndrop1d(k)*jfd(ipert,jpert)
                        qc_ic_shall(k)     = qc_ic_shall(k)     + qc1d(k)*jfd(ipert,jpert)
                        qi_ic_shall(k)     = qi_ic_shall(k)     + qi1d(k)*jfd(ipert,jpert)
                        ! fcvt_qc_to_pr is fraction of qc converted to precip as air moves through the updraft layer
                        ! compute average as:  sum( fcvt_qc_to_pr * qc1d * jfd ) / sum( qc1d * jfd )
                        fcvt_qc_to_pr_shall(k) = fcvt_qc_to_pr_shall(k) + fcvt_qc_to_pr(k)*qc1d(k)*jfd(ipert,jpert)
                        fcvt_qc_to_qi_shall(k) = fcvt_qc_to_qi_shall(k) + fcvt_qc_to_qi(k)*qc1d(k)*jfd(ipert,jpert)
                        fcvt_qi_to_pr_shall(k) = fcvt_qi_to_pr_shall(k) + fcvt_qi_to_pr(k)*qi1d(k)*jfd(ipert,jpert)
                     end do
                     wup_shall    = wup_shall    + wup*jfd(ipert,jpert)
                     wact_shall   = wact_shall   + wact*jfd(ipert,jpert)
                     wulcl_shall  = wulcl_shall  + wulcl*jfd(ipert,jpert)
                     updfra_shall = updfra_shall + updfra
                     wcb_v2_shall = wcb_v2_shall + jfd(ipert,jpert)*max( wlcl, wulcl )
                     kcubotmin = min( kcubotmin, nint(cubot(i,j)) )
                     kcubotmax = max( kcubotmax, nint(cubot(i,j)) )
                     kcutopmin = min( kcutopmin, nint(cutop(i,j)) )
                     kcutopmax = max( kcutopmax, nint(cutop(i,j)) )  ! rce 11-may-2012 end
                  end if

             
!
! Otherwise, no convection occurred so do nothing.
!
               end do
               end do PERTLOOPS
!
! Now that we know what kind of convection will occur, copy the
! appropriate type, shallow or deep, into the output arrays that
! KF normally expects. Shallow convection needs to be turned into
! an average from a running sum.
!
!               write(*,*) 'raincv_deep',raincv_deep,ishall,'raincv_deep' !LD, 20-April-2011

main_test_on_deep_shall_freq: &  ! rce 11-may-2012
               if( cumDeepFreq > minDeepFreq ) then !Deep convection
                  ishall      = 0
                  activeFrac(i,j)  = 1.
                  do k = kts, kte            ! Added by lkb
                     dqdt(k)        = dqdt_deep(k)
                     dqidt(k)       = dqidt_deep(k)
                     dqcdt(k)       = dqcdt_deep(k)
                     dqrdt(k)       = dqrdt_deep(k)
                     dqsdt(k)       = dqsdt_deep(k)
                     dtdt(k)        = dtdt_deep(k)
                  enddo

                  nca(i,j)    = nca_deep
                  raincv(i,j) = raincv_deep
                  cubot(i,j)  = cubot_deep
                  cutop(i,j)  = cutop_deep
!               write(*,*) 'raincv',raincv,ishall,'raincv' !LD, 20-April-2011

                  qc_iu_cup(i,kts:kte,j)     = qc_ic_deep(kts:kte)  ! rce 11-may-2012 start
                  qc_ic_cup(i,kts:kte,j)     = qc_ic_deep(kts:kte)
                  qndrop_ic_cup(i,kts:kte,j) = qndrop_ic_deep(kts:kte)
                  wup_cup(i,kts:kte,j)       = wup_deep(kts:kte)
                  wact_cup(i,j)           = wact_deep
                  wulcl_cup(i,j)          = wulcl_deep
                  wCloudBase(i,j)         = wCloudBase_deep
                  wcb_v2                  = wcb_v2_deep

                  kcutop = nint(cutop_deep)
                  fcvt_qc_to_pr_cup(i,kts:kcutop,j) = fcvt_qc_to_pr_deep(kts:kcutop)
                  fcvt_qc_to_qi_cup(i,kts:kcutop,j) = fcvt_qc_to_qi_deep(kts:kcutop)
                  fcvt_qi_to_pr_cup(i,kts:kcutop,j) = fcvt_qi_to_pr_deep(kts:kcutop)

                  call adjust_mfentdet_kfcup( idiagee, grid_id, ktau, &
                     i, j, kts, kte, kcutop, ishall, &
                     umf_deep, uer_deep, udr_deep, dmf_deep, der_deep, ddr_deep )

                  ! mfup_ent_cup(k) is at center of layer k, and is 0 for k > kcutop
                  mfup_ent_cup(i,kts:kcutop,j) = uer_deep(kts:kcutop)
                  ! mfup_cup(k)  is at bottom of layer k, and is 0 for k > kcutop
                  ! umf_deep(k) is at top of layer k
                  mfup_cup(i,kts+1:kcutop,j) = umf_deep(kts:kcutop-1)
                  mfdn_ent_cup(i,kts:kcutop,j) = der_deep(kts:kcutop)
                  mfdn_cup(i,kts+1:kcutop,j) = dmf_deep(kts:kcutop-1)

                  updfra_cup(i,kupdrbot_deep:kcutop,j) = updfra_deep
                  tcloud_cup(i,j) = nca_deep  ! rce 11-may-2012 end

!main_test_on_deep_shall_freq: &  ! rce 11-may-2012
               else if( cumShallFreq > 0. ) then  !Shallow convection
                  ishall      = 1
                  activeFrac(i,j)  = cumShallFreq
                  
                  do k = kts, kte            ! Added by lkb
                     !!!dqdt        = dqdt_shall / cumShallFreq
                     dqdt(k)        = dqdt_shall(k)
                     !!!dqidt       = dqidt_shall / cumShallFreq
                     dqidt(k)       = dqidt_shall(k)
                     !!!dqcdt       = dqcdt_shall / cumShallFreq
                     dqcdt(k)       = dqcdt_shall(k)
                     !!!dqrdt       = dqrdt_shall / cumShallFreq
                     dqrdt(k)       = dqrdt_shall(k) 
                     !!!dqsdt       = dqsdt_shall / cumShallFreq
                     dqsdt(k)       = dqsdt_shall(k) 
                     !!!dtdt(k)        = dtdt_shall(k) / cumShallFreq
                     dtdt(k)        = dtdt_shall(k)
                  enddo
 
                  nca(i,j)    = nca_shall    ! shallow convection timescale is locked to convective time scale
                  raincv(i,j) = raincv_shall / cumShallFreq
                  !!!raincv(i,j) = raincv_shall

                  cubot_shall = cubot_shall / cumShallFreq !This gives the average height in AMSL
                  cutop_shall = cutop_shall / cumShallFreq !ditto
                  cubot(i,j)  = findIndex(cubot_shall, z_at_w1d)-1 !Now, get the index of the level
                  cutop(i,j)  = findIndex(cutop_shall, z_at_w1d)-1 !ditto
                  qlg         = qlg_shall / cumShallFreq
                  !!!qlg         = qlg_shall 
                  qig         = qig_shall / cumShallFreq
                  !!!qig         = qig_shall

!                 wCloudBase(i,j) = wCloudBase(i,j) / cumShallFreq  ! rce 11-may-2012 start
                  wCloudBase_shall= wCloudBase_shall/ cumShallFreq
                  wCloudBase(i,j) = wCloudBase_shall

                  do k = kts, kte
                     ! these are "in cloud" values
                     if (cumshallfreq1d(k) > 0.0) then
                        fcvt_qc_to_pr_shall(k) = fcvt_qc_to_pr_shall(k) / max( 1.0e-20, qc_ic_shall(k) )
                        fcvt_qc_to_qi_shall(k) = fcvt_qc_to_qi_shall(k) / max( 1.0e-20, qc_ic_shall(k) )
                        fcvt_qi_to_pr_shall(k) = fcvt_qi_to_pr_shall(k) / max( 1.0e-20, qi_ic_shall(k) )
                        qndrop_ic_shall(k) = qndrop_ic_shall(k)/cumshallfreq1d(k)
                        qc_ic_shall(k)     = qc_ic_shall(k)/cumshallfreq1d(k)
                        qi_ic_shall(k)     = qi_ic_shall(k)/cumshallfreq1d(k)
                     end if
                     cumshallfreq1d(k) = cumshallfreq1d(k)/cumshallfreq
                  end do
                  wup_shall    = wup_shall/cumshallfreq
                  wact_shall   = wact_shall/cumshallfreq
                  wulcl_shall  = wulcl_shall/cumshallfreq
                  wcb_v2_shall = wcb_v2_shall / cumshallfreq
                  wup_cup(i,kts:kte,j) = wup_shall(kts:kte)
                  wact_cup(i,j)  = wact_shall
                  wulcl_cup(i,j) = wulcl_shall
                  wcb_v2         = wcb_v2_shall

                  kcubot = nint(cubot(i,j))
                  kcutop = nint(cutop(i,j))
                  ! qc_ic_cup(k) and qndrop_ic_cup(k) are at center of layer k, and are 0 for k > kcutop
                  qc_ic_cup(i,kts:kcutop,j)     = qc_ic_shall(kts:kcutop)
                  qndrop_ic_cup(i,kts:kcutop,j) = qndrop_ic_shall(kts:kcutop)
                  ! note:  qc_ic_shall = qc1d from subr. kf_cup_para is really for updraft
                  ! if an empirical "in cumulus" cloud-water is used for radiation, 
                  !    it should be put into qc_ic_cup, and used for cloud-chemistry too
                  qc_iu_cup(i,kts:kcutop,j)     = qc_ic_shall(kts:kcutop)
                  ! for qc_ic_cup, use the value in module_ra_cam (1.0 g/kg)
                  !    For shallow convection, use a representative condensate value based on
                  !    observations from CHAPS (Oklahoma area) and Florida (Blyth et al. 2005)
                  qc_ic_cup(i,kcubot:kcutop,j) = 1.0e-3

                  fcvt_qc_to_pr_cup(i,kts:kcutop,j) = fcvt_qc_to_pr_shall(kts:kcutop)
                  fcvt_qc_to_qi_cup(i,kts:kcutop,j) = fcvt_qc_to_qi_shall(kts:kcutop)
                  fcvt_qi_to_pr_cup(i,kts:kcutop,j) = fcvt_qi_to_pr_shall(kts:kcutop)

                  call adjust_mfentdet_kfcup( idiagee, grid_id, ktau, &
                     i, j, kts, kte, kcutop, ishall, &
                     umf_shall, uer_shall, udr_shall, dmfout, derout, ddrout )

                  ! mfup_ent_cup(k) is at center of layer k, and is 0 for k > kcutop
                  mfup_ent_cup(i,kts:kcutop,j) = uer_shall(kts:kcutop)
                  ! mfup_cup(k)  is at bottom of layer k, and is 0 for k > kcutop
                  ! umf_shall(k) is at top of layer k
                  mfup_cup(i,kts+1:kcutop,j) = umf_shall(kts:kcutop-1)

                  kupdrbot_shall = kcubot
                  do k = kcubot-1, kts, -1
                     if ((umf_shall(k) > 0.0) .or. (uer_shall(k) > 0.0)) kupdrbot_shall = k
                  end do
                  updfra_cup(i,kupdrbot_shall:kcutop,j) = updfra_shall
                  tcloud_cup(i,j) = nca_shall  ! rce 11-may-2012 end
                 
!main_test_on_deep_shall_freq: &  ! rce 11-may-2012
               else                                !No convection
                  ishall      = 2
                  activeFrac(i,j)  = 0.
                  dqdt        = 0.
                  dqidt       = 0.
                  dqcdt       = 0.
                  dqrdt       = 0.
                  dqsdt       = 0.
                  dtdt        = 0.
                  nca(i,j)    = -1.
                  raincv(i,j) = 0.
                  cubot(i,j)  = 1.! add 1 replace 0 LD 01/11/2012
                  cutop(i,j)  = 1.
               end if main_test_on_deep_shall_freq  ! rce 11-may-2012
            
               if (idiagee>0) write(*,'(a,3i5,1p,3e11.3)') 'kfcup 2 ishall, cubot/top, nca', &
                  ishall, nint(cubot(i,j)), nint(cutop(i,j)), nca(i,j)  ! rce 11-may-2012

               shall(i,j) = real(ishall)
               kcubot = int(cubot(i,j))
               kcutop = int(cutop(i,j))
               call cupCloudFraction(qlg, qig, qv1d, t1d, z1d, p1d, &
                    kcubot, kcutop, ishall, wStar, wCloudBase(i,j), pblh(i,j), dt, &
                    activeFrac(i,j), cldfra_cup1d, cldfratend_cup1d, &
                    taucloud(i,j), tActive(i,j), tstar(i,j), lnterms(i,:,j), &
                    lnint(i,j), &
                    kts, kte, mfup_cup(i,:,j))  ! add mfup_cup LD 06 29 2012
                  ! kts, kte)
               do k=kts,kte
                  cldfra_cup(i,k,j) = cldfra_cup1d(k)
               end do


               if (idiagee > 0) then
                  call cu_kfcup_diagee01( &  ! rce 11-may-2012
                     ims, ime, jms, jme, kms, kme, kts, kte, &
                     i, j, &
                     idiagee, idiagff, ishall, ktau, &
                     kcubotmin, kcubotmax, kcutopmin, kcutopmax, &
                     activefrac, cldfra_cup1d, &
                     cubot, cutop, cumshallfreq1d, &
                     ddr_deep, der_deep, dmf_deep, dt, dz1d, &
                     fcvt_qc_to_pr_deep, fcvt_qc_to_qi_deep, fcvt_qi_to_pr_deep, &
                     fcvt_qc_to_pr_shall, fcvt_qc_to_qi_shall, fcvt_qi_to_pr_shall, &
                     nca_deep, nca_shall, p1d, pblh, &
                     qc_ic_deep, qc_ic_shall, qi_ic_deep, qi_ic_shall, qndrop_ic_cup, rho1d, &
                     tactive, taucloud, tstar, &
                     udr_deep, udr_shall, uer_deep, uer_shall, umf_deep, umf_shall, &
                     updfra_deep, updfra_shall, updfra_cup, &
                     wact_cup, wcloudbase, wcb_v2, wcb_v2_shall, &
                     wulcl_cup, wstar, z1d, z_at_w1d )
               end if

              
!!$      write(message,'(2i4,a,f10.5,a,f10.5)') i,j," Frequencies: cumDeepFreq=",cumDeepFreq," cumShallFreq=",cumShallFreq
!!$      call wrf_message(message)
               

!main_test_on_cupflag  ! rce 11-may-2012
            else
!
! CuP did not trigger due to stable conditions so default to standard
! KF scheme...
!
               !!CALL KF_cup_PARA(I, J,                    &
               !!     U1D,V1D,T1D,QV1D,P1D,DZ1D,           &
               !!     W0AVG1D,DT,DX,DXSQ,RHO1D,            &
               !!     XLV0,XLV1,XLS0,XLS1,CP,R,G,          &
               !!     EP2,SVP1,SVP2,SVP3,SVPT0,            &
               !!     pblh(i,j),z_at_w1d,cupflag(i,j),     & !wig, 21-Feb-2008
               !!     th_perturb(1),r_perturb(1),          & !wig, 9-Oct-2006
               !!    0.01,                                & !lkb, 15-Aug-2008, replace mass flux with default
               !!     ishall,qlg,qig,                      & !wig, 20-Sep-2006
               !!     DQDT,DQIDT,DQCDT,DQRDT,DQSDT,DTDT,   &
               !!     RAINCV,NCA,NTST,                     &
               !!     flag_QI,flag_QS,warm_rain,           &
               !!     CUTOP,CUBOT,                         &
               !!     ids,ide, jds,jde, kds,kde,           &
               !!     ims,ime, jms,jme, kms,kme,           &
               !!     its,ite, jts,jte, kts,kte)

               CALL KF_cup_PARA( GRID_ID, KTAU,          & ! rce 11-may-2012
                    I, J,                                &
                    U1D,V1D,T1D,QV1D,P1D,DZ1D,           &
                    W0AVG1D,DT,DX,DXSQ,RHO1D,            &
                    XLV0,XLV1,XLS0,XLS1,CP,R,G,          &
                    EP2,SVP1,SVP2,SVP3,SVPT0,            &
                    pblh(i,j),z_at_w1d,cupflag(i,j),     & !wig, 21-Feb-2008
                    th_perturb(1),r_perturb(1),          & !wig, 9-Oct-2006
                    0.01,                                 & !lkb, 15-Aug-2008, replace mass flux with default
                    ishall,qlg,qig,                      & !wig, 20-Sep-2006
                    DQDT,DQIDT,DQCDT,DQRDT,DQSDT,DTDT,   &
                    RAINCV,NCA,NTST,                     & !LD, add PRATEC 21-Apr-2011
                    flag_QI,flag_QS,warm_rain,           &
                    CUTOP,CUBOT,WLCL,                    &
                    ids,ide, jds,jde, kds,kde,           &
                    ims,ime, jms,jme, kms,kme,           &
                    its,ite, jts,jte, kts,kte,           &
                    idiagee, updfra, wulcl, wup,         &
                    umfout, uerout, udrout,              & ! rce 11-may-2012
                    dmfout, derout, ddrout,              & !         "
                    shcu_aerosols_opt,                   & !         "
                    flag_chem, num_chem,                 & !         "
                    wact, qndrop1d, qc1d, qi1d,          & !         "
                    fcvt_qc_to_qi, fcvt_qc_to_pr,        & !         "
                    fcvt_qi_to_pr, chem1d,               & !         "
#if ( WRF_CHEM == 1 )
                    maxd_acomp, maxd_aphase,             & !         "
                    maxd_atype, maxd_asize,              & !         "
                    ntype_aer, nsize_aer, ncomp_aer,     & !         "
                    ai_phase, msectional,                & !         "
                    massptr_aer, numptr_aer,             & !         "
                    dlo_sect, dhi_sect,                  & !         "
                    dens_aer, hygro_aer, sigmag_aer      ) !         "
#else
                    1, 1,                                & !         "
                    1, 1                                 ) ! rce 11-may-2012
#endif

               !!shall(i,j) = real(ishall)
               !!do k=kts,kte
               !!   cldfra_cup(i,k,j) = 0.
               !!end do

               ! rce 11-may-2012 *** currently, clouds produce by this call to kf_cup_para do not
               ! rce 11-may-2012 ***    produce any "cup" diagnostics and do not used by chem_cup
               ! rce 11-may-2012 *** may want to change that eventually
               
            end if main_test_on_cupflag  ! rce 11-may-2012
            

! This was moved from earlier in the routine...
      IF(PRESENT(rthcuten).AND.PRESENT(rqvcuten)) THEN
         DO K=kts,kte
            RTHCUTEN(I,K,J)=DTDT(K)/pi(I,K,J)
            RQVCUTEN(I,K,J)=DQDT(K)
         ENDDO
      ENDIF
! wig: end

            IF(PRESENT(rqrcuten).AND.PRESENT(rqccuten)) THEN
              IF( F_QR )THEN
                DO K=kts,kte
                   RQRCUTEN(I,K,J)=DQRDT(K)
                   RQCCUTEN(I,K,J)=DQCDT(K)
                ENDDO
              ELSE
! This is the case for Eta microphysics without 3d rain field
                DO K=kts,kte
                   RQRCUTEN(I,K,J)=0.
                   RQCCUTEN(I,K,J)=DQRDT(K)+DQCDT(K)
                ENDDO
              ENDIF
            ENDIF

!......     QSTEN STORES GRAUPEL TENDENCY IF IT EXISTS, OTHERISE SNOW (V2)

            IF(PRESENT( rqicuten )) THEN
              IF ( F_QI ) THEN
                DO K=kts,kte
                   RQICUTEN(I,K,J)=DQIDT(K)
                ENDDO
              ENDIF
            ENDIF

            IF(PRESENT( rqscuten )) THEN
              IF ( F_QS ) THEN
                DO K=kts,kte
                   RQSCUTEN(I,K,J)=DQSDT(K)
                ENDDO
              ENDIF
            ENDIF
!
         if (idiagee>0) then  ! rce 11-may-2012
            write(*,'(a,3i5,1p,3e11.3)') 'kfcup 3 ishall, cubot/top, nca', ishall, nint(cubot(i,j)), nint(cutop(i,j)), nca(i,j)
            write(*,'(a,5i5,1p,3e11.3)') 'kfcup a08 ishall, i/jpert_deep, cubot/top, nca', ishall, &
               ipert_deepsv, jpert_deepsv, nint(cubot(i,j)), nint(cutop(i,j)), nca(i,j)
         end if

         ENDIF main_test_on_nca  ! rce 11-may-2012

        ENDDO main_loop_on_i  ! rce 11-may-2012
     ENDDO main_loop_on_j  ! rce 11-may-2012
   ENDIF main_test_on_ktau_ntst  ! rce 11-may-2012

!            write(*,*) 'end',raincv,ishall,'end'    !LD, 20-April-2011

   if (idiagff > 0) then  ! rce 11-may-2012
      i = its ; j = jts
      write(*,'(a,i5,10x,l5,3i5,f10.1,1p,2e10.2)') 'kfcup a09 ktau;    cupflag,ishall,bot/top; nca,cldfra,rqvcuten', &
         ktau, cupflag(i,j), nint(shall(i,j)), nint(cubot(i,j)), nint(cutop(i,j)), nca(i,j), &
         maxval(cldfra_cup(i,kts:kte-2,j)), maxval(rqvcuten(i,kts:kte-2,j))
      write(*,'(a,10i5)') 'kfcup a10 maxlocs for cldfra_cup & rqvcuten', &
         maxloc(cldfra_cup(i,kts:kte-2,j)), maxloc(rqvcuten(i,kts:kte-2,j))
      write(*,'(a,i7,l5,3i5,2f10.1)') 'kfcup_a20 ktau, cupflag, ishall, bot/top, nca, tcloud', &
         ktau, cupflag(i,j), nint(shall(i,j)), nint(cubot(i,j)), nint(cutop(i,j)), nca(i,j), tcloud_cup(i,j)
   end if

   END SUBROUTINE KF_cup_CPS
! ****************************************************************************
!-----------------------------------------------------------

   SUBROUTINE KF_cup_PARA ( GRID_ID, KTAU,                 & ! rce 11-may-2012 2,20
                      I, J,                                &
                      U0,V0,T0,QV0,P0,DZQ,W0AVG1D,         &
                      DT,DX,DXSQ,rhoe,                     &
                      XLV0,XLV1,XLS0,XLS1,CP,R,G,          &
                      EP2,SVP1,SVP2,SVP3,SVPT0,            &
                      pblh,z_at_w1d,cupflag,               & !wig, 21-Feb-2008
                      th_perturb,r_perturb,                & !wig, 25-Aug-2006
                      freq,                                & !lkb, 15-Aug-2008
                      ishall,qlg,qig,                      & !wig, 25-Aug-2006
                      DQDT,DQIDT,DQCDT,DQRDT,DQSDT,DTDT,   &
                      RAINCV,NCA,NTST,                     & !LD, add PRATEC 21-Apr-2011
                      F_QI,F_QS,warm_rain,                 &
                      CUTOP,CUBOT, wLCL,                   &
                      ids,ide, jds,jde, kds,kde,           &
                      ims,ime, jms,jme, kms,kme,           &
                      its,ite, jts,jte, kts,kte,           & ! rce 11-may-2012
                      idiagee, updfra, wulcl, wup,         & !         "
                      umfout, uerout, udrout,              & !         "
                      dmfout, derout, ddrout,              & !         "
                      shcu_aerosols_opt,                   & !         "
                      flag_chem, num_chem,                 & !         "
                      wact, qndrop1d, qc1d, qi1d,          & !         "
                      fcvt_qc_to_qi, fcvt_qc_to_pr,        & !         "
                      fcvt_qi_to_pr, chem1d,               & !         "
                      maxd_acomp, maxd_aphase,             & !         "
                      maxd_atype, maxd_asize,              & !         "
                      ntype_aer, nsize_aer, ncomp_aer,     & !         "
                      ai_phase, msectional,                & !         "
                      massptr_aer, numptr_aer,             & !         "
                      dlo_sect, dhi_sect,                  & !         "
                      dens_aer, hygro_aer, sigmag_aer      ) ! rce 11-may-2012

!-----------------------------------------------------------
!***** The KF scheme that is currently used in experimental runs of EMCs 
!***** Eta model....jsk 8/00
!
      IMPLICIT NONE
!-----------------------------------------------------------
      INTEGER, INTENT(IN   ) :: ids,ide, jds,jde, kds,kde, &
                                ims,ime, jms,jme, kms,kme, &
                                its,ite, jts,jte, kts,kte, &
                                I,J,NTST,                  &
                                GRID_ID, KTAU                ! rce 11-may-2012
          ! ,P_QI,P_QS,P_FIRST_SCALAR

      LOGICAL, INTENT(IN   ) :: F_QI, F_QS

      LOGICAL, INTENT(IN   ) ::                 warm_rain, &
                                                  cupflag    !CuP, wig 9-Oct-2006
!
      REAL, DIMENSION( kts:kte ),                          &
            INTENT(IN   ) ::                           U0, &
                                                       V0, &
                                                       T0, &
                                                      QV0, &
                                                       P0, &
                                                     rhoe, &
                                                      DZQ, &
                                                  W0AVG1D, &
                                                 z_at_w1d    !wig, 21-Feb-2008
!
      REAL,  INTENT(IN   ) :: DT,DX,DXSQ, &
                              pblh, &                  !wig, 21-Feb-2008
                              th_perturb, r_perturb, & !wig, 25-Aug-2006
                              freq                     !lkb, 15-Aug-2008
!

      REAL,  INTENT(IN   ) :: XLV0,XLV1,XLS0,XLS1,CP,R,G
      REAL,  INTENT(IN   ) :: EP2,SVP1,SVP2,SVP3,SVPT0

!
      REAL, DIMENSION( kts:kte ), INTENT(INOUT) ::         &
                                                     DQDT, &
                                                    DQIDT, &
                                                    DQCDT, &
                                                    DQRDT, &
                                                    DQSDT, &
                                                     DTDT

      REAL,    DIMENSION( ims:ime , jms:jme ),             &
            INTENT(INOUT) ::                          NCA

      REAL, DIMENSION( ims:ime , jms:jme ),                &
            INTENT(INOUT) ::                       RAINCV   !LD, add PRATEC 21-Apr-2011

      integer, intent(out) ::                      ishall    !wig, 25-Aug-2006 (was local before)
      real, intent(out) ::                         wLCL      !lkb, 29-April-2010
      REAL, DIMENSION( kts:kte ), INTENT(OUT) ::           &
                                                      qlg, & !wig, 20-Sep-2006 (was local before)
                                                      qig    !wig, 20-Sep-2006 (was local before)
      REAL, DIMENSION( ims:ime , jms:jme ),                &
            INTENT(OUT) ::                          CUBOT, &
                                                    CUTOP

! rce 11-may-2012 mods start -------------------------------------------
      INTEGER, INTENT(IN   ) ::                   idiagee, &
                                        shcu_aerosols_opt, &
                                                 num_chem

      LOGICAL, INTENT(IN   ) ::                 flag_chem   

      REAL, INTENT(OUT  ) ::                       updfra, &
                                                    wulcl, &
                                                     wact

      REAL, DIMENSION( kts:kte ),                          &
            INTENT(INOUT) ::                       umfout, &
                                                   uerout, &
                                                   udrout, &
                                                   dmfout, &
                                                   derout, &
                                                   ddrout, &
                                                   wup   

      REAL, DIMENSION( kts:kte ),                          &
            INTENT(INOUT) ::                     qndrop1d, &
                                                     qc1d, &
                                                     qi1d, &
                                            fcvt_qc_to_qi, &
                                            fcvt_qc_to_pr, &
                                            fcvt_qi_to_pr   

      REAL, DIMENSION( kts:kte, 1:num_chem ),              &
            INTENT(INOUT) ::                       chem1d   

      INTEGER, INTENT(IN   ) ::                maxd_acomp, &
                                              maxd_aphase, &
                                               maxd_atype, &
                                               maxd_asize

      INTEGER, INTENT(IN   ), OPTIONAL ::       ntype_aer, &
                                    nsize_aer(maxd_atype), &
                                    ncomp_aer(maxd_atype), &
                                                 ai_phase, &
                                               msectional, &
         massptr_aer(maxd_acomp,maxd_asize,maxd_atype,maxd_aphase), &
            numptr_aer(maxd_asize,maxd_atype,maxd_aphase)   

      REAL, DIMENSION( maxd_asize, maxd_atype ),           &
            INTENT(IN   ), OPTIONAL :: dlo_sect, dhi_sect, &
                                               sigmag_aer   

      REAL, DIMENSION( maxd_acomp, maxd_atype ),           &
            INTENT(IN   ), OPTIONAL :: dens_aer, hygro_aer  
! rce 11-may-2012 mods end ---------------------------------------------

!
!...DEFINE LOCAL VARIABLES...
!
      REAL, DIMENSION( kts:kte ) ::                        &
            Q0,Z0,TV0,TU,TVU,QU,TZ,TVD,                    &
            QD,QES,THTES,TG,TVG,QG,WU,WD,W0,EMS,EMSD,      &
            UMF,UER,UDR,DMF,DER,DDR,UMF2,UER2,             &
            UDR2,DMF2,DER2,DDR2,DZA,THTA0,THETEE,          &
            THTAU,THETEU,THTAD,THETED,QLIQ,QICE,           &
            QLQOUT,QICOUT,PPTLIQ,PPTICE,DETLQ,DETIC,       &
            DETLQ2,DETIC2,RATIO,RATIO2


      REAL, DIMENSION( kts:kte ) ::                        &
            DOMGDP,EXN,TVQU,DP,RH,EQFRC,WSPD,              &
            QDT,FXM,THTAG,THPA,THFXOUT,                    &
            THFXIN,QPA,QFXOUT,QFXIN,QLPA,QLFXIN,           &
            QLFXOUT,QIPA,QIFXIN,QIFXOUT,QRPA,              &
            QRFXIN,QRFXOUT,QSPA,QSFXIN,QSFXOUT,            &
            QL0,QI0,QR0,QRG,QS0,QSG


      REAL, DIMENSION( kts:kte+1 ) :: OMG
      REAL, DIMENSION( kts:kte ) :: RAINFB,SNOWFB
      REAL, DIMENSION( kts:kte ) ::                        &
            CLDHGT,QSD,DILFRC,DDILFRC,TKE,TGU,QGU,THTEEG

! LOCAL VARS

      REAL    :: P00,T00,RLF,RHIC,RHBC,PIE,         &
                 TTFRZ,TBFRZ,C5,RATE
      REAL    :: GDRY,ROCP,ALIQ,BLIQ,                      &
                 CLIQ,DLIQ
      REAL    :: FBFRC,P300,DPTHMX,THMIX,QMIX,ZMIX,PMIX,   &
                 ROCPQ,TMIX,EMIX,TLOG,TDPT,TLCL,TVLCL,     &
                 CPORQ,PLCL,ES,DLP,TENV,QENV,TVEN,TVBAR,   &
                 ZLCL,WKL,WABS,TRPPT,WSIGNE,DTLCL,GDT,     &
                 !!ZLCL,WKL,WABS,TRPPT,WSIGNE,DTLCL,GDT,WLCL,&
                 TVAVG,QESE,WTW,RHOLCL,AU0,VMFLCL,UPOLD,   &
                 UPNEW,ABE,WKLCL,TTEMP,FRC1,   &
                 QNEWIC,RL,R1,QNWFRZ,EFFQ,BE,BOTERM,ENTERM,&
                 DZZ,UDLBE,REI,EE2,UD2,TTMP,F1,F2,         &
                 THTTMP,QTMP,TMPLIQ,TMPICE,TU95,TU10,EE1,  &
                 UD1,DPTT,QNEWLQ,DUMFDP,EE,TSAT,           &
                 THTA,VCONV,TIMEC,SHSIGN,VWS,PEF, &
                 CBH,RCBH,PEFCBH,PEFF,PEFF2,TDER,THTMIN,   &
                 DTMLTD,QS,TADVEC,DPDD,FRC,DPT,RDD,A1,     &
                 DSSDT,DTMP,T1RH,QSRH,PPTFLX,CPR,CNDTNF,   &
                 UPDINC,AINCM2,DEVDMF,PPR,RCED,DPPTDF,     &
                 DMFLFS,DMFLFS2,RCED2,DDINC,AINCMX,AINCM1, &
                 AINC,TDER2,PPTFL2,FABE,STAB,DTT,DTT1,     &
                 DTIME,TMA,TMB,TMM,BCOEFF,ACOEFF,QVDIFF,   &
                 TOPOMG,CPM,DQ,ABEG,DABE,DFDA,FRC2,DR,     &
                 UDFRC,TUC,QGS,RH0,RHG,QINIT,QFNL,ERR2,    &
                 RELERR,RLC,RLS,RNC,FABEOLD,AINCOLD,UEFRC, &
                 DDFRC,TDC,DEFRC,RHBAR,DMFFRC,DPMIN,DILBE
   REAL    ::    TIMEC_SHALL                               ! Added by lkb, 10/31/10
   REAL    ::    ASTRT,TP,VALUE,AINTRP,TKEMAX,QFRZ,&
                 QSS,PPTMLT,DTMELT,RHH,EVAC,BINC
!
      INTEGER :: INDLU,NU,NUCHM,NNN,KLFS
   REAL    :: CHMIN,PM15,CHMAX,DTRH,RAD,DPPP
   REAL    :: TVDIFF,DTTOT,ABSOMG,ABSOMGTC,FRDP

      INTEGER :: KX,K,KL
!
      INTEGER :: NCHECK
      INTEGER, DIMENSION (kts:kte) :: KCHECK

      INTEGER :: ISTOP,ML,L5,KMIX,LOW,                     &
                 LC,MXLAYR,LLFC,NLAYRS,NK,                 &
                 !KPBL,KLCL,LCL,LET,IFLAG,                  &
                 KCLDLAYER,KLCL,LCL,LET,IFLAG,                  &
                 NK1,LTOP,NJ,LTOP1,                        &
                 LTOPM1,LVF,KSTART,KMIN,LFS,               &
                 ND,NIC,LDB,LDT,ND1,NDK,                   &
                 NM,LMAX,NCOUNT,NOITR,                     &
                 NSTEP,NTC,NCHM,NSHALL
      LOGICAL :: IPRNT
      CHARACTER*1024 message

      INTEGER :: ksvaa                                  ! rce 11-may-2012
      REAL :: rho_act, tk_act, w_act, w_act_eff         ! rce 11-may-2012
      REAL :: qndrop_tmp                                ! rce 11-may-2012
      REAL :: tmpa, tmpb, tmpc, tmpd, tmpe, tmpf, tmpg, tmph, tmpi
      REAL :: tmp_alphabn, tmp_ebn, tmp_escale, tmp_lv  ! rce 11-may-2012
      REAL :: tmp_deltarh, tmp_deltatk, tmp_deltatkfact ! rce 11-may-2012
      REAL :: qndropbb(kts:kte)                         ! rce 11-may-2012

!
      DATA P00,T00/1.E5,273.16/
      DATA RLF/3.339E5/
      DATA RHIC,RHBC/1.,0.90/
      DATA PIE,TTFRZ,TBFRZ,C5/3.141592654,268.16,248.16,1.0723E-3/
      DATA RATE/0.03/

!-----------------------------------------------------------
      IPRNT=.FALSE.
      GDRY=-G/CP
      ROCP=R/CP
      NSHALL = 0
      KL=kte
      KX=kte

! rce 11-may-2012 mods start -------------------------------------------
      if (idiagee > 0) IPRNT=.TRUE.
      updfra = 0.0
      wup = 0.0
      wulcl = 0.0
      wact = 0.0
      qndrop1d = 0.0
      qc1d = 0.0
      qi1d = 0.0
      fcvt_qc_to_qi = 0.0
      fcvt_qc_to_pr = 0.0
      fcvt_qi_to_pr = 0.0
      umfout = 0.0
      uerout = 0.0
      udrout = 0.0
      dmfout = 0.0
      derout = 0.0
      ddrout = 0.0
! rce 11-may-2012 mods end ---------------------------------------------

!
!     ALIQ = 613.3
!     BLIQ = 17.502
!     CLIQ = 4780.8
!     DLIQ = 32.19
      ALIQ = SVP1*1000.
      BLIQ = SVP2
      CLIQ = SVP2*SVPT0
      DLIQ = SVP3
!
!
!****************************************************************************
!                                                      ! PPT FB MODS
!...OPTION TO FEED CONVECTIVELY GENERATED RAINWATER    ! PPT FB MODS
!...INTO GRID-RESOLVED RAINWATER (OR SNOW/GRAUPEL)     ! PPT FB MODS
!...FIELD.  "FBFRC" IS THE FRACTION OF AVAILABLE       ! PPT FB MODS
!...PRECIPITATION TO BE FED BACK (0.0 - 1.0)...        ! PPT FB MODS
      FBFRC=0.0                                        ! PPT FB MODS
!...mods to allow shallow convection...
      NCHM = 0
      ISHALL = 0
      DPMIN = 5.E3
!...
      P300=P0(1)-30000.

!... Set time constant for shallow convection
     TIMEC_SHALL = 1800.0                              ! Set to the min value allowed for all convection

!
!...PRESSURE PERTURBATION TERM IS ONLY DEFINED AT MID-POINT OF
!...VERTICAL LAYERS...SINCE TOTAL PRESSURE IS NEEDED AT THE TOP AND
!...BOTTOM OF LAYERS BELOW, DO AN INTERPOLATION...
!
!...INPUT A VERTICAL SOUNDING ... NOTE THAT MODEL LAYERS ARE NUMBERED
!...FROM BOTTOM-UP IN THE KF SCHEME...
!
      ML=0 
!SUE  tmprpsb=1./PSB(I,J)
!SUE  CELL=PTOP*tmprpsb
!
      DO K=1,KX
!
!...IF Q0 IS ABOVE SATURATION VALUE, REDUCE IT TO SATURATION LEVEL...
!
         ES=ALIQ*EXP((BLIQ*T0(K)-CLIQ)/(T0(K)-DLIQ))
         QES(K)=0.622*ES/(P0(K)-ES)
         Q0(K)=AMIN1(QES(K),QV0(K))
         Q0(K)=AMAX1(0.000001,Q0(K))
         QL0(K)=0.
         QI0(K)=0.
         QR0(K)=0.
         QS0(K)=0.
         RH(K) = Q0(K)/QES(K)
         DILFRC(K) = 1.
         TV0(K)=T0(K)*(1.+0.608*Q0(K))
!        RHOE(K)=P0(K)/(R*TV0(K))
!   DP IS THE PRESSURE INTERVAL BETWEEN FULL SIGMA LEVELS...
         DP(K)=rhoe(k)*g*DZQ(k)
! IF Turbulent Kinetic Energy (TKE) is available from turbulent mixing scheme
! use it for shallow convection...For now, assume it is not available....
!         TKE(K) = Q2(I,J,NK)
         TKE(K) = 0.
         CLDHGT(K) = 0.
!        IF(P0(K).GE.500E2)L5=K
         IF(P0(K).GE.0.5*P0(1))L5=K
         IF(P0(K).GE.P300)LLFC=K
         IF(T0(K).GT.T00)ML=K
      ENDDO
!
!...DZQ IS DZ BETWEEN SIGMA SURFACES, DZA IS DZ BETWEEN MODEL HALF LEVEL
        Z0(1)=.5*DZQ(1)
!cdir novector
        DO K=2,KL
          Z0(K)=Z0(K-1)+.5*(DZQ(K)+DZQ(K-1))
          DZA(K-1)=Z0(K)-Z0(K-1)
        ENDDO   
        DZA(KL)=0.
!
!
!  To save time, specify a pressure interval to move up in sequential
!  check of different ~50 mb deep groups of adjacent model layers in
!  the process of identifying updraft source layer (USL).  Note that 
!  this search is terminated as soon as a buoyant parcel is found and 
!  this parcel can produce a cloud greater than specifed minimum depth
!  (CHMIN)...For now, set interval at 15 mb...
!
       NCHECK = 1
       KCHECK(NCHECK)=1
       PM15 = P0(1)-15.E2
       DO K=2,LLFC
         IF(P0(K).LT.PM15)THEN
           NCHECK = NCHECK+1
           KCHECK(NCHECK) = K
           PM15 = PM15-15.E2
         ENDIF
       ENDDO
!
       NU=0
       NUCHM=0
usl:   DO
           NU = NU+1
           IF(NU.GT.NCHECK)THEN 
             IF(ISHALL.EQ.1)THEN
               CHMAX = 0.
               NCHM = 0
               DO NK = 1,NCHECK
                 NNN=KCHECK(NK)
                 IF(CLDHGT(NNN).GT.CHMAX)THEN
                   NCHM = NNN
                   NUCHM = NK
                   CHMAX = CLDHGT(NNN)
                 ENDIF
               ENDDO
               NU = NUCHM-1
               FBFRC=1.
               CYCLE usl
             ELSE
! wig, 29-Aug-2006: I think this is where no convecion occurs. So, force
! ishall to a flag value to indicate this for accounting purposes.
                ishall = 2
               RETURN
             ENDIF
           ENDIF      
           KMIX = KCHECK(NU)
           LOW=KMIX
!...
           LC = LOW
!
!...ASSUME THAT IN ORDER TO SUPPORT A DEEP UPDRAFT YOU NEED A LAYER OF
!...UNSTABLE AIR AT LEAST 50 mb DEEP...TO APPROXIMATE THIS, ISOLATE A
!...GROUP OF ADJACENT INDIVIDUAL MODEL LAYERS, WITH THE BASE AT LEVEL
!...LC, SUCH THAT THE COMBINED DEPTH OF THESE LAYERS IS AT LEAST 50 mb..
!   
           NLAYRS=0
           DPTHMX=0.
           NK=LC-1
           IF ( NK+1 .LT. KTS ) THEN
             WRITE(message,*)'WOULD GO OFF BOTTOM: KF_CUP_PARA I,J,NK',I,J,NK
             CALL wrf_message (TRIM(message)) 
           ELSE
             DO 
               NK=NK+1   
               IF ( NK .GT. KTE ) THEN
                 WRITE(message,*) &
                     'WOULD GO OFF TOP: KF_CUP_PARA I,J,DPTHMX,DPMIN',I,J,DPTHMX,DPMIN
                 CALL wrf_message (TRIM(message))
                 EXIT
               ENDIF
               DPTHMX=DPTHMX+DP(NK)
               NLAYRS=NLAYRS+1
               IF(DPTHMX.GT.DPMIN)THEN
                 EXIT 
               ENDIF
             END DO    
           ENDIF
           IF(DPTHMX.LT.DPMIN)THEN
! wig, 29-Aug-2006: Indicate no convection occurred in ishall.
              ishall = 2
             RETURN
           ENDIF
           !!KPBL=LC+NLAYRS-1   
           KCLDLAYER=LC+NLAYRS-1       ! Added new veriable for top of cloud layer 
           !!if(ishall .eq. 0) KPBL=LC !lkb, changed to only adjust mixed layer depth for deep convection  
!
!...********************************************************
!...for computational simplicity without much loss in accuracy,
!...mix temperature instead of theta for evaluating convective
!...initiation (triggering) potential...
!          THMIX=0.
           TMIX=0.
           QMIX=0.
           ZMIX=0.
           PMIX=0.
!
!...FIND THE THERMODYNAMIC CHARACTERISTICS OF THE LAYER BY
!...MASS-WEIGHTING THE CHARACTERISTICS OF THE INDIVIDUAL MODEL
!...LAYERS...
!
!cdir novector
           !!DO NK=LC,KPBL
           DO NK=LC,KCLDLAYER
             TMIX=TMIX+DP(NK)*T0(NK)
             QMIX=QMIX+DP(NK)*Q0(NK)
             ZMIX=ZMIX+DP(NK)*Z0(NK)
             PMIX=PMIX+DP(NK)*P0(NK)
           ENDDO   
!         THMIX=THMIX/DPTHMX
          TMIX=TMIX/DPTHMX
          QMIX=QMIX/DPTHMX
          ZMIX=ZMIX/DPTHMX
          PMIX=PMIX/DPTHMX
          EMIX=QMIX*PMIX/(0.622+QMIX)
!
!...FIND THE TEMPERATURE OF THE MIXTURE AT ITS LCL...
!
!        TLOG=ALOG(EMIX/ALIQ)
! ...calculate dewpoint using lookup table...
!
          astrt=1.e-3
          ainc=0.075
          a1=emix/aliq
          tp=(a1-astrt)/ainc
          indlu=int(tp)+1
          value=(indlu-1)*ainc+astrt
          aintrp=(a1-value)/ainc
          tlog=aintrp*alu(indlu+1)+(1-aintrp)*alu(indlu)
          TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)
          TLCL=TDPT-(.212+1.571E-3*(TDPT-T00)-4.36E-4*(TMIX-T00))*(TMIX-TDPT)
          TLCL=AMIN1(TLCL,TMIX)
          TVLCL=TLCL*(1.+0.608*QMIX)
          ZLCL = ZMIX+(TLCL-TMIX)/GDRY
          NK = LC-1
          DO 
            NK = NK+1
            KLCL=NK
            IF(ZLCL.LE.Z0(NK) .or. NK.GT.KL)THEN
              EXIT
            ENDIF 
          ENDDO   
          IF(NK.GT.KL)THEN
! wig, 29-Aug-2006: Indicate no convection occurred.
             ishall = 2
            RETURN  
          ENDIF
          K=KLCL-1
          DLP=(ZLCL-Z0(K))/(Z0(KLCL)-Z0(K))
!     
!...ESTIMATE ENVIRONMENTAL TEMPERATURE AND MIXING RATIO AT THE LCL...
!     
          TENV=T0(K)+(T0(KLCL)-T0(K))*DLP
          QENV=Q0(K)+(Q0(KLCL)-Q0(K))*DLP
          TVEN=TENV*(1.+0.608*QENV)
!     
!...CHECK TO SEE IF CLOUD IS BUOYANT USING FRITSCH-CHAPPELL TRIGGER
!...FUNCTION DESCRIBED IN KAIN AND FRITSCH (1992)...W0 IS AN
!...APROXIMATE VALUE FOR THE RUNNING-MEAN GRID-SCALE VERTICAL
!...VELOCITY, WHICH GIVES SMOOTHER FIELDS OF CONVECTIVE INITIATION
!...THAN THE INSTANTANEOUS VALUE...FORMULA RELATING TEMPERATURE
!...PERTURBATION TO VERTICAL VELOCITY HAS BEEN USED WITH THE MOST
!...SUCCESS AT GRID LENGTHS NEAR 25 km.  FOR DIFFERENT GRID-LENGTHS,
!...ADJUST VERTICAL VELOCITY TO EQUIVALENT VALUE FOR 25 KM GRID
!...LENGTH, ASSUMING LINEAR DEPENDENCE OF W ON GRID LENGTH...
          IF(ZLCL.LT.2.E3)THEN
            WKLCL=0.02*ZLCL/2.E3
          ELSE
            WKLCL=0.02
          ENDIF
          WKL=(W0AVG1D(K)+(W0AVG1D(KLCL)-W0AVG1D(K))*DLP)*DX/25.E3-WKLCL

! CuP, wig, 28-Aug-2006, begin:
!
! Replace KF perturbation temperatures with CuP perturbations. CuP
! perturbations are in potential temp. so convert the theta difference
! to a temperature difference. For the moisture perturbation, convert
! the CuP mixing ratio (kg/kg) into a virtual temperature adjustment.
!
! Standard KF way...
          if( .not. cupflag ) then
             IF(WKL.LT.0.0001)THEN
                DTLCL=0.
             ELSE 
                DTLCL=4.64*WKL**0.33
             ENDIF
             DTRH = 0. !CuP, wig: Move this from a few lines below since
                       !          it is commented out there for CuP.
          else
! New CuP way...
             PLCL=P0(K)+(P0(KLCL)-P0(K))*DLP
             dtlcl = th_perturb*(p00/p0(k))**rocp
             dtrh = 0.608*r_perturb
          end if
! wig: end

!
!...for ETA model, give parcel an extra temperature perturbation based
!...the threshold RH for condensation (U00)...
!
!...for now, just assume U00=0.75...
!...!!!!!! for MM5, SET DTRH = 0. !!!!!!!!
!         U00 = 0.75
!         IF(U00.lt.1.)THEN
!           QSLCL=QES(K)+(QES(KLCL)-QES(K))*DLP
!           RHLCL = QENV/QSLCL
!           DQSSDT = QMIX*(CLIQ-BLIQ*DLIQ)/((TLCL-DLIQ)*(TLCL-DLIQ))
!           IF(RHLCL.ge.0.75 .and. RHLCL.le.0.95)then
!             DTRH = 0.25*(RHLCL-0.75)*QMIX/DQSSDT
!           ELSEIF(RHLCL.GT.0.95)THEN
!             DTRH = (1./RHLCL-1.)*QMIX/DQSSDT
!           ELSE
!!$wig, 28-Aug-2006               DTRH = 0.
!           ENDIF
!         ENDIF   
!         IF(ISHALL.EQ.1)IPRNT=.TRUE.
!         IPRNT=.TRUE.
!         IF(TLCL+DTLCL.GT.TENV)GOTO 45
!

! CuP, wig 28-Aug-2006, begin: Change parcel temperature adjustment
! comparison to use virtual temperature instead of "normal"
! temperature...
!~Check to see if this should be switched back if cupflag==F. Why isn't
! the virt. temp. used in the standard scheme?
!!$trigger:  IF(TLCL+DTLCL+DTRH.LT.TENV)THEN   
          TVLCL=TLCL*(1.+0.608*QMIX)
trigger:  if( tvlcl+dtlcl+dtrh < tven ) then
! wig: end

!
! Parcel not buoyant, CYCLE back to start of trigger and evaluate next potential USL...
!
            CYCLE usl
!
          ELSE                            ! Parcel is buoyant, determine updraft
!     
!...CONVECTIVE TRIGGERING CRITERIA HAS BEEN SATISFIED...COMPUTE
!...EQUIVALENT POTENTIAL TEMPERATURE
!...(THETEU) AND VERTICAL VELOCITY OF THE RISING PARCEL AT THE LCL...
!     
            CALL ENVIRTHT(PMIX,TMIX,QMIX,THETEU(K),ALIQ,BLIQ,CLIQ,DLIQ)
!
!...modify calculation of initial parcel vertical velocity...jsk 11/26/97
!
! CuP, wig 28-Aug-2006: The original KF algorithm sets the parcel's
! initial pert. vertical velocity at the LCL based on the pert.
! temperature, with a minimum W of 3. But, if the pert. temp. is
! negative, a smaller minimum positive W is set (==1). For CuP,
! allow the perturbation to set the W without any constraints
! except that the pert. must be positive.
            DTTOT = DTLCL+DTRH
            IF(DTTOT.GT.1.E-4)THEN
              GDT=2.*G*DTTOT*500./TVEN
              WLCL=1.+0.5*SQRT(GDT)
              if( .not. cupflag ) WLCL = AMIN1(WLCL,3.) !wig 9-Oct-2006
            ELSE
              if( cupflag ) then
                 wlcl = 0.
              else
                 WLCL=1.
              end if
            ENDIF
!print*,'~    dttot and wlcl=',dttot,wlcl
! wig: end
            PLCL=P0(K)+(P0(KLCL)-P0(K))*DLP
            WTW=WLCL*WLCL
!
            TVLCL=TLCL*(1.+0.608*QMIX)
            RHOLCL=PLCL/(R*TVLCL)
!        
            LCL=KLCL
            LET=LCL
! make RAD a function of background vertical velocity...
            IF(WKL.LT.0.)THEN
              RAD = 1000.
            ELSEIF(WKL.GT.0.1)THEN
              RAD = 2000.
            ELSE
              RAD = 1000.+1000*WKL/0.1
            ENDIF
!     
!*******************************************************************
!                                                                  *
!                 COMPUTE UPDRAFT PROPERTIES                       *
!                                                                  *
!*******************************************************************
!     
!     
!...
!...ESTIMATE INITIAL UPDRAFT MASS FLUX (UMF(K))...
!     
            WU(K)=WLCL
            AU0=0.01*DXSQ
            UMF(K)=RHOLCL*AU0
            !!UMF(K)=freq*dxsq*WU(K)*RHOLCL  ! Added by lkb
            VMFLCL=UMF(K)
            UPOLD=VMFLCL
            UPNEW=UPOLD
            ksvaa = k  ! rce 11-may-2012
!     
!...RATIO2 IS THE DEGREE OF GLACIATION IN THE CLOUD (0 TO 1),
!...UER IS THE ENVIR ENTRAINMENT RATE, ABE IS AVAILABLE
!...BUOYANT ENERGY, TRPPT IS THE TOTAL RATE OF PRECIPITATION
!...PRODUCTION...
!     
            RATIO2(K)=0.
            UER(K)=0.
            ABE=0.
            TRPPT=0.
            TU(K)=TLCL
            TVU(K)=TVLCL
            QU(K)=QMIX
            EQFRC(K)=1.
            QLIQ(K)=0.
            QICE(K)=0.
            QLQOUT(K)=0.
            QICOUT(K)=0.
            DETLQ(K)=0.
            DETIC(K)=0.
            PPTLIQ(K)=0.
            PPTICE(K)=0.
            IFLAG=0
!     
!...TTEMP IS USED DURING CALCULATION OF THE LINEAR GLACIATION
!...PROCESS; IT IS INITIALLY SET TO THE TEMPERATURE AT WHICH
!...FREEZING IS SPECIFIED TO BEGIN.  WITHIN THE GLACIATION
!...INTERVAL, IT IS SET EQUAL TO THE UPDRAFT TEMP AT THE
!...PREVIOUS MODEL LEVEL...
!     
            TTEMP=TTFRZ
!     
!...ENTER THE LOOP FOR UPDRAFT CALCULATIONS...CALCULATE UPDRAFT TEMP,
!...MIXING RATIO, VERTICAL MASS FLUX, LATERAL DETRAINMENT OF MASS AND
!...MOISTURE, PRECIPITATION RATES AT EACH MODEL LEVEL...
!     
!     
            EE1=1.
            UD1=0.
            REI = 0.
            DILBE = 0.
            qndropbb(:) = 0.0  ! rce 11-may-2012

updraft:    DO NK=K,KL-1
              NK1=NK+1
              RATIO2(NK1)=RATIO2(NK)
              FRC1=0.
              TU(NK1)=T0(NK1)
              THETEU(NK1)=THETEU(NK)
              QU(NK1)=QU(NK)
              QLIQ(NK1)=QLIQ(NK)
              QICE(NK1)=QICE(NK)
              call tpmix2(p0(nk1),theteu(nk1),tu(nk1),qu(nk1),qliq(nk1),        &
                     qice(nk1),qnewlq,qnewic,XLV1,XLV0)
!
!
!...CHECK TO SEE IF UPDRAFT TEMP IS ABOVE THE TEMPERATURE AT WHICH
!...GLACIATION IS ASSUMED TO INITIATE; IF IT IS, CALCULATE THE
!...FRACTION OF REMAINING LIQUID WATER TO FREEZE...TTFRZ IS THE
!...TEMP AT WHICH FREEZING BEGINS, TBFRZ THE TEMP BELOW WHICH ALL
!...LIQUID WATER IS FROZEN AT EACH LEVEL...
!
              IF(TU(NK1).LE.TTFRZ)THEN
                IF(TU(NK1).GT.TBFRZ)THEN
                  IF(TTEMP.GT.TTFRZ)TTEMP=TTFRZ
                  FRC1=(TTEMP-TU(NK1))/(TTEMP-TBFRZ)
                ELSE
                  FRC1=1.
                  IFLAG=1
                ENDIF
                TTEMP=TU(NK1)
!
!  DETERMINE THE EFFECTS OF LIQUID WATER FREEZING WHEN TEMPERATURE
!...IS BELOW TTFRZ...
!
                ! rce 11-may-2012 - added lines with tmpa/c and fcvt_qc_to_qi
                tmpa = max( 0.0, qliq(nk1)+qnewlq ) ! qliq before freezing calc
                QFRZ = (QLIQ(NK1)+QNEWLQ)*FRC1
                QNEWIC=QNEWIC+QNEWLQ*FRC1
                QNEWLQ=QNEWLQ-QNEWLQ*FRC1
                QICE(NK1) = QICE(NK1)+QLIQ(NK1)*FRC1
                QLIQ(NK1) = QLIQ(NK1)-QLIQ(NK1)*FRC1
                tmpc = max( 0.0, qliq(nk1)+qnewlq ) ! qliq after  freezing calc
                fcvt_qc_to_qi(nk1) = max( 0.0, tmpa-tmpc ) / max( 1.0e-10, tmpa )
                CALL DTFRZNEW(TU(NK1),P0(NK1),THETEU(NK1),QU(NK1),QFRZ,         &
                          QICE(NK1),ALIQ,BLIQ,CLIQ,DLIQ)
              ENDIF
              TVU(NK1)=TU(NK1)*(1.+0.608*QU(NK1))
!
!  CALCULATE UPDRAFT VERTICAL VELOCITY AND PRECIPITATION FALLOUT...
!
              IF(NK.EQ.K)THEN
                BE=(TVLCL+TVU(NK1))/(TVEN+TV0(NK1))-1.
                BOTERM=2.*(Z0(NK1)-ZLCL)*G*BE/1.5
                DZZ=Z0(NK1)-ZLCL
              ELSE
                BE=(TVU(NK)+TVU(NK1))/(TV0(NK)+TV0(NK1))-1.
                BOTERM=2.*DZA(NK)*G*BE/1.5
                DZZ=DZA(NK)
              ENDIF
              ENTERM=2.*REI*WTW/UPOLD

              ! rce 11-may-2012 - added lines with tmpa/b/c and fcvt_q?_to_pr
              tmpa = max( 0.0, qliq(nk1)+qnewlq ) ! qliq before precip calc
              tmpb = max( 0.0, qice(nk1)+qnewic ) ! qice before precip calc
              CALL CONDLOAD(QLIQ(NK1),QICE(NK1),WTW,DZZ,BOTERM,ENTERM,      &
                        RATE,QNEWLQ,QNEWIC,QLQOUT(NK1),QICOUT(NK1),G)
              tmpc = max( 0.0, qliq(nk1)+qnewlq ) ! qliq after  precip calc
              fcvt_qc_to_pr(nk1) = max( 0.0, tmpa-tmpc ) / max( 1.0e-10, tmpa )
              tmpc = max( 0.0, qice(nk1)+qnewic ) ! qice after  precip calc
              fcvt_qi_to_pr(nk1) = max( 0.0, tmpb-tmpc ) / max( 1.0e-10, tmpb )

!
!...IF VERT VELOCITY IS LESS THAN ZERO, EXIT THE UPDRAFT LOOP AND,
!...IF CLOUD IS TALL ENOUGH, FINALIZE UPDRAFT CALCULATIONS...
!
              IF(WTW.LT.1.E-3)THEN
                EXIT
              ELSE
                WU(NK1)=SQRT(WTW)
              ENDIF
!...Calculate value of THETA-E in environment to entrain into updraft...
!
              CALL ENVIRTHT(P0(NK1),T0(NK1),Q0(NK1),THETEE(NK1),ALIQ,BLIQ,CLIQ,DLIQ)
!
!...REI IS THE RATE OF ENVIRONMENTAL INFLOW...
!
              REI=VMFLCL*DP(NK1)*0.03/RAD
              TVQU(NK1)=TU(NK1)*(1.+0.608*QU(NK1)-QLIQ(NK1)-QICE(NK1))
              IF(NK.EQ.K)THEN
                DILBE=((TVLCL+TVQU(NK1))/(TVEN+TV0(NK1))-1.)*DZZ
              ELSE
                DILBE=((TVQU(NK)+TVQU(NK1))/(TV0(NK)+TV0(NK1))-1.)*DZZ
              ENDIF
              IF(DILBE.GT.0.)ABE=ABE+DILBE*G
!
!...IF CLOUD PARCELS ARE VIRTUALLY COLDER THAN THE ENVIRONMENT, MINIMAL 
!...ENTRAINMENT (0.5*REI) IS IMPOSED...
!
              IF(TVQU(NK1).LE.TV0(NK1))THEN    ! Entrain/Detrain IF BLOCK
                EE2=0.5
                UD2=1.
                EQFRC(NK1)=0.
              ELSE
                LET=NK1
                TTMP=TVQU(NK1)
!
!...DETERMINE THE CRITICAL MIXED FRACTION OF UPDRAFT AND ENVIRONMENTAL AIR...
!
                F1=0.95
                F2=1.-F1
                THTTMP=F1*THETEE(NK1)+F2*THETEU(NK1)
                QTMP=F1*Q0(NK1)+F2*QU(NK1)
                TMPLIQ=F2*QLIQ(NK1)
                TMPICE=F2*QICE(NK1)
                call tpmix2(p0(nk1),thttmp,ttmp,qtmp,tmpliq,tmpice,        &
                           qnewlq,qnewic,XLV1,XLV0)
                TU95=TTMP*(1.+0.608*QTMP-TMPLIQ-TMPICE)
                IF(TU95.GT.TV0(NK1))THEN
                  EE2=1.
                  UD2=0.
                  EQFRC(NK1)=1.0
                ELSE
                  F1=0.10
                  F2=1.-F1
                  THTTMP=F1*THETEE(NK1)+F2*THETEU(NK1)
                  QTMP=F1*Q0(NK1)+F2*QU(NK1)
                  TMPLIQ=F2*QLIQ(NK1)
                  TMPICE=F2*QICE(NK1)
                  call tpmix2(p0(nk1),thttmp,ttmp,qtmp,tmpliq,tmpice,        &
                               qnewlq,qnewic,XLV1,XLV0)
                  TU10=TTMP*(1.+0.608*QTMP-TMPLIQ-TMPICE)
                  TVDIFF = ABS(TU10-TVQU(NK1))
                  IF(TVDIFF.LT.1.e-3)THEN
                    EE2=1.
                    UD2=0.
                    EQFRC(NK1)=1.0
                  ELSE
                    EQFRC(NK1)=(TV0(NK1)-TVQU(NK1))*F1/(TU10-TVQU(NK1))
                    EQFRC(NK1)=AMAX1(0.0,EQFRC(NK1))
                    EQFRC(NK1)=AMIN1(1.0,EQFRC(NK1))
                    IF(EQFRC(NK1).EQ.1)THEN
                      EE2=1.
                      UD2=0.
                    ELSEIF(EQFRC(NK1).EQ.0.)THEN
                      EE2=0.
                      UD2=1.
                    ELSE
!
!...SUBROUTINE PROF5 INTEGRATES OVER THE GAUSSIAN DIST TO DETERMINE THE
!   FRACTIONAL ENTRAINMENT AND DETRAINMENT RATES...
!
                      CALL PROF5(EQFRC(NK1),EE2,UD2)
                    ENDIF
                  ENDIF
                ENDIF
              ENDIF                            ! End of Entrain/Detrain IF BLOCK
!
!
!...NET ENTRAINMENT AND DETRAINMENT RATES ARE GIVEN BY THE AVERAGE FRACTIONAL
!   VALUES IN THE LAYER...
!
              EE2 = AMAX1(EE2,0.5)
              UD2 = 1.5*UD2
              UER(NK1)=0.5*REI*(EE1+EE2)
              UDR(NK1)=0.5*REI*(UD1+UD2)
!
!...IF THE CALCULATED UPDRAFT DETRAINMENT RATE IS GREATER THAN THE TOTAL
!   UPDRAFT MASS FLUX, ALL CLOUD MASS DETRAINS, EXIT UPDRAFT CALCULATIONS...
!
              IF(UMF(NK)-UDR(NK1).LT.10.)THEN
!
!...IF THE CALCULATED DETRAINED MASS FLUX IS GREATER THAN THE TOTAL UPD MASS
!   FLUX, IMPOSE TOTAL DETRAINMENT OF UPDRAFT MASS AT THE PREVIOUS MODEL LVL..
!   First, correct ABE calculation if needed...
!
                IF(DILBE.GT.0.)THEN
                  ABE=ABE-DILBE*G
                ENDIF
                LET=NK
!               WRITE(98,1015)P0(NK1)/100.
                EXIT 
              ELSE
                EE1=EE2
                UD1=UD2
                UPOLD=UMF(NK)-UDR(NK1)
                UPNEW=UPOLD+UER(NK1)
                UMF(NK1)=UPNEW
                DILFRC(NK1) = UPNEW/UPOLD
!
!...DETLQ AND DETIC ARE THE RATES OF DETRAINMENT OF LIQUID AND
!...ICE IN THE DETRAINING UPDRAFT MASS...
!
                DETLQ(NK1)=QLIQ(NK1)*UDR(NK1)
                DETIC(NK1)=QICE(NK1)*UDR(NK1)
                QDT(NK1)=QU(NK1)
                QU(NK1)=(UPOLD*QU(NK1)+UER(NK1)*Q0(NK1))/UPNEW
                THETEU(NK1)=(THETEU(NK1)*UPOLD+THETEE(NK1)*UER(NK1))/UPNEW
                QLIQ(NK1)=QLIQ(NK1)*UPOLD/UPNEW
                QICE(NK1)=QICE(NK1)*UPOLD/UPNEW
!
!...PPTLIQ IS THE RATE OF GENERATION (FALLOUT) OF
!...LIQUID PRECIP AT A GIVEN MODEL LVL, PPTICE THE SAME FOR ICE,
!...TRPPT IS THE TOTAL RATE OF PRODUCTION OF PRECIP UP TO THE
!...CURRENT MODEL LEVEL...
!
                PPTLIQ(NK1)=QLQOUT(NK1)*UMF(NK)
                PPTICE(NK1)=QICOUT(NK1)*UMF(NK)
!
                TRPPT=TRPPT+PPTLIQ(NK1)+PPTICE(NK1)
                !!IF(NK1.LE.KPBL)UER(NK1)=UER(NK1)+VMFLCL*DP(NK1)/DPTHMX
                IF(NK1.LE.KCLDLAYER)UER(NK1)=UER(NK1)+VMFLCL*DP(NK1)/DPTHMX
              ENDIF
!
            END DO updraft
!
!...CHECK CLOUD DEPTH...IF CLOUD IS TALL ENOUGH, ESTIMATE THE EQUILIBRIU
!   TEMPERATURE LEVEL (LET) AND ADJUST MASS FLUX PROFILE AT CLOUD TOP SO
!   THAT MASS FLUX DECREASES TO ZERO AS A LINEAR FUNCTION OF PRESSURE BE
!   THE LET AND CLOUD TOP...
!     
!...LTOP IS THE MODEL LEVEL JUST BELOW THE LEVEL AT WHICH VERTICAL VELOC
!   FIRST BECOMES NEGATIVE...
!     
            LTOP=NK
            CLDHGT(LC)=Z0(LTOP)-ZLCL 
!
!...Instead of using the same minimum cloud height (for deep convection)
!...everywhere, try specifying minimum cloud depth as a function of TLCL...
!
!
!
            IF(TLCL.GT.293.)THEN
              CHMIN = 4.E3
            ELSEIF(TLCL.LE.293. .and. TLCL.GE.273)THEN
              CHMIN = 2.E3 + 100.*(TLCL-273.)
            ELSEIF(TLCL.LT.273.)THEN
              CHMIN = 2.E3
            ENDIF

!     
!...If cloud top height is less than the specified minimum for deep 
!...convection, save value to consider this level as source for 
!...shallow convection, go back up to check next level...
!     
!...Try specifying minimum cloud depth as a function of TLCL...
!
!
!...DO NOT ALLOW ANY CLOUD FROM THIS LAYER IF:
!
!...            1.) if there is no CAPE, or 
!...            2.) cloud top is at model level just above LCL, or
!...            3.) cloud top is within updraft source layer, or
!...            4.) cloud-top detrainment layer begins within 
!...                updraft source layer.
!
            !!IF(LTOP.LE.KLCL .or. LTOP.LE.KPBL .or. LET+1.LE.KPBL)THEN  ! No Convection Allowed
            IF(LTOP.LE.KLCL .or. LTOP.LE.KCLDLAYER .or. LET+1.LE.KCLDLAYER)THEN  ! No Convection Allowed
              CLDHGT(LC)=0.
              DO NK=K,LTOP
                UMF(NK)=0.
                UDR(NK)=0.
                UER(NK)=0.
                DETLQ(NK)=0.
                DETIC(NK)=0.
                PPTLIQ(NK)=0.
                PPTICE(NK)=0.
              ENDDO
!        
            ELSEIF(CLDHGT(LC).GT.CHMIN .and. ABE.GT.1)THEN      ! Deep Convection allowed
              ISHALL=0
              EXIT usl
            ELSE
!
!...TO DISALLOW SHALLOW CONVECTION, COMMENT OUT NEXT LINE !!!!!!!!
              ISHALL = 1
              IF(NU.EQ.NUCHM)THEN
                EXIT usl               ! Shallow Convection from this layer
              ELSE
! Remember this layer (by virtue of non-zero CLDHGT) as potential shallow-cloud layer
                DO NK=K,LTOP
                  UMF(NK)=0.
                  UDR(NK)=0.
                  UER(NK)=0.
                  DETLQ(NK)=0.
                  DETIC(NK)=0.
                  PPTLIQ(NK)=0.
                  PPTICE(NK)=0.
                ENDDO
              ENDIF
            ENDIF
          ENDIF trigger
        END DO usl
    IF(ISHALL.EQ.1)THEN
      !!KSTART=MAX0(KPBL,KLCL)
      KSTART=MAX0(KCLDLAYER,KLCL)
      if (idiagee > 0) write(98,'(a,1p,2i5,2x,2i5)') &
         'kfcup let_old, let_new, klcl, ltop', let, kstart, klcl, ltop ! rce 11-may-2012
      LET=KSTART
    endif
!     
!...IF THE LET AND LTOP ARE THE SAME, DETRAIN ALL OF THE UPDRAFT MASS FL
!   THIS LEVEL...
!     
    IF(LET.EQ.LTOP)THEN
      UDR(LTOP)=UMF(LTOP)+UDR(LTOP)-UER(LTOP)
      DETLQ(LTOP)=QLIQ(LTOP)*UDR(LTOP)*UPNEW/UPOLD
      DETIC(LTOP)=QICE(LTOP)*UDR(LTOP)*UPNEW/UPOLD
      UER(LTOP)=0.
      UMF(LTOP)=0.
    ELSE 
!     
!   BEGIN TOTAL DETRAINMENT AT THE LEVEL ABOVE THE LET...
!     
      DPTT=0.
      DO NJ=LET+1,LTOP
        DPTT=DPTT+DP(NJ)
      ENDDO
      DUMFDP=UMF(LET)/DPTT
!     
!...ADJUST MASS FLUX PROFILES, DETRAINMENT RATES, AND PRECIPITATION FALL
!   RATES TO REFLECT THE LINEAR DECREASE IN MASS FLX BETWEEN THE LET AND
!     
      DO NK=LET+1,LTOP
!
!...entrainment is allowed at every level except for LTOP, so disallow
!...entrainment at LTOP and adjust entrainment rates between LET and LTOP
!...so the the dilution factor due to entyrianment is not changed but 
!...the actual entrainment rate will change due due forced total 
!...detrainment in this layer...
!
        IF(NK.EQ.LTOP)THEN
          UDR(NK) = UMF(NK-1)
          UER(NK) = 0.
          DETLQ(NK) = UDR(NK)*QLIQ(NK)*DILFRC(NK)
          DETIC(NK) = UDR(NK)*QICE(NK)*DILFRC(NK)
        ELSE
          UMF(NK)=UMF(NK-1)-DP(NK)*DUMFDP
          UER(NK)=UMF(NK)*(1.-1./DILFRC(NK))
          UDR(NK)=UMF(NK-1)-UMF(NK)+UER(NK)
          DETLQ(NK)=UDR(NK)*QLIQ(NK)*DILFRC(NK)
          DETIC(NK)=UDR(NK)*QICE(NK)*DILFRC(NK)
        ENDIF
        IF(NK.GE.LET+2)THEN
          TRPPT=TRPPT-PPTLIQ(NK)-PPTICE(NK)
          PPTLIQ(NK)=UMF(NK-1)*QLQOUT(NK)
          PPTICE(NK)=UMF(NK-1)*QICOUT(NK)
          TRPPT=TRPPT+PPTLIQ(NK)+PPTICE(NK)
        ENDIF
      ENDDO
    ENDIF
!     
! Initialize some arrays below cloud base and above cloud top...
!
    DO NK=1,K
      IF(NK.GE.LC)THEN
        IF(NK.EQ.LC)THEN
          UMF(NK)=VMFLCL*DP(NK)/DPTHMX
          UER(NK)=VMFLCL*DP(NK)/DPTHMX
        !!ELSEIF(NK.LE.KPBL)THEN
        ELSEIF(NK.LE.KCLDLAYER)THEN
          UER(NK)=VMFLCL*DP(NK)/DPTHMX
          UMF(NK)=UMF(NK-1)+UER(NK)
        ELSE
          UMF(NK)=VMFLCL
          UER(NK)=0.
        ENDIF
        TU(NK)=TMIX+(Z0(NK)-ZMIX)*GDRY
        QU(NK)=QMIX
        WU(NK)=WLCL
      ELSE
        TU(NK)=0.
        QU(NK)=0.
        UMF(NK)=0.
        WU(NK)=0.
        UER(NK)=0.
      ENDIF
      UDR(NK)=0.
      QDT(NK)=0.
      QLIQ(NK)=0.
      QICE(NK)=0.
      QLQOUT(NK)=0.
      QICOUT(NK)=0.
      PPTLIQ(NK)=0.
      PPTICE(NK)=0.
      DETLQ(NK)=0.
      DETIC(NK)=0.
      RATIO2(NK)=0.
      CALL ENVIRTHT(P0(NK),T0(NK),Q0(NK),THETEE(NK),ALIQ,BLIQ,CLIQ,DLIQ)
      EQFRC(NK)=1.0
    ENDDO
!     
      LTOP1=LTOP+1
      LTOPM1=LTOP-1
!     
!...DEFINE VARIABLES ABOVE CLOUD TOP...
!     
      DO NK=LTOP1,KX
        UMF(NK)=0.
        UDR(NK)=0.
        UER(NK)=0.
        QDT(NK)=0.
        QLIQ(NK)=0.
        QICE(NK)=0.
        QLQOUT(NK)=0.
        QICOUT(NK)=0.
        DETLQ(NK)=0.
        DETIC(NK)=0.
        PPTLIQ(NK)=0.
        PPTICE(NK)=0.
        !IF(NK.GT.LTOP1)THEN
        IF(NK.GE.LTOP1)THEN !BSINGH(11/12/2014): So that wu, qu and tu has a value for NK==LTOP1
          TU(NK)=0.
          QU(NK)=0.
          WU(NK)=0.
        ENDIF
        THTA0(NK)=0.
        THTAU(NK)=0.
        EMS(NK)=0.
        EMSD(NK)=0.
        TG(NK)=T0(NK)
        QG(NK)=Q0(NK)
        QLG(NK)=0.
        QIG(NK)=0.
        QRG(NK)=0.
        QSG(NK)=0.
        OMG(NK)=0.
      ENDDO
        OMG(KX+1)=0.

! rce 11-may-2012 mods start -------------------------------------------
!   calc droplet number (qndropbb)
           if ( flag_chem ) then
              do nk1 = klcl, ltop
                 nk = nk1 - 1
                 if (nk1 == klcl) then
!   calculate aerosol activatation at cloud base
                    tk_act = tu(nk1)
                    rho_act = p0(nk1)/(r*tu(nk1)*(1.+0.608*qu(nk1)))
!   with cup, wlcl can be 0.0, so use wu(k+1) when wlcl is small
                    w_act = wlcl
                    if (wlcl < 0.1) w_act = max( w_act, wu(nk1) )

!   effective w_act accounting for entrainment, from Barahona and Nenes (2007) eqn 14b
!
!   w_act_effective = w_act * escale
!
!   escale = 1 + (eBN/alphaBN) * [ (delHv*Mw /(Ru*T*T))*deltaT - deltaRH ]   
!            1 + (eBN/alphaBN) * [ (delHv*ep2/(Ra*T*T))*deltaT - deltaRH ]   
!
!   eBN = entrainment rate = d[ln(updraft_mass_flux)]/dz
!   alphaBN = [g*Mw *delHv/(cp*Ru*T*T)] - [g*Ma/(Ru*T)]
!           = [g*ep2*delHv/(cp*Ra*T*T)] - [g   /(Ra*T)]
!
!   Mw, Ma = molecular weights of water and air ;  ep2 = Mw/Ma
!   delHv = latent heat of vaporization
!   Ru = universal gas constant                 ;  Ra = dry-air gas const
!   deltaT = Tupdr - Tenv                       ;  deltaRH = RHupdr - RHenv = 1 - RHenv
                    tmpa = max( umf(nk), 1.0e-10 )
                    tmpb = max( uer(nk1), 0.0 )
                    tmpe = tmpb/(tmpa+0.5*tmpb)
                    tmp_lv = xlv0 - xlv1*tk_act
                    tmp_deltatkfact = tmp_lv*ep2/(r*tk_act*tk_act)
                    tmp_alphabn = tmp_deltatkfact*g/cp - g/(r*tk_act)
                    tmp_ebn = tmpe/dzq(nk1)
                    tmp_deltatk = tk_act - t0(nk1)
                    tmp_deltarh = 1.0 - q0(nk1)/qu(nk1)
                    tmp_escale = 1.0 + (tmp_ebn/tmp_alphabn) * (tmp_deltatkfact*tmp_deltatk - tmp_deltarh)  
                    w_act_eff = w_act
                    if (qndrop_cldbase_entrain_opt == 1) w_act_eff = w_act*tmp_escale
                    w_act_eff = max( w_act_eff, w_act_min )
                    wact = w_act_eff

                    if (idiagee > 0) then
                       write(98,'(//a,8i5)') 'kfcup bb activate_cldbase_kfcup - i, j, nu, kcheck, ksrc1/2', &
                          i, j, nu, kcheck(nu), lc, kcldlayer
                       write(98,'(  a,3i11     )') 'nk1, klcl, k                      ', nk1, klcl, k
                       write(98,'(  a,3i11     )') 'cldbase_entopt, incloud_entopt    ', qndrop_cldbase_entrain_opt, qndrop_incloud_entrain_opt
                       write(98,'(  a,1p,8e11.3)') 'wlcl, wu(nk1), w_act, _eff, _min  ', wlcl, wu(nk1), w_act, w_act_eff, w_act_min
                       write(98,'(  a,1p,8e11.3)') 'r, p, t, q, rho                   ', r, p0(nk1), tk_act, qu(nk1), rho_act
                       write(98,'(  a,1p,8e11.3)') 'g, r, cp, ep2, xlv0, xlv1, tmp_lv ', g, r, cp, ep2, xlv0, xlv1, tmp_lv
                       write(98,'(  a,1p,8e11.3)') 'tmpa/dx2, tmpb/dx2, tmpe          ', tmpa/dxsq, tmpb/dxsq, tmpe
                       write(98,'(  a,1p,8e11.3)') 'ebn, dzq(nk1), dz...              ', tmp_ebn, dzq(nk1), z_at_w1d(nk1+1)-z_at_w1d(nk1)
                       write(98,'(  a,1p,8e11.3)') 'deltarh, deltatk, deltatk*factor  ', tmp_deltarh, tmp_deltatk, tmp_deltatk*tmp_deltatkfact
                       write(98,'(  a,1p,8e11.3)') 'escale, alphabn, deltatkfact      ', tmp_escale, tmp_alphabn, tmp_deltatkfact
                    end if
                    call activate_cldbase_kfcup( idiagee, grid_id, ktau, &
                       i, j, nk1, kts, kte, lc, kcldlayer, &
                       num_chem, maxd_acomp, maxd_aphase, maxd_atype, maxd_asize, &
                       ntype_aer, nsize_aer, ncomp_aer, &
                       ai_phase, msectional, massptr_aer, numptr_aer, &
                       dlo_sect, dhi_sect, dens_aer, hygro_aer, sigmag_aer, &
                       tk_act, rho_act, dp, w_act_eff, &
                       chem1d, qndrop_tmp )
                    qndrop_tmp = qndrop_tmp
                 end if

!   calculate dilution from entrainment
!   umf(nk) is flux at bottom of layer nk1 ; uer(nk1) is entrainment (delta-umf) in layer nk1
                 tmpa = max( umf(nk), 1.0e-10 )
                 tmpb = max( uer(nk1), 0.0 )
                 if (qndrop_incloud_entrain_opt == 1) then
!   qndrop at center of layer nk1
                    qndropbb(nk1) = qndrop_tmp*(tmpa/(tmpa+0.5*tmpb))
!   qndrop at top of layer nk1
                    qndrop_tmp = qndrop_tmp*(tmpa/(tmpa+tmpb))
                 else
                    qndropbb(nk1) = qndrop_tmp
                 end if
                 if (idiagee > 0 .and. nk1 <= klcl+4) then
                       write(98,'(  a,i3,1p,8e11.3)') 'nk1, tmpa/dx2, tmpb/dx2, qndrop', nk1, tmpa/dxsq, tmpb/dxsq, qndropbb(nk1)
                 end if
              end do ! nk1
              if (idiagee > 0) write(98,'(a)')
           end if ! ( flag_chem ) then
! rce 11-may-2012 mods end ---------------------------------------------

        DO NK=1,LTOP
          EMS(NK)=DP(NK)*DXSQ/G
          EMSD(NK)=1./EMS(NK)
!     
!...INITIALIZE SOME VARIABLES TO BE USED LATER IN THE VERT ADVECTION SCH
!     
          EXN(NK)=(P00/P0(NK))**(0.2854*(1.-0.28*QDT(NK)))
          THTAU(NK)=TU(NK)*EXN(NK)
          EXN(NK)=(P00/P0(NK))**(0.2854*(1.-0.28*Q0(NK)))
          THTA0(NK)=T0(NK)*EXN(NK)
          DDILFRC(NK) = 1./DILFRC(NK)
          OMG(NK)=0.
        ENDDO
!     IF (XTIME.LT.10.)THEN
!      WRITE(98,1025)KLCL,ZLCL,DTLCL,LTOP,P0(LTOP),IFLAG,
!    * TMIX-T00,PMIX,QMIX,ABE
!      WRITE(98,1030)P0(LET)/100.,P0(LTOP)/100.,VMFLCL,PLCL/100.,
!    * WLCL,CLDHGT
!     ENDIF
!     
!...COMPUTE CONVECTIVE TIME SCALE(TIMEC). THE MEAN WIND AT THE LCL
!...AND MIDTROPOSPHERE IS USED.
!     
        WSPD(KLCL)=SQRT(U0(KLCL)*U0(KLCL)+V0(KLCL)*V0(KLCL))
        WSPD(L5)=SQRT(U0(L5)*U0(L5)+V0(L5)*V0(L5))
        WSPD(LTOP)=SQRT(U0(LTOP)*U0(LTOP)+V0(LTOP)*V0(LTOP))
        VCONV=.5*(WSPD(KLCL)+WSPD(L5))
!...for ETA model, DX is a function of location...
!       TIMEC=DX(I,J)/VCONV
        TIMEC=DX/VCONV
        TADVEC=TIMEC
        TIMEC=AMAX1(1800.,TIMEC)
        TIMEC=AMIN1(3600.,TIMEC)
        !!IF(ISHALL.EQ.1)TIMEC=2400.
        IF(ISHALL.EQ.1)TIMEC=TIMEC_SHALL  ! Reduced time constant, lkb 3/31/10
        NIC=NINT(TIMEC/DT)
        TIMEC=FLOAT(NIC)*DT
!     
!...COMPUTE WIND SHEAR AND PRECIPITATION EFFICIENCY.
!     
        IF(WSPD(LTOP).GT.WSPD(KLCL))THEN
          SHSIGN=1.
        ELSE
          SHSIGN=-1.
        ENDIF
        VWS=(U0(LTOP)-U0(KLCL))*(U0(LTOP)-U0(KLCL))+(V0(LTOP)-V0(KLCL))*   &
            (V0(LTOP)-V0(KLCL))
        VWS=1.E3*SHSIGN*SQRT(VWS)/(Z0(LTOP)-Z0(LCL))
        PEF=1.591+VWS*(-.639+VWS*(9.53E-2-VWS*4.96E-3))
        PEF=AMAX1(PEF,.2)
        PEF=AMIN1(PEF,.9)
!     
!...PRECIPITATION EFFICIENCY IS A FUNCTION OF THE HEIGHT OF CLOUD BASE.
!     
        CBH=(ZLCL-Z0(1))*3.281E-3
        IF(CBH.LT.3.)THEN
          RCBH=.02
        ELSE
          RCBH=.96729352+CBH*(-.70034167+CBH*(.162179896+CBH*(-            &
               1.2569798E-2+CBH*(4.2772E-4-CBH*5.44E-6))))
        ENDIF
        IF(CBH.GT.25)RCBH=2.4
        PEFCBH=1./(1.+RCBH)
        PEFCBH=AMIN1(PEFCBH,.9)
!     
!... MEAN PEF. IS USED TO COMPUTE RAINFALL.
!     
        PEFF=.5*(PEF+PEFCBH)
        PEFF2 = PEFF                                ! JSK MODS
       IF(IPRNT)THEN  
         WRITE(98,1035)PEF,PEFCBH,LC,LET,WKL,VWS
!       flush(98)   
       endif     
!        WRITE(98,1035)PEF,PEFCBH,LC,LET,WKL,VWS
!*****************************************************************
!                                                                *
!                  COMPUTE DOWNDRAFT PROPERTIES                  *
!                                                                *
!*****************************************************************
!     
!     
       TDER=0.
 devap:IF(ISHALL.EQ.1)THEN
         LFS = 1
         DMF(1:KX)=0.  ! rce 11-may-2012 - zero these out to avoid problems
         DER(1:KX)=0.  !    with unit=98 diagnostic output
         DDR(1:KX)=0.
         WD(1:KX)=0.
         TZ(1:KX)=0.
         QD(1:KX)=0.
         THTAD(1:KX)=0.
       ELSE
!
!...start downdraft about 150 mb above cloud base...
!
!        KSTART=MAX0(KPBL,KLCL)
!        KSTART=KPBL                                  ! Changed 7/23/99
         !!KSTART=KPBL+1                                ! Changed 7/23/99
         KSTART=KCLDLAYER+1                                ! Changed 7/23/99
         KLFS = LET-1
         DO NK = KSTART+1,KL
           DPPP = P0(KSTART)-P0(NK)
!          IF(DPPP.GT.200.E2)THEN
           IF(DPPP.GT.150.E2)THEN
             KLFS = NK
             EXIT 
           ENDIF
         ENDDO
         KLFS = MIN0(KLFS,LET-1)
         LFS = KLFS
!
!...if LFS is not at least 50 mb above cloud base (implying that the 
!...level of equil temp, LET, is just above cloud base) do not allow a
!...downdraft...
!
        IF((P0(KSTART)-P0(LFS)).GT.50.E2)THEN
          THETED(LFS) = THETEE(LFS)
          QD(LFS) = Q0(LFS)
!
!...call tpmix2dd to find wet-bulb temp, qv...
!
          call tpmix2dd(p0(lfs),theted(lfs),tz(lfs),qss,i,j)
          THTAD(LFS)=TZ(LFS)*(P00/P0(LFS))**(0.2854*(1.-0.28*QSS))
!     
!...TAKE A FIRST GUESS AT THE INITIAL DOWNDRAFT MASS FLUX...
!     
          TVD(LFS)=TZ(LFS)*(1.+0.608*QSS)
          RDD=P0(LFS)/(R*TVD(LFS))
          A1=(1.-PEFF)*AU0
          DMF(LFS)=-A1*RDD
          DER(LFS)=DMF(LFS)
          DDR(LFS)=0.
          RHBAR = RH(LFS)*DP(LFS)
          DPTT = DP(LFS)
          DO ND = LFS-1,KSTART,-1
            ND1 = ND+1
            DER(ND)=DER(LFS)*EMS(ND)/EMS(LFS)
            DDR(ND)=0.
            DMF(ND)=DMF(ND1)+DER(ND)
            THETED(ND)=(THETED(ND1)*DMF(ND1)+THETEE(ND)*DER(ND))/DMF(ND)
            QD(ND)=(QD(ND1)*DMF(ND1)+Q0(ND)*DER(ND))/DMF(ND)    
            DPTT = DPTT+DP(ND)
            RHBAR = RHBAR+RH(ND)*DP(ND)
          ENDDO
          RHBAR = RHBAR/DPTT
          DMFFRC = 2.*(1.-RHBAR)
          DPDD = 0.
!...Calculate melting effect
!... first, compute total frozen precipitation generated...
!
          pptmlt = 0.
          DO NK = KLCL,LTOP
            PPTMLT = PPTMLT+PPTICE(NK)
          ENDDO
          if(lc.lt.ml)then
!...For now, calculate melting effect as if DMF = -UMF at KLCL, i.e., as
!...if DMFFRC=1.  Otherwise, for small DMFFRC, DTMELT gets too large!
!...12/14/98 jsk...
            DTMELT = RLF*PPTMLT/(CP*UMF(KLCL))
          else
            DTMELT = 0.
          endif
          LDT = MIN0(LFS-1,KSTART-1)
!
          call tpmix2dd(p0(kstart),theted(kstart),tz(kstart),qss,i,j)
!
          tz(kstart) = tz(kstart)-dtmelt
          ES=ALIQ*EXP((BLIQ*TZ(KSTART)-CLIQ)/(TZ(KSTART)-DLIQ))
          QSS=0.622*ES/(P0(KSTART)-ES)
          THETED(KSTART)=TZ(KSTART)*(1.E5/P0(KSTART))**(0.2854*(1.-0.28*QSS))*    &
                EXP((3374.6525/TZ(KSTART)-2.5403)*QSS*(1.+0.81*QSS))
!....  
          LDT = MIN0(LFS-1,KSTART-1)                        ! Determine the level to start at,
                                                            ! KSTART is level of PBL
          DO ND = LDT,1,-1
            DPDD = DPDD+DP(ND)
            THETED(ND) = THETED(KSTART)
            QD(ND)     = QD(KSTART)       
!
!...call tpmix2dd to find wet bulb temp, saturation mixing ratio...
!
            call tpmix2dd(p0(nd),theted(nd),tz(nd),qss,i,j)
            qsd(nd) = qss
!
!...specify RH decrease of 20%/km in downdraft...
!
            RHH = 1.-0.2/1000.*(Z0(KSTART)-Z0(ND))
!
!...adjust downdraft TEMP, Q to specified RH:
!
            IF(RHH.LT.1.)THEN
              DSSDT=(CLIQ-BLIQ*DLIQ)/((TZ(ND)-DLIQ)*(TZ(ND)-DLIQ))
              RL=XLV0-XLV1*TZ(ND)
              DTMP=RL*QSS*(1.-RHH)/(CP+RL*RHH*QSS*DSSDT)
              T1RH=TZ(ND)+DTMP
              ES=RHH*ALIQ*EXP((BLIQ*T1RH-CLIQ)/(T1RH-DLIQ))  ! Teten's equation to find Es
              QSRH=0.622*ES/(P0(ND)-ES)                      ! Find the sat. mixing ratio
!
!...CHECK TO SEE IF MIXING RATIO AT SPECIFIED RH IS LESS THAN ACTUAL
!...MIXING RATIO...IF SO, ADJUST TO GIVE ZERO EVAPORATION...
!
              IF(QSRH.LT.QD(ND))THEN
                QSRH=QD(ND)
                T1RH=TZ(ND)+(QSS-QSRH)*RL/CP
              ENDIF
              TZ(ND)=T1RH
              QSS=QSRH
              QSD(ND) = QSS
            ENDIF         
            TVD(nd) = tz(nd)*(1.+0.608*qsd(nd))
            IF(TVD(ND).GT.TV0(ND).OR.ND.EQ.1)THEN
              LDB=ND
              EXIT
            ENDIF
          ENDDO
          IF((P0(LDB)-P0(LFS)) .gt. 50.E2)THEN   ! minimum Downdraft depth! 
            DO ND=LDT,LDB,-1
              ND1 = ND+1
              DDR(ND) = -DMF(KSTART)*DP(ND)/DPDD
              DER(ND) = 0.
              DMF(ND) = DMF(ND1)+DDR(ND)
              TDER=TDER+(QSD(nd)-QD(ND))*DDR(ND)
              QD(ND)=QSD(nd)
              THTAD(ND)=TZ(ND)*(P00/P0(ND))**(0.2854*(1.-0.28*QD(ND)))
            ENDDO
          ENDIF
        ENDIF
      ENDIF devap
!
!...IF DOWNDRAFT DOES NOT EVAPORATE ANY WATER FOR SPECIFIED RELATIVE
!...HUMIDITY, NO DOWNDRAFT IS ALLOWED...
!
d_mf:   IF(TDER.LT.1.)THEN
!           WRITE(98,3004)I,J 
!3004       FORMAT(' ','No Downdraft!;  I=',I3,2X,'J=',I3,'ISHALL =',I2)
          PPTFLX=TRPPT
          CPR=TRPPT
          TDER=0.
          CNDTNF=0.
          UPDINC=1.
          LDB=LFS
          DO NDK=1,LTOP
            DMF(NDK)=0.
            DER(NDK)=0.
            DDR(NDK)=0.
            THTAD(NDK)=0.
            WD(NDK)=0.
            TZ(NDK)=0.
            QD(NDK)=0.
          ENDDO
          AINCM2=100.
        ELSE 
          DDINC = -DMFFRC*UMF(KLCL)/DMF(KSTART)
          UPDINC=1.
          IF(TDER*DDINC.GT.TRPPT)THEN
            DDINC = TRPPT/TDER
          ENDIF
          TDER = TDER*DDINC
          DO NK=LDB,LFS
            DMF(NK)=DMF(NK)*DDINC
            DER(NK)=DER(NK)*DDINC
            DDR(NK)=DDR(NK)*DDINC
          ENDDO
         CPR=TRPPT
         PPTFLX = TRPPT-TDER
         PEFF=PPTFLX/TRPPT
         IF(IPRNT)THEN
           write(98,*)'PRECIP EFFICIENCY =',PEFF
!          flush(98)   
         ENDIF
!
!
!...ADJUST UPDRAFT MASS FLUX, MASS DETRAINMENT RATE, AND LIQUID WATER AN
!   DETRAINMENT RATES TO BE CONSISTENT WITH THE TRANSFER OF THE ESTIMATE
!   FROM THE UPDRAFT TO THE DOWNDRAFT AT THE LFS...
!     
!         DO NK=LC,LFS
!           UMF(NK)=UMF(NK)*UPDINC
!           UDR(NK)=UDR(NK)*UPDINC
!           UER(NK)=UER(NK)*UPDINC
!           PPTLIQ(NK)=PPTLIQ(NK)*UPDINC
!           PPTICE(NK)=PPTICE(NK)*UPDINC
!           DETLQ(NK)=DETLQ(NK)*UPDINC
!           DETIC(NK)=DETIC(NK)*UPDINC
!         ENDDO
!     
!...ZERO OUT THE ARRAYS FOR DOWNDRAFT DATA AT LEVELS ABOVE AND BELOW THE
!...DOWNDRAFT...
!     
         IF(LDB.GT.1)THEN
           DO NK=1,LDB-1
             DMF(NK)=0.
             DER(NK)=0.
             DDR(NK)=0.
             WD(NK)=0.
             TZ(NK)=0.
             QD(NK)=0.
             THTAD(NK)=0.
           ENDDO
         ENDIF
         DO NK=LFS+1,KX
           DMF(NK)=0.
           DER(NK)=0.
           DDR(NK)=0.
           WD(NK)=0.
           TZ(NK)=0.
           QD(NK)=0.
           THTAD(NK)=0.
         ENDDO
         DO NK=LDT+1,LFS-1
           TZ(NK)=0.
           QD(NK)=0.
           THTAD(NK)=0.
         ENDDO
       ENDIF d_mf
!
!...SET LIMITS ON THE UPDRAFT AND DOWNDRAFT MASS FLUXES SO THAT THE INFL
!   INTO CONVECTIVE DRAFTS FROM A GIVEN LAYER IS NO MORE THAN IS AVAILAB
!   IN THAT LAYER INITIALLY...
!     
       AINCMX=1000.
       LMAX=MAX0(KLCL,LFS)
       DO NK=LC,LMAX
         !IF((UER(NK)-DER(NK)).GT.1.e-3)THEN
         IF((UER(NK)-DER(NK)).GT.1.e-5)THEN
           AINCM1=EMS(NK)/((UER(NK)-DER(NK))*TIMEC)
           !write(*,*) 'Larry... LMAX ', LMAX, LC, UER(NK), DER(NK)
           AINCMX=AMIN1(AINCMX,AINCM1)
         ENDIF
       ENDDO
       AINC=1.
       IF(AINCMX.LT.AINC)AINC=AINCMX
!     
!...SAVE THE RELEVENT VARIABLES FOR A UNIT UPDRAFT AND DOWNDRAFT...THEY WILL 
!...BE ITERATIVELY ADJUSTED BY THE FACTOR AINC TO SATISFY THE STABILIZATION
!...CLOSURE...
!     
       TDER2=TDER
       PPTFL2=PPTFLX
       DO NK=1,LTOP
         DETLQ2(NK)=DETLQ(NK)
         DETIC2(NK)=DETIC(NK)
         UDR2(NK)=UDR(NK)
         UER2(NK)=UER(NK)
         DDR2(NK)=DDR(NK)
         DER2(NK)=DER(NK)
         UMF2(NK)=UMF(NK)
         DMF2(NK)=DMF(NK)
       ENDDO
       FABE=1.
       STAB=0.95
       NOITR=0
       ISTOP=0
!
        IF(ISHALL.EQ.1)THEN                              ! First for shallow convection
!
! No iteration for shallow convection; if turbulent kinetic energy (TKE) is available
! from a turbulence parameterization, scale cloud-base updraft mass flux as a function
! of TKE, but for now, just specify shallow-cloud mass flux using TKEMAX = 5...
!
!...find the maximum TKE value between LC and KLCL...
!         TKEMAX = 0.
          TKEMAX = 5.
          !!TKEMAX = 10.
!          DO 173 K = LC,KLCL
!            NK = KX-K+1
!            TKEMAX = AMAX1(TKEMAX,Q2(I,J,NK))
! 173      CONTINUE
!          TKEMAX = AMIN1(TKEMAX,10.)
!          TKEMAX = AMAX1(TKEMAX,5.)
!c         TKEMAX = 10.
!c...3_24_99...DPMIN was changed for shallow convection so that it is the
!c...          the same as for deep convection (5.E3).  Since this doubles
!c...          (roughly) the value of DPTHMX, add a factor of 0.5 to calcu-
!c...          lation of EVAC...
!c         EVAC  = TKEMAX*0.1
          EVAC  = 0.5*TKEMAX*0.1
          !!EVAC  = 0.5*TKEMAX*0.1*freq
!         AINC = 0.1*DPTHMX*DXIJ*DXIJ/(VMFLCL*G*TIMEC)
          !!AINC = EVAC*DPTHMX*DX(I,J)*DX(I,J)/(VMFLCL*G*TIMEC)
          !!AINC = EVAC*DPTHMX*DXSQ/(VMFLCL*G*TIMEC)
          AINC = EVAC*DPTHMX*DXSQ/(VMFLCL*G*TIMEC) * freq * 2.0  ! Use factor of two becuase only 1/2 of pdf would be expected to rise
          !!write(*,*) 'Larry ... old AINC ', AINC
          !!AINC = WLCL*freq*DXSQ*RHOLCL/(VMFLCL) ! This version uses mass flux from CuP
          !!AINC = 1

          TDER=TDER2*AINC
          PPTFLX=PPTFL2*AINC
          DO NK=1,LTOP
            UMF(NK)=UMF2(NK)*AINC
            DMF(NK)=DMF2(NK)*AINC
            DETLQ(NK)=DETLQ2(NK)*AINC
            DETIC(NK)=DETIC2(NK)*AINC
            UDR(NK)=UDR2(NK)*AINC
            UER(NK)=UER2(NK)*AINC
            DER(NK)=DER2(NK)*AINC
            DDR(NK)=DDR2(NK)*AINC
          ENDDO
        ENDIF                                           ! Otherwise for deep convection
! use iterative procedure to find mass fluxes...
iter:     DO NCOUNT=1,10
!     
!*****************************************************************
!                                                                *
!           COMPUTE PROPERTIES FOR COMPENSATIONAL SUBSIDENCE     *
!                                                                *
!*****************************************************************
!     
!...DETERMINE OMEGA VALUE NECESSARY AT TOP AND BOTTOM OF EACH LAYER TO
!...SATISFY MASS CONTINUITY...
!     
            DTT=TIMEC
            DO NK=1,LTOP
              DOMGDP(NK)=-(UER(NK)-DER(NK)-UDR(NK)-DDR(NK))*EMSD(NK)
              IF(NK.GT.1)THEN
                OMG(NK)=OMG(NK-1)-DP(NK-1)*DOMGDP(NK-1)
                ABSOMG = ABS(OMG(NK))
                ABSOMGTC = ABSOMG*TIMEC
                FRDP = 0.75*DP(NK-1)
                IF(ABSOMGTC.GT.FRDP)THEN
                  DTT1 = FRDP/ABSOMG
                  DTT=AMIN1(DTT,DTT1)
                ENDIF
              ENDIF
            ENDDO
            DO NK=1,LTOP
              THPA(NK)=THTA0(NK)
              QPA(NK)=Q0(NK)
              NSTEP=NINT(TIMEC/DTT+1)
              DTIME=TIMEC/FLOAT(NSTEP)
              FXM(NK)=OMG(NK)*DXSQ/G
            ENDDO
!     
!...DO AN UPSTREAM/FORWARD-IN-TIME ADVECTION OF THETA, QV...
!     
        DO NTC=1,NSTEP
!     
!...ASSIGN THETA AND Q VALUES AT THE TOP AND BOTTOM OF EACH LAYER BASED
!...SIGN OF OMEGA...
!     
            DO  NK=1,LTOP
              THFXIN(NK)=0.
              THFXOUT(NK)=0.
              QFXIN(NK)=0.
              QFXOUT(NK)=0.
            ENDDO
            DO NK=2,LTOP
              IF(OMG(NK).LE.0.)THEN
                THFXIN(NK)=-FXM(NK)*THPA(NK-1)
                QFXIN(NK)=-FXM(NK)*QPA(NK-1)
                THFXOUT(NK-1)=THFXOUT(NK-1)+THFXIN(NK)
                QFXOUT(NK-1)=QFXOUT(NK-1)+QFXIN(NK)
              ELSE
                THFXOUT(NK)=FXM(NK)*THPA(NK)
                QFXOUT(NK)=FXM(NK)*QPA(NK)
                THFXIN(NK-1)=THFXIN(NK-1)+THFXOUT(NK)
                QFXIN(NK-1)=QFXIN(NK-1)+QFXOUT(NK)
              ENDIF
            ENDDO
!     
!...UPDATE THE THETA AND QV VALUES AT EACH LEVEL...
!     
            DO NK=1,LTOP
              THPA(NK)=THPA(NK)+(THFXIN(NK)+UDR(NK)*THTAU(NK)+DDR(NK)*      &
                       THTAD(NK)-THFXOUT(NK)-(UER(NK)-DER(NK))*THTA0(NK))*  &
                       DTIME*EMSD(NK)
              QPA(NK)=QPA(NK)+(QFXIN(NK)+UDR(NK)*QDT(NK)+DDR(NK)*QD(NK)-    &
                      QFXOUT(NK)-(UER(NK)-DER(NK))*Q0(NK))*DTIME*EMSD(NK)
            ENDDO   
          ENDDO   
          DO NK=1,LTOP
            THTAG(NK)=THPA(NK)
            QG(NK)=QPA(NK)
          ENDDO
!     
!...CHECK TO SEE IF MIXING RATIO DIPS BELOW ZERO ANYWHERE;  IF SO, BORRO
!...MOISTURE FROM ADJACENT LAYERS TO BRING IT BACK UP ABOVE ZERO...
!     
        DO NK=1,LTOP
          IF(QG(NK).LT.0.)THEN
            IF(NK.EQ.1)THEN                             ! JSK MODS
!              PRINT *,' PROBLEM WITH KF SCHEME:  ' ! JSK MODS
!              PRINT *,'QG = 0 AT THE SURFACE!!!!!!!'    ! JSK MODS
              CALL wrf_error_fatal ( 'QG, QG(NK).LT.0') ! JSK MODS
            ENDIF                                       ! JSK MODS
            NK1=NK+1
            IF(NK.EQ.LTOP)THEN
              NK1=KLCL
            ENDIF
            TMA=QG(NK1)*EMS(NK1)
            TMB=QG(NK-1)*EMS(NK-1)
            TMM=(QG(NK)-1.E-9)*EMS(NK  )
            BCOEFF=-TMM/((TMA*TMA)/TMB+TMB)
            ACOEFF=BCOEFF*TMA/TMB
            TMB=TMB*(1.-BCOEFF)
            TMA=TMA*(1.-ACOEFF)
            IF(NK.EQ.LTOP)THEN
              QVDIFF=(QG(NK1)-TMA*EMSD(NK1))*100./QG(NK1)
!              IF(ABS(QVDIFF).GT.1.)THEN
!             PRINT *,'!!!WARNING!!! CLOUD BASE WATER VAPOR CHANGES BY ',     &
!                      QVDIFF,                                                &
!                     '% WHEN MOISTURE IS BORROWED TO PREVENT NEGATIVE ',     &
!                     'VALUES IN KAIN-FRITSCH'
!              ENDIF
            ENDIF
            QG(NK)=1.E-9
            QG(NK1)=TMA*EMSD(NK1)
            QG(NK-1)=TMB*EMSD(NK-1)
          ENDIF
        ENDDO
        TOPOMG=(UDR(LTOP)-UER(LTOP))*DP(LTOP)*EMSD(LTOP)
        IF(ABS(TOPOMG-OMG(LTOP)).GT.1.E-3)THEN
!       WRITE(99,*)'ERROR:  MASS DOES NOT BALANCE IN KF SCHEME;            &
!      TOPOMG, OMG =',TOPOMG,OMG(LTOP)
!      TOPOMG, OMG =',TOPOMG,OMG(LTOP)
          ISTOP=1
          IPRNT=.TRUE.
          EXIT iter
        ENDIF
!     
!...CONVERT THETA TO T...
!     
        DO NK=1,LTOP
          EXN(NK)=(P00/P0(NK))**(0.2854*(1.-0.28*QG(NK)))
          TG(NK)=THTAG(NK)/EXN(NK)
          TVG(NK)=TG(NK)*(1.+0.608*QG(NK))
        ENDDO
        IF(ISHALL.EQ.1)THEN
!          write(*,*) 'Larry, exiting iter ',NCOUNT 
          if (idiagee > 0) write(*,*) 'Larry, exiting iter - ncount,i,j',NCOUNT, I, J  ! rce 11-may-2012
          EXIT iter
!          write(*,*) 'Larry, exited, no more iter'
        ENDIF
!     
!*******************************************************************
!                                                                  *
!     COMPUTE NEW CLOUD AND CHANGE IN AVAILABLE BUOYANT ENERGY.    *
!                                                                  *
!*******************************************************************
!     
!...THE FOLLOWING COMPUTATIONS ARE SIMILAR TO THAT FOR UPDRAFT
!     
!        THMIX=0.
          TMIX=0.
          QMIX=0.
!
!...FIND THE THERMODYNAMIC CHARACTERISTICS OF THE LAYER BY
!...MASS-WEIGHTING THE CHARACTERISTICS OF THE INDIVIDUAL MODEL
!...LAYERS...
!
          !!DO NK=LC,KPBL
          DO NK=LC,KCLDLAYER
            TMIX=TMIX+DP(NK)*TG(NK)
            QMIX=QMIX+DP(NK)*QG(NK)  
          ENDDO
          TMIX=TMIX/DPTHMX
          QMIX=QMIX/DPTHMX
          ES=ALIQ*EXP((TMIX*BLIQ-CLIQ)/(TMIX-DLIQ))
          QSS=0.622*ES/(PMIX-ES)
!     
!...REMOVE SUPERSATURATION FOR DIAGNOSTIC PURPOSES, IF NECESSARY...
!     
          IF(QMIX.GT.QSS)THEN
            RL=XLV0-XLV1*TMIX
            CPM=CP*(1.+0.887*QMIX)
            DSSDT=QSS*(CLIQ-BLIQ*DLIQ)/((TMIX-DLIQ)*(TMIX-DLIQ))
            DQ=(QMIX-QSS)/(1.+RL*DSSDT/CPM)
            TMIX=TMIX+RL/CP*DQ
            QMIX=QMIX-DQ
            TLCL=TMIX
          ELSE
            QMIX=AMAX1(QMIX,0.)
            EMIX=QMIX*PMIX/(0.622+QMIX)
            astrt=1.e-3
            binc=0.075
            a1=emix/aliq
            tp=(a1-astrt)/binc
            indlu=int(tp)+1
            value=(indlu-1)*binc+astrt
            aintrp=(a1-value)/binc
            tlog=aintrp*alu(indlu+1)+(1-aintrp)*alu(indlu)
            TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)
            TLCL=TDPT-(.212+1.571E-3*(TDPT-T00)-4.36E-4*(TMIX-T00))*(TMIX-TDPT)
            TLCL=AMIN1(TLCL,TMIX)
          ENDIF
          TVLCL=TLCL*(1.+0.608*QMIX)
          ZLCL = ZMIX+(TLCL-TMIX)/GDRY
          DO NK = LC,KL
            KLCL=NK
            IF(ZLCL.LE.Z0(NK))THEN
              EXIT 
            ENDIF
          ENDDO
          K=KLCL-1
          DLP=(ZLCL-Z0(K))/(Z0(KLCL)-Z0(K))
!     
!...ESTIMATE ENVIRONMENTAL TEMPERATURE AND MIXING RATIO AT THE LCL...
!     
          TENV=TG(K)+(TG(KLCL)-TG(K))*DLP
          QENV=QG(K)+(QG(KLCL)-QG(K))*DLP
          TVEN=TENV*(1.+0.608*QENV)
          PLCL=P0(K)+(P0(KLCL)-P0(K))*DLP
          THETEU(K)=TMIX*(1.E5/PMIX)**(0.2854*(1.-0.28*QMIX))*             &
                  EXP((3374.6525/TLCL-2.5403)*QMIX*(1.+0.81*QMIX))
!     
!...COMPUTE ADJUSTED ABE(ABEG).
!     
          ABEG=0.
          DO NK=K,LTOPM1
            NK1=NK+1
            THETEU(NK1) = THETEU(NK)
!
            call tpmix2dd(p0(nk1),theteu(nk1),tgu(nk1),qgu(nk1),i,j)
!
            TVQU(NK1)=TGU(NK1)*(1.+0.608*QGU(NK1)-QLIQ(NK1)-QICE(NK1))
            IF(NK.EQ.K)THEN
              DZZ=Z0(KLCL)-ZLCL
              DILBE=((TVLCL+TVQU(NK1))/(TVEN+TVG(NK1))-1.)*DZZ
            ELSE
              DZZ=DZA(NK)
              DILBE=((TVQU(NK)+TVQU(NK1))/(TVG(NK)+TVG(NK1))-1.)*DZZ
            ENDIF
            IF(DILBE.GT.0.)ABEG=ABEG+DILBE*G
!
!...DILUTE BY ENTRAINMENT BY THE RATE AS ORIGINAL UPDRAFT...
!
            CALL ENVIRTHT(P0(NK1),TG(NK1),QG(NK1),THTEEG(NK1),ALIQ,BLIQ,CLIQ,DLIQ)
            THETEU(NK1)=THETEU(NK1)*DDILFRC(NK1)+THTEEG(NK1)*(1.-DDILFRC(NK1))
          ENDDO
!     
!...ASSUME AT LEAST 90% OF CAPE (ABE) IS REMOVED BY CONVECTION DURING
!...THE PERIOD TIMEC...
!     
          IF(NOITR.EQ.1)THEN
!         write(98,*)' '
!         write(98,*)'TAU, I, J, =',NTSD,I,J
!         WRITE(98,1060)FABE
!          GOTO 265
          EXIT iter
          ENDIF
          DABE=AMAX1(ABE-ABEG,0.1*ABE)
          FABE=ABEG/ABE
          IF(FABE.GT.1. .and. ISHALL.EQ.0)THEN
!          WRITE(98,*)'UPDRAFT/DOWNDRAFT COUPLET INCREASES CAPE AT THIS
!     *GRID POINT; NO CONVECTION ALLOWED!'
! wig, 29-Aug-2006: Indicate no convection occurred.
             ishall = 2
            RETURN  
          ENDIF
          IF(NCOUNT.NE.1)THEN
            IF(ABS(AINC-AINCOLD).LT.0.0001)THEN
              NOITR=1
              AINC=AINCOLD
              CYCLE iter
            ENDIF
            DFDA=(FABE-FABEOLD)/(AINC-AINCOLD)
            IF(DFDA.GT.0.)THEN
              NOITR=1
              AINC=AINCOLD
              CYCLE iter
            ENDIF
          ENDIF
          AINCOLD=AINC
          FABEOLD=FABE
          IF(AINC/AINCMX.GT.0.999.AND.FABE.GT.1.05-STAB)THEN
!           write(98,*)' '
!           write(98,*)'TAU, I, J, =',NTSD,I,J
!           WRITE(98,1055)FABE
!            GOTO 265
            EXIT
          ENDIF
!         If there are shallow clouds, relax 90% requiremnt
!         This code is not needed, exit out of shallow cu happens earlier
          !!IF(ISHALL .EQ. 1) THEN
          !!  EXIT iter
          IF((FABE.LE.1.05-STAB.AND.FABE.GE.0.95-STAB) .or. NCOUNT.EQ.10)THEN
            EXIT iter
          ELSE
            IF(NCOUNT.GT.10)THEN
!             write(98,*)' '
!             write(98,*)'TAU, I, J, =',NTSD,I,J
!             WRITE(98,1060)FABE
!             GOTO 265
              EXIT
            ENDIF
!     
!...IF MORE THAN 10% OF THE ORIGINAL CAPE REMAINS, INCREASE THE CONVECTI
!...MASS FLUX BY THE FACTOR AINC:
!     
            IF(FABE.EQ.0.)THEN
              AINC=AINC*0.5
            ELSE
              IF(DABE.LT.1.e-4)THEN
                NOITR=1
                AINC=AINCOLD
                CYCLE iter
              ELSE
                AINC=AINC*STAB*ABE/DABE
              ENDIF
            ENDIF
!           AINC=AMIN1(AINCMX,AINC)
            AINC=AMIN1(AINCMX,AINC)
!...IF AINC BECOMES VERY SMALL, EFFECTS OF CONVECTION ! JSK MODS
!...WILL BE MINIMAL SO JUST IGNORE IT...              ! JSK MODS
            IF(AINC.LT.0.05)then
! wig, 29-Aug-2006: Indicate no convection occurred.
               ishall = 2
              RETURN                          ! JSK MODS
            ENDIF
!            AINC=AMAX1(AINC,0.05)                        ! JSK MODS
            TDER=TDER2*AINC
            PPTFLX=PPTFL2*AINC
!           IF (XTIME.LT.10.)THEN
!           WRITE(98,1080)LFS,LDB,LDT,TIMEC,TADVEC,NSTEP,NCOUNT,
!          *              FABEOLD,AINCOLD 
!           ENDIF
            DO NK=1,LTOP
              UMF(NK)=UMF2(NK)*AINC
              DMF(NK)=DMF2(NK)*AINC
              DETLQ(NK)=DETLQ2(NK)*AINC
              DETIC(NK)=DETIC2(NK)*AINC
              UDR(NK)=UDR2(NK)*AINC
              UER(NK)=UER2(NK)*AINC
              DER(NK)=DER2(NK)*AINC
              DDR(NK)=DDR2(NK)*AINC
            ENDDO
!     
!...GO BACK UP FOR ANOTHER ITERATION...
!     
          ENDIF
        ENDDO iter
!     
!...COMPUTE HYDROMETEOR TENDENCIES AS IS DONE FOR T, QV...
!     
!...FRC2 IS THE FRACTION OF TOTAL CONDENSATE      !  PPT FB MODS
!...GENERATED THAT GOES INTO PRECIPITIATION       !  PPT FB MODS
!
!  Redistribute hydormeteors according to the final mass-flux values:
!
        IF(CPR.GT.0.)THEN 
          FRC2=PPTFLX/(CPR*AINC)                    !  PPT FB MODS
        ELSE
           FRC2=0.
        ENDIF
        DO NK=1,LTOP
          QLPA(NK)=QL0(NK)
          QIPA(NK)=QI0(NK)
          QRPA(NK)=QR0(NK)
          QSPA(NK)=QS0(NK)
          RAINFB(NK)=PPTLIQ(NK)*AINC*FBFRC*FRC2   !  PPT FB MODS
          SNOWFB(NK)=PPTICE(NK)*AINC*FBFRC*FRC2   !  PPT FB MODS
        ENDDO
        DO NTC=1,NSTEP
!     
!...ASSIGN HYDROMETEORS CONCENTRATIONS AT THE TOP AND BOTTOM OF EACH LAY
!...BASED ON THE SIGN OF OMEGA...
!     
          DO NK=1,LTOP
            QLFXIN(NK)=0.
            QLFXOUT(NK)=0.
            QIFXIN(NK)=0.
            QIFXOUT(NK)=0.
            QRFXIN(NK)=0.
            QRFXOUT(NK)=0.
            QSFXIN(NK)=0.
            QSFXOUT(NK)=0.
          ENDDO   
          DO NK=2,LTOP
            IF(OMG(NK).LE.0.)THEN
              QLFXIN(NK)=-FXM(NK)*QLPA(NK-1)
              QIFXIN(NK)=-FXM(NK)*QIPA(NK-1)
              QRFXIN(NK)=-FXM(NK)*QRPA(NK-1)
              QSFXIN(NK)=-FXM(NK)*QSPA(NK-1)
              QLFXOUT(NK-1)=QLFXOUT(NK-1)+QLFXIN(NK)
              QIFXOUT(NK-1)=QIFXOUT(NK-1)+QIFXIN(NK)
              QRFXOUT(NK-1)=QRFXOUT(NK-1)+QRFXIN(NK)
              QSFXOUT(NK-1)=QSFXOUT(NK-1)+QSFXIN(NK)
            ELSE
              QLFXOUT(NK)=FXM(NK)*QLPA(NK)
              QIFXOUT(NK)=FXM(NK)*QIPA(NK)
              QRFXOUT(NK)=FXM(NK)*QRPA(NK)
              QSFXOUT(NK)=FXM(NK)*QSPA(NK)
              QLFXIN(NK-1)=QLFXIN(NK-1)+QLFXOUT(NK)
              QIFXIN(NK-1)=QIFXIN(NK-1)+QIFXOUT(NK)
              QRFXIN(NK-1)=QRFXIN(NK-1)+QRFXOUT(NK)
              QSFXIN(NK-1)=QSFXIN(NK-1)+QSFXOUT(NK)
            ENDIF
          ENDDO   
!     
!...UPDATE THE HYDROMETEOR CONCENTRATION VALUES AT EACH LEVEL...
!     
          DO NK=1,LTOP
            QLPA(NK)=QLPA(NK)+(QLFXIN(NK)+DETLQ(NK)-QLFXOUT(NK))*DTIME*EMSD(NK)
            QIPA(NK)=QIPA(NK)+(QIFXIN(NK)+DETIC(NK)-QIFXOUT(NK))*DTIME*EMSD(NK)
            QRPA(NK)=QRPA(NK)+(QRFXIN(NK)-QRFXOUT(NK)+RAINFB(NK))*DTIME*EMSD(NK)         !  PPT FB MODS
            QSPA(NK)=QSPA(NK)+(QSFXIN(NK)-QSFXOUT(NK)+SNOWFB(NK))*DTIME*EMSD(NK)         !  PPT FB MODS
          ENDDO     
        ENDDO
        DO NK=1,LTOP
          QLG(NK)=QLPA(NK)
          QIG(NK)=QIPA(NK)
          QRG(NK)=QRPA(NK)
          QSG(NK)=QSPA(NK)
        ENDDO   
!
!...CLEAN THINGS UP, CALCULATE CONVECTIVE FEEDBACK TENDENCIES FOR THIS
!...GRID POINT...
!     
!     IF (XTIME.LT.10.)THEN
!     WRITE(98,1080)LFS,LDB,LDT,TIMEC,TADVEC,NSTEP,NCOUNT,FABE,AINC 
!     ENDIF
       IF(IPRNT)THEN  
         WRITE(98,1080)LFS,LDB,LDT,TIMEC,TADVEC,NSTEP,NCOUNT,FABE,AINC
!        flush(98)   
       endif  
!     
!...SEND FINAL PARAMETERIZED VALUES TO OUTPUT FILES...
!     
!297   IF(IPRNT)then 
       IF(IPRNT)then 
!    if(I.eq.16 .and. J.eq.41)then
!      IF(ISTOP.EQ.1)THEN
         write(98,*)
!        write(98,*)'At t(h), I, J =',float(NTSD)*72./3600.,I,J
         write(98,*)'P(LC), DTP, WKL, WKLCL =',p0(LC)/100.,       &
                     TLCL+DTLCL+dtrh-TENV,WKL,WKLCL
         write(98,*)'TLCL, DTLCL, DTRH, TENV =',TLCL,DTLCL,       &
                      DTRH,TENV   
         WRITE(98,1025)KLCL,ZLCL,DTLCL,LTOP,P0(LTOP),IFLAG,       &
         TMIX-T00,PMIX,QMIX,ABE
         WRITE(98,1030)P0(LET)/100.,P0(LTOP)/100.,VMFLCL,PLCL/100.,  &
         WLCL,CLDHGT(LC)
         WRITE(98,1035)PEF,PEFCBH,LC,LET,WKL,VWS 
         write(98,*)'PRECIP EFFICIENCY =',PEFF 
      WRITE(98,1080)LFS,LDB,LDT,TIMEC,TADVEC,NSTEP,NCOUNT,FABE,AINC
!      ENDIF
!!!!! HERE !!!!!!!
           WRITE(98,1070)'  P  ','   DP ',' DT K/D ',' DR K/D ', &
                         '   OMG  ',' DOMGDP ','   UMF  ','   UER  ', &
                         '   UDR  ','   DMF  ','   DER  '  ,'   DDR  ',&
                         '   EMS  ','    W0  ','  DETLQ ',' DETIC '
           write(98,*)'just before DO 300...'
!          flush(98)
           DO NK=1,LTOP
             K=LTOP-NK+1
             DTT=(TG(K)-T0(K))*86400./TIMEC
             RL=XLV0-XLV1*TG(K)
             DR=-(QG(K)-Q0(K))*RL*86400./(TIMEC*CP)
             UDFRC=UDR(K)*TIMEC*EMSD(K)
             UEFRC=UER(K)*TIMEC*EMSD(K)
             DDFRC=DDR(K)*TIMEC*EMSD(K)
             DEFRC=-DER(K)*TIMEC*EMSD(K)
             WRITE(98,1075)P0(K)/100.,DP(K)/100.,DTT,DR,OMG(K),DOMGDP(K)*1.E4,       &
             UMF(K)/1.E6,UEFRC,UDFRC,DMF(K)/1.E6,DEFRC,DDFRC,EMS(K)/1.E11,           &
             W0AVG1D(K)*1.E2,DETLQ(K)*TIMEC*EMSD(K)*1.E3,DETIC(K)*  &
             TIMEC*EMSD(K)*1.E3
           ENDDO

! rce 11-may-2012 mods start -------------------------------------------
           if (idiagee > 0) then
           write(98,'(/31x,3x,15a11)') 'umf/aeai', 'uer/aeai', 'umf/ae', 'uer/ae'
           do k = klcl-2, ltop+2
              if (k >= kte) cycle
              if (k <  kts) cycle
              write(98,'(31x,i3,1p,15e11.3)') k, umf(k)/(dxsq*ainc), uer(k)/(dxsq*ainc), umf(k)/dxsq, uer(k)/dxsq
           end do

           write(98,'(/a,1p,15i11  )') 'lc, kcldx, klcl, ksvaa, let, ltop', lc, kcldlayer, klcl, ksvaa, let, ltop
           write(98,'( a,1p,15e11.3)') 'dt, timec, dx, ae=dxsq, au0, ainc', dt, timec, dx, dxsq, au0, ainc
           write(98,'(a,1p,15e11.3 )') 'au0/ae, au0*ainc/ae              ', au0/dxsq, au0*ainc/dxsq
           write(98,'(a,1p,15e11.3 )') 'vmflcl/ae, vmflcl*ainc/ae        ', vmflcl/dxsq, vmflcl*ainc/dxsq
           write(98,'(a,1p,15e11.3 )') 'evac, freq, timec, tmp1 / 2 / 3  ', &
              evac, freq, timec, (dpthmx/g), (dpthmx/g)*(2.0*evac*freq), (vmflcl*ainc/dxsq)*timec
           write(98,'(a,1p,15e11.3 )') 'wlcl, wu(klcl), tpert, rpert     ', wlcl, wu(klcl), th_perturb,r_perturb
           write(98,'( a,1p,15e11.3)') 'tmpc = (umf/ae)/(wu*rho)     tmpd = umf/(wu*rho*au0*ainc)'
           write(98,'(3x,15a11)') 'p0', 'dp', 'omg/g', 'umf/ae', 'del-umf', 'uer-udr', 'uer/ae', 'udr/ae', 'wu', 'tmpc', 'tmpd', 'ems'
           do k = ltop+2, 1, -1
              if (k >= kte) cycle
              tmpa = 0.0 ; tmpb = 0.0 ; tmpc = 0.0 ; tmpd = 0.0
              if (k > 1 .and. k < ltop) tmpa = (umf(k)-umf(k-1))/dxsq
              if (k == ltop)            tmpa = (0.0   -umf(k-1))/dxsq
              tmpb = (uer(k)-udr(k))/dxsq
              if (wu(k) > 1.0e-3) tmpc = umf(k)/(wu(k)*rhoe(k)*dxsq)
              if (wu(k) > 1.0e-3) tmpd = umf(k)/(wu(k)*rhoe(k)*au0*ainc)
              write(98,'(i3,1p,15e11.3)') k, p0(k), dp(k), omg(k)/g, umf(k)/dxsq, tmpa, tmpb, uer(k)/dxsq, udr(k)/dxsq, wu(k), tmpc, tmpd, ems(k)
           end do

           write(98,'(/3x,15a11)') 't0', 'p0', 'dp', 'q0', 'qg', 'qu', 'qliq', 'qlg', 'qice', 'qig', 'qndropbb'
           do k = ltop, 1, -1
              write(98,'(i3,f11.2,1p,15e11.3)') k, t0(k)-t00, p0(k), dp(k), q0(k), qg(k), qu(k), qliq(k), qlg(k), qice(k), qig(k), &
                 qndropbb(k)
           end do
           write(98,'(a)')
           end if
! rce 11-may-2012 mods end ---------------------------------------------

           WRITE(98,1085)'K','P','Z','T0','TG','DT','TU','TD','Q0', &
                  'QG',             &
                  'DQ','QU','QD','QLG','QIG','QRG','QSG','RH0','RHG'
           DO NK=1,KL
             K=KX-NK+1
             DTT=TG(K)-T0(K)
             TUC=TU(K)-T00
             IF(K.LT.LC.OR.K.GT.LTOP)TUC=0.
             TDC=TZ(K)-T00
             IF((K.LT.LDB.OR.K.GT.LDT).AND.K.NE.LFS)TDC=0.
             IF(T0(K).LT.T00)THEN
               ES=ALIQ*EXP((BLIQ*TG(K)-CLIQ)/(TG(K)-DLIQ))
             ELSE
               ES=ALIQ*EXP((BLIQ*TG(K)-CLIQ)/(TG(K)-DLIQ))
             ENDIF  
             QGS=ES*0.622/(P0(K)-ES)
             RH0=Q0(K)/QES(K)
             RHG=QG(K)/QGS
             WRITE(98,1090)K,P0(K)/100.,Z0(K),T0(K)-T00,TG(K)-T00,DTT,TUC,            &
             TDC,Q0(K)*1000.,QG(K)*1000.,(QG(K)-Q0(K))*1000.,QU(K)*                   &
             1000.,QD(K)*1000.,QLG(K)*1000.,QIG(K)*1000.,QRG(K)*1000.,                &
             QSG(K)*1000.,RH0,RHG
           ENDDO
!     
!...IF CALCULATIONS ABOVE SHOW AN ERROR IN THE MASS BUDGET, PRINT OUT A
!...TO BE USED LATER FOR DIAGNOSTIC PURPOSES, THEN ABORT RUN...
!     
!         IF(ISTOP.EQ.1 .or. ISHALL.EQ.1)THEN

!         IF(ISHALL.NE.1)THEN
!            write(98,4421)i,j,iyr,imo,idy,ihr,imn
!           write(98)i,j,iyr,imo,idy,ihr,imn,kl
! 4421       format(7i4)
!            write(98,4422)kl
! 4422       format(i6) 
            write(98,'(8a11)') 'p0', 't0', 'q0', 'u0', 'v0', 'w0avg1d', 'dp', 'tke' ! rce 11-may-2012
            DO 310 NK = 1,KL
              k = kl - nk + 1
              write(98,4455) p0(k)/100.,t0(k)-273.16,q0(k)*1000.,       &
                       u0(k),v0(k),W0AVG1D(K),dp(k),tke(k)
!             write(98) p0,t0,q0,u0,v0,w0,dp,tke
!           WRITE(98,1115)Z0(K),P0(K)/100.,T0(K)-273.16,Q0(K)*1000.,
!    *               U0(K),V0(K),DP(K)/100.,W0AVG(I,J,K)
 310        CONTINUE
            IF(ISTOP.EQ.1)THEN
              CALL wrf_error_fatal ( 'KAIN-FRITSCH, istop=1, diags' )
            ENDIF
!         ENDIF
  4455  format(8f11.3) 
       ENDIF
        CNDTNF=(1.-EQFRC(LFS))*(QLIQ(LFS)+QICE(LFS))*DMF(LFS)
        RAINCV(I,J)=DT*PPTFLX*(1.-FBFRC)/DXSQ     !  PPT FB MODS
!        RAINCV(I,J)=.1*.5*DT*PPTFLX/DXSQ               !  PPT FB MODS
!         RNC=0.1*TIMEC*PPTFLX/DXSQ
        RNC=RAINCV(I,J)*NIC
       IF(ISHALL.EQ.0.AND.IPRNT)write (98,909)I,J,RNC

!     WRITE(98,1095)CPR*AINC,TDER+PPTFLX+CNDTNF
!     
!  EVALUATE MOISTURE BUDGET...
!     

        QINIT=0.
        QFNL=0.
        DPT=0.
        DO 315 NK=1,LTOP
          DPT=DPT+DP(NK)
          QINIT=QINIT+Q0(NK)*EMS(NK)
          QFNL=QFNL+QG(NK)*EMS(NK)
          QFNL=QFNL+(QLG(NK)+QIG(NK)+QRG(NK)+QSG(NK))*EMS(NK)
  315   CONTINUE
        QFNL=QFNL+PPTFLX*TIMEC*(1.-FBFRC)       !  PPT FB MODS
!        QFNL=QFNL+PPTFLX*TIMEC                 !  PPT FB MODS
        ERR2=(QFNL-QINIT)*100./QINIT
       IF(IPRNT)WRITE(98,1110)QINIT,QFNL,ERR2
      IF(ABS(ERR2).GT.0.05 .AND. ISTOP.EQ.0)THEN 
!       write(99,*)'!!!!!!!! MOISTURE BUDGET ERROR IN KFPARA !!!'
!       WRITE(99,1110)QINIT,QFNL,ERR2
        IPRNT=.TRUE.
        ISTOP=1
            write(98,4422)kl
 4422       format(i6)
            DO 311 NK = 1,KL
              k = kl - nk + 1
!             write(99,4455) p0(k)/100.,t0(k)-273.16,q0(k)*1000.,       &
!                      u0(k),v0(k),W0AVG1D(K),dp(k)
!             write(98) p0,t0,q0,u0,v0,w0,dp,tke
!           WRITE(98,1115)P0(K)/100.,T0(K)-273.16,Q0(K)*1000.,          &
!                    U0(K),V0(K),W0AVG1D(K),dp(k)/100.,tke(k)
            WRITE(98,4456)P0(K)/100.,T0(K)-273.16,Q0(K)*1000.,          &
                     U0(K),V0(K),W0AVG1D(K),dp(k)/100.,tke(k)
 311        CONTINUE
!           flush(98)

!        GOTO 297
!         STOP 'QVERR'
      ENDIF
 1115 FORMAT (2X,F7.2,2X,F5.1,2X,F6.3,2(2X,F5.1),2X,F7.2,2X,F7.4)
 4456  format(8f12.3)
        IF(PPTFLX.GT.0.)THEN
          RELERR=ERR2*QINIT/(PPTFLX*TIMEC)
        ELSE
          RELERR=0.
        ENDIF
     IF(IPRNT)THEN
        WRITE(98,1120)RELERR
        WRITE(98,*)'TDER, CPR, TRPPT =',              &
          TDER,CPR*AINC,TRPPT*AINC
     ENDIF
!     
!...FEEDBACK TO RESOLVABLE SCALE TENDENCIES.
!     
!...IF THE ADVECTIVE TIME PERIOD (TADVEC) IS LESS THAN SPECIFIED MINIMUM
!...TIMEC, ALLOW FEEDBACK TO OCCUR ONLY DURING TADVEC...
!     
        IF(TADVEC.LT.TIMEC)NIC=NINT(TADVEC/DT)
        NCA(I,J)=REAL(NIC)*DT  !byang 
        IF(ISHALL.EQ.1)THEN
          TIMEC = TIMEC_SHALL   !! Changed to match other location where TIMEC is set lkb 10/31/10
          !!TIMEC = 2400.
          NCA(I,J) = NINT(TIMEC_SHALL/DT)*DT   ! add 01/11/2012
!          NCA(I,J) = NTST*DT !byang
          NSHALL = NSHALL+1
        ENDIF 
        DO K=1,KX
!         IF(IMOIST(INEST).NE.2)THEN
!
!...IF HYDROMETEORS ARE NOT ALLOWED, THEY MUST BE EVAPORATED OR SUBLIMAT
!...AND FED BACK AS VAPOR, ALONG WITH ASSOCIATED CHANGES IN TEMPERATURE.
!...NOTE:  THIS WILL INTRODUCE CHANGES IN THE CONVECTIVE TEMPERATURE AND
!...WATER VAPOR FEEDBACK TENDENCIES AND MAY LEAD TO SUPERSATURATED VALUE
!...OF QG...
!
!           RLC=XLV0-XLV1*TG(K)
!           RLS=XLS0-XLS1*TG(K)
!           CPM=CP*(1.+0.887*QG(K))
!           TG(K)=TG(K)-(RLC*(QLG(K)+QRG(K))+RLS*(QIG(K)+QSG(K)))/CPM
!           QG(K)=QG(K)+(QLG(K)+QRG(K)+QIG(K)+QSG(K))
!           DQLDT(I,J,NK)=0.
!           DQIDT(I,J,NK)=0.
!           DQRDT(I,J,NK)=0.
!           DQSDT(I,J,NK)=0.
!         ELSE
!
!...IF ICE PHASE IS NOT ALLOWED, MELT ALL FROZEN HYDROMETEORS...
!
          IF(warm_rain)THEN

            CPM=CP*(1.+0.887*QG(K))
            TG(K)=TG(K)-(QIG(K)+QSG(K))*RLF/CPM
            DQCDT(K)=(QLG(K)+QIG(K)-QL0(K)-QI0(K))/TIMEC
            DQIDT(K)=0.
            DQRDT(K)=(QRG(K)+QSG(K)-QR0(K)-QS0(K))/TIMEC
            DQSDT(K)=0.
          ELSEIF(.NOT. F_QS)THEN
!
!...IF ICE PHASE IS ALLOWED, BUT MIXED PHASE IS NOT, MELT FROZEN HYDROMETEORS
!...BELOW THE MELTING LEVEL, FREEZE LIQUID WATER ABOVE THE MELTING LEVEL
!
            CPM=CP*(1.+0.887*QG(K))
            IF(K.LE.ML)THEN
              TG(K)=TG(K)-(QIG(K)+QSG(K))*RLF/CPM
            ELSEIF(K.GT.ML)THEN
              TG(K)=TG(K)+(QLG(K)+QRG(K))*RLF/CPM
            ENDIF
            DQCDT(K)=(QLG(K)+QIG(K)-QL0(K)-QI0(K))/TIMEC
            DQIDT(K)=0.
            DQRDT(K)=(QRG(K)+QSG(K)-QR0(K)-QS0(K))/TIMEC
            DQSDT(K)=0.
          ELSEIF(F_QS) THEN
!
!...IF MIXED PHASE HYDROMETEORS ARE ALLOWED, FEED BACK CONVECTIVE TENDENCIES
!...OF HYDROMETEORS DIRECTLY...
!
            DQCDT(K)=(QLG(K)-QL0(K))/TIMEC
            DQSDT(K)=(QSG(K)-QS0(K))/TIMEC
            DQRDT(K)=(QRG(K)-QR0(K))/TIMEC
            IF (F_QI) THEN
               DQIDT(K)=(QIG(K)-QI0(K))/TIMEC
            ELSE
               DQSDT(K)=DQSDT(K)+(QIG(K)-QI0(K))/TIMEC
            ENDIF
          ELSE
!              PRINT *,'THIS COMBINATION OF IMOIST, IEXICE, IICE NOT ALLOWED!'
              CALL wrf_error_fatal ( 'KAIN-FRITSCH, THIS MICROPHYSICS CHOICE IS NOT ALLOWED' )
          ENDIF
          DTDT(K)=(TG(K)-T0(K))/TIMEC
          DQDT(K)=(QG(K)-Q0(K))/TIMEC
        ENDDO

!         PRATEC(I,J)=PPTFLX*(1.-FBFRC)/DXSQ         !LD add PRATEC 21-April-2011              
!         RAINCV(I,J)=DT*PRATEC(I,J)                 !LD add PRATEC 21-April-2011
      
        RAINCV(I,J)=DT*PPTFLX*(1.-FBFRC)/DXSQ     !  PPT FB MODS

!        RAINCV(I,J)=.1*.5*DT*PPTFLX/DXSQ               !  PPT FB MODS
!         RNC=0.1*TIMEC*PPTFLX/DXSQ
        RNC=RAINCV(I,J)*NIC
 909     FORMAT('AT I, J =',i3,1x,i3,' CONVECTIVE RAINFALL =',F8.4,' mm')
!      write (98,909)I,J,RNC
!      write (6,909)I,J,RNC
!      WRITE(98,*)'at NTSD =',NTSD,',No. of KF points activated =',
!     *            NCCNT
!      flush(98)
1000  FORMAT(' ',10A8)
1005  FORMAT(' ',F6.0,2X,F6.4,2X,F7.3,1X,F6.4,2X,4(F6.3,2X),2(F7.3,1X))
1010  FORMAT(' ',' VERTICAL VELOCITY IS NEGATIVE AT ',F4.0,' MB')
1015   FORMAT(' ','ALL REMAINING MASS DETRAINS BELOW ',F4.0,' MB')
1025   FORMAT(5X,' KLCL=',I2,' ZLCL=',F7.1,'M',                         &
        ' DTLCL=',F5.2,' LTOP=',I2,' P0(LTOP)=',-2PF5.1,'MB FRZ LV=',   &
        I2,' TMIX=',0PF4.1,1X,'PMIX=',-2PF6.1,' QMIX=',3PF5.1,          &
        ' CAPE=',0PF7.1)
1030   FORMAT(' ',' P0(LET) = ',F6.1,' P0(LTOP) = ',F6.1,' VMFLCL =',   &
      E12.3,' PLCL =',F6.1,' WLCL =',F6.3,' CLDHGT =',                  &
      F8.1)
1035  FORMAT(1X,'PEF(WS)=',F4.2,'(CB)=',F4.2,'LC,LET=',2I3,'WKL='       &
      ,F6.3,'VWS=',F5.2)
!1055  FORMAT('*** DEGREE OF STABILIZATION =',F5.3,                  &
!      ', NO MORE MASS FLUX IS ALLOWED!')
!1060     FORMAT(' ITERATION DOES NOT CONVERGE TO GIVE THE SPECIFIED    &
!      &DEGREE OF STABILIZATION!  FABE= ',F6.4) 
 1070 FORMAT (16A8) 
 1075 FORMAT (F8.2,3(F8.2),2(F8.3),F8.2,2F8.3,F8.2,6F8.3) 
 1080 FORMAT(2X,'LFS,LDB,LDT =',3I3,' TIMEC, TADVEC, NSTEP=',           &
              2(1X,F5.0),I3,'NCOUNT, FABE, AINC=',I2,1X,F5.3,F6.2) 
 1085 FORMAT (A3,16A7,2A8) 
 1090 FORMAT (I3,F7.2,F7.0,10F7.2,4F7.3,2F8.3) 
 1095 FORMAT(' ','  PPT PRODUCTION RATE= ',F10.0,' TOTAL EVAP+PPT= ',F10.0)
1105   FORMAT(' ','NET LATENT HEAT RELEASE =',E12.5,' ACTUAL HEATING =',&
       E12.5,' J/KG-S, DIFFERENCE = ',F9.3,'%')
1110   FORMAT(' ','INITIAL WATER =',E12.5,' FINAL WATER =',E12.5,       &
       ' TOTAL WATER CHANGE =',F8.2,'%')
! 1115 FORMAT (2X,F6.0,2X,F7.2,2X,F5.1,2X,F6.3,2(2X,F5.1),2X,F7.2,2X,F7.4)
1120   FORMAT(' ','MOISTURE ERROR AS FUNCTION OF TOTAL PPT =',F9.3,'%')
!
!-----------------------------------------------------------------------
!--------------SAVE CLOUD TOP AND BOTTOM FOR RADIATION------------------
!-----------------------------------------------------------------------
!
   IF (ISHALL<2) THEN  ! add LKB 12/23/2011 01/11/2012 only define cloud base
      CUTOP(I,J)=REAL(LTOP)  ! if there are clouds
      CUBOT(I,J)=REAL(LCL)

! rce 11-may-2012 mods start -------------------------------------------
      updfra = au0*ainc/dxsq
      wulcl = wu(klcl)
      wup(:) = wu(:)
      qc1d(:) = qliq(:)
      qi1d(:) = qice(:)
      qndrop1d(:) = qndropbb(:)

! umf(k) and umfout(k) are at top of layer k
      umfout(kts:ltop-1) = max( 0.0, umf(kts:ltop-1)/dxsq )
      uerout(kts:ltop)   = max( 0.0, uer(kts:ltop)/dxsq )
      udrout(kts:ltop)   = max( 0.0, udr(kts:ltop)/dxsq )
! dmf(k) is at bottom of layer k; ! dmfout(k) is at top of layer k [like umf(k) and umfout(k)]
      dmfout(kts:ltop-1) = min( 0.0, dmf(kts+1:ltop)/dxsq )
! der(k) is negative; derout(k) is positive
      derout(kts:ltop)   = max( 0.0, -der(kts:ltop)/dxsq )
! ddr(k) is positive so no change needed
      ddrout(kts:ltop)   = max( 0.0, ddr(kts:ltop)/dxsq )

      if ( idiagee > 0 .and. ((ishall == 0) .or. (ishall == 1)) ) then
           write(98,'(/a,1p,15i11  )') 'lc, kcldx, klcl, ksvaa, let, ltop', lc, kcldlayer, klcl, ksvaa, let, ltop
           write(98,'( a,1p,15e11.3)') 'dt, timec, dx, ae=dxsq, au0, ainc', dt, timec, dx, dxsq, au0, ainc
           write(98,'(a,1p,15e11.3 )') 'au0/ae, au0*ainc/ae              ', au0/dxsq, au0*ainc/dxsq
           write(98,'(a,1p,15e11.3 )') 'wlcl, wu(klcl), tpert, rpert     ', wlcl, wu(klcl), th_perturb,r_perturb
           tmpa = 0.0 ; tmpb = 0.0
           do k = 1, ltop
              tmpa = tmpa + uerout(k)
              if (k >= klcl) tmpb = tmpb + dp(k)
           end do
           write(98,'(a,1p,15e11.3 )') 'tmpu, ...*tau, tmpv, ...*area/g  ', tmpa, tmpa*dt*ntst, tmpb, (tmpb/g)*(au0*ainc/dxsq)
           write(98,'(3x,15a11)') 'p0', 'dp', 'omg/g', 'umfout', 'del-umf', 'uer-udr', 'uerout', 'udrout', &
              'qc1d', 'qi1d', 'f_qc2qi', 'f_qc2pr', 'f_qi2pr'
           do k = ltop+2, 1, -1
              if (k >= kte) cycle
              tmpa = 0.0 ; tmpb = 0.0 ; tmpc = 0.0 ; tmpd = 0.0
              if (k > 1 ) tmpa = umfout(k)-umfout(k-1)
              if (k == 1) tmpa = umfout(k)
              tmpb =  uerout(k)-udrout(k)
              write(98,'(i3,1p,15e11.3)') k, p0(k), dp(k), omg(k)/g, umfout(k), tmpa, tmpb, uerout(k), udrout(k), &
                        qc1d(k), qi1d(k), fcvt_qc_to_qi(k), fcvt_qc_to_pr(k), fcvt_qi_to_pr(k)
           end do
           write(98,'(3x,15a11)') 'p0', 'dp', '     ', 'dmfout', 'del-dmf', 'der-ddr', 'derout', 'ddrout'
           do k = ltop+2, 1, -1
              if (k >= kte) cycle
              tmpa = 0.0 ; tmpb = 0.0 ; tmpc = 0.0 ; tmpd = 0.0
              if (k > 1 ) tmpa = dmfout(k)-dmfout(k-1)
              if (k == 1) tmpa = dmfout(k)
              tmpb =  derout(k)-ddrout(k)
              write(98,'(i3,1p,15e11.3)') k, p0(k), dp(k), 0.0, dmfout(k), tmpa, tmpb, derout(k), ddrout(k)
           end do
      end if ! ( idiagee > 0 .and. ((ishall == 0) .or. (ishall == 1)) ) then
! rce 11-may-2012 mods end ---------------------------------------------
   ENDIF
!
!-----------------------------------------------------------------------
! begin: wig, 21-Feb-2008
! Only allow shallow-Cu to occur if the cloud base is within 500 m of
! the top of the PBL. This prevents us from getting too many clouds
! in the mid-troposphere.
      if( ishall==1 .and. (z_at_w1d(lcl)-pblh) > 500. ) ishall = 2
! end: wig, 21-Feb-2008

   END SUBROUTINE  KF_cup_PARA

!********************************************************************
! ***********************************************************************


   SUBROUTINE TPMIX2(p,thes,tu,qu,qliq,qice,qnewlq,qnewic,XLV1,XLV0) 6
!
! Lookup table variables:
!     INTEGER, PARAMETER :: (KFNT=250,KFNP=220)
!     REAL, SAVE, DIMENSION(1:KFNT,1:KFNP) :: TTAB,QSTAB
!     REAL, SAVE, DIMENSION(1:KFNP) :: THE0K
!     REAL, SAVE, DIMENSION(1:200) :: ALU
!     REAL, SAVE :: RDPR,RDTHK,PLUTOP
! End of Lookup table variables:
!-----------------------------------------------------------------------
   IMPLICIT NONE
!-----------------------------------------------------------------------
   REAL,         INTENT(IN   )   :: P,THES,XLV1,XLV0
   REAL,         INTENT(OUT  )   :: QNEWLQ,QNEWIC
   REAL,         INTENT(INOUT)   :: TU,QU,QLIQ,QICE
   REAL    ::    TP,QQ,BTH,TTH,PP,T00,T10,T01,T11,Q00,Q10,Q01,Q11,          &
                 TEMP,QS,QNEW,DQ,QTOT,RLL,CPP
   INTEGER ::    IPTB,ITHTB
!-----------------------------------------------------------------------

!c******** LOOKUP TABLE VARIABLES... ****************************
!      parameter(kfnt=250,kfnp=220)
!c
!      COMMON/KFLUT/ ttab(kfnt,kfnp),qstab(kfnt,kfnp),the0k(kfnp),
!     *              alu(200),rdpr,rdthk,plutop 
!C*************************************************************** 
!c
!c***********************************************************************
!c     scaling pressure and tt table index                         
!c***********************************************************************
!c
! plutop = model top pressure
! p = pressure level
! rdpr = a pressure (or 1/pressure) increment
! tp = a number of levels (a pressure difference divided by the increment
      tp=(p-plutop)*rdpr
      qq=tp-aint(tp)
      iptb=int(tp)+1

!
!***********************************************************************
!              base and scaling factor for the                           
!***********************************************************************
!
!  scaling the and tt table index                                        
      bth=(the0k(iptb+1)-the0k(iptb))*qq+the0k(iptb)
      tth=(thes-bth)*rdthk
      pp   =tth-aint(tth)
      ithtb=int(tth)+1
       IF(IPTB.GE.220 .OR. IPTB.LE.1 .OR. ITHTB.GE.250 .OR. ITHTB.LE.1)THEN
         write(98,*)'**** OUT OF BOUNDS *********'
!        flush(98)
       ENDIF
!
      t00=ttab(ithtb  ,iptb  )
      t10=ttab(ithtb+1,iptb  )
      t01=ttab(ithtb  ,iptb+1)
      t11=ttab(ithtb+1,iptb+1)
!
      q00=qstab(ithtb  ,iptb  )
      q10=qstab(ithtb+1,iptb  )
      q01=qstab(ithtb  ,iptb+1)
      q11=qstab(ithtb+1,iptb+1)
!
!***********************************************************************
!              parcel temperature                                        
!***********************************************************************
!
      temp=(t00+(t10-t00)*pp+(t01-t00)*qq+(t00-t10-t01+t11)*pp*qq)
!
      qs=(q00+(q10-q00)*pp+(q01-q00)*qq+(q00-q10-q01+q11)*pp*qq)
!
      DQ=QS-QU
      IF(DQ.LE.0.)THEN
        QNEW=QU-QS
        QU=QS
      ELSE 
!
!   IF THE PARCEL IS SUBSATURATED, TEMPERATURE AND MIXING RATIO MUST BE
!   ADJUSTED...IF LIQUID WATER IS PRESENT, IT IS ALLOWED TO EVAPORATE
! 
        QNEW=0.
        QTOT=QLIQ+QICE
!
!   IF THERE IS ENOUGH LIQUID OR ICE TO SATURATE THE PARCEL, TEMP STAYS AT ITS
!   WET BULB VALUE, VAPOR MIXING RATIO IS AT SATURATED LEVEL, AND THE MIXING
!   RATIOS OF LIQUID AND ICE ARE ADJUSTED TO MAKE UP THE ORIGINAL SATURATION
!   DEFICIT... OTHERWISE, ANY AVAILABLE LIQ OR ICE VAPORIZES AND APPROPRIATE
!   ADJUSTMENTS TO PARCEL TEMP; VAPOR, LIQUID, AND ICE MIXING RATIOS ARE MADE.
!
!...subsaturated values only occur in calculations involving various mixtures of
!...updraft and environmental air for estimation of entrainment and detrainment.
!...For these purposes, assume that reasonable estimates can be given using 
!...liquid water saturation calculations only - i.e., ignore the effect of the
!...ice phase in this process only...will not affect conservative properties...
!
        IF(QTOT.GE.DQ)THEN
          qliq=qliq-dq*qliq/(qtot+1.e-10)
          qice=qice-dq*qice/(qtot+1.e-10)
          QU=QS
        ELSE
          RLL=XLV0-XLV1*TEMP
          CPP=1004.5*(1.+0.89*QU)
          IF(QTOT.LT.1.E-10)THEN
!
!...IF NO LIQUID WATER OR ICE IS AVAILABLE, TEMPERATURE IS GIVEN BY:
            TEMP=TEMP+RLL*(DQ/(1.+DQ))/CPP
          ELSE
!
!...IF SOME LIQ WATER/ICE IS AVAILABLE, BUT NOT ENOUGH TO ACHIEVE SATURATION,
!   THE TEMPERATURE IS GIVEN BY:
!
            TEMP=TEMP+RLL*((DQ-QTOT)/(1+DQ-QTOT))/CPP
            QU=QU+QTOT
            QTOT=0.
            QLIQ=0.
            QICE=0.
          ENDIF
        ENDIF
      ENDIF
      TU=TEMP
      qnewlq=qnew
      qnewic=0.
!
   END SUBROUTINE TPMIX2
!******************************************************************************

      SUBROUTINE DTFRZNEW(TU,P,THTEU,QU,QFRZ,QICE,ALIQ,BLIQ,CLIQ,DLIQ) 3
!-----------------------------------------------------------------------
   IMPLICIT NONE
!-----------------------------------------------------------------------
   REAL,         INTENT(IN   )   :: P,QFRZ,ALIQ,BLIQ,CLIQ,DLIQ
   REAL,         INTENT(INOUT)   :: TU,THTEU,QU,QICE
   REAL    ::    RLC,RLS,RLF,CPP,A,DTFRZ,ES,QS,DQEVAP,PII
!-----------------------------------------------------------------------
!
!...ALLOW THE FREEZING OF LIQUID WATER IN THE UPDRAFT TO PROCEED AS AN 
!...APPROXIMATELY LINEAR FUNCTION OF TEMPERATURE IN THE TEMPERATURE RANGE 
!...TTFRZ TO TBFRZ...
!...FOR COLDER TERMPERATURES, FREEZE ALL LIQUID WATER...
!...THERMODYNAMIC PROPERTIES ARE STILL CALCULATED WITH RESPECT TO LIQUID WATER
!...TO ALLOW THE USE OF LOOKUP TABLE TO EXTRACT TMP FROM THETAE...
!
      RLC=2.5E6-2369.276*(TU-273.16)
      RLS=2833922.-259.532*(TU-273.16)
      RLF=RLS-RLC
      CPP=1004.5*(1.+0.89*QU)
!
!  A = D(es)/DT IS THAT CALCULATED FROM BUCK (1981) EMPERICAL FORMULAS
!  FOR SATURATION VAPOR PRESSURE...
!
      A=(CLIQ-BLIQ*DLIQ)/((TU-DLIQ)*(TU-DLIQ))
      DTFRZ = RLF*QFRZ/(CPP+RLS*QU*A)
      TU = TU+DTFRZ
      
      ES = ALIQ*EXP((BLIQ*TU-CLIQ)/(TU-DLIQ))
      QS = ES*0.622/(P-ES)
!
!...FREEZING WARMS THE AIR AND IT BECOMES UNSATURATED...ASSUME THAT SOME OF THE 
!...LIQUID WATER THAT IS AVAILABLE FOR FREEZING EVAPORATES TO MAINTAIN SATURA-
!...TION...SINCE THIS WATER HAS ALREADY BEEN TRANSFERRED TO THE ICE CATEGORY,
!...SUBTRACT IT FROM ICE CONCENTRATION, THEN SET UPDRAFT MIXING RATIO AT THE NEW
!...TEMPERATURE TO THE SATURATION VALUE...
!
      DQEVAP = QS-QU
      QICE = QICE-DQEVAP
      QU = QU+DQEVAP
      PII=(1.E5/P)**(0.2854*(1.-0.28*QU))
      THTEU=TU*PII*EXP((3374.6525/TU-2.5403)*QU*(1.+0.81*QU))
!
   END SUBROUTINE DTFRZNEW
! --------------------------------------------------------------------------------


      SUBROUTINE CONDLOAD(QLIQ,QICE,WTW,DZ,BOTERM,ENTERM,RATE,QNEWLQ,           & 3
                          QNEWIC,QLQOUT,QICOUT,G)

!-----------------------------------------------------------------------
   IMPLICIT NONE
!-----------------------------------------------------------------------
!  9/18/88...THIS PRECIPITATION FALLOUT SCHEME IS BASED ON THE SCHEME US
!  BY OGURA AND CHO (1973).  LIQUID WATER FALLOUT FROM A PARCEL IS CAL-
!  CULATED USING THE EQUATION DQ=-RATE*Q*DT, BUT TO SIMULATE A QUASI-
!  CONTINUOUS PROCESS, AND TO ELIMINATE A DEPENDENCY ON VERTICAL
!  RESOLUTION THIS IS EXPRESSED AS Q=Q*EXP(-RATE*DZ).

      REAL, INTENT(IN   )   :: G
      REAL, INTENT(IN   )   :: DZ,BOTERM,ENTERM,RATE
      REAL, INTENT(INOUT)   :: QLQOUT,QICOUT,WTW,QLIQ,QICE,QNEWLQ,QNEWIC
      REAL :: QTOT,QNEW,QEST,G1,WAVG,CONV,RATIO3,OLDQ,RATIO4,DQ,PPTDRG

!
!  9/18/88...THIS PRECIPITATION FALLOUT SCHEME IS BASED ON THE SCHEME US
!  BY OGURA AND CHO (1973).  LIQUID WATER FALLOUT FROM A PARCEL IS CAL- 
!  CULATED USING THE EQUATION DQ=-RATE*Q*DT, BUT TO SIMULATE A QUASI-   
!  CONTINUOUS PROCESS, AND TO ELIMINATE A DEPENDENCY ON VERTICAL        
!  RESOLUTION THIS IS EXPRESSED AS Q=Q*EXP(-RATE*DZ).                   
      QTOT=QLIQ+QICE                                                    
      QNEW=QNEWLQ+QNEWIC                                                
!                                                                       
!  ESTIMATE THE VERTICAL VELOCITY SO THAT AN AVERAGE VERTICAL VELOCITY 
!  BE CALCULATED TO ESTIMATE THE TIME REQUIRED FOR ASCENT BETWEEN MODEL 
!  LEVELS...                                                            
!                                                                       
      QEST=0.5*(QTOT+QNEW)                                              
      G1=WTW+BOTERM-ENTERM-2.*G*DZ*QEST/1.5                             
      IF(G1.LT.0.0)G1=0.                                                
      WAVG=0.5*(SQRT(WTW)+SQRT(G1))                                      
      CONV=RATE*DZ/max(WAVG,1e-7) !wig, 12-Sep-2006: added div by 0 check
!                                                                       
!  RATIO3 IS THE FRACTION OF LIQUID WATER IN FRESH CONDENSATE, RATIO4 IS
!  THE FRACTION OF LIQUID WATER IN THE TOTAL AMOUNT OF CONDENSATE INVOLV
!  IN THE PRECIPITATION PROCESS - NOTE THAT ONLY 60% OF THE FRESH CONDEN
!  SATE IS IS ALLOWED TO PARTICIPATE IN THE CONVERSION PROCESS...       
!                                                                       
      RATIO3=QNEWLQ/(QNEW+1.E-8)                                       
!     OLDQ=QTOT                                                         
      QTOT=QTOT+0.6*QNEW                                                
      OLDQ=QTOT                                                         
      RATIO4=(0.6*QNEWLQ+QLIQ)/(QTOT+1.E-8)                            
      QTOT=QTOT*EXP(-CONV)                                              
!                                                                       
!  DETERMINE THE AMOUNT OF PRECIPITATION THAT FALLS OUT OF THE UPDRAFT  
!  PARCEL AT THIS LEVEL...                                              
!                                                                       
      DQ=OLDQ-QTOT                                                      
      QLQOUT=RATIO4*DQ                                                  
      QICOUT=(1.-RATIO4)*DQ                                             
!                                                                       
!  ESTIMATE THE MEAN LOAD OF CONDENSATE ON THE UPDRAFT IN THE LAYER, CAL
!  LATE VERTICAL VELOCITY                                               
!                                                                       
      PPTDRG=0.5*(OLDQ+QTOT-0.2*QNEW)                                   
      WTW=WTW+BOTERM-ENTERM-2.*G*DZ*PPTDRG/1.5                          
      IF(ABS(WTW).LT.1.E-4)WTW=1.E-4
!                                                                       
!  DETERMINE THE NEW LIQUID WATER AND ICE CONCENTRATIONS INCLUDING LOSSE
!  DUE TO PRECIPITATION AND GAINS FROM CONDENSATION...                  
!                                                                       
      QLIQ=RATIO4*QTOT+RATIO3*0.4*QNEW                                  
      QICE=(1.-RATIO4)*QTOT+(1.-RATIO3)*0.4*QNEW                        
      QNEWLQ=0.                                                         
      QNEWIC=0.                                                         

   END SUBROUTINE CONDLOAD

! ----------------------------------------------------------------------

   SUBROUTINE PROF5(EQ,EE,UD)                                         3
!
!***********************************************************************
!*****    GAUSSIAN TYPE MIXING PROFILE....******************************
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!  THIS SUBROUTINE INTEGRATES THE AREA UNDER THE CURVE IN THE GAUSSIAN  
!  DISTRIBUTION...THE NUMERICAL APPROXIMATION TO THE INTEGRAL IS TAKEN FROM
!  "HANDBOOK OF MATHEMATICAL FUNCTIONS WITH FORMULAS, GRAPHS AND MATHEMATICS TABLES"
!  ED. BY ABRAMOWITZ AND STEGUN, NATL BUREAU OF STANDARDS APPLIED
!  MATHEMATICS SERIES.  JUNE, 1964., MAY, 1968.                         
!                                     JACK KAIN                         
!                                     7/6/89                            
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!-----------------------------------------------------------------------
   IMPLICIT NONE
!-----------------------------------------------------------------------
   REAL,         INTENT(IN   )   :: EQ
   REAL,         INTENT(INOUT)   :: EE,UD
   REAL ::       SQRT2P,A1,A2,A3,P,SIGMA,FE,X,Y,EY,E45,T1,T2,C1,C2

      DATA SQRT2P,A1,A2,A3,P,SIGMA,FE/2.506628,0.4361836,-0.1201676,       &
           0.9372980,0.33267,0.166666667,0.202765151/                        
      X=(EQ-0.5)/SIGMA                                                  
      Y=6.*EQ-3.                                                        
      EY=EXP(Y*Y/(-2))                                                  
      E45=EXP(-4.5)                                                     
      T2=1./(1.+P*ABS(Y))                                               
      T1=0.500498                                                       
      C1=A1*T1+A2*T1*T1+A3*T1*T1*T1                                     
      C2=A1*T2+A2*T2*T2+A3*T2*T2*T2                                     
      IF(Y.GE.0.)THEN                                                   
        EE=SIGMA*(0.5*(SQRT2P-E45*C1-EY*C2)+SIGMA*(E45-EY))-E45*EQ*EQ/2.
        UD=SIGMA*(0.5*(EY*C2-E45*C1)+SIGMA*(E45-EY))-E45*(0.5+EQ*EQ/2.-    &
           EQ)                                                          
      ELSE                                                              
        EE=SIGMA*(0.5*(EY*C2-E45*C1)+SIGMA*(E45-EY))-E45*EQ*EQ/2.       
        UD=SIGMA*(0.5*(SQRT2P-E45*C1-EY*C2)+SIGMA*(E45-EY))-E45*(0.5+EQ*   &
           EQ/2.-EQ)                                                    
      ENDIF                                                             
      EE=EE/FE                                                          
      UD=UD/FE                                                          

   END SUBROUTINE PROF5

! ------------------------------------------------------------------------

   SUBROUTINE TPMIX2DD(p,thes,ts,qs,i,j) 8
!
! Lookup table variables:
!     INTEGER, PARAMETER :: (KFNT=250,KFNP=220)
!     REAL, SAVE, DIMENSION(1:KFNT,1:KFNP) :: TTAB,QSTAB
!     REAL, SAVE, DIMENSION(1:KFNP) :: THE0K
!     REAL, SAVE, DIMENSION(1:200) :: ALU
!     REAL, SAVE :: RDPR,RDTHK,PLUTOP
! End of Lookup table variables:
!-----------------------------------------------------------------------
   IMPLICIT NONE
!-----------------------------------------------------------------------
   REAL,         INTENT(IN   )   :: P,THES
   REAL,         INTENT(INOUT)   :: TS,QS
   INTEGER,      INTENT(IN   )   :: i,j     ! avail for debugging
   REAL    ::    TP,QQ,BTH,TTH,PP,T00,T10,T01,T11,Q00,Q10,Q01,Q11
   INTEGER ::    IPTB,ITHTB
   CHARACTER*256 :: MESS
!-----------------------------------------------------------------------

!
!******** LOOKUP TABLE VARIABLES (F77 format)... ****************************
!     parameter(kfnt=250,kfnp=220)
!
!     COMMON/KFLUT/ ttab(kfnt,kfnp),qstab(kfnt,kfnp),the0k(kfnp),        &
!                   alu(200),rdpr,rdthk,plutop 
!*************************************************************** 
!
!***********************************************************************
!     scaling pressure and tt table index                         
!***********************************************************************
!
      tp=(p-plutop)*rdpr
      qq=tp-aint(tp)
      iptb=int(tp)+1
!
!***********************************************************************
!              base and scaling factor for the                           
!***********************************************************************
!
!  scaling the and tt table index                                        
      bth=(the0k(iptb+1)-the0k(iptb))*qq+the0k(iptb)
      tth=(thes-bth)*rdthk
      pp   =tth-aint(tth)
      ithtb=int(tth)+1
!
      t00=ttab(ithtb  ,iptb  )
      t10=ttab(ithtb+1,iptb  )
      t01=ttab(ithtb  ,iptb+1)
      t11=ttab(ithtb+1,iptb+1)
!
      q00=qstab(ithtb  ,iptb  )
      q10=qstab(ithtb+1,iptb  )
      q01=qstab(ithtb  ,iptb+1)
      q11=qstab(ithtb+1,iptb+1)
!
!***********************************************************************
!              parcel temperature and saturation mixing ratio                                        
!***********************************************************************
!
      ts=(t00+(t10-t00)*pp+(t01-t00)*qq+(t00-t10-t01+t11)*pp*qq)
!
      qs=(q00+(q10-q00)*pp+(q01-q00)*qq+(q00-q10-q01+q11)*pp*qq)
!
   END SUBROUTINE TPMIX2DD

! -----------------------------------------------------------------------

  SUBROUTINE ENVIRTHT(P1,T1,Q1,THT1,ALIQ,BLIQ,CLIQ,DLIQ)                        12
!
!-----------------------------------------------------------------------
   IMPLICIT NONE
!-----------------------------------------------------------------------
   REAL,         INTENT(IN   )   :: P1,T1,Q1,ALIQ,BLIQ,CLIQ,DLIQ
   REAL,         INTENT(INOUT)   :: THT1
   REAL    ::    EE,TLOG,ASTRT,AINC,A1,TP,VALUE,AINTRP,TDPT,TSAT,THT,      &
                 T00,P00,C1,C2,C3,C4,C5
   INTEGER ::    INDLU
!-----------------------------------------------------------------------
      DATA T00,P00,C1,C2,C3,C4,C5/273.16,1.E5,3374.6525,2.5403,3114.834,   &
           0.278296,1.0723E-3/                                          
!                                                                       
!  CALCULATE ENVIRONMENTAL EQUIVALENT POTENTIAL TEMPERATURE...          
!                                                                       
! NOTE: Calculations for mixed/ice phase no longer used...jsk 8/00
!
      EE=Q1*P1/(0.622+Q1)                                             
!     TLOG=ALOG(EE/ALIQ)                                              
! ...calculate LOG term using lookup table...
!
      astrt=1.e-3
      ainc=0.075
      a1=ee/aliq
      tp=(a1-astrt)/ainc
      indlu=int(tp)+1
      value=(indlu-1)*ainc+astrt
      aintrp=(a1-value)/ainc
      tlog=aintrp*alu(indlu+1)+(1-aintrp)*alu(indlu)
!
      TDPT=(CLIQ-DLIQ*TLOG)/(BLIQ-TLOG)                               
      TSAT=TDPT-(.212+1.571E-3*(TDPT-T00)-4.36E-4*(T1-T00))*(T1-TDPT) 
      THT=T1*(P00/P1)**(0.2854*(1.-0.28*Q1))                          
      THT1=THT*EXP((C1/TSAT-C2)*Q1*(1.+0.81*Q1))                      
!
  END SUBROUTINE ENVIRTHT                                                              
! ***********************************************************************
!====================================================================

   SUBROUTINE kf_cup_init(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN,      & 1,1
                     RQICUTEN,RQSCUTEN,NCA,W0AVG,P_QI,P_QS,         &
                     SVP1,SVP2,SVP3,SVPT0,                          &
                     cupflag,cldfra_cup,cldfratend_cup,             & !CuP, wig 18-Sep-2006
                     shall,                                         & !CuP, wig 18-Sep-2006
                     tcloud_cup,                                    & !CuP, rce 10-may-2012
                     P_FIRST_SCALAR,restart,allowed_to_read,        &
                     ids, ide, jds, jde, kds, kde,                  &
                     ims, ime, jms, jme, kms, kme,                  &
                     its, ite, jts, jte, kts, kte                   )
!--------------------------------------------------------------------
   IMPLICIT NONE
!--------------------------------------------------------------------
   LOGICAL , INTENT(IN)           ::  restart,allowed_to_read
   INTEGER , INTENT(IN)           ::  ids, ide, jds, jde, kds, kde, &
                                      ims, ime, jms, jme, kms, kme, &
                                      its, ite, jts, jte, kts, kte
   INTEGER , INTENT(IN)           ::  P_QI,P_QS,P_FIRST_SCALAR

   REAL,     DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) ::       &
                                                          RTHCUTEN, &
                                                          RQVCUTEN, &
                                                          RQCCUTEN, &
                                                          RQRCUTEN, &
                                                          RQICUTEN, &
                                                          RQSCUTEN

   REAL ,   DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
                                                             W0AVG, &
                                                        cldfra_cup, & !CuP, wig 18-Sep-2006
                                                    cldfratend_cup    !CuP, wig 18-Sep-2006

   REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT)::       NCA, &
                                                             shall, & !CuP, wig 19-Sep-2006
                                                        tcloud_cup    !CuP, rce 10-may-2012

   LOGICAL, DIMENSION( ims:ime , jms:jme ), INTENT(OUT)::  cupflag    !CuP, wig 9-Oct-2006

   INTEGER :: i, j, k, itf, jtf, ktf
   REAL, INTENT(IN)    :: SVP1,SVP2,SVP3,SVPT0

   jtf=min0(jte,jde-1)
   ktf=min0(kte,kde-1)
   itf=min0(ite,ide-1)

   IF(.not.restart)THEN

      DO j=jts,jtf
      DO k=kts,ktf
      DO i=its,itf
         RTHCUTEN(i,k,j)=0.
         RQVCUTEN(i,k,j)=0.
         RQCCUTEN(i,k,j)=0.
         RQRCUTEN(i,k,j)=0.
         cldfra_cup(i,k,j) = 0.     !CuP, wig 18-Sep-2006
         cldfratend_cup(i,k,j) = 0. !CuP, wig 18-Sep-2006
      ENDDO
      ENDDO
      ENDDO

      IF (P_QI .ge. P_FIRST_SCALAR) THEN
         DO j=jts,jtf
         DO k=kts,ktf
         DO i=its,itf
            RQICUTEN(i,k,j)=0.
         ENDDO
         ENDDO
         ENDDO
      ENDIF

      IF (P_QS .ge. P_FIRST_SCALAR) THEN
         DO j=jts,jtf
         DO k=kts,ktf
         DO i=its,itf
            RQSCUTEN(i,k,j)=0.
         ENDDO
         ENDDO
         ENDDO
      ENDIF

      DO j=jts,jtf
      DO i=its,itf
         NCA(i,j)=-100.
         shall(i,j) = 2. !Indicate no convection at 1st time step. CuP, wig 18-Sep-2006
         cupflag(i,j) = .false. !CuP, wig 9-Oct-2006
         tcloud_cup(i,j) = 0.0  !CuP, rce 10-may-2012
      ENDDO
      ENDDO

      DO j=jts,jtf
      DO k=kts,ktf
      DO i=its,itf
         W0AVG(i,k,j)=0.
      ENDDO
      ENDDO
      ENDDO

   endif
 
   CALL KF_LUTAB(SVP1,SVP2,SVP3,SVPT0)

   END SUBROUTINE kf_cup_init

!-------------------------------------------------------


      subroutine kf_lutab(SVP1,SVP2,SVP3,SVPT0) 2
!
!  This subroutine is a lookup table.
!  Given a series of series of saturation equivalent potential 
!  temperatures, the temperature is calculated.
!
!--------------------------------------------------------------------
   IMPLICIT NONE
!--------------------------------------------------------------------
! Lookup table variables
!     INTEGER, SAVE, PARAMETER :: KFNT=250,KFNP=220
!     REAL, SAVE, DIMENSION(1:KFNT,1:KFNP) :: TTAB,QSTAB
!     REAL, SAVE, DIMENSION(1:KFNP) :: THE0K
!     REAL, SAVE, DIMENSION(1:200) :: ALU
!     REAL, SAVE :: RDPR,RDTHK,PLUTOP
! End of Lookup table variables

     INTEGER :: KP,IT,ITCNT,I
     REAL :: DTH,TMIN,TOLER,PBOT,DPR,                               &
             TEMP,P,ES,QS,PI,THES,TGUES,THGUES,F0,T1,T0,THGS,F1,DT, &
             ASTRT,AINC,A1,THTGS
!    REAL    :: ALIQ,BLIQ,CLIQ,DLIQ,SVP1,SVP2,SVP3,SVPT0
     REAL    :: ALIQ,BLIQ,CLIQ,DLIQ
     REAL, INTENT(IN)    :: SVP1,SVP2,SVP3,SVPT0
!
! equivalent potential temperature increment
      data dth/1./
! minimum starting temp 
      data tmin/150./
! tolerance for accuracy of temperature 
      data toler/0.001/
! top pressure (pascals)
      plutop=5000.0
! bottom pressure (pascals)
      pbot=110000.0

      ALIQ = SVP1*1000.
      BLIQ = SVP2
      CLIQ = SVP2*SVPT0
      DLIQ = SVP3

!
! compute parameters
!
! 1._over_(sat. equiv. theta increment)
      rdthk=1./dth
! pressure increment
!
      DPR=(PBOT-PLUTOP)/REAL(KFNP-1)
!      dpr=(pbot-plutop)/REAL(kfnp-1)
! 1._over_(pressure increment)
      rdpr=1./dpr
! compute the spread of thes
!     thespd=dth*(kfnt-1)
!
! calculate the starting sat. equiv. theta
!
      temp=tmin 
      p=plutop-dpr
      do kp=1,kfnp
        p=p+dpr
        es=aliq*exp((bliq*temp-cliq)/(temp-dliq))
        qs=0.622*es/(p-es)
        pi=(1.e5/p)**(0.2854*(1.-0.28*qs))
        the0k(kp)=temp*pi*exp((3374.6525/temp-2.5403)*qs*        &
               (1.+0.81*qs))
      enddo   
!
! compute temperatures for each sat. equiv. potential temp.
!
      p=plutop-dpr
      do kp=1,kfnp
        thes=the0k(kp)-dth
        p=p+dpr
        do it=1,kfnt
! define sat. equiv. pot. temp.
          thes=thes+dth
! iterate to find temperature
! find initial guess
          if(it.eq.1) then
            tgues=tmin
          else
            tgues=ttab(it-1,kp)
          endif
          es=aliq*exp((bliq*tgues-cliq)/(tgues-dliq))
          qs=0.622*es/(p-es)
          pi=(1.e5/p)**(0.2854*(1.-0.28*qs))
          thgues=tgues*pi*exp((3374.6525/tgues-2.5403)*qs*      &
               (1.+0.81*qs))
          f0=thgues-thes
          t1=tgues-0.5*f0
          t0=tgues
          itcnt=0
! iteration loop
          do itcnt=1,11
            es=aliq*exp((bliq*t1-cliq)/(t1-dliq))
            qs=0.622*es/(p-es)
            pi=(1.e5/p)**(0.2854*(1.-0.28*qs))
            thtgs=t1*pi*exp((3374.6525/t1-2.5403)*qs*(1.+0.81*qs))
            f1=thtgs-thes
            if(abs(f1).lt.toler)then
              exit
            endif
!           itcnt=itcnt+1
            dt=f1*(t1-t0)/(f1-f0)
            t0=t1
            f0=f1
            t1=t1-dt
          enddo 
          ttab(it,kp)=t1 
          qstab(it,kp)=qs
        enddo
      enddo   
!
! lookup table for tlog(emix/aliq)
!
! set up intial values for lookup tables
!
       astrt=1.e-3
       ainc=0.075
!
       a1=astrt-ainc
       do i=1,200
         a1=a1+ainc
         alu(i)=alog(a1)
       enddo   
!
   END SUBROUTINE KF_LUTAB


!--------------------------------------------------------------------
! Calculates the cloud fraction tendency.
!

SUBROUTINE cupCloudFraction(qlg, qig, qv1d, t1d, z1d, p1d,     & 1,6
                            kcubot, kcutop, ishall, wStar, wParcel, pblh, dt, activeFrac, &
                            cldfra, cldfraTend, &
                            taucloud, tActive, tstar, lnterms, lnint, &
                            kts, kte, mfup_cup)  ! add mfup_cup LD 06 29 2012
                      !     kts, kte)
                            
  use module_model_constants, only: r_v, xls0, xls1, xlv0, xlv1
!
! Arguments...
!
   integer, intent(in) :: kts, kte
   integer, intent(in) :: ishall     ! Flag for cloud type (0=deep, 1=shallow, 2=none)

   integer, intent(in) :: kcubot, kcutop  ! Indices of cloud top and bottom
   real, intent(in) :: wStar, pblh   ! Deardorff velocity scale and mixed-layer depth
   real, intent(in) :: wParcel       ! Vertical velocity of parcel
   real, intent(in) :: activeFrac    ! Active cloud fraction, determined from cloud model
   real, intent(in) :: dt            ! Time step used to find cloud fraction

   real, dimension(kts:kte), intent(in) :: qlg     ! Cloud liquid water
   real, dimension(kts:kte), intent(in) :: qig     ! Cloud ice
   real, dimension(kts:kte), intent(in) :: t1d     ! Environment temperature
   real, dimension(kts:kte), intent(in) :: qv1d    ! Environmental mixing ratio
   real, dimension(kts:kte), intent(in) :: z1d     ! Height array on cell middles
   real, dimension(kts:kte), intent(in) :: p1d     ! Pressure array

   real, dimension(kts:kte), intent(inout) :: cldfra ! Cloud fraction
   real, dimension(kts:kte), intent(in) :: mfup_cup ! LD 06 29 2012
   real, dimension(kts:kte), intent(out) :: cldfraTend ! Cloud fraction tendency
!
! Local vars...
!
   integer :: k, kp1 ,kcutop_p1 !BSINGH - Added kcutop_p1

   real :: gamma, zsum
   real,intent(out) :: tauCloud      ! Cloud time scale  ~can make local after testing
   real,intent(out) :: tActive       ! Cloud time scale  ~can make local after testing
!!!   real,intent(out) :: wParcel       ! Cloud velocity scale  ~can make local after testing
   real,intent(out) :: tStar         ! Boundary-layer time scale  ~can make local after testing
!!!   real,intent(out) :: activeFrac    ! Fraction of PDF that forms clouds
   real :: ice_term, liquid_term     ! Terms inside of log for gamma
   real, dimension(kts:kte),intent(out) :: lnTerms ! Combined log terms to be integrated  ~can make local after testing
   real,intent(out) :: lnInt                     ! Integrated log terms for gamma  ~can make local after testing
   real :: intQC                     ! Integrated cloud water add 2010/01/17
   real, dimension(kts:kte) :: satDef ! Saturation deficit  add 2010/01/17
   real :: intSatDef                 ! Integrated saturation deficit aa 2010/01/17
   real :: deltaZ                    ! Height diff. between cell centers
   real :: deltaRsInt                ! Integrated delta rs
   real :: deltaRsTop, deltaRsBot    ! Value at deltaRs at the top an bottom of the layer
   real :: TEnvTop, TEnvBot          ! Env. temperature at top and bottom of the layer
   real :: rs, rsi                   ! Saturation mixing ratios w.r.t liquid and ice
   real :: cp , Ls, Lv               ! Thermodynamic related "constants"

   if( ishall==2 ) then
      ! If no convection, then zero out the cloud fraction...
      cldfra(:) = 0.

   else if( ishall==0 ) then
      ! If deep convection formed, then set the cloud fraction to 1.
      cldfra(:) = 0.
    
  !   cldfra(kcubot:kcutop) = 1.    !!LD
  !!   print(UMF(?)) unit??
         do k=kcubot,kcutop
          cldfra(k) = max(0.,min(0.1*log(1.+675.*mfup_cup(k)),1.))  !!  LD 06 29 2012 :: .1/675 adjustable parameter
         end do
!    print*,"mfup_cup(kcubot)=",mfup_cup(kcubot)  
    
     tStar = pblh / wStar  ! rce 11-may-2012

   else if( ishall==1 ) then
    
      ! Shallow convection occurred so we need to be more detailed...

      tStar = pblh / wStar           ! Find tStar based on mixed-layer depth

      ! Integrate the log terms for the cloud time scale over the depth
      ! of the cloud and take into account both liquid and ice as
      ! separate terms. Do not allow super saturation, and at the same
      ! time, preclude divide by zeros by limiting the (rs-r)'s to
      ! positive values.
      lnTerms(:) = 0.
     
     !!The determination of the cloud time scales around line 3523.
     !!modified the do loop that computes the integrated cloud water and the saturation deficit.  
     !!code starts at line 3541 and continues through 3560

      !!do k=kcubot,kcutop
           !!cp = findCp(qv1d(k))
           !!rs = findRs(t1d(k), p1d(k))
           !!Lv =  xlv0 - xlv1*t1d(k)
           !!gamma = eps*(Lv**2)*rs / (cp*r_v*t1d(k)**2)
           !!liquid_term = (1.+gamma)*qlg(k) / max(rs - qv1d(k),1e-20)

         !!Ls =  xls0 - xls1*t1d(k)
         !!rsi = findRsi(t1d(k), p1d(k))
         !!gamma = eps*(Ls**2)*rsi / (cp*r_v*t1d(k)**2)
         !!ice_term = (1.+gamma)*qig(k) / max(rsi - qv1d(k),1e-20)

         !!lnTerms(k) = 1. + liquid_term !~tmp + ice_term 
      !!end do
     
      !lnInt = 0.! add 2011/01/16 start
      intQC = 0.  
      intSatDef = 0.
      zsum  = 0.

      !BSINGH - Added do-loop to compute 'satDef' before it is being used in the next do-loop
      !BSINGH - This loop should go to (kcutop+1) as we are trying to access satDef(k+1) in the next do-loop
      kcutop_p1 = min(kcutop + 1,kte)
      do k = kcubot, kcutop_p1 
         rs = findRs(t1d(k), p1d(k))
         satDef(k) = max(rs - qv1d(k), 1.0e-20)
      end do
      !BSINGH - ENDS

      do k=kcubot,kcutop
         kp1 = min(k+1,kte-1)
         deltaZ = z1d(kp1) - z1d(k)  ! Find the interval
         zsum = zsum + deltaz
         !!lnInt = lnInt + 0.5*(lnTerms(k) + lnTerms(kp1))*deltaZ
         rs = findRs(t1d(k), p1d(k))
         satDef(k) = max(rs - qv1d(k), 1e-20)
         intQC = 0.5*(qlg(k) + qlg(kp1)) * deltaz + intQC
!         print *, 'Values within cupCloudFraction', intSatDef, satDef(k),satDef(kp1),deltaz,k,kp1
         !print *, 'Values within cupCloudFraction',rs,qv1d(k),qlg(k),qlg(kp1),k,kp1
         intSatDef = 0.5*(satDef(k) + satDef(kp1)) * deltaz + intSatDef
      end do
      !!lnInt = lnInt/zsum !Turn the integral into an average
      cp = findCp(qv1d(kcubot))              ! Use the thermodynamic properties at cloud base for defining gamma
      rs = findRs(t1d(kcubot), p1d(kcubot))
      Lv =  xlv0 - xlv1*t1d(kcubot)
      gamma = (Lv**2)*rs / (cp*r_v*t1d(kcubot)**2)
      lnInt = log(1.0 + (1.0 + gamma) * intQC / intSatDef)
      lnInt = max(lnInt, 1.0)                ! Set the value of lnInt to be 1 or greater
                   ! add 2011/01/16 end
      ! Find the time scale of the cloud lifetime, tauCloud, and the time
      ! scale of the cloud formation, tActive...
      !!tauCloud = min(tStar*lnInt, 3600.) !Set a max taucld of 60 min.
      tauCloud = min(tStar*lnInt, 1800.) !Set a max taucld of 60 min.
      if(wParcel .gt. 0) then
        tActive = z1d(kcutop)/wParcel
      else 
        tActive = z1d(kcutop) / wStar
      endif
!!!! tActive or tactive matter? Dec-15-2010-LP
!!$      ! Now, find the cloud fraction tendency. Above and below the cloud,
!!$      ! it is zero.
!!$      cldfraTend(kts:max(kcubot-1,kts)) = 0.
!!$      cldfraTend(min(kcutop+1,kte):kte) = 0.
!!$      do k=kcubot,kcutop
!!$         cldfraTend(k) = dt*(activeFrac/tActive - cldfra(k)/tauCloud)
!!$      enddo

      ! Now, get a steady-state cloud fraction and restrict it to the
      ! range [0,1]...
      cldfra(:) = 0.
      do k=kcubot,kcutop
         cldfra(k) = activeFrac*tauCloud/tActive
         cldfra(k) = max(cldfra(k), 0.01)  ! LKB 9/9/09 Changed from 0 to be 0.1
         cldfra(k) = min(cldfra(k), 1.)
      end do

   else
      !This should never happen!
      call wrf_error_fatal("Bad ishall value in kfcup.")
   end if

END SUBROUTINE cupCloudFraction


!------------------------------------------------------------------------

SUBROUTINE cup_jfd(slopeSfc, slopeEZ, sigmaSfc, sigmaEZ,                & 1,3
     numBins, thBinSize, rBinSize, th_perturb, r_perturb, jfd           )

  USE module_model_constants, only: pi2
!
! Arguments...
!
  integer, intent(in) :: numBins
  real, intent(in) :: thBinSize, rBinSize
  real, intent(inout) :: slopeSfc, slopeEZ, sigmaSfc, sigmaEZ
  real, dimension(numBins), intent(out) :: r_perturb, th_perturb
  real, dimension(numBins,numBins), intent(out) :: jfd
!
! Local vars...
!
  integer :: centerBin, i, j
  real :: bigcheck, c, constants, cterm, dslope, jacobian, jfdCheckSum, m, mterm
  character(len=150) :: message
!
! Limit the allowable values of the slopes and sigmas ~get the right values for caps
!
!  slopeSfc = sign( min( abs(slopeSfc), 2e6 ), slopeSfc)
!  slopeEZ  = sign( min( abs(slopeEZ), 2e6 ), slopeEZ)
!~  sigmaSfc = max( abs(sigmaSfc), rBinSize ) ! <-- This one is the only one that really limited anything. It was only giving the value rBinSize.
!~  sigmaEZ  = max( abs(sigmaEZ), rBinSize )

!!$!~wig begin: testing due to overflow of jfd calc 13-dec-2006
!!$if( abs(slopesfc) < 1e-14 ) print*,"small slopesfc =",slopesfc
!!$if( abs(slopeez)  < 1e-14 ) print*,"small slopeez  =",slopeez
!!$if( abs(sigmasfc) < 1e-14 ) print*,"small sigmasfc =",sigmasfc
!!$if( abs(sigmaez)  < 1e-14 ) print*,"small sigmaez  =",sigmaez
!!$!~wig end

  slopeSfc = sign(max( abs(slopeSfc), 1e-15 ), slopeSfc)
  !!slopeEZ  = sign(max( abs(slopeEZ), 1e-10 ), slopeEZ) !1e-15 caused an overflow for the jfd~
  if(slopeEZ > 2000) then
     slopeEZ = 2000.0
  else if(slopeEZ < -2000) then 
     slopeEZ = -2000.0
  else if(slopeEZ < 10 .and. slopeEZ > 0) then 
     slopeEZ = 10.0
  else if(slopeEZ < 0 .and. slopeEZ > -10.0) then 
     slopeEZ = -10.0
  endif
  sigmaSfc = sign(max( abs(sigmaSfc), 1e-15 ), sigmaSfc)
  sigmaEZ  = sign(max( abs(sigmaEZ), 1e-15 ), sigmaEZ)
  !!slopeEZ = 1000.0 ! Larry, set constant value of slopeEZ
!!  slopeSfc = sign(min (abs(slopeSfc), 5000.0), slopeSfc)   ! lkb Added check on size of slopes
!!  slopeSfc = sign(min (abs(slopeEZ), 5000.0), slopeEZ)
!
! Calculate all the values that are held constant while looping through
! the perturbations...
!
  centerBin = numBins / 2 + 1                 ! Find the center bin
  dslope = sign(max(abs(slopeEZ-slopeSfc),1e-15),slopeEZ-slopeSfc)
  jacobian = slopeEZ / dslope                 ! Compute the jacobian
  !wig: 22-Dec-2006 added parentheses that had been inadvertantly dropped...
!wig  constants = jacobian*thBinSize*rBinSize / (pi2*sigmaSfc*sigmaEZ)
  bigcheck = sqrt(huge(c))   ! 10/30/08 lkb 0.1*huge(c)
!
! Loop through all the perturbation possibilities and get the jfd...
!
  jfdCheckSum = 0.
  do j = 1, numBins                           ! For each bin of the jfd
     r_perturb(j) = rBinSize * (j - centerBin)
     do i = 1, numBins
        th_perturb(i) = thBinSize * (i - centerBin)

        ! Convert theta and r to c and m space. This uses eq. 4
        ! from Berg and Stull (2004)
        c = slopeEZ * (th_perturb(i) - slopeSfc * r_perturb(j)) / dslope
        m = (th_perturb(i) - slopeEZ * r_perturb(j)) / dslope

!wig, 22-Dec-2006: Actual desired calc commented since was getting
!                  an overflow. So, added code to enforce limits.
!        jfd(i,j) = exp(-0.5 * ( (m/sigmaSfc) * (m/sigmaSfc) + &
!                   (c/sigmaEZ) * (c/sigmaEZ) )) * constants
        cterm = c/sigmaEZ
        if( abs(cterm) > bigcheck ) then
           write(message, &
           '("KFCuP setting a bogus cterm for JFD. c=",1e15.6," &
            & sigmaEZ=",1e15.6)') &
                c, sigmaEZ
           call wrf_debug(0,trim(message))
           cterm = sign(bigcheck,cterm)
        else
           cterm = cterm*cterm
        end if
        mterm = m/sigmaSfc
!!$        if( abs(mterm) > 0.1*bigcheck ) then
!!$           write(message, &
!!$                '("KFCuP has a big mterm for JFD. m=",1e15.6," sigmaSfc=",1e15.6," dslope=",1e15.6," slopeEZ=",1e15.6," slopeSfc=",1e15.6)') &
!!$                m, sigmaSfc,dslope,slopeEZ,slopeSfc
!!$           call wrf_debug(0,trim(message))
!!$           flush(0)
!!$           flush(6)
!!$        end if
        if( abs(mterm) > bigcheck ) then

print*,'bigcheck=',bigcheck
           write(message, &
                '("KFCuP setting a bogus mterm for JFD. m=",1e15.6, &
                & " sigmaSfc=",1e15.6)') &
                m, sigmaSfc
           call wrf_debug(0,trim(message))
           flush(0)
           flush(6)
           mterm = sign(bigcheck,mterm)
        else
           mterm = mterm*mterm
        end if
!wig: took off constants because they will not affect the outcome after normalizing to one
        jfd(i,j) = exp( -0.5*(mterm + cterm) )  !* constants 
!wig: end of overflow hack

        jfdCheckSum = jfdCheckSum + jfd(i,j)

     enddo
  enddo

!!$!~Add check to only output the check sum if it is out of the ordinary...
!!$  write(*,*) "JFD sums to ", jfdCheckSum, " Number of bins is ", numBins
!!$  write(30,*) "~JFD sums to ", jfdCheckSum, " Number of bins is ", numBins
!!$  write(30,'("slope sfc/ez & sigma sfc/ez: ",4g18.8)') slopesfc,slopeez,sigmasfc,sigmaez
!!$  if( count(abs(jfd) > 1e-30) > 1 ) write(30,*) "---Non-spiked JFD---",count(abs(jfd) > 1e-30)
!!$  write(30,'(21g11.4)') 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21
!!$  do j=1,numBins
!!$     write(30,'(i3, 17e11.4)') j,jfd(:,j)
!!$  end do

! Force jfd sum to be one...
  if( jfdCheckSum /= 0. ) jfd(:,:) = jfd(:,:)/jfdCheckSum  !~Re-normalize the jfd to sum to one

!!$  write(30,*) "~adjusted JFD..."
!!$  write(30,'(21g11.4)') 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21
!!$  do j=1,numBins
!!$     write(30,'(i3, 21e11.4)') j,jfd(:,j)
!!$  end do
!!$  write(30,*)

END SUBROUTINE cup_jfd


!------------------------------------------------------------------------

SUBROUTINE cupSlopeSigma(dx, psfc, p, rho, dz8w, z, ht,                 & 1,6
               t, th, tsk, u, v, qv_curr, hfx,xland, qfxin, mavail,     & ! add xland, LD 19-Oct-2011
               sf_sfclay_physics, br, regime, pblh, kpbl, t2, q2,       &
               slopeSfc, slopeEZ, sigmaSfc, sigmaEZ, wStar, cupflag,    &
               shall, kms, kme, kts, kte                             )

  USE module_model_constants, only: cp, ep_1, ep_2, g, r_d, rcp, &
                                    svp1, svp2, svp3, svpt0, xlv

  USE module_state_description, ONLY : KFCUPSCHEME               &
                                      ,SFCLAYSCHEME              &
                                      ,MYJSFCSCHEME              &
                                      ,GFSSFCSCHEME              &
                                      ,SLABSCHEME                &
                                      ,LSMSCHEME                 &
                                      ,RUCLSMSCHEME
! MPI is needed for the test printouts (to get the rank)...
!#ifdef ( DM_PARALLEL ) && !defined( STUBMPI )
#if ( ! defined(DM_PARALLEL)  &&   ! defined(STUBMPI) )
! rce_testing turn this off
! INCLUDE 'mpif.h'
#endif

!
! Arguments...
!
  integer, intent(in) :: kpbl, sf_sfclay_physics, &
                         kms, kme, kts, kte

  real, intent(in) :: &
       br, dx, hfx,xland, ht, mavail, pblh, psfc, q2, qfxin, regime, t2, tsk !add xland LD 19-Oct-2011

  real, dimension(kms:kme), intent(in) :: &
       p, rho, dz8w, z, t, th, qv_curr, u, v

  real, intent(out) :: &
       slopeSfc, slopeEZ, sigmaSfc, sigmaEZ, wStar
  real, intent(inout) :: shall

  logical, intent(out) :: cupflag
!
! Local vars...
!
  integer :: docldstep, fout, i, ierr, j, k, kpblmid, numZ
  real :: br2, dtcu, e1, dthvdz, flux, govrth, psfccmb, qdiff, qfx, &
       qsfc, rhox, thv2, thgb, thv, tskv, tvcon, vconv, vsgd, wspd, za
  real, dimension(kts:kte) :: zagl
  logical :: UnstableOrNeutral
  character(len=50) :: filename
!
! Artificially force a latent heat flux that is not close to zero. This
! prevents sigmaSfc from becoming too small and leading to overflows
! in the JFD calculation.
!
  if( abs(qfxin) < 1./xlv ) then
     qfx = sign(1./xlv,qfxin)
  else
     qfx = qfxin
  end if
!
! Determine if each column is stable or (unstable or neutral). If the regime
! is already calculated by one of the surface schemes, we can use it. If not,
! deterimine the stability based on the bulk richardson number. We only
! care about stable vs. (neutral or unstable).
!
   UnstableOrNeutral = .false.
   sfclay_case: SELECT CASE (sf_sfclay_physics)
   CASE (SFCLAYSCHEME)
      ! Regime categories:
      !    1 = Stable (nighttime)
      !    2 = Damped mechanical turbulence
      !    3 = Forced convection
      !    4 = Free convection
      ! Add condition for positive heat flux because negative heat fluxes
      ! were causing the wstar calculation to core dump--can't do a 1/3
      ! root of a negative value. wig, 5-Feb-2008
      if( regime > 2.5 &
           .AND. hfx >= 0. ) UnstableOrNeutral = .true.

   CASE (GFSSFCSCHEME)
      if( br <= 0. ) UnstableOrNeutral = .true.

   CASE DEFAULT  
      ! The selected sfc scheme does not already provide a stability
      ! criteria. So, we will mimic the bulk Richardson calculation from
      ! module_sf_sfclay.F.

      !!if( pblh <= 0. ) call wrf_error_fatal( &
      !!     "CuP needs a PBL height from a PBL scheme.")
      if(pblh <= 0.0)then
         UnstableOrNeutral = .false.   ! Added by LKB 9/8/09

      else                                          ! Added by LKB 9/8/09
         ZA    = 0.5*dz8w(1)

         E1    = SVP1*EXP(SVP2*(TSK-SVPT0)/(TSK-SVP3))
         PSFCCMB=PSFC/1000.  !converts from Pa to cmb
         QSFC  = EP_2*E1/(PSFCCMB-E1)
         THGB  = TSK*(100./PSFCCMB)**RCP
         TSKV  = THGB*(1.+EP_1*QSFC*MAVAIL)
         TVCON = 1.+EP_1*QV_CURR(1)
         THV   = TH(1)*TVCON
         DTHVDZ= (THV-TSKV)

         GOVRTH= G/TH(1)

         RHOX  = PSFC/(r_d*t(1)*TVCON)
         flux  = max(hfx/rhox/cp + ep_1*tskv*qfx/rhox,0.)
         VCONV = (g/TSK*pblh*flux)**.33
         VSGD  = 0.32 * (max(dx/5000.-1.,0.))**.33
         WSPD  = SQRT(U(1)*U(1)+V(1)*V(1))
         WSPD  = SQRT(WSPD*WSPD+VCONV*VCONV+vsgd*vsgd)
         WSPD  = MAX(WSPD,0.1)

         !And finally, the bulk Richardson number...
         BR2   = GOVRTH*ZA*DTHVDZ/(WSPD*WSPD)

         if( br2 <= 0. ) then
            UnstableOrNeutral = .true.
         else 
            UnstableOrNeutral = .false.
         endif
      endif
   END SELECT sfclay_case

   ! If we are in a stable regime, then the assumptions for CuP do not
   ! make sense, so default back to the standard KF algorithm. Also, do
   ! this if the pbl is at the lowest level since then we cannot
   !calculate a proper difference with the surface.
   !if( kpbl == 1 .or. (.not. UnstableOrNeutral) .or. hfx < 0 .or. qfx < 0) then !~ lkb 8/25/08 changed to require + heat flux
     ! if( kpbl == 1 .or. hfx < 1 ) then !~ lkb 8/25/08 changed to require + heat flux
     ! if( kpbl == 1 .or. hfx < 50 ) then !~ lkb 8/25/08 changed to require + heat flux
     ! if( kpbl <= 2 .or. hfx < 100 ) then !~ lkb 8/25/08 changed to require + heat flux
      if(xland .eq.1 )then !~ LD 18-Oct-2011
      if( kpbl <= 2 .or. hfx < 100 ) then !~ lkb 8/25/08 changed to require + heat flux
      cupflag = .false.
      slopeSfc = 0.
      slopeEZ  = 0.
      sigmaSfc = 0.
      sigmaEZ  = 0.
      shall = 2                           ! Added by LK Berg on 6/17/09 to stop shallow clouds at night
      return         ! <---Alternate return point
      else
      cupflag = .true.
      end if
      else
      if( kpbl <= 2 .or. hfx < 1 ) then !~ lkb 8/25/08 changed to require + heat flux
      cupflag = .false.
      slopeSfc = 0.
      slopeEZ  = 0.
      sigmaSfc = 0.
      sigmaEZ  = 0.
      shall = 2                           ! Added by LK Berg on 6/17/09 to stop shallow clouds at night
      return         ! <---Alternate return point
      else
      cupflag = .true.
      end if
      end if  

   ! Convert height from AMSL to AGL...
   do k=kts, kte-1
      zagl(k) = z(k) - ht
   end do

!!$           ! Find the index closest to the middle of the PBL...
!!$           kpblmid = 0
!!$           do k=kts, kte-1
!!$              if( zagl(k) > pblh(i,j) ) then
!!$                 kpblmid = max(1, k/2)
!!$                 exit
!!$              end if
!!$           end do
!!$           if( kpblmid == 0 ) &
!!$                call wrf_error("CuP ERROR: PBLH not within the domain.")

   if( kpbl == 0 ) call wrf_error_fatal("CuP ERROR: kpbl==0")

   ! Calculate the Deardorff velocity, wStar. As a rough
   ! approximation of the middle of PBL averaged theta and mixing
   ! ratio, use the value at the middle of the PBL.
   ! The flux amalgamation formula is from Stull, p.147 and
   ! wStar is from Stull, p. 118.
   kpblmid = max(kts,kpbl/2)
   flux  = (1. + EP_1*qv_curr(1))*hfx/rho(1)/cp + &
           EP_1*th(1)*qfx/rho(1)  !badbad/xlv
   tvcon = 1.+EP_1*qv_curr(kpblmid)
   thv   = th(kpblmid)*tvcon
   wStar = (g*pblh*flux/thv)**(1./3.)
      !!write(*,*) 'Larry ... wStar', wStar, pblh, flux, thv
   ! Calculate the slope (dTemp/dMixRatio) for the surface layer
   ! and entrainment zone...
   thv   = th(kpblmid)*tvcon  !Virt. pot. temp. at lowest model level
   tvcon = 1.+EP_1*qv_curr(1)
   thv2  = th(1)*tvcon  !Virt. pot. temp. at lowest model level
   qdiff = qv_curr(kpblmid)-qv_curr(1)
   if( abs(qdiff) < reallysmall ) qdiff = sign(reallysmall,qdiff)
!   slopeSfc = (thv-thv2) / qdiff
!   Changed slopeSfc to use Bowen ratio
    slopeSfc = hfx/(xlv * qfx) * xlv / cp ! Recall that hfx is in W m-2 and LH is also in W m-2
   tvcon = 1.+EP_1*qv_curr(min(kpbl+2,kte))
   thv   = th(min(kpbl+2,kte))*tvcon 
   tvcon = 1.+EP_1*qv_curr(kpblmid)
   thv2  = th(kpblmid)*tvcon
   qdiff = qv_curr(min(kpbl+2,kte)) - qv_curr(kpblmid)
   if( abs(qdiff) < reallysmall ) then
        qdiff = sign(reallysmall,qdiff)
   endif
   slopeEZ = (thv-thv2) / qdiff
   ! Calculate the standard deviations along the theta and 
   ! mixing ratio axes of the PDF following Berg and Stull (2004)
   ! eqs. 17a and 17b. For sigmaSfc, we currently are only using
   ! rstar and not rstarNew.
   ! For sigmaEZ, reuse the flux var that contains (w'thetav')bar
   sigmaEz = flux/wStar* &
        ( 2. + (8.2e-4)* &
        (zagl(kpblmid)/pblh)**(-1.8) )  ! Changed by lkb, 1/21/09 to use kpblmid
        !!(zagl(min(kpbl+2,kte))/pblh)**(-1.8) )

   flux = qfx/rho(1)  !badbad /xlv                ! (w'qv')bar
!!$           sigmaSfc(i,j) = flux*(1-zagl(1)/pblh(i,j))/wStar * &
!!$                ( 2.3 + 1.1e-2*(zagl(1)/pblh(i,j))**(-1.6) )
   sigmaSfc = flux/wStar * &
        ( 2.3 + 1.1e-2*(zagl(kpblmid)/pblh)**(-1.6) )

#if 0
   !
   ! Output the inputs to CuP for debugging with offline code...
   !
   call wrf_message("Outputting cupin file.")
   k = 0
#ifdef ( DM_PARALLEL ) && !defined( STUBMPI )
   CALL MPI_Comm_rank ( MPI_COMM_WORLD, k, ierr ) !this isn't tested with MPI yet
#endif
   write(filename, '("cupin.",i3.3,".txt")') k
   fout = 17
   do !Make sure we use an available unit.
      inquire(UNIT=fout,OPENED=ierr)
      if( ierr==.true. ) exit
      fout = fout + 1
      if( fout > 100 ) exit
   end do
   open(UNIT=fout, FILE=trim(filename), FORM="formatted", &
        STATUS="unknown", IOSTAT=k)
   if( k /= 0 ) call wrf_error_fatal("Could not open cupin file.")

   write(UNIT=fout,FMT='(a)') "Inputs to cup_driver..."
!!$   write(UNIT=fout,FMT='("ktau,i,j=",i,2i5)') ktau, i, j
!!$         write(UNIT=fout,FMT='("stepcu, dt=",i,g17.9)') stepcu, dt
!!$         write(UNIT=fout,FMT='("ids,ide, jds, jde, kds, kde=",6i5)') &
!!$              ids,ide, jds, jde, kds, kde
!!$         write(UNIT=fout,FMT='("ims,ime, jms, jme, kms, kme=",6i5)') &
!!$              ims,ime, jms, jme, kms, kme
!!$         write(UNIT=fout,FMT='("its,ite, jts, jte, kts, kte=",6i5)') &
!!$              its,ite, jts, jte, kts, kte

   write(UNIT=fout,FMT='("sf_sfclay_physics =",i)') sf_sfclay_physics
   write(UNIT=fout,FMT='("dx =",g17.9)') dx
   write(UNIT=fout,FMT='("psfc =",g17.9)') psfc
   write(UNIT=fout,FMT='("kpbl =",i)') kpbl
   write(UNIT=fout,FMT='("pblh =",g17.9)') pblh
   write(UNIT=fout,FMT='("ht =",g17.9)') ht
   write(UNIT=fout,FMT='("tsk =",g17.9)') tsk
   write(UNIT=fout,FMT='("t2 =",g17.9)') t2
   write(UNIT=fout,FMT='("q2 =",g17.9)') q2
   write(UNIT=fout,FMT='("hfx =",g17.9)') hfx
   write(UNIT=fout,FMT='("qfx =",g17.9)') qfx
   write(UNIT=fout,FMT='("mavail =",g17.9)') mavail
   write(UNIT=fout,FMT='("br =",g17.9)') br
   write(UNIT=fout,FMT='("regime =",g17.9)') regime

   write(UNIT=fout,FMT='("p,rho, t, th, qv:")')
   do k=kts,kte
      write(UNIT=fout,FMT='("   ",5g17.9)') &
           p(k), rho(k), t(k), th(k), qv_curr(k)
   end do

   write(UNIT=fout,FMT='("z, dz8w, u, v:")')
   do k=kts,kte
      write(UNIT=fout,FMT='("   ",4g17.9)') &
           z(k), dz8w(k), u(k), v(k)
   end do

   write(UNIT=fout,FMT='(a)') "Calculated inside cup_driver..."
   write(UNIT=fout,FMT='("slopeSfc =",g17.9)') SlopeSfc
   write(UNIT=fout,FMT='("slopeEZ =",g17.9)') SlopeEZ
   write(UNIT=fout,FMT='("sigmaSfc =",g17.9)') sigmaSfc
   write(UNIT=fout,FMT='("sigmaEZ =",g17.9)') sigmaEZ
   write(UNIT=fout,FMT='("wStar =",g17.9)') wStar
   write(UNIT=fout,FMT='("dtcu =",g17.9)') dtcu

   write(UNIT=fout,FMT='("zagl:")')
   do k=kts,kte
      write(UNIT=fout,FMT='("   ",1g17.9)') &
           zagl(k)
   end do

   close(UNIT=fout)
#endif
END SUBROUTINE cupSlopeSigma


!------------------------------------------------------------------------
! Find Cp for moist air
!

FUNCTION findCp(r) 1
  implicit none
  real :: findCp
  real, intent(in) :: r  ! Mixing ratio

  findCp = 1004.67 * (1.0 + 0.84 * r)
END FUNCTION findCp


!------------------------------------------------------------------------
! Finds the index when an ordered list becomes bigger than a given value.
! The list is assumed to be ordered from small to big values.

FUNCTION findIndex(value,list) 3
  implicit none
  integer :: findindex
  real, intent(in) :: value
  real, intent(in), dimension(:) :: list

  integer :: i

  findindex = 0
  do i=1,ubound(list,1)
     if( value <= list(i) ) then
        findindex = i
        exit
     end if
  end do
END FUNCTION findIndex

!------------------------------------------------------------------------
! Find the saturation mixing ratio w.r.t. water. This subroutine uses
! Teten's formula.
!    T in K and p in hPa

FUNCTION findRs(t,p) 3
  real :: findRs
  real, intent(in) :: t, p
  real :: es

  es = 610.78 * exp( 17.67 * (t - 273.16) / (t - 29.66))
  findRs = eps * es / (p - es)
END FUNCTION findRs


!------------------------------------------------------------------------
! Find the saturation mixing ratio w.r.t. ice.
!    T in K and p in hPa

FUNCTION findRsi(t,p)
  real :: findRsi
  real, intent(in) :: t, p
  real :: esi

! WMO formula:
!  esi = 10.**(-9.09685*(273.15/t - 1.) - 3.56654*log10(273.15/t) &
!       + 0.87682*(1. - t/273.15) + 0.78614)

! GoffGratch formula:
  esi = 10**(-9.09718*(273.15/t - 1.) - 3.56654*log10(273.15/t) &
       + 0.876793*(1. - t/273.15) + log10(6.1071))

  findRsi = eps * esi / (p - esi)
END FUNCTION findRsi


!------------------------------------------------------------------------

      subroutine activate_cldbase_kfcup( idiagee, grid_id, ktau, & 1,2
         ii, jj, kk, kts, kte, lc, kcldlayer, &
         num_chem, maxd_acomp, maxd_aphase, maxd_atype, maxd_asize, &
         ntype_aer, nsize_aer, ncomp_aer, &
         ai_phase, msectional, massptr_aer, numptr_aer, &
         dlo_sect, dhi_sect, dens_aer, hygro_aer, sigmag_aer, &
         tk_act, rho_act, dp, w_act, &
         chem1d, qndrop_act )

      use module_mixactivate, only:  activate

      integer, intent(in) :: &
         idiagee, grid_id, ktau, &
         ii, jj, kk, kts, kte, lc, kcldlayer, &
         num_chem, maxd_acomp, maxd_aphase, maxd_atype, maxd_asize, &
         msectional, ntype_aer, ai_phase
      integer, intent(in) :: ncomp_aer(maxd_atype), nsize_aer(maxd_atype)
      integer, intent(in) :: massptr_aer(maxd_acomp,maxd_asize,maxd_atype,maxd_aphase)
      integer, intent(in) :: numptr_aer(maxd_asize,maxd_atype,maxd_aphase)   

      real, intent(in   ) :: chem1d(kts:kte,1:num_chem)
      real, intent(in   ) :: dens_aer(maxd_acomp,maxd_atype)
      real, intent(in   ) :: dlo_sect(maxd_asize,maxd_atype), dhi_sect(maxd_asize,maxd_atype)
      real, intent(in   ) :: dp(kts:kte)
      real, intent(in   ) :: hygro_aer(maxd_acomp,maxd_atype)
      real, intent(inout) :: qndrop_act
      real, intent(in   ) :: rho_act
      real, intent(in   ) :: sigmag_aer(maxd_asize,maxd_atype)
      real, intent(in   ) :: tk_act
      real, intent(in   ) :: w_act

      integer :: icomp, iphase, isize, itype, k, l

      real :: flux_fullact
      real :: tmpa, tmpdpsum, tmpvol, tmpwght
      real, dimension( 1:maxd_asize, 1:maxd_atype ) :: &
                     fn, fs, fm, fluxn, fluxs, fluxm, &
                     hygroavg, numbravg, volumavg

!
! for each isize and itype, calculate average number, volume, and hygro
! over the updraft source layers
!
!     if (idiagee > 0) write(98,'(//a,5i5)') 'kfcup activate_cldbase_kfcup - i, j, ksrc1/2', i, j, lc, kcldlayer
      hygroavg(:,:) = 0.0
      numbravg(:,:) = 0.0
      volumavg(:,:) = 0.0
      tmpdpsum = sum( dp(lc:kcldlayer) )
      iphase = ai_phase
      do k = lc, kcldlayer
         tmpwght = dp(k)/tmpdpsum
         do itype = 1, ntype_aer
         do isize = 1, nsize_aer(itype)
            l = numptr_aer(isize,itype,iphase)
            numbravg(isize,itype) = numbravg(isize,itype) + tmpwght*max( 0.0, chem1d(k,l) )
            do icomp = 1, ncomp_aer(itype)
               l = massptr_aer(icomp,isize,itype,iphase)
               tmpvol = max( 0.0, chem1d(k,l) ) / dens_aer(icomp,itype)
               volumavg(isize,itype) = volumavg(isize,itype) + tmpwght*tmpvol
               hygroavg(isize,itype) = hygroavg(isize,itype) + tmpwght*tmpvol*hygro_aer(icomp,itype)
            end do
         end do ! isize
         end do ! itype
      end do ! k

      do itype = 1, ntype_aer
      do isize = 1, nsize_aer(itype)
         hygroavg(isize,itype) = hygroavg(isize,itype) / max( 1.0e-35, volumavg(isize,itype) )
! convert numbravg from (#/kg) to (#/m3)
         numbravg(isize,itype) = numbravg(isize,itype)*rho_act
! convert volumavg to (m3/m3) -- need 1e-12 factor because (rho_act*chem1d)/dens_aer = [(ugaero/m3air)/(gaero/cm3aero)]
         volumavg(isize,itype) = volumavg(isize,itype)*rho_act*1.0e-12

!        if (vaero_dsect_adjust_opt == 1) then
! recalc volumavg using particle diameter = dcen_sect
!           tmpvol = sqrt( dlo_sect(isize,itype) * dhi_sect(isize,itype) ) * 1.0e-2  ! particle diameter in (m)
!           tmpvol = (tmpvol**3) * 3.1415926536/6.0  ! particle volume in (m3)
!           volumavg(isize,itype) = numbravg(isize,itype) * tmpvol
!        end if
      end do ! isize
      end do ! itype

! adjust number and volume for scm sensitivity testing
!     numbravg(:,:) = numbravg(:,:) * max( naero_adjust_factor, 1.0e-2 )
!     volumavg(:,:) = volumavg(:,:) * max( naero_adjust_factor, 1.0e-2 )

      call activate( w_act, 0.0, 0.0, 0.0, 1.0, tk_act, rho_act,  &
                      msectional, maxd_atype, ntype_aer, maxd_asize, nsize_aer,    &
                      numbravg, volumavg, dlo_sect, dhi_sect, sigmag_aer, hygroavg, &
                      fn, fs, fm, fluxn, fluxs, fluxm, flux_fullact, &
                      grid_id, ktau, ii, jj, kk )

!     subroutine activate( wbar, sigw, wdiab, wminf, wmaxf, tair, rhoair,  &
!                     msectional, maxd_atype, ntype_aer, maxd_asize, nsize_aer,    &
!                     na, volc, dlo_sect, dhi_sect, sigman, hygro, &
!                     fn, fs, fm, fluxn, fluxs, fluxm, flux_fullact, &
!                     grid_id, ktau, ii, jj, kk )
!      mks units
!
!  input
!     integer,intent(in) :: maxd_atype      ! dimension of types
!     integer,intent(in) :: maxd_asize      ! dimension of sizes
!     integer,intent(in) :: ntype_aer       ! number of types
!     integer,intent(in) :: nsize_aer(maxd_atype) ! number of sizes for type
!     integer,intent(in) :: msectional      ! 1 for sectional, 0 for modal
!     integer,intent(in) :: grid_id         ! WRF grid%id
!     integer,intent(in) :: ktau            ! WRF time step count
!     integer,intent(in) :: ii, jj, kk      ! i,j,k of current grid cell
!     real,intent(in) :: wbar          ! grid cell mean vertical velocity (m/s)
!     real,intent(in) :: sigw          ! subgrid standard deviation of vertical vel (m/s)
!     real,intent(in) :: wdiab         ! diabatic vertical velocity (0 if adiabatic)
!     real,intent(in) :: wminf         ! minimum updraft velocity for integration (m/s)
!     real,intent(in) :: wmaxf         ! maximum updraft velocity for integration (m/s)
!     real,intent(in) :: tair          ! air temperature (K)
!     real,intent(in) :: rhoair        ! air density (kg/m3)
!     real,intent(in) :: na(maxd_asize,maxd_atype)     ! aerosol number concentration (/m3)
!     real,intent(in) :: sigman(maxd_asize,maxd_atype) ! geometric standard deviation of aerosol size distribution
!     real,intent(in) :: hygro(maxd_asize,maxd_atype)  ! bulk hygroscopicity of aerosol mode
!     real,intent(in) :: volc(maxd_asize,maxd_atype)   ! total aerosol volume  concentration (m3/m3)
!     real,intent(in) :: dlo_sect( maxd_asize, maxd_atype ), &  ! minimum size of section (cm)
!                        dhi_sect( maxd_asize, maxd_atype )     ! maximum size of section (cm)
!
!  output
!     real,intent(inout) :: fn(maxd_asize,maxd_atype)    ! number fraction of aerosols activated
!     real,intent(inout) :: fs(maxd_asize,maxd_atype)    ! surface fraction of aerosols activated
!     real,intent(inout) :: fm(maxd_asize,maxd_atype)    ! mass fraction of aerosols activated
!     real,intent(inout) :: fluxn(maxd_asize,maxd_atype) ! flux of activated aerosol number fraction into cloud (m/s)
!     real,intent(inout) :: fluxs(maxd_asize,maxd_atype) ! flux of activated aerosol surface fraction (m/s)
!     real,intent(inout) :: fluxm(maxd_asize,maxd_atype) ! flux of activated aerosol mass fraction into cloud (m/s)
!     real,intent(inout) :: flux_fullact                 ! flux when activation fraction = 100% (m/s)

      qndrop_act = 0.0
      do itype = 1, ntype_aer
      do isize = 1, nsize_aer(itype)
         qndrop_act = qndrop_act + numbravg(isize,itype)*fn(isize,itype)
         tmpa = max( numbravg(isize,itype), max(volumavg(isize,itype),1.0)*1.0e-30 )
         tmpa = (6.0*volumavg(isize,itype)/(3.1415926536*tmpa))**0.33333333
         if (idiagee > 0) write(98,'(a,2i3,1p,9e10.2)') 'bin, numbr, volum, hygro, sg, dlo, dav, dhi, fn, fm', itype, isize, &
            numbravg(isize,itype), volumavg(isize,itype), hygroavg(isize,itype), &
            sigmag_aer(isize,itype), 0.01*dlo_sect(isize,itype), tmpa, 0.01*dhi_sect(isize,itype), &
            fn(isize,itype), fm(isize,itype)
      end do ! isize
      end do ! itype
      qndrop_act = qndrop_act/rho_act
      if (idiagee > 0) write(98,'(a,21x,i6,1p,2e10.2)') 'msectional, w_act, qndrop', msectional, w_act, qndrop_act

      return
      end subroutine activate_cldbase_kfcup


!------------------------------------------------------------------------

      subroutine adjust_mfentdet_kfcup( idiagee, grid_id, ktau, & 2
         ii, jj, kts, kte, kcutop, ishall, &
         umfout, uerout, udrout, dmfout, derout, ddrout )

      integer, intent(in) :: &
         idiagee, grid_id, ktau, &
         ii, jj, kts, kte, kcutop, ishall

      real, dimension( kts:kte ), intent(inout) :: &
         umfout, uerout, udrout, dmfout, derout, ddrout

      integer :: k
      real, parameter :: rtol = 1.0e-6
      real :: tmpa, tmpb, tmpc, tmpf, tmpg, tmph, tmpold


! check that delta(dmfout) = derout - ddrout
!    if not, then adjust either derout or ddrout
! the diagnostic output shows these adjustments to be very small,
!    so this may be unnecessary
check_dmf: &
      if (ishall == 0) then

      dmfout(kcutop:kte) = 0.0
      if (kcutop < kte) then
        derout(kcutop+1:kte) = 0.0
        ddrout(kcutop+1:kte) = 0.0
      end if
      tmpg = 0.0

      do k = kts, kcutop
         tmpa = dmfout(k)
         if (k > kts) then
            tmpa = dmfout(k) - dmfout(k-1)
         else
            tmpa = dmfout(k)
         end if
         tmpb = derout(k) - ddrout(k)
         tmpc = tmpa - tmpb
         if (tmpc > 0.0) then
            if (derout(k) < ddrout(k)*0.05) then
               ! der << ddr, so decrease ddr first, then increase der if needed
               tmpold = ddrout(k)
               ddrout(k) = max( 0.0, ddrout(k) - tmpc )
               tmpg = tmpg + abs(ddrout(k)-tmpold)
               tmpb = derout(k) - ddrout(k)
               tmpc = tmpa - tmpb
               derout(k) = derout(k) + tmpc
               tmpg = tmpg + abs(tmpc)
            else
               ! just increase der
               derout(k) = derout(k) + tmpc
               tmpg = tmpg + abs(tmpc)
            end if
         else
            if (ddrout(k) <= derout(k)*0.05) then
               ! ddr << der, so decrease der first, then increase ddr if needed
               tmpold = derout(k)
               derout(k) = max( 0.0, derout(k) + tmpc )
               tmpg = tmpg + abs(derout(k)-tmpold)
               tmpb = derout(k) - ddrout(k)
               tmpc = tmpa - tmpb
               ddrout(k) = ddrout(k) - tmpc
               tmpg = tmpg + abs(tmpc)
            else
               ! just increase ddr
               ddrout(k) = ddrout(k) - tmpc
               tmpg = tmpg + abs(tmpc)
            end if
         end if
      end do

      if ( idiagee > 0 ) then 
         tmpf = sum(derout(kts:kcutop)) + sum(ddrout(kts:kcutop))
         tmph = tmpg/max(tmpg,tmpf,1.0e-20)
         if (abs(tmph) > rtol) &
            write(*,'(a,i9,2i5,1p,4e10.2)') 'kfcupmfadjup', ktau, ii, jj, &
            minval(dmfout(kts:kcutop)), tmpf, tmpg, tmph
      end if

      end if check_dmf

! check that delta(umfout) = uerout - udrout
!    if not, then adjust either uerout or udrout
! the diagnostic output shows these adjustments to mostly be very small,
!    but there is an occasional problem at klcl, 
! this suggests a problem in the code that calculates umf and uer,
!    but i have not been able to locate it, so this bandaid is needed
check_umf: &
      if ((ishall == 0) .or. (ishall == 1)) then

      umfout(kcutop:kte) = 0.0
      if (kcutop < kte) then
        uerout(kcutop+1:kte) = 0.0
        udrout(kcutop+1:kte) = 0.0
      end if
      tmpg = 0.0

      do k = kts, kcutop
         if (k > kts) then
            tmpa = umfout(k) - umfout(k-1)
         else
            tmpa = umfout(k)
         end if
         tmpb = uerout(k) - udrout(k)
         tmpc = tmpa - tmpb
         if (tmpc > 0.0) then
            if (uerout(k) < udrout(k)*0.05) then
               ! uer << udr, so decrease udr first, then increase uer if needed
               tmpold = udrout(k)
               udrout(k) = max( 0.0, udrout(k) - tmpc )
               tmpg = tmpg + abs(udrout(k)-tmpold)
               tmpb = uerout(k) - udrout(k)
               tmpc = tmpa - tmpb
               uerout(k) = uerout(k) + tmpc
               tmpg = tmpg + abs(tmpc)
            else
               ! just increase uer
               uerout(k) = uerout(k) + tmpc
               tmpg = tmpg + abs(tmpc)
            end if
         else
            if (udrout(k) <= uerout(k)*0.05) then
               ! udr << uer, so decrease uer first, then increase udr if needed
               tmpold = uerout(k)
               uerout(k) = max( 0.0, uerout(k) + tmpc )
               tmpg = tmpg + abs(uerout(k)-tmpold)
               tmpb = uerout(k) - udrout(k)
               tmpc = tmpa - tmpb
               udrout(k) = udrout(k) - tmpc
               tmpg = tmpg + abs(tmpc)
            else
               ! just increase udr
               udrout(k) = udrout(k) - tmpc
               tmpg = tmpg + abs(tmpc)
            end if
         end if
      end do

      if ( idiagee > 0 ) then
         tmpf = sum(uerout(kts:kcutop)) + sum(udrout(kts:kcutop))
         tmph = tmpg/max(tmpg,tmpf,1.0e-20)
         if (abs(tmph) > rtol) &
            write(*,'(a,i9,2i5,1p,4e10.2)') 'kfcupmfadjup', ktau, ii, jj, &
            maxval(umfout(kts:kcutop)), tmpf, tmpg, tmph
      end if

      end if check_umf


      return
      end subroutine adjust_mfentdet_kfcup


! rce 11-may-2012 mods start -------------------------------------------

      subroutine cu_kfcup_diagee01( & 1
         ims, ime, jms, jme, kms, kme, kts, kte, &
         i, j, &
         idiagee, idiagff, ishall, ktau, &
         kcubotmin, kcubotmax, kcutopmin, kcutopmax, &
         activefrac, cldfra_cup1d, &
         cubot, cutop, cumshallfreq1d, &
         ddr_deep, der_deep, dmf_deep, dt, dz1d, &
         fcvt_qc_to_pr_deep, fcvt_qc_to_qi_deep, fcvt_qi_to_pr_deep, &
         fcvt_qc_to_pr_shall, fcvt_qc_to_qi_shall, fcvt_qi_to_pr_shall, &
         nca_deep, nca_shall, p1d, pblh, &
         qc_ic_deep, qc_ic_shall, qi_ic_deep, qi_ic_shall, qndrop_ic_cup, rho1d, &
         tactive, taucloud, tstar, &
         udr_deep, udr_shall, uer_deep, uer_shall, umf_deep, umf_shall, &
         updfra_deep, updfra_shall, updfra_cup, &
         wact_cup, wcloudbase, wcb_v2, wcb_v2_shall, &
         wulcl_cup, wstar, z1d, z_at_w1d )

! arguments
      integer, intent(in) :: &
         ims, ime, jms, jme, kms, kme, kts, kte, &
         i, j, &
         idiagee, idiagff, ishall, ktau, &
         kcubotmin, kcubotmax, kcutopmin, kcutopmax

      real, intent(in) :: &
         dt, &
         nca_deep, &
         nca_shall, &
         updfra_deep, &
         updfra_shall, &
         wcb_v2, &
         wcb_v2_shall, &
         wstar

      real, dimension( kts:kte ), intent(in) :: &
         cumshallfreq1d, &
         cldfra_cup1d, &
         ddr_deep, &
         der_deep, &
         dmf_deep, &
         dz1d, &
         fcvt_qc_to_pr_deep, &
         fcvt_qc_to_pr_shall, &
         fcvt_qc_to_qi_deep, &
         fcvt_qc_to_qi_shall, &
         fcvt_qi_to_pr_deep, &
         fcvt_qi_to_pr_shall, &
         p1d, &
         qc_ic_deep, &
         qc_ic_shall, &
         qi_ic_deep, &
         qi_ic_shall, &
         rho1d, &
         udr_deep, &
         udr_shall, &
         uer_deep, &
         uer_shall, &
         umf_deep, &
         umf_shall, &
         z1d, & 
         z_at_w1d 

      real, dimension( ims:ime, jms:jme ), intent(in) :: &
         activefrac, &
         cubot, &
         cutop, &
         pblh, &
         tactive, &
         taucloud, &
         tstar, &
         wact_cup, &
         wcloudbase, &
         wulcl_cup

      real, dimension( ims:ime, kms:kme, jms:jme ), intent(in) :: &
         qndrop_ic_cup, &
         updfra_cup


! local variables
      integer :: &
         k, kcubot, kcutop

      real :: tmpa, tmpb, tmpc, tmpd, tmpe, tmpf, tmpg, tmph, tmpi, tmpj
      real :: tmpr, tmps, tmpx, tmpy, tmpz
      real :: tmpcf
      real :: tmp_nca, tmp_updfra
      real :: tmpveca(1:999)
      real :: updfra

      if (idiagee > 0) then

      tmpveca = 0.0

      kcubot = nint(cubot(i,j))
      kcutop = nint(cutop(i,j))
      k = (kcubot+kcutop)/2
      updfra = 0.0 ; if (ishall == 0) updfra = updfra_deep ; if (ishall == 1) updfra = updfra_shall
!!!      write(*,'(a,1p,5e11.3,3x,3e11.3)') 'activefrac, cldfra(b/m/t), updfra', &
!!!         activefrac(i,j), &
!!!         cldfra_cup1d(kcubot), cldfra_cup1d(k), cldfra_cup1d(kcutop), updfra
!!!      write(*,'(a,1p,4e11.3,3x,3e11.3)') 'wcb, wcb_v2, wulcl, wact         ', &
!!!         wcloudbase(i,j), wcb_v2_shall, wulcl_cup(i,j), wact_cup(i,j)
!!!      write(*,'(a,1p,5e11.3,3x,3e11.3)') 'qndrop(b/m/t/t-b)                ', &
!!!         qndrop_ic_cup(kcubot), qndrop_ic_cup(k), qndrop_ic_cup(kcutop), &
!!!         qndrop_ic_cup(kcutop)-qndrop_ic_cup(kcubot) 
!!!      write(*,'(a,4i5,f9.5,10(2x,5i5))') 'updfraprofile*1e4', &
!!!         ktau, ishall, kcubot, kcutop, updfra, &
!!!         ( nint(updfra_cup(i,k,j)*1.0e4), k=kts,min(kte-1,kcutop+3) )

      if ((ishall==1 .or. ishall==0) .and. idiagee>0) then
         if (ishall == 1) then
            tmp_updfra = updfra_shall
            tmp_nca    = nca_shall
         else
            tmp_updfra = updfra_deep
            tmp_nca    = nca_deep
         end if

         tmpa = 0.0 ; tmpb = 0.0 ; tmpc = 0.0 ; tmpd = 0.0 ; tmpe = 0.0 ; tmpf = 0.0
         do k=kts,kte
            if (ishall == 1) then
               tmpa = tmpa + max( 0.0, uer_shall(k) )
               tmpx = cumshallfreq1d(k)
            else
               tmpa = tmpa + max( 0.0, uer_deep(k) )
               tmpx = 1.0
            end if
            tmpcf = cldfra_cup1d(k)*tmpx
            tmpc = tmpc + max( 0.0, tmpcf             ) * dz1d(k)*rho1d(k)
!           tmpd = tmpd + max( 0.0, cldfra_cup(i,k,j) ) * dz1d(k)*rho1d(k)
            tmpd = tmpd + max( 0.0, cldfra_cup1d(k)   ) * dz1d(k)*rho1d(k)

            tmpe = tmpe + max( 0.0, tmp_updfra*tmpx ) * dz1d(k)*rho1d(k)
            if (kcubot <= k .and. k <= kcutop) &
            tmpf = tmpf + max( 0.0, tmp_updfra                   ) * dz1d(k)*rho1d(k)
         end do
         tmpa = tmpa*tmp_nca
         tmpb = cldfra_cup1d(kcubot)*wcb_v2*rho1d(kcubot)*tmp_nca
!        tmpg = 0.0
!        if (tmpd > 1.0e-10) tmpg = tmpa/tmpd

!        if (idiagee>0) write(*,'(a,1p,6e11.3,0p,f11.3,i8)') 'entrain mass, cloud-vol mass b-e ', &
!           tmpa, tmpf, tmpd, tmpe, tmpb, tmpc, tmpg, ktau
         if (idiagee>0) write(*,'(a,1p,2e11.3,0p,2f9.3,2(3x,1p,2e11.3,0p,f9.3),i8,2(2x,3i3))') 'cloudmassaa ', &
            tmpa, tmpb, &
            tmpa/max(tmpc,1.0e-10), tmpb/max(tmpc,1.0e-10), &
            tmpc, tmpd, max(tmpc,1.0e-10)/max(tmpd,1.0e-10), &
            tmpe, tmpf, max(tmpe,1.0e-10)/max(tmpf,1.0e-10), &
            ktau, kcubot, kcubotmin, kcubotmax, kcutop, kcutopmin, kcutopmax

         tmpi = 0.0 ; tmpj = 0.0
         do k = kcubot, kcutop
            if (ishall == 1) then
                tmpi = tmpi + cldfra_cup1d(k)*dz1d(k)*rho1d(k)*qc_ic_shall(k)
            else
                tmpi = tmpi + cldfra_cup1d(k)*dz1d(k)*rho1d(k)*qc_ic_deep(k)
            end if
            tmpj = tmpj + cldfra_cup1d(k)*dz1d(k)*rho1d(k)
         end do

         tmpveca(1) = tmpa/max(tmpd,1.0e-10)
         tmpveca(2) = tmpb/max(tmpd,1.0e-10)
         tmpveca(3) = cldfra_cup1d(kcubot)
         tmpveca(4) = sum( dz1d(kcubot:kcutop) )
         tmpveca(5) = wcb_v2

         tmpa = tmpa/tmp_nca                               ! total inflow
         tmpg = tmpd * (tmp_updfra/cldfra_cup1d(kcubot))   ! updraft mass
         tmpveca(101) = cldfra_cup1d(kcubot)
         tmpveca(102) = tmp_updfra
         tmpveca(103) = sum( dz1d(kcubot:kcutop) )
         tmpveca(104) = wcb_v2                           ! w at cloud base
         tmpveca(105) = tmpd                                 ! cloud mass
         tmpveca(106) = tmpa                                 ! total inflow
         if (ishall == 1) then
            tmpveca(107) = umf_shall(max(1,kcubot-1))        ! cloud base inflow
         else
            tmpveca(107) = umf_deep(max(1,kcubot-1))         ! cloud base inflow
         end if
         tmpveca(108) = tmpg/tmpa                            ! time to "fill" updraft
         tmpveca(109) = tmpd/tmpa                            ! time to "fill" cloud
         tmpveca(110) = tactive(i,j)                         ! active cloud time-scale
         tmpveca(111) = taucloud(i,j)                        ! cloud dissipation time-scale
         tmpveca(112) = tstar(i,j)                           ! boundary layer time-scale
         tmpveca(113) = wstar                                ! boundary layer convective velocity scale
         tmpveca(114) = pblh(i,j)                            ! pbl height (m)
         tmpveca(115) = z_at_w1d(kcubot  ) - z_at_w1d(kts)   ! bottom of cloudbase layer (m agl)
         tmpveca(116) = z_at_w1d(kcutop+1) - z_at_w1d(kts)   ! top    of cloudtop  layer (m agl)
         tmpveca(117) = (tmpi/max(tmpj,1.0e-30))*1.0e3       ! convert kg/kg to g/kg

         tmpveca(106:107) = tmpveca(106:107)*60.0            ! convert kg/m2/s to kg/m2/min
         tmpveca(108:112) = tmpveca(108:112)/60.0            ! convert s to min
      end if ! ((ishall==1 .or. ishall==0) .and. idiagee>0) then

      if (idiagee>0 .and. ishall==1) then
         write(*,'(a)') 'k, p, z, dz, umf, del(umf), uer-udr, uer, -udr, qc, qi, f_qc2qi, f_qc2pr, f_qi2pr'
         do k = min( kcutop+2, kte-1 ), kts, -1
            if (k .eq. kts) then
               tmpa = umf_shall(k)
            else
               tmpa = umf_shall(k) - umf_shall(k-1)
            end if
            tmpb = uer_shall(k) - udr_shall(k)
            write(*,'(i2,1p,3e11.3,3x,5e11.3,3x,5e11.3)') &
               k, p1d(k), z1d(k), dz1d(k), umf_shall(k), tmpa, tmpb, uer_shall(k), -udr_shall(k), &
               qc_ic_shall(k), qi_ic_shall(k), fcvt_qc_to_qi_shall(k), fcvt_qc_to_pr_shall(k), fcvt_qi_to_pr_shall(k)
         end do
      end if ! (idiagee>0 .and. ishall==1) then

      if (idiagee>0 .and. ishall==0) then
         write(*,'(a)') 'k, p, z, dz, umf, del(umf), uer-udr, uer, -udr, qc, qi, f_qc2qi, f_qc2pr, f_qi2pr'
         do k = min( kcutop+2, kte-1 ), kts, -1
            if (k .eq. kts) then
               tmpa = umf_deep(k)
            else
               tmpa = umf_deep(k) - umf_deep(k-1)
            end if
            tmpb = uer_deep(k) - udr_deep(k)
            write(*,'(i2,1p,3e11.3,3x,5e11.3,3x,5e11.3)') &
               k, p1d(k), z1d(k), dz1d(k), umf_deep(k), tmpa, tmpb, uer_deep(k), -udr_deep(k), &
               qc_ic_deep(k), qi_ic_deep(k), fcvt_qc_to_qi_deep(k), fcvt_qc_to_pr_deep(k), fcvt_qi_to_pr_deep(k)
         end do
         write(*,'(a)') 'k, p, z, dz, dmf, del(dmf), der-ddr, der, -ddr, qc'
         do k = min( kcutop+2, kte-1 ), kts, -1
            if (k .eq. kts) then
               tmpa = dmf_deep(k)
            else
               tmpa = dmf_deep(k) - dmf_deep(k-1)
            end if
            tmpb = der_deep(k) - ddr_deep(k)
            write(*,'(i2,1p,3e11.3,3x,5e11.3,3x,5e11.3)') &
               k, p1d(k), z1d(k), dz1d(k), dmf_deep(k), tmpa, tmpb, der_deep(k), -ddr_deep(k), qc_ic_deep(k)
         end do
      end if ! (idiagee>0 .and. ishall==0) then

      write(*,'(i6,1p,6e11.3,a)') &
         ktau, (ktau*dt/3600.0), tmpveca(1:5), &
         '  cloudmassbb ktau, t(h), ratio1, ratio2, cldfra, cldhgt, wcb'

      write(*,'(i6,i2, f7.2, 2x,2f8.5,f8.2,2f7.3, 2x,f9.4,2f9.5, 2x,5f8.2, 3f9.1,f9.5, 3a)') &
         ktau, ishall, (ktau*dt/3600.0), tmpveca(101:104), tmpveca(113), &
         min(9999.99,tmpveca(105)), min(99.99,tmpveca(106:107)), &
         min(9999.99,tmpveca(108:112)), min(99999.9,tmpveca(114:116)), min(99.9999,tmpveca(117)), &
         '  cloudmasscc ktau,ish,t(h),  cldfra,updfra,cldhgt,wcb,wstar', &
         ',  cldmass,uertot,uerbase,  tauinupd,tauincld,tactive,taucloud,tstar', &
         ',  pblh,zbot,ztop, qc_ic_av'

      end if ! (idiagee > 0) then

      return
      end subroutine cu_kfcup_diagee01
! rce 11-may-2012 mods end ---------------------------------------------


END MODULE module_cu_kfcup