! $Id: ras.F90,v 1.24.2.8.2.1.4.1 2007/11/09 20:46:45 bacmj Exp $


MODULE RAS 1
 
use GEOS_Mod
use ESMF_Mod
use GEOS_UtilsMod, only : DQSAT=>GEOS_DQsat


 IMPLICIT NONE

 PRIVATE
 PUBLIC RASE


 CONTAINS


  SUBROUTINE RASE(IDIM, IRUN, K0, ICMIN, DT ,                      & 1,8
                  CPO,ALHLO,ALHL1,TICE,GRAVO,                      &
                  SEEDRAS,IRAS,JRAS,SIGE,                          &
                  KCBL,WGT0,WGT1,ZCBL,TPERT,QPERT,                 &
                  THO, QHO, UHO, VHO,                              & 
                  QSS, DQS,                                        &
                  PLE, PKE, CLW, FLX, FLXD, FLXC,                  &
                  CNV_PRC3,                                        &
                  CNV_UPDFRC,                                      &
                  CNV_QC,                                          &
                  RASPARAMS,                                       &
                  ITRCR, XHO, IRC,                                 &
                  TRIEDLEV_DIAG,                                   &
                  FSCAV , DISSKE                                   )


!*********************************************************************
!*********************************************************************
!******************** Relaxed Arakawa-Schubert ***********************
!************************ Parameterization ***************************
!********************** SCALAR RAS-1 VERSION  ************************
!************************* 31 DECEMBER 1999 **************************
!*********************************************************************
!************************** Developed By *****************************
!*********************************************************************
!************************ Shrinivas Moorthi **************************
!******************************* and *********************************
!************************** Max J. Suarez ****************************
!*********************************************************************
!******************** Laboratory for Atmospheres *********************
!****************** NASA/GSFC, Greenbelt, MD 20771 *******************
!*********************************************************************
!*********************************************************************

!  Input:
!  ------
! 
!     K0      : Number of vertical levels (increasing downwards)
!
!     DT      : Time step in seconds
!
!     RASAL   : Array of dimension K-1 containing relaxation parameters
!               for cloud-types detraining at those levels
!
!     CPO     : Specific heat at constant pressure (J/kg/K)
!
!     ALHLO   : Latent Heat of condensation (J/kg)
!
!     ALHL1   : Latent Heat of condensation + fusion (J/kg)
!
!     GRAVO   : Acceleration due to gravity (m/s^2)
!
!     PLE     : 2D array of dimension (IDIM,K0+1) containing pressure
!               in hPa at the interfaces of K-layers from top of the 
!               atmosphere to the bottom  (mb)
!
!     PKE     : 2D array of dimension (IDIM,K0+1) containing (PRS/P00) **
!               RKAP.  i.e. Exner function at layer edges.
!
!     PKL     : 2D array of dimension (IDIM,K0) ) containing the
!               Exner function at the layers.
!
!     QSS     : 2D array of dimension (IDIM,K0  ) containing the
!               saturation specific humidity at the layers. (kg/kg)
!
!     DQS     : 2D array of dimension (IDIM,K0  ) containing
!               d(qss)/dt at the layers.  (1/K)
!   

!  Update:
!  -------
!
!     THO     : 2D array of dimension (IDIM,K0) containing potential
!               temperature (K)
!
!     QHO     : 2D array of dimension (IDIM,K0) containing specific
!               humidity (kg/kg)
!
!     UHO     : 2D array of dimension (IDIM,K0) containing u-wind (m/s)
!
!     VHO     : 2D array of dimension (IDIM,K0) containing v-wind (m/s)
!
!  Output:
!  -------
!!
!     CLW     : 2D array of dimension (IDIM,K0) containing the
!               detrained cloud liquid water.  (kg/m^2/s) 
!
!     FLX     : 2D array of dimension (IDIM,K0) containing the
!               cloud-base mass flux for each cloud type ordered by
!               detrainment level.   (kg/m^2/s) 
!
!     FLXD    : 2D array of dimension (IDIM,K0) containing the
!               detrained  mass flux for each cloud type ordered by
!               detrainment level.   (kg/m^2/s) 
!
!     FLXC    : 2D array of dimension (IDIM,K0) containing the
!               total cloud mass flux for all cloud types through
!               the top of each level. (e.g., FLXC(K)=SUM(FLX(ICMIN:K))
!               and  FLXD(L) = FLXC(L+1)-FLSD(L) )
!                (kg/m^2/s) 
!
!************************************************************************

!  ARGUMENTS

      INTEGER,                     INTENT(IN   ) ::  IDIM, IRUN, K0, ICMIN
      REAL, DIMENSION (IDIM,K0  ), INTENT(INOUT) ::  THO, QHO, UHO, VHO
      REAL, DIMENSION (IDIM,K0+1), INTENT(IN   ) ::  PLE, PKE
      REAL, DIMENSION (IDIM,K0  ), INTENT(IN   ) ::  QSS, DQS
      REAL, DIMENSION (     K0+1), INTENT(IN   ) ::  SIGE
      REAL, DIMENSION (IDIM,K0  ), INTENT(  OUT) ::  FLX, CLW , FLXD, FLXC
      REAL, DIMENSION (IDIM,K0  ), INTENT(  OUT) ::  CNV_PRC3
      REAL, DIMENSION (IDIM,K0  ), INTENT(  OUT) ::  CNV_UPDFRC, CNV_QC
      REAL,                        INTENT(IN   ) ::  DT,  CPO, ALHLO, GRAVO
      REAL,                        INTENT(IN   ) ::  ALHL1, TICE
      INTEGER,                     INTENT(  IN)  ::  ITRCR
      INTEGER, DIMENSION ( 2 ),    INTENT(IN   ) ::  SEEDRAS
      INTEGER, DIMENSION (IDIM  ), INTENT(IN   ) ::  IRAS,JRAS,KCBL
      REAL, DIMENSION (IDIM     ), INTENT(IN   ) ::  ZCBL,TPERT,QPERT
      REAL, DIMENSION (K0  ),      INTENT(IN   ) ::  WGT0,WGT1
      REAL, DIMENSION(:),          INTENT(IN   ) ::  RASPARAMS
      REAL,    OPTIONAL,           INTENT(INOUT)  ::  XHO(IDIM,K0,ITRCR)
      INTEGER, OPTIONAL,           INTENT(  OUT)  ::  IRC(IDIM,K0)
      REAL,    OPTIONAL,           INTENT(  OUT)  ::  TRIEDLEV_DIAG(IDIM,K0)
      REAL,    OPTIONAL,           INTENT(  OUT)  ::  DISSKE(IDIM,K0)

      REAL,    OPTIONAL,           INTENT(IN)    :: FSCAV(ITRCR) ! Fraction scavenged per km
                                                                 ! = 0 (no scav), = 1 (full scav)

!  LOCALS


      REAL,  DIMENSION(K0) :: POI_SV, QOI_SV, UOI_SV, VOI_SV
      REAL,  DIMENSION(K0) :: POI, QOI, UOI, VOI,  DQQ, BET, GAM, CLL
      REAL,  DIMENSION(K0) :: POI_c, QOI_c
      REAL,  DIMENSION(K0) :: PRH,  PRI,  GHT, DPT, DPB, PKI, DISSK0,DISSK1
      REAL,  DIMENSION(K0) :: TCU, QCU, UCU, VCU,  CLN, RNS, POL
      REAL,  DIMENSION(K0) :: QST, SSL,  RMF, RNN, RN1, RMFC, RMFP
      REAL,  DIMENSION(K0) :: GMS, ETA, GMH, EHT,  GM1, HCC, RMFD
      REAL,  DIMENSION(K0) :: HOL, HST, QOL, ZOL, HCLD, CLL0,CLLX,CLLI,CLLB
      REAL,  DIMENSION(K0) :: WSP, LAMBDSV, BKE , CVW, UPDFRC
      REAL,  DIMENSION(K0) :: RASAL, MTKWI, UPDFRP,BK2,BK3,DLL0,DLLX

      REAL,  DIMENSION(ITRCR) :: XHT

      REAL,  DIMENSION(K0,ITRCR) :: XOI, XCU, XOI_SV

      REAL,  DIMENSION(K0+1) :: PRJ, PRS, QHT, SHT ,ZET, XYD, XYD0

      INTEGER,  DIMENSION(K0-1) :: RC

      INTEGER :: K,MY_PE

      REAL, DIMENSION(IDIM,K0) :: LAMBDSV2


      REAL TX2, TX3, UHT, VHT, AKM, ACR, ALM, TTH, QQH, SHTRG, WSPBL, DQX
      REAL WFN, TEM, TRG, TRGEXP, EVP, PCU, WLQ, QCC,MTKW_MAX !, BKE
      REAL SHTRG_FAC, SIGE_MINHOL, WFNOG

      INTEGER I, IC, L, ICL , ITR , ICL_C, N_DTL
      INTEGER NDTLEXPON

      INTEGER,  ALLOCATABLE, DIMENSION(:) :: ICL_V

!  RASE GLOBAL CONSTANTS


      REAL GRAV, CP, ALHL, CPBG, ALHI, CPI, GRAVI, DDT, LBCP, OBG, AFC 
   
!!!!!!!!!
      REAL CO_AUTO, FRICFAC,DPTH_BL,WUPDRFT,PBLFRAC,AUTORAMPB,CO_ZDEP
      REAL RASAL1, RASAL2, CO_T, RASNCL,FRICLAMBDA,SDQVT1,SDQV2 
      REAL LAMBDA_FAC,STRAPPING,ACRITFAC,HMINTRIGGER,LLDISAGGXP
      REAL LAMBMX_FAC, DIAMMN_MIN,RDTLEXPON, CLI_CRIT,SDQV3 
      INTEGER KSTRAP

      real cld_radius, areal_frac, spect_mflx, cvw_cbase
!!!!!!!!!

      REAL, PARAMETER :: ONEPKAP = 1.+ 2./7., DAYLEN = 86400.0
!      REAL, PARAMETER :: PBLFRAC = 0.5
      REAL, PARAMETER :: RHMAX   = 0.9999

!  LAMBDA LIMITS
      REAL            :: LAMBDA_MIN
      REAL            :: LAMBDA_MAX

!  TRIGGER PARAMETERS
      REAL, PARAMETER :: RHMN = .5, RHMX = .65
      real, parameter :: RHO_W  =  1.0e3  ! Density of liquid water in kg/m^3

      LOGICAL DYNA_STRAPPING, DO_TRACERS, SMOOTH_HST

      character(len=ESMF_MAXSTR)          :: CBL_STYLE

!  SCAVANGING RELATED PARAMETERS
      REAL                   :: DELZKM  ! layer thickness in km
      REAL                   :: FNOSCAV ! fraction of tracer *not* scavenged
      REAL                   :: FSCAV_(ITRCR) ! Fraction scavenged per km

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

      IF ( PRESENT(FSCAV) ) then
        FSCAV_ = FSCAV
      ELSE
        FSCAV_ = 0.0 ! NO SCAVENGING BY DEFAULT
      ENDIF      

      IF(IRUN <= 0) RETURN

      IF (PRESENT(TRIEDLEV_DIAG)) TRIEDLEV_DIAG=0.
      CNV_PRC3  =0.
      CNV_UPDFRC=0. 
      CNV_QC    =0.
      if ( PRESENT( DISSKE ))     DISSKE    =0.
      !!LAMBDSV2 = 0.
      IF(PRESENT(IRC)) IRC = -2


 
!       SMOOTH_HST   = .TRUE. 
       SMOOTH_HST   = .FALSE.  

       FRICFAC      = RASPARAMS(1)     !  ---  1
       SHTRG_FAC    = RASPARAMS(2)     !  ---  2
       CO_AUTO      = RASPARAMS(3)     !  ---  3
       CLI_CRIT     = RASPARAMS(4)     !  ---  4
       RASAL1       = RASPARAMS(5)     !  ---  5
       RASAL2       = RASPARAMS(6)     !  ---  6
       RASNCL       = RASPARAMS(7)     !  ---  7
       LAMBDA_FAC   = RASPARAMS(8)     !  ---  8
       LAMBMX_FAC   = RASPARAMS(9)     !  ---  9
       DIAMMN_MIN   = RASPARAMS(10)    !  --- 10
       FRICLAMBDA   = RASPARAMS(11)    !  --- 11
       RDTLEXPON    = RASPARAMS(12)    !  --- 12
       STRAPPING    = RASPARAMS(13)    !  --- 13
       SDQV2        = RASPARAMS(14)    !  --- 14
       SDQV3        = RASPARAMS(15)    !  --- 15
       SDQVT1       = RASPARAMS(16)    !  --- 16
       ACRITFAC     = RASPARAMS(17)    !  --- 17
       HMINTRIGGER  = RASPARAMS(18)    !  --- 18
       LLDISAGGXP   = RASPARAMS(19)    !  --- 19
       PBLFRAC      = RASPARAMS(20)    !  --- 20
       AUTORAMPB    = RASPARAMS(21)    !  --- 21
       CO_ZDEP      = RASPARAMS(22)    !  --- 22


      IF ( STRAPPING <= 0.0 ) THEN
          DYNA_STRAPPING = .TRUE.
      ELSE
          DYNA_STRAPPING = .FALSE.
          KSTRAP      = INT( STRAPPING )
      ENDIF
           

      DO_TRACERS = present(XHO) .and. ITRCR>0

      WUPDRFT = 2.500

      GRAV  = GRAVO
      ALHL  = ALHLO
      CP    = CPO
      CPI   = 1.0/CP      
      ALHI  = 1.0/ALHL
      GRAVI = 1.0/GRAV
      CPBG  = CP*GRAVI
      DDT   = DAYLEN/DT
      AFC   = -1.04E-4*SQRT(DT*113.84)
      LBCP  = ALHL*CPI
      OBG   = 100.*GRAVI

 
      DO I=1,IRUN

         !!CALL FINDBASE
                 K = KCBL(I)

         CALL FINDDTLS



         IF ( K > 0 ) THEN 
            CALL STRAP( FINAL=0 )
            call HTEST



            DO ICL_C = 1,N_DTL
               ICL   = ICL_V( ICL_C )
                

              IF (DO_TRACERS) XCU(ICMIN:,:) = 0.

              IF (PRESENT(TRIEDLEV_DIAG)) TRIEDLEV_DIAG(I,ICL) = 1.

              UCU(ICMIN:) = 0.    ! This change makes cumulus friction
              VCU(ICMIN:) = 0.    ! correct.

              IF( ICL > ICMIN ) THEN
                CALL CLOUDE(ICL)
              ENDIF

            ENDDO

            IF ( SUM( RMF(ICMIN:K) ) > 0.0 ) THEN

              CALL RNEVP

              CALL STRAP( FINAL=1 )

            ELSE

              CALL STRAP( FINAL=2 )

            ENDIF 

         ELSE 
     
            CALL STRAP( FINAL=2 )

         ENDIF

      ENDDO

      IF(ALLOCATED(ICL_V)) DEALLOCATE(ICL_V)

      RETURN

  CONTAINS

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


   SUBROUTINE CLOUDE(IC) 1,2

      INTEGER, INTENT(IN ) :: IC
      REAL :: DEEP_FACT,CU_DIAM,WSCALE

      REAL :: CLI , TE_A, C00_X, CLI_CRIT_X, PETE, TOKI, GMHx, HSTx  !, dQx
      REAL :: DT_LYR, RATE, CVW_X, CLOSS, F2, F3, F4, F5
      INTEGER :: K700

      TRG   = AMIN1(1.,(QOI(K)/QST(K)-RHMN)/(RHMX-RHMN))

      F4  = MIN(   1.0,  MAX( 0.0 , (AUTORAMPB-SIGE(IC))/0.2 )  )  ! F4 should ramp from 0 at SIG=AUTORAMPB
                                                                   ! to 1 at SIG=AUTORAMPB-0.2
     
      if ( SIGE(IC) >= 0.5 ) then
         F5 = 1.0
      else
         F5 = 1.0 - 2.*CO_ZDEP *( 0.5 - SIGE(IC) )
         F5 = MAX( F5 , 0.0 )
      endif


      IF(TRG <= 1.0E-5) THEN    ! TRIGGER  =========>>
       RC(IC) = 7
       RETURN
      ENDIF

!  RECOMPUTE SOUNDING UP TO DETRAINMENT LEVEL

      POI_c = POI
      QOI_c = QOI
      POI_c(K) =  POI_c(K) + TPERT(I)
      QOI_c(K) =  QOI_c(K) + QPERT(I)

      ZET(K+1) = 0.
      SHT(K+1) = CP*POI_c(K)*PRJ(K+1)
      DO L=K,IC,-1
       QOL(L)  = AMIN1(QST(L)*RHMAX,QOI_c(L))
       QOL(L)  = AMAX1( 0.000, QOL(L) )     ! GUARDIAN/NEG.PREC.
       SSL(L)  = CP*PRJ(L+1)*POI_c(L) + GRAV*ZET(L+1)
       HOL(L)  = SSL(L) + QOL(L)*ALHL
       HST(L)  = SSL(L) + QST(L)*ALHL
       TEM     = POI_c(L)*(PRJ(L+1)-PRJ(L))*CPBG
       ZET(L)  = ZET(L+1) + TEM
       ZOL(L)  = ZET(L+1) + (PRJ(L+1)-PRH(L))*POI_c(L)*CPBG
      ENDDO

      DO L=IC+1,K
       TEM  = (PRJ(L)-PRH(L-1))/(PRH(L)-PRH(L-1))
       SHT(L)  = SSL(L-1) + TEM*(SSL(L)-SSL(L-1)) 
       QHT(L)  = .5*(QOL(L)+QOL(L-1))
      ENDDO

! SMOOTH HSTAR W/ 1-2-1 Filter
      if ( SMOOTH_HST ) then
         HSTx = HST(IC) ! save for later
         DO L=K-1,IC+1,-1
            HST(L) = 0.25*(HST(L+1)+HST(L-1))+0.5*HST(L)
         END DO
         DO L=IC,IC
            HST(L) = 0.5*HST(L+1)+0.5*HST(L)
         END DO
      endif
     


!  CALCULATE LAMBDA, ETA, AND WORKFUNCTION


      LAMBDA_MIN = .2/(LAMBDA_FAC*DPTH_BL)
      LAMBDA_MAX = .2/( MAX( LAMBMX_FAC*DPTH_BL , DIAMMN_MIN ) )



      IF (HOL(K) <= HST(IC)) THEN   ! CANNOT REACH IC LEVEL  ======>>
       RC(IC) = 1
       RETURN
      ENDIF

!  LAMBDA CALCULATION: MS-A18

      TEM  =       (HST(IC)-HOL(IC))*(ZOL(IC)-ZET(IC+1)) 
      DO L=IC+1,K-1
       TEM = TEM + (HST(IC)-HOL(L ))*(ZET(L )-ZET(L +1))
      ENDDO


 

      IF(TEM <= 0.0) THEN         ! NO VALID LAMBDA  ============>>
       RC(IC) = 2
       RETURN
      ENDIF

      ALM     = (HOL(K)-HST(IC)) / TEM




      IF(ALM > LAMBDA_MAX) THEN
       RC(IC) = 3
       RETURN
      ENDIF

      TOKI=1.0

      IF(ALM < LAMBDA_MIN) THEN
       TOKI = ( ALM/LAMBDA_MIN )**2
       !RC(IC) = 6
       !RETURN
      ENDIF





      !LAMBDSV(IC) = ALM

!  ETA CALCULATION: MS-A2

      DO L=IC+1,K
       ETA(L) = 1.0 + ALM * (ZET(L )-ZET(K))
      ENDDO
      ETA(IC) = 1.0 + ALM * (ZOL(IC)-ZET(K))

!  WORKFUNCTION CALCULATION:  MS-A22

      WFN     = 0.0
      HCC(K)  = HOL(K)
      DO L=K-1,IC+1,-1
       HCC(L) = HCC(L+1) + (ETA(L) - ETA(L+1))*HOL(L)
       TEM    = HCC(L+1)*DPB(L) + HCC(L)*DPT(L)
       EHT(L) = ETA(L+1)*DPB(L) + ETA(L)*DPT(L)
       WFN    = WFN + (TEM - EHT(L)*HST(L))*GAM(L)
      ENDDO
      HCC(IC) = HST(IC)*ETA(IC)
      WFN     = WFN + (HCC(IC+1)-HST(IC)*ETA(IC+1))*GAM(IC)*DPB(IC)



!  VERTICAL VELOCITY/KE CALCULATION (ADDED 12/2001 JTB)
      BK3(K)   = 0.0
      BK2(K)   = 0.0
      BKE(K)   = 0.0
      HCLD(K)  = HOL(K)
      DO L=K-1,IC,-1
       HCLD(L) = ( ETA(L+1)*HCLD(L+1)   +      & 
                  (ETA(L) - ETA(L+1))*HOL(L) ) / ETA(L)
       TEM     = (HCLD(L)-HST(L) )*(ZET(L)-ZET(L+1))/ (1.0+LBCP*DQQ(L))
       BKE(L)  = BKE(L+1) + GRAV * TEM / ( CP*PRJ(L+1)*POI(L) )
       BK2(L)  = BK2(L+1) + GRAV * MAX(TEM,0.0) / ( CP*PRJ(L+1)*POI(L) )
       BK3(L)  = BK3(L+1) + GRAV * MIN(TEM,0.0) / ( CP*PRJ(L+1)*POI(L) )
       CVW(L) = SQRT(  2.0* MAX( BK2(L) , 0.0 )  )    
      ENDDO



       CU_DIAM   = 1000.  ! 1.0 / ( 5.0*ALM )


!   ALPHA CALCULATION 

    IF ( ZET(IC) <  2000. ) RASAL(IC) = RASAL1
    IF ( ZET(IC)  >= 2000. ) THEN 
       RASAL(IC) = RASAL1 + (RASAL2-RASAL1)*(ZET(IC) - 2000.)/8000.
    ENDIF
    RASAL(IC) = MIN( RASAL(IC) , 1.0e5 )
    
    RASAL(IC) = DT / RASAL(IC)

!  HEAL/REPAIR/RATIONALIZE STUPID CALCULATION OF CVW
!  IT IS STUPID BECAUSE IT IGNORES A NUMBER OF IMPORTANT EFFECTS
!    1) CONVECTIVE PRESSURE PERT. COULD GO EITHER WAY + OR - 
!    2) CONDENSATE LOADING/MECHANICAL DRAG
!    3) ENVIRONMENTAL CONDENSATE COULD GO +
!    4) SUBGRID SCALE CLOUD BASE ENHANCEMENT OF Q AND T
!
!  SO, HERE AFTER NAIVELY USING ITS VALUE TO TEST FOR CLOUD TOP
!  W, WE FLOOR IT AT 1 M/S.  THIS ENSURES THAT IF A PLUME
!  MAKES IT THROUGH ALL TEST CONDITIONS, I.E., GETS A MASS-FLUX 
!  IT WILL ALSO HAVE SOME DIAGNOSED "UPWARD MOTION"

      CVW(IC:K) = MAX(  CVW(IC:K) , 1.00 )

!  NOTE THIS "CENTRALIZES" A KLUGE PRESENT IN OTHER LOCATIONS.
!  CLEAN UP SOME TIME.      -JTB 12/04/03

            

!  TEST FOR CRITICAL WORK FUNCTION

      CALL ACRITN(POL(IC), PRS(K), ACR)




      IF(WFN <= ACR) THEN   ! SUB-CRITICAL WORK FUNCTION ======>>
       RC(IC) = 4
       RETURN
      ENDIF

!  CLOUD TOP WATER AND MOMENTUM (TIMES ETA(IC)) MS-A16

      IF (DO_TRACERS) THEN 
         DO ITR=1,ITRCR
            XHT(ITR) = XOI(K,ITR)
         END DO
      END IF

      WLQ     = QOL(K)
      UHT     = UOI(K)
      VHT     = VOI(K)
      RNN(K)  = 0.
      CLL0(K) = 0.

      DO L=K-1,IC,-1
       TEM   = ETA(L) - ETA(L+1)
       WLQ   = WLQ + TEM * QOL(L)
       UHT   = UHT + TEM * UOI(L)
       VHT   = VHT + TEM * VOI(L)
 
       IF (DO_TRACERS)  THEN  
        DO ITR=1,ITRCR

!         Scavenging -- fscav    is the fraction scavenged per km
!                       delz     is the layer thickness in km
!                       fnoscav  is the fraction not scavenged
!                      
           DELZKM = ( ZET(L) - ZET(L+1) ) / 1000.
           FNOSCAV = 1. - FSCAV_(ITR) * DELZKM
           FNOSCAV = max( min(FNOSCAV,1.), 0.) ! must be in [0,1]
          
          ! Before scanveging:  XHT(ITR) = XHT(ITR) + TEM * XOI(L,ITR)
          XHT(ITR) = XHT(ITR) + TEM * XOI(L,ITR) * FNOSCAV

        END DO
       END IF

               !!!! How much condensate (CLI) is present here? 
       IF(L>IC) THEN
        TX2   = 0.5*(QST(L)+QST(L-1))*ETA(L)
        TX3   = 0.5*(HST(L)+HST(L-1))*ETA(L)
        QCC   = TX2 + GM1(L)*(HCC(L)-TX3)
        CLL0(L)  = (WLQ-QCC)
       ELSE
        CLL0(L)   = (WLQ-QST(IC)*ETA(IC))
       ENDIF

       CLL0(L)    = MAX( CLL0(L) , 0.00 )

       CLI  = CLL0(L) / ETA(L)  ! condensate (kg/kg)
       TE_A = POI(L)*PRH(L)     ! Temperature (K)

       CALL SUNDQ3_ICE( TE_A,  SDQV2, SDQV3, SDQVT1, F2 , F3 )

       C00_X  =  CO_AUTO * F2 * F3  * F4  ! * F5  ! F4 reduces AUTO for shallow clouds, F5 modifies auto for deep clouds
       CLI_CRIT_X =  CLI_CRIT / ( F2 * F3 )


       
       RATE = C00_X * ( 1.0 - EXP( -(CLI)**2 / CLI_CRIT_X**2 ) )


       CVW_X     = MAX( CVW(L) , 1.00 )              ! Floor conv. vel. since we don't 
                                                     ! really trust it at low values

       DT_LYR  = ( ZET(L)-ZET(L+1) )/CVW_X           ! l.h.s. DT_LYR => time in layer (L,L+1)

       CLOSS   = CLL0(L) * RATE * DT_LYR
       CLOSS   = MIN( CLOSS , CLL0(L) )

       CLL0(L) = CLL0(L) - CLOSS
       DLL0(L) = CLOSS

       IF(CLOSS>0.) then
        WLQ = WLQ - CLOSS
        RNN(L) = CLOSS 
       else
        RNN(L) = 0.
       ENDIF




      ENDDO

      WLQ = WLQ - QST(IC)*ETA(IC)

!     CALCULATE GAMMAS AND KERNEL

      GMS(K) =          (SHT(K)-SSL(K))*PRI(K)          ! MS-A30 (W/O GRAV)
      GMH(K) = GMS(K) + (QHT(K)-QOL(K))*PRI(K)*ALHL     ! MS-A31 (W/O GRAV)
      AKM    = GMH(K)*GAM(K-1)*DPB(K-1)                 ! MS-A37 (W/O GRAV)

      TX2     = GMH(K)
      DO L=K-1,IC+1,-1
       GMS(L) = ( ETA(L  )*(SHT(L)-SSL(L  ))   & 
                + ETA(L+1)*(SSL(L)-SHT(L+1)) )     *PRI(L)
       GMH(L) = GMS(L)                         &
              + ( ETA(L  )*(QHT(L)-QOL(L  ))   &
                + ETA(L+1)*(QOL(L)-QHT(L+1)) )*ALHL*PRI(L)
       TX2 = TX2 + (ETA(L) - ETA(L+1)) * GMH(L)
       AKM = AKM - GMS(L)*EHT(L)*PKI(L) + TX2*GHT(L)

      ENDDO

      GMS(IC) = ETA(IC+1)*(SSL(IC)-SHT(IC+1))*PRI(IC)
      AKM     = AKM - GMS(IC)*ETA(IC+1)*DPB(IC)*PKI(IC)

      GMH(IC) =   GMS(IC) + ( ETA(IC+1)*(QOL(IC)-QHT(IC+1))*ALHL &
                            + ETA(IC  )*(HST(IC)-HOL(IC  ))     )*PRI(IC)

      if ( SMOOTH_HST ) then
      GMHx    =   GMS(IC) + ( ETA(IC+1)*(QOL(IC)-QHT(IC+1))*ALHL &
                            + ETA(IC  )*(HSTx   -HOL(IC  ))     )*PRI(IC)
      endif

!    CLOUD BASE MASS FLUX

      IF (AKM >= 0.0 .OR. WLQ < 0.0)  THEN  !  =========>
       RC(IC) = 5
       RETURN
      ENDIF

      WFN = - (WFN-ACR)/AKM ! MS-A39 MASS-FLUX IN Pa/step
      WFN = MIN( ( RASAL(IC)*TRG*TOKI )*WFN  ,   (PRS(K+1)-PRS(K) )*(100.*PBLFRAC))


     
!    CUMULATIVE PRECIP AND CLOUD-BASE MASS FLUX FOR OUTPUT

      WFNOG    = WFN*GRAVI
      TEM      = WFN*GRAVI
      CLL (IC) = CLL (IC) + WLQ*TEM           ! (kg/m^2/step)
      RMF (IC) = RMF (IC) +     TEM           ! (kg/m^2/step)
      RMFD(IC) = RMFD(IC) +     TEM * ETA(IC) ! (kg/m^2/step)

      DO L=IC+1,K
       RMFP(L) = TEM * ETA(L)                 ! (kg/m^2/step)
       RMFC(L) = RMFC(L)  +  RMFP(L)          ! (kg/m^2/step)
           
       DLLX(L) = DLLX(L)  +  TEM*DLL0(L)        


       IF ( CVW(L) > 0.0 ) THEN
          UPDFRP(L) = rmfp(L) * (DDT/DAYLEN) * 1000. / ( CVW(L) * PRS(L) )
       ELSE 
          UPDFRP(L) = 0.0       
       ENDIF

       CLLI(L) = CLL0(L)/ETA(L)  ! current cloud; incloud condensate        
       CLLB(L) = CLLB(L) +  UPDFRP(L) * CLLI(L) !  cumulative grid mean convective condensate        

       UPDFRC(L) =  UPDFRC(L) +  UPDFRP(L)      
 
       

      ENDDO



!    THETA AND Q CHANGE DUE TO CLOUD TYPE IC

      DO L=IC,K
       RNS(L) = RNS(L) + RNN(L)*TEM ! (kg/m^2/step)
       GMH(L) = GMH(L) * WFN
       GMS(L) = GMS(L) * WFN
       QOI(L) = QOI(L) + (GMH(L) - GMS(L)) * ALHI
       POI(L) = POI(L) + GMS(L)*PKI(L)*CPI
       QST(L) = QST(L) + GMS(L)*BET(L)*CPI
      ENDDO
      
      if ( SMOOTH_HST ) then
         GMHx    = GMHx * WFN
         dQx     = (GMHx - GMH(IC)) * ALHI
         RNS(IC) = RNS(IC) + dQx / ( PRI(IC)*GRAV )
      endif

      IF (DO_TRACERS) THEN
        WFN     = WFN*0.5 *1.0           !*FRICFAC*0.5
        TEM     = WFN*PRI(K)

        DO ITR=1,ITRCR 
           XCU(K,ITR) =  XCU(K,ITR) + TEM * (XOI(K-1,ITR) - XOI(K,ITR))
        END DO

        DO ITR=1,ITRCR 
        DO L=K-1,IC+1,-1
          TEM    = WFN*PRI(L)
          XCU(L,ITR) = XCU(L,ITR) + TEM *                        &
                   ( (XOI(L-1,ITR) - XOI(L,ITR  )) * ETA(L)   &
                   + (XOI(L,ITR  ) - XOI(L+1,ITR)) * ETA(L+1) )
        ENDDO
        ENDDO

        TEM     = WFN*PRI(IC)

        DO ITR=1,ITRCR 
        XCU(IC,ITR) = XCU(IC,ITR) +  &
                  (2.*(XHT(ITR) - XOI(IC,ITR)*(ETA(IC)-ETA(IC+1))) & 
                  - (XOI(IC,ITR)+XOI(IC+1,ITR))*ETA(IC+1))*TEM
        ENDDO

        DO ITR=1,ITRCR 
        DO L=IC,K
           XOI(L,ITR) = XOI(L,ITR) + XCU(L,ITR)
        ENDDO
        ENDDO
      else 
        WFN     = WFN*0.5 *1.0           !*FRICFAC*0.5
      endif

      LAMBDSV(IC) = 1.000 


!   CUMULUS FRICTION

      IF(FRICFAC <= 0.0) THEN
       RC(IC) = 0
       RETURN  !  NO CUMULUS FRICTION =========>>
      ENDIF

      WFN     = WFN*FRICFAC*EXP( -ALM / FRICLAMBDA )
      TEM     = WFN*PRI(K)

      UCU(K)  = UCU(K) + TEM * (UOI(K-1) - UOI(K))
      VCU(K)  = VCU(K) + TEM * (VOI(K-1) - VOI(K))

      DO L=K-1,IC+1,-1
       TEM    = WFN*PRI(L)
       UCU(L) = UCU(L) + TEM *                        &
                   ( (UOI(L-1) - UOI(L  )) * ETA(L  ) &
                   + (UOI(L  ) - UOI(L+1)) * ETA(L+1) )
       VCU(L) = VCU(L) + TEM *                        &
                   ( (VOI(L-1) - VOI(L  )) * ETA(L)   &
                   + (VOI(L  ) - VOI(L+1)) * ETA(L+1) )
      ENDDO

      TEM     = WFN*PRI(IC)

      UCU(IC) = UCU(IC) + (2.*(UHT - UOI(IC)*(ETA(IC)-ETA(IC+1))) & 
                 - (UOI(IC)+UOI(IC+1))*ETA(IC+1))*TEM
      VCU(IC) = VCU(IC) + (2.*(VHT - VOI(IC)*(ETA(IC)-ETA(IC+1))) & 
                 - (VOI(IC)+VOI(IC+1))*ETA(IC+1))*TEM


      DISSK0(IC) = ETA(IC)* GRAV * WFNOG * PRI(IC) * 0.5 & 
                 *( (UHT/ETA(IC)  - UOI(IC) )**2    & 
                  + (VHT/ETA(IC)  - VOI(IC) )**2 )  
      DO L=IC,K
       UOI(L) = UOI(L) + UCU(L)
       VOI(L) = VOI(L) + VCU(L)
      ENDDO

      RC(IC) = 0

      RETURN

   END SUBROUTINE CLOUDE


   

   SUBROUTINE ACRITN( PL, PLB, ACR) 1
      
      REAL, INTENT(IN ) :: PL, PLB
      REAL, INTENT(OUT) :: ACR

      INTEGER IWK
      
      !!REAL, PARAMETER :: FACM=0.5

      REAL, PARAMETER :: &
         PH(15)=(/150.0, 200.0, 250.0, 300.0, 350.0, 400.0, 450.0, 500.0, &
                 550.0, 600.0, 650.0, 700.0, 750.0, 800.0, 850.0/)

      REAL, PARAMETER :: & 
         A(15)=(/ 1.6851, 1.1686, 0.7663, 0.5255, 0.4100, 0.3677, &
                 0.3151, 0.2216, 0.1521, 0.1082, 0.0750, 0.0664, &
                 0.0553, 0.0445, 0.0633     /)   !!*FACM

      IWK = PL * 0.02 - 0.999999999

      IF (IWK .GT. 1 .AND. IWK .LE. 15) THEN
       ACR = A(IWK-1) + (PL-PH(IWK-1))*.02*(A(IWK)-A(IWK-1))
      ELSEIF(IWK > 15) THEN
       ACR = A(15)
      ELSE
       ACR = A(1)
      ENDIF

      ACR = ACRITFAC  * ACR * (PLB - PL)

      RETURN

   END SUBROUTINE ACRITN

   

   SUBROUTINE RNEVP 1
      

      ZET(K+1) = 0
      DO L=K,ICMIN,-1
       TEM     = POI(L)*(PRJ(L+1)-PRJ(L))*CPBG
       ZET(L)  = ZET(L+1) + TEM
      ENDDO

      DO L=ICMIN,K

         TEM    = PRI(L)*GRAV
         CNV_PRC3(I,L) = RNS(L)*TEM     
      ENDDO

      !! If hst is smoothed then adjusted precips may be negative
      if ( SMOOTH_HST ) then
         DO L=ICMIN,K
            if ( CNV_PRC3(I,L) < 0. ) then
               QOI(L)        = QOI(L) +  CNV_PRC3(I,L)
               POI(L)        = POI(L) -  CNV_PRC3(I,L) * (ALHL/CP) / PRJ(L+1)
               CNV_PRC3(I,L) = 0.
            endif
         END DO
       endif

     RETURN

   END SUBROUTINE RNEVP




   SUBROUTINE HTEST 1
      REAL,  DIMENSION(K0) :: HOL1
      integer  :: lminhol
      real     :: minhol
         

      hol=0.            ! HOL initialized here in order not to confuse Valgrind debugger
      lminhol  = K+1
      MINHOL   = -999999.
      ZET(K+1) = 0
      SHT(K+1) = CP*POI(K)*PRJ(K+1)
      DO L=K,ICMIN,-1
       QOL(L)  = AMIN1(QST(L)*RHMAX,QOI(L))
       QOL(L)  = AMAX1( 0.000, QOL(L) )     ! GUARDIAN/NEG.PREC.
       SSL(L)  = CP*PRJ(L+1)*POI(L) + GRAV*ZET(L+1)
       HOL(L)  = SSL(L) + QOL(L)*ALHL
       HST(L)  = SSL(L) + QST(L)*ALHL
       TEM     = POI(L)*(PRJ(L+1)-PRJ(L))*CPBG
       ZET(L)  = ZET(L+1) + TEM
       ZOL(L)  = ZET(L+1) + (PRJ(L+1)-PRH(L))*POI(L)*CPBG
      ENDDO
       
      HOL1=HOL
      DO L=K-1,ICMIN+1,-1
       HOL1(L)  = (0.25*HOL(L+1)+0.50*HOL(L)+0.25*HOL(L-1))
       if ( ( MINHOL>=HOL1(L) ) .OR. (MINHOL<0.) ) THEN
            MINHOL   =  HOL1(L)
            LMINHOL  =  L
       end if  
      ENDDO

          SIGE_MINHOL = SIGE(LMINHOL)

         


   end subroutine HTEST



   subroutine FINDDTLS 1
     real :: SIGDT0,sigmax,sigmin
     integer :: LL
     integer :: THE_SEED(2)

     THE_SEED(1)=SEEDRAS(1)*IRAS(I) + SEEDRAS(2)*JRAS(I)
     THE_SEED(2)=SEEDRAS(1)*JRAS(I) + SEEDRAS(2)*IRAS(I)
     THE_SEED(1)=THE_SEED(1)*SEEDRAS(1)/( SEEDRAS(2) + 10)
     THE_SEED(2)=THE_SEED(2)*SEEDRAS(1)/( SEEDRAS(2) + 10)
      

     call random_seed(PUT=THE_SEED)

     SIGMAX=SIGE(K)
     SIGMIN=SIGE(ICMIN)

     if ( RASNCL < 0.0 ) then 
         N_DTL = K - ICMIN 
     else 
         N_DTL = min( int( RASNCL ) , K-ICMIN )
     endif 

     if(allocated(ICL_V)) deallocate(ICL_V)
     allocate(ICL_V(N_DTL))

     if ( ( RASNCL < 0.0 ) .and. ( RASNCL >=-100.) ) then 
        do L=1,N_DTL
           ICL_V(L) = ICMIN + L - 1
        enddo
     else if ( RASNCL < -100.0 ) then 
        do L=1,N_DTL
           ICL_V(L) = K - L
        enddo
     else
        do L=1,N_DTL
           call random_number ( SIGDT0 )
           SIGDT0 = 1.00 - ( SIGDT0**RDTLEXPON )
           SIGDT0 = SIGMIN+SIGDT0*(SIGMAX-SIGMIN)

           do LL=ICMIN,K
              if ( (SIGE(LL+1)>=SIGDT0) .and. (SIGE(LL)<SIGDT0 ) ) ICL_V(L)=LL
           enddo
        end do
     endif

   end subroutine FINDDTLS





   SUBROUTINE STRAP(FINAL) 4


    INTEGER :: FINAL
    REAL , DIMENSION(K0)  :: WGHT, MASSF

    REAL :: WGHT0, PRCBL
        
! !DESCRIPTION: 
!   {\tt STRAP} is called: FINAL=0, to compute cloud base layer CBL properties
!   given a value K for the index of the upper {\em EDGE} of the CBL; FINAL=1
!   to redistribute convective tendencies within CBL

        integer :: KK

!  LOCAL VARIABLES FOR USE IN CLOUDE

    !!IF (.NOT. PRESENT(FINAL)) THEN
    IF (FINAL==0) THEN


       !!PRJ(ICMIN:K+1) = PKE(I,ICMIN:K+1)


        do kk=icmin,k+1
           PRJ(kk) = PKE(I,kk)
        enddo


       poi=0.        ! These initialized here in order not to confuse Valgrind debugger
       qoi=0.        ! Do not believe it actually makes any difference.
       uoi=0.
       voi=0.     

       PRS(ICMIN:K0+1) = PLE(I,ICMIN:K0+1)
       POI(ICMIN:K)   = THO(I,ICMIN:K)
       QOI(ICMIN:K)   = QHO(I,ICMIN:K)
       UOI(ICMIN:K)   = UHO(I,ICMIN:K)
       VOI(ICMIN:K)   = VHO(I,ICMIN:K)

       WSP(ICMIN:K)   = SQRT(   ( UOI(ICMIN:K) - UOI(K) )**2  & 
                              + ( VOI(ICMIN:K) - VOI(K) )**2    ) 

       QST(ICMIN:K) = QSS(I,ICMIN:K)
       DQQ(ICMIN:K) = DQS(I,ICMIN:K)

       IF (DO_TRACERS) THEN 
          DO ITR=1,ITRCR 
              XOI(ICMIN:K,ITR) = XHO(I,ICMIN:K,ITR)
          END DO
       END IF


    !!! Mass fraction of each layer below cloud base
    !!! contributed to aggregate cloudbase layer (CBL) 
    MASSF(:) = WGT0(:)


    !!! RESET PRESSURE at bottom edge of CBL 
      PRCBL = PRS(K)
      do l= K,K0
         PRCBL = PRCBL + MASSF(l)*( PRS(l+1)-PRS(l) )
      end do
      PRS(K+1) = PRCBL
      PRJ(K+1) = (PRS(K+1)/1000.)**(MAPL_RGAS/MAPL_CP)

      DO L=K,ICMIN,-1
       POL(L)  = 0.5*(PRS(L)+PRS(L+1))
       PRH(L)  = (PRS(L+1)*PRJ(L+1)-PRS(L)*PRJ(L)) &
               / (ONEPKAP*(PRS(L+1)-PRS(L)))
       PKI(L)  = 1.0 / PRH(L)
       DPT(L)  = PRH(L  ) - PRJ(L)
       DPB(L)  = PRJ(L+1) - PRH(L)
       PRI(L)  = .01 / (PRS(L+1)-PRS(L))
      ENDDO


   !!!!! RECALCULATE PROFILE QUAN. IN LOWEST STRAPPED LAYER
     if( K<=K0) then
      POI(K) = 0.
      QOI(K) = 0.
      UOI(K) = 0.
      VOI(K) = 0.

         !! SPECIFY WEIGHTS GIVEN TO EACH LAYER WITHIN SUBCLOUD "SUPERLAYER"
      WGHT = 0.
      DO L=K,K0
       WGHT(L)   = MASSF(L) *                &
                   ( PLE(I,L+1) - PLE(I,L) ) &
                  /( PRS(K+1)   - PRS(K)  )
      END DO      



      DO L=K,K0
       POI(K) = POI(K) + WGHT(L)*THO(I,L)
       QOI(K) = QOI(K) + WGHT(L)*QHO(I,L)
       UOI(K) = UOI(K) + WGHT(L)*UHO(I,L)
       VOI(K) = VOI(K) + WGHT(L)*VHO(I,L)
      ENDDO


      IF (DO_TRACERS) THEN 
         XOI(K,:)=0.
         DO ITR=1,ITRCR
          DO L=K,K0
            XOI(K,ITR) = XOI(K,ITR) + WGHT(L)*XHO(I,L,ITR)
          END DO
         END DO
      END IF

      DQQ(K) = DQSAT( POI(K)*PRH(K) , POL(K), qsat=QST(K) )

      endif


      !!DPTH_BL = CPBG*POI(K)*( PRJ(K+1)-PRJ(K) )

      DPTH_BL = ZCBL(I)

      DO L=K,ICMIN,-1
       BET(L)  = DQQ(L)*PKI(L)  !*
       GAM(L)  = PKI(L)/(1.0+LBCP*DQQ(L)) !*
       IF(L<K) THEN
        GHT(L+1) = GAM(L)*DPB(L) + GAM(L+1)*DPT(L+1)
        GM1(L+1) = 0.5*LBCP*(DQQ(L  )/(ALHL*(1.0+LBCP*DQQ(L  ))) + &
                             DQQ(L+1)/(ALHL*(1.0+LBCP*DQQ(L+1))) )
       ENDIF
      ENDDO


       TCU(ICMIN:K) = -POI(ICMIN:K)*PRH(ICMIN:K)
       QCU(ICMIN:K) = -QOI(ICMIN:K)

       RNS  = 0.
       CLL  = 0.
       RMF  = 0.
       RMFD = 0.
       RMFC = 0.
       RMFP = 0.
       CLL0 = 0.
       DLL0 = 0.
       CLLX = 0.
       DLLX = 0.
       CLLI = 0.
       CLLB = 0.

       POI_SV = POI
       QOI_SV = QOI
       UOI_SV = UOI
       VOI_SV = VOI
       IF (DO_TRACERS) XOI_SV = XOI

       LAMBDSV = 0.0
       CVW     = 0.0
       UPDFRC  = 0.0
       UPDFRP  = 0.0
       DISSK0  = 0.0

    END IF
     
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!    IF (PRESENT(FINAL)) THEN

     
      IF (FINAL==1) THEN 
       

         THO(I,ICMIN:K-1) = POI(ICMIN:K-1)
         QHO(I,ICMIN:K-1) = QOI(ICMIN:K-1)
         UHO(I,ICMIN:K-1) = UOI(ICMIN:K-1)
         VHO(I,ICMIN:K-1) = VOI(ICMIN:K-1)
         CNV_UPDFRC(I,ICMIN:K-1)   =  UPDFRC(ICMIN:K-1)
         CNV_QC(I,ICMIN:K-1)       =  CLLB(ICMIN:K-1)


         !! De-strap tendencies from RAS
         !! specify weighting "SHAPE"
         WGHT   = WGT1

         !! Scale properly by layer masses
         wght0 = 0.
         DO L=K,K0 
            wght0 = wght0 + WGHT(L)* ( PLE(I,L+1) - PLE(I,L) )
         END DO
         
         wght0 = ( PRS(K+1)   - PRS(K)  )/wght0

         WGHT  = wght0 * WGHT


         DO L=K,K0 
            THO(I,L) =  THO(I,L) + WGHT(L)*(POI(K) - POI_SV(K))
            QHO(I,L) =  QHO(I,L) + WGHT(L)*(QOI(K) - QOI_SV(K))
            UHO(I,L) =  UHO(I,L) + WGHT(L)*(UOI(K) - UOI_SV(K))
            VHO(I,L) =  VHO(I,L) + WGHT(L)*(VOI(K) - VOI_SV(K))
         END DO

         IF (DO_TRACERS) THEN 
            XHO(I,ICMIN:K-1,:) = XOI(ICMIN:K-1,:) 
            DO ITR=1,ITRCR
               DO L=K,K0
                  XHO(I,L,ITR) =  XHO(I,L,ITR) + WGHT(L)*(XOI(K,ITR) - XOI_SV(K,ITR))
               END DO
            END DO
         END IF




         FLX (I,ICMIN:K) = RMF (ICMIN:K) * DDT/DAYLEN  !  (KG/m^2/s @ CLOUD BASE)
         FLXD(I,ICMIN:K) = RMFD(ICMIN:K) * DDT/DAYLEN  !  (KG/m^2/s @ CLOUD TOP)
         FLXC(I,ICMIN:K) = RMFC(ICMIN:K) * DDT/DAYLEN  !  (KG/m^2/s @ CLOUD TOP)
         CLW (I,ICMIN:K) = CLL (ICMIN:K) * DDT/DAYLEN  !  (KG/m^2/s )

         if ( PRESENT( DISSKE ))  DISSKE(I,ICMIN:K-1) = DISSK0(ICMIN:K-1) * DDT/DAYLEN

         FLX (I,1:ICMIN-1) = 0.
         FLXD(I,1:ICMIN-1) = 0.
         FLXC(I,1:ICMIN-1) = 0.
         CLW (I,1:ICMIN-1) = 0.


         IF ( K < K0 ) THEN 
          FLX (I,K:K0) = 0.
          FLXD(I,K:K0) = 0.
          FLXC(I,K:K0) = 0.
          CLW (I,K:K0) = 0.
         END IF

        IF(PRESENT(IRC)) THEN
        !  IRC (I,1:ICMIN-1) = -2
          IRC (I,ICMIN:K-1) = RC(ICMIN:K-1)
        !  IRC (I,K:K0     ) = -2
         ENDIF


         IF(ALLOCATED(ICL_V)) DEALLOCATE( ICL_V )

      ENDIF

      IF (FINAL==2) THEN 
      

         FLX (I,:) = 0.
         FLXD(I,:) = 0.
         FLXC(I,:) = 0.
         CLW (I,:) = 0.

        IF(PRESENT(IRC)) THEN
        !  IRC (I,1:ICMIN-1) = -2
          IRC (I,ICMIN:K-1) = RC(ICMIN:K-1)
        !  IRC (I,K:K0     ) = -2
         ENDIF

      ENDIF 

   RETURN

   END SUBROUTINE STRAP

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



  END SUBROUTINE RASE

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


  SUBROUTINE SUNDQ3_ICE( TEMP,RATE2,RATE3,TE1, F2, F3) 1

REAL, INTENT( IN) :: TEMP,RATE2,RATE3,TE1
REAL, INTENT(OUT) :: F2, F3

REAL :: XX, YY,TE0,TE2,JUMP1  !,RATE2,RATE3,TE1

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!  Ice - phase treatment totally invented
!!  Sharp increase in autoconversion in range
!!  ~~TE1 K ~< T < TE0 K .
!!  (JTB, 3/25/2003)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


TE0=273.
TE2=200.
JUMP1=  (RATE2-1.0) / ( ( TE0-TE1 )**0.333 ) 


!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!  Ice - phase treatment  !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
  IF   ( TEMP .GE. TE0 ) THEN 
    F2   = 1.0
    F3   = 1.0
  ENDIF
  IF ( ( TEMP .GE. TE1 ) .AND. ( TEMP .LT. TE0 ) )THEN 
    F2   = 1.0 + JUMP1 * (( TE0 - TEMP )**0.3333)
    F3   = 1.0
  ENDIF
  IF   ( TEMP .LT. TE1 ) THEN 
    F2   = RATE2 + (RATE3-RATE2)*(TE1-TEMP)/(TE1-TE2)
    F3   = 1.0
  ENDIF
!!!!!!!!!!!!!!!!!!!!!!!!!!!!

IF ( F2 .GT. 27.0 ) F2=27.0


end  subroutine sundq3_ice




 END MODULE RAS