#include "rundeck_opts.h"


      MODULE CLOUDS 12,12
!@sum  CLOUDS column physics of moist conv. and large-scale condensation
!@auth M.S.Yao/A. Del Genio (modifications by Gavin Schmidt)
!@cont MSTCNV,LSCOND
      USE CONSTANT, only : rgas,grav,lhe,lhs,lhm,sha,bysha,pi,by6
     *     ,by3,tf,bytf,rvap,bygrav,deltx,bymrat,teeny,gamd,rhow,twopi
      USE MODEL_COM, only : im,lm,dtsrc,itime,coupled_chem
      USE QUSDEF, only : nmom,xymoms,zmoms,zdir
#ifdef TRACERS_ON
      USE TRACER_COM, only: ntm,trname
#ifdef TRACERS_WATER
     &     ,nGAS, nPART, nWATER, tr_wd_TYPE, tr_RKD, tr_DHD,
     *     tr_evap_fact
#else
#if (defined TRACERS_DUST) || (defined TRACERS_MINERALS) ||\
    (defined TRACERS_QUARZHEM)
     &     ,Ntm_dust
#endif
#endif
#endif
CCC   USE RANDOM
      IMPLICIT NONE
      SAVE
C**** parameters and constants
      REAL*8, PARAMETER :: TI=233.16d0   !@param TI pure ice limit
      REAL*8, PARAMETER :: CLDMIN=.25d0 !@param CLDMIN min MC/LSC region
!@param WMU critical cloud water content for rapid conversion (g m**-3)
      REAL*8, PARAMETER :: WMU=.25
      REAL*8, PARAMETER :: WMUL=.5       !@param WMUL WMU over land
      REAL*8, PARAMETER :: WMUI=.1d0     !@param WMUI WMU for ice clouds
      REAL*8, PARAMETER :: BRCLD=.2d0    !@param BRCLD for cal. BYBR
      REAL*8, PARAMETER :: SLHE=LHE*BYSHA
      REAL*8, PARAMETER :: SLHS=LHS*BYSHA
!@param CCMUL multiplier for convective cloud cover
!@param CCMUL1 multiplier for deep anvil cloud cover
!@param CCMUL2 multiplier for shallow anvil cloud cover
!@param COETAU multiplier for convective cloud optical thickness
      REAL*8, PARAMETER :: CCMUL=1.,CCMUL1=5.,CCMUL2=3.,COETAU=.08d0

      REAL*8 :: BYBR,BYDTsrc,XMASS,PLAND
      REAL*8 :: RTEMP,CMX,RCLDX,CONTCE1,CONTCE2
!@var BYBR factor for converting cloud particle radius to effect. radius
!@var XMASS dummy variable
!@var PLAND land fraction

C**** Set-able variables
!@dbparam LMCM max level for originating MC plumes
      INTEGER :: LMCM = -1 ! defaults to LS1-1 if not set in rundeck
!@dbparam ISC integer to turn on computation of stratocumulus clouds
      INTEGER :: ISC = 0  ! set ISC=1 to compute stratocumulus clouds
!@dbparam U00wtrX multiplies U00ice for critical humidity for water clds
      REAL*8 :: U00wtrX = 1.0d0     ! default
!@dbparam U00ice critical humidity for ice cloud condensation
      REAL*8 :: U00ice = .7d0       ! default
!@dbparam funio_denominator funio denominator
      REAL*8 :: funio_denominator=15.d0  ! default
!@dbparam autoconv_multiplier autoconversion rate multiplier
      REAL*8 :: autoconv_multiplier=1.d0 ! default
!@dbparam radius_multiplier cloud particle radius multiplier
      REAL*8 :: radius_multiplier=1.d0   ! default
!@dbparam entrainment_cont1 constant for entrainment rate, plume 1
      REAL*8 :: entrainment_cont1=.3d0   ! default
!@dbparam entrainment_cont2 constant for entrainment rate, plume 2
      REAL*8 :: entrainment_cont2=.6d0   ! default
!@dbparam HRMAX maximum distance an air parcel rises from surface
      REAL*8 :: HRMAX = 1000.d0     ! default (m)
!@dbparam RWCldOX multiplies part.size of water clouds over ocean
      REAL*8 :: RWCldOX=1.d0
!@dbparam RICldX multiplies part.size of ice clouds at 1000mb
!@+       RICldX changes linearly to 1 as p->0mb
      REAL*8 :: RICldX=1.d0 , xRICld
!@dbparam do_blU00 =1 if boundary layer U00 is treated differently
      INTEGER :: do_blU00=0     ! default is to disable this

#ifdef TRACERS_ON
!@var ntx,NTIX: Number and Indices of active tracers used in convection
      integer, dimension(ntm) :: ntix
      integer ntx
#endif
C**** ISCCP diag related variables
      INTEGER,PARAMETER :: ncol =20    !@var ncol number of subcolumns
!@var tautab look-up table to convert count value to optical thickness
!@var invtau look-up table to convert optical thickness to count value
      real*8 :: tautab(0:255)
      integer :: invtau(-20:45000)

C**** input variables
      LOGICAL DEBUG
!@var RA ratio of primary grid box to secondary gridbox
      REAL*8, DIMENSION(IM) :: RA
!@var UM,VM,UM1,VM1,U_0,V_0 velocity related variables(UM,VM)=(U,V)*AIRM
      REAL*8, DIMENSION(IM,LM) :: UM,VM,UM1,VM1
      REAL*8, DIMENSION(IM,LM) :: U_0,V_0

!@var Miscellaneous vertical arrays set in driver
!@var PLE pressure at layer edge
!@var LHP array of precip phase ! may differ from LHX
      REAL*8, DIMENSION(LM+1) :: PLE,LHP
      REAL*8, DIMENSION(LM) :: PL,PLK,AIRM,BYAM,ETAL,TL,QL,TH,RH,WMX
     *     ,VSUBL,MCFLX,DGDSM,DPHASE,DTOTW,DQCOND,DGDQM,AQ,DPDT,RH1
     *     ,FSSL,FSUB,FCONV,FMCL,VLAT,DDMFLX,WTURB,TVL,W2L,GZL
     *     ,SAVWL,SAVWL1,SAVE1L,SAVE2L,DPHASHLW,DPHADEEP,DGSHLW,DGDEEP
     *     ,QDNL,TDNL
!@var PL layer pressure (mb)
!@var PLK PL**KAPA
!@var AIRM the layer's pressure depth (mb)
!@var BYAM 1./AIRM
!@var ETAL fractional entrainment rate
!@var TL, QL temperature, specific humidity of the layer
!@var TH potential temperature (K)
!@var RH relative humidity
!@var RH1 relative humidity to compare with the threshold humidity
!@var WMX cloud water mixing ratio (kg/kg)
!@var VSUBL downward vertical velocity due to cumulus subsidence (cm/s)
!@var MCFLX, DGDSM, DPHASE, DQCOND, DGDQM dummy variables
!@var DDMFLX accumulated downdraft mass flux (mb)
!@var AQ time change rate of specific humidity (s**-1)
!@var DPDT time change rate of pressure (mb/s)
!@var FSSL grid fraction for large-scale clouds
!@var FCONV convective fraction
!@var FSUB subsiding fraction
!@var FMCL grid fraction for moist convection
!@var VLAT dummy variable
      REAL*8, DIMENSION(LM+1) :: PRECNVL
!@var WTURB turbulent vertical velocity (m)
!@var PRECNVL convective precip entering the layer top
C**** new arrays must be set to model arrays in driver (before MSTCNV)
      REAL*8, DIMENSION(LM) :: SDL,WML
!@var SDL vertical velocity in sigma coordinate
!@var WML cloud water mixing ratio (kg/kg)
C**** new arrays must be set to model arrays in driver (after MSTCNV)
      REAL*8, DIMENSION(LM) :: TAUMCL,SVLATL,CLDMCL,SVLHXL,SVWMXL
!@var TAUMCL convective cloud optical thickness
!@var SVLATL saved LHX for convective cloud
!@var CLDMCL convective cloud cover
!@var SVLHXL saved LHX for large-scale cloud
!@var SVWMXL saved detrained convective cloud water
      REAL*8, DIMENSION(LM) :: CSIZEL
!@var CSIZEL cloud particle radius (micron)
#ifdef CLD_AER_CDNC
      REAL*8, DIMENSION(LM) :: ACDNWM,ACDNIM
!@var ACDNWM,ACDNIM -CDNC - warm and cold moist cnv clouds (cm^-3)
      REAL*8, DIMENSION(LM) :: ACDNWS,ACDNIS
!@var ACDNWS,ACDNIS -CDNC - warm and cold large scale clouds (cm^-3)
      REAL*8, DIMENSION(LM) :: AREWS,AREIS,AREWM,AREIM  ! for diag
!@var AREWS and AREWM are moist cnv, and large scale Reff arrays (um)
      REAL*8, DIMENSION(LM) :: ALWWS,ALWIS,ALWWM,ALWIM  ! for diag
!@var ALWWM and ALWIM  etc are liquid water contents
!@var CTTEM,CD3DL,CL3DL,CI3DL,SMLWP are cld temp, cld thickness,cld water,LWP
      REAL*8, DIMENSION(LM) ::CTEML,CD3DL,CL3DL,CI3DL,CDN3DL,CRE3DL
      REAL*8 SMLWP
!@var SME is the TKE in 1 D from e(l) = egcm(l,i,j)  (m^2/s^2)
      REAL*8, DIMENSION(LM)::SME
      INTEGER NLSW,NLSI,NMCW,NMCI
#endif
C**** new arrays must be set to model arrays in driver (before LSCOND)
      REAL*8, DIMENSION(LM) :: TTOLDL,CLDSAVL,CLDSV1
!@var TTOLDL previous potential temperature
!@var CLDSAVL saved large-scale cloud cover
#ifdef CLD_AER_CDNC
      REAL*8, DIMENSION(LM)::OLDCDO,OLDCDL,SMFPML
!@var OLDCDO and OLDCDL are saved CDNC for land and ocean
!@var SMFPML saved CTEI for CDNC modulation
#endif
C**** new arrays must be set to model arrays in driver (after LSCOND)
      REAL*8, DIMENSION(LM) :: SSHR,DCTEI,TAUSSL,CLDSSL
!@var SSHR,DCTEI height diagnostics of dry and latent heating by MC
!@var TAUSSL large-scale cloud optical thickness
!@var CLDSSL large-scale cloud cover

!@var SM,QM Vertical profiles of T/Q
      REAL*8, DIMENSION(LM) :: SM,QM   ! ,DDR,SMDNL,QMDNL
      REAL*8, DIMENSION(NMOM,LM) :: SMOM,QMOM,SMOMMC,QMOMMC,
     *  SMOMLS,QMOMLS    ! ,SMOMDNL,QMOMDNL
C     REAL*8, DIMENSION(IM,LM) :: UMDNL,VMDNL

#ifdef TRACERS_ON
!@var TM Vertical profiles of tracers
      REAL*8, DIMENSION(LM,NTM) :: TM
      REAL*8, DIMENSION(nmom,lm,ntm) :: TMOM
!@var TRDNL tracer concentration in lowest downdraft (kg/kg)
      REAL*8, DIMENSION(NTM,LM) :: TRDNL
      COMMON/CLD_TRCCOM/TM,TMOM,TRDNL
!$OMP  THREADPRIVATE (/CLD_TRCCOM/)
#ifdef TRACERS_WATER
!@var TRWML Vertical profile of liquid water tracers (kg)
!@var TRSVWML New liquid water tracers from m.c. (kg)
      REAL*8, DIMENSION(NTM,LM) :: TRWML, TRSVWML
!@var TRPRSS super-saturated tracer precip (kg)
!@var TRPRMC moist convective tracer precip (kg)
      REAL*8, DIMENSION(NTM)    :: TRPRSS,TRPRMC
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
c for diagnostics
      REAL*8, DIMENSION(NTM,LM) :: DT_SULF_MC,DT_SULF_SS
#endif
#ifdef TRDIAG_WETDEPO
!@dbparam diag_wetdep switches on/off special diags for wet deposition
      INTEGER :: diag_wetdep=0 ! =off (default) (on: 1)
!@var trcond_mc saves tracer condensation in MC clouds [kg]
!@var trdvap_mc saves tracers evaporated in downdraft of MC clouds [kg]
!@var trflcw_mc saves tracers condensed in cloud water of MC clouds [kg]
!@var trprcp_mc saves tracer precipitated from MC clouds [kg]
!@var trnvap_mc saves reevaporated tracer of MC clouds precip [kg]
!@var trwash_mc saves tracers washed out by collision for MC clouds [kg]
      REAL*8,DIMENSION(Lm,Ntm) :: trcond_mc,trdvap_mc,trflcw_mc,
     &     trprcp_mc,trnvap_mc,trwash_mc
!@var trwash_ls saves tracers washed out by collision for LS clouds [kg]
!@var trprcp_ls saves tracer precipitation from LS clouds [kg]
!@var trclwc_ls saves tracers condensed in cloud water of LS clouds [kg]
!@var trevap_ls saves reevaporated tracers of LS cloud precip [kg]
!@var trclwe_ls saves tracers evaporated from cloud water of LS clouds [kg]
!@var trcond_ls saves tracer condensation in LS clouds [kg]
      REAL*8,DIMENSION(Lm,Ntm) :: trwash_ls,trevap_ls,trclwc_ls,
     &     trprcp_ls,trclwe_ls,trcond_ls
#endif
#else
#if (defined TRACERS_DUST) || (defined TRACERS_MINERALS) ||\
    (defined TRACERS_QUARZHEM)
!@var tm_dust vertical profile of dust/mineral tracers [kg]
      REAL*8,DIMENSION(Lm,Ntm_dust) :: tm_dust
!@var tmom_dust vertical profiles of dust/mineral tracer moments [kg]
      REAL*8,DIMENSION(nmom,Lm,Ntm_dust) :: tmom_dust
!@var trprc_dust dust/mineral tracer precip [kg]
      REAL*8,DIMENSION(Lm,Ntm_dust) :: trprc_dust
#endif
#endif
#ifdef TRACERS_WATER
      COMMON/CLD_WTRTRCCOM/TRWML, TRSVWML,TRPRSS,TRPRMC
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
     *     ,DT_SULF_MC,DT_SULF_SS
#endif
#ifdef TRDIAG_WETDEPO
     &     ,trcond_mc,trdvap_mc,trflcw_mc,trprcp_mc,trnvap_mc,trwash_mc
     &     ,trwash_ls,trevap_ls,trclwc_ls,trprcp_ls,trclwe_ls,trcond_ls
#endif
#else
#if (defined TRACERS_DUST) || (defined TRACERS_MINERALS) ||\
    (defined TRACERS_QUARZHEM)
      COMMON/CLD_PRECDUST/ tm_dust,tmom_dust,trprc_dust
#endif
#endif
#ifdef TRACERS_WATER
!$OMP  THREADPRIVATE (/CLD_WTRTRCCOM/)
#else
#if (defined TRACERS_DUST) || (defined TRACERS_MINERALS) ||\
    (defined TRACERS_QUARZHEM)
!$OMP  THREADPRIVATE (/CLD_PRECDUST/)
#endif
#endif
#endif

!@var KMAX index for surrounding velocity
!@var LP50 50mb level
      INTEGER ::  KMAX,LP50
!@var PEARTH fraction of land in grid box
!@var TS average surface temperture (C)
!@var RIS, RI1, RI2 Richardson numbers
      REAL*8 :: PEARTH,TS,QS,US,VS,RIS,RI1,RI2,DXYPJ
!@var DCL max level of planetary boundary layer
      INTEGER :: DCL

C**** output variables
      REAL*8 :: PRCPMC,PRCPSS,HCNDSS,WMSUM
!@var PRCPMC precip due to moist convection
!@var PRCPSS precip due to large-scale condensation
!@var HCNDSS heating due to large-scale condensation
!@var WMSUM cloud liquid water path
#ifdef CLD_AER_CDNC
      REAL*8 :: WMCLWP,WMCTWP
!@var WMCLWP , WMCTWP moist convective LWP and total water path
#endif
      REAL*8 :: CLDSLWIJ,CLDDEPIJ
!@var CLDSLWIJ shallow convective cloud cover
!@var CLDDEPIJ deep convective cloud cover
      INTEGER :: LMCMAX,LMCMIN
!@var LMCMAX upper-most convective layer
!@var LMCMIN lowerest convective layer
!@var AIRXL is convective mass flux (mb)
      REAL*8 AIRXL,PRHEAT
!@var RNDSSL stored random number sequences
      REAL*8  RNDSSL(3,LM)
!@var prebar1 copy of variable prebar
      REAL*8 prebar1(Lm+1)
CCOMP  does not work yet:
CCOMP  THREADPRIVATE (RA,UM,VM,U_0,V_0,PLE,PL,PLK,AIRM,BYAM,ETAL
CCOMP*  ,TL,QL,TH,RH,WMX,VSUBL,MCFLX,SSHR,DGDSM,DPHASE
CCOMP*  ,DTOTW,DQCOND,DCTEI,DGDQM,dxypj,DDMFLX
CCOMP*  ,AQ,DPDT,PRECNVL,SDL,WML,SVLATL,SVLHXL,SVWMXL,CSIZEL,RH1
CCOMP*  ,TTOLDL,CLDSAVL,TAUMCL,CLDMCL,TAUSSL,CLDSSL,RNDSSL
CCOMP*  ,SM,QM,SMOM,QMOM,PEARTH,TS,QS,US,VS,DCL,RIS,RI1,RI2, AIRXL
CCOMP*  ,PRCPMC,PRCPSS,HCNDSS,WMSUM,CLDSLWIJ,CLDDEPIJ,LMCMAX
CCOMP*  ,LMCMIN,KMAX,DEBUG)
      COMMON/CLDPRV/RA,UM,VM,UM1,VM1,U_0,V_0,PLE,PL,PLK,AIRM,BYAM,ETAL
     *  ,TL,QL,TH,RH,WMX,VSUBL,MCFLX,SSHR,DGDSM,DPHASE,LHP
     *  ,DPHASHLW,DPHADEEP,DGSHLW,DGDEEP
     *  ,DTOTW,DQCOND,DCTEI,DGDQM,DXYPJ,DDMFLX,PLAND
     *  ,AQ,DPDT,PRECNVL,SDL,WML,SVLATL,SVLHXL,SVWMXL,CSIZEL,RH1
     *  ,TTOLDL,CLDSAVL,TAUMCL,CLDMCL,TAUSSL,CLDSSL,RNDSSL
     *  ,SM,QM,SMOM,QMOM,PEARTH,TS,QS,US,VS,RIS,RI1,RI2, AIRXL
     *  ,SMOMMC,QMOMMC,SMOMLS,QMOMLS,CLDSV1,PRHEAT,TDNL,QDNL
     *  ,PRCPMC,PRCPSS,HCNDSS,WMSUM,CLDSLWIJ,CLDDEPIJ,VLAT
#ifdef CLD_AER_CDNC
     *  ,ACDNWM,ACDNIM,ACDNWS,ACDNIS
     *  ,AREWM,AREIM,AREWS,AREIS,ALWIM,ALWWM
     *  ,OLDCDL,OLDCDO,SMFPML
     *  ,SME
     *  ,CTEML,CD3DL,CL3DL,CI3DL,SMLWP,CDN3DL,CRE3DL
     *  ,WMCLWP,WMCTWP
#endif
     *  ,FSUB,FCONV,FSSL,FMCL,WTURB,TVL,W2L,GZL
C    *  ,DDR,SMDNL,QMDNL,SMOMDNL,QMOMDNL
     *  ,SAVWL,SAVWL1,SAVE1L,SAVE2L
#ifdef CLD_AER_CDNC
     *  ,NLSW,NLSI,NMCW,NMCI
#endif
     *  ,prebar1,LMCMAX,LMCMIN,KMAX,DCL,DEBUG  ! int/logic last (alignment)
!$OMP  THREADPRIVATE (/CLDPRV/)

      CONTAINS


      SUBROUTINE MSTCNV(IERR,LERR,i_debug,j_debug) 2,98
!@sum  MSTCNV moist convective processes (precip, convective clouds,...)
!@auth M.S.Yao/A. Del Genio (modularisation by Gavin Schmidt)
!@ver  1.0 (taken from CB265)
!@calls adv1d,QSAT,DQSATDT,THBAR
      IMPLICIT NONE
      REAL*8 LHX,MPLUME,MPLUM1,MCLOUD,MPMAX,SENV,QENV
!@var LHX latent heat of evaporation (J/Kg)
!@var MPLUME,MPLUM1 mass of convective plume (mb)
!@var MCLOUD air mass available for re-evaporation of precip
!@var MPMAX convective plume at the detrainment level
!@var SENV,QENV dummy variables
!@var FMC1 grid fraction for moist convection
      REAL*8 FMC1

C**** functions
      REAL*8 :: QSAT, DQSATDT
!@var QSAT saturation humidity
!@var DQSATDT dQSAT/dT

      REAL*8, DIMENSION(0:LM) :: CM     !@var CM air mass of subsidence
      REAL*8, DIMENSION(IM) :: UMP,VMP,UMDN,VMDN
!@var UMP, VMP momentum carried by convective plumes
!@var UMDN,VMDN dummy variables
!@var DQM,DSM,DQMR,DSMR Vertical profiles of T/Q and changes
      REAL*8, DIMENSION(LM) ::
     * SMOLD,QMOLD, DQM,DSM,DQMR,DSMR,WCU,ENT,DET,BUOY
!@var SMOLD,QMOLD profiles prior to any moist convection
      REAL*8, DIMENSION(LM) :: F,CMNEG
      REAL*8, DIMENSION(NMOM,LM) :: FMOM
      REAL*8, DIMENSION(NMOM,LM) :: SMOMOLD,QMOMOLD
      REAL*8, DIMENSION(NMOM,LM) :: DSMOM,DQMOM,DSMOMR,DQMOMR
     *     ,SMOMDNL,QMOMDNL
      REAL*8, DIMENSION(NMOM) ::
     &     SMOMP,QMOMP, SMOMPMAX,QMOMPMAX, SMOMDN,QMOMDN

#ifdef TRACERS_ON
!@var TMOLD: old TM (tracer mass)
!@var DTM,DTMR: Vertical profiles of Tracers mass and changes
      REAL*8, DIMENSION(LM,NTM)      :: TMOLD, DTM, DTMR, TM1, TMDNL
      REAL*8, DIMENSION(NMOM,LM,NTM) :: TMOMOLD,DTMOM,DTMOMR, TMOMDNL
      REAL*8, DIMENSION(NTM)      :: TMP, TMPMAX, TENV, TMDN
      REAL*8, DIMENSION(NMOM,NTM) :: TMOMP, TMOMPMAX, TMOMDN
!@var TPOLD saved plume temperature after condensation for tracers
!@+   (this is slightly different from TPSAV)
      REAL*8, DIMENSION(LM)       :: TPOLD
#ifdef TRACERS_WATER
!@var TRPCRP tracer mass in precip
!@var TRCOND tracer mass in condensate
!@var TRCONDV tracer mass in lofted condensate
      REAL*8, DIMENSION(NTM)      :: TRPRCP
      REAL*8, DIMENSION(NTM,LM)   :: TRCOND
      REAL*8, DIMENSION(NTM,LM)   :: TRCONDV
!@var FQCONDT fraction of tracer that condenses
!@var FQEVPT  fraction of tracer that evaporates (in downdrafts)
!@var FPRCPT fraction of tracer that evaporates (in net re-evaporation)
!@var FWASHT  fraction of tracer scavenged by below-cloud precipitation
      REAL*8 :: FQCONDT, FWASHT, FPRCPT, FQEVPT
!@var WMXTR available water mixing ratio for tracer condensation ( )?
!@var b_beta_DT precipitating gridbox fraction from lowest precipitating
!@+   layer. The name was chosen to correspond to Koch et al. p. 23,802.
!@var precip_mm precipitation (mm) from the grid box above for washout
      REAL*8 WMXTR, b_beta_DT, precip_mm
c for tracers in general, added by Koch
      REAL*8 THLAW,TR_LEF,TMFAC,TR_LEFT(ntm),CLDSAVT
!@var TR_LEF limits precurser dissolution following sulfate formation
!@var THLAW Henry's Law determination of amount of tracer dissolution
!@var TMFAC used to adjust tracer moments
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      REAL*8 TMP_SUL(LM,NTM)
c for sulfur chemistry
!@var WA_VOL Cloud water volume (L). Used by GET_SULFATE.
      REAL*8 WA_VOL
      REAL*8, DIMENSION(NTM) ::SULFOUT,SULFIN,SULFINC
#endif
      REAL*8 DTSUM,HEFF
#endif
#endif

      REAL*8, DIMENSION(LM) ::
     *     DM,COND,CDHEAT,CCM,SM1,QM1,DMR,ML,SMT,QMT,TPSAV,DDM,CONDP
     *     ,DDR,SMDNL,QMDNL,CONDP1,CONDV,HEAT1
#ifdef CLD_AER_CDNC
     *     ,CONDPC
#endif
      REAL*8 :: CONDGP,CONDIP
!@var DM change in air mass
!@var COND,CONDGP,CONDIP condensate
!@var CDHEAT heating due to condensation
!@var CCM convective plume mass
!@var SM1, QM1 dummy variables
!@var DMR change of air mass
!@var ML layer air mass
!@var SMT, QMT dummy variables
!@var TPSAV array to save plume temperature
!@var DDM downdraft mass
!@param FCLW fraction of condensate in plume that remains as CLW
      REAL*8 :: FCLW

!@var IERRT,LERRT error reports from advection
      INTEGER :: IERRT,LERRT,LLOW,LHIGH
      INTEGER, INTENT(IN) :: i_debug,j_debug
#ifdef CLD_AER_CDNC
      INTEGER, PARAMETER :: SNTM=17  !for tracers for CDNC
#endif
      INTEGER LDRAFT,LMAX,LMIN,MCCONT,MAXLVL
     *     ,MINLVL,ITER,IC,LFRZ,NSUB,LDMIN
!@var LDRAFT the layer the downdraft orginates
!@var LEVAP the layer evaporation of precip starts
!@var LMAX, LMIN the lowest, the highest layer of a convective event
!@var MCCONT integer to count convective events
!@var MAXLVL, MINLVL the lowest, the highest layer of convective events
!@var ITER number for iteration
!@var IC integer for cloud types
!@var LFRZ freezing level
!@var nsub = LMAX - LMIN + 1
!@var LDMIN the lowest layer the downdraft drops
      REAL*8 TERM1,FMP0,SMO1
     *     ,QMO1,SMO2,QMO2,SDN,QDN,SUP,QUP,SEDGE,QEDGE,WMDN,WMUP,SVDN
     *     ,SVUP,WMEDG,SVEDG,DMSE,FPLUME,DFP,FMP2,FRAT1,FRAT2,SMN1
     *     ,QMN1,SMN2,QMN2,SMP,QMP,TP,GAMA,DQSUM,TNX,TNX1
     *     ,DQ,DMSE1,FCTYPE,BETAU,ALPHAU,DDRSUM,SMSUM,QMSUM
     *     ,CDHDRT,DDRAFT,DELTA,MPOLD,FPOLD
     *     ,ALPHA,BETA,CDHM,CDHSUM,CLDM,CLDREF,CONSUM,DQEVP
     *     ,DQRAT,EPLUME,ETADN,ETAL1,EVPSUM,FCDH
     *     ,FCDH1,FCLD,FCLOUD,FDDL,FDDP,FENTR,FENTRA,FEVAP,FLEFT
     *     ,FQCOND,FQEVP,FPRCP,FSEVP,FSSUM     !  ,HEAT1
     *     ,PRCP,FQCONDV
     *     ,QMDN,QMIX,QMPMAX,QMPT,QNX,QSATC,QSATMP
     *     ,RCLD,RCLDE,SLH,SMDN,SMIX,SMPMAX,SMPT,SUMAJ
     *     ,SUMDP,DDRUP,EDRAFT,DDROLD,CONTCE,HDEP,TVP,W2TEM
     *     ,TOLD,TOLD1,TEMWM,TEM,WTEM,WCONST,WORK
     *     ,FCONV_tmp,FSUB_tmp,FSSL_tmp
     *     , MNdO,MNdL,MNdI,MCDNCW,MCDNCI   !Menon
#ifdef CLD_AER_CDNC
     *     ,MCDNO1,MCDNL1,CDNCB,fcnv,ATEMP,VVEL
     *     ,DSGL(LM,SNTM),DSS(SNTM)
     *     ,Repsis,Repsi,Rbeta,RCLD_C
#endif
!@var TERM1 contribution to non-entraining convective cloud
!@var FMP0 non-entraining convective mass
!@var SMO1,QMO1,SMO2,QMO2,SDN,QDN,SUP,QUP,SEDGE,QEDGE dummy variables
!@var WMDN,WMUP,SVDN,SVUP,WMEDG,SVEDG,DDRUP,DDROLD dummy variables
!@var DMSE difference in moist static energy
!@var FPLUME fraction of convective plume
!@var DFP an iterative increment
!@var FMP2,FRAT1,FRAT2,SMN1,QMN1,SMN2,QMN2 dummy variables
!@var SMP, QMP plume's SM, QM
!@var TP plume's temperature (K)
!@var GAMA,DQSUM,TNX,DQ,CONSUM,BETAU,ALPHAU dummy variables
!@var DMSE1 difference in moist static energy
!@var FCTYPE fraction for convective cloud types
!@var CDHDRT,ALPHA,BETA,CDHM,CDHSUM,CLDREF dummy variables
!@var DDRAFT downdraft mass
!@var DELTA fraction of plume stays in the layer
!@var CLDM subsidence due to convection
!@var DQEVP amount of condensate that evaporates in downdrafts
!@var DQRAT fraction for the condensate to evaporate
!@var EPLUME air mass of entrainment
!@var ETADN fraction of the downdraft
!@var ETAL1 fractional entrainment rate
!@var EVPSUM,FCDH,FCDH1,FCLD,FCLOUD,FDDL,FDDP dummy variables
!@var FENTR fraction of entrainment
!@var FENTRA fraction of entrainment
!@var FEVAP fraction of air available for precip evaporation
!@var FLEFT fraction of plume after removing downdraft mass
!@var FQCOND fraction of water vapour that condenses in plume
!@var FQCONDV fraction of condensate that is lofted
!@var FQEVP fraction of water vapour that evaporates in downdraft
!@var FPRCP fraction of evaporated precipitation
!@var FSEVP fraction of energy lost to evaporate
!@var FSSUM fraction of energy lost to evaporate
!@var HEAT1 heating due to phase change
!@var PRHEAT energy of condensate
!@var PRCP precipipation
!@var QMDN,QMIX,SMDN,SMIX dummy variables
!@var QMPMAX,SMPMAX detrainment of QMP, SMP
!@var QMPT,SMPT dummy variables
!@var QNX,SUMAJ,SUMDP dummy variables
!@var QSATC saturation vapor mixing ratio
!@var QSATMP plume's saturation vapor mixing ratio
!@var RCLD,RCLDE cloud particle's radius, effective radius
#ifdef CLD_AER_CDNC
!@var MCDNCW,MCDNCI cloud droplet # for warm,cold moist conv clouds (cm^-3)
#endif
!@var SLH LHX/SHA
!@var EDRAFT entrainment into downdrafts
!@var TOLD,TOLD1 old temperatures
!@var TEMWM,TEM,WTEM,WCONST dummy variables
!@var WORK work done on convective plume

      LOGICAL MC1, RFMC1 !@var MC1 true for the first convective event

      REAL*8,  PARAMETER :: CK1 = 1.       !@param CK1 a tunning const.
!@param RHOG,RHOIP density of graupel and ice particles
!@param ITMAX max iteration index
!@param CN0 constant use in computing FLAMW, etc
!@param PN tuning exponential for computing WV
!@param AIRM0 air mass used to compute convective cloud cover
      REAL*8,  PARAMETER :: CN0=8.d6,PN=1.d0,AIRM0=100.d0
#ifdef CLD_AER_CDNC
      REAL*8 RHO   ! air density
!CN0 is the No parameter in the Marshall-Palmer distribution
#endif
      REAL*8,  PARAMETER :: RHOG=400.,RHOIP=100.
      INTEGER,  PARAMETER :: ITMAX=50
!@var FLAMW,FLAMG,FLAMI lamda for water, graupel and ice, respectively
!@var WMAX specified maximum convective vertical velocity
!@var WV convective vertical velocity
!@var VT precip terminal velocity
!@var DCW,DCG,DCI critical cloud particle sizes
!@var FG, FI fraction for graupel and ice
!@var FITMAX set to ITMAX
!@var CONDMU convective condensate in Kg/m^3
!@var TTURB, TRATIO, BYPBLM dummy variables
!@var HPBL, PBLM PBL height (m) and air mass in PBL (mb)
      REAL*8 :: FLAMW,FLAMG,FLAMI,WMAX,WV,DCW,DCG,DCI,FG,FI,FITMAX,DDCW
     *     ,VT,CONDMU,HPBL,PBLM,TTURB,TRATIO,BYPBLM,DWCU,FLMCM
     *     ,UMTEMP,VMTEMP
      INTEGER K,L,N  !@var K,L,N loop variables
      INTEGER ITYPE  !@var convective cloud types
!@var IERR,LERR error reports from advection
      INTEGER, INTENT(OUT) :: IERR,LERR
!@var DUM, DVM changes of UM,VM
      REAL*8, DIMENSION(IM,LM) :: DUM,DVM,UMDNL,VMDNL

      REAL*8 THBAR  !@var THBAR virtual temperature at layer edge
!@var BELOW_CLOUD logical- is the current level below cloud?
      LOGICAL BELOW_CLOUD
C****
C**** MOIST CONVECTION
C****
C**** CONVECTION OCCURS AT THE LOWEST MOIST CONVECTIVELY UNSTABLE
C**** LEVEL AND CONTINUES UNTIL A STABLE LAYER PAIR IS REACHED.  RE-
C**** EVAPORATION AND PRECIPITATION ARE COMPUTED AT THE END OF THIS
C**** CYCLE.  THE WHOLE PROCESS MAY BE REPEATED FROM A NEW LOWEST
C**** UNSTABLE LEVEL.
C****
      ierr=0 ; lerr=0
      LMCMIN=0
      LMCMAX=0
      MCCONT=0
      FMC1=0.
      FSSL=1.
      FITMAX=ITMAX
      RCLDX=radius_multiplier
      CONTCE1=entrainment_cont1
      CONTCE2=entrainment_cont2
C**** initiallise arrays of computed ouput
      TAUMCL=0
      SVWMXL=0
      SVLATL=0
      VSUBL=0
      PRECNVL=0
      CLDMCL=0
      CLDSLWIJ=0
      CLDDEPIJ=0
      PRCPMC=0.
      TPSAV=0
      CSIZEL=RWCLDOX*10.*(1.-PEARTH)+10.*PEARTH ! droplet rad in stem
      SAVWL=0.
      SAVWL1=0.
      SAVE1L=0.
      SAVE2L=0.
#ifdef TRACERS_WATER
      trsvwml = 0.
      TRPRCP = 0.
      TRPRMC = 0.
#ifdef TRDIAG_WETDEPO
      IF (diag_wetdep == 1) THEN
c**** initialize diagnostic arrays
        trcond_mc=0.D0
        trdvap_mc=0.D0
        trflcw_mc=0.D0
        trprcp_mc=0.D0
        trnvap_mc=0.D0
        trwash_mc=0.D0
      END IF
#endif
#endif
C**** zero out diagnostics
         MCFLX =0.
         DGDSM=0.
         DGDEEP=0.
         DGSHLW=0.
         DPHASE=0.
         DPHADEEP=0.
         DPHASHLW=0.
         DTOTW=0.
         DQCOND=0.
         DGDQM=0.
         DDMFLX=0.
         TDNL=0.
         QDNL=0.
C**** save initial values (which will be updated after subsid)
      SM1=SM
      QM1=QM
      FSUB=0.
      FCONV=0.
      FMCL=0.
      VLAT=LHE
#ifdef TRACERS_ON
      TM1(:,1:NTX) = TM(:,1:NTX)
      TRDNL = 0.
#ifdef TRACERS_WATER
      CLDSAVT=0.
#endif
#endif
C**** SAVE ORIG PROFILES
      SMOLD(:) = SM(:)
      SMOMOLD(:,:) = SMOM(:,:)
      QMOLD(:) = QM(:)
      QMOMOLD(:,:) = QMOM(:,:)
#ifdef TRACERS_ON
      TMOLD(:,1:NTX) = TM(:,1:NTX)
      TMOMOLD(:,:,1:NTX) = TMOM(:,:,1:NTX)
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      DT_SULF_MC(1:NTM,:)=0.
#endif
#endif
C**** CALULATE PBL HEIGHT AND MASS
      PBLM=0.
      HPBL=0.
      DO L=1,DCL
      IF(L.LT.DCL) THEN
         PBLM=PBLM+AIRM(L)
         HPBL=HPBL+AIRM(L)*TL(L)*RGAS/(GRAV*PL(L))
      ELSE
         PBLM=PBLM+.5d0*AIRM(L)
         HPBL=HPBL+.5d0*AIRM(L)*TL(L)*RGAS/(GRAV*PL(L))
      END IF
      END DO
      BYPBLM=1.d0/PBLM
C**** CALCULATE DEL WCU TO TRAVEL HALF LAYER THICKNESS
      FLMCM=LMCM
      DWCU=0.
      DO L=1,LMCM
        DWCU=DWCU+AIRM(L)*TL(L)*RGAS/(GRAV*PL(L))
      END DO
      DWCU=0.5*DWCU*BYDTsrc/FLMCM
C**** OUTER MC LOOP OVER BASE LAYER
      DO 600 LMIN=1,LMCM-1
      MAXLVL=0
      MINLVL=LM
C****
C**** COMPUTE THE CONVECTIVE MASS OF THE NON-ENTRAINING PART
C****
      TERM1=-10.*CK1*SDL(LMIN+1)*BYGRAV
      FMP0=TERM1*XMASS
      IF(FMP0.LE.0.) FMP0=0.
C**** CREATE A PLUME IN THE BOTTOM LAYER
C****
C**** ITERATION TO FIND FPLUME WHICH RESTORES THE ATM TO NEUTRAL STATE
C****
      SMO1=SM(LMIN)
      QMO1=QM(LMIN)
      SMO2=SM(LMIN+1)
      QMO2=QM(LMIN+1)
      SDN=SMO1*BYAM(LMIN)
      SUP=SMO2*BYAM(LMIN+1)
      SEDGE=THBAR(SUP,SDN)
      QDN=QMO1*BYAM(LMIN)
      QUP=QMO2*BYAM(LMIN+1)
      WMDN=WML(LMIN)
      WMUP=WML(LMIN+1)
      SVDN=SDN*(1.+DELTX*QDN-WMDN)
      SVUP=SUP*(1.+DELTX*QUP-WMUP)
      QEDGE=.5*(QUP+QDN)
      WMEDG=.5*(WMUP+WMDN)
      SVEDG=SEDGE*(1.+DELTX*QEDGE-WMEDG)
      LHX=LHE
      SLH=LHX*BYSHA
      DMSE=(SVUP-SVEDG)*PLK(LMIN+1)+(SVEDG-SVDN)*PLK(LMIN)+
     *  SLHE*(QSAT(SUP*PLK(LMIN+1),LHX,PL(LMIN+1))-QDN)
      IF(DMSE.GT.-1d-10) GO TO 600
C****
      FPLUME=.25
      DFP = .25
      DO ITER=1,8
      DFP=DFP*0.5
      FMP2=FPLUME*AIRM(LMIN)
      FRAT1=FMP2*BYAM(LMIN+1)
      FRAT2=FMP2*BYAM(LMIN+2)
      SMN1=SMO1*(1.-FPLUME)+FRAT1*SMO2
      QMN1=QMO1*(1.-FPLUME)+FRAT1*QMO2
      SMN2=SMO2*(1.-FRAT1)+FRAT2*SM(LMIN+2)
      QMN2=QMO2*(1.-FRAT1)+FRAT2*QM(LMIN+2)
      SMP=SMO1*FPLUME
      QMP=QMO1*FPLUME
      TP=SMO1*PLK(LMIN+1)*BYAM(LMIN)
      QSATMP=FMP2*QSAT(TP,LHX,PL(LMIN+1))
      GAMA=SLH*QSATMP*DQSATDT(TP,LHX)/FMP2
      DQSUM=(QMP-QSATMP)/(1.+GAMA)
      IF(DQSUM.LE.0.) GO TO 205
      FEVAP=.5*FPLUME
      MCLOUD=FEVAP*AIRM(LMIN+1)
      TNX=SMO2*PLK(LMIN+1)*BYAM(LMIN+1)
      QNX=QMO2*BYAM(LMIN+1)
      QSATC=QSAT(TNX,LHX,PL(LMIN+1))
      DQ=MCLOUD*(QSATC-QNX)/(1.+SLH*QSATC*DQSATDT(TNX,LHX))
      IF(DQ.GT.DQSUM) DQ=DQSUM
      SMN2=SMN2-SLH*DQ/PLK(LMIN+1)
      QMN2=QMN2+DQ
      DQSUM=DQSUM-DQ
      IF(DQSUM.LE.0.) GO TO 205
      MCLOUD=FEVAP*AIRM(LMIN)
      TNX=SMO1*PLK(LMIN)*BYAM(LMIN)
      QNX=QMO1*BYAM(LMIN)
      QSATC=QSAT(TNX,LHX,PL(LMIN))
      DQ=MCLOUD*(QSATC-QNX)/(1.+SLH*QSATC*DQSATDT(TNX,LHX)) ! new func'n
      IF(DQ.GT.DQSUM) DQ=DQSUM
      SMN1=SMN1-SLH*DQ/PLK(LMIN)
      QMN1=QMN1+DQ
  205 SDN=SMN1*BYAM(LMIN)
      SUP=SMN2*BYAM(LMIN+1)
      SEDGE=THBAR(SUP,SDN)
      QDN=QMN1*BYAM(LMIN)
      QUP=QMN2*BYAM(LMIN+1)
      SVDN=SDN*(1.+DELTX*QDN-WMDN)
      SVUP=SUP*(1.+DELTX*QUP-WMUP)
      QEDGE=.5*(QUP+QDN)
      SVEDG=SEDGE*(1.+DELTX*QEDGE-WMEDG)
      DMSE1=(SVUP-SVEDG)*PLK(LMIN+1)+(SVEDG-SVDN)*PLK(LMIN)+
     *  SLHE*(QSAT(SUP*PLK(LMIN+1),LHX,PL(LMIN+1))-QDN)
      IF (ABS(DMSE1).LE.1.d-3) GO TO 411
      IF(DMSE1.GT.1.d-3) FPLUME=FPLUME-DFP
      IF(DMSE1.LT.-1.d-3) FPLUME=FPLUME+DFP
      END DO
  411 IF(FPLUME.LE..001) GO TO 600
C****
C**** ITERATION THROUGH CLOUD TYPES
C****
      ITYPE=2                        ! always 2 types of clouds:
C     IF(LMIN.LE.2) ITYPE=2          ! entraining & non-entraining
      FCTYPE=1.

      DO 570 IC=1,ITYPE
C**** INITIALLISE VARIABLES USED FOR EACH TYPE
      DO L=1,LM
        COND(L)=0.
        CDHEAT(L)=0.
        CONDP(L)=0.
        CONDP1(L)=0.
        CONDV(L)=0.
        HEAT1(L)=0.
        DM(L)=0.
        DMR(L)=0.
        CCM(L)=0.
        DDM(L)=0.
        ENT(L)=0.
        DET(L)=0.
        BUOY(L)=0.
        WCU(L)=0.
        DDR(L)=0.
        SMDNL(L)=0.
        QMDNL(L)=0.
      END DO
      SMOMDNL(:,:)=0.
      QMOMDNL(:,:)=0.
      UMDN(1:KMAX)=0.
      VMDN(1:KMAX)=0.
      UMDNL(1:KMAX,:)=0.
      VMDNL(1:KMAX,:)=0.
      DUM(1:KMAX,:)=0.
      DVM(1:KMAX,:)=0.
      DSM(:) = 0.
      DSMOM(:,:) = 0.
      DSMR(:) = 0.
      DSMOMR(:,:) = 0.
      DQM(:) = 0.
      DQMOM(:,:) = 0.
      DQMR(:) = 0.
      DQMOMR(:,:) = 0.
#ifdef TRACERS_ON
      DTM(:,1:NTX) = 0.
      DTMOM(:,:,1:NTX) = 0.
      DTMR(:,1:NTX) = 0.
      DTMOMR(:,:,1:NTX) = 0.
      TMDNL(:,1:NTX) = 0.
      TMOMDNL(:,:,1:NTX) = 0.
      TPOLD = 0.
#endif
#ifdef TRACERS_WATER
      TRCOND = 0.
      TRCONDV = 0.
#endif
      MC1=.FALSE.
C     IF (IC.EQ.1) THEN
C       WMAX=2.                                 ! old specification of WMAX
C       IF(PLAND.GE..5) WMAX=5.
C     ELSE
C       WMAX=1.
C       IF(PLAND.GE..5) WMAX=2.5
C     ENDIF
      WMAX=50.
      LHX=LHE
      MPLUME=MIN(AIRM(LMIN),AIRM(LMIN+1))
      FMP2=FMP2*min(1d0,DTsrc/3600.d0)    ! use 1 hr adjustment time
      IF(MPLUME.GT.FMP2) MPLUME=FMP2
C                             ! WTURB=SQRT(.66666667*EGCM(L,I,J))
      TTURB=HPBL/WTURB(LMIN)
      IF(TTURB/DTsrc.GT.1.) MPLUME=MPLUME*DTsrc/TTURB
      IF(ITYPE.EQ.2) THEN     ! cal. MPLUME for 1st plume and 2nd plume
      FCTYPE=1.
      IF(MPLUME.GT.FMP0) FCTYPE=FMP0/MPLUME
      IF(IC.EQ.2) FCTYPE=1.-FCTYPE
      IF(FCTYPE.LT.0.001) GO TO 570
      END IF
      MPLUM1=MPLUME
      MPLUME=MPLUME*FCTYPE

C**** calculate subsiding fraction here. Then we can use FMC1 from the
C**** beginning. The analagous arrays are only set if plume is actually
C**** moved up.
      IF (MCCONT.le.0) THEN
         FCONV_tmp=MPLUM1*BYAM(LMIN+1)
         IF(FCONV_tmp.GT.1.d0) FCONV_tmp=1.d0
         FSUB_tmp=1.d0+(AIRM(LMIN+1)-100.d0)/200.d0
         IF(FSUB_tmp.GT.1.d0/(FCONV_tmp+1.d-20)-1.d0)
     *        FSUB_tmp=1.d0/(FCONV_tmp+1.d-20)-1.d0
         IF(FSUB_tmp.LT.1.d0) FSUB_tmp=1.d0
         IF(FSUB_tmp.GT.5.d0) FSUB_tmp=5.d0
         FSSL_tmp=1.d0-(1.d0+FSUB_tmp)*FCONV_tmp
         IF(FSSL_tmp.LT.CLDMIN) FSSL_tmp=CLDMIN
         IF(FSSL_tmp.GT.1.d0-CLDMIN) FSSL_tmp=1.d0-CLDMIN
         FMC1=1.d0-FSSL_tmp+teeny
      ELSE
C**** guard against possibility of too big a plume
        MPLUME=MIN(0.95d0*AIRM(LMIN)*FMC1,MPLUME)
      END IF
      RFMC1=.FALSE.
  160 IF (MC1) THEN
         RFMC1=.TRUE.
         FCONV_tmp=MPLUM1*BYAM(LMIN+1)
         IF(FCONV_tmp.GT.1.d0) FCONV_tmp=1.d0
         FSUB_tmp=1.d0+(PL(LMIN)-PL(LMAX)-100.d0)/200.d0
         IF(FSUB_tmp.GT.1.d0/(FCONV_tmp+1.d-20)-1.d0)
     *        FSUB_tmp=1.d0/(FCONV_tmp+1.d-20)-1.d0
         IF(FSUB_tmp.LT.1.d0) FSUB_tmp=1.d0
         IF(FSUB_tmp.GT.5.d0) FSUB_tmp=5.d0
         FSSL_tmp=1.d0-(1.d0+FSUB_tmp)*FCONV_tmp
         IF(FSSL_tmp.LT.CLDMIN) FSSL_tmp=CLDMIN
         IF(FSSL_tmp.GT.1.d0-CLDMIN) FSSL_tmp=1.d0-CLDMIN
         FMC1=1.d0-FSSL_tmp+teeny
C        MCCONT=0
C        MC1=.FALSE.
         MPLUME=MPLUM1*FCTYPE
      DO L=1,LM
        COND(L)=0.
        CDHEAT(L)=0.
        CONDP(L)=0.
        CONDP1(L)=0.
        CONDV(L)=0.
        HEAT1(L)=0.
        DM(L)=0.
        DMR(L)=0.
        CCM(L)=0.
        DDM(L)=0.
        ENT(L)=0.
        DET(L)=0.
        BUOY(L)=0.
        WCU(L)=0.
        DDR(L)=0.
        SMDNL(L)=0.
        QMDNL(L)=0.
      END DO
      SMOMDNL(:,:)=0.
      QMOMDNL(:,:)=0.
      UMDN(1:KMAX)=0.
      VMDN(1:KMAX)=0.
      UMDNL(1:KMAX,:)=0.
      VMDNL(1:KMAX,:)=0.
      DUM(1:KMAX,:)=0.
      DVM(1:KMAX,:)=0.
      DSM(:) = 0.
      DSMOM(:,:) = 0.
      DSMR(:) = 0.
      DSMOMR(:,:) = 0.
      DQM(:) = 0.
      DQMOM(:,:) = 0.
      DQMR(:) = 0.
      DQMOMR(:,:) = 0.
#ifdef TRACERS_ON
      DTM(:,1:NTX) = 0.
      DTMOM(:,:,1:NTX) = 0.
      DTMR(:,1:NTX) = 0.
      DTMOMR(:,:,1:NTX) = 0.
      TMDNL(:,1:NTX) = 0.
      TMOMDNL(:,:,1:NTX) = 0.
      TPOLD = 0.
#endif
#ifdef TRACERS_WATER
      TRCOND = 0.
      TRCONDV = 0.
#endif
C**** guard against possibility of too big a plume
        MPLUME=MIN(0.95d0*AIRM(LMIN)*FMC1,MPLUME)
      END IF

C**** adjust MPLUME to take account of restricted area of subsidence
C**** (i.e. MPLUME is now a greater fraction of the relevant airmass.
      MPLUME=MIN( MPLUME/FMC1,
     *   AIRM(LMIN)*0.95d0*QM(LMIN)/(QMOLD(LMIN) + teeny) )
      IF(MPLUME.LE..001*AIRM(LMIN)) GO TO 570
      FPLUME=MPLUME*BYAM(LMIN)
      SMP  =  SMOLD(LMIN)*FPLUME
      SMOMP(xymoms)=SMOMOLD(xymoms,LMIN)*FPLUME
      QMP  =  QMOLD(LMIN)*FPLUME
      QMOMP(xymoms)=QMOMOLD(xymoms,LMIN)*FPLUME
      TPSAV(LMIN)=SMP*PLK(LMIN)/MPLUME
      DMR(LMIN)=-MPLUME
        DSMR(LMIN)=-SMP
      DSMOMR(xymoms,LMIN)=-SMOMP(xymoms)
      DSMOMR(zmoms,LMIN)=-SMOMOLD(zmoms,LMIN)*FPLUME
        DQMR(LMIN)=-QMP
      DQMOMR(xymoms,LMIN)=-QMOMP(xymoms)
      DQMOMR(zmoms,LMIN)=-QMOMOLD(zmoms,LMIN)*FPLUME
#ifdef TRACERS_ON
C**** This is a fix to prevent very occasional plumes that take out
C**** too much tracer mass. This can impact tracers with very sharp
C**** vertical gradients
      TMP(1:NTX) = MIN(TMOLD(LMIN,1:NTX)*FPLUME,0.95d0*TM(LMIN,1:NTX))
      TMOMP(xymoms,1:NTX)=TMOMOLD(xymoms,LMIN,1:NTX)*FPLUME
        DTMR(LMIN,1:NTX)=-TMP(1:NTX)
      DTMOMR(xymoms,LMIN,1:NTX)=-TMOMP(xymoms,1:NTX)
      DTMOMR( zmoms,LMIN,1:NTX)=-TMOMOLD(zmoms,LMIN,1:NTX)*FPLUME
      TPOLD(LMIN)=TPSAV(LMIN)  ! initial plume temperature
#endif
      DO K=1,KMAX
         UMP(K)=UM(K,LMIN)*FPLUME
         DUM(K,LMIN)=-UMP(K)
         VMP(K)=VM(K,LMIN)*FPLUME
         DVM(K,LMIN)=-VMP(K)
      ENDDO
C****
C**** RAISE THE PLUME TO THE TOP OF CONVECTION AND CALCULATE
C**** ENTRAINMENT, CONDENSATION, AND SECONDARY MIXING
C****
      CDHSUM=0.
      CDHDRT=0.
      ETADN=0.
      LDRAFT=LM
      EVPSUM=0.
      DDRAFT=0.
      LFRZ=0
      LMAX=LMIN
C     CONTCE=.3
C     IF(IC.EQ.2) CONTCE=.6
      CONTCE=CONTCE1
      IF(IC.EQ.2) CONTCE=CONTCE2
      WCU(LMIN)=MAX(.5D0,WTURB(LMIN))
      IF(IC.EQ.1) WCU(LMIN)=MAX(.5D0,2.D0*WTURB(LMIN))
C     WCU(LMIN)=MAX(.5D0,SQRT(W2L(LMIN)))
C     IF(IC.EQ.1) WCU(LMIN)=MAX(.5D0,2.D0*SQRT(W2L(LMIN)))
 220  L=LMAX+1
      HDEP=AIRM(L)*TL(L)*RGAS/(GRAV*PL(L))
C**** TEST FOR SUFFICIENT AIR, MOIST STATIC STABILITY AND ENERGY
C     IF(L.GT.LMIN+1.AND.SDL(L).GT.0.) GO TO 340
      IF(MPLUME.LE..001*AIRM(L)) GO TO 340
      SDN=SMP/MPLUME
      SUP=SM1(L)*BYAM(L)
      QDN=QMP/MPLUME
      QUP=QM1(L)*BYAM(L)
      WMDN=0.
      WMUP=WML(L)
      SVDN=SDN*(1.+DELTX*QDN-WMDN)
      SVUP=SUP*(1.+DELTX*QUP-WMUP)
      IF(LMAX.GT.LMIN) THEN
      SEDGE=THBAR(SUP,SDN)
      QEDGE=.5*(QUP+QDN)
      WMEDG=.5*(WMUP+WMDN)
      SVEDG=SEDGE*(1.+DELTX*QEDGE-WMEDG)
      LHX=LHE
      DMSE=(SVUP-SVEDG)*PLK(L)+(SVEDG-SVDN)*PLK(L-1)+
     *  SLHE*(QSAT(SUP*PLK(L),LHX,PL(L))-QDN)
C     IF(DMSE.GT.-1d-10) GO TO 340      ! condition not applied
      END IF
      IF(PLK(L-1)*(SVUP-SVDN)+SLHE*(QUP-QDN).GE.0.) GO TO 340
C**** TEST FOR CONDENSATION ALSO DETERMINES IF PLUME REACHES UPPER LAYER
      TP=SMP*PLK(L)/MPLUME
      TPSAV(L)=TP
      IF(TPSAV(L-1).GE.TF.AND.TPSAV(L).LT.TF) LFRZ=L-1
      IF(TP.LT.TI) LHX=LHS
      QSATMP=MPLUME*QSAT(TP,LHX,PL(L))
      IF(QMP.LT.QSATMP) GO TO 340
      IF(TP.GE.TF.OR.LHX.EQ.LHS) GO TO 290
      LHX=LHS
      QSATMP=MPLUME*QSAT(TP,LHX,PL(L))
  290 CONTINUE
C**** DEFINE VLAT TO AVOID PHASE DISCREPANCY BETWEEN TWO PLUMES
      IF (VLAT(L).EQ.LHS) LHX=LHS
      VLAT(L)=LHX
      SLH=LHX*BYSHA
      MCCONT=MCCONT+1
      IF(MCCONT.EQ.1) MC1=.TRUE.
C     IF(MC1.AND.L.EQ.LMIN+1) THEN
C        FCONV(L)=FCONV_tmp   ! these are set here but do not make
C        FSSL(L)=FSSL_tmp     ! much sense at the moment...
C        FSUB(L)=FSUB_tmp
C     ENDIF
C****
C**** DEPOSIT PART OF THE PLUME IN LOWER LAYER
C**** If plume is too large, reduce it
C****
      IF(MPLUME.GT..95*AIRM(L)) THEN
        DELTA=(MPLUME-.95*AIRM(L))/MPLUME
        DM(L-1)=DM(L-1)+DELTA*MPLUME
        MPLUME=.95*AIRM(L)

        DSM(L-1)=  DSM(L-1)+DELTA*SMP
        SMP = SMP  *(1.-DELTA)
        DSMOM(xymoms,L-1)=DSMOM(xymoms,L-1)+DELTA*SMOMP(xymoms)
        SMOMP(xymoms) = SMOMP(xymoms)*(1.-DELTA)

        DQM(L-1)=  DQM(L-1)+DELTA*QMP
        QMP = QMP  *(1.-DELTA)
        DQMOM(xymoms,L-1)=DQMOM(xymoms,L-1)+DELTA*QMOMP(xymoms)
        QMOMP(xymoms) = QMOMP(xymoms)*(1.-DELTA)

        DO K=1,KMAX
          DUM(K,L-1)=DUM(K,L-1)+UMP(K)*DELTA
          DVM(K,L-1)=DVM(K,L-1)+VMP(K)*DELTA
          UMP(K)=UMP(K)-UMP(K)*DELTA
          VMP(K)=VMP(K)-VMP(K)*DELTA
        ENDDO

#ifdef TRACERS_ON
        DTM(L-1,1:NTX) = DTM(L-1,1:NTX)+DELTA*TMP(1:NTX)
        DTMOM(xymoms,L-1,1:NTX)=DTMOM(xymoms,L-1,1:NTX)+DELTA
     *       *TMOMP(xymoms,1:NTX)
        TMP(1:NTX) = TMP(1:NTX)*(1.-DELTA)
        TMOMP(xymoms,1:NTX) = TMOMP(xymoms,1:NTX)*(1.-DELTA)
#endif
      END IF
C****
C**** CONVECTION IN UPPER LAYER   (WORK DONE COOLS THE PLUME)
C****
      WORK=MPLUME*(SUP-SDN)*(PLK(L-1)-PLK(L))/PLK(L-1)
C     SMP=SMP-WORK
      DSM(L-1)=DSM(L-1)-WORK
      CCM(L-1)=MPLUME
C****
C**** CONDENSE VAPOR IN THE PLUME AND ADD LATENT HEAT
C****
      DQSUM=0.                     !!!  291 DQSUM=0.
      SMPT=SMP
      QMPT=QMP
      DO 292 N=1,3
      TP=SMP*PLK(L)/MPLUME
      QSATMP=MPLUME*QSAT(TP,LHX,PL(L))
      GAMA=SLH*QSATMP*DQSATDT(TP,LHX)/MPLUME
      DQ=(QMP-QSATMP)/(1.+GAMA)
      SMP=SMP+SLH*DQ/PLK(L)
      QMP=QMP-DQ
  292 DQSUM=DQSUM+DQ
#ifdef TRACERS_ON
C**** save plume temperature after possible condensation
      TPOLD(L)=SMP*PLK(L)/MPLUME
#endif
      FQCOND = 0
      IF(DQSUM.GE.0.) THEN
        IF (QMPT.gt.teeny) FQCOND = DQSUM/QMPT
        QMOMP(xymoms) =  QMOMP(xymoms)*(1.-FQCOND)
      ELSE  ! no change
        DQSUM=0.
        SMP=SMPT
        QMP=QMPT
      END IF
      COND(L)=DQSUM
      CDHEAT(L)=SLH*COND(L)          ! cal CDHEAT before add CONDV
      CDHSUM=CDHSUM+CDHEAT(L)
      COND(L)=COND(L)+CONDV(L-1)     ! add in the vertical transported COND
      IF (TPSAV(L-1).GE.TF.AND.TP.LT.TF)   ! phase change from water to ice
     *  HEAT1(L)=HEAT1(L)-LHM*CONDV(L-1)*BYSHA/PLK(L)
      IF (TPSAV(L-1).LT.TF.AND.TP.GE.TF)   ! phase change from ice to water
     *  HEAT1(L)=HEAT1(L)+LHM*CONDV(L-1)*BYSHA/PLK(L)
      CONDMU=100.*COND(L)*PL(L)/(CCM(L-1)*TL(L)*RGAS)
      FLAMW=(1000.d0*PI*CN0/(CONDMU+teeny))**.25
      FLAMG=(400.d0*PI*CN0/(CONDMU+teeny))**.25
      FLAMI=(100.d0*PI*CN0/(CONDMU+teeny))**.25
#ifdef CLD_AER_CDNC
!@auth Menon  saving aerosols mass for CDNC prediction
      DO N=1,SNTM
        DSS(N)=1.d-10
        DSGL(L,N)=1.d-10
      ENDDO
C** Here we change convective precip due to aerosols
#ifdef TRACERS_AEROSOLS_Koch
c#if (defined TRACERS_SPECIAL_Shindell) && (defined TRACERS_AEROSOLS_Koch)
      DO N=1,NTX
       select case (trname(ntix(n)))
        case('SO4')
        DSGL(L,1)=tm(l,n)  !n=19
        DSS(1) = DSGL(L,1)
        case('seasalt1')
        DSGL(L,2)=tm(l,n)  !n=21
        DSS(2) = DSGL(L,2)
        case('seasalt2')
        DSGL(L,3)=tm(l,n)  !n=22
        DSS(3) = DSGL(L,3)
        case('OCIA')
        DSGL(L,4)=tm(l,n)    !n=27
        DSS(4) = DSGL(L,4)
        case('OCB')
        DSGL(L,5)=tm(l,n)  !n=28
        DSS(5) = DSGL(L,5)
        case('BCIA')
        DSGL(L,6)=tm(l,n)  !n=24
        DSS(6) = DSGL(L,6)
        case('BCB')
        DSGL(L,7)=tm(l,n)  !n=25
        DSS(7) = DSGL(L,7)
        case('OCII')
        DSGL(L,8)=tm(l,n)  !n=26
        DSS(8) = DSGL(L,8)
        case('BCII')
        DSGL(L,9)=tm(l,n)  !n=23
        DSS(9) = DSGL(L,9)
#endif
#ifdef TRACERS_DUST
         case('Clay')
         DSGL(L,10)=tm(l,n)  !n=23
         DSS(10) = DSGL(L,10)
         case('Silt1')
         DSGL(L,11)=tm(l,n)  !n=23
         DSS(11) = DSGL(L,11)
         case('Silt2')
         DSGL(L,12)=tm(l,n)  !n=23
         DSS(12) = DSGL(L,12)
         case('Silt3')
         DSGL(L,13)=tm(l,n)  !n=23
         DSS(13) = DSGL(L,13)
#endif
#ifdef TRACERS_NITRATE
         case('NO3p')
         DSGL(L,14)=tm(l,n)  !n=23
         DSS(14) = DSGL(L,14)
#endif
#ifdef TRACERS_HETCHEM
C*** Here are dust particles coated with sulfate
       case('SO4_d1')
       DSGL(L,15)=tm(l,n)  !n=20
       DSS(15) = DSGL(L,15)
       case('SO4_d2')
       DSGL(L,16)=tm(l,n)  !n=21
       DSS(16) = DSGL(L,16)
       case('SO4_d3')
       DSGL(L,17)=tm(l,n)  !n=22
       DSS(17) = DSGL(L,17)
#endif
       end select
      END DO      !end of n loop for tracers
c     if(DSS(5).lt.0.d0)write(6,*)"SO4c1",DSS(1),DSS(4),DSS(5),DSS(6),l
      CALL GET_CC_CDNC(L,AIRM(L),DXYPJ,PL(L),TL(L),DSS,MCDNL1,MCDNO1)
      MNdO=MCDNO1
      MNdL=MCDNL1
      MNdI = 0.06417127d0
      MCDNCW=MNdO*(1.-PEARTH)+MNdL*PEARTH
      MCDNCI=MNdI
      if (MCDNCW.le.20.d0) MCDNCW=20.d0     !set min CDNC, sensitivity test
      if (MCDNCW.ge.8000.d0) MCDNCW=8000.d0     !set max CDNC, sensitivity test
c     write(6,*)"CCONV",MCDNCW,MNdO,MNdL,L,LMIN
C** Using the Liu and Daum paramet, Nature, 2002, Oct 10, Vol 419
C** for spectral dispersion effects on droplet size distribution
C** central value of 0.003 for alfa:Rotstayn&Daum, J.Clim,2003,16,21, Nov 2003.
      Repsi=1.d0 - 0.7d0*exp(-0.003d0*MCDNCW)
      Repsis=Repsi*Repsi
      Rbeta=(((1.d0+2.d0*Repsis)**0.667d0))/((1.d0+Repsis)**by3)
      RCLD_C=14.d0/Rbeta       !set Reff to threshold size =14 um (Rosenfeld)
#endif

#ifdef TRACERS_WATER
C**** CONDENSING TRACERS
      WMXTR=DQSUM*BYAM(L)
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      WA_VOL=COND(L)*1.d2*BYGRAV*DXYPJ
      DO N=1,NTX
      select case (trname(ntix(n)))
      case('SO2','SO4','H2O2_s','H2O2')
      if (trname(ntix(n)).eq."H2O2" .and. coupled_chem.eq.0) goto 400
      if (trname(ntix(n)).eq."H2O2_s" .and. coupled_chem.eq.1) goto 400

        IF (FPLUME.GT.teeny) then
          TMP_SUL(L,N)=TMP(N)/FPLUME
        else
          TMP_SUL(L,N)=0.
        ENDIF

 400   CONTINUE

      end select

      END DO
      CALL GET_SULFATE(L,TPOLD(L),FPLUME,WA_VOL,WMXTR,SULFIN,
     *     SULFINC,SULFOUT,TR_LEFT,TMP_SUL,TRCOND(1,L),
     *     AIRM,LHX,
     *     DT_SULF_MC(1,L),CLDSAVT)
#endif
      DO N=1,NTX
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      select case (trname(ntix(n)))
      case('SO2','SO4','H2O2_s','H2O2')
      if (trname(ntix(n)).eq."H2O2" .and. coupled_chem.eq.0) goto 401
      if (trname(ntix(n)).eq."H2O2_s" .and. coupled_chem.eq.1) goto 401

c first apply chemistry
c removal of precursers
        TMP(N)=TMP(N)*(1.+SULFIN(N))
        TMOMP(xymoms,N)= TMOMP(xymoms,N)*(1.+SULFIN(N))
c formation of sulfate
        TRCOND(N,L) = TRCOND(N,L)+SULFOUT(N)

 401    CONTINUE

      end select

#endif
        TR_LEF=1.D0
       CALL GET_COND_FACTOR(L,N,WMXTR,TPOLD(L),TPOLD(L-1),LHX,FPLUME
     *       ,FQCOND,FQCONDT,.true.,TRCOND,TM,THLAW,TR_LEF,PL(L),ntix
     *       ,CLDSAVT)
        TRCOND(N,L) = FQCONDT * TMP(N) + TRCOND(N,L) + TRCONDV(N,L-1)
#ifdef TRDIAG_WETDEPO
        IF (diag_wetdep == 1)
     &     trcond_mc(l,n)=trcond_mc(l,n)+fqcondt*tmp(n)
#endif
        TMP(N)         = TMP(N)         *(1.-FQCONDT)
        TMOMP(xymoms,N)= TMOMP(xymoms,N)*(1.-FQCONDT)
      END DO
#endif
      TAUMCL(L)=TAUMCL(L)+COND(L)*FMC1    ! DQSUM*FMC1
C     CDHEAT(L)=SLH*COND(L)
C     CDHSUM=CDHSUM+CDHEAT(L)
      IF(ETADN.GT.1d-10) CDHDRT=CDHDRT+CDHEAT(L)    ! SLH*COND(L)
C****
C**** ENTRAINMENT
C****
C     IF(IC.EQ.2.OR.(IC.EQ.1.AND.PL(L).GE.800.)) THEN
      TVP=(SMP/MPLUME)*PLK(L)*(1.+DELTX*QMP/MPLUME)
      BUOY(L)=(TVP-TVL(L))/TVL(L)-COND(L)*BYAM(L)
      ENT(L)=.16667D0*CONTCE*GRAV*BUOY(L)/(WCU(L-1)*WCU(L-1)+teeny)
      IF (ENT(L).LT.0.D0) THEN
        DET(L)=-ENT(L)
        ENT(L)=0.D0
      ENDIF
      IF(ENT(L).GT.0.D0) THEN
      FENTR=1000.D0*ENT(L)*GZL(L)*FPLUME
C     FENTR=ETAL(L)*FPLUME
      IF(FENTR+FPLUME.GT.1.) FENTR=1.-FPLUME
      IF(FENTR.LT.teeny) GO TO 293
      MPOLD=MPLUME
      FPOLD=FPLUME
      ETAL1=FENTR/(FPLUME+teeny)
      FPLUME=FPLUME+FENTR
      EPLUME=MPLUME*ETAL1
C**** Reduce EPLUME so that mass flux is less than mass in box
      IF (EPLUME.GT.AIRM(L)*0.975d0-MPLUME) THEN
        EPLUME=AIRM(L)*0.975d0-MPLUME
      END IF
      MPLUME=MPLUME+EPLUME
      ETAL1=EPLUME/MPOLD
      FENTR=ETAL1*FPOLD
      ENT(L)=0.001d0*FENTR/(GZL(L)*FPLUME)
      FENTRA = EPLUME*BYAM(L)
      DSMR(L)=DSMR(L)-EPLUME*SUP        ! = DSM(L)-SM(L)*FENTRA
      DSMOMR(:,L)=DSMOMR(:,L)-SMOM(:,L)*FENTRA
      DQMR(L)=DQMR(L)-EPLUME*QUP        ! = DQM(L)-QM(L)*FENTRA
      DQMOMR(:,L)=DQMOMR(:,L)-QMOM(:,L)*FENTRA
      DMR(L)=DMR(L)-EPLUME
      SMP=SMP+EPLUME*SUP
      SMOMP(xymoms)= SMOMP(xymoms)+ SMOM(xymoms,L)*FENTRA
      QMP=QMP+EPLUME*QUP
      QMOMP(xymoms)= QMOMP(xymoms)+ QMOM(xymoms,L)*FENTRA
#ifdef TRACERS_ON
      DTMR(L,1:NTX) = DTMR(L,1:NTX)-TM(L,1:NTX)*FENTRA
      DTMOMR(:,L,1:NTX) = DTMOMR(:,L,1:NTX)-TMOM(:,L,1:NTX)*FENTRA
      TMP(1:NTX) = TMP(1:NTX)+TM(L,1:NTX)*FENTRA
      TMOMP(xymoms,1:NTX) = TMOMP(xymoms,1:NTX)+TMOM(xymoms,L,1:NTX)
     *     *FENTRA
#endif
      DO K=1,KMAX
         UMTEMP=0.7*MPLUME**2*(U_0(K,L+1)-U_0(K,L))/(PL(L)-PL(L+1))
         VMTEMP=0.7*MPLUME**2*(V_0(K,L+1)-V_0(K,L))/(PL(L)-PL(L+1))
         UMP(K)=UMP(K)+U_0(K,L)*EPLUME+UMTEMP
         DUM(K,L)=DUM(K,L)-U_0(K,L)*EPLUME-UMTEMP
         VMP(K)=VMP(K)+V_0(K,L)*EPLUME+VMTEMP
         DVM(K,L)=DVM(K,L)-V_0(K,L)*EPLUME-VMTEMP
      ENDDO
  293 CONTINUE
      END IF
C****
C**** DETRAINMENT
C****
      IF(DET(L).GT.0.D0) THEN
        DELTA=1000.D0*DET(L)*GZL(L)
        IF(DELTA.GT..95D0) THEN
          DELTA=.95d0
          DET(L)=.001d0*DELTA/GZL(L)
        ENDIF
        DM(L)=DM(L)+DELTA*MPLUME
        MPLUME=MPLUME*(1.D0-DELTA)
        DSM(L)=  DSM(L)+DELTA*SMP
        SMP = SMP  *(1.-DELTA)
        DSMOM(xymoms,L)=DSMOM(xymoms,L)+DELTA*SMOMP(xymoms)
        SMOMP(xymoms) = SMOMP(xymoms)*(1.-DELTA)
        DQM(L)=  DQM(L)+DELTA*QMP
        QMP = QMP  *(1.-DELTA)
        DQMOM(xymoms,L)=DQMOM(xymoms,L)+DELTA*QMOMP(xymoms)
        QMOMP(xymoms) = QMOMP(xymoms)*(1.-DELTA)
        DO K=1,KMAX
          UMTEMP=0.7*MPLUME**2*(U_0(K,L+1)-U_0(K,L))/(PL(L)-PL(L+1))
          VMTEMP=0.7*MPLUME**2*(V_0(K,L+1)-V_0(K,L))/(PL(L)-PL(L+1))
          DUM(K,L)=DUM(K,L)+UMP(K)*DELTA-UMTEMP
          DVM(K,L)=DVM(K,L)+VMP(K)*DELTA-VMTEMP
          UMP(K)=UMP(K)-UMP(K)*DELTA+UMTEMP
          VMP(K)=VMP(K)-VMP(K)*DELTA+VMTEMP
        ENDDO

#ifdef TRACERS_ON
        DTM(L,1:NTX) = DTM(L,1:NTX)+DELTA*TMP(1:NTX)
        DTMOM(xymoms,L,1:NTX)=DTMOM(xymoms,L,1:NTX)+DELTA
     *        *TMOMP(xymoms,1:NTX)
        TMP(1:NTX) = TMP(1:NTX)*(1.-DELTA)
        TMOMP(xymoms,1:NTX) = TMOMP(xymoms,1:NTX)*(1.-DELTA)
#endif
      ENDIF
C****
C**** CHECK THE DOWNDRAFT POSSIBILITY
C**** Define downdraft properties
C****
      IF(L-LMIN.LE.1) GO TO 291
C     IF(ETADN.GT.1d-10) GO TO 291 ! comment out for multiple downdrafts
      SMIX=.5*(SUP+SMP/MPLUME)
      QMIX=.5*(QUP+QMP/MPLUME)
C     WMIX=.5*(WMUP+WMDN)
C     SVMIX=SMIX*(1.+DELTX*QMIX-WMIX)
C     DMMIX=(SVUP-SVMIX)*PLK(L)+
C    *  SLHE*(QSAT(SUP*PLK(L),LHX,PL(L))-QMIX)
C     IF(DMMIX.LT.1d-10) GO TO 291
      IF(SMIX.GE.SUP) GO TO 291     ! the mixture is buoyant
C     IF(PL(L).GT.700.) GO TO 291   ! do we need this condition?
      LDRAFT=L                      ! the highest downdraft level
      ETADN=.20d0      ! reduce ETADN to improve computational stability
      FLEFT=1.-.5*ETADN
      DDRAFT=ETADN*MPLUME
      DDR(L)=DDRAFT
      FDDP = .5*DDRAFT/MPLUME
      FDDL = .5*DDRAFT*BYAM(L)
      MPLUME=FLEFT*MPLUME
C     SMDN=DDRAFT*SMIX         ! = SM(L)*FDDL +  SMP*FDDP
C     SMOMDN(xymoms)=SMOM(xymoms,L)*FDDL +  SMOMP(xymoms)*FDDP
      SMDNL(L)=DDRAFT*SMIX
      SMOMDNL(xymoms,L)=SMOM(xymoms,L)*FDDL +  SMOMP(xymoms)*FDDP
      SMP=FLEFT*SMP
      SMOMP(xymoms)= SMOMP(xymoms)*FLEFT
C     QMDN=DDRAFT*QMIX         ! = QM(L)*FDDL +  QMP*FDDP
C     QMOMDN(xymoms)=QMOM(xymoms,L)*FDDL +  QMOMP(xymoms)*FDDP
      QMDNL(L)=DDRAFT*QMIX
      QMOMDNL(xymoms,L)=QMOM(xymoms,L)*FDDL +  QMOMP(xymoms)*FDDP
      QMP=FLEFT*QMP
      QMOMP(xymoms)= QMOMP(xymoms)*FLEFT
      DMR(L) = DMR(L)-.5*DDRAFT
      DSMR(L)=DSMR(L)-.5*DDRAFT*SUP        ! = DSM(L)-SM(L)*FDDL
      DSMOMR(:,L)=DSMOMR(:,L) - SMOM(:,L)*FDDL
      DQMR(L)=DQMR(L)-.5*DDRAFT*QUP        ! = DQM(L)-QM(L)*FDDL
      DQMOMR(:,L)=DQMOMR(:,L) - QMOM(:,L)*FDDL
#ifdef TRACERS_ON
      Tmdnl(l,1:NTX) = tm(l,1:NTX)*fddl+Tmp(1:NTX)*fddp
      tmomdnl(xymoms,l,1:NTX) = tmom(xymoms,l,1:NTX)*fddl+
     *     tmomp(xymoms,  1:NTX)*fddp
      dtmr    (l,1:NTX) = dtmr    (l,1:NTX)-fddl *tm    (l,1:NTX)
      dtmomr(:,l,1:NTX) = dtmomr(:,l,1:NTX)-fddl *tmom(:,l,1:NTX)
      Tmp         (1:NTX) = Tmp         (1:NTX)*fleft
      tmomp(xymoms,1:NTX) = tmomp(xymoms,1:NTX)*fleft
#endif
      DO K=1,KMAX
C        UMDN(K)=.5*(ETADN*UMP(K)+DDRAFT*U_0(K,L))
         UMDNL(K,L)=.5*(ETADN*UMP(K)+DDRAFT*U_0(K,L))
         UMP(K)=UMP(K)*FLEFT
         DUM(K,L)=DUM(K,L)-.5*DDRAFT*U_0(K,L)
C        VMDN(K)=.5*(ETADN*VMP(K)+DDRAFT*V_0(K,L))
         VMDNL(K,L)=.5*(ETADN*VMP(K)+DDRAFT*V_0(K,L))
         VMP(K)=VMP(K)*FLEFT
         DVM(K,L)=DVM(K,L)-.5*DDRAFT*V_0(K,L)
      ENDDO
C****
C**** COMPUTE CUMULUS V. VELOCITY
C****
  291 W2TEM=.16667D0*GRAV*BUOY(L)/(WCU(L-1)+teeny)-WCU(L-1)*
     *      (.66667D0*DET(L)+ENT(L))
      WCU(L)=WCU(L-1)+HDEP*W2TEM
      IF (WCU(L).GE.0.D0) WCU(L)=MIN(50.D0,WCU(L))
      IF (WCU(L).LT.0.D0) WCU(L)=MAX(-50.D0,WCU(L))
C     WRITE (6,342) L,LMIN,IC,WCU(L-1),WCU(L),ENT(L),DET(L),
C    *  BUOY(L),COND(L),TVL(L),TVP
C 342 FORMAT(1X,'L LMIN IC WCU1 WCU ENT DET BUOY COND,TVL TVP=',
C    *  3I4,8E15.4)
C****
C**** UPDATE ALL QUANTITIES CARRIED BY THE PLUME
C****
C     MCCONT=MCCONT+1
C     IF(MCCONT.EQ.1) MC1=.TRUE.
C     IF(MC1.AND.PLE(LMIN)-PLE(L+2).GE.450.) SVLATL(L)=LHX
      SVLATL(L)=VLAT(L)
      SMPMAX=SMP
      SMOMPMAX(xymoms) =  SMOMP(xymoms)
      QMPMAX=QMP
      QMOMPMAX(xymoms) =  QMOMP(xymoms)
#ifdef TRACERS_ON
C**** Tracers at top of plume
      TMPMAX(1:NTX) = TMP(1:NTX)
      TMOMPMAX(xymoms,1:NTX) = TMOMP(xymoms,1:NTX)
#endif
      MPMAX=MPLUME
      LMAX = LMAX + 1
      IF(WCU(L).LT.0.D0) GO TO 340
C     WV=WMAX                                    ! old specification of WV
C     IF(PL(L).GT.700..AND.PLE(1).GT.700.)
C    *  WV=WMAX*(PLE(1)-PL(L))/(PLE(1)-700.)
C     IF(PL(L).LT.400.) WV=WMAX*((PL(L)-PLE(LM+1))/(400.-PLE(LM+1)))**PN
      WV=WCU(L)-DWCU          ! apply the calculated cumulus updraft speed
      IF(WV.LT.0.d0) WV=0.d0
      DCG=((WV/19.3)*(PL(L)/1000.)**.4)**2.7
      DCG=MIN(DCG,1.D-2)
      DCI=((WV/1.139)*(PL(L)/1000.)**.4)**9.09
      DCI=MIN(DCI,1.D-2)
      IF (TP.GE.TF) THEN ! water phase
        DDCW=6d-3/FITMAX
        IF(PLAND.LT..5) DDCW=1.5d-3/FITMAX
        DCW=0.
        DO ITER=1,ITMAX-1
          VT=(-.267d0+DCW*(5.15D3-DCW*(1.0225D6-7.55D7*DCW)))*
     *       (1000./PL(L))**.4d0
          IF(VT.GE.0..AND.ABS(VT-WV).LT..3) EXIT
          IF(VT.GT.WMAX) EXIT
          DCW=DCW+DDCW
        END DO
        CONDP1(L)=RHOW*(PI*by6)*CN0*EXP(-FLAMW*DCW)*
     *     (DCW*DCW*DCW/FLAMW+3.*DCW*DCW/(FLAMW*FLAMW)+
     *     6.*DCW/(FLAMW*FLAMW*FLAMW)+6./FLAMW**4)
        WV=WCU(L)+DWCU          ! apply the calculated cumulus updraft speed
        DCW=0.
        DO ITER=1,ITMAX-1
          VT=(-.267d0+DCW*(5.15D3-DCW*(1.0225D6-7.55D7*DCW)))*
     *       (1000./PL(L))**.4d0
          IF(VT.GE.0..AND.ABS(VT-WV).LT..3) EXIT
          IF(VT.GT.WMAX) EXIT
          DCW=DCW+DDCW
        END DO
        CONDP(L)=RHOW*(PI*by6)*CN0*EXP(-FLAMW*DCW)*
     *     (DCW*DCW*DCW/FLAMW+3.*DCW*DCW/(FLAMW*FLAMW)+
     *     6.*DCW/(FLAMW*FLAMW*FLAMW)+6./FLAMW**4)
#ifdef CLD_AER_CDNC
        RHO=1d2*PL(L)/(RGAS*TL(L)) !air density in kg/m3
C** Here we calculate condensate converted to precip
C** only if drop size (Reff) exceeds 14 um
C** Conver Rvol to m and CDNC to m from um and cm, respectively
C** Precip condensate is simply the LWC
        CONDPC(L)=4.d0*by3*PI*RHOW*((RCLD_C*1.d-6)**3)*1.d6*MCDNCW/RHO
        IF(CONDMU.gt.CONDPC(L))  then
          CONDP(L)=CONDMU-CONDPC(L) !
        ELSE
          CONDP(L)=0.d0
        ENDIF
c     if (CONDP(L).lt.0.d0)
c    *write(6,*)"Mup",CONDP(L),CONDPC(L),CONDMU,DCW,MCDNCW,RCLD_C,L
c      write(6,*)"Mup",CONDP(L),DCW,FLAMW,CONDMU,L
#endif
      ELSE IF (TP.LE.TI) THEN ! pure ice phase
        CONDP1(L)=RHOIP*(PI*by6)*CN0*EXP(-FLAMI*DCI)*
     *    (DCI*DCI*DCI/FLAMI+3.*DCI*DCI/(FLAMI*FLAMI)+
     *    6.*DCI/(FLAMI*FLAMI*FLAMI)+6./FLAMI**4)
        WV=WCU(L)+DWCU
        DCI=((WV/1.139)*(PL(L)/1000.)**.4)**9.09
        DCI=MIN(DCI,1.D-2)
        CONDP(L)=RHOIP*(PI*by6)*CN0*EXP(-FLAMI*DCI)*
     *    (DCI*DCI*DCI/FLAMI+3.*DCI*DCI/(FLAMI*FLAMI)+
     *    6.*DCI/(FLAMI*FLAMI*FLAMI)+6./FLAMI**4)
      ELSE ! mixed phase
        FG=(TP-TI)/(TF-TI)
        FI=1.-FG
        CONDIP=RHOIP*(PI*by6)*CN0*EXP(-FLAMI*DCI)*
     *    (DCI*DCI*DCI/FLAMI+3.*DCI*DCI/(FLAMI*FLAMI)+
     *    6.*DCI/(FLAMI*FLAMI*FLAMI)+6./FLAMI**4)
        CONDGP=RHOG*(PI*by6)*CN0*EXP(-FLAMG*DCG)*
     *    (DCG*DCG*DCG/FLAMG+3.*DCG*DCG/(FLAMG*FLAMG)+
     *    6.*DCG/(FLAMG*FLAMG*FLAMG)+6./FLAMG**4)
        CONDP1(L)=FG*CONDGP+FI*CONDIP
        WV=WCU(L)+DWCU
        DCI=((WV/1.139)*(PL(L)/1000.)**.4)**9.09
        DCI=MIN(DCI,1.D-2)
        DCG=((WV/19.3)*(PL(L)/1000.)**.4)**2.7
        DCG=MIN(DCG,1.D-2)
        CONDIP=RHOIP*(PI*by6)*CN0*EXP(-FLAMI*DCI)*
     *    (DCI*DCI*DCI/FLAMI+3.*DCI*DCI/(FLAMI*FLAMI)+
     *    6.*DCI/(FLAMI*FLAMI*FLAMI)+6./FLAMI**4)
        CONDGP=RHOG*(PI*by6)*CN0*EXP(-FLAMG*DCG)*
     *    (DCG*DCG*DCG/FLAMG+3.*DCG*DCG/(FLAMG*FLAMG)+
     *    6.*DCG/(FLAMG*FLAMG*FLAMG)+6./FLAMG**4)
        CONDP(L)=FG*CONDGP+FI*CONDIP
      ENDIF
c convert condp to the same units as cond
      CONDP(L)=.01d0*CONDP(L)*CCM(L-1)*TL(L)*RGAS/PL(L)
      CONDP1(L)=.01d0*CONDP1(L)*CCM(L-1)*TL(L)*RGAS/PL(L)
      IF(CONDP1(L).GT.COND(L)) CONDP1(L)=COND(L)
      IF(CONDP(L).GT.CONDP1(L)) CONDP(L)=CONDP1(L)
      CONDV(L)=COND(L)-CONDP1(L)       ! part of COND transported up
      COND(L)=COND(L)-CONDV(L)         ! CONDP1(L)
C       WRITE(6,*) L,DWCU,WCU(L),CONDV(L),CONDP1(L),CONDP(L),COND(L)
#ifdef TRACERS_WATER
      FQCONDV=CONDV(L)/(COND(L)+CONDV(L))
      TRCONDV(:,L)=FQCONDV*TRCOND(:,L)
      TRCOND (:,L)=TRCOND(:,L)-TRCONDV(:,L)
#endif
      IF (LMAX.LT.LM) GO TO 220   ! CHECK FOR NEXT POSSIBLE LMAX
C**** UPDATE CHANGES CARRIED BY THE PLUME IN THE TOP CLOUD LAYER
  340 IF(LMIN.EQ.LMAX) GO TO 600
      IF(MC1.AND.MCCONT.GT.1) THEN
        IF (.NOT.RFMC1) GO TO 160
      END IF
C     IF(PLE(LMIN)-PLE(LMAX+1).GE.450.) THEN
C       DO L=LMIN,LMAX                 ! for checking WCU and ENT
C       IF(IC.EQ.1) THEN
C         SAVWL(L)=WCU(L)
C         SAVE1L(L)=ENT(L)
C       ELSE
C         SAVWL1(L)=WCU(L)
C         SAVE2L(L)=ENT(L)
C       END IF
C       END DO
C     ENDIF
C     WRITE(6,198) IC,LMIN,LMAX
CCC   WRITE(6,199) SAVWL(5),SAVWL1(5),SAVE1L(5),SAVE2L(5)
CCC   WRITE(6,199) SAVWL1
CCC   WRITE(6,199) SAVE1L
CCC   WRITE(6,199) SAVE2L
C 198 FORMAT(1X,'WCU WCU5 ENT1 ENT2 FOR IC LMIN LMAX=',3I8)
C 199 FORMAT(1X,12E15.3)
      IF(TPSAV(LMAX).GE.TF) LFRZ=LMAX
      DM(LMAX)=DM(LMAX)+MPMAX
      DSM(LMAX)=DSM(LMAX)+SMPMAX
      DSMOM(xymoms,LMAX)=DSMOM(xymoms,LMAX) + SMOMPMAX(xymoms)
      DQM(LMAX)=DQM(LMAX)+QMPMAX
      DQMOM(xymoms,LMAX)=DQMOM(xymoms,LMAX) + QMOMPMAX(xymoms)
#ifdef TRACERS_ON
C**** Add plume tracers at LMAX
      DTM(LMAX,1:NTX) = DTM(LMAX,1:NTX) + TMPMAX(1:NTX)
      DTMOM(xymoms,LMAX,1:NTX) =
     *   DTMOM(xymoms,LMAX,1:NTX) + TMOMPMAX(xymoms,1:NTX)
#endif
      CCM(LMAX)=0.
      DO K=1,KMAX
         DUM(K,LMAX)=DUM(K,LMAX)+UMP(K)
         DVM(K,LMAX)=DVM(K,LMAX)+VMP(K)
      ENDDO
      CDHM=0.
      IF(MINLVL.GT.LMIN) MINLVL=LMIN
      IF(MAXLVL.LT.LMAX) MAXLVL=LMAX
      IF(LMCMIN.EQ.0) LMCMIN=LMIN
      IF(LMCMAX.LT.MAXLVL) LMCMAX=MAXLVL
C****
C**** PROCESS OF DOWNDRAFTING
C****
      LDMIN=LMIN
      EDRAFT=0.
      IF(ETADN.GT.1d-10) THEN
      CONSUM=0.
      DDRSUM=0.
      SMSUM=0.
      QMSUM=0.
      DO 347 L=LMIN,LDRAFT
      DDRSUM=DDRSUM+DDR(L)
      SMSUM=SMSUM+SMDNL(L)
      QMSUM=QMSUM+QMDNL(L)
  347 CONSUM=CONSUM+COND(L)
      DDRAFT=DDR(LDRAFT)
      DDROLD=DDRAFT
      SMDN=SMDNL(LDRAFT)
      QMDN=QMDNL(LDRAFT)
      SMOMDN(xymoms)=SMOMDNL(xymoms,LDRAFT)
      QMOMDN(xymoms)=QMOMDNL(xymoms,LDRAFT)
        DO K=1,KMAX
        UMDN(K)=UMDNL(K,LDRAFT)
        VMDN(K)=VMDNL(K,LDRAFT)
        ENDDO
#ifdef TRACERS_ON
      TMDN(:)=TMDNL(LDRAFT,:)
      TMOMDN(xymoms,:)=TMOMDNL(xymoms,LDRAFT,:)
#endif
      TNX=SMSUM*PLK(LMIN)/DDRSUM
      QNX=QMSUM/DDRSUM
      LHX=LHE
      IF(TPSAV(LMIN).LT.TF) LHX=LHS
      SLH=LHX*BYSHA
      QSATC=QSAT(TNX,LHX,PL(LMIN))
      DQ=(QSATC-QNX)/(1.+SLH*QSATC*DQSATDT(TNX,LHX))
      DQRAT=DQ*DDRSUM/(CONSUM+teeny)
      DO 346 L=LDRAFT,1,-1
      LHX=LHE
      IF (L.GE.LMIN) THEN  ! avoids reference to uninitiallised value
        IF(TPSAV(L).LT.TF) LHX=LHS
      END IF
      SLH=LHX*BYSHA
C     TNX=SMDN*PLK(L)/DDRAFT
C     QNX=QMDN/DDRAFT
C     QSATC=QSAT(TNX,LHX,PL(L))
C     DQ=(QSATC-QNX)/(1.+SLH*QSATC*DQSATDT(TNX,LHX))
      DQEVP=DQRAT*COND(L)                      ! DQ*DDRAFT
      IF(DQEVP.GT.COND(L)) DQEVP=COND(L)
      IF (L.LT.LMIN) DQEVP=0.
      FSEVP = 0
      IF (ABS(PLK(L)*SMDN).gt.teeny) FSEVP = SLH*DQEVP/(PLK(L)*SMDN)
      SMDN=SMDN-SLH*DQEVP/PLK(L)
      SMOMDN(xymoms)=SMOMDN(xymoms)*(1.-FSEVP)
      FQEVP = 0
      IF (COND(L).gt.0.) FQEVP = DQEVP/COND(L)
      QMDN=QMDN+DQEVP
      COND(L)=COND(L)-DQEVP
      TAUMCL(L)=TAUMCL(L)-DQEVP*FMC1
      CDHEAT(L)=CDHEAT(L)-DQEVP*SLH
      EVPSUM=EVPSUM+DQEVP*SLH
#ifdef TRACERS_WATER
C**** RE-EVAPORATION OF TRACERS IN DOWNDRAFTS
C**** (If 100% evaporation, allow all tracers to evaporate completely.)
      DO N=1,NTX
        IF(FQEVP.eq.1.) THEN                 ! total evaporation
          TMDN(N)     = TMDN(N) + TRCOND(N,L)
#ifdef TRDIAG_WETDEPO
          IF (diag_wetdep == 1)
     &         trdvap_mc(l,n)=trdvap_mc(l,n)+trcond(n,l)
#endif
          TRCOND(N,L) = 0.d0
        ELSE ! otherwise, tracers evaporate dependent on type of tracer
          CALL GET_EVAP_FACTOR(N,TNX,LHX,.FALSE.,1d0,FQEVP,FQEVPT,ntix)
          TMDN(N)     = TMDN(N)     + FQEVPT * TRCOND(N,L)
          TRCOND(N,L) = TRCOND(N,L) - FQEVPT * TRCOND(N,L)
#ifdef TRDIAG_WETDEPO
          IF (diag_wetdep == 1)
     &         trdvap_mc(l,n)=trdvap_mc(l,n)+fqevpt*trcond(n,l)
#endif
        END IF
      END DO
#endif
C**** ENTRAINMENT OF DOWNDRAFTS
      IF(L.LT.LDRAFT.AND.L.GT.1) THEN
        DDRUP=DDRAFT
        DDRAFT=DDRAFT+DDROLD*ETAL(L)   ! add in entrainment
C       DDRAFT=DDRAFT*(1.+ETAL(L))     ! add in entrainment
        IF(DDRUP.GT.DDRAFT) DDRAFT=DDRUP
        IF(DDRAFT.GT..95d0*(AIRM(L-1)+DMR(L-1)))
     *    DDRAFT=.95d0*(AIRM(L-1)+DMR(L-1))
        EDRAFT=DDRAFT-DDRUP
        IF (EDRAFT.gt.0) THEN  ! usual case, entrainment into downdraft
          FENTRA=EDRAFT*BYAM(L)
          SENV=SM(L)*BYAM(L)
          QENV=QM(L)*BYAM(L)
          SMDN=SMDN+EDRAFT*SENV
          QMDN=QMDN+EDRAFT*QENV
          SMOMDN(xymoms)= SMOMDN(xymoms)+ SMOM(xymoms,L)*FENTRA
          QMOMDN(xymoms)= QMOMDN(xymoms)+ QMOM(xymoms,L)*FENTRA
          DSMR(L)=DSMR(L)-EDRAFT*SENV
          DSMOMR(:,L)=DSMOMR(:,L)-SMOM(:,L)*FENTRA
          DQMR(L)=DQMR(L)-EDRAFT*QENV
          DQMOMR(:,L)=DQMOMR(:,L)-QMOM(:,L)*FENTRA
          DMR(L)=DMR(L)-EDRAFT
          DO K=1,KMAX        ! add in momentum entrainment
            UMTEMP=0.7*DDRAFT**2*(U_0(K,L+1)-U_0(K,L))/(PL(L)-PL(L+1))
            VMTEMP=0.7*DDRAFT**2*(V_0(K,L+1)-V_0(K,L))/(PL(L)-PL(L+1))
            UMDN(K)=UMDN(K)+FENTRA*UM(K,L)-UMTEMP
            VMDN(K)=VMDN(K)+FENTRA*VM(K,L)-VMTEMP
            DUM(K,L)=DUM(K,L)-FENTRA*UM(K,L)+UMTEMP
            DVM(K,L)=DVM(K,L)-FENTRA*VM(K,L)+VMTEMP
          ENDDO
#ifdef TRACERS_ON
          Tenv(1:NTX)=tm(l,1:NTX)/airm(l)
          TMDN(1:NTX)=TMDN(1:NTX)+EDRAFT*Tenv(1:NTX)
          TMOMDN(xymoms,1:NTX)= TMOMDN(xymoms,1:NTX)+ TMOM(xymoms,L
     *         ,1:NTX)*FENTRA
          DTMR(L,1:NTX)=DTMR(L,1:NTX)-EDRAFT*TENV(1:NTX)
          DTMOMR(:,L,1:NTX)=DTMOMR(:,L,1:NTX)-TMOM(:,L,1:NTX)*FENTRA
#endif
        ELSE  ! occasionally detrain into environment if ddraft too big
          FENTRA=EDRAFT/DDRUP  ! < 0
          DSM(L)=DSM(L)-FENTRA*SMDN
          DSMOM(xymoms,L)=DSMOM(xymoms,L)-SMOMDN(xymoms)*FENTRA
          DQM(L)=DQM(L)-FENTRA*QMDN
          DQMOM(xymoms,L)=DQMOM(xymoms,L)-QMOMDN(xymoms)*FENTRA
          SMDN=SMDN*(1+FENTRA)
          QMDN=QMDN*(1+FENTRA)
          SMOMDN(xymoms)= SMOMDN(xymoms)*(1+FENTRA)
          QMOMDN(xymoms)= QMOMDN(xymoms)*(1+FENTRA)
          DM(L)=DM(L)-EDRAFT
          DO K=1,KMAX          ! add in momentum detrainment
            UMTEMP=0.7*DDRAFT**2*(U_0(K,L+1)-U_0(K,L))/(PL(L)-PL(L+1))
            VMTEMP=0.7*DDRAFT**2*(V_0(K,L+1)-V_0(K,L))/(PL(L)-PL(L+1))
            UMDN(K)=UMDN(K)*(1.+FENTRA)-UMTEMP
            VMDN(K)=VMDN(K)*(1.+FENTRA)-VMTEMP
            DUM(K,L)=DUM(K,L)-FENTRA*UMDN(K)+UMTEMP
            DVM(K,L)=DVM(K,L)-FENTRA*VMDN(K)+VMTEMP
          ENDDO
#ifdef TRACERS_ON
          DTM(L,1:NTX)=DTM(L,1:NTX)-FENTRA*TMDN(1:NTX)
          DTMOM(xymoms,L,1:NTX)=DTMOM(xymoms,L,1:NTX)-
     *         TMOMDN(xymoms,1:NTX)*FENTRA
          TMDN(1:NTX)=TMDN(1:NTX)*(1.+FENTRA)
          TMOMDN(xymoms,1:NTX)= TMOMDN(xymoms,1:NTX)*(1.+FENTRA)
#endif
        END IF
      ENDIF
C     IF(L.GT.1) DDM(L-1)=DDRAFT
      LDMIN=L
C**** ALLOW FOR DOWNDRAFT TO DROP BELOW LMIN, IF IT'S NEGATIVE BUOYANT
      IF (L.LE.LMIN.AND.L.GT.1) THEN
        SMIX=SMDN/DDRAFT
        IF (SMIX.GE.(SM1(L-1)*BYAM(L-1))) GO TO 345
      ENDIF
      IF(L.GT.1) THEN
        DDM(L-1)=DDRAFT     ! IF(L.GT.1) DDM(L-1)=DDRAFT
        DDROLD=DDRAFT
        DDRAFT=DDRAFT+DDR(L-1)    ! add in downdraft one layer below
        SMDN=SMDN+SMDNL(L-1)
        QMDN=QMDN+QMDNL(L-1)
        SMOMDN(xymoms)=SMOMDN(xymoms)+SMOMDNL(xymoms,L-1)
        QMOMDN(xymoms)=QMOMDN(xymoms)+QMOMDNL(xymoms,L-1)
        DO K=1,KMAX
        UMDN(K)=UMDN(K)+UMDNL(K,L-1)
        VMDN(K)=VMDN(K)+VMDNL(K,L-1)
        ENDDO
#ifdef TRACERS_ON
        DO N=1,NTX
          TMDN(N)=TMDN(N)+TMDNL(L-1,N)
          TMOMDN(xymoms,N)=TMOMDN(xymoms,N)+TMOMDNL(xymoms,L-1,N)
        END DO
#endif
      ENDIF
  346 CONTINUE
  345 DSM(LDMIN)=DSM(LDMIN)+SMDN
      DSMOM(xymoms,LDMIN)=DSMOM(xymoms,LDMIN) + SMOMDN(xymoms)
      DQM(LDMIN)=DQM(LDMIN)+QMDN
      DQMOM(xymoms,LDMIN)=DQMOM(xymoms,LDMIN) + QMOMDN(xymoms)
      TDNL(LDMIN)=SMDN*PLK(LDMIN)/(DDRAFT+teeny)
      QDNL(LDMIN)=QMDN/(DDRAFT+teeny)
#ifdef TRACERS_ON
      DTM(LDMIN,1:NTX) = DTM(LDMIN,1:NTX) + TMDN(1:NTX)
      DTMOM(xymoms,LDMIN,1:NTX) = DTMOM(xymoms,LDMIN,1:NTX) +
     *     TMOMDN(xymoms,1:NTX)
      TRDNL(1:NTX,LDMIN)=TMDN(1:NTX)/(DDRAFT+teeny)
#endif
      DO K=1,KMAX
      DUM(K,LDMIN)=DUM(K,LDMIN)+UMDN(K)
      DVM(K,LDMIN)=DVM(K,LDMIN)+VMDN(K)
      ENDDO
      DM(LDMIN)=DM(LDMIN)+DDRAFT
      END IF
C****
C**** SUBSIDENCE AND MIXING
C****
C**** Calculate vertical mass fluxes (Note CM for subsidence is defined
C**** in opposite sense than normal (positive is down))
      DO L=0,LDMIN-1
        CM(L) = 0.
      END DO
      DO L=LDMIN,LMAX
        CM(L) = CM(L-1) - DM(L) - DMR(L)
        SMT(L)=SM(L)    ! Save profiles for diagnostics
        QMT(L)=QM(L)
      END DO
      DO L=LMAX+1,LM
        CM(L) = 0.
      END DO
C**** simple upwind scheme for momentum
      ALPHA=0.
      DO 380 L=LDMIN,LMAX
      CLDM=CCM(L)
      IF(L.LT.LDRAFT.AND.ETADN.GT.1d-10) CLDM=CCM(L)-DDM(L)
      IF(MC1) VSUBL(L)=100.*CLDM*RGAS*TL(L)/(PL(L)*GRAV*DTsrc)
      BETA=CLDM*BYAM(L+1)
      IF(CLDM.LT.0.) BETA=CLDM*BYAM(L)
      BETAU=BETA
      ALPHAU=ALPHA
      IF(BETA.LT.0.) BETAU=0.
      IF(ALPHA.LT.0.) ALPHAU=0.
      DO K=1,KMAX
       UM(K,L)=
     *    UM(K,L)+RA(K)*(-ALPHAU*UM(K,L)+BETAU*UM(K,L+1)+DUM(K,L))
       VM(K,L)=
     *    VM(K,L)+RA(K)*(-ALPHAU*VM(K,L)+BETAU*VM(K,L+1)+DVM(K,L))
      ENDDO
  380 ALPHA=BETA
C**** Subsidence uses Quadratic Upstream Scheme for QM and SM
      ML(LDMIN:LMAX) = AIRM(LDMIN:LMAX) +   DMR(LDMIN:LMAX)
      SM(LDMIN:LMAX) =   SM(LDMIN:LMAX) +  DSMR(LDMIN:LMAX)
      SMOM(:,LDMIN:LMAX) =  SMOM(:,LDMIN:LMAX) + DSMOMR(:,LDMIN:LMAX)
C****
      nsub = lmax-ldmin+1
      cmneg(ldmin:lmax)=-cm(ldmin:lmax)
      cmneg(lmax)=0. ! avoid roundoff error (esp. for qlimit)
      call adv1d(sm(ldmin),smom(1,ldmin), f(ldmin),fmom(1,ldmin),
     &     ml(ldmin),cmneg(ldmin), nsub,.false.,1, zdir,ierrt,lerrt)
      SM(LDMIN:LMAX) =   SM(LDMIN:LMAX) +   DSM(LDMIN:LMAX)
      SMOM(:,LDMIN:LMAX) =  SMOM(:,LDMIN:LMAX) +  DSMOM(:,LDMIN:LMAX)
      ierr=max(ierrt,ierr) ; lerr=max(lerrt+ldmin-1,lerr)
C****
      ML(LDMIN:LMAX) = AIRM(LDMIN:LMAX) +   DMR(LDMIN:LMAX)
      QM(LDMIN:LMAX) =   QM(LDMIN:LMAX) +  DQMR(LDMIN:LMAX)
      QMOM(:,LDMIN:LMAX) =  QMOM(:,LDMIN:LMAX) + DQMOMR(:,LDMIN:LMAX)
      call adv1d(qm(ldmin),qmom(1,ldmin), f(ldmin),fmom(1,ldmin),
     &     ml(ldmin),cmneg(ldmin), nsub,.true.,1, zdir,ierrt,lerrt)
      QM(LDMIN:LMAX) =   QM(LDMIN:LMAX) +   DQM(LDMIN:LMAX)
      QMOM(:,LDMIN:LMAX) =  QMOM(:,LDMIN:LMAX) +  DQMOM(:,LDMIN:LMAX)
      ierr=max(ierrt,ierr) ; lerr=max(lerrt+ldmin-1,lerr)
C**** diagnostics
      DO L=LDMIN,LMAX
        FCDH=0.
        IF(L.EQ.LMAX) FCDH=CDHSUM-(CDHSUM-CDHDRT)*.5*ETADN+CDHM
        FCDH1=0.
        IF(L.EQ.LDMIN) FCDH1=(CDHSUM-CDHDRT)*.5*ETADN-EVPSUM
        MCFLX(L)=MCFLX(L)+CCM(L)*FMC1
        DGDSM(L)=DGDSM(L)+(PLK(L)*(SM(L)-SMT(L))-FCDH-FCDH1)*FMC1
        IF(PLE(LMAX+1).GT.700.d0) DGSHLW(L)=DGSHLW(L)+
     *    (PLK(L)*(SM(L)-SMT(L))-FCDH-FCDH1)*FMC1
        IF(PLE(LMIN)-PLE(LMAX+1).GE.450.d0) DGDEEP(L)=DGDEEP(L)+
     *    (PLK(L)*(SM(L)-SMT(L))-FCDH-FCDH1)*FMC1
        DTOTW(L)=DTOTW(L)+SLHE*(QM(L)-QMT(L)+COND(L))*FMC1
        DGDQM(L)=DGDQM(L)+SLHE*(QM(L)-QMT(L))*FMC1
        DDMFLX(L)=DDMFLX(L)+DDM(L)*FMC1
C       IF(L.EQ.1) THEN
C         IF(DDMFLX(1).GT.0.) WRITE(6,*) 'DDM TDN1 QDN1=',
C    *      DDMFLX(1),TDNL(1),QDNL(1)
C       END IF
        IF(QM(L).LT.0.d0) WRITE(0,*) ' Q neg: it,i,j,l,q',
     *   itime,i_debug,j_debug,l,qm(l)
      END DO
#ifdef TRACERS_ON
C**** Subsidence of tracers by Quadratic Upstream Scheme
      DO N=1,NTX
c        if (debug.and.n.eq.1) print*,"cld0",i_debug,ldmin,lmax
c     *       ,DTMR(LDMIN:LMAX,N),DTM(LDMIN:LMAX,N)
c        if (debug.and.n.eq.1) print*,"cld1",TM(LDMIN:LMAX,N)
      ML(LDMIN:LMAX) =  AIRM(LDMIN:LMAX) +    DMR(LDMIN:LMAX)
      TM(LDMIN:LMAX,N) =  TM(LDMIN:LMAX,N) + DTMR(LDMIN:LMAX,N)
      TMOM(:,LDMIN:LMAX,N) = TMOM(:,LDMIN:LMAX,N)+DTMOMR(:,LDMIN:LMAX,N)
      call adv1d(tm(ldmin,n),tmom(1,ldmin,n), f(ldmin),fmom(1,ldmin),
     &     ml(ldmin),cmneg(ldmin), nsub,.true.,1, zdir,ierrt,lerrt)
      TM(LDMIN:LMAX,N) = TM(LDMIN:LMAX,N) +   DTM(LDMIN:LMAX,N)
c        if (debug .and.n.eq.1) print*,"cld2",TM(LDMIN:LMAX,N)
      TMOM(:,LDMIN:LMAX,N) = TMOM(:,LDMIN:LMAX,N) +DTMOM(:,LDMIN:LMAX,N)
      ierr=max(ierrt,ierr) ; lerr=max(lerrt+ldmin-1,lerr)
      END DO
#endif
C**** save new 'environment' profile for static stability calc.
      DO L=1,LM
        SM1(L)=SM(L)
        QM1(L)=QM(L)
      END DO
#ifdef TRACERS_ON
      TM1(:,1:NTX) = TM(:,1:NTX)
#endif
C****
C**** Partition condensate into precipitation and cloud water
C****
      COND(LMAX)=COND(LMAX)+CONDV(LMAX)
#ifdef TRACERS_WATER
      TRCOND(:,LMAX)=TRCOND(:,LMAX)+TRCONDV(:,LMAX)
#endif
      IF(PLE(LMIN)-PLE(LMAX+1).GE.450.) THEN      ! always?
        DO L=LMAX,LMIN,-1
          IF(COND(L).LT.CONDP(L)) CONDP(L)=COND(L)
          FCLW=0.
          IF (COND(L).GT.0) FCLW=(COND(L)-CONDP(L))/COND(L)
          SVWMXL(L)=SVWMXL(L)+FCLW*COND(L)*BYAM(L)*FMC1
          COND(L)=CONDP(L)
#ifdef TRACERS_WATER
C**** Apportion cloud tracers and condensation
C**** Note that TRSVWML is in mass units unlike SVWMX
          TRSVWML(1:NTX,L) = TRSVWML(1:NTX,L) + FCLW*TRCOND(1:NTX,L)
     *         *FMC1
#ifdef TRDIAG_WETDEPO
          IF (diag_wetdep == 1)
     &        trflcw_mc(l,1:ntx)=trflcw_mc(l,1:ntx)+fclw*trcond(1:ntx,l)
#endif
          TRCOND(1:NTX,L) = (1.-FCLW)*TRCOND(1:NTX,L)
#endif
        END DO
      END IF
C****
C**** REEVAPORATION AND PRECIPITATION
C****
      PRCP=COND(LMAX)
      PRHEAT=CDHEAT(LMAX)
#ifdef TRACERS_WATER
C**** Tracer precipitation
C Note that all of the tracers that condensed do not precipitate here,
C since a fraction (FCLW) of TRCOND was removed above.
      TRPRCP(1:NTX) = TRCOND(1:NTX,LMAX)
#ifdef TRDIAG_WETDEPO
      IF (diag_wetdep == 1)
     &     trprcp_mc(lmax,1:ntx)=trprcp_mc(lmax,1:ntx)
     &     +trcond(1:ntx,lmax)
#endif
#endif
         DPHASE(LMAX)=DPHASE(LMAX)+(CDHSUM-(CDHSUM-CDHDRT)*.5*ETADN+
     *                CDHM)*FMC1
         IF(PLE(LMAX+1).GT.700.d0) DPHASHLW(LMAX)=DPHASHLW(LMAX)+
     *     (CDHSUM-(CDHSUM-CDHDRT)*.5*ETADN+CDHM)*FMC1
         IF(PLE(LMIN)-PLE(LMAX+1).GE.450.d0) DPHADEEP(LMAX)=
     *     DPHADEEP(LMAX)+(CDHSUM-(CDHSUM-CDHDRT)*.5*ETADN+CDHM)*FMC1
      DO 540 L=LMAX-1,1,-1
C     IF(PRCP.LE.0.) GO TO 530    ! moved to after computing CLDMCL
C                             ! WTURB=SQRT(.66666667*EGCM(L,I,J))
      TTURB=HPBL/WTURB(L)
      TRATIO=TTURB/DTsrc
      FCLOUD=CCMUL*CCM(L)*BYPBLM*TRATIO
      IF(TRATIO.GT.1.) FCLOUD=CCMUL*CCM(L)*BYPBLM
      IF(LMIN.GT.DCL) FCLOUD=CCMUL*CCM(L)/AIRM0
      IF(PLE(LMIN)-PLE(L+2).GE.450.) FCLOUD=5.d0*FCLOUD
      IF(L.LT.LMIN) THEN
        FCLOUD=CCMUL*CCM(LMIN)*BYPBLM*TRATIO
        IF(TRATIO.GT.1.) FCLOUD=CCMUL*CCM(LMIN)*BYPBLM
        IF(LMIN.GT.DCL) FCLOUD=CCM(LMIN)/AIRM0
      END IF
      IF(PLE(LMIN)-PLE(LMAX+1).LT.450.) THEN
        IF(L.EQ.LMAX-1) THEN
          FCLOUD=CCMUL2*CCM(L)*BYPBLM*TRATIO
          IF(TRATIO.GT.1.) FCLOUD=CCMUL2*CCM(L)*BYPBLM
          IF(LMIN.GT.DCL) FCLOUD=CCMUL2*CCM(L)/AIRM0
        END IF
        IF(L.LT.LMIN) FCLOUD=0.
      ENDIF
      IF(FCLOUD.GT.1.) FCLOUD=1.
      FEVAP=.5*CCM(L)*BYAM(L+1)
      IF(L.LT.LMIN) FEVAP=.5*CCM(LMIN)*BYAM(LMIN+1)
      IF(FEVAP.GT..5) FEVAP=.5
      CLDMCL(L+1)=MIN(CLDMCL(L+1)+FCLOUD*FMC1,FMC1)
      CLDREF=CLDMCL(L+1)
      IF(PLE(LMAX+1).GT.700..AND.CLDREF.GT.CLDSLWIJ)
     *  CLDSLWIJ=CLDREF
      IF(PLE(LMIN)-PLE(LMAX+1).GE.450..AND.CLDREF.GT.CLDDEPIJ)
     *  CLDDEPIJ=CLDREF
      IF(PRCP.LE.0.) GO TO 530
C**** FORWARD STEP COMPUTES HUMIDITY CHANGE BY RECONDENSATION
C**** Q = Q + F(TOLD,PRHEAT,QOLD+EVAP)
      PRECNVL(L+1)=PRECNVL(L+1)+PRCP*BYGRAV
      MCLOUD=0.
      IF(L.LE.LMIN) MCLOUD=2.*FEVAP*AIRM(L)
      TOLD=SMOLD(L)*PLK(L)*BYAM(L)
      TOLD1=SMOLD(L+1)*PLK(L+1)*BYAM(L+1)
C**** decide whether to melt snow/ice
C     HEAT1=0.
      IF(L.EQ.LFRZ.OR.(L.LE.LMIN.AND.TOLD.GE.TF.AND.TOLD1.LT.TF.AND.L.GT
     *     .LFRZ)) HEAT1(L)=HEAT1(L)+LHM*PRCP*BYSHA
C**** and deal with possible inversions and re-freezing of rain
      IF (TOLD.LT.TF.AND.TOLD1.GT.TF) HEAT1(L)=HEAT1(L)-LHM*PRCP*BYSHA
      TNX=TOLD
      QNX=QMOLD(L)*BYAM(L)
      LHX=LHE
      IF(TNX.LT.TF) LHX=LHS
      IF(L.GT.LMIN) THEN    ! needed to avoid unintiallised value
        IF (TPSAV(L).GE.TF) LHX=LHE
      END IF
      SLH=LHX*BYSHA
      DQSUM=0.
      DO 510 N=1,3
      QSATC=QSAT(TNX,LHX,PL(L))
      DQ=(QSATC-QNX)/(1.+SLH*QSATC*DQSATDT(TNX,LHX))
      TNX=TNX-SLH*DQ
      QNX=QNX+DQ
  510 DQSUM=DQSUM+DQ*MCLOUD
      IF(DQSUM.LT.0.) DQSUM=0.
      IF(DQSUM.GT.PRCP) DQSUM=PRCP
      FPRCP=DQSUM/PRCP
      PRCP=PRCP-DQSUM
C**** UPDATE TEMPERATURE AND HUMIDITY DUE TO NET REEVAPORATION IN CLOUDS
      FSSUM = 0
      IF (ABS(PLK(L)*SM(L)).gt.teeny) FSSUM = (SLH*DQSUM+HEAT1(L))/
     *     (PLK(L)*SM(L))
      SM(L)=SM(L)-(SLH*DQSUM+HEAT1(L))/PLK(L)
      SMOM(:,L) =  SMOM(:,L)*(1.-FSSUM)
      QM(L)=QM(L)+DQSUM
#ifdef TRACERS_WATER
C**** Tracer net re-evaporation
C**** (If 100% evaporation, allow all tracers to evaporate completely.)
      BELOW_CLOUD = L.lt.LMIN
      IF(FPRCP.eq.1.) THEN      !total evaporation
        DO N=1,NTX
          TM(L,N)   = TM(L,N)  + TRPRCP(N)
c         if (debug .and.n.eq.1) print*,"cld2",L,TM(L,N),TRPRCP(N),2
c     *         *FEVAP
#ifdef TRDIAG_WETDEPO
          IF (diag_wetdep == 1)
     &         trnvap_mc(l,n)=trnvap_mc(l,n)+trprcp(n)
#endif
          TRPRCP(N) = 0.d0
        END DO
      ELSE ! otherwise, tracers evaporate dependent on type of tracer
C**** estimate effective humidity
        if (below_cloud) then
          TNX1=(SM(L)*PLK(L)-SLH*DQSUM*(1./(2.*MCLOUD)-1.))*BYAM(L)
          HEFF=MIN(1d0,(QM(L)+DQSUM*(1./(2.*MCLOUD)-1.))*BYAM(L)
     *         /QSAT(TNX1,LHX,PL(L)))
        else
          heff=1.
        end if
        DO N=1,NTX
          CALL GET_EVAP_FACTOR(N,TNX,LHX,BELOW_CLOUD,HEFF,FPRCP,FPRCPT
     *         ,ntix)
          TM(L,N) = TM(L,N)     + FPRCPT*TRPRCP(N)
c          if (debug .and.n.eq.1) print*,"cld3",L,TM(L,N),FPRCP
c     *         ,FPRCPT,TRPRCP(N)
          TRPRCP(N) = TRPRCP(N) - FPRCPT*TRPRCP(N)
#ifdef TRDIAG_WETDEPO
          IF (diag_wetdep == 1)
     &         trnvap_mc(l,n)=trnvap_mc(l,n)+fprcpt*trprcp(n)
#endif
        END DO
      END IF
#ifndef NO_WASHOUT_IN_CLOUDS
      IF (.NOT. below_cloud .AND. prcp > teeny) THEN
c**** Washout of tracers in cloud
        wmxtr=prcp*byam(l)
        precip_mm=prcp*100.*bygrav
        b_beta_DT=fplume
        DO n=1,ntx
          CALL get_wash_factor(n,b_beta_dt,precip_mm,fwasht,tnx,lhx,
     &         wmxtr,fplume,l,tm,trprcp,thlaw,pl(l),ntix)
          trprcp(n)=fwasht*tm(l,n)+trprcp(n)+thlaw
#ifdef TRDIAG_WETDEPO
          IF (diag_wetdep == 1)
     &         trwash_mc(l,n)=trwash_mc(l,n)+fwasht*tm(l,n)+thlaw
#endif
          IF (tm(l,n) > teeny) THEN
            tmfac=thlaw/tm(l,n)
          ELSE
            tmfac=0.
          ENDIF
          tm(l,n)=tm(l,n)*(1.-fwasht)-thlaw
          tmom(xymoms,l,n)=tmom(xymoms,l,n)*(1.-fwasht-tmfac)
        END DO
      ELSE IF (below_cloud .AND. prcp > teeny) THEN
#else
      IF (below_cloud .AND. prcp > teeny) THEN
#endif
C**** WASHOUT of TRACERS BELOW CLOUD
        WMXTR = PRCP*BYAM(L)
        precip_mm = PRCP*100.*bygrav
        b_beta_DT = FPLUME
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
        WA_VOL= precip_mm*DXYPJ
        CALL GET_SULFATE(L,TNX,FPLUME,WA_VOL,WMXTR,SULFIN,
     *       SULFINC,SULFOUT,TR_LEFT,TM,TRPRCP,AIRM,LHX,
     *       DT_SULF_MC(1,L),CLDSAVT)
#endif
        DO N=1,NTX
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      select case (trname(ntix(n)))
      case('SO2','SO4','H2O2_s','H2O2')
      if (trname(ntix(n)).eq."H2O2" .and. coupled_chem.eq.0) goto 402
      if (trname(ntix(n)).eq."H2O2_s" .and. coupled_chem.eq.1) goto 402

          TRPRCP(N)=TRPRCP(N)*(1.+SULFINC(N))
          TM(L,N)=TM(L,N)*(1.+SULFIN(N))
          TMOM(xymoms,L,N)=TMOM(xymoms,L,N) *(1.+SULFIN(N))
          TRCOND(N,L) = TRCOND(N,L)+SULFOUT(N)

 402      CONTINUE

      end select

#endif
cdmk Here I took out GET_COND, since we are below cloud.
cdmk GET_WASH now has gas dissolution, extra arguments
          CALL GET_WASH_FACTOR(N,b_beta_DT,precip_mm,FWASHT
     *         ,TNX,LHX,WMXTR,FPLUME,L,TM,TRPRCP,THLAW,pl(l),ntix)
          TRPRCP(N) = FWASHT*TM(L,N)+TRPRCP(N)+THLAW
#ifdef TRDIAG_WETDEPO
          IF (diag_wetdep == 1)
     &         trwash_mc(l,n)=trwash_mc(l,n)+fwasht*tm(l,n)+thlaw
#endif
          IF (TM(L,N).GT.teeny) THEN
            TMFAC=THLAW/TM(L,N)
          ELSE
            TMFAC=0.
          ENDIF
          TM(L,N)=TM(L,N)*(1.-FWASHT)-THLAW
c          if (debug .and.n.eq.1) print*,"cld4",L,TM(L,N),FWASHT
c     *         ,THLAW
          TMOM(xymoms,L,N)=TMOM(xymoms,L,N) *
     &                (1.-FWASHT-TMFAC)
        END DO
      END IF
#endif
         FCDH1=0.
         IF(L.EQ.LDMIN) FCDH1=(CDHSUM-CDHDRT)*.5*ETADN-EVPSUM
         DPHASE(L)=DPHASE(L)-(SLH*DQSUM-FCDH1+HEAT1(L))*FMC1
         IF(PLE(LMAX+1).GT.700.d0) DPHASHLW(L)=DPHASHLW(L)-
     *     (SLH*DQSUM-FCDH1+HEAT1(L))*FMC1
         IF(PLE(LMIN)-PLE(LMAX+1).GE.450.d0) DPHADEEP(L)=DPHADEEP(L)-
     *     (SLH*DQSUM-FCDH1+HEAT1(L))*FMC1
         DQCOND(L)=DQCOND(L)-SLH*DQSUM*FMC1
C**** ADD PRECIPITATION AND LATENT HEAT BELOW
  530 PRHEAT=CDHEAT(L)+SLH*PRCP
      PRCP=PRCP+COND(L)
#ifdef TRACERS_WATER
      TRPRCP(1:NTX) = TRPRCP(1:NTX) + TRCOND(1:NTX,L)
#ifdef TRDIAG_WETDEPO
      IF (diag_wetdep == 1)
     &     trprcp_mc(l,1:ntx)=trprcp_mc(l,1:ntx)+trcond(1:ntx,l)
#endif
#ifdef TRACERS_SPECIAL_O18
C**** Isotopic equilibration of liquid precip with water vapour
      IF (LHX.eq.LHE .and. PRCP.gt.0) THEN
        DO N=1,NTX
          CALL ISOEQUIL(NTIX(N),TNX,.TRUE.,QM(L),PRCP,TM(L,N),TRPRCP(N)
     *         ,0.5d0)
        END DO
      END IF
#endif
#endif
  540 CONTINUE
C****
      IF(PRCP.GT.0.) THEN
        IF(PLE(LMIN)-PLE(LMAX+1).LT.450.) THEN
          CLDMCL(1)=MIN(CLDMCL(1),FMC1)
        ELSE
          CLDMCL(1)=MIN(CLDMCL(1)+CCM(LMIN)*BYPBLM*FMC1,FMC1)
        END IF
      END IF
C     IF(PRCP.GT.0.) CLDMCL(1)=MIN(CLDMCL(1)+CCM(LMIN)*BYAM(LMIN+1)*FMC1
C    *     ,FMC1)
      PRCPMC=PRCPMC+PRCP*FMC1
#ifdef TRACERS_WATER
      TRPRMC(1:NTX) = TRPRMC(1:NTX) + TRPRCP(1:NTX)*FMC1
#endif
      IF(LMCMIN.GT.LDMIN) LMCMIN=LDMIN
C****
C**** END OF LOOP OVER CLOUD TYPES
C****
      MC1=.FALSE.                        !!!
  570 CONTINUE
C****
C**** END OF OUTER LOOP OVER CLOUD BASE
C****
  600 CONTINUE
      IF(LMCMIN.GT.0) THEN
C**** set fssl array
        DO L=1,LM
          FSSL(L)=1.-FMC1
C         FMCL(L)=FMC1                 ! may be generalized
        END DO
C**** ADJUSTMENT TO CONSERVE CP*T
        SUMAJ=0.
        SUMDP=0.
        DO L=LMCMIN,LMCMAX
          SUMDP=SUMDP+AIRM(L)*FMC1
          SUMAJ=SUMAJ+DGDSM(L)
        END DO
        DO L=LMCMIN,LMCMAX
          DGDSM(L)=DGDSM(L)-SUMAJ*AIRM(L)*FMC1/SUMDP
          SM(L)=SM(L)-SUMAJ*AIRM(L)/(SUMDP*PLK(L))
        END DO
C**** LOAD MASS EXCHANGE ARRAY FOR GWDRAG
        AIRXL = 0.
        DO L=LMCMIN,LMCMAX
          AIRXL = AIRXL+MCFLX(L)
        END DO
      END IF
C**** CALCULATE OPTICAL THICKNESS
      WCONST=WMU*(1.-PEARTH)+WMUL*PEARTH
      WMSUM=0.
#ifdef CLD_AER_CDNC
      WMCLWP=0.
      WMCTWP=0.
      ACDNWM=0.
      ACDNIM=0.
      AREWM=0.
      AREIM=0.
      ALWWM=0.
      ALWIM=0.
      NMCW=0
      NMCI=0
#endif
      DO L=1,LMCMAX
         TL(L)=(SM(L)*BYAM(L))*PLK(L)
         TEMWM=(TAUMCL(L)-SVWMXL(L)*AIRM(L))*1.d2*BYGRAV
         IF(TL(L).GE.TF) WMSUM=WMSUM+TEMWM
#ifdef CLD_AER_CDNC
         WMCTWP=WMCTWP+TEMWM
         IF(TL(L).GE.TF) WMCLWP=WMCLWP+TEMWM
#endif
         IF(CLDMCL(L).GT.0.) THEN
               TAUMCL(L)=AIRM(L)*COETAU
            IF(L.EQ.LMCMAX .AND. PLE(LMCMIN)-PLE(LMCMAX+1).LT.450.)
     *         TAUMCL(L)=AIRM(L)*.02d0
            IF(L.LE.LMCMIN .AND. PLE(LMCMIN)-PLE(LMCMAX+1).GE.450.)
     *         TAUMCL(L)=AIRM(L)*.02d0
         END IF
         IF(SVLATL(L).EQ.0.) THEN
            SVLATL(L)=LHE
            IF ( (TPSAV(L).gt.0. .and. TPSAV(L).LT.TF) .or.
     *           (TPSAV(L).eq.0. .and. TL(L).lt.TF) ) SVLATL(L)=LHS
         ENDIF
         IF(SVWMXL(L).GT.0.) THEN
            FCLD=CLDMCL(L)+1.E-20
            TEM=1.d5*SVWMXL(L)*AIRM(L)*BYGRAV
            WTEM=1.d5*SVWMXL(L)*PL(L)/(FCLD*TL(L)*RGAS)
            IF(SVLATL(L).EQ.LHE.AND.SVWMXL(L)/FCLD.GE.WCONST*1.d-3)
     *           WTEM=1d2*WCONST*PL(L)/(TL(L)*RGAS)
            IF(SVLATL(L).EQ.LHS.AND.SVWMXL(L)/FCLD.GE.WMUI*1.d-3)
     *           WTEM=1d2*WMUI*PL(L)/(TL(L)*RGAS)
            IF(WTEM.LT.1.d-10) WTEM=1.d-10
C**   Set CDNC for moist conv. clds (const at present)
              MNdO = 59.68d0/(RWCLDOX**3)
              MNdL = 174.d0
              MNdI = 0.06417127d0
#ifdef CLD_AER_CDNC
             MNdO=MCDNO1
             MNdL=MCDNL1
#endif
              MCDNCW=MNdO*(1.-PEARTH)+MNdL*PEARTH
              MCDNCI=MNdI
            IF(SVLATL(L).EQ.LHE)  THEN
!              RCLD=(RWCLDOX*10.*(1.-PEARTH)+7.0*PEARTH)*(WTEM*4.)**BY3
               RCLD=RCLDX*100.d0*(WTEM/(2.d0*BY3*TWOPI*MCDNCW))**BY3
             ELSE
!              RCLD=25.0*(WTEM/4.2d-3)**BY3 * (1.+pl(l)*xRICld)
               RCLD=RCLDX*100.d0*(WTEM/(2.d0*BY3*TWOPI*MCDNCI))**BY3
     *              *(1.+pl(l)*xRICld)
            END IF
            RCLDE=RCLD/BYBR   !  effective droplet radius in anvil
#ifdef CLD_AER_CDNC
C** Using the Liu and Daum paramet, Nature, 2002, Oct 10, Vol 419
C** for spectral dispersion effects on droplet size distribution
C** central value of 0.003 for alfa:Rotstayn&Daum, J.Clim,2003,16,21, Nov 2003.
      Repsi=1.d0 - 0.7d0*exp(-0.003d0*MCDNCW)
      Repsis=Repsi*Repsi
      Rbeta=(((1.d0+2.d0*Repsis)**0.667d0))/((1.d0+Repsis)**by3)
      RCLDE=RCLD*Rbeta
c     write(6,*)"RCLD",RCLDE,RCLD,Rbeta,WTEM,L,MCDNCW
#endif
            CSIZEL(L)=RCLDE   !  effective droplet radius in anvil
#ifdef CLD_AER_CDNC
            if (FCLD.gt.1.d-5.and.SVLATL(L).eq.LHE) then
              ACDNWM(L)= MCDNCW
              AREWM(L) = RCLDE
              ALWWM(L)= WTEM   ! cld water density in g m-3
              NMCW  = NMCW+1
            elseif(FCLD.gt.1.d-5.and.SVLATL(L).eq.LHS) then
              ACDNIM(L)= MCDNCI
              AREIM(L) = RCLDE
              ALWIM(L) = WTEM
              NMCI  = NMCI+1
            ENDIF
#endif
            TAUMCL(L)=1.5*TEM/(FCLD*RCLDE+1.E-20)
            IF(TAUMCL(L).GT.100.) TAUMCL(L)=100.
         END IF
         IF(TAUMCL(L).LT.0..and.CLDMCL(L).le.0.) TAUMCL(L)=0.
#if (defined TRACERS_WATER) && (defined TRDIAG_WETDEPO)
         IF (diag_wetdep == 1) THEN
           trcond_mc(l,1:ntx)=trcond_mc(l,1:ntx)*fmc1
           trdvap_mc(l,1:ntx)=trdvap_mc(l,1:ntx)*fmc1
           trflcw_mc(l,1:ntx)=trflcw_mc(l,1:ntx)*fmc1
           trprcp_mc(l,1:ntx)=trprcp_mc(l,1:ntx)*fmc1
           trnvap_mc(l,1:ntx)=trnvap_mc(l,1:ntx)*fmc1
           trwash_mc(l,1:ntx)=trwash_mc(l,1:ntx)*fmc1
         END IF
#endif
      END DO

      RETURN
      END SUBROUTINE MSTCNV


      SUBROUTINE LSCOND(IERR,WMERR,LERR,i_debug,j_debug) 2,94
!@sum  LSCOND column physics of large scale condensation
!@auth M.S.Yao/A. Del Genio (modularisation by Gavin Schmidt)
!@ver  1.0 (taken from CB265)
!@calls CTMIX,QSAT,DQSATDT,THBAR
      IMPLICIT NONE

!@var IERR,WMERR,LERR error reporting
      INTEGER, INTENT(OUT) :: IERR,LERR
      REAL*8, INTENT(OUT) :: WMERR
      INTEGER, INTENT(IN) :: i_debug,j_debug
      logical :: debug_out
      REAL*8 LHX

C**** functions
      REAL*8 :: QSAT, DQSATDT,ERMAX
!@var QSAT saturation humidity
!@var DQSATDT dQSAT/dT

!@param CM00 upper limit for autoconversion rate
!@param AIRM0 scaling factor for computing rain evaporation
!@param HEFOLD e-folding length for computing HDEP
!@param COEFM coefficient for ratio of cloud water amount and WCONST
!@param COEFT coefficient used in computing PRATM
!@param COESIG coefficient for equ. 23 of Del Genio et al. (1996)
!@param COEEC coefficient for computing cloud evaporation
!@param ERP exponential power for computing ER
C**** Adjust COEFT and COEFM to change proportion of super-cooled rain
C**** to snow. Increasing COEFT reduces temperature range of super
C**** -cooled rain, increasing COEFM enhances probability of snow.
      REAL*8, PARAMETER :: CM00=1.d-4, AIRM0=100.d0, GbyAIRM0=GRAV/AIRM0
      REAL*8, PARAMETER :: HEFOLD=500.,COEFM=10.,COEFT=2.5
      REAL*8, PARAMETER :: COESIG=1d-3,COEEC=1000.
      INTEGER, PARAMETER :: ERP=2
      REAL*8, DIMENSION(IM) :: UMO1,UMO2,UMN1,UMN2 !@var dummy variables
      REAL*8, DIMENSION(IM) :: VMO1,VMO2,VMN1,VMN2 !@var dummy variables
!@var Miscellaneous vertical arrays
      REAL*8, DIMENSION(LM) ::
     *     QSATL,RHF,ATH,SQ,ER,QHEAT,
     *     CLEARA,PREP,RH00,EC,WMXM
!@var QSATL saturation water vapor mixing ratio
!@var RHF environmental relative humidity
!@var ATH change in potential temperature
!@var SQ ERMAX dummy variables
!@var ER evaporation of precip
!@var QHEAT change of latent heat
!@var CLEARA fraction of clear region
!@var PREP precip conversion rate
!@var RH00 threshold relative humidity
!@var EC cloud evaporation rate
!@var WMXM cloud water mass (mb)
      REAL*8, DIMENSION(LM+1) :: PREBAR,PREICE
!@var PREBAR,PREICE precip entering layer top for total, snow

#ifdef TRACERS_WATER
!@var TRPRBAR tracer precip entering layer top for total (kg)
      REAL*8, DIMENSION(NTM,LM+1) :: TRPRBAR
!@var DTPR change of tracer by precip (kg)
!@var DTER change of tracer by evaporation (kg)
!@var DTQW change of tracer by condensation (kg)
!@var FWTOQ fraction of CLW that goes to water vapour
!@var FPR fraction of CLW that precipitates
!@var FER fraction of precipitate that evaporates
      REAL*8 DTPR,DTER,DTQW,TWMTMP,DTSUM,FWTOQ,FPR,FER
!@var DTPRT tracer-specific change of tracer by precip (kg)
!@var DTERT tracer-specific change of tracer by evaporation (kg)
!@var DTWRT tracer-specific change of tracer by washout (kg)
!@var DTQWT tracer-specific change of tracer by condensation (kg)
!@var FWTOQT tracer-specific fraction of tracer in CLW that evaporates
!@var FQTOWT tracer-specific fraction of gas tracer condensing in CLW
!@var FPRT tracer-specific fraction of tracer in CLW that precipitates
!@var FERT tracer-specific fraction of tracer in precipitate evaporating
      REAL*8 ::DTWRT,DTPRT,DTERT,DTQWT,FWTOQT,FQTOWT,FPRT,FERT,PRLIQ
!@var BELOW_CLOUD logical- is the current level below cloud?
!@var CLOUD_YET logical- in L loop, has there been any cloud so far?
      LOGICAL BELOW_CLOUD,CLOUD_YET
!@var FQCONDT fraction of tracer that condenses
!@var FQEVPT  fraction of tracer that evaporates (in downdrafts)
!@var FPRCPT fraction of tracer that evaporates (in net re-evaporation)
!@var FWASHT  fraction of tracer scavenged by below-cloud precipitation
      REAL*8 :: FQCONDT, FWASHT, FPRCPT, FQEVPT
!@var WMXTR available water mixing ratio for tracer condensation ( )?
!@var b_beta_DT precipitating gridbox fraction from lowest precipitating
!@+   layer. The name was chosen to correspond to Koch et al. p. 23,802.
!@var precip_mm precipitation (mm) from the grid box above for washout
      REAL*8 WMXTR, b_beta_DT, precip_mm
c for tracers in general, added by Koch
      REAL*8 THLAW,THWASH,TR_LEF,TMFAC,TMFAC2,TR_LEFT(ntm),CLDSAVT
!@var TR_LEF limits precurser dissolution following sulfate formation
!@var THLAW Henry's Law determination of amount of tracer dissolution
!@var THWASH Henry's Law for below cloud dissolution
!@var TMFAC,TMFAC2 used to adjust tracer moments
!@var CLDSAVT is present cloud fraction, saved for tracer use
!@var cldprec cloud fraction at lowest precipitating level
      REAL*8 :: cldprec
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
c for sulfur chemistry
!@var WA_VOL Cloud water volume (L). Used by GET_SULFATE.
      REAL*8 WA_VOL
      REAL*8, DIMENSION(NTM) ::SULFOUT,SULFIN,SULFINC
#endif
#endif

      REAL*8 AIRMR,BETA,BMAX
     *     ,CBF,CBFC0,CK,CKIJ,CK1,CK2,CKM,CKR,CM,CM0,CM1,DFX,DQ,DQSDT
     *     ,DQSUM,DQUP,DRHDT,DSE,DSEC,DSEDIF,DWDT,DWDT1,DWM,ECRATE,EXPST
     *     ,FCLD,FMASS,FMIX,FPLUME,FPMAX,FQTOW,FRAT,FUNI
     *     ,FUNIL,FUNIO,HCHANG,HDEP,HPHASE,OLDLAT,OLDLHX,PFR,PMI,PML
     *     ,HPBL,PRATIO,QCONV,QHEATC,QLT1,QLT2,QMN1,QMN2,QMO1,QMO2,QNEW
     *     ,QNEWU,QOLD,QOLDU,QSATC,QSATE,RANDNO,RCLDE,RHI,RHN,RHO,RHT1
     *     ,RHW,SEDGE,SIGK,SLH,SMN1,SMN2,SMO1,SMO2,TEM,TEMP,TEVAP,THT1
     *     ,THT2,TLT1,TNEW,TNEWU,TOLD,TOLDU,TOLDUP,VDEF,WCONST,WMN1,WMN2
     *     ,WMNEW,WMO1,WMO2,WMT1,WMT2,WMX1,WTEM,VVEL,RCLD,FCOND
     *     ,PRATM,SMN12,SMO12,QF
       real*8 SNdO,SNdL,SNdI,SCDNCW,SCDNCI
#ifdef CLD_AER_CDNC
!@auth Menon  - storing var for cloud droplet number
       integer, PARAMETER :: SNTM=17
       real*8 Repsis,Repsi,Rbeta,CDNL1,CDNO1,QAUT,DSU(SNTM),QCRIT
       real*8 dynvis(LM),DSGL(LM,SNTM),DSS(SNTM),r6,r6c
       real*8 D3DL(LM),CWCON(LM)               ! for 3 hrly diag
c      real*8 AERTAU(LM),AERTAUMC,AERTAUSS,THOLD,SUMTAU,xx
c      integer IFLAG,AAA,ILTOP
#endif
!@var BETA,BMAX,CBFC0,CKIJ,CK1,CK2,PRATM dummy variabls
!@var SMN12,SMO12 dummy variables
!@var AIRMR
!@var CBF enhancing factor for precip conversion
!@var CK ratio of cloud top jumps in moist static energy and total water
!@var CKM CTEI threshold in MacVean and Mason theory
!@var CKR CTEI threshold in Randall theory
!@var CM conversion rate for large cloud water content
!@var CM0,CM1 limiting autoconversion rate for large cloud water content
!@var DFX iteration increment
!@var DQ condensed water vapor
!@var DQSDT derivative of saturation vapor pressure w.r.t. temperature
!@var DQSUM,DQUP dummy variables
!@var DRHDT time change of relative humidity
!@var DSE moist static energy jump at cloud top
!@var DSEC critical DSE for CTEI to operate
!@var DSFDIF DSE-DSEC
!@var DWDT,DWDT1 time change rates of cloud water
!@var ECRATE cloud droplet evaporation rate
!@var EXPST exponential term in determining the fraction in CTEI
!@var FCLD cloud fraction
!@var FMIX,FRAT fraction of mixing in CTEI
!@var FMASS mass of mixing in CTEI
!@var FPLUME fraction of mixing in CTEI
!@var FPMAX max fraction of mixing in CTEI
!@var FQTOW fraction of water vapour that goes to CLW
!@var FUNI the probablity for ice cloud to form
!@var FUNIL,FUNIO FUNI over land, ocean
!@var HCHANG,HPHASE latent heats for changing phase
!@var HDEP,HPBL layer depth (m)  (note change of unit km-->m)
!@var OLDLAT,OLDLHX previous LHX
!@var PFR PROBABLITY OF GLACIATION OF SUPER-COOLED WATER
!@var PMI icy precip entering the layer top
!@var PML layer's cloud water devided by GRAV
!@var PRATIO PMI/PML
!@var QCONV convergence of latent heat
!@var QHEATC,QLT1,QLT2,QMN1,QMN2,QMO1,QMO2 dummy variables
!@var QNEW,QNEWU updated specific humidity
!@var QOLD,QOLDU previous specific humidity
!@var QSATC saturation vapor mixing ratio
!@var QSATE saturation vapor mixing ratio w.r.t. water
!@var RANDNO random number
!@var RCLD,RCLDE cloud particle's radius, effective radius
!@var RHI relative humidity w.r.t. ice
!@var RHN dummy variable
!@var RHO air density
!@var RHT1,RHW,SIGK dummy variables
!@var SEDGE potential temperature at layer edge
!@var SMN1,SMN2,SMO1,SMO2,TEM,TEMP,TEVAP,THT1,THT2,TLT1 dummy variables
!@var TNEW,TNEWU updated tempertures
!@var TOLD,TOLDU,TOLDUP previous temperatures
!@var VDEF = VVEL - VSUB
!@var WCONST,WMN1,WMN2,WMO1,WMO2,WMT1,WMT2,WMX1 dummy variables
!@var WMNEW updated cloud water mixing ratio
!@var WTEM cloud water density (g m**-3)
!@var VVEL vertical velocity (cm/s)
!@var FCOND QF dummy variables
      INTEGER LN,ITER !@var LN,ITER loop variables
      LOGICAL BANDF  !@var BANDF true if Bergero-Findeisen proc. occurs
      LOGICAL FORM_CLOUDS !@var FORM_CLOUDS true if clouds are formed

      INTEGER K,L,N  !@var K,L,N loop variables

      REAL*8 THBAR !@var THBAR potential temperature at layer edge

C****
C**** LARGE-SCALE CLOUDS AND PRECIPITATION
C**** THE LIQUID WATER CONTENT IS PREDICTED
C****
      IERR=0
C****
      debug_out=.false.
      PRCPSS=0.
      HCNDSS=0.
      CKIJ=1.
      RCLDX=radius_multiplier
      RTEMP=funio_denominator
      CMX=autoconv_multiplier
C**** initialise vertical arrays
      ER=0.
      EC=0.
      PREP=0.
      PREBAR=0.
      LHP=0.
      QHEAT=0.
      CLDSSL=0
      TAUSSL=0
#ifdef TRACERS_WATER
      TRPRSS = 0.
      TRPRBAR = 0.
      BELOW_CLOUD=.false.
      CLOUD_YET=.false.
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      DT_SULF_SS(1:NTM,:)=0.
#endif
#endif
#ifdef CLD_AER_CDNC
       CTEML=0.
       CD3DL=0.
       CL3DL=0.
       CI3DL=0.
       CDN3DL=0.
       CRE3DL=0.
       SMLWP=0.
c      AERTAU=0.
       DSGL(:,1:SNTM)=0.
#endif
#if (defined TRACERS_WATER) && (defined TRDIAG_WETDEPO)
      IF (diag_wetdep == 1) THEN
C**** initialize diagnostic arrays
        trwash_ls=0.D0
        trprcp_ls=0.D0
        trclwc_ls=0.D0
        trclwe_ls=0.D0
        trcond_ls=0.D0
      END IF
#endif
      DO L=1,LP50
        CLEARA(L)=1.-CLDSAVL(L)
C       IF(RH(L).LE.1.) CLEARA(L)=DSQRT((1.-RH(L))/(1.-RH00(L)+teeny))
C       IF(RH(L).LE.1.) CLEARA(L)=DSQRT((1.-RH(L))/(1.-U00ice+teeny))
C       IF(CLEARA(L).GT.1.) CLEARA(L)=1.
C       IF(RH(L).GT.1.) CLEARA(L)=0.
        IF(WMX(L).LE.0.) CLEARA(L)=1.
      END DO
      DQUP=0.
      TOLDUP=TL(LP50)
      PREICE(LP50+1)=0.
      WCONST=WMU*(1.-PEARTH)+WMUL*PEARTH
         SSHR=0.
         DCTEI=0.
C****
C**** MAIN L LOOP FOR LARGE-SCALE CONDENSATION, PRECIPITATION AND CLOUDS
C****
      DO L=LP50,1,-1
      TOLD=TL(L)
      QOLD=QL(L)
      OLDLHX=SVLHXL(L)
      OLDLAT=SVLATL(L)
C**** COMPUTE VERTICAL VELOCITY IN CM/S
      TEMP=100.*RGAS*TL(L)/(PL(L)*GRAV)
      IF(L.EQ.1)  THEN
         VVEL=-SDL(L+1)*TEMP
      ELSE IF(L.EQ.LM)  THEN
         VVEL=-SDL(L)*TEMP
      ELSE
         VVEL=-.5*(SDL(L)+SDL(L+1))*TEMP
      END IF
C**** COMPUTE THE LIMITING AUTOCONVERSION RATE FOR CLOUD WATER CONTENT
      CM0=CM00
      VDEF=VVEL-VSUBL(L)
      IF(VDEF.GT.0.) CM0=CM00*10.**(-VDEF)
c      FCLD=1.-CLEARA(L)+1.E-20            !!!
      FCLD=(1.-CLEARA(L))*FSSL(L)+teeny
C**** COMPUTE THE PROBABILITY OF ICE FORMATION, FUNI, AND
C**** THE PROBABLITY OF GLACIATION OF SUPER-COOLED WATER, PFR
C**** DETERMINE THE PHASE MOISTURE CONDENSES TO
C**** DETERMINE THE POSSIBILITY OF B-F PROCESS
      BANDF=.FALSE.
      LHX=LHE
      CBF=1. + EXP(-((TL(L)-258.16d0)/10.)**2)

      IF (TL(L).LE.TI) THEN     ! below -40: force ice
        LHX=LHS
      ELSEIF (TL(L).GE.TF) THEN ! above freezing: force water
        LHX=LHE
      ELSE                      ! in between: compute probability
        IF(TL(L).GT.269.16) THEN ! OC/SI/LI clouds: water above -4
          FUNIO=0.
        ELSE
C         FUNIO=1.-EXP(-((TL(L)-269.16d0)/15.)**2)
          FUNIO=1.-EXP(-((TL(L)-269.16d0)/RTEMP)**2)
        END IF
        IF(TL(L).GT.263.16) THEN ! land clouds water: above -10
          FUNIL=0.
        ELSE
          FUNIL=1.-EXP(-((TL(L)-263.16d0)/15.)**2)
        END IF
        FUNI=FUNIO*(1.-PEARTH)+FUNIL*PEARTH
        RANDNO=RNDSSL(1,L)       !  RANDNO=RANDU(XY)
        IF(RANDNO.LT.FUNI) LHX=LHS

        IF (OLDLHX.EQ.LHS.AND.TL(L).LT.TF) LHX=LHS   ! keep old phase
        IF (OLDLHX.EQ.LHE) LHX=LHE                   ! keep old phase
C**** special case 1) if ice previously then stay as ice (if T<Tf)
C       IF((OLDLHX.EQ.LHS.OR.OLDLAT.EQ.LHS).AND.TL(L).LT.TF) THEN
        IF(OLDLAT.EQ.LHS.AND.TL(L).LT.TF) THEN
          IF(LHX.EQ.LHE) BANDF=.TRUE.
          LHX=LHS
        ENDIF

        IF (L.LT.LP50) THEN
C**** Decide whether precip initiates B-F process
          PML=WMX(L)*AIRM(L)*BYGRAV
          PMI=PREICE(L+1)*DTsrc
          RANDNO=RNDSSL(2,L)     !  RANDNO=RANDU(XY)
C**** Calculate probability of ice precip seeding a water cloud
          IF (LHX.EQ.LHE.AND.PMI.gt.0) THEN
            PRATIO=MIN(PMI/(PML+1.E-20),10d0)
            CBFC0=.5*CM0*CBF*DTsrc
            PFR=(1.-EXP(-(PRATIO*PRATIO)))*(1.-EXP(-(CBFC0*CBFC0)))
            IF(PFR.GT.RANDNO) THEN
              BANDF=.TRUE.
              LHX=LHS
            END IF
          END IF
C**** If liquid rain falls into an ice cloud, B-F must occur
          IF (LHP(L+1).EQ.LHE .AND. LHX.EQ.LHS .AND. PML.GT.0.)
     *         BANDF=.TRUE.
        END IF
      END IF
      IF(LHX.EQ.LHS .AND. (OLDLHX.EQ.LHE.OR.OLDLAT.EQ.LHE)) BANDF=.TRUE.

C**** COMPUTE RELATIVE HUMIDITY
      QSATL(L)=QSAT(TL(L),LHX,PL(L))
      RH1(L)=QL(L)/QSATL(L)
      IF(LHX.EQ.LHS) THEN
        QSATE=QSAT(TL(L),LHE,PL(L))
        RHW=.00536d0*TL(L)-.276d0
        RH1(L)=QL(L)/QSATE
        IF(TL(L).LT.238.16) RH1(L)=QL(L)/(QSATE*RHW)
      END IF
C**** PHASE CHANGE OF CLOUD WATER CONTENT
      HCHANG=0.
      IF(OLDLHX.EQ.LHE.AND.LHX.EQ.LHS) HCHANG= WML(L)*LHM
      IF(OLDLHX.EQ.LHS.AND.LHX.EQ.LHE) HCHANG=-WML(L)*LHM
      IF(OLDLAT.EQ.LHE.AND.LHX.EQ.LHS) HCHANG=HCHANG+SVWMXL(L)*LHM
      IF(OLDLAT.EQ.LHS.AND.LHX.EQ.LHE) HCHANG=HCHANG-SVWMXL(L)*LHM
      SVLHXL(L)=LHX
      TL(L)=TL(L)+HCHANG/(SHA*FSSL(L)+teeny)
      TH(L)=TL(L)/PLK(L)
      ATH(L)=(TH(L)-TTOLDL(L))*BYDTsrc
C**** COMPUTE RH IN THE CLOUD-FREE AREA, RHF
      RHI=QL(L)/QSAT(TL(L),LHS,PL(L))
    ! this formulation is used for consistency with current practice
      RH00(L)=U00wtrX*U00ice
      IF(LHX.EQ.LHS) RH00(L)=U00ice
C**** Option to treat boundary layer differently
      IF (do_blU00.eq.1) then
        IF (L.LE.DCL) THEN      ! boundary layer clouds
C**** calculate total pbl depth
          HPBL=0.
          DO LN=1,DCL
            HPBL=HPBL+AIRM(LN)*TL(LN)*RGAS/(GRAV*PL(LN))
          END DO
C**** Scale HPBL by HRMAX to provide tuning control for PBL clouds
          HDEP = MIN(HPBL,HRMAX*(1.-EXP(-HPBL/HEFOLD)))
C**** Special conditions for boundary layer contained wholly in layer 1
          IF (DCL.LE.1) THEN
            IF (RIS.GT.1.) HDEP=10d0
            IF (RIS.LE.1..AND.RI1.GT.1.) HDEP=50d0
            IF (RIS.LE.1..AND.RI1.LE.1..AND.RI2.GT.1.) HDEP=100d0
          END IF
C**** Estimate critical rel. hum. based on parcel lifting argument
          RH00(L)=1.-GAMD*LHE*HDEP/(RVAP*TS*TS)
          IF(RH00(L).LT.0.) RH00(L)=0.
        END IF
      END IF
C****
      IF(RH00(L).GT.1.) RH00(L)=1.
      RHF(L)=RH00(L)+(1.-CLEARA(L))*(1.-RH00(L))
C**** Set precip phase to be the same as the cloud, unless precip above
C**** is ice and temperatures after ice melt would still be below TFrez
      LHP(L)=LHX
      IF (LHP(L+1).eq.LHS .and.
     *     TL(L).lt.TF+DTsrc*LHM*PREICE(L+1)*GRAV*BYAM(L)*BYSHA/(FSSL(L)
     *     +teeny)) LHP(L)=LHP(L+1)
#ifdef CLD_AER_CDNC
!@auth Menon  saving aerosols mass for CDNC prediction
      DO N=1,SNTM
        DSS(N)=1.d-10
        DSGL(L,N)=1.d-10
      ENDDO
#ifdef TRACERS_AEROSOLS_Koch
C**#if (defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_HETCHEM)
C**#if (defined TRACERS_SPECIAL_Shindell) && (defined TRACERS_AEROSOLS_Koch)
      DO N=1,NTX
       select case (trname(ntix(n)))
       case('SO4')
       DSGL(L,1)=tm(l,n)  !n=4
       DSS(1) = DSGL(L,1)
       case('seasalt1')
       DSGL(L,2)=tm(l,n)  !n=6
       DSS(2) = DSGL(L,2)
       case('seasalt2')
       DSGL(L,3)=tm(l,n)  !n=7
       DSS(3) = DSGL(L,3)
       case('OCIA')
       DSGL(L,4)=tm(l,n)    !n=12
       DSS(4) = DSGL(L,4)
c     if(tm(l,12).gt.1.d6)write(6,*)"CL1",tm(l,12),l,n,DSS(4),DSGL(L,4)
       case('OCB')
       DSGL(L,5)=tm(l,n)  !n=13
       DSS(5) = DSGL(L,5)
       case('BCIA')
       DSGL(L,6)=tm(l,n)  !n=9
       DSS(6) = DSGL(L,6)
       case('BCB')
       DSGL(L,7)=tm(l,n)  !n=10
       DSS(7) = DSGL(L,7)
       case('OCII')
       DSGL(L,8)=tm(l,n)  !n=11
       DSS(8) = DSGL(L,8)
       case('BCII')
       DSGL(L,9)=tm(l,n)  !n=8
       DSS(9) = DSGL(L,9)
#endif
#ifdef TRACERS_DUST
        case('Clay')
        DSGL(L,10)=tm(l,n)  !n=23
        DSS(10) = DSGL(L,10)
        case('Silt1')
        DSGL(L,11)=tm(l,n)  !n=23
        DSS(11) = DSGL(L,11)
        case('Silt2')
        DSGL(L,12)=tm(l,n)  !n=23
        DSS(12) = DSGL(L,12)
        case('Silt3')
        DSGL(L,13)=tm(l,n)  !n=23
        DSS(13) = DSGL(L,13)
#endif
#ifdef TRACERS_NITRATE
        case('NO3p')
        DSGL(L,14)=tm(l,n)  !n=23
        DSS(14) = DSGL(L,14)
#endif
#ifdef TRACERS_HETCHEM
C*** Here are dust particles coated with sulfate
       case('SO4_d1')
       DSGL(L,15)=tm(l,n)  !n=20
       DSS(15) = DSGL(L,15)
c      if(DSS(15).gt.0.1d0)write(6,*)"Sd1",DSS(10),l
       case('SO4_d2')
       DSGL(L,16)=tm(l,n)  !n=21
       DSS(16) = DSGL(L,16)
       case('SO4_d3')
       DSGL(L,17)=tm(l,n)  !n=22
       DSS(17) = DSGL(L,17)
#endif
        end select

c     if(DSS(5).lt.0.d0)write(6,*)"SO4d1",DSS(1),DSS(4),DSS(5),DSS(6),l
c       write(6,*)"TRACER",tm(l,n),l,n
      END DO      !end of n loop for tracers
#endif
C***Setting constant values of CDNC over land and ocean to get RCLD=f(CDNC,LWC)
      SNdO = 59.68d0/(RWCLDOX**3)
      SNdL = 174.d0
      SNdI = 0.06417127d0
#ifdef CLD_AER_CDNC
      CALL GET_CDNC(L,LHX,WCONST,WMUI,AIRM(L),WMX(L),DXYPJ,
     *FCLD,CLEARA(L),CLDSAVL(L),DSS,SMFPML(L),PL(L),TL(L),OLDCDO(L),
     *OLDCDL(L),VVEL,SME(L),DSU,CDNL1,CDNO1)
      SNdO=CDNO1
      SNdL=CDNL1
#endif
      SCDNCW=SNdO*(1.-PEARTH)+SNdL*PEARTH
      SCDNCI=SNdI
#ifdef CLD_AER_CDNC
      IF (SCDNCW.le.20.d0) SCDNCW=20.d0     !set min CDNC, sensitivity test
c     IF (SCDNCW.ge.1400.d0) SCDNCW=1400.d0     !set max CDNC, sensitivity test
#endif
C**** COMPUTE THE AUTOCONVERSION RATE OF CLOUD WATER TO PRECIPITATION
      IF(WMX(L).GT.0.) THEN
        RHO=1d5*PL(L)/(RGAS*TL(L))
        TEM=RHO*WMX(L)/(WCONST*FCLD+teeny)
        IF(LHX.EQ.LHS ) TEM=RHO*WMX(L)/(WMUI*FCLD+teeny)
        TEM=TEM*TEM
        IF(TEM.GT.10.) TEM=10.
        CM1=CM0
        IF(BANDF) CM1=CM0*CBF
        IF(LHX.EQ.LHS) CM1=CM0
        CM=CM1*(1.-1./EXP(TEM*TEM))+100.*(PREBAR(L+1)+
     *       PRECNVL(L+1)*BYDTsrc)
#ifdef CLD_AER_CDNC
!routine to get the autoconversion rate
          WTEM=1d5*WMX(L)*PL(L)/(FCLD*TL(L)*RGAS+teeny)
          IF(LHX.EQ.LHE)  THEN
            RCLD=RCLDX*100.d0*(WTEM/(2.d0*BY3*TWOPI*SCDNCW))**BY3
          ELSE
            RCLD=RCLDX*100.d0*(WTEM/(2.d0*BY3*TWOPI*SCDNCI))**BY3
     *         *(1.+pl(l)*xRICld)
          END IF
       CALL GET_QAUT(L,PL(L),TL(L),FCLD,WMX(L),SCDNCW,RCLD,RHOW,
     *r6,r6c,QCRIT,QAUT)
!     CALL GET_QAUT(L,TL(L),FCLD,WMX(L),SCDNCW,RHO,QCRIT,QAUT)
!      CALL GET_QAUT(L,FCLD,WMX(L),SCDNCW,RHO,QAUT)
!     if ((WMX(L)/(FCLD+1.d-20)).GT.QCRIT) then
C*** If 6th moment of DSD is greater than critical radius r6c start QAUT
c     if (r6.gt.r6c) then
      if ((WMX(L)/(FCLD+teeny)).GT.QCRIT) then
        CM=QAUT/(WMX(L)+1.d-20)+1.d0*100.d0*(PREBAR(L+1)+
     *     PRECNVL(L+1)*BYDTsrc)
      else
        CM=0.d0
      endif
!end routine for QAUT as a function of N,LWC
#endif
        CM=CM*CMX
        IF(CM.GT.BYDTsrc) CM=BYDTsrc
        PREP(L)=WMX(L)*CM
#ifdef CLD_AER_CDNC
c       if(CM.ne.0.) write(6,*)"QAUT",CM,QAUT,QCRIT,PREP(L),L
#endif
        IF(TL(L).LT.TF.AND.LHX.EQ.LHE) THEN ! check snowing pdf
          PRATM=1d5*COEFM*WMX(L)*PL(L)/(WCONST*FCLD*TL(L)*RGAS+teeny)
          PRATM=MIN(PRATM,1d0)*(1.-EXP(MAX(-1d2,(TL(L)-TF)/COEFT)))
          IF(PRATM.GT.RNDSSL(3,L)) LHP(L)=LHS
        END IF
      ELSE
        CM=0.
      END IF
C**** DECIDE WHETHER TO FORM CLOUDS
C**** FORM CLOUDS ONLY IF RH GT RH00
      IF (RH1(L).LT.RH00(L)) THEN
        FORM_CLOUDS=.FALSE.
      ELSE   ! COMPUTE THE CONVERGENCE OF AVAILABLE LATENT HEAT
        SQ(L)=LHX*QSATL(L)*DQSATDT(TL(L),LHX)*BYSHA
        TEM=-LHX*DPDT(L)/PL(L)
        QCONV=LHX*AQ(L)-RH(L)*SQ(L)*SHA*PLK(L)*ATH(L)
     *       -TEM*QSATL(L)*RH(L)
        FORM_CLOUDS= (QCONV.GT.0. .OR. WMX(L).GT.0.)
      END IF
C****
      ERMAX=LHX*PREBAR(L+1)*GRAV*BYAM(L)
      IF (FORM_CLOUDS) THEN
C**** COMPUTE EVAPORATION OF RAIN WATER, ER
        RHN=MIN(RH(L),RHF(L))
        IF(WMX(L).GT.0.)  THEN
          ER(L)=(1.-RHN)**ERP*LHX*PREBAR(L+1)*GbyAIRM0 ! GRAV/AIRM0
        ELSE                    !  WMX(l).le.0.
          IF(PREICE(L+1).GT.0..AND.TL(L).LT.TF)  THEN
            ER(L)=(1.-RHI)**ERP*LHX*PREBAR(L+1)*GbyAIRM0 ! GRAV/AIRM0
          ELSE
            ER(L)=(1.-RH(L))**ERP*LHX*PREBAR(L+1)*GbyAIRM0 ! GRAV/AIRM0
          END IF
        END IF
        ER(L)=MAX(0d0,MIN(ER(L),ERMAX))
C**** COMPUTATION OF CLOUD WATER EVAPORATION
        IF (CLEARA(L).GT.0.) THEN
          WTEM=1d5*WMX(L)*PL(L)/(FCLD*TL(L)*RGAS+teeny)
          IF(LHX.EQ.LHE.AND.WMX(L)/FCLD.GE.WCONST*1d-3)
     *         WTEM=1d2*WCONST*PL(L)/(TL(L)*RGAS)
          IF(LHX.EQ.LHS.AND.WMX(L)/FCLD.GE.WMUI*1d-3)
     *         WTEM=1d2*WMUI*PL(L)/(TL(L)*RGAS)
          IF(WTEM.LT.1d-10) WTEM=1d-10
          IF(LHX.EQ.LHE)  THEN
!           RCLD=1d-6*(RWCLDOX*10.*(1.-PEARTH)+7.*PEARTH)*(WTEM*4.)**BY3
            RCLD=RCLDX*1d-6*100.d0*(WTEM/(2.d0*BY3*TWOPI*SCDNCW))**BY3
          ELSE
!           RCLD=25.d-6*(WTEM/4.2d-3)**BY3 * (1.+pl(l)*xRICld)
            RCLD=RCLDX*100.d-6*(WTEM/(2.d0*BY3*TWOPI*SCDNCI))**BY3
     *         *(1.+pl(l)*xRICld)
          END IF
          CK1=1000.*LHX*LHX/(2.4d-2*RVAP*TL(L)*TL(L))
          CK2=1000.*RGAS*TL(L)/(2.4d-3*QSATL(L)*PL(L))
          TEVAP=COEEC*(CK1+CK2)*RCLD*RCLD
          WMX1=WMX(L)-PREP(L)*DTsrc
          ECRATE=(1.-RHF(L))/(TEVAP*FCLD+teeny)
          IF(ECRATE.GT.BYDTsrc) ECRATE=BYDTsrc
          EC(L)=WMX1*ECRATE*LHX
        END IF
C**** COMPUTE NET LATENT HEATING DUE TO STRATIFORM CLOUD PHASE CHANGE,
C**** QHEAT, AND NEW CLOUD WATER CONTENT, WMNEW
        DRHDT=2.*CLEARA(L)*CLEARA(L)*(1.-RH00(L))*(QCONV+ER(L))/LHX/
     *       (WMX(L)/(FCLD+teeny)+2.*CLEARA(L)*QSATL(L)*(1.-RH00(L))
     *       +teeny)
        IF(ER(L).EQ.0.AND.WMX(L).LE.0.) DRHDT=0.
        QHEAT(L)=FSSL(L)*(QCONV-LHX*DRHDT*QSATL(L))/(1.+RH(L)*SQ(L))
        DWDT=QHEAT(L)/LHX-PREP(L)+CLEARA(L)*FSSL(L)*ER(L)/LHX
        WMNEW =WMX(L)+DWDT*DTsrc
        IF(WMNEW.LT.0.) THEN
          WMNEW=0.
          QHEAT(L)=(-WMX(L)*BYDTsrc+PREP(L))*LHX-CLEARA(L)*FSSL(L)*ER(L)
        END IF
      ELSE
C**** UNFAVORABLE CONDITIONS FOR CLOUDS TO EXIT, PRECIP OUT CLOUD WATER
        IF(WMX(L).GT.0.) PREP(L)=WMX(L)*BYDTsrc
        ER(L)=(1.-RH(L))**ERP*LHX*PREBAR(L+1)*GbyAIRM0 ! GRAV/AIRM0
        IF(PREICE(L+1).GT.0..AND.TL(L).LT.TF)
     *       ER(L)=(1.-RHI)**ERP*LHX*PREBAR(L+1)*GbyAIRM0 ! GRAV/AIRM0
        ER(L)=MAX(0d0,MIN(ER(L),ERMAX))
        QHEAT(L)=-CLEARA(L)*FSSL(L)*ER(L)
        WMNEW=0.
      END IF

C**** PHASE CHANGE OF PRECIPITATION, FROM ICE TO WATER
C**** This occurs if 0 C isotherm is crossed, or ice is falling into
C**** a super-cooled water cloud (that has not had B-F occur).
C**** Note: on rare occasions we have ice clouds even if T>0
C**** In such a case, no energy of phase change is needed.
      HPHASE=0.
      IF (LHP(L+1).EQ.LHS.AND.LHP(L).EQ.LHE.AND.PREICE(L+1).GT.0) THEN
        HPHASE=HPHASE+LHM*PREICE(L+1)*GRAV*BYAM(L)
        PREICE(L+1)=0.
      ENDIF
C**** PHASE CHANGE OF PRECIP, FROM WATER TO ICE
      IF (LHP(L+1).EQ.LHE.AND.LHP(L).EQ.LHS.AND.PREBAR(L+1).GT.0)
     *     HPHASE=HPHASE-LHM*PREBAR(L+1)*GRAV*BYAM(L)
C**** Make sure energy is conserved for transfers between P and CLW
      IF (LHP(L).NE.LHX)
     *     HPHASE=HPHASE+(ER(L)*CLEARA(L)*FSSL(L)/LHX-PREP(L))*LHM
C**** COMPUTE THE PRECIP AMOUNT ENTERING THE LAYER TOP
      IF (ER(L).eq.ERMAX) THEN ! to avoid round off problem
        PREBAR(L)=PREBAR(L+1)*(1.-CLEARA(L)*FSSL(L))+
     *            AIRM(L)*PREP(L)*BYGRAV
      ELSE
        PREBAR(L)=MAX(0d0,PREBAR(L+1)+
     *       AIRM(L)*(PREP(L)-ER(L)*CLEARA(L)*FSSL(L)/LHX)*BYGRAV)
      END IF
C**** UPDATE NEW TEMPERATURE AND SPECIFIC HUMIDITY
      QNEW =QL(L)-DTsrc*QHEAT(L)/(LHX*FSSL(L)+teeny)
      IF(QNEW.LT.0.) THEN
        QNEW=0.
        QHEAT(L)=QL(L)*LHX*BYDTsrc*FSSL(L)
        DWDT1=QHEAT(L)/LHX-PREP(L)+CLEARA(L)*FSSL(L)*ER(L)/LHX
        WMNEW=WMX(L)+DWDT1*DTsrc
C**** IF WMNEW .LT. 0., THE COMPUTATION IS UNSTABLE
        IF(WMNEW.LT.0.) THEN
          IERR=1
          LERR=L
          WMERR=WMNEW
          WMNEW=0.
        END IF
      END IF
C**** Only Calculate fractional changes of Q to W
#ifdef TRACERS_WATER
      FPR=0.
      IF (WMX(L).gt.0.) FPR=PREP(L)*DTsrc/WMX(L)              ! CLW->P
      FPR=MIN(1d0,FPR)
      FER=0.
      IF (PREBAR(L+1).gt.0.) FER=CLEARA(L)*FSSL(L)*ER(L)*AIRM(L)/
     *     (GRAV*LHX*PREBAR(L+1))                             ! P->Q
      FER=MIN(1d0,FER)
      FWTOQ=0.                                                ! CLW->Q
#endif
      FQTOW=0.                                                ! Q->CLW
      IF (FSSL(L).gt.0) THEN
      IF (QHEAT(L)+CLEARA(L)*FSSL(L)*ER(L).gt.0) THEN
        IF (LHX*QL(L)+DTsrc*CLEARA(L)*ER(L).gt.0.) FQTOW=(QHEAT(L
     *      )+CLEARA(L)*FSSL(L)*ER(L))*DTsrc/((LHX*QL(L)+DTsrc*CLEARA(L)
     *       *ER(L))*FSSL(L))
#ifdef TRACERS_WATER
      ELSE
        IF (WMX(L)-PREP(L)*DTsrc.gt.0.) FWTOQ=-(QHEAT(L)
     *      +CLEARA(L)*FSSL(L)*ER(L))*DTsrc/(LHX*(WMX(L)-PREP(L)*DTsrc))
        FWTOQ=MIN(1d0,FWTOQ)
#endif
      END IF
      END IF
      QL(L)=QNEW
C**** adjust gradients down if Q decreases
      QMOM(:,L)= QMOM(:,L)*(1.-FQTOW)
      WMX(L)=WMNEW
!     if(abs(DTsrc*(QHEAT(L)-HPHASE)).gt.100.*SHA*FSSL(L)) then ! warn
!       write(0,*) 'it,i,j,l,tlold,dtl,qht,hph',itime,i_debug,j_debug,
!    *    L,TL(L),DTsrc*(QHEAT(L)-HPHASE)/(SHA*FSSL(L)+teeny),
!    *    QHEAT(L),HPHASE
!       debug_out=.true.
!     end if
      TL(L)=TL(L)+DTsrc*(QHEAT(L)-HPHASE)/(SHA*FSSL(L)+teeny)
      TH(L)=TL(L)/PLK(L)
      TNEW=TL(L)
      QSATC=QSAT(TL(L),LHX,PL(L))
      RH(L)=QL(L)/QSATC
#ifdef TRACERS_WATER
C**** update tracers from cloud formation (in- and below-cloud
C****    precipitation, evaporation, condensation, and washout)
c CLDSAVT is current FCLD
        IF(RH(L).LE.1.) CLDSAVT=1.-DSQRT((1.-RH(L))/(1.-RH00(L)+teeny))
        IF(CLDSAVT.LT.0.) CLDSAVT=0.
        IF(RH(L).GT.1.) CLDSAVT=1.
        IF (CLDSAVT.GT.1.) CLDSAVT=1.
        IF (WMX(L).LE.0.) CLDSAVT=0.
        CLDSAVT=CLDSAVT*FSSL(L)
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      WA_VOL=0.
      IF (WMNEW.GT.teeny) THEN
        WA_VOL=WMNEW*AIRM(L)*1.D2*BYGRAV*DXYPJ
      ENDIF
      WMXTR = WMX(L)
      IF (BELOW_CLOUD.and.WMX(L).LT.teeny) THEN
        precip_mm = PREBAR(L+1)*100.*DTsrc
        if (precip_mm.lt.0.) precip_mm=0.
        WMXTR = PREBAR(L+1)*grav*BYAM(L)*dtsrc
        if (wmxtr.lt.0.) wmxtr=0.
        WA_VOL=precip_mm*DXYPJ
      ENDIF
      CALL GET_SULFATE(L,TL(L),CLDSAVT,WA_VOL
     * ,WMXTR,SULFIN,SULFINC,SULFOUT,TR_LEFT,TM,TRWML(1,l),AIRM,LHX
     *  ,DT_SULF_SS(1,L),FCLD)
      DO N=1,NTX
      select case (trname(ntix(n)))
      case('SO2','SO4','H2O2_s','H2O2')
      if (trname(ntix(n)).eq."H2O2" .and. coupled_chem.eq.0) goto 403
      if (trname(ntix(n)).eq."H2O2_s" .and. coupled_chem.eq.1) goto 403

        TRWML(N,L)=TRWML(N,L)*(1.+SULFINC(N))
        TM(L,N)=TM(L,N)*(1.+SULFIN(N))
        TMOM(:,L,N)  = TMOM(:,L,N)*(1. +SULFIN(N))
        if (WMX(L).LT.teeny.and.BELOW_CLOUD) then
          TRPRBAR(N,L+1)=TRPRBAR(N,L+1)+SULFOUT(N)
        else
          TRWML(N,L) = TRWML(N,L)+SULFOUT(N)
        endif

 403    CONTINUE

      end select

      END DO
#endif
      DO N=1,NTX
c ---------------------- initialize fractions ------------------------
        FPRT  =0.
        FERT  =0.
        FWASHT=0.
        FQTOWT=0.
        FWTOQT=0.
        THLAW=0.
        THWASH=0.
c ----------------------- calculate fractions --------------------------
c precip. tracer evap
        CALL GET_EVAP_FACTOR(N,TL(L),LHX,.FALSE.,1d0,FER,FERT,ntix)
        CALL GET_EVAP_FACTOR(N,TL(L),LHX,.FALSE.,1d0,FWTOQ,FWTOQT,ntix)
        TR_LEF=1.D0
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      select case (trname(ntix(n)))
      case('SO2','SO4','H2O2_s','H2O2')
      if (trname(ntix(n)).eq."H2O2" .and. coupled_chem.eq.0) goto 404
      if (trname(ntix(n)).eq."H2O2_s" .and. coupled_chem.eq.1) goto 404

        TR_LEF=TR_LEFT(N)
 404    CONTINUE

      end select

#endif
        IF(BELOW_CLOUD.and.WMX(L).lt.teeny) THEN
          precip_mm = PREBAR(L+1)*100.*dtsrc
          WMXTR = PREBAR(L+1)*grav*BYAM(L)*dtsrc
          if (precip_mm.lt.0.) precip_mm=0.
          if (wmxtr.lt.0.) wmxtr=0.
cdmk change GET_WASH below - extra arguments
          CALL GET_WASH_FACTOR(N,b_beta_DT,precip_mm,FWASHT
     *     ,TEMP,LHX,WMXTR,cldprec,L,TM,TRPRBAR(1,l),THWASH,pl(l),ntix) !washout
        ELSE
#ifndef NO_WASHOUT_IN_CLOUDS
          precip_mm = prebar(l+1)*100.*dtsrc
          wmxtr=prebar(l+1)*grav*byam(l)*dtsrc
          IF (precip_mm < 0.) precip_mm=0.
          IF (wmxtr < 0.) wmxtr=0.
          CALL get_wash_factor(n,b_beta_dt,precip_mm,fwasht,temp,lhx,
     &         wmxtr,cldprec,l,tm,trprbar(1,l),thwash,pl(l),ntix) !washout
#endif
          WMXTR = WMX(L)
c         b_beta_DT is needed at the lowest precipitating level,
c         so saving it here for below cloud case:
          b_beta_DT = cldsavt*CM*dtsrc
c         saves cloud fraction at lowest precipitating level for washout
          cldprec=cldsavt
          CALL GET_COND_FACTOR(L,N,WMXTR,TL(L),TL(L),LHX,FCLD,FQTOW
     *         ,FQTOWT,.false.,TRWML,TM,THLAW,TR_LEF,PL(L),ntix,CLDSAVT)
cdmk added arguments above; THLAW added below (no way to factor this)
        END IF
        IF (TM(L,N).GT.teeny) THEN
          TMFAC=THLAW/TM(L,N)
          TMFAC2=THWASH/TM(L,N)
        ELSE
          TMFAC=0.
          TMFAC2=0.
        ENDIF
        FPRT=FPR
c ---------------------- calculate fluxes ------------------------
        DTERT = FERT  *TRPRBAR(N,L+1)
        DTPRT = FPRT  *TRWML(N,L)
        DTQWT =
     &  FQTOWT*TR_LEF*(TM(L,N)+DTERT)-FWTOQT*TRWML(N,L)*(1.-FPRT)
#ifndef NO_WASHOUT_IN_CLOUDS
        dtwrt=fwasht*(tm(l,n)-dtqwt)
#else
        dtwrt=fwasht*tm(l,n)
#endif
c ---------------------- apply fluxes ------------------------
        TRWML(N,L) = TRWML(N,L)*(1.-FPRT)  + DTQWT+THLAW
#ifdef TRDIAG_WETDEPO
        IF (diag_wetdep == 1) THEN
          trevap_ls(l,n)=dtert
          trwash_ls(l,n)=dtwrt+thwash
          trclwc_ls(l,n)=fqtowt*tr_lef*(tm(l,n)+dtert)+thlaw
          trprcp_ls(l,n)=dtprt
          trclwe_ls(l,n)=fwtoqt*trwml(n,l)*(1.-fprt)
        END IF
#endif
        TM(L,N)    = TM(L,N)  + DTERT - DTWRT - DTQWT - THLAW - THWASH
        TRPRBAR(N,L)=TRPRBAR(N,L+1)*(1.-FERT) + DTPRT+DTWRT+THWASH
        IF (PREBAR(L).eq.0) TRPRBAR(N,L)=0.  ! remove round off error
        IF (WMX(L).eq.0) TRWML(N,L)=0.       ! remove round off error
        TMOM(:,L,N)  = TMOM(:,L,N)*(1. - FQTOWT - FWASHT
     *    - TMFAC - TMFAC2)
#ifdef TRACERS_SPECIAL_O18
C**** Isotopic equilibration of the CLW and water vapour
        IF (LHX.eq.LHE .and. WMX(L).gt.0) THEN  ! only if liquid
          CALL ISOEQUIL(NTIX(N),TL(L),.TRUE.,QL(L)*FSSL(L),WMX(L),
     *         TM(L,N),TRWML(N,L),1d0)
        END IF
C**** Isotopic equilibration of Precip (if liquid) and water vapour
C**** Note that precip is either all water or all ice
        IF (LHP(L).eq.LHE .AND. PREBAR(L).gt.0 .AND. QL(L).gt.0) THEN
          PRLIQ=PREBAR(L)*DTSrc*BYAM(L)*GRAV
          CALL ISOEQUIL(NTIX(N),TL(L),.TRUE.,QL(L)*FSSL(L),PRLIQ,
     *         TM(L,N),TRPRBAR(N,L),1d0)
        END IF
#endif
      END DO
#endif
C**** CONDENSE MORE MOISTURE IF RELATIVE HUMIDITY .GT. 1
C     QSATL(L)=QSAT(TL(L),LHX,PL(L))   ! =QSATC
      RH1(L)=QL(L)/QSATC
      IF(LHX.EQ.LHS) THEN
        IF(RH(L).LE.1.) CLEARA(L)=DSQRT((1.-RH(L))/(1.-RH00(L)+teeny))
        IF(CLEARA(L).GT.1.) CLEARA(L)=1.
        IF(RH(L).GT.1.) CLEARA(L)=0.
        IF(WMX(L).LE.0.) CLEARA(L)=1.
        QF=(QL(L)-QSATC*(1.-CLEARA(L)))/(CLEARA(L)+teeny)
        IF(QF.LT.0.) WRITE(6,*) 'L CA QF Q QSA=',L,CLEARA(L),QF,QL(L),
     *               QSATC
        QSATE=QSAT(TL(L),LHE,PL(L))
        RHW=.00536d0*TL(L)-.276d0
        RH1(L)=QF/QSATE
        IF(TL(L).LT.238.16) RH1(L)=QF/(QSATE*RHW)
      END IF
C     IF(RH1(L).LE.1. .AND. RH(L).GT.1.4) WRITE(6,*) 'L T RH RH1 RHW,
C    * QL QSAT=',L,TL(L),RH(L),RH1(L),RHW,QL(L),QSATE
      IF(RH1(L).GT.1.) THEN    ! RH was used in old versions
      SLH=LHX*BYSHA
      DQSUM=0.
      DO N=1,3
        IF(N.NE.1) QSATC=QSAT(TL(L),LHX,PL(L))
        DQ=(QL(L)-QSATC)/(1.+SLH*QSATC*DQSATDT(TL(L),LHX))
        TL(L)=TL(L)+SLH*DQ
        QL(L)=QL(L)-DQ
        DQSUM=DQSUM+DQ
      END DO
      IF(DQSUM.GT.0.) THEN
      WMX(L)=WMX(L)+DQSUM*FSSL(L)
      FCOND=DQSUM/QNEW
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      WA_VOL=0.
      IF (WMX(L).GT.teeny) THEN
        WA_VOL=WMX(L)*AIRM(L)*1.D2*BYGRAV*DXYPJ
      ENDIF
#endif
C**** adjust gradients down if Q decreases
      QMOM(:,L)= QMOM(:,L)*(1.-FCOND)
#ifdef TRACERS_WATER
C**** CONDENSING MORE TRACERS
      WMXTR = WMX(L)
        IF(RH(L).LE.1.) CLDSAVT=1.-DSQRT((1.-RH(L))/(1.-RH00(L)+teeny))
        IF(CLDSAVT.LT.0.) CLDSAVT=0.
        IF(RH(L).GT.1.) CLDSAVT=1.
        IF (CLDSAVT.GT.1.) CLDSAVT=1.
        IF (WMX(L).LE.0.) CLDSAVT=0.
        CLDSAVT=CLDSAVT*FSSL(L)
cdmks  I took out some code above this that was for below cloud
c   processes - this should be all in-cloud
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      CALL GET_SULFATE(L,TL(L),CLDSAVT,WA_VOL,WMXTR,SULFIN,
     *     SULFINC,SULFOUT,TR_LEFT,TM,TRWML(1,L),AIRM,LHX,
     *     DT_SULF_SS(1,L),FCLD)
#endif
      DO N=1,NTX
        TR_LEF=1.
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
      select case (trname(ntix(n)))
      case('SO2','SO4','H2O2_s','H2O2')
      if (trname(ntix(n)).eq."H2O2" .and. coupled_chem.eq.0) goto 405
      if (trname(ntix(n)).eq."H2O2_s" .and. coupled_chem.eq.1) goto 405

        TRWML(N,L)=TRWML(N,L)*(1.+SULFINC(N))
        TM(L,N)=TM(L,N)*(1.+SULFIN(N))
        TMOM(:,L,N) =TMOM(:,L,N)*(1.+SULFIN(N))
        TRWML(N,L) = TRWML(N,L)+SULFOUT(N)
        TR_LEF=TR_LEFT(N)

 405    CONTINUE

      end select

#endif
c below TR_LEFT(N) limits the amount of available tracer in gridbox
cdmkf and below, extra arguments for GET_COND, addition of THLAW
        CALL GET_COND_FACTOR(L,N,WMXTR,TL(L),TL(L),LHX,FCLD,FCOND
     *       ,FQCONDT,.false.,TRWML,TM,THLAW,TR_LEF,pl(l),ntix,CLDSAVT)
        IF (TM(L,N).GT.teeny) THEN
          TMFAC=THLAW/TM(L,N)
        ELSE
          TMFAC=0.
        ENDIF
        TRWML(N,L)  =TRWML(N,L)+ FQCONDT*TM(L,N)+THLAW
        TM(L,N)     =TM(L,N)    *(1.-FQCONDT)   -THLAW
        TMOM(:,L,N) =TMOM(:,L,N)*(1.-FQCONDT - TMFAC)
#ifdef TRDIAG_WETDEPO
        IF (diag_wetdep == 1) trcond_ls(l,n)=fqcondt*tm(l,n)+thlaw
#endif
      END DO
#endif
      ELSE
      TL(L)=TNEW
      QL(L)=QNEW
      END IF
      RH(L)=QL(L)/QSAT(TL(L),LHX,PL(L))
      TH(L)=TL(L)/PLK(L)
      TNEW=TL(L)
!     if (debug_out) write(0,*) 'after condensation: l,tlnew,',l,tl(l)
      END IF
      IF(RH(L).LE.1.) CLEARA(L)=DSQRT((1.-RH(L))/(1.-RH00(L)+teeny))
      IF(CLEARA(L).GT.1.) CLEARA(L)=1.
      IF(RH(L).GT.1.) CLEARA(L)=0.
      IF(WMX(L).LE.0.) CLEARA(L)=1.
      IF(CLEARA(L).LT.0.) CLEARA(L)=0.
      RHF(L)=RH00(L)+(1.-CLEARA(L))*(1.-RH00(L))
      IF(RH(L).LE.RHF(L).AND.RH(L).LT..999999.AND.WMX(L).gt.0.) THEN
C**** PRECIP OUT CLOUD WATER IF RH LESS THAN THE RH OF THE ENVIRONMENT
#ifdef TRACERS_WATER
        TRPRBAR(1:NTX,L) = TRPRBAR(1:NTX,L) + TRWML(1:NTX,L)
#ifdef TRDIAG_WETDEPO
        IF (diag_wetdep == 1)
     &       trprcp_ls(l,1:ntx)=trprcp_ls(l,1:ntx)+trwml(1:ntx,l)
#endif
        TRWML(1:NTX,L) = 0.
#endif
        PREBAR(L)=PREBAR(L)+WMX(L)*AIRM(L)*BYGRAV*BYDTsrc
        IF(LHP(L).EQ.LHS .AND. LHX.EQ.LHE) THEN
          HCHANG=WMX(L)*LHM
          TL(L)=TL(L)+HCHANG/(SHA*FSSL(L)+teeny)
!         if(debug_out) write(0,*) 'after rain out: l,tlnew',l,tl(l)
          TH(L)=TL(L)/PLK(L)
        END IF
        WMX(L)=0.
      END IF
      prebar1(l)=prebar(l)
C**** set phase of condensation for next box down
      PREICE(L)=0.
      IF (PREBAR(L).gt.0 .AND. LHP(L).EQ.LHS) PREICE(L)=PREBAR(L)
      IF (PREBAR(L).le.0) LHP(L)=0.
C**** COMPUTE THE LARGE-SCALE CLOUD COVER
      IF(RH(L).LE.1.) CLEARA(L)=DSQRT((1.-RH(L))/(1.-RH00(L)+teeny))
      IF(CLEARA(L).GT.1.) CLEARA(L)=1.
      IF(RH(L).GT.1.) CLEARA(L)=0.
      IF(WMX(L).LE.0.) CLEARA(L)=1.
      IF(CLEARA(L).LT.0.) CLEARA(L)=0.
      CLDSSL(L)=FSSL(L)*(1.-CLEARA(L))
      CLDSAVL(L)=1.-CLEARA(L)
#ifdef TRACERS_WATER
      IF(CLDSSL(L).gt.0.) CLOUD_YET=.true.
      IF(CLOUD_YET.and.CLDSSL(L).eq.0.) BELOW_CLOUD=.true.
#endif
      TOLDUP=TOLD
C**** ACCUMULATE SOME DIAGNOSTICS
         HCNDSS=HCNDSS+FSSL(L)*(TNEW-TOLD)*AIRM(L)
         SSHR(L)=SSHR(L)+FSSL(L)*(TNEW-TOLD)*AIRM(L)
      END DO  ! end of loop over L

      PRCPSS=MAX(0d0,PREBAR(1)*GRAV*DTsrc) ! fix small round off err
#ifdef TRACERS_WATER
      TRPRSS(1:NTX)=MAX(0d0,TRPRBAR(1:NTX,1))
#endif
C****
C**** CLOUD-TOP ENTRAINMENT INSTABILITY
C****
      DO L=LP50-1,1,-1
        SM(L)=TH(L)*AIRM(L)
        QM(L)=QL(L)*AIRM(L)
        WMXM(L)=WMX(L)*AIRM(L)
        SM(L+1)=TH(L+1)*AIRM(L+1)
        QM(L+1)=QL(L+1)*AIRM(L+1)
        WMXM(L+1)=WMX(L+1)*AIRM(L+1)
        TOLD=TL(L)
        TOLDU=TL(L+1)
        QOLD=QL(L)
        QOLDU=QL(L+1)
        FCLD=(1.-CLEARA(L))*FSSL(L)+teeny
        IF(CLEARA(L).EQ.1. .OR. (CLEARA(L).LT.1..AND.CLEARA(L+1).LT.1.))
     *       CYCLE
        SEDGE=THBAR(TH(L+1),TH(L))
        DSE=(TH(L+1)-SEDGE)*PLK(L+1)+(SEDGE-TH(L))*PLK(L)+
     *       SLHE*(QL(L+1)-QL(L))
        DWM=QL(L+1)-QL(L)+(WMX(L+1)-WMX(L))/FCLD
        DQSDT=DQSATDT(TL(L),LHE)*QL(L)/(RH(L)+1d-30)
        BETA=(1.+BYMRAT*TL(L)*DQSDT)/(1.+SLHE*DQSDT)
        CKM=(1.+SLHE*DQSDT)*(1.+(1.-DELTX)*TL(L)/SLHE)/
     *       (2.+(1.+BYMRAT*TL(L)/SLHE)*SLHE*DQSDT)
        CKR=TL(L)/(BETA*SLHE)
        CK=DSE/(SLHE*DWM+teeny)
        SIGK=0.
        IF(CKR.GT.CKM) CYCLE
        IF(CK.GT.CKR) SIGK=COESIG*((CK-CKR)/(CKM-CKR+teeny))**5
        EXPST=EXP(-SIGK*DTsrc)
        IF(L.LE.1) CKIJ=EXPST
        DSEC=DWM*TL(L)/BETA
        IF(CK.LT.CKR) CYCLE
        FPMAX=MIN(1d0,1.-EXPST)
#ifdef CLD_AER_CDNC
        SMFPML(L)=FPMAX
#endif
        IF(FPMAX.LE.0.) CYCLE
        IF(DSE.GE.DSEC) CYCLE
C**** MIXING TO REMOVE CLOUD-TOP ENTRAINMENT INSTABILITY
        AIRMR=(AIRM(L+1)+AIRM(L))*BYAM(L+1)*BYAM(L)
        SMO1=SM(L)
        QMO1=QM(L)
        WMO1=WMXM(L)
        SMO2=SM(L+1)
        QMO2=QM(L+1)
        WMO2=WMXM(L+1)
        SMO12=SMO1*PLK(L)+SMO2*PLK(L+1)
        DO K=1,KMAX
          UMO1(K)=UM(K,L)
          VMO1(K)=VM(K,L)
          UMO2(K)=UM(K,L+1)
          VMO2(K)=VM(K,L+1)
        ENDDO
        FPLUME=FPMAX*FSSL(L)
        DFX=FPLUME ! not FPMAX
        DO ITER=1,9
          DFX=DFX*0.5
          FMIX=FPLUME*FCLD
          FMASS=FMIX*AIRM(L)
          FMASS=MIN(FMASS,(AIRM(L+1)*AIRM(L))/(AIRM(L+1)+AIRM(L)))
          FMIX=FMASS*BYAM(L)
          FRAT=FMASS*BYAM(L+1)
          SMN1=SMO1*(1.-FMIX)+FRAT*SMO2
          QMN1=QMO1*(1.-FMIX)+FRAT*QMO2
          WMN1=WMO1*(1.-FMIX)+FRAT*WMO2
          SMN2=SMO2*(1.-FRAT)+FMIX*SMO1
          QMN2=QMO2*(1.-FRAT)+FMIX*QMO1
          WMN2=WMO2*(1.-FRAT)+FMIX*WMO1
          THT1=SMN1*BYAM(L)/PLK(L)
          QLT1=QMN1*BYAM(L)
          TLT1=THT1*PLK(L)
          LHX=SVLHXL(L)
          RHT1=QLT1/(QSAT(TLT1,LHX,PL(L)))
          WMT1=WMN1*BYAM(L)
          THT2=SMN2*BYAM(L+1)/PLK(L+1)
          QLT2=QMN2*BYAM(L+1)
          WMT2=WMN2*BYAM(L+1)
          SEDGE=THBAR(THT2,THT1)
          DSE=(THT2-SEDGE)*PLK(L+1)+(SEDGE-THT1)*PLK(L)+SLHE*(QLT2-QLT1)
          DWM=QLT2-QLT1+(WMT2-WMT1)/FCLD
          DQSDT=DQSATDT(TLT1,LHE)*QLT1/(RHT1+1d-30)
          BETA=(1.+BYMRAT*TLT1*DQSDT)/(1.+SLHE*DQSDT)
          CKM=(1.+SLHE*DQSDT)*(1.+(1.-DELTX)*TLT1/SLHE)/
     *         (2.+(1.+BYMRAT*TLT1/SLHE)*SLHE*DQSDT)
          DSEC=DWM*TLT1/BETA
          DSEDIF=DSE-DSEC
          IF(DSEDIF.GT.1d-3) FPLUME=FPLUME-DFX
          IF(DSEDIF.LT.-1d-3) FPLUME=FPLUME+DFX
          IF(ABS(DSEDIF).LE.1d-3.OR.FPLUME.GT.FPMAX) EXIT
        END DO
C**** UPDATE TEMPERATURE, SPECIFIC HUMIDITY AND MOMENTUM DUE TO CTEI
        SMN12=SMN1*PLK(L)+SMN2*PLK(L+1)
        SMN1=SMN1-(SMN12-SMO12)*AIRM(L)/((AIRM(L)+AIRM(L+1))*PLK(L))
        SMN2=SMN2-(SMN12-SMO12)*AIRM(L+1)/((AIRM(L)+AIRM(L+1))*PLK(L+1))
        TH(L)=SMN1*BYAM(L)
        TL(L)=TH(L)*PLK(L)
!       if(debug_out) write(0,*) 'after CTEI: l,tlnew',l,tl(l)
        QL(L)=QMN1*BYAM(L)
        LHX=SVLHXL(L)
        RH(L)=QL(L)/QSAT(TL(L),LHX,PL(L))
        WMX(L)=WMN1*BYAM(L)
        TH(L+1)=SMN2*BYAM(L+1)
        QL(L+1)=QMN2*BYAM(L+1)
        WMX(L+1)=WMN2*BYAM(L+1)
        CALL CTMIX (SM(L),SMOM(1,L),FMASS*AIRMR,FMIX,FRAT)
        CALL CTMIX (QM(L),QMOM(1,L),FMASS*AIRMR,FMIX,FRAT)
C****
#ifdef TRACERS_ON
        DO N=1,NTX
          CALL CTMIX (TM(L,N),TMOM(1,L,N),FMASS*AIRMR,FMIX,FRAT)
#ifdef TRACERS_WATER
C**** mix cloud liquid water tracers as well
          TWMTMP      = TRWML(N,L  )*(1.-FMIX)+FRAT*TRWML(N,L+1)
          TRWML(N,L+1)= TRWML(N,L+1)*(1.-FRAT)+FMIX*TRWML(N,L  )
          TRWML(N,L)  = TWMTMP
#endif
        END DO
#endif
        DO K=1,KMAX
          UMN1(K)=(UMO1(K)*(1.-FMIX)+FRAT*UMO2(K))
          VMN1(K)=(VMO1(K)*(1.-FMIX)+FRAT*VMO2(K))
          UMN2(K)=(UMO2(K)*(1.-FRAT)+FMIX*UMO1(K))
          VMN2(K)=(VMO2(K)*(1.-FRAT)+FMIX*VMO1(K))
          UM(K,L)=UM(K,L)+(UMN1(K)-UMO1(K))*RA(K)
          VM(K,L)=VM(K,L)+(VMN1(K)-VMO1(K))*RA(K)
          UM(K,L+1)=UM(K,L+1)+(UMN2(K)-UMO2(K))*RA(K)
          VM(K,L+1)=VM(K,L+1)+(VMN2(K)-VMO2(K))*RA(K)
        END DO
C**** RE-EVAPORATION OF CLW IN THE UPPER LAYER
        QL(L+1)=QL(L+1)+WMX(L+1)/(FSSL(L)+teeny)
        TH(L+1)=TH(L+1)-(LHX*BYSHA)*WMX(L+1)/(PLK(L+1)*FSSL(L)+teeny)
        TL(L+1)=TH(L+1)*PLK(L+1)
!       if(debug_out) write(0,*) 'after re-evap: l,tlnew',l+1,tl(l+1)
        RH(L+1)=QL(L+1)/QSAT(TL(L+1),LHX,PL(L+1))
        WMX(L+1)=0.
#ifdef TRACERS_WATER
        TM(L+1,1:NTX)=TM(L+1,1:NTX)+TRWML(1:NTX,L+1)
#ifdef TRDIAG_WETDEPO
        IF (diag_wetdep == 1)
     &       trclwe_ls(l+1,1:ntx)=trclwe_ls(l+1,1:ntx)+trwml(1:ntx,l+1)
#endif
        TRWML(1:NTX,L+1)=0.
#endif
        IF(RH(L).LE.1.) CLEARA(L)=DSQRT((1.-RH(L))/(1.-RH00(L)+teeny))
        IF(CLEARA(L).GT.1.) CLEARA(L)=1.
        IF(RH(L).GT.1.) CLEARA(L)=0.
        CLDSSL(L)=FSSL(L)*(1.-CLEARA(L))
        CLDSAVL(L)=1.-CLEARA(L)
        TNEW=TL(L)
        TNEWU=TL(L+1)
        QNEW=QL(L)
        QNEWU=QL(L+1)
        HCNDSS=HCNDSS+FSSL(L)*(TNEW-TOLD)*AIRM(L)+
     *         FSSL(L+1)*(TNEWU-TOLDU)*AIRM(L+1)
        SSHR(L)=SSHR(L)+FSSL(L)*(TNEW-TOLD)*AIRM(L)
        SSHR(L+1)=SSHR(L+1)+FSSL(L+1)*(TNEWU-TOLDU)*AIRM(L+1)
       DCTEI(L)=DCTEI(L)+FSSL(L)*(QNEW-QOLD)*AIRM(L)*LHX*BYSHA
       DCTEI(L+1)=DCTEI(L+1)+FSSL(L+1)*(QNEWU-QOLDU)*AIRM(L+1)*LHX*BYSHA
      END DO

C**** COMPUTE CLOUD PARTICLE SIZE AND OPTICAL THICKNESS
      WMSUM=0.
#ifdef CLD_AER_CDNC
      ACDNWS=0.
      ACDNIS=0.
      AREWS=0.
      AREIS=0.
      ALWWS=0.
      ALWIS=0.
      NLSW = 0
      NLSI = 0
#endif
      DO L=1,LP50
        FCLD=CLDSSL(L)+teeny
        WTEM=1.d5*WMX(L)*PL(L)/(FCLD*TL(L)*RGAS+teeny)
        LHX=SVLHXL(L)
        IF(LHX.EQ.LHS.AND.WMX(L)/FCLD.GE.WMUI*1d-3)
     *       WTEM=1d5*WMUI*1.d-3*PL(L)/(TL(L)*RGAS)
        IF(WTEM.LT.1d-10) WTEM=1.d-10
C***Setting constant values of CDNC over land and ocean to get RCLD=f(CDNC,LWC)
      SNdO = 59.68d0/(RWCLDOX**3)
      SNdL = 174.d0
      SNdI = 0.06417127d0
#ifdef CLD_AER_CDNC
!@auth Menon for CDNC prediction
      CALL GET_CDNC_UPD(L,LHX,WCONST,WMUI,WMX(L),FCLD,CLDSSL(L),
     *CLDSAVL(L),VVEL,SME(L),DSU,SMFPML(L),OLDCDO(L),OLDCDL(L),
     *CDNL1,CDNO1)
      OLDCDL(L) = CDNL1
      OLDCDO(L) = CDNO1
      SNdO=CDNO1
      SNdL=CDNL1
#endif
      SCDNCW=SNdO*(1.-PEARTH)+SNdL*PEARTH
      SCDNCI=SNdI
#ifdef CLD_AER_CDNC
      If (SCDNCW.le.20.d0) SCDNCW=20.d0   !set min CDNC sensitivity test
c     if(SCDNCW.gt.1400.d0)
c    * write(6,*) "SCND CDNC",SCDNCW,OLDCDL(l),OLDCDO(l)
c     If (SCDNCW.ge.1400.d0) SCDNCW=1400.d0   !set max CDNC sensitivity test
#endif

        IF(LHX.EQ.LHE) THEN

!         RCLD=(RWCLDOX*10.*(1.-PEARTH)+7.0*PEARTH)*(WTEM*4.)**BY3
          RCLD=RCLDX*100.d0*(WTEM/(2.d0*BY3*TWOPI*SCDNCW))**BY3
          QHEATC=(QHEAT(L)+FSSL(L)*CLEARA(L)*(EC(L)+ER(L)))/LHX
          IF(RCLD.GT.20..AND.PREP(L).GT.QHEATC) RCLD=20.
        ELSE
!         RCLD=25.0*(WTEM/4.2d-3)**BY3 * (1.+pl(l)*xRICld)
          RCLD=RCLDX*100.d0*(WTEM/(2.d0*BY3*TWOPI*SCDNCI))**BY3
     *         *(1.+pl(l)*xRICld)
        ENDIF
        RCLDE=RCLD/BYBR
#ifdef CLD_AER_CDNC
C** Using the Liu and Daum paramet
C** for spectral dispersion effects on droplet size distribution
      Repsi=1.d0 - 0.7d0*exp(-0.003d0*SCDNCW)
      Repsis=Repsi*Repsi
      Rbeta=(((1.d0+2.d0*Repsis)**0.667d0))/((1.d0+Repsis)**0.333d0)
!     write(6,*)"RCLD",Rbeta,RCLD,SCDNCW,Repsis
      RCLDE=RCLD*Rbeta
!@auth Menon    end of addition  comment out the RCLDE definition below
#endif
        CSIZEL(L)=RCLDE
#ifdef CLD_AER_CDNC  !save for diag purposes
        IF (FCLD.gt.1.d-5.and.LHX.eq.LHE) then
            ACDNWS(L)= SCDNCW
            AREWS(L) = RCLDE
            ALWWS(L) = WTEM
            CDN3DL(L)=SCDNCW
            CRE3DL(L)=RCLDE
            NLSW  = NLSW + 1
c      if(ACDNWS(L).gt.20.d0) write(6,*)"INWCLD",ACDNWS(L),
c    * SCDNCW,NLSW,AREWS(L),RCLDE,LHX
        elseif(FCLD.gt.1.d-5.and.LHX.eq.LHS) then
            ACDNIS(L)= SCDNCI
            AREIS(L) = RCLDE
            ALWIS(L) = WTEM
            CDN3DL(L)=SCDNCI
            CRE3DL(L)=RCLDE
            NLSI  = NLSI + 1
c      if(ACDNIS(L).gt.0.d0)    write(6,*)"INICLD",ACDNIS(L),
c    * SCDNCI,NLSI,AREIS(L),RCLDE,LHX
        ENDIF
#endif
        TEM=AIRM(L)*WMX(L)*1.d2*BYGRAV
        TAUSSL(L)=1.5d3*TEM/(FCLD*RCLDE+teeny)
        IF(TAUSSL(L).GT.100.) TAUSSL(L)=100.
        IF(LHX.EQ.LHE) WMSUM=WMSUM+TEM
#ifdef CLD_AER_CDNC
        SMLWP=WMSUM
#endif
      END DO

C**** CALCULATE OPTICAL THICKNESS
      DO L=1,LP50
        CLDSV1(L)=CLDSSL(L)
        IF(WMX(L).LE.0.) SVLHXL(L)=0.
        IF(TAUMCL(L).EQ.0..OR.CKIJ.NE.1.) THEN
          BMAX=1.-EXP(-(CLDSV1(L)/.3d0))
          IF(CLDSV1(L).GE..95d0) BMAX=CLDSV1(L)
          IF(L.EQ.1.OR.L.LE.DCL) THEN
            CLDSSL(L)=MIN(CLDSSL(L)+(BMAX-CLDSSL(L))*CKIJ,FSSL(L))
            TAUSSL(L)=TAUSSL(L)*CLDSV1(L)/(CLDSSL(L)+teeny)
          ENDIF
          IF(TAUSSL(L).LE.0.) CLDSSL(L)=0.
          IF(L.GT.DCL .AND. TAUMCL(L).LE.0.) THEN
            CLDSSL(L)=MIN(CLDSSL(L)**(2.*BY3),FSSL(L))
            TAUSSL(L)=TAUSSL(L)*CLDSV1(L)**BY3
          END IF
        END IF
      END DO


!Save variables for 3 hrly diagnostics
c     AAA=1
c     DO L=LP50,1,-1
c       if (CLDSSL(L).gt.0.d0.and.CLDMCL(L).gt.0.d0) then
c        if (TAUSSL(L).gt.0.d0.and.TAUMCL(L).gt.0.d0) then
c         if (CLDSSL(L).LE.randu(xx))GO TO 7
c          AERTAUSS=TAUSSL(L)
c          AERTAU(L)=AERTAUSS
c   7     if (CLDMCL(L).LE.randu(xx))GO TO 8
c          AERTAUMC=TAUMCL(L)
c          IF(AERTAUMC.GT.AERTAU(L)) AERTAU(L)=AERTAUMC
c   8      SUMTAU=SUMTAU+AERTAU(L)
C**
C**   DETECT AT WHAT LAYER SUMTAU (COLUMN OPTICAL THICKNESS)
C**   IS ABOVE THOLD (THRESHOLD SET AT .1 TAU)
C**   THIS LAYER BECOMES CLOUD TOP LAYER (ILTOP)
C**
c         THOLD=(.1)
c         IF(SUMTAU.GT.THOLD)THEN
c         IFLAG=(AAA)
c           IF(IFLAG.EQ.1)THEN
c             ILTOP=L
c             AAA=0
c           ENDIF
c         ENDIF
c        ENDIF
c       ENDIF
c     ENDDO

#ifdef CLD_AER_CDNC
      DO L=1,LP50
       CTEML(L)=TL(L)                            ! Cloud temperature(K)
       D3DL(L)=AIRM(L)*TL(L)*bygrav*rgas/PL(L)   ! For Cloud thickness (m)
       IF(CLDSSL(L).GT.0.d0) CD3DL(L)= 1.d0*D3DL(L)*CLDSAVL(L)/CLDSSL(L)
       RHO=1d2*PL(L)/(RGAS*TL(L))
       IF (SVLHXL(L).EQ.LHE) CL3DL(L) = WMX(L)*RHO*CD3DL(L) ! cld water kg m-2
       IF (SVLHXL(L).EQ.LHS) CI3DL(L) = WMX(L)*RHO*CD3DL(L) ! ice water kg m-2
c      write(6,*)"CT",L,WMX(L),CD3DL(l),CL3DL(L),CI3DL(L)
      END DO
#endif

      RETURN
      END SUBROUTINE LSCOND

      END MODULE CLOUDS

C----------


      SUBROUTINE ISCCP_CLOUD_TYPES(sunlit,pfull 2,20
     *     ,phalf,qv,cc,conv,dtau_s,dtau_c,skt,at,dem_s,dem_c,itrop
     *     ,fq_isccp,meanptop,meantaucld,nbox,jerr)
!@sum  ISCCP_CLOUD_TYPES calculate isccp cloud diagnostics in a column
!@auth Gavin Schmidt
!@ver  2.0 (from isccp version 3.5)
!@     GISS modifications:
!@       1) used modelE random number generator
!@       2) real-->real*8, e-2 -> d-2 etc.
!@       3) ncol, nlev taken from modules, add jerr flag
!@       4) emsfc_lw,top_height,overlap,npoints fixed
!@       5) sub in for constants
!@       6) use pre-calculated tropopause
!@       7) tautab/invtau from module
!@       8) removed boxtau,boxptop from output
!@       9) added back nbox for backwards compatibility
! *****************************COPYRIGHT*******************************
! (c) COPYRIGHT Steve Klein and Mark Webb 2004, All Rights Reserved.
! Steve Klein klein21@mail.llnl.gov
! Mark Webb mark.webb@metoffice.gov.uk markwebb@mail.com
! ISCCP SIMULATOR icarus-scops version 3.5
!
! This library is free software; you can redistribute it and/or
! modify it under the terms of the GNU Lesser General Public
! License as published by the Free Software Foundation; either
! version 2.1 of the License, or (at your option) any later version.
!
! This library is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
! Lesser General Public License for more details.
!
! You should have received a copy of the GNU Lesser General Public
! License along with this library; if not, write to the Free Software
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! See also http://www.gnu.org/copyleft/lesser.txt
!
! The Met Office hereby disclaims all copyright interest in
! the ISCCP Simulator ( a library which converts model clouds into
! direct equivalents to the satellite observations of the ISCCP)
! written by Steve Klein and Mark Webb
!
! Catherine Senior, August 2004
! Manager Climate Sensitivy Group
! Met Office   Hadley Centre for Climate Prediction and Research
! FitzRoy Road  Exeter  EX1 3PB  United Kingdom
! *****************************COPYRIGHT*******************************
      USE CONSTANT, only : wtmair=>mair,Navo=>avog,bygrav,bymrat
      USE RANDOM, only : randu
      USE MODEL_COM, only : nlev=>lm,qcheck
      USE CLOUDS, only : ncol,tautab,invtau
      implicit none
!@var  emsfc_lw    longwave emissivity of surface at 10.5 microns
      REAL*8, PARAMETER :: emsfc_lw=0.99d0
!@var pc1bylam Planck constant c1 by wavelength (10.5 microns)
      REAL*8, PARAMETER :: pc1bylam = 1.439d0/10.5d-4
!@var boxarea fractional area of each sub-grid scale box
      REAL*8, PARAMETER :: boxarea = 1d0/ncol
!@var t0 ave temp  (K)
      REAL*8, PARAMETER :: t0 = 296.
!@var t0bypstd ave temp by sea level press
      REAL*8, PARAMETER :: t0bypstd = t0/1.013250d6
      real*8, parameter :: bywc = 1./2.56d0 , byic= 1./2.13d0
      real*8, parameter :: isccp_taumin = 0.3d0  ! used to be 0.1

!  number of model points in the horizontal (FIXED FOR ModelE CODE)
      INTEGER, PARAMETER :: npoints=1

!     -----
!     Input
!     -----

c      INTEGER nlev          !  number of model levels in column
c      INTEGER ncol          !  number of subcolumns

      INTEGER sunlit(npoints) !  1 for day points, 0 for night time

c      INTEGER seed(npoints)
      !  seed values for marsaglia  random number generator
      !  It is recommended that the seed is set
      !  to a different value for each model
      !  gridbox it is called on, as it is
      !  possible that the choice of the same
      !  seed value every time may introduce some
      !  statistical bias in the results, particularly
      !  for low values of NCOL.

      REAL*8 pfull(npoints,nlev)
                       !  pressure of full model levels (Pascals)
                  !  pfull(npoints,1) is top level of model
                  !  pfull(npoints,nlev) is bot of model

      REAL*8 phalf(npoints,nlev+1)
                  !  pressure of half model levels (Pascals)
                  !  phalf(npoints,1) is top of model
                  !  phalf(npoints,nlev+1) is the surface pressure

      REAL*8 qv(npoints,nlev)
                  !  water vapor specific humidity (kg vapor/ kg air)
                  !         on full model levels

      REAL*8 cc(npoints,nlev)
                  !  input cloud cover in each model level (fraction)
                  !  NOTE:  This is the HORIZONTAL area of each
                  !         grid box covered by clouds

      REAL*8 conv(npoints,nlev)
                  !  input convective cloud cover in each model
                  !   level (fraction)
                  !  NOTE:  This is the HORIZONTAL area of each
                  !         grid box covered by convective clouds

      REAL*8 dtau_s(npoints,nlev)
                  !  mean 0.67 micron optical depth of stratiform
                !  clouds in each model level
                  !  NOTE:  this the cloud optical depth of only the
                  !  cloudy part of the grid box, it is not weighted
                  !  with the 0 cloud optical depth of the clear
                  !         part of the grid box

      REAL*8 dtau_c(npoints,nlev)
                  !  mean 0.67 micron optical depth of convective
                !  clouds in each
                  !  model level.  Same note applies as in dtau_s.

c      INTEGER overlap           !  overlap type
                                !  1=max
                                !  2=rand
                                !  3=max/rand

c      INTEGER top_height        !  1 = adjust top height using both a computed
                                !  infrared brightness temperature and the visible
                                !  optical depth to adjust cloud top pressure. Note
                                !  that this calculation is most appropriate to compare
                                !  to ISCCP data during sunlit hours.
                                !  2 = do not adjust top height, that is cloud top
                                !  pressure is the actual cloud top pressure
                                !  in the model
                                !  3 = adjust top height using only the computed
                                !  infrared brightness temperature. Note that this
                                !  calculation is most appropriate to compare to ISCCP
                                !  IR only algortihm (i.e. you can compare to nighttime
                                !  ISCCP data with this option)
      INTEGER, PARAMETER :: top_height=1, overlap=3


c      REAL*8 tautab(0:255)      !  ISCCP table for converting count value to
                                !  optical thickness

c      INTEGER invtau(-20:45000) !  ISCCP table for converting optical thickness
                                !  to count value
!
!     The following input variables are used only if top_height = 1 or top_height = 3
!
      REAL*8 skt(npoints)       !  skin Temperature (K)
c      REAL*8 emsfc_lw           !  10.5 micron emissivity of surface (fraction)

      REAL*8 at(npoints,nlev)   !  temperature in each model level (K)
      REAL*8 dem_s(npoints,nlev) !  10.5 micron longwave emissivity of stratiform
                                !  clouds in each
                                !  model level.  Same note applies as in dtau_s.
      REAL*8 dem_c(npoints,nlev) !  10.5 micron longwave emissivity of convective
                                !  clouds in each
                                !  model level.  Same note applies as in dtau_s.
      INTEGER itrop(npoints)    ! model level containing tropopause (WMO defn)

!     ------
!     Output
!     ------

      REAL*8 fq_isccp(npoints,7,7) !  the fraction of the model grid box covered by
                                !  each of the 49 ISCCP D level cloud types

      REAL*8 totalcldarea(npoints) !  the fraction of model grid box columns
                                !  with cloud somewhere in them.  This should
                                !  equal the sum over all entries of fq_isccp
      INTEGER nbox(npoints) !  the number of model grid box columns
                                !  with cloud somewhere in them.

! The following three means are averages over the cloudy areas only.  If no
! clouds are in grid box all three quantities should equal zero.

      REAL*8 meanptop(npoints)  !  mean cloud top pressure (mb) - linear averaging
                                !  in cloud top pressure.

      REAL*8 meantaucld(npoints) !  mean optical thickness
                                !  linear averaging in albedo performed.

      REAL*8 boxtau(npoints,ncol) !  optical thickness in each column

      REAL*8 boxptop(npoints,ncol) !  cloud top pressure (mb) in each column

      INTEGER JERR  ! error flag

!
!     ------
!     Working variables added when program updated to mimic Mark Webb's PV-Wave code
!     ------

      REAL*8 frac_out(npoints,ncol,nlev) ! boxes gridbox divided up into
                              ! Equivalent of BOX in original version, but
                              ! indexed by column then row, rather than
                              ! by row then column

      REAL*8 tca(npoints,0:nlev) ! total cloud cover in each model level (fraction)
                                ! with extra layer of zeroes on top
                                ! in this version this just contains the values input
                                ! from cc but with an extra level
      REAL*8 cca(npoints,nlev)  ! convective cloud cover in each model level (fraction)
                                ! from conv

      REAL*8 threshold(npoints,ncol) ! pointer to position in gridbox
      REAL*8 maxocc(npoints,ncol) ! Flag for max overlapped conv cld
      REAL*8 maxosc(npoints,ncol) ! Flag for max overlapped strat cld

      REAL*8 boxpos(npoints,ncol) ! ordered pointer to position in gridbox

      REAL*8 threshold_min(npoints,ncol) ! minimum value to define range in with new threshold
                                ! is chosen

      REAL*8 dem(npoints,ncol),bb(npoints) !  working variables for 10.5 micron longwave
                                !  emissivity in part of
                                !  gridbox under consideration

      REAL*8 ran(npoints)       ! vector of random numbers
      REAL*8 ptrop(npoints)
      REAL*8 attrop(npoints)
c      REAL*8 attropmin (npoints)
      REAL*8 atmax(npoints)
      REAL*8 atmin(npoints)
      REAL*8 btcmin(npoints)
      REAL*8 transmax(npoints)

      INTEGER i,j,ilev,ibox
      INTEGER ipres(npoints)
      INTEGER itau(npoints),ilev2
      INTEGER acc(nlev,ncol)
      INTEGER match(npoints,nlev-1)
      INTEGER nmatch(npoints)
      INTEGER levmatch(npoints,ncol)

      !variables needed for water vapor continuum absorption
      real*8 fluxtop_clrsky(npoints),trans_layers_above_clrsky(npoints)
      real*8 taumin(npoints)
      real*8 dem_wv(npoints,nlev)
      real*8 press(npoints), dpress(npoints), atmden(npoints)
      real*8 rvh20(npoints), wk(npoints), rhoave(npoints)
      real*8 rh20s(npoints), rfrgn(npoints)
      real*8 tmpexp(npoints),tauwv(npoints)

      character*1 cchar(6),cchar_realtops(6)
      integer icycle
      REAL*8 tau(npoints,ncol)
      LOGICAL box_cloudy(npoints,ncol)
      REAL*8 tb(npoints,ncol)
      REAL*8 ptop(npoints,ncol)
      REAL*8 emcld(npoints,ncol)
      REAL*8 fluxtop(npoints,ncol)
      REAL*8 trans_layers_above(npoints,ncol)
      real*8 fluxtopinit(npoints),tauir(npoints)
      real*8 meanalbedocld(npoints)
      REAL*8 albedocld(npoints,ncol)
c      integer debug       ! set to non-zero value to print out inputs
c                    ! with step debug
c      integer debugcol    ! set to non-zero value to print out column
c                    ! decomposition with step debugcol
      integer rangevec(npoints),rangeerror

      real*8 tauchk,xx

c      character*10 ftn09

      DATA cchar / ' ','-','1','+','I','+'/
      DATA cchar_realtops / ' ',' ','1','1','I','I'/

      JERR=0

c      INTEGER irand,i2_16,huge32,overflow_32  ! variables for RNG
c      PARAMETER(huge32=2147483647)
c      i2_16=65536

      tauchk = -1.*log(0.9999999)

c      ncolprint=0
c
c      if ( debug.ne.0 ) then
c          j=1
c          write(6,'(a10)') 'j='
c          write(6,'(8I10)') j
c          write(6,'(a10)') 'debug='
c          write(6,'(8I10)') debug
c          write(6,'(a10)') 'debugcol='
c          write(6,'(8I10)') debugcol
c          write(6,'(a10)') 'npoints='
c          write(6,'(8I10)') npoints
c          write(6,'(a10)') 'nlev='
c          write(6,'(8I10)') nlev
c          write(6,'(a10)') 'ncol='
c          write(6,'(8I10)') ncol
c          write(6,'(a10)') 'top_height='
c          write(6,'(8I10)') top_height
c          write(6,'(a10)') 'overlap='
c          write(6,'(8I10)') overlap
c          write(6,'(a10)') 'emsfc_lw='
c          write(6,'(8f10.2)') emsfc_lw
c          write(6,'(a10)') 'tautab='
c          write(6,'(8f10.2)') tautab
c          write(6,'(a10)') 'invtau(1:100)='
c          write(6,'(8i10)') (invtau(i),i=1,100)
c        do j=1,npoints,debug
c          write(6,'(a10)') 'j='
c          write(6,'(8I10)') j
c          write(6,'(a10)') 'sunlit='
c          write(6,'(8I10)') sunlit(j)
c          write(6,'(a10)') 'seed='
c          write(6,'(8I10)') seed(j)
c          write(6,'(a10)') 'pfull='
c          write(6,'(8f10.2)') (pfull(j,i),i=1,nlev)
c          write(6,'(a10)') 'phalf='
c          write(6,'(8f10.2)') (phalf(j,i),i=1,nlev+1)
c          write(6,'(a10)') 'qv='
c          write(6,'(8f10.3)') (qv(j,i),i=1,nlev)
c          write(6,'(a10)') 'cc='
c          write(6,'(8f10.3)') (cc(j,i),i=1,nlev)
c          write(6,'(a10)') 'conv='
c          write(6,'(8f10.2)') (conv(j,i),i=1,nlev)
c          write(6,'(a10)') 'dtau_s='
c          write(6,'(8g12.5)') (dtau_s(j,i),i=1,nlev)
c          write(6,'(a10)') 'dtau_c='
c          write(6,'(8f10.2)') (dtau_c(j,i),i=1,nlev)
c          write(6,'(a10)') 'skt='
c          write(6,'(8f10.2)') skt(j)
c          write(6,'(a10)') 'at='
c          write(6,'(8f10.2)') (at(j,i),i=1,nlev)
c          write(6,'(a10)') 'dem_s='
c          write(6,'(8f10.3)') (dem_s(j,i),i=1,nlev)
c          write(6,'(a10)') 'dem_c='
c          write(6,'(8f10.3)') (dem_c(j,i),i=1,nlev)
c        enddo
c      endif

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

!     assign 2d tca array using 1d input array cc

      do j=1,npoints
        tca(j,0)=0
      enddo

      do ilev=1,nlev
        do j=1,npoints
          tca(j,ilev)=cc(j,ilev)
        enddo
      enddo

!     assign 2d cca array using 1d input array conv

      do ilev=1,nlev
          do j=1,npoints
           cca(j,ilev)=conv(j,ilev)
          enddo
      enddo

c      if (ncolprint.ne.0) then
c      do j=1,npoints,1000
c        write(6,'(a10)') 'j='
c        write(6,'(8I10)') j
c        write (6,'(a)') 'seed:'
c        write (6,'(I3.2)') seed(j)
c
c        write (6,'(a)') 'tca_pp_rev:'
c        write (6,'(8f5.2)')
c     &   ((tca(j,ilev)),
c     &      ilev=1,nlev)
c
c        write (6,'(a)') 'cca_pp_rev:'
c        write (6,'(8f5.2)')
c     &   ((cca(j,ilev),ibox=1,ncolprint),ilev=1,nlev)
c      enddo
c      endif

      if (top_height .eq. 1 .or. top_height .eq. 3) then

      do j=1,npoints ! use pre-computed tropopause level
        ptrop(j) = pfull(j,itrop(j))
        attrop(j) = at(j,itrop(j))
        atmin(j) = 400.
        atmax(j) = 0.
      enddo

      do 12 ilev=1,nlev
        do j=1,npoints
          if (at(j,ilev) .gt. atmax(j)) atmax(j)=at(j,ilev)
          if (at(j,ilev) .lt. atmin(j)) atmin(j)=at(j,ilev)
        enddo
 12   continue

      end if

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

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

      do ilev=1,nlev
        do j=1,npoints

          rangevec(j)=0

          if (cc(j,ilev) .lt. 0. .or. cc(j,ilev) .gt. 1.) then
!           error = cloud fraction less than zero
!           error = cloud fraction greater than 1
            rangevec(j)=rangevec(j)+1
          endif

          if (conv(j,ilev) .lt. 0. .or. conv(j,ilev) .gt. 1.) then
!           ' error = convective cloud fraction less than zero'
!           ' error = convective cloud fraction greater than 1'
            rangevec(j)=rangevec(j)+2
          endif

          if (dtau_s(j,ilev) .lt. 0.) then
!           ' error = stratiform cloud opt. depth less than zero'
            rangevec(j)=rangevec(j)+4
          endif

          if (dtau_c(j,ilev) .lt. 0.) then
!           ' error = convective cloud opt. depth less than zero'
            rangevec(j)=rangevec(j)+8
          endif

          if (dem_s(j,ilev) .lt. 0. .or. dem_s(j,ilev) .gt. 1.) then
!             ' error = stratiform cloud emissivity less than zero'
!             ' error = stratiform cloud emissivity greater than 1'
            rangevec(j)=rangevec(j)+16
          endif

          if (dem_c(j,ilev) .lt. 0. .or. dem_c(j,ilev) .gt. 1.) then
!             ' error = convective cloud emissivity less than zero'
!             ' error = convective cloud emissivity greater than 1'
              rangevec(j)=rangevec(j)+32
          endif
        enddo

        rangeerror=0
        do j=1,npoints
            rangeerror=rangeerror+rangevec(j)
        enddo

        if (rangeerror.ne.0) then
              write (6,*) 'Input variable out of range'
              write (6,*) 'rangevec:'
              write (6,*) rangevec
              call sys_flush(6)
              JERR=1 ; return  !STOP
        endif
      enddo

      do ibox=1,ncol
        do j=1,npoints
        boxpos(j,ibox)=(ibox-.5)*boxarea
        enddo
      enddo

!     ---------------------------------------------------!
!     Initialise working variables
!     ---------------------------------------------------!

!     Initialised frac_out to zero

      do ilev=1,nlev
        do ibox=1,ncol
          do j=1,npoints
          frac_out(j,ibox,ilev)=0.0
          enddo
        enddo
      enddo

c      if (ncolprint.ne.0) then
c        write (6,'(a)') 'frac_out_pp_rev:'
c          do j=1,npoints,1000
c          write(6,'(a10)') 'j='
c          write(6,'(8I10)') j
c          write (6,'(8f5.2)')
c     &     ((frac_out(j,ibox,ilev),ibox=1,ncolprint),ilev=1,nlev)
c
c          enddo
c        write (6,'(a)') 'ncol:'
c        write (6,'(I3)') ncol
c      endif
c      if (ncolprint.ne.0) then
c        write (6,'(a)') 'last_frac_pp:'
c          do j=1,npoints,1000
c          write(6,'(a10)') 'j='
c          write(6,'(8I10)') j
c          write (6,'(8f5.2)') (tca(j,0))
c          enddo
c      endif

!     ---------------------------------------------------!
!     ALLOCATE CLOUD INTO BOXES, FOR NCOLUMNS, NLEVELS
!     frac_out is the array that contains the information
!     where 0 is no cloud, 1 is a stratiform cloud and 2 is a
!     convective cloud

      !loop over vertical levels
      DO 200 ilev = 1,nlev

!     Initialise threshold

        IF (ilev.eq.1) then
          ! If max overlap
          IF (overlap.eq.1) then
            ! select pixels spread evenly
            ! across the gridbox
              DO ibox=1,ncol
                do j=1,npoints
                  threshold(j,ibox)=boxpos(j,ibox)
                enddo
              enddo
          ELSE
              DO ibox=1,ncol
c                include 'congvec.f'
          do j=1,npoints
            ran(j)=randu(xx)
          end do
                ! select random pixels from the non-convective
                ! part the gridbox ( some will be converted into
                ! convective pixels below )
                do j=1,npoints
                  threshold(j,ibox)=
     &            cca(j,ilev)+(1-cca(j,ilev))*ran(j)
                enddo
              enddo
            ENDIF
c            IF (ncolprint.ne.0) then
c              write (6,'(a)') 'threshold_nsf2:'
c                do j=1,npoints,1000
c                write(6,'(a10)') 'j='
c                write(6,'(8I10)') j
c                write (6,'(8f5.2)') (threshold(j,ibox),ibox=1,ncolprint)
c                enddo
c            ENDIF
        ENDIF

c        IF (ncolprint.ne.0) then
c            write (6,'(a)') 'ilev:'
c            write (6,'(I2)') ilev
c        ENDIF

        DO ibox=1,ncol

          ! All versions
          do j=1,npoints
            if (boxpos(j,ibox).le.cca(j,ilev)) then
              maxocc(j,ibox) = 1
            else
              maxocc(j,ibox) = 0
            end if
          enddo

          ! Max overlap
          if (overlap.eq.1) then
            do j=1,npoints
              threshold_min(j,ibox)=cca(j,ilev)
              maxosc(j,ibox)=1
            enddo
          endif

          ! Random overlap
          if (overlap.eq.2) then
            do j=1,npoints
              threshold_min(j,ibox)=cca(j,ilev)
              maxosc(j,ibox)=0
            enddo
          endif

          ! Max/Random overlap
          if (overlap.eq.3) then
            do j=1,npoints
              threshold_min(j,ibox)=max(cca(j,ilev),
     &          min(tca(j,ilev-1),tca(j,ilev)))
              if (threshold(j,ibox)
     &          .lt.min(tca(j,ilev-1),tca(j,ilev))
     &          .and.(threshold(j,ibox).gt.cca(j,ilev))) then
                   maxosc(j,ibox)= 1
              else
                   maxosc(j,ibox)= 0
              end if
            enddo
          endif

          ! Reset threshold

c          include 'congvec.f'
          do j=1,npoints
            ran(j)=randu(xx)
          end do

          do j=1,npoints
            threshold(j,ibox)=
              !if max overlapped conv cloud
     &        maxocc(j,ibox) * (
     &            boxpos(j,ibox)
     &        ) +
              !else
     &        (1-maxocc(j,ibox)) * (
                  !if max overlapped strat cloud
     &            (maxosc(j,ibox)) * (
                      !threshold=boxpos
     &                threshold(j,ibox)
     &            ) +
                  !else
     &            (1-maxosc(j,ibox)) * (
                      !threshold_min=random[thrmin,1]
     &                threshold_min(j,ibox)+
     &                  (1-threshold_min(j,ibox))*ran(j)
     &           )
     &        )
          enddo

        ENDDO ! ibox

!          Fill frac_out with 1's where tca is greater than the threshold

           DO ibox=1,ncol
             do j=1,npoints
               if (tca(j,ilev).gt.threshold(j,ibox)) then
               frac_out(j,ibox,ilev)=1
               else
               frac_out(j,ibox,ilev)=0
               end if
             enddo
           ENDDO

!         Code to partition boxes into startiform and convective parts
!         goes here

           DO ibox=1,ncol
             do j=1,npoints
                if (threshold(j,ibox).le.cca(j,ilev)) then
                    ! = 2 IF threshold le cca(j)
                    frac_out(j,ibox,ilev) = 2
                else
                    ! = the same IF NOT threshold le cca(j)
                    frac_out(j,ibox,ilev) = frac_out(j,ibox,ilev)
                end if
             enddo
           ENDDO

!         Set last_frac to tca at this level, so as to be tca
!         from last level next time round

c          if (ncolprint.ne.0) then
c
c            do j=1,npoints ,1000
c            write(6,'(a10)') 'j='
c            write(6,'(8I10)') j
c            write (6,'(a)') 'last_frac:'
c            write (6,'(8f5.2)') (tca(j,ilev-1))
c
c            write (6,'(a)') 'cca:'
c            write (6,'(8f5.2)') (cca(j,ilev),ibox=1,ncolprint)
c
c            write (6,'(a)') 'max_overlap_cc:'
c            write (6,'(8f5.2)') (maxocc(j,ibox),ibox=1,ncolprint)
c
c            write (6,'(a)') 'max_overlap_sc:'
c            write (6,'(8f5.2)') (maxosc(j,ibox),ibox=1,ncolprint)
c
c            write (6,'(a)') 'threshold_min_nsf2:'
c            write (6,'(8f5.2)') (threshold_min(j,ibox),ibox=1,ncolprint)
c
c            write (6,'(a)') 'threshold_nsf2:'
c            write (6,'(8f5.2)') (threshold(j,ibox),ibox=1,ncolprint)
c
c            write (6,'(a)') 'frac_out_pp_rev:'
c            write (6,'(8f5.2)')
c     &       ((frac_out(j,ibox,ilev2),ibox=1,ncolprint),ilev2=1,nlev)
c          enddo
c          endif

200   CONTINUE    !loop over nlev

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


!
!     ---------------------------------------------------!
!     COMPUTE CLOUD OPTICAL DEPTH FOR EACH COLUMN and
!     put into vector tau

      !initialize tau and albedocld to zero
      do 15 ibox=1,ncol
        do j=1,npoints
            tau(j,ibox)=0.
          albedocld(j,ibox)=0.
          boxtau(j,ibox)=0.
          boxptop(j,ibox)=0.
          box_cloudy(j,ibox)=.false.
        enddo
15    continue

      !compute total cloud optical depth for each column
      do ilev=1,nlev
            !increment tau for each of the boxes
            do ibox=1,ncol
              do j=1,npoints
                 if (frac_out(j,ibox,ilev).eq.1) then
                        tau(j,ibox)=tau(j,ibox)
     &                     + dtau_s(j,ilev)
                 endif
                 if (frac_out(j,ibox,ilev).eq.2) then
                        tau(j,ibox)=tau(j,ibox)
     &                     + dtau_c(j,ilev)
                 end if
              enddo
            enddo ! ibox
      enddo ! ilev
c          if (ncolprint.ne.0) then
c
c              do j=1,npoints ,1000
c                write(6,'(a10)') 'j='
c                write(6,'(8I10)') j
c                write(6,'(i2,1X,8(f7.2,1X))')
c     &          ilev,
c     &          (tau(j,ibox),ibox=1,ncolprint)
c              enddo
c          endif
!
!     ---------------------------------------------------!



!
!     ---------------------------------------------------!
!     COMPUTE INFRARED BRIGHTNESS TEMPERATURES
!     AND CLOUD TOP TEMPERATURE SATELLITE SHOULD SEE
!
!     again this is only done if top_height = 1 or 3
!
!     fluxtop is the 10.5 micron radiance at the top of the
!              atmosphere
!     trans_layers_above is the total transmissivity in the layers
!             above the current layer
!     fluxtop_clrsky(j) and trans_layers_above_clrsky(j) are the clear
!             sky versions of these quantities.

      if (top_height .eq. 1 .or. top_height .eq. 3) then


        !----------------------------------------------------------------------
        !
        !             DO CLEAR SKY RADIANCE CALCULATION FIRST
        !
        !compute water vapor continuum emissivity
        !this treatment follows Schwarkzopf and Ramasamy
        !JGR 1999,vol 104, pages 9467-9499.
        !the emissivity is calculated at a wavenumber of 955 cm-1,
        !or 10.47 microns
c        wtmair = 28.9644
c        wtmh20 = 18.01534
c        Navo = 6.023E+23
c        grav = 9.806650E+02
c        pstd = 1.013250E+06
c        t0 = 296.
c        if (ncolprint .ne. 0)
c     &         write(6,*)  'ilev   pw (kg/m2)   tauwv(j)      dem_wv'
        do 125 ilev=1,nlev
          do j=1,npoints
               !press and dpress are dyne/cm2 = Pascals *10
               press(j) = pfull(j,ilev)*10.
               dpress(j) = (phalf(j,ilev+1)-phalf(j,ilev))*10
               !atmden = g/cm2 = kg/m2 / 10
! minor GISS changes correct for unit difference in bygrav, bymrat,t0bypstd
               atmden(j) = dpress(j)*bygrav*0.01d0
               rvh20(j) = qv(j,ilev)*bymrat    !wtmair/wtmh20
               wk(j) = rvh20(j)*Navo*atmden(j)/wtmair
c               rhoave(j) = (press(j)/pstd)*(t0/at(j,ilev))
               rhoave(j) = (press(j)/at(j,ilev))*t0bypstd
               rh20s(j) = rvh20(j)*rhoave(j)
               rfrgn(j) = rhoave(j)-rh20s(j)
               tmpexp(j) = exp(-0.02d0*(at(j,ilev)-t0))
               tauwv(j) = wk(j)*1.d-20*(
     &           (0.0224697d0*rh20s(j)*tmpexp(j)) +
     &                (3.41817d-7*rfrgn(j)) )*0.98d0
               dem_wv(j,ilev) = 1. - exp( -1. * tauwv(j))
          enddo
c               if (ncolprint .ne. 0) then
c               do j=1,npoints ,1000
c               write(6,'(a10)') 'j='
c               write(6,'(8I10)') j
c               write(6,'(i2,1X,3(f8.3,3X))') ilev,
c     &           qv(j,ilev)*(phalf(j,ilev+1)-phalf(j,ilev))*bygrav,
c     &           tauwv(j),dem_wv(j,ilev)
c               enddo
c             endif
125     continue

        !initialize variables
        do j=1,npoints
          fluxtop_clrsky(j) = 0.
          trans_layers_above_clrsky(j)=1.
        enddo

        do ilev=1,nlev
          do j=1,npoints

            ! Black body emission at temperature of the layer
            ! 1307.27 = Planck constant c1 by wavelength 10.5
              bb(j)=1 / ( exp(pc1bylam/at(j,ilev)) - 1. )

              ! increase TOA flux by flux emitted from layer
              ! times total transmittance in layers above

                fluxtop_clrsky(j) = fluxtop_clrsky(j)
     &            + dem_wv(j,ilev)*bb(j)*trans_layers_above_clrsky(j)

                ! update trans_layers_above with transmissivity
              ! from this layer for next time around loop

                trans_layers_above_clrsky(j)=
     &            trans_layers_above_clrsky(j)*(1.-dem_wv(j,ilev))


          enddo
c            if (ncolprint.ne.0) then
c             do j=1,npoints ,1000
c              write(6,'(a10)') 'j='
c              write(6,'(8I10)') j
c              write (6,'(a)') 'ilev:'
c              write (6,'(I2)') ilev
c
c              write (6,'(a)')
c     &        'emiss_layer,100.*bb(j),100.*f,total_trans:'
c              write (6,'(4(f7.2,1X))') dem_wv(j,ilev),100.*bb(j),
c     &             100.*fluxtop_clrsky(j),trans_layers_above_clrsky(j)
c             enddo
c            endif

        enddo   !loop over level

        do j=1,npoints
          !add in surface emission
          bb(j)=1/( exp(pc1bylam/skt(j)) - 1. )
          !bb(j)=5.67d-8*skt(j)**4

          fluxtop_clrsky(j) = fluxtop_clrsky(j) + emsfc_lw * bb(j)
     &     * trans_layers_above_clrsky(j)
        enddo

c        if (ncolprint.ne.0) then
c        do j=1,npoints ,1000
c          write(6,'(a10)') 'j='
c          write(6,'(8I10)') j
c          write (6,'(a)') 'id:'
c          write (6,'(a)') 'surface'
c
c          write (6,'(a)') 'emsfc,100.*bb(j),100.*f,total_trans:'
c          write (6,'(4(f7.2,1X))') emsfc_lw,100.*bb(j),
c     &      100.*fluxtop_clrsky(j),
c     &       trans_layers_above_clrsky(j)
c        enddo
c      endif


        !
        !           END OF CLEAR SKY CALCULATION
        !
        !----------------------------------------------------------------



c        if (ncolprint.ne.0) then
c
c        do j=1,npoints ,1000
c            write(6,'(a10)') 'j='
c            write(6,'(8I10)') j
c            write (6,'(a)') 'ts:'
c            write (6,'(8f7.2)') (skt(j),ibox=1,ncolprint)
c
c            write (6,'(a)') 'ta_rev:'
c            write (6,'(8f7.2)')
c     &       ((at(j,ilev2),ibox=1,ncolprint),ilev2=1,nlev)
c
c        enddo
c        endif
        !loop over columns
        do ibox=1,ncol
          do j=1,npoints
            fluxtop(j,ibox)=0.
            trans_layers_above(j,ibox)=1.
          enddo
        enddo

        do ilev=1,nlev
              do j=1,npoints
                ! Black body emission at temperature of the layer

              bb(j)=1 / ( exp(pc1bylam/at(j,ilev)) - 1. )
              !bb(j)= 5.67d-8*at(j,ilev)**4
              enddo

            do ibox=1,ncol
              do j=1,npoints

              ! emissivity for point in this layer
                if (frac_out(j,ibox,ilev).eq.1) then
                dem(j,ibox)= 1. -
     &             ( (1. - dem_wv(j,ilev)) * (1. -  dem_s(j,ilev)) )
                else if (frac_out(j,ibox,ilev).eq.2) then
                dem(j,ibox)= 1. -
     &             ( (1. - dem_wv(j,ilev)) * (1. -  dem_c(j,ilev)) )
                else
                dem(j,ibox)=  dem_wv(j,ilev)
                end if


                ! increase TOA flux by flux emitted from layer
              ! times total transmittance in layers above

                fluxtop(j,ibox) = fluxtop(j,ibox)
     &            + dem(j,ibox) * bb(j)
     &            * trans_layers_above(j,ibox)

                ! update trans_layers_above with transmissivity
              ! from this layer for next time around loop

                trans_layers_above(j,ibox)=
     &            trans_layers_above(j,ibox)*(1.-dem(j,ibox))

              enddo ! j
            enddo ! ibox

c            if (ncolprint.ne.0) then
c              do j=1,npoints,1000
c              write (6,'(a)') 'ilev:'
c              write (6,'(I2)') ilev
c
c              write(6,'(a10)') 'j='
c              write(6,'(8I10)') j
c              write (6,'(a)') 'emiss_layer:'
c              write (6,'(8f7.2)') (dem(j,ibox),ibox=1,ncolprint)
c
c              write (6,'(a)') '100.*bb(j):'
c              write (6,'(8f7.2)') (100.*bb(j),ibox=1,ncolprint)
c
c              write (6,'(a)') '100.*f:'
c              write (6,'(8f7.2)')
c     &         (100.*fluxtop(j,ibox),ibox=1,ncolprint)
c
c              write (6,'(a)') 'total_trans:'
c              write (6,'(8f7.2)')
c     &          (trans_layers_above(j,ibox),ibox=1,ncolprint)
c            enddo
c          endif

        enddo ! ilev


          do j=1,npoints
            !add in surface emission
            bb(j)=1/( exp(pc1bylam/skt(j)) - 1. )
            !bb(j)=5.67d-8*skt(j)**4
          end do

        do ibox=1,ncol
          do j=1,npoints

            !add in surface emission

            fluxtop(j,ibox) = fluxtop(j,ibox)
     &         + emsfc_lw * bb(j)
     &         * trans_layers_above(j,ibox)

          end do
        end do

c        if (ncolprint.ne.0) then
c
c          do j=1,npoints ,1000
c          write(6,'(a10)') 'j='
c          write(6,'(8I10)') j
c          write (6,'(a)') 'id:'
c          write (6,'(a)') 'surface'
c
c          write (6,'(a)') 'emiss_layer:'
c          write (6,'(8f7.2)') (dem(1,ibox),ibox=1,ncolprint)
c
c          write (6,'(a)') '100.*bb(j):'
c          write (6,'(8f7.2)') (100.*bb(j),ibox=1,ncolprint)
c
c          write (6,'(a)') '100.*f:'
c          write (6,'(8f7.2)') (100.*fluxtop(j,ibox),ibox=1,ncolprint)
c          end do
c      endif

        !now that you have the top of atmosphere radiance account
        !for ISCCP procedures to determine cloud top temperature

        !account for partially transmitting cloud recompute flux
        !ISCCP would see assuming a single layer cloud
        !note choice here of 2.13, as it is primarily ice
        !clouds which have partial emissivity and need the
        !adjustment performed in this section
        !
      !If it turns out that the cloud brightness temperature
      !is greater than 260K, then the liquid cloud conversion
        !factor of 2.56 is used.
      !
        !Note that this is discussed on pages 85-87 of
        !the ISCCP D level documentation (Rossow et al. 1996)

          do j=1,npoints
            !compute minimum brightness temperature and optical depth
            btcmin(j) = 1. /  ( exp(pc1bylam/(attrop(j)-5.)) - 1. )
          enddo
        do ibox=1,ncol
          do j=1,npoints
            transmax(j) = (fluxtop(j,ibox)-btcmin(j))
     &                /(fluxtop_clrsky(j)-btcmin(j))
          !note that the initial setting of tauir(j) is needed so that
          !tauir(j) has a realistic value should the next if block be
          !bypassed
            tauir(j) = tau(j,ibox) * byic
            taumin(j) = -1. * log(max(min(transmax(j),0.9999999d0),0
     *           .001d0))

          enddo

          if (top_height .eq. 1) then
            do j=1,npoints
              if (transmax(j) .gt. 0.001 .and.
     &          transmax(j) .le. 0.9999999) then
                fluxtopinit(j) = fluxtop(j,ibox)
              tauir(j) = tau(j,ibox) *byic
              endif
            enddo
            do icycle=1,2
              do j=1,npoints
                if (tau(j,ibox) .gt. (tauchk            )) then
                if (transmax(j) .gt. 0.001 .and.
     &            transmax(j) .le. 0.9999999) then
                  emcld(j,ibox) = 1. - exp(-1. * tauir(j)  )
                  fluxtop(j,ibox) = fluxtopinit(j) -
     &              ((1.-emcld(j,ibox))*fluxtop_clrsky(j))
                  fluxtop(j,ibox)=max(1.d-06,
     &              (fluxtop(j,ibox)/emcld(j,ibox)))
                  tb(j,ibox)= pc1bylam
     &              / (log(1. + (1./fluxtop(j,ibox))))
                  if (tb(j,ibox) .gt. 260.) then
                  tauir(j) = tau(j,ibox) * bywc
                  end if
                end if
                end if
              enddo
            enddo

          endif

          do j=1,npoints
            if (tau(j,ibox) .gt. (tauchk            )) then
                !cloudy box
                tb(j,ibox)= pc1bylam/ (log(1. + (1./fluxtop(j,ibox))))
                if (top_height.eq.1.and.tauir(j).lt.taumin(j)) then
                         tb(j,ibox) = attrop(j) - 5.
                   tau(j,ibox) = 2.13d0*taumin(j)
                end if
            else
                !clear sky brightness temperature
                tb(j,ibox) = pc1bylam/(log(1.+(1./fluxtop_clrsky(j))))
            end if
          enddo ! j
        enddo ! ibox

c        if (ncolprint.ne.0) then
c
c          do j=1,npoints,1000
c          write(6,'(a10)') 'j='
c          write(6,'(8I10)') j
c
c          write (6,'(a)') 'attrop:'
c          write (6,'(8f7.2)') (attrop(j))
c
c          write (6,'(a)') 'btcmin:'
c          write (6,'(8f7.2)') (btcmin(j))
c
c          write (6,'(a)') 'fluxtop_clrsky*100:'
c          write (6,'(8f7.2)')
c     &      (100.*fluxtop_clrsky(j))
c
c          write (6,'(a)') '100.*f_adj:'
c          write (6,'(8f7.2)') (100.*fluxtop(j,ibox),ibox=1,ncolprint)
c
c          write (6,'(a)') 'transmax:'
c          write (6,'(8f7.2)') (transmax(ibox),ibox=1,ncolprint)
c
c          write (6,'(a)') 'tau:'
c          write (6,'(8f7.2)') (tau(j,ibox),ibox=1,ncolprint)
c
c          write (6,'(a)') 'emcld:'
c          write (6,'(8f7.2)') (emcld(j,ibox),ibox=1,ncolprint)
c
c          write (6,'(a)') 'total_trans:'
c          write (6,'(8f7.2)')
c     &        (trans_layers_above(j,ibox),ibox=1,ncolprint)
c
c          write (6,'(a)') 'total_emiss:'
c          write (6,'(8f7.2)')
c     &        (1.0-trans_layers_above(j,ibox),ibox=1,ncolprint)
c
c          write (6,'(a)') 'total_trans:'
c          write (6,'(8f7.2)')
c     &        (trans_layers_above(j,ibox),ibox=1,ncolprint)
c
c          write (6,'(a)') 'ppout:'
c          write (6,'(8f7.2)') (tb(j,ibox),ibox=1,ncolprint)
c          enddo ! j
c      endif

      end if

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

!
!     ---------------------------------------------------!
!     DETERMINE CLOUD TOP PRESSURE
!
!     again the 2 methods differ according to whether
!     or not you use the physical cloud top pressure (top_height = 2)
!     or the radiatively determined cloud top pressure (top_height = 1 or 3)
!

      !compute cloud top pressure
      do 30 ibox=1,ncol
        !segregate according to optical thickness
        if (top_height .eq. 1 .or. top_height .eq. 3) then
          !find level whose temperature
          !most closely matches brightness temperature
          do j=1,npoints
            nmatch(j)=0
          enddo
          do 29 ilev=1,nlev-1
            !cdir nodep
            do j=1,npoints
              if ((at(j,ilev)   .ge. tb(j,ibox) .and.
     &          at(j,ilev+1) .lt. tb(j,ibox)) .or.
     &          (at(j,ilev) .le. tb(j,ibox) .and.
     &          at(j,ilev+1) .gt. tb(j,ibox))) then

                nmatch(j)=nmatch(j)+1
                if(abs(at(j,ilev)-tb(j,ibox)) .lt.
     &            abs(at(j,ilev+1)-tb(j,ibox))) then
                  match(j,nmatch(j))=ilev
                else
                  match(j,nmatch(j))=ilev+1
                end if
              end if
            enddo
29        continue

          do j=1,npoints
            if (nmatch(j) .ge. 1) then
              ptop(j,ibox)=pfull(j,match(j,nmatch(j)))
              levmatch(j,ibox)=match(j,nmatch(j))
            else
              if (tb(j,ibox) .lt. atmin(j)) then
                ptop(j,ibox)=ptrop(j)
                levmatch(j,ibox)=itrop(j)
              end if
              if (tb(j,ibox) .gt. atmax(j)) then
                ptop(j,ibox)=pfull(j,nlev)
                levmatch(j,ibox)=nlev
              end if
            end if
          enddo ! j

        else ! if (top_height .eq. 1 .or. top_height .eq. 3)

          do j=1,npoints
            ptop(j,ibox)=0.
          enddo
          do ilev=1,nlev
            do j=1,npoints
              if ((ptop(j,ibox) .eq. 0. )
     &           .and.(frac_out(j,ibox,ilev) .ne. 0)) then
                ptop(j,ibox)=pfull(j,ilev)
              levmatch(j,ibox)=ilev
              end if
            end do
          end do
        end if

        do j=1,npoints
          if (tau(j,ibox) .le. (tauchk            )) then
            ptop(j,ibox)=0.
            levmatch(j,ibox)=0
          endif
        enddo

30    continue

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


!
!     ---------------------------------------------------!
!     DETERMINE ISCCP CLOUD TYPE FREQUENCIES
!
!     Now that ptop and tau have been determined,
!     determine amount of each of the 49 ISCCP cloud
!     types
!
!     Also compute grid box mean cloud top pressure and
!     optical thickness.  The mean cloud top pressure and
!     optical thickness are averages over the cloudy
!     area only. The mean cloud top pressure is a linear
!     average of the cloud top pressures.  The mean cloud
!     optical thickness is computed by converting optical
!     thickness to an albedo, averaging in albedo units,
!     then converting the average albedo back to a mean
!     optical thickness.
!

      !compute isccp frequencies

      !reset frequencies
      do 38 ilev=1,7
      do 38 ilev2=1,7
        do j=1,npoints !
             fq_isccp(j,ilev,ilev2)=0.
        enddo
38    continue

      !reset variables need for averaging cloud properties
      do j=1,npoints
        totalcldarea(j) = 0.
        meanalbedocld(j) = 0.
        meanptop(j) = 0.
        meantaucld(j) = 0.
      enddo ! j

c      boxarea = 1./real(ncol,kind=8)

      do 39 ibox=1,ncol
        do j=1,npoints

c          if (tau(j,ibox) .gt. (tauchk            )
c     &      .and. ptop(j,ibox) .gt. 0.) then
c              box_cloudy(j,ibox)=.true.
c          endif

          box_cloudy(j,ibox)= (tau(j,ibox) .gt. tauchk .and. ptop(j,ibox
     *         ) .gt. 0.)

          if (box_cloudy(j,ibox)) then

              ! totalcldarea always diagnosed day or night
              totalcldarea(j) = totalcldarea(j) + boxarea

              if (sunlit(j).eq.1) then

                ! tau diagnostics only with sunlight

                boxtau(j,ibox) = tau(j,ibox)

                !convert optical thickness to albedo
                albedocld(j,ibox)
     &            =real(invtau(min(nint(100.*tau(j,ibox)),45000)))

                !contribute to averaging
              meanalbedocld(j) = meanalbedocld(j)
     &            +albedocld(j,ibox)*boxarea

            endif

          endif

          if (sunlit(j).eq.1 .or. top_height .eq. 3) then

            !convert ptop to millibars
            ptop(j,ibox)=ptop(j,ibox) / 100.

            !save for output cloud top pressure and optical thickness
            boxptop(j,ibox) = ptop(j,ibox)

            if (box_cloudy(j,ibox)) then

              meanptop(j) = meanptop(j) + ptop(j,ibox)*boxarea

              !reset itau(j), ipres(j)
              itau(j) = 0
              ipres(j) = 0

              !determine optical depth category
              if (tau(j,ibox) .lt. isccp_taumin) then
                  itau(j)=1
              else if (tau(j,ibox) .ge. isccp_taumin
     &          .and. tau(j,ibox) .lt. 1.3) then
                itau(j)=2
              else if (tau(j,ibox) .ge. 1.3
     &          .and. tau(j,ibox) .lt. 3.6) then
                itau(j)=3
              else if (tau(j,ibox) .ge. 3.6
     &          .and. tau(j,ibox) .lt. 9.4) then
                  itau(j)=4
              else if (tau(j,ibox) .ge. 9.4
     &          .and. tau(j,ibox) .lt. 23.) then
                  itau(j)=5
              else if (tau(j,ibox) .ge. 23.
     &          .and. tau(j,ibox) .lt. 60.) then
                  itau(j)=6
              else if (tau(j,ibox) .ge. 60.) then
                  itau(j)=7
              end if

              !determine cloud top pressure category
              if (    ptop(j,ibox) .gt. 0.
     &          .and.ptop(j,ibox) .lt. 180.) then
                  ipres(j)=1
              else if(ptop(j,ibox) .ge. 180.
     &          .and.ptop(j,ibox) .lt. 310.) then
                  ipres(j)=2
              else if(ptop(j,ibox) .ge. 310.
     &          .and.ptop(j,ibox) .lt. 440.) then
                  ipres(j)=3
              else if(ptop(j,ibox) .ge. 440.
     &          .and.ptop(j,ibox) .lt. 560.) then
                  ipres(j)=4
              else if(ptop(j,ibox) .ge. 560.
     &          .and.ptop(j,ibox) .lt. 680.) then
                  ipres(j)=5
              else if(ptop(j,ibox) .ge. 680.
     &          .and.ptop(j,ibox) .lt. 800.) then
                  ipres(j)=6
              else if(ptop(j,ibox) .ge. 800.) then
                  ipres(j)=7
              end if

              !update frequencies
              if(ipres(j) .gt. 0.and.itau(j) .gt. 0)
     *             fq_isccp(j,itau(j),ipres(j))=
     &             fq_isccp(j,itau(j),ipres(j))+ boxarea
            end if

          end if

        enddo ! j
39    continue

      !compute mean cloud properties
      do j=1,npoints
        nbox(j)=totalcldarea(j)*ncol    ! for backwards compatibility
        if (totalcldarea(j) .gt. 0.) then
         meanptop(j) = meanptop(j) / totalcldarea(j)
          if (sunlit(j).eq.1) then
            meanalbedocld(j) = meanalbedocld(j) / totalcldarea(j)
          meantaucld(j) = tautab(min(255,max(1,nint(meanalbedocld(j)))))
          end if
        end if
      enddo ! j

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

!     ---------------------------------------------------!
!     OPTIONAL PRINTOUT OF DATA TO CHECK PROGRAM
!
c      if (debugcol.ne.0) then
c
c         do j=1,npoints,debugcol
c
c            !produce character output
c            do ilev=1,nlev
c              do ibox=1,ncol
c                   acc(ilev,ibox)=0
c              enddo
c            enddo
c
c            do ilev=1,nlev
c              do ibox=1,ncol
c                   acc(ilev,ibox)=frac_out(j,ibox,ilev)*2
c                   if (levmatch(j,ibox) .eq. ilev)
c     &                 acc(ilev,ibox)=acc(ilev,ibox)+1
c              enddo
c            enddo
c
c             !print test
c
c          write(ftn09,11) j
c11        format('ftn09.',i4.4)
c          open(9, FILE=ftn09, FORM='FORMATTED')
c
c             write(9,'(a1)') ' '
c             write(9,'(10i5)')
c     &                  (ilev,ilev=5,nlev,5)
c             write(9,'(a1)') ' '
c
c             do ibox=1,ncol
c               write(9,'(40(a1),1x,40(a1))')
c     &           (cchar_realtops(acc(ilev,ibox)+1),ilev=1,nlev)
c     &           ,(cchar(acc(ilev,ibox)+1),ilev=1,nlev)
c             end do
c             close(9)
c
c             if (ncolprint.ne.0) then
c               write(6,'(a1)') ' '
c                    write(6,'(a2,1X,5(a7,1X),a50)')
c     &                  'ilev',
c     &                  'pfull','at',
c     &                  'cc*100','dem_s','dtau_s',
c     &                  'cchar'

!               do 4012 ilev=1,nlev
!                    write(6,'(60i2)') (box(i,ilev),i=1,ncolprint)
!                   write(6,'(i2,1X,5(f7.2,1X),50(a1))')
!     &                  ilev,
!     &                  pfull(j,ilev)/100.,at(j,ilev),
!     &                  cc(j,ilev)*100.0,dem_s(j,ilev),dtau_s(j,ilev)
!     &                  ,(cchar(acc(ilev,ibox)+1),ibox=1,ncolprint)
!4012           continue
c               write (6,'(a)') 'skt(j):'
c               write (6,'(8f7.2)') skt(j)
c
c               write (6,'(8I7)') (ibox,ibox=1,ncolprint)
c
c               write (6,'(a)') 'tau:'
c               write (6,'(8f7.2)') (tau(j,ibox),ibox=1,ncolprint)
c
c               write (6,'(a)') 'tb:'
c               write (6,'(8f7.2)') (tb(j,ibox),ibox=1,ncolprint)
c
c               write (6,'(a)') 'ptop:'
c               write (6,'(8f7.2)') (ptop(j,ibox),ibox=1,ncolprint)
c             endif
c
c        enddo
c
c      end if

      return
      end