SUBROUTINE GETCLDS(IM,     IX,    levs,  TGRS,  QGRS, 1,3
     &                   VVEL,   RH,    QST,
     &                   slmsk,  RLON,  RLAT,
     &                   CVR,    CVTR,  CVBR,   RHCL,
     &                   ISTRAT, PRSI,  PRSL,   CLDTOT, CLDCNV,
     &                   CLDSA,  MBOTA, MTOPA,  CLW,    NCLD)
!
      USE MACHINE , ONLY : kind_phys,kind_rad
      USE PHYSCONS, PI => con_PI
      implicit none
!     include 'constant.h'
!
      integer MCLD,NSEAL,NBIN,NLON,NLAT
!bl ...     4 tuned cld/rh curves..bl,l,m,h  ...  KAC APR96
      PARAMETER (MCLD=4,NSEAL=2,NBIN=100,NLON=2,NLAT=4)
!
      integer IM, IX, I
      integer K,IREGNH,ISLA,KC,LO,NBI,KLA,ILSEA,ILONGT,KLO,IKN,ILFT,
     1        IRGT,INCV,ITOP,IBTC,levs,ncld,istrat
      integer MTOPA(IX,3),MBOTA(IX,3)
      integer INVR,IVVA
!
!
      real (kind=kind_rad) PRSI(IX,LEVS+1), PRSL(IX,LEVS)
      real (kind=kind_rad) TGRS(IX,LEVS),   QGRS(IX,LEVS),
     &                     VVEL(IM,LEVS),   RH(IM,LEVS)
      real (kind=kind_rad) CLW(IM,LEVS),    CLDSA(IM,5),
     &                     QST(IM,LEVS),
     &                     CLDTOT(IM,LEVS), CLDCNV(IM,LEVS)
!     real (kind=kind_rad) PGR,        CVR,        CVTR,       CVBR
      real (kind=kind_rad) CVR(IM),    CVTR(IM),   CVBR(IM)
     &,                    slmsk(im),  rlon(im),   rlat(im)
!....
!TUNE
!...  ARRAY ADDED FOR RH-CL CALCULATION
!     INDICES FOR LON,LAT,CLD TYPE(L,M,H), LAND/SEA RESPECTIVELY
!     NLON=1-2, FOR EASTERN AND WESTERN HEMISPHERES
!     NLAT=1-4, FOR 60N-30N,30N-EQU,EQU-30S,30S-60S
!     LAND/SEA=1-2 FOR LAND(AND SEAICE),SEA
!
      real (kind=kind_rad) RHCL (NBIN,NLON,NLAT,MCLD,NSEAL)
      real (kind=kind_rad) RHCLA(NBIN,NLON,     MCLD,NSEAL)
      real (kind=kind_rad) RHCLD(IM,NBIN,MCLD)
      real (kind=kind_rad) XLABDY(3),XLOBDY(3)
!...   XLABDY = LAT BNDRY BETWEEN TUNING REGIONS,+/- XLIM FOR TRANSITION
!.     XLOBDY = LON BNDRY BETWEEN TUNING REGIONS
!
      real (kind=kind_rad)  tem, xlatdg, xlondg
     &,                     xlnn, xlss,rhmax,xlim,xrgt,xlft,diflo
!
c$$$      SAVE INVR,IVVA,RHMAX,XLABDY,XLOBDY,XLIM
!
      DATA XLABDY / 30.E0 , 0.E0 , -30.E0 /
      DATA XLOBDY / 0.E0 , 180.E0 , 360.E0 /
      DATA XLIM / 5.E0 /
!TUNE
!..... INITIAL RH CRIT. SET 1 FOR OCEAN, SET 2 FOR LAND.
!      INVR=0 NO LAPSE RATE INVERSION TYPE CLD, =1 WIHT IT
!      IVVA=0 NO VERTICAL VELOCITY ADJ. FOR LOW CLD, =1 WITH ADJ.
      DATA RHMAX/1.00E0/, INVR/1/, IVVA/1/
!     DATA ISTRAT,IBL,ICONV,IEMIS,ITHK/1,1,1,0,1/
!
      integer ipnGlobal,its,mype
      logical :: DiagPrint = .false.
!     call PhysicsGetIpnItsMype(ipnGlobal,its,mype,DiagPrint)
!TUNE
      if (ncld .eq. 0) then    ! Do the following only for RH clouds!
        TEM    = 180.0 / PI
        DO I=1,IM
          XLATDG = RLAT(I) * TEM
          XLONDG = RLON(I) * TEM
          IREGNH = 4
!....  GET RH-CLD RELATION FOR THIS LAT
          DO K=1,3
            IF (XLATDG .GT. XLABDY(K)) THEN
              IREGNH = K
              GO TO 215
             END IF
          ENDDO
  215     CONTINUE
          DO 230 ISLA=1,NSEAL
           DO 230 KC=1,MCLD
            DO 230 LO=1,NLON
             DO 230 NBI=1,NBIN
              RHCLA(NBI,LO,KC,ISLA) = RHCL(NBI,LO,IREGNH,KC,ISLA)
  230     CONTINUE
!.....    LINEAR TRANSITION BETWEEN LATITUDINAL REGIONS...
          DO 240 KLA=1,3
           XLNN = XLABDY(KLA)+XLIM
           XLSS = XLABDY(KLA)-XLIM
           IF (XLATDG.LT.XLNN.AND.XLATDG.GT.XLSS) THEN
            DO 235 ISLA=1,NSEAL
             DO 235 KC=1,MCLD
              DO 235 LO=1,NLON
               DO 235 NBI=1,NBIN
                RHCLA (NBI,LO,KC,ISLA) =
     &           (RHCL(NBI,LO,KLA,KC,ISLA)-RHCL(NBI,LO,KLA+1,KC,ISLA))
     &        * (XLATDG-XLSS)/(XLNN-XLSS) + RHCL(NBI,LO,KLA+1,KC,ISLA)
  235       CONTINUE
           END IF
  240     CONTINUE
!...   GET RH-CLD RELATIONSHIP FOR EACH GRID POINT, INTERPOLATING
!       LONGITUDINALLY BETWEEN REGIONS IF NECESSARY..
          ILSEA = 1
          IF (slmsk(I).LT.1.E0) THEN
            ILSEA = 2               !...  OPEN OCEAN POINT....
          END IF
!...  WHICH HEMISPHERE (E,W)
          ILONGT = 1
          IF (XLONDG.GT.180.E0) ILONGT = 2
          DO 246 K=1,MCLD
            DO 241 NBI=1,NBIN
              RHCLD(I,NBI,K) = RHCLA(NBI,ILONGT,K,ILSEA)
  241       CONTINUE
          IKN = 0
          DO 243 KLO=1,3
            DIFLO = ABS(XLONDG-XLOBDY(KLO))
            IF (DIFLO.LT.XLIM) THEN
              IKN = KLO
              GO TO 244
             END IF
  243     CONTINUE
          GO TO 246
  244     CONTINUE
          ILFT = ILONGT
          IRGT = ILFT + 1
          IF (IRGT.GT.NLON) IRGT = 1
          XLFT = XLOBDY(IKN) - XLIM
          XRGT = XLOBDY(IKN) + XLIM
          DO 245 NBI=1,NBIN
            RHCLD (I,NBI,K) =
     &        (RHCLA(NBI,ILFT,K,ILSEA)-RHCLA(NBI,IRGT,K,ILSEA))
     &         * (XLONDG-XRGT)/(XLFT-XRGT)+RHCLA(NBI,IRGT,K,ILSEA)
  245     CONTINUE
  246     CONTINUE
        ENDDO
      endif
!TUNE
!...      VERTICAL MOTION (CB/SEC) IN VVEL
!...      GET MODEL DIAGNOSED CLDS
!
      CALL CLDJMS(IX, IM, LEVS, NBIN, MCLD,
     &            QGRS, TGRS, VVEL, RH, QST,
     &            CVR,  CVTR,  CVBR, PRSI, PRSL, SLMSK,
     &            CLDSA, MTOPA, MBOTA, CLDTOT, CLDCNV,
     &            IVVA,INVR,RLAT,RHCLD,ISTRAT,CLW,NCLD)
!
      RETURN
      END

      SUBROUTINE CLDJMS(IDIMT,IDIMS,KDIM,NBIN,MCLD, 1,2
     &                  Q,T,VVEL,RHRH,QST,
     &                  CV,CVT,CVB,PRSI,PRSL,SLMSK,
     &                  CLD,MTOP,MBOT,CLDTOT,CLDCNV,
     &                  IVVA,INVR,XLATRD,RHCLD,ISTRAT,CLW,NCLD)
!TUNE
!FPP$ NOCONCUR R
!....    FROM YH.RAD.MDL93(CLDNEW28).......
!....     LATER UPDATED FROM YH.RAD.MDL94(CLDMUL28)...22JAN94
!....     LATER UPDATED FROM YH.RAD.MDL94(CLDML28A)... 1FEB94
!....     LATER UPDATED FROM YH.RAD.MDL94(CLDML28B)... 5FEB94
!.               SUBR CLDPRP REPLACED
!.               ADDED VERTICAL INTERP OF CLD-RH RELATIONS(ISTRAT GT 1)
!....     LATER UPDATED FROM YH.RAD.MDL94(CLDML28E)... 11MAR94
!.               SUBR CLDPRP REPLACED,GCL ADJUSTED
!....     LATER UPDATED FROM CLOUD6................... 24MAR94
!.               SUBR CLDPRP , LOW ENHANCED TO OLD VALUE..0.14..
!.               SUBR GCLNEW , LLYR CALCULATION ADJ TO OLD VALU(KL-1)
!.                             LLYRL WAS OK.. IVE REMOVED IT AND
!.                             REPLACED IT BY ITS EQUIVALENT, KLOWB
!....     LATER UPDATED FROM CLOUD6................... 30MAR94
!.               SUBR CLDPRP , LOW AND MIDDLE (NOT CV) ENHANCED=0.10
!---------------------------------------------------------------------
!     NOV., 1992 - Y.H., K.A.C., AND A.K.
!        CLOUD PARAMETERIZATION PATTERNED AFTER SLINGO AND SLINGO'S
!        WORK (JGR, 1991).
!     STRATIFORM CLOUDS ARE ALLOWED IN ANY LAYER EXCEPT THE SURFACE
!        AND UPPER STRATOSPHERE.  THE RELATIVE HUMIDITY CRITERION MAY
!        VARY IN DIFFERENT MODEL LAYERS.
!YH94
!     OUTPUT CLOUD AMOUNTS ARE IN CLDARY(I,K), K=1 IS THE LOWEST
!        MODEL LAYER, STRATIFORM (STR) AND CONVECTIVE (CNV) TYPES OF
!        CLOUD ARE COMPRESSED INTO ONE WORD: CAMT = STR + 1.0E4*CNV
!        LOW MARINE STRATUS AMT'S ARE FLAGED BY ADDING 2.
!YH94
!TUNE
!..   FOR ISTRAT = 0, THERE IS RH-CLD RELATION FOR EACH LAYER..
!                      CRIT RH COMPUTED WITHIN..
!..   FOR ISTRAT = 1, RH-CLD RELATION FROM TABLES CREATED USING
!                     MITCHELL-HAHN TUNING TECHNIQUE (A.F. RTNEPH OBS)
!                  ...STRATUS COMPUTED SIMILAR TO OLD OPNL CLDJMS.....
!                      EXCEPT NO CLOUD BELOW LAYER=KLOWB..APPROX 955MB
!TUNE
!     CONVECTIVE CLOUDS ARE FROM MODEL CONVECTIVE SCHEME AND ARE
!        NO LONGER BROKEN INTO .75,.25,.25..RATHER CC ITSELF IS USED..
!        CONVECTIVE STILL TAKES PRECEDENCE OVER STRATIFORM IN RADFS
!                                               .(IN RADIATION USE OF
!        CC GIVES IMPROVEMENT TO TROPICAL MIDDLE CLD (AS DID ST+CV))
!
!     CLOUDS ARE ALSO DIVIDED INTO 3 ATMOSPHERIC DOMAINS (L,M,H)
!          plus a boundary layer cloud for
!        DIAGNOSTIC PURPOSES.  THEY ARE COMPUTED FROM RANDOM OVERLAP
!        ASSUMPTION FOR SEPARATED CLOUD LAYERS AND MAXIMUM OVERLAP
!        FOR ADJACENT CLOUD LAYERS.  A TOTAL CLOUD FRACTION IS ALSO
!        COMPUTED.
!
!     H,M,L DOMAIN PRESSURE TOPS 'PTOP1(K)' VARY LINEARLY FROM
!        'PTOPC(K,1)' AT 45DEG TO 'PTOPC(K,2)' AT THE POLE
!
!bl
!     4 cloud relationships used
!         so that 1-4 is for BL,L,M,H now... clouds down to layer 2
!          everywhere, with no vvel filter for these lower-10percent-atm clds..
!.....  the BL relationships used below LLYR, except in marine stratus regions
!         where the old method was used (down to layer 3)..2Nov95 .. kac
!.......   old method of marine stratus not used...3Mar96
!.....   save bl cldamt (max overlap) in cld( ,5)...11apr96
!bl
!YH0898
!      AUG 1998   Y-T HOU    RECODED THE DEFAULT PART OF SLINGO'S
!          CLOUD SCHEME PATTERNED AFTER CCM3 (KIEHL ET AL. 1998,J.CLIM;
!          AND 1994,JGR). OUTPUT RH AND CONV CLOUDS USE SEPERATED
!          ARRAYS CLDTOT AND CLDCNV TO AVOID PACKING-UNPACKING PROCESS.
!
!--------------------------------------------------------------------
!     INPUT VARIABLES:
!        PS (CB)       - SURFACE PRESSURE
!        Q  (KG/KG)    - SPECIFIC HUMIDITY
!        T  (DEG K)    - ABSOLUTE TEMPERATURE
!        VVEL(CB/SEC)  - VERTICAL VELOCITY
!        CV,CVT,CVB    - CONV CLD FRACTION, TOP, BOTTOM PRESSURE as obtained
!                      - from the convection scheme layers
!        SI,SL         - MDL SIGMA INTERFACE AND LAYER MEAN
!        SLMSK         - SEA/LAND MASK ARRAY(SEA:0.,LAND:1.,SNOW:2.)
!        IVVA          - FLAG TO CONTROL VERTICAL VELOCITY ADJ.
!                        =1: WITH, =0: WITHOUT
!        INVR          - FLAG TO CONTROL LAPSE RATE INVERSION CLD
!                        =1: WITH, =0: WITHOUT
!        RHMAX         - UPPER LIMIT OF RELATIVE HUMIDITY TO
!                        FORM OVERCAST CLOUD (CLD FRACTN = 1.)
!TUNE
! --------------- MODIFY TO AS AN ARRAY (H.-M. H. JUANG)
!********XLATRD        - CURRENT LATITUDE IN RADIANS (1ST DATA PT)
!********                 FOR MODELS WITH DIFF LAT AT EACH PT, NEED TO
!********                 USE THE LAT OF ALL POINTS....CAREFUL.....
!        RHCLD         - CLOUD-RH RELATIONS FROM MITCHELL+HAHN,
!                        USING A.F. RTNEPH ANALYSES
!        ISTRAT        - 0 OR 1:FOR DEFAULT OR 'RHCLD' TABLES
!                        IN THE STRATIFORM CLOUD CALCULATION
!TUNE
!    OUTPUT VARIABLES:
!       CLDTOT         - VERTICAL COLUMN ARRAY OF STRATIFORM CLOUD
!       CLDCNV         - VERTICAL COLUMN ARRAY OF CONVECTIVE CLOUD
!       CLD            - CLD FRACTION IN 3 TYPES OF DOMAINS (L,M,H)
!bl                          AND TOTAL IN 4TH LAYER and bl takes the 5th
!       MTOP,MBOT      - TOP, BOTTOM LAYERS OF CLOUDS (L,M,H)
!
!--------------------------------------------------------------------
!
cmy      USE MACHINE , ONLY : kind_phys,kind_rad
      USE PHYSCONS, ROCP => con_ROCP, grav => con_g, RD => con_RD
     &,             PI => con_PI
      USE COMCD1
      implicit none
!     include 'constant.h'
!
!     real (kind=kind_rad) EPS, EPSM1, GRV
!     PARAMETER (EPS=RD/RV, EPSM1=RD/RV-1.0, GRV=GRAV)
!
      integer idimt, idims, kdim,ncld
      integer NBIN,MCLD,IVVA,INVR,ISTRAT
! --- INPUT VARIABLES
!
      real (kind=kind_rad)  CV(IDIMT),        CVT(IDIMT),
     &                      CVB(IDIMT),       SLMSK(IDIMT),
     &                      PRSL(IDIMT,KDIM), PRSI(IDIMT,KDIM+1),
     &                      T(IDIMS,KDIM),    Q(IDIMS,KDIM),
     &                      CLW(IDIMT,KDIM),  RHRH(IDIMT,KDIM),
     &                      VVEL(IDIMT,KDIM), QST(IDIMT,KDIM),
     &                      XLATRD(IDIMT)
! --- OUTPUT VARIABLES
      real (kind=kind_rad) CLD(IDIMT,5),
     &                      CLDTOT(IDIMT,KDIM),  CLDCNV(IDIMT,KDIM)
      integer               MTOP(IDIMT,3), MBOT(IDIMT,3)
!TUNE
!...    RH-CLD RELATIONSHIPS FOR EACH POINT
      real (kind=kind_rad) RHCLD(IDIMT,NBIN,MCLD)
!TUNE
!
! --- PTOPC(K,L): TOP PRESURE OF EACH CLD DOMAIN (K=1-4 ARE SFC,L,M,H;
!       L=1,2 ARE LOW-LAT (<45 DEGREE) AND POLE REGIONS)
! ---  WORKSPACE ---
!
      integer KDIMP,LEVM1,LEVM2,KLOW,K
      integer KLEV,KC,NX,NHALF,KCVB,KCVT,KK,L,LLYR11,kstr,i
      integer kbase, kinver(IDIMT)
      logical BITX(IDIMT), BITY(IDIMT), BITM(IDIMT), BIT1, BIT2
     &,       inversn(IDIMT)
      real (kind=kind_rad) PRSLY(IDIMT,KDIM),
     &                     DTHDP(IDIMT,KDIM), THETA(IDIMT,KDIM),
     &                     DTDPM(IDIMT),      CL1  (IDIMT),
     &                     OMEG(IDIMT),       CL2  (IDIMT),
     &                     PTOP1(IDIMT,4)
      real (kind=kind_rad)  RHH,    RHM,    RHL,    FAC,   EXNR
     &,                     ES,     QS,     TMT0,   TMT15, AI, BI, QI
     &,                     DPTOP,  QINT,   AA,     BB,     RHCR,  CRH
     &,                     CFILTR, ONEMRH, VALUE,  TEM,    tem1
     &,                     CLWMIN, CLWM,   CR1,    CR2, CR3
     &,                     VVC1,   VVC2,   DVVCLD
     &,                     CRK,     XX
     &,                     clwt
      integer KCUT(IDIMT), KBT1 (IDIMT), KTH1 (IDIMT), KBT2 (IDIMT),
     &        KTH2(IDIMT), ITYP1(IDIMT), ITYP2(IDIMT), KSAVE(IDIMT),
     &        kdomn(idimt)
cc
cc--------------------------------------------------------------------
cc
      real(kind=kind_rad) cons_0                !constant
      real(kind=kind_rad) cons_1pdm10           !constant
      real(kind=kind_rad) cons_p0001            !constant
      real(kind=kind_rad) cons_p01              !constant
      real(kind=kind_rad) cons_p3               !constant
      real(kind=kind_rad) cons_p95              !constant
      real(kind=kind_rad) cons_1                !constant
      real(kind=kind_rad) cons_50               !constant
      integer ipnGlobal,its,mype
      logical :: DiagPrint = .false.
!     call PhysicsGetIpnItsMype(ipnGlobal,its,mype,DiagPrint)
cc
      cons_0          =         0.d0            !constant
      cons_1pdm10     =         1.d-10          !constant
      cons_p0001      =      .0001d0            !constant
      cons_p01        =        .01d0            !constant
      cons_p3         =         .3d0            !constant
      cons_p95        =        .95d0            !constant
      cons_1          =         1.d0            !constant
      cons_50         =        50.d0            !constant
cc
cc--------------------------------------------------------------------
cc
!bl
!===>    BEGIN HERE ................................................
!     LLYR = 1   !JFM llyr is set in CGLJMS 
!     if(DiagPrint) then
!       print"('JFMclds341',4i5,2L5,1p3e15.7)",its,KLOWB,KLOWT,LLYR
!     endif

      KDIMP = KDIM + 1
      LEVM1 = KDIM - 1
      LEVM2 = KDIM - 2
      RHH   = 0.95E0                ! CRITICAL VALUE FOR HI  CLD
      RHM   = 0.70E0                ! CRITICAL VALUE FOR MID CLD
      RHL   = 0.70E0                ! CRITICAL VALUE FOR LOW CLD
!
!...  FIND TOP PRESSURE FOR EACH CLOUD DOMAIN
      DO K=1,4
        DPTOP = PTOPC(K,2) - PTOPC(K,1)
        DO I=1,IDIMT
          FAC = MAX(cons_0, 4.0*ABS(XLATRD(I))/PI-1.0)     !constant
          PTOP1(I,K) = PTOPC(K,1) + DPTOP * FAC
        END DO
      END DO
 
! --- LOW CLOUD TOP SIGMA LEVEL, COMPUTED FOR EACH LAT CAUSE
!       DOMAIN DEFINITION CHANGES WITH LATITUDE...
      KLOW=KDIM
      DO K=KDIM,1,-1
        DO I=1,IDIMT
          IF (PRSI(I,K) .LT. PTOP1(I,2) * 1.0E-3) KLOW = MIN(KLOW,K)
        ENDDO
      ENDDO
! --- POTENTIAL TEMP AND LAYER RELATIVE HUMIDITY
!
      DO K=1,KDIM
        DO I=1,IDIMT
          CLDTOT(I,K) = 0.0
          CLDCNV(I,K) = 0.0
          PRSLY(I,K)  = PRSL(I,K) * 10.0
          EXNR        = (PRSLY(I,K)*0.001) ** (-ROCP)
          THETA(I,K)  = EXNR * T(I,K)
        ENDDO
      ENDDO
 
! --- POTENTIAL TEMP LAPSE RATE
      DO K=1,LEVM1
        DO I=1,IDIMT
          DTHDP(I,K) = (THETA(I,K+1) - THETA(I,K)) /
     &                 (PRSLY(I,K+1) - PRSLY(I,K))
        ENDDO
      ENDDO
! ------------------------------------------------------------------
!     FIND THE STRATOSPHERE CUT OFF LAYER FOR HIGH CLOUD. IT
!      IS ASSUMED TO BE ABOVE THE LAYER WITH DTHDP LESS THAN
!      -0.25 IN THE HIGH CLOUD DOMAIN (FROM LOOKING AT 1 CASE).
! ------------------------------------------------------------------
      DO I=1,IDIMT
        KCUT(I) = LEVM2
      END DO
      DO K=KLOW+1,LEVM2
        BIT1 = .FALSE.
        DO I=1,IDIMT
          IF (KCUT(I).EQ.LEVM2 .AND. PRSLY(I,K).LE.PTOP1(I,3) .AND.
     &        DTHDP(I,K).LT.-0.25E0) THEN
            KCUT(I) = K
          END IF
          BIT1    = BIT1 .OR. KCUT(I).EQ.LEVM2
        END DO
        IF (.NOT. BIT1) GO TO 85
      END DO
  85  CONTINUE
!
! --- GET CONVECTIVE CLOUD TOP AND BASE LEVEL, SET LOGICAL ARRAY BITX
!
      BIT1 = .FALSE.
      DO I=1,IDIMT
!       BITX(I) = CV(I).GT.0.0E0 .AND. CVT(I).GE.CVB(I)
!...   pressure decreases upward
        BITX(I) = CV(I).GT.0.0E0 .AND. CVT(I).LT.CVB(I)
        BIT1 = BIT1 .OR. BITX(I)
      END DO
 
      IF (BIT1 .and. ncld .eq. 0) THEN
!     IF (BIT1) THEN
        DO I=1,IDIMT
          KBT1(I) = 1
          KTH1(I) = 1
          IF (BITX(I)) THEN
!           KBT1(I) = NINT(CVB(I))
!           KTH1(I) = MIN(LEVM2, NINT(CVT(I)))
!....use layer pressure in mb, as converted to cb
            do k=2,kdim
              tem = prsly(i,k) * 0.1
              if (cvt(i) .le. tem) KTH1(I) = k - 1
              if (cvb(i) .le. tem) KBT1(I) = k - 1
            end do
          END IF
        END DO
 
! --- PUT CONVECTIVE CLOUD INTO 'CLDCNV', NO MERGE AT THIS POINT..
        DO K=2,LEVM2
          DO I=1,IDIMT
            IF (BITX(I) .AND. KBT1(I).LE.K .AND. KTH1(I).GE.K) THEN
              CLDCNV(I,K) = CV(I)
!             RHRH(I,K) = MAX(0.0E0,
!    &                    RHRH(I,K)-CLDCNV(I,K))/(1.0E0-CLDCNV(I,K))
            END IF
          END DO
        END DO
 
!  The following loop commented by Moorthi on 12/29/98
!
! --- IF MEAN CVT LAYER HIGHER THAN 400MB ADD ANVIL CIRRUS
!       DO I=1,IDIMT
!         IF (BITX(I) .AND. PRSLY(I,KTH1(I)).LE.CVTOP) THEN
!           KK = KTH1(I) + 1
!           KK = KTH1(I)
!           CLDCNV(I,KK) = MAX(0.0E0, MIN(1.0E0,
!    &                     2.0E0 * (CV(I) - 0.3E0) ))
!         END IF
!       END DO
!
      END IF
! ------------------------------------------------------------------
      IF (ISTRAT.LE.0) THEN
        IF (NCLD .GT. 0) THEN
           DO K=KLOWB,LEVM2
             DO I=1,IDIMT
               ONEMRH = MAX(cons_1pdm10,1.-RHRH(I,K))     !constant
               VALUE = MAX(MIN(1000.*CLW(I,K)/ONEMRH,cons_50),cons_0)     !constant
               CLDTOT(I,K) = MAX(RHRH(I,K)*(1.-EXP(-VALUE)),cons_0)     !constant
             ENDDO
           ENDDO
        ELSE
! ------------------------------------------------------------------
!       ....DEFAULT SCHEME .... PATTERNED AFTER SLINGO'S SCHEME
! ------------------------------------------------------------------
!     CALCULATE LARGE SCALE STRATIFORM CLOUD FROM RELATIVE HUMIDITY
!     AND PUT INTO ARRAY 'CLDTOT'
! ------------------------------------------------------------------
      XX = -grav * grav / (0.00035E0*RD)
      DO K=KLOWB,LEVM2
        DO I=1,IDIMT
          IF (PRSLY(I,K) .GE. PTOP1(I,2)) THEN
! --- LOW CLOUD DOMAIN
            RHCR = RHL
!           IF (NINT(SLMSK(I)).EQ.1)
!    &        RHCR = RHL - 0.10E0
          ELSE
! --- MID-HIGH CLOUD DOMAIN
            IF (PRSLY(I,K) .GE. PTOP1(I,3)) THEN
              CRH = RHM
              IF (NINT(SLMSK(I)) .EQ. 1) CRH = RHM - 0.10E0
            ELSE
              CRH = RHH
              IF (NINT(SLMSK(I)) .EQ. 1) CRH = RHH - 0.10E0
            END IF
            AA = XX*PRSLY(I,K)*DTHDP(I,K) / (T(I,K)*THETA(I,K))
            RHCR = 0.999E0 - (1.0E0 - CRH)
     &           * (1.0E0 - MIN(cons_1, MAX(cons_0, AA)) )     !constant
          END IF
          BB = MAX(cons_0, (RHRH(I,K)-RHCR)/(1.0E0-RHCR))     !constant
          CLDTOT(I,K) = MAX(CLDTOT(I,K), MIN(cons_1, BB**2))     !constant
        END DO
      END DO
 
! ------------------------------------------------------------------
!     SPECIAL TREATMENT ON LOW CLOUDS
! ------------------------------------------------------------------
      DO I=1,IDIMT
        BITX(I) = .FALSE.
        KBT1(I) = KLOWB-1
      END DO
 
      DO K=KLOWB-1,LLYR
      DO I=1,IDIMT
        IF (.NOT.BITX(I)) THEN
          BITX(I) = NINT(SLMSK(I)).EQ.0
     &        .AND. PRSLY(I,K).GE.PSTRT  .AND. DTHDP(I,K).LE.CLAPKC
     &        .AND. RHRH(I,K+1).LE.0.6E0 .AND. RHRH(I,K+2).LE.0.6E0
          KBT1(I) = K
        END IF
      END DO
      END DO
 
      IF (IVVA .LE. 0) GO TO 250
! --- VERTICAL VELOCITY ADJUSTMENT ON LOW CLOUDS
      VVC1 =  0.0000E0
      VVC2 = -0.0006E0                 ! mb/sec
      DVVCLD = VVC1 - VVC2
!     DVVCLD = VVCLD(1) - VVCLD(2)
      DO K=KLOWB,KLOW
        DO I=1,IDIMT
          IF (.NOT.BITX(I) .OR. K.GT.LLYR) THEN
            CR1 = MIN(cons_1, MAX(cons_0,     !constant
     &            (VVCLD(1) - 10.0E0*VVEL(I,K)) / DVVCLD ) )
            CLDTOT(I,K) = CLDTOT(I,K) * SQRT(CR1)
          END IF
        END DO
      END DO
 
 250  IF (INVR .LE. 0) GO TO 350
! --- T INVERSION RELATED STRATUS CLOUDS
      BIT1 = .FALSE.
      DO I=1,IDIMT
        BIT1 = BIT1 .OR. BITX(I)
      END DO
      IF (.NOT. BIT1) GO TO 350
 
! --- SMOOTH TRANSITION FOR CLOUD WHEN DTHDP BETWEEN
!     CLAPSE AND CLAPSE+DCLPS  (-0.05 AND -0.06)
 
      DO K=KLOWB,KLOW+2
      DO I=1,IDIMT
        IF (BITX(I)) THEN
          CFILTR = MAX(cons_p3,     !constant
     &             1.0E0 - ((CLPSE-DTHDP(I,KBT1(I))) / DCLPS) )
          CLDTOT(I,K) = MIN(cons_p95, CLDTOT(I,K) * CFILTR)     !constant
        END IF
      END DO
      END DO
 
!     DO K=KLOWB-1,KLOW+3
!       DO I=1,IDIMT
!         K1 = MAX(KLOWB-1,KBT1(I)-1)
!         K2 = MIN(KLOW+3, KBT1(I)+3)
!         IF (K.GE.K1 .AND. K.LE.K2 .AND. VVEL(I,K).GE.0.0000E0) THEN
!           AA = MIN(1.0E0, MAX(0.0E0,
!    &         1.0E0 - (RHL - RHRH(I,K-1)) / (RHL - 0.6E0) ))
!           BB = MIN(1.0E0, MAX(0.0E0,
!    &           (PRSLY(I,K)-PTOP1(I,2)) / (900.0E0-PTOP1(I,2)) ))
!           CST = AA * BB * CL2(I)
!           CLDTOT(I,K) = MAX(CLDTOT(I,K), CST)
!         END IF
!       END DO
!     END DO
 
 350  CONTINUE
      END IF                          !END  of NCLD if
! ------------------------------------------------------------------
      END IF                          !END DEFAULT SCHEME
! ------------------------------------------------------------------
      IF (ISTRAT.GT.0) THEN
         IF (NCLD .GT. 0) THEN        ! Liquid Water based Clouds!
            inversn = .false.
            kinver  = kdim
            DO K=2,KDIM
              DO I=1,IDIMT
                if (prsly(i,k) .gt. 600.0 .and. (.not. inversn(I))) then
                  tem = T(I,K+1) - T(I,K)
                  if (tem .gt. 0.1 .and. T(I,K) .GT. 278.0) then
                    inversn(I) = .true.
                    kinver(I)  = k
                  endif
                endif
              ENDDO
            ENDDO
            CLWMIN = 0.0E-6
            DO K=1,KDIM
!             clwt = 1.0e-6 * sl(k)
!             clwt = 2.0e-6 * sl(k)
              DO I=1,IDIMT
                clwt = 1.0e-6 * (prsly(I,k)*0.001)
!               if (clw(i,k) .gt. clwt) then
                if (clw(i,k) .gt. clwt .or.
     &             (inversn(I) .and. k .le. kinver(I)) ) then
                ONEMRH = MAX(cons_1pdm10, 1.-RHRH(I,K))     !constant
!
                TEM   = 1.0 / MAX(PRSLY(I,K)*0.001, cons_p01)     !constant
                CLWM  = CLWMIN * TEM
                TEM   = MIN(MAX(sqrt(sqrt(onemrh*qst(i,k))),cons_p0001),     !constant
     &                      cons_1)     !constant
!               TEM   = 2500.0 / TEM
                TEM   = 2000.0 / TEM
!               TEM   = 1000.0 / TEM
!               TEM   = 100.0 / TEM
!               if (inversn(I) .and. k .le. kinver(I)) tem = tem * 2.0
                if (inversn(I) .and. k .le. kinver(I)) tem = tem * 5.0
                VALUE = MAX(MIN(TEM*(CLW(I,K)-CLWM), cons_50),cons_0)     !constant
                TEM   = SQRT(SQRT(RHRH(I,K)))
                CLDTOT(I,K) = MAX(TEM*(1.0-EXP(-VALUE)), cons_0)     !constant
              endif
              ENDDO
            ENDDO
! ------------------------------------------------------------------
!     SEPARATE CLOUDS INTO 3 PRESSURE DOMAINS (L,M,H).
!bl    PLUS BL cloud amount only(5th location).   Within each
!     OF THE DOMAINS, ASSUME CLOUD LAYERS ARE RANDOMLY OVERLAPPED.
!     ...Random/Max til Autumn 2001
!     VERTICAL LOCATION OF EACH TYPE OF CLOUD IS DETERMINED BY
!     THE THICKEST CONTINUING CLOUD LAYERS IN THE DOMAIN.
!     Convective cloud no-longer used, remove it from diagnostic calc
! -------------------------------------------------------------------
!
! --- LOOP OVER 3 CLOUD DOMAINS (L,M,H)
!bl       grabbing bl cloud fraction during L=1
!..
      IF (ISTRAT.GT.0) THEN
copnl        KSTR = LLYR
        KSTR = LLYR+1
      ELSE
        KSTR = 2
      END IF
!
      DO L=1,3
!
!bl    for 1st pass extract the bl cloud..just take random cloud
!                                was MAX til Autumn 2001
        if (l.eq.1) then
          DO I=1,IDIMT
            CLD (I,5) = 0.0E0
          END DO
copnl          llyr11=llyr-1
copnl          DO k=2,llyr11
          DO k=1,llyr
          DO i=1,idimt
            cld(I,5) = cld(I,5)+ CLDTOT(I,k)-cld(I,5)*CLDTOT(I,k)
          END DO
          END DO
        end if
!
        DO I=1,IDIMT
          CLD (I,L) = 0.0E0
          MTOP(I,L) = 1
          MBOT(I,L) = 1
          CL1 (I) = 0.0E0
          CL2 (I) = 0.0E0
          KBT1(I) = 1
          KBT2(I) = 1
          KTH1(I) = 0
          KTH2(I) = 0
copnl          BITM(I) = CLDTOT(I,KSTR).GT.0.0E0 .OR.
copnl     &              CLDCNV(I,KSTR).GT.0.0E0
          BITM(I) = CLDTOT(I,KSTR).GT.0.0E0
        END DO
!
        DO 700 K=KSTR,KDIM
!
          BIT1 = .FALSE.
          DO I=1,IDIMT
! --- BITX LOGICAL ARRAY FOR LAYER K
            BITX(I) = (PRSLY(I,K).GE.PTOP1(I,L+1)) .AND.
     &                (PRSLY(I,K).LT.PTOP1(I,L))   .AND. BITM(I)
            BIT1 = BIT1 .OR. BITX(I)
! --- BITM LOGICAL ARRAY FOR LAYER K+1
copnl            BITM(I) = CLDTOT(I,K+1).GT.0.0E0 .OR.
copnl     &                CLDCNV(I,K+1).GT.0.0E0
            if (k .lt. kdim) BITM(I) = CLDTOT(I,K+1).GT.0.0E0
          END DO
 
          IF (.NOT. BIT1) GO TO 700
          DO I=1,IDIMT
copnl            CR1  = CLDTOT(I,K)
copnl            CR2  = CLDCNV(I,K)
            IF (BITX(I)) THEN
              IF(KTH2(I).LE.0) THEN
! --- KTH2 LE 0 : 1ST CLD LAYER.
                KBT2(I) = K
                KTH2(I) = 1
              ELSE
! --- KTH2 GT 0 : CONSECUTIVE CLD LAYER.
                KTH2(I) = KTH2(I) + 1
              ENDIF
! ---  PHYSICAL CLOUD AS SEEN BY RADIATION (random)
              CL2(I)=CL2(I) + CLDTOT(I,K)-CL2(I)*CLDTOT(I,K)
copnl              IF (CLDCNV(I,K).GT.0.0E0) THEN
copnl               CL2 (I) = MAX(CL2(I), CLDCNV(I,K))
copnl              ELSE
copnl               CL2 (I) = MAX(CL2(I), CLDTOT(I,K))
copnl              END IF
            ENDIF
          END DO
          BIT2 = .FALSE.
!....  BITY=TRUE IF NEXT LYR=CLEAR OR WE CHANGE CLOUD DOMAINS..
          if (k .ge. kdim) then
            do i=1,idimt
              bity(i) = .true.
              BIT2    = .true.
            enddo
          else
            DO 650 I=1,IDIMT
 
              BITY(I) = BITX(I) .AND. (.NOT. BITM(I)
     &                           .OR.  PRSLY(I,K+1).LT.PTOP1(I,L+1) )
              BIT2 = BIT2 .OR. BITY(I)
 650        CONTINUE
          endif
          IF (.NOT. BIT2) GO TO 700
! --- AT THE DOMAIN BOUNDARY, RANDOM OVERLAP.
!     CHOOSE THE THICKEST OR THE LARGEST FRACTION AMT AS THE CLD
!     LAYER IN THAT DOMAIN
          DO I=1,IDIMT
            IF (BITY(I)) THEN
              IF (CL1(I).GT.0.0E0) THEN
                KBT1(I) = INT( (CL1(I)*KBT1(I) + CL2(I)*KBT2(I))
     &                       / (CL1(I) + CL2(I)) )
                KTH1(I) = NINT( (CL1(I)*KTH1(I) + CL2(I)*KTH2(I))
     &                        / (CL1(I) + CL2(I)) ) + 1
                CL1 (I) = CL1(I) + CL2(I) - CL1(I)*CL2(I)
              ELSE
                KBT1(I) = KBT2(I)
                KTH1(I) = KTH2(I)
                CL1 (I) = CL2 (I)
              ENDIF
              KBT2(I) = 1
              KTH2(I) = 0
              CL2 (I) = 0.0E0
            ENDIF
          END DO
 
 700    CONTINUE
! --- FINISH ONE DOMAIN, SAVE EFFECTIVE CLOUDS
        DO I=1,IDIMT
          CLD(I,L) =  CL1(I)
          MTOP(I,L) = MAX(KBT1(I), KBT1(I)+KTH1(I)-1)
          MBOT(I,L) = KBT1(I)
        END DO
      END DO         ! end of domain loop (L=1,3)
! -------------------------------------------------------------------
!     CALCULATE TOTAL CLOUD FROM THE MULTI-LYR CLOUD ARRAY, IN A MANNER
!     AS SEEN BY THE RADIATION CODE...Random OVERLAP IS USED FOR all lyrs.
! -------------------------------------------------------------------
 
      DO I=1,IDIMT
        CLD(I,4) = 0.E0
      END DO
!
      DO K=1,KDIM
!
        DO I=1,IDIMT
          CR1 = CLDTOT(I,K)
          CLD(I,4) = CLD(I,4) + CR1-CLD(I,4)*CR1
        END DO
      END DO
!
      DO I=1,IDIMT
       DO K=1,5
        IF (CLD(I,K).GT.1.) CLD(I,K) = 1.
       END DO
      END DO
         ELSE                           !   Old Campana Clouds!
!
!TUNE
! ------------------------------------------------------------------
!     CALCULATE STRATIFORM CLOUD AND PUT INTO ARRAY 'CLDTOT' USING
!       THE CLOUD-REL.HUMIDITY RELATIONSHIP FROM TABLE LOOK-UP..WHERE
!       TABLES OBTAINED USING K.MITCHELL FREQUENCY DISTRIBUTION TUNING
!bl        (OBSERVATIONS ARE DAILY MEANS FROM US AF RTNEPH).....K.A.C.
!bl       TABLES CREATED WITHOUT LOWEST 10 PERCENT OF ATMOS.....K.A.C.
!      (observations are synoptic using -6,+3 window from rtneph)
!       tables are created with lowest 10-percent-of-atmos, and are
!            now used..  25 october 1995 ... kac.
! ------------------------------------------------------------------
!bl.... ... determine marine stratus regions ...NOT.....
      DO 831 I=1,IDIMT
       BITM(I) = .TRUE.
  831 CONTINUE
!  THIS LOOP TO RETRIEVE CLOUD FROM RH REWRITTEN 950113 -MI
!bl      DO KLEV=KLOWB,LEVM2
       do klev=2,levm2
        DO I=1,IDIMT
          kdomn(i)=0
          BITX(I)=.FALSE.
        ENDDO
!mcl3   DO KC=MCLD,1,-1
        if (klev.gt.llyr) then
         do kc=mcld,2,-1
          DO I=1,IDIMT
!mcl3      IF(PRSLY(I,KLEV).GE.PTOP1(I,KC+1)) KBASE(I)=KC
           if(prsly(i,klev).ge.ptop1(i,kc)) kdomn(i)=kc
          ENDDO
         ENDDO
!mcl4
        else
         do i=1,idimt
          if (bitm(i)) then
!...if true not a suspected marine stratus region, use BL curves
           kdomn(i)=1
          else
!...if a marine stratus region, reinstate old method (cause very
!        little marine stratus probably went into tuned curves,
!        since RTNEPH has trouble here)..so use L curves
!....THIS IS BY-PASSED SINCE BITM is set TRUE everywhere..kac
           kdomn(i)=2
          end if
         enddo
        endif
!mcl4
        NX=0
        NHALF=(NBIN+1)/2
        DO I=1,IDIMT
          IF(kdomn(I).LE.0.OR.KLEV.GT.KCUT(I)) THEN
            CLDTOT(I,KLEV)=0.
          ELSEIF(RHRH(I,KLEV).LE.RHCLD(I,1,kdomn(I))) THEN
            CLDTOT(I,KLEV)=0.
          ELSEIF(RHRH(I,KLEV).GE.RHCLD(I,NBIN,kdomn(I))) THEN
            CLDTOT(I,KLEV)=1.
          ELSE
            BITX(I)=.TRUE.
            KSAVE(I)=NHALF
            NX=NX+1
          ENDIF
        ENDDO
        DOWHILE(NX.GT.0)
          NHALF=(NHALF+1)/2
          DO I=1,IDIMT
            IF(BITX(I)) THEN
              CRK=RHRH(I,KLEV)
              CR1=RHCLD(I,KSAVE(I),kdomn(I))
              CR2=RHCLD(I,KSAVE(I)+1,kdomn(I))
              IF(CRK.LE.CR1) THEN
                KSAVE(I)=MAX(KSAVE(I)-NHALF,1)
              ELSEIF(CRK.GT.CR2) THEN
                KSAVE(I)=MIN(KSAVE(I)+NHALF,NBIN-1)
              ELSE
                CLDTOT(I,KLEV)=0.01*(KSAVE(I)+(CRK-CR1)/(CR2-CR1))
                BITX(I)=.FALSE.
                NX=NX-1
              ENDIF
            ENDIF
          ENDDO
        ENDDO
      ENDDO
! ------------------------------------------------------------------
!     SPECIAL TREATMENT ON LOW CLOUDS
! ------------------------------------------------------------------
      DVVCLD = VVCLD(1) - VVCLD(2)
!
      do 950 k=2,klow
!
        DO 904 I=1,IDIMT
          OMEG(I) = 10.0E0 * VVEL(I,K)
          CL1 (I) = 0.0E0
 904    CONTINUE
        IF (IVVA .LE. 0) GO TO 920
! --- VERTICAL VELOCITY ADJUSTMENT ON LOW CLOUDS
        BIT1 = .FALSE.
        DO 906 I=1,IDIMT
          BITX(I) = PRSLY(I,K).GE.PTOP1(I,2) .AND. CLDTOT(I,K).GT.0.0E0
          BIT1 = BIT1 .OR. BITX(I)
 906    CONTINUE
        IF (.NOT. BIT1) GO TO 920
        IF(K.GT.LLYR) THEN
          DO 910 I=1,IDIMT
            IF (BITX(I)) THEN
              IF(OMEG(I).GE.VVCLD(1)) THEN
                CLDTOT(I,K) = 0.0E0
              ELSE IF(OMEG(I).GT.VVCLD(2)) THEN
                CR1 = (VVCLD(1) - OMEG(I)) / DVVCLD
!               CLDTOT(I,K) = CLDTOT(I,K) * CR1
                CLDTOT(I,K) = CLDTOT(I,K) * SQRT(CR1)
              ENDIF
            ENDIF
 910      CONTINUE
        ENDIF
!blC --- T INVERSION RELATED STRATUS CLOUDS .. not used cause bitm=T
 920    IF (INVR .LT. 1) GO TO 950
        IF (K.GT.LLYR) GO TO 950
        BIT1 = .TRUE.
        DO 930 I=1,IDIMT
          BIT1 = BIT1 .AND. BITM(I)
 930    CONTINUE
        IF (BIT1) GO TO 950
        DO 940 I=1,IDIMT
         IF (.NOT.BITM(I)) THEN
!ERROR    IF (DTHDP(I,KBASE(I)).GT.CLPSE) THEN
          IF (DTHDP(I,kdomn(I)).GT.CLPSE) THEN
!---   SMOOTH TRANSITION FOR CLOUD WHEN DTHDP BETWEEN
!           CLAPSE AND CLAPSE+DCLPS  (-0.05 AND -0.06)
!ERROR     CFILTR = 1.0E0 - ((CLPSE - DTHDP(I,KBASE(I))) / DCLPS)
           CFILTR = 1.0E0 - ((CLPSE - DTHDP(I,kdomn(I))) / DCLPS)
           CLDTOT(I,K) = CLDTOT(I,K)*CFILTR
          END IF
! --- FOR T INVERSION TYPE CLOUD, ADD FLAG VALUE OF 2.0
!1098     CLDARY(I,K) = CLDARY(I,K)+2.0E0
         END IF
 940    CONTINUE
 950  CONTINUE
! ------------------------------------------------------------------
!     SEPARATE CLOUDS INTO 3 PRESSURE DOMAINS (L,M,H).
!bl    PLUS BL cloud amount only(5th location).   Within each
!     OF THE DOMAINS, ASSUME SEPARATED CLOUD LAYERS ARE RANDOMLY
!     OVERLAPPED AND ADJACENT CLOUD LAYERS ARE MAXIMUM OVERLAPPED.
!     VERTICAL LOCATION OF EACH TYPE OF CLOUD IS DETERMINED BY
!     THE THICKEST CONTINUING CLOUD LAYERS IN THE DOMAIN.
! -------------------------------------------------------------------
!
! --- LOOP OVER 3 CLOUD DOMAINS (L,M,H)
!bl       grabbing bl cloud fraction during L=1
!..
      IF (ISTRAT.GT.0) THEN
        KSTR = LLYR
      ELSE
        KSTR = 2
      END IF
!
      DO L=1,3
!
!bl    for 1st pass extract the bl cloud..just take max cloud
        if (l.eq.1) then
          DO I=1,IDIMT
            CLD (I,5) = 0.0E0
          END DO
          llyr11=llyr-1
          DO k=2,llyr11
          DO i=1,idimt
            CR1  = CLDTOT(I,K)
            CR2  = CLDCNV(I,K)
            cr3 = cr1
            if (cr2.gt.0.E0) cr3 = cr2
            cld(i,5) = max(cld(i,5) , cr3)
          END DO
          END DO
        end if
!
        DO I=1,IDIMT
          CLD (I,L) = 0.0E0
          MTOP(I,L) = 1
          MBOT(I,L) = 1
          CL1 (I) = 0.0E0
          CL2 (I) = 0.0E0
          KBT1(I) = 1
          KBT2(I) = 1
          KTH1(I) = 0
          KTH2(I) = 0
          BITM(I) = CLDTOT(I,KSTR).GT.0.0E0 .OR.
     &              CLDCNV(I,KSTR).GT.0.0E0
        END DO
!
        DO K=KSTR,LEVM2
!
          BIT1 = .FALSE.
          DO I=1,IDIMT
! --- BITX LOGICAL ARRAY FOR LAYER K
            BITX(I) = (PRSLY(I,K).GE.PTOP1(I,L+1)) .AND.
     &                (PRSLY(I,K).LT.PTOP1(I,L))   .AND. BITM(I)
            BIT1 = BIT1 .OR. BITX(I)
! --- BITM LOGICAL ARRAY FOR LAYER K+1
            BITM(I) = CLDTOT(I,K+1).GT.0.0E0 .OR.
     &                CLDCNV(I,K+1).GT.0.0E0
          END DO
 
          IF (.NOT. BIT1) GO TO 710
          DO I=1,IDIMT
            CR1  = CLDTOT(I,K)
            CR2  = CLDCNV(I,K)
            IF (BITX(I)) THEN
              IF(KTH2(I).LE.0) THEN
! --- KTH2 LE 0 : 1ST CLD LAYER.
                KBT2(I) = K
                KTH2(I) = 1
              ELSE
! --- KTH2 GT 0 : CONSECUTIVE CLD LAYER.
                KTH2(I) = KTH2(I) + 1
              ENDIF
! ---  PHYSICAL CLOUD AS SEEN BY RADIATION..CONV TAKES PRECEDENCE
! ---  EXCEPT ANVIL CIRRUS NOT RANDOM OVERLAPPED WITH CV TOWER AS
! ---  IN RADIATION CODE(SO HI MAY BE SLIGHT UNDERESTIMATE)....
              IF (CLDCNV(I,K).GT.0.0E0) THEN
               CL2 (I) = MAX(CL2(I), CLDCNV(I,K))
              ELSE
               CL2 (I) = MAX(CL2(I), CLDTOT(I,K))
              END IF
            ENDIF
          END DO
          BIT2 = .FALSE.
!....  BITY=TRUE IF NEXT LYR=CLEAR OR WE CHANGE CLOUD DOMAINS..
          DO 640 I=1,IDIMT
            BITY(I) = BITX(I) .AND. (.NOT. BITM(I)
     &                         .OR.  PRSLY(I,K+1).LT.PTOP1(I,L+1) )
            BIT2 = BIT2 .OR. BITY(I)
 640      CONTINUE
          IF (.NOT. BIT2) GO TO 710
 
! --- AT THE DOMAIN BOUNDARY OR SEPARATED CLD LYRS, RANDOM OVERLAP.
!     CHOOSE THE THICKEST OR THE LARGEST FRACTION AMT AS THE CLD
!     LAYER IN THAT DOMAIN
          DO I=1,IDIMT
            IF (BITY(I)) THEN
              IF (CL1(I).GT.0.0E0) THEN
                KBT1(I) = INT( (CL1(I)*KBT1(I) + CL2(I)*KBT2(I))
     &                       / (CL1(I) + CL2(I)) )
                KTH1(I) = NINT( (CL1(I)*KTH1(I) + CL2(I)*KTH2(I))
     &                        / (CL1(I) + CL2(I)) ) + 1
                CL1 (I) = CL1(I) + CL2(I) - CL1(I)*CL2(I)
              ELSE
                KBT1(I) = KBT2(I)
                KTH1(I) = KTH2(I)
                CL1 (I) = CL2 (I)
              ENDIF
              KBT2(I) = 1
              KTH2(I) = 0
              CL2 (I) = 0.0E0
            ENDIF
          END DO
 
 710    CONTINUE
        END DO                   ! end of k-loop
! --- FINISH ONE DOMAIN, SAVE EFFECTIVE CLOUDS
        DO I=1,IDIMT
          CLD(I,L) =  CL1(I)
          MTOP(I,L) = MAX(KBT1(I), KBT1(I)+KTH1(I)-1)
          MBOT(I,L) = KBT1(I)
        END DO
      END DO                      ! end of domain loop, L=1,3
! -------------------------------------------------------------------
!     CALCULATE TOTAL CLOUD FROM THE MULTI-LYR CLOUD ARRAY, IN A MANNER
!     AS SEEN BY THE RADIATION CODE. WHERE, MAX OVERLAP IS USED FOR
!     VERTICALLY ADJACENT CLOUD LAYERS (BOTH STRATIFORM AND CONVECTIVE).
!     FOR CONVECTION, ANY ANVIL IS CONSIDERED A SEPARATE RANDOMLY
!     OVERLAPPED CLOUD..
!
!     CL1, ITYP1 STORE PREVIOUS LAYER CLOUD AMOUNT AND TYPE,
!     CL2, ITYP2 STORE CURRENT LAYER CLOUD AMOUNT AND TYPE.
!     TYPE=0,1,2 FOR CLEAR LAYER, STRATIFORM AND CONVECTIVE CLOUD.
! -------------------------------------------------------------------
 
      DO I=1,IDIMT
        CLD(I,4) = 0.E0
        ITYP1(I) = 0
        CL1(I) = 0.0E0
      END DO
!
      DO K=1,KDIM
!
        DO I=1,IDIMT
          CL2(I) = 0.0E0
          ITYP2(I) = 0
          IF (CLDTOT(I,K) .GT. 0.0E0) THEN
            CL2(I) = CLDTOT(I,K)
            ITYP2(I) = 1
          END IF
          IF (CLDCNV(I,K) .GT. 0.0E0) THEN
            CL2(I) = CLDCNV(I,K)
            ITYP2(I) = 2
          END IF
        END DO
!
        DO I=1,IDIMT
          IF (ITYP1(I) .EQ. ITYP2(I)) THEN
            IF (ITYP1(I).EQ.2 .AND. CL1(I).NE.CL2(I)) THEN
! --- CNV ANVIL CLOUDS ARE TREATED AS SEPARATED AND RADOMLY
!     OVERLAP
              CLD(I,4) = CLD(I,4) + CL1(I) - CLD(I,4)*CL1(I)
              CL1(I) = CL2(I)
            ELSE IF (ITYP1(I).EQ.1) THEN
! --- MAX OVERLAP FOR NON CONVECTIVE ADJACENT CLD LAYERS
              CL1(I) = MAX(CL1(I), CL2(I))
            END IF
          ELSE
! --- DIFF TYPES CLOUD, RANDOM OVERLAP
            IF (CL1(I) .GT. 0.0E0)
     &        CLD(I,4) = CLD(I,4) + CL1(I) - CLD(I,4)*CL1(I)
            CL1(I) = CL2(I)
            ITYP1(I) = ITYP2(I)
          END IF
        END DO
      END DO
!
      DO I=1,IDIMT
        IF (CL1(I) .GT. 0.0E0) THEN
          CR1 = CLD(I,4)
          CLD(I,4) = CR1 + CL1(I) - CR1*CL1(I)
        END IF
      END DO
! ------------------------------------------------------------------
        END IF                         ! If for Liquid water or campana
      END IF                           ! ISTRAT GT 0
 
      RETURN
      END

      SUBROUTINE CLDPRP(IDIMT,PRSL,PRSI,T,Q 1,2
     &,                 CLDTOT,CLDCNV
     &,                 ICWP,CLWP,SLMSK,KTOP,KBTM,NCLDS
     &,                 CLDLW,TAUCL,CFAC,CLDSW,CWP,CIP,REW,REI,FICE
     &,                 tau_rrtm, L, LP1, IMAX,lprnt)
!FPP$ NOCONCUR R
!---------------------------------------------------------------------
!     FEB., 1993 - Y.H.
!        CLOUD RADIATIVE PROPERTIES CALCULATIONS AFTER DAVIS (1982)
!        AND HARSHVARDHAN ET AL. (1987).
!     NOV., 1995 - Y.H.
!        MODIFIED TO PROVIDE MIXED CLOUD OVERLAPPING SCHEME FOR
!        CHOU'S SW RADIATION SCHEME (1992)_.
!     AUG., 1998 - Y.H.
!        MODIFIED TO ESTIMATE EFFECTIVE RADIUS OF WATER/ICE CLOUD
!        DROP, FRACTION OF ICE WATER CONTENT, AND CLOUD EMISSIVITY
!        FOR LW RADIATION CALCULATION (KIEHL ET AL. 1998,J.CLIM).
!--------------------------------------------------------------------
!     INPUT VARIABLES:
!        PRSL(I,K)     - Layer Pressure                  K=1 IS TOA
!        PRSI(I,K)     - Interface PRESSURE (CB)         K=1 IS TOA
!        T (I,K)       - ABSOLUTE TEMPERATURE, K=1 IS TOP LAYER (K)
!        CLDTOT(I,K)   - STRATIFORM CLOUD      K=1 IS MDL SFC LAYER
!        CLDCNV(I,K)   - CONVECTIVE CLOUD      K=1 IS MDL SFC LAYER
! ---   MODIFY XLATRD TO GENERAL FOR REGIONAL AND GLOBAL (H.-M.H. JUANGK
! ***    XLATRD        - CURRENT LATITUDE IN RADIANS (1ST DATA PT)
!                         FOR MODELS WITH DIFF LAT AT EACH PT, NEED TO
!                         USE THE LAT OF EACH POINT....CAREFUL.....
!        ICWP          - FLAG INDICATES THE METHOD USED FOR CLOUD
!                        PROPERTIES, =0 USE T-P; =1 USE CLWP.
!        CLWP          - LAYER CLOUD WATER+ICE PATH (G/M**2), K=1 IS TOA
!        SLMSK         - LAND/SEA/ICE MASK (0:SEA.1:LAND,2:ICE)
!    OUTPUT VARIABLES:
! --- CLOUDS FOR LW RAD. K=1 IS THE SFC, K=2 IS THE
!      LOWEST CLOUD LAYER, AND SO ON
!        KTOP,KBTM(I,K)- CLOUD TOP AND BOTTOM INDECES, KTOP AND
!                        KBTM VALUES FROM 1 TO L MODEL LAYERS,
!                        WITH VALUE OF 1 BEING THE TOP MDL LAYER
!        NCLDS(I)      - NO. OF SEPARATED CLOUD LAYERS IN A COLUMN
!        CLDLW(I,K)    - CLOUD FRACTIONS FOR LW, EMISSIVITY ADJUSTED
!  ***   ITYP(I,K)     - TYPE OF CLOUDS, ITYP=1, AND 2 ARE FOR
!                        THE RH, AND CONV TYPES
! --- CLOUDS FOR SW RAD. K=1 IS THE TOP LAYER OR LEVEL
!        TAUCL(I,K)    - CLOUD OPTICAL DEPTH IN EVERY MODEL LAYER
!                        K=1 IS THE TOP LAYER (USED FOR ICWP=0 ONLY)
!        CFAC(I,K)     - FRACTION OF CLEAR SKY VIEW AT THE LAYER INTERFA
!        CLDSW(I,K)    - LAYER CLOUD FRACTIONS FOR SW
!  - - FOLLOWING ARE OUTPUT VARIABLES FOR ICWP=1
!        CWP           - LAYER CLOUD WATER PATH (G/M**2)
!        CIP           - LAYER CLOUD ICE PATH (G/M**2)
!        REW (I,K)     - EFFECTIVE LAYER CLOUD WATER DROP SIZE (MICRON)
!        REI (I,K)     - EFFECTIVE LAYER CLOUD ICE DROP SIZE (MICRON)
!        FICE(I,K)     - FRACTION OF CLOUD ICE CONTENT
!
!--------------------------------------------------------------------
!
!- INPUT ARRAY
      USE MACHINE , ONLY : kind_rad, kind_phys
      USE PHYSCONS, grav => con_g, RD => con_RD, fv => con_fvirt
      implicit none
!     include 'constant.h'
!
      integer idimt, imax, l, lp1, icwp
!
      real (kind=kind_rad) CLDTOT(IDIMT,L), CLDCNV(IDIMT,L)
     &,                    CLWP(IDIMT,L),   PRSL(IMAX,L)
     &,                    SLMSK(IDIMT),    PRSI(IMAX,LP1)
     &,                    T (IMAX,LP1),    Q(IMAX,L)
 
! - OUTPUT ARRAY
      real (kind=kind_rad) TAUCL(IMAX,L),   CLDLW(IMAX,LP1)
     &,                    CLDSW(IMAX,L),   CFAC(IMAX,LP1)
     &,                    REW (IMAX,L),    REI (IMAX,L)
     &,                    FICE(IMAX,L),    CWP (IMAX,L)
     &,                    CIP (IMAX,L)
      integer              KTOP(IMAX,LP1),  KBTM(IMAX,LP1)
     &,                    ITYP(IMAX,LP1),  NCLDS(IMAX)
! ---  WORKSPACE ---
      real (kind=kind_rad) XAMT(IMAX), TAUC(IMAX), EMIS(IMAX)
     &,                     CL1 (IMAX), CL2 (IMAX), ALFA (IMAX)
      integer               MTYP(IMAX), KCLD(IMAX), MBTM (IMAX)
      logical               BITX(IMAX), BITY(IMAX), BITW(IMAX)
     &                   ,  BIT1,   BIT2
      real (kind=kind_rad) DELT, WGT, DELP, TCLD, TAU0, AWLW, AILW
      real (kind=kind_rad) reimax, reimin, tem, icec
      real (kind=kind_rad) tau_rrtm(IMAX,L)
      integer i,k,kkcl,mclds,nc,minktp,maxkbt,mkbtp1,kk,nncld
     &,       ipts1
      logical lprnt
cc
cc--------------------------------------------------------------------
cc
      real(kind=kind_rad) cons_0                !constant
      real(kind=kind_rad) cons_p1dm3            !constant
      real(kind=kind_rad) cons_p08              !constant
      real(kind=kind_rad) cons_1                !constant
      integer ipnGlobal,its,mype
      logical :: DiagPrint = .false.
!     call PhysicsGetIpnItsMype(ipnGlobal,its,mype,DiagPrint)
cc
      cons_0          =         0.d0            !constant
      cons_p1dm3      =         .1d-3           !constant
      cons_p08        =        .08d0            !constant
      cons_1          =         1.d0            !constant
cc
cc--------------------------------------------------------------------
cc
 
!===>    BEGIN HERE ................................................
      DO I=1,IMAX
        KCLD(I)    = 2
        MBTM(I)    = 1
        XAMT(I)    = 0.0E0
        ITYP(I,1)  = 0
        KTOP(I,1)  = LP1
        KBTM(I,1)  = LP1
        CLDLW(I,1) = 1.0E0
        CFAC(I,1)  = 1.0E0
      END DO
 
      DO K=2,LP1
        DO I=1,IMAX
          ITYP(I,K)  = 0
          KTOP(I,K)  = 1
          KBTM(I,K)  = 1
          CLDLW(I,K) = 0.0E0
          CFAC(I,K)  = 1.0E0
        END DO
      END DO
 
      DO K=1,L
        DO I=1,IMAX
          CLDSW(I,K)   = 0.0E0
          TAUCL(I,K)   = 0.0E0
          CWP (I,K)    = 0.0E0
          CIP (I,K)    = 0.0E0
          REW (I,K)    = 10.0E0
          REI (I,K)    = 10.0E0
          FICE(I,K)    = 0.0E0
          tau_rrtm(I,K)= 0.0E0
        END DO
      END DO
 
!0499 IF (ICWP .EQ. 1) THEN ! 0898 - USE CLOUD WATER/ICE CONTENT
!       reimax = 80.0
!       reimin = 15.0
!       reimax = 100.0
!       reimin = 50.0
        reimax = 0.0 ! JFM reimax was undefined
        reimin = 0.0 ! JFM reimin was undefined
        tem    = (reimax-reimin)/(60.0-20.0)
        DO K=1,L
          DO I=1,IMAX
!           DELT = 263.16 - T(I,K)
            DELT = 273.16 - T(I,K)
            IF (NINT(SLMSK(I)) .EQ. 1) THEN
              REW(I,K) = 5.0E0 + 5.0E0*MIN(cons_1, MAX(cons_0,     !constant
     &                   DELT*0.05E0 )) ! - EFFECTIVE RADIUS FOR WATER
            END IF
!           REI(I,K) = 60.75 + (2.47 - (0.11 - 0.001 * DELT) * DELT)
!    &                                                       * DELT
!           REI(I,K) = reimin + (60.0 - DELT) * TEM
!           REI(I,K) = MAX(reimin, MIN(reimax,REI(I,K)))
!           WGT = MIN(1.0E0, MAX(0.0E0,
!    &           (SIGL(LP1-K) - 0.1E0) / 0.7E0 ))
!    &           (SIGL(LP1-K) - 0.3E0) / 0.5E0 ))
!    &           (SIGL(LP1-K) - 0.4E0) / 0.4E0 ))
!           REI(I,K) = 30.0 - 20.0*WGT  ! - EFFECTIVE RADIUS FOR ICE
!           REI(I,K) = 50.0 - 40.0*WGT  ! - EFFECTIVE RADIUS FOR ICE !02/16/2000
!           REI(I,K) = 90.0 - 70.0*WGT  ! - EFFECTIVE RADIUS FOR ICE
            FICE(I,K) = MIN(cons_1, MAX(cons_0, DELT/20.0E0 ))     !constant
                                        ! - FRACTION OF ICE IN CLOUD
            CIP (I,K) = CLWP(I,K) * FICE(I,K)
            CWP (I,K) = CLWP(I,K) - CIP(I,K)
          ENDDO
        ENDDO
!       if (lprnt) then
!         print *,' clwp=',clwp
!         print *,' cwp1=',cwp
!         print *,' cip1=',cip
!       endif
!
        DO K=1,L
          DO I=1,IMAX
            tem = (grav*prsl(i,k))/ (RD*(prsi(i,k+1)-prsi(i,k)))
            DELT = T(I,K) - 273.16
            if (cip(i,k) .gt. 0.0) then
              icec = tem * cip(i,k) / (T(i,k)*(1.0 + fv*q(i,k)))
              if (DELT .lt. -50.0) then
                rei(i,k) = (1250.0/9.917) * icec ** 0.109
              elseif (DELT .lt. -40.0) then
                rei(i,k) = (1250.0/9.337) * icec ** 0.08
              elseif (DELT .lt. -30.0) then
                rei(i,k) = (1250.0/9.208) * icec ** 0.055
              else
                rei(i,k) = (1250.0/9.387) * icec ** 0.031
              endif
!     if(lprnt .and. k .eq. l) print *,' reiL=',rei(i,k),' icec=',icec
!    *,' cip=',cip(i,k),' tem=',tem,' delt=',delt
!             rei(i,k)   = max(10.0, min(rei(i,k), 300.0))
            endif
          ENDDO
        ENDDO
!     if(lprnt) print *,' rei1=',rei
!
!0499 END IF
!
! --- LOOP OVER MDL LAYERS (BOTTOM UP)
!
!     DO K=2,L
      DO K=1,L
!
        DO I=1,IMAX
          CL1(I)  = CLDTOT(I,K)
          CL2(I)  = CLDCNV(I,K)
        END DO
!      if(DiagPrint.and.its>14.and.kcld(1)==19) then
!        print"('JFMclds1316',3i5,1p3e15.7)",its,k,imax,cl2(1)
!      endif
!
        BIT1 = .FALSE.
        DO I=1,IMAX
          BITX(I) = CL1(I).GT.0.001E0 .OR. CL2(I).GT.0.001E0
          BIT1    = BIT1 .OR. BITX(I)
        END DO
        IF (BIT1) THEN
          DO I=1,IMAX
! --- MTYP=1,2 FOR RH+STRATUS, AND CONV CLOUD TYPES
            IF (CL2(I) .GT. 0.001E0) THEN
              MTYP(I) = 2
            ELSE IF (CL1(I) .GT. 0.001E0) THEN
              MTYP(I) = 1
            ELSE
              MTYP(I) = 0
            END IF
          END DO
!
          IF (K .LT. L) THEN
            DO I=1,IMAX
! --- SET BITW FOR CLEAR GAP ABOVE CLOUD
!             BITW(I) = BITX(I) .AND. CLDTOT(I,K+1).LE.0.001E0
!    &                          .AND. CLDCNV(I,K+1).LE.0.001E0
              BITW(I) = .TRUE.
            END DO
          END IF
          BIT2 = .FALSE.
          DO I=1,IMAX
            BIT2 = BIT2 .OR. BITW(I)
            IF (BITX(I)) THEN
              KKCL = KCLD(I)
              IF(ITYP(I,KKCL) .EQ. 0) THEN
                ITYP(I,KKCL) = MTYP(I)
                XAMT(I) = CL1(I)
                IF (MTYP(I) .EQ. 2) XAMT(I) = CL2(I)
                MBTM(I) = K
              ELSE IF(ITYP(I,KKCL).NE.MTYP(I) .OR.
     &               (MTYP(I).EQ.2 .AND. XAMT(I).NE.CL2(I)) ) THEN
                CLDLW(I,KKCL)  = XAMT(I)
                KTOP(I,KKCL)   = LP1 - (K - 1)
                KBTM(I,KKCL)   = LP1 - MBTM(I)
                ITYP(I,KKCL+1) = MTYP(I)
                MBTM(I)        = K
                XAMT(I)        = CL1(I)
                IF (MTYP(I).EQ.2) XAMT(I) = CL2(I)
                KCLD(I) = KKCL + 1
              ELSE IF(MTYP(I).EQ.1) THEN
                XAMT(I) = MAX(XAMT(I), CL1(I))
              ENDIF
            END IF
          END DO
          IF (BIT2) THEN
            DO I=1,IMAX
              IF (BITW(I)) THEN
                KKCL = KCLD(I)
                CLDLW(I,KKCL) = XAMT(I)
                KTOP(I,KKCL)  = LP1 - K
                KBTM(I,KKCL)  = LP1 - MBTM(I)
                KCLD(I)       = KKCL + 1
                MTYP(I)       = 0
                MBTM(I)       = 1
                XAMT(I)       = 0.0E0
              END IF
            END DO
          ENDIF                             ! BIT2 ENDIF
        ENDIF                               ! BIT1 ENDIF
      ENDDO                                 ! The K Loop ends here!
 
! --- RECORD NUM OF CLD LYRS AND FIND MAX NUM OF CLD LYRS
      MCLDS = 0
      DO I=1,IMAX
        NCLDS(I) = KCLD(I) - 2
        MCLDS    = MAX(MCLDS, NCLDS(I))
      END DO
 
!     WRITE(6,221) MCLDS, IBEG
!221  FORMAT(' IN CLDPRP: MAXCLDS =',I4,' IBEG=',I4)
!     IF (MCLDS .EQ. 0) RETURN
!
! --- ESTIMATE CLOUD OPTICAL PROPERTIES FROM T AND Q  -- (TOP DOWN)
!
      DO NNCLD=1,MCLDS
        NC = MCLDS - NNCLD + 2
!
        DO I=1,IMAX
          BITX(I) = CLDLW(I,NC) .GE. 0.001E0
!         BITY(I) = BITX(I) .AND. ITYP(I,NC).EQ.2
          BITW(I) = BITX(I)
        END DO
 
! --- FIND TOP PRESSURE FOR MID CLOUD (3) DOMAIN=FUNCTION OF LATITUDE
        MINKTP=LP1
        MAXKBT=1
        DO I=1,IMAX
          IF (BITX(I)) THEN
            MINKTP = MIN(MINKTP,KTOP(I,NC))
            MAXKBT = MAX(MAXKBT,KBTM(I,NC))
          END IF
        END DO
!       write(6,241) NC,MINKTP, MAXKBT
!241    format(3x,'NC, MINKTP, MAXKBT =',3I6/3X,'BITX, BITW :')
 
! --- FIND CLEAR SKY VIEW AT EACH LEVELS
 
        DO KK=MINKTP,MAXKBT
          DO I=1,IMAX
            IF (KK.GE.KTOP(I,NC) .AND.
     &          KK.LE.KBTM(I,NC) .AND. BITX(I)) THEN
              CLDSW(I,KK) = CLDLW(I,NC)
              IF (BITW(I)) THEN
                CFAC(I,KK+1) = CFAC(I,KK) * (1.0E0 - CLDSW(I,KK))
                BITW(I) = .FALSE.
              ELSE
                CFAC(I,KK+1) = CFAC(I,KK)
              END IF
            ELSEIF (KK.GT.KBTM(I,NC) .AND. BITX(I)) THEN
              CFAC(I,KK+1) = CFAC(I,KK)
            END IF
          END DO
        END DO
!
        MKBTP1 = MAXKBT + 1
        DO K=MKBTP1,L
          DO I=1,IMAX
            IF (BITX(I)) CFAC(I,K+1) = CFAC(I,MKBTP1)
          END DO
        END DO
!
        DO I=1,IMAX
          TAUC(I) = 0.0E0
        END DO
 
        IF (ICWP .NE. 1) THEN
 
!CONV - REDUCE CONV CLOUD AMOUNT FOR SW RAD
          DO I=1,IMAX
            IF (ITYP(I,NC) .EQ. 2) THEN
!0799         ALFA(I) = CLDLW(I,NC)
              ALFA(I) =
     &            MAX(0.25E0, 1.0E0-0.125E0*(KBTM(I,NC)-KTOP(I,NC)))
            ELSE
!             ALFA(I) = SQRT(CLDLW(I,NC))
              ALFA(I) = 1.0
            END IF
          END DO
!
! --- CALC CLD THICKNESS DELP AND MEAN TEMP (CELSIUS)
          DO KK=MINKTP,MAXKBT
            DO I=1,IMAX
              IF (KK.GE.KTOP(I,NC) .AND.
     &            KK.LE.KBTM(I,NC) .AND. BITX(I)) THEN
                DELP = 10.0 * (PRSI(I,KK+1) - PRSI(I,KK))
                TCLD = T(I,KK) - 273.16E0
! --- CONVECTIVE CLOUD
                IF (ITYP(I,NC) .EQ. 2) THEN
!                 TAU0 = DELP * 0.05E0    ! Yu Tai's new value
                  TAU0 = DELP * 0.06E0    ! Operational value
!0499 - IF CONV CLD, SET TO WATER CLOUD ONLY
                  FICE(I,KK) = 0.0E0
! --- RH CLOUDS
                ELSE
                  IF (TCLD .LE. -10.0E0) THEN
                    TAU0 = DELP
     &                   * MAX(cons_p1dm3, 2.00E-6*(TCLD+82.5E0)**2)     !constant
                  ELSE
                    TAU0 = DELP
     &                   * MIN(cons_p08, 6.949E-3*TCLD+0.08E0)     !constant
                  END IF
                END IF
                TAUC(I)        = TAUC(I) + TAU0
                TAUCL(I,KK)    = TAU0 * ALFA(I)
                tau_rrtm(i,kk) = tau0
              END IF
            END DO
          END DO
 
! --- CALC CLD EMIS AND EFFECTIVE CLOUD COVER FOR LW
           DO I=1,IMAX
            IF (BITX(I))
     &        CLDLW(I,NC) = CLDLW(I,NC)*(1.0E0-EXP(-0.75E0*TAUC(I)))
          ENDDO
!
        ELSE                         ! prognostic liquid water
!
! --- CALC TAUC AND EMIS
          DO KK=MINKTP,MAXKBT
            DO I=1,IMAX
              IF (KK .GE. KTOP(I,NC) .AND.
     &            KK .LE. KBTM(I,NC) .AND. BITX(I)) THEN
!               AWLW    = 0.070000E0 * CWP(I,KK)
                AWLW    = 0.078000E0 * CWP(I,KK)
!               AWLW    = 0.090361E0 * CWP(I,KK)
!               AILW    = (0.005E0 + 1.0E0/REI(I,KK)) * CIP(I,KK)
                AILW    = (0.0029E0 + 1.0E0/REI(I,KK)) * CIP(I,KK)
                TAUC(I) = TAUC(I) + AWLW + AILW
                tau_rrtm(i,kk) = awlw + ailw
              ENDIF
            END DO
          END DO
          DO I=1,IMAX
            IF (BITX(I))
     &        CLDLW(I,NC) = CLDLW(I,NC) * max(cons_0,MIN(cons_1,     !constant
     &                      1.0E0 - EXP(-1.66E0*TAUC(I)) ) )
 
          ENDDO
        END IF
!
      END DO               ! End of NNCLD loop!
!
!     if(lprnt) print *,' cip2=',cip
!     if(lprnt) print *,' cldsw=',cldsw
      IF (ICWP .EQ. 1) THEN
        DO K=1,L
        DO I=1,IMAX
          IF (CLDSW(I,K) .LT. 0.001E0) THEN
            TAUCL(I,K) = 0.0E0
            CLDSW(I,K) = 0.0E0
            CWP  (I,K) = 0.0E0
            CIP  (I,K) = 0.0E0
          END IF
        END DO
        END DO
      END IF
!     if(lprnt) print *,' cip3=',cip
!
!      write(6,572)
!572   format(/3x,'=== CLOUD LIQUID/ICE FRACTION ===')
!      do k=3,L,2
!        write(6,574) k
!574     format(5x,'K =',i4,3x,'I=1,64,12')
!        write(6,576) (fice(i,k),i=1,64,12)
!576     format(10f10.6)
!      enddo
!     WRITE(6,581) IBEG
!581  FORMAT(' IN CLDPRP: PRINT LW CLOUDS, IBEG=',I5)
!     DO 586 K=2,MCLDS+1
!       WRITE(6,582) K
!582    FORMAT(' FROM SFC AND UP, CLD NUM =',I5,' CLDLW,EMIS,TOP,BOT')
!       WRITE(6,583) (CLDLW(I,K),EMIS(I,K),KTOP(I,K),
!    1                KBTM(I,K),I=1,IMAX)
!583    FORMAT(6(2F6.3,2I4))
!586  CONTINUE
!
!     WRITE(6,591)
!591  FORMAT(' IN CLDPRP: PRINT SW CLOUDS')
!     DO 596 K=KSTRT,L
!       WRITE(6,592) K
!592    FORMAT(' FROM TOP AND DN, LEV NUM =',I5,' CLDSW,CFAC,TAU')
!       WRITE(6,593) (CLDSW(I,K),CFAC(I,K+1),TAUCL(I,K),I=1,IMAX)
!593    FORMAT(6(3F6.3,2X))
!596  CONTINUE
!
      RETURN
      END

      SUBROUTINE ALBAER(SLMSK,SNOWF,ZORLF,COSZF,TSEAF,HPRIF,TGDF, 1,1
     &                  ALVSF,ALNSF,ALVWF,ALNWF,FACSF,FACWF,PI,DLTG,
     &                  KPRFG,IDXCG,CMIXG,DENNG,XLAT,XLON,
     &                  FICE,                           ! FOR SEA-ICE - XW Nov04
     &                  ALVBR,ALNBR,ALVDR,ALNDR,KAER,KPRF,IDXC,
     &                  CMIX,DENN,NXC,NDN,IMXAE,JMXAE,LEN,T0C)
!FPP$ NOCONCUR R
!*******************************************************************
!   THIS PROGRAM COMPUTES FOUR COMPONENTS OF SURFACE ALBEDOS (I.E.
!     VIS-NIR, DIRECT-DIFFUSED), from vis/nir strong/weak zenith angle
!          dependency, BASED ON BRIEGLEB'S SCHEME. AND
!     BILINEARLY INTERPOLATES ALBEDO AND AEROSOL DISTRIBUTION TO
!     RADIATION GRID....SEASONAL INTERPOLATION DONE IN CYCLE..HLP FEB98
!
!   INPUT VARIABLES:
!     SLMSK   - SEA(0),LAND(1),ICE(2) MASK ON FCST MODEL GRID
!     SNOWF   - SNOW DEPTH WATER EQUIVALENT IN MM
!     ZORLF   - SURFACE ROUGHNESS IN CM
!     COSZF   - COSIN OF SOLAR ZENITH ANGLE
!     TSEAF   - SEA SURFACE TEMPERATURE IN K
!     HPRIF   - TOPOGRAPHIC SDV IN M
!     TGDF    - GROUND SOIL TEMPERATURE IN K
!     ALVSF   - MEAN VIS ALBEDO WITH STRONG COSZ DEPENDENCY
!     ALNSF   - MEAN NIR ALBEDO WITH STRONG COSZ DEPENDENCY
!     ALVWF   - MEAN VIS ALBEDO WITH WEAK COSZ DEPENDENCY
!     ALNWF   - MEAN NIR ALBEDO WITH WEAK COSZ DEPENDENCY
!     FACSF   - FRACTIONAL COVERAGE WITH STRONG COSZ DEPENDENCY
!     FACWF   - FRACTIONAL COVERAGE WITH WEAK COSZ DEPENDENCY
!     KPRFG, IDXCG, CMIXG, DENNG
!             - GLOBAL DIST OF TROPOSPHERIC AEROSOLS DATA:
!               PROFILE TYPE, COMPONENT INDEX, COMPONENT MIXING RATIO,
!               AND NUMBER DENSITY (FOR FIRST AND SECOND LAYERS)
!     XLON, XLAT
!             - LONGITUDE AND LATITUDE OF GIVEN POINTS IN RADIANCE
!
!   OUTPUT VARIABLES:   (ALL ON RADIATION GRID)
!     ALVBR   - VIS BEAM SURFACE ALBEDO
!     ALNBR   - NIR BEAM SURFACE ALBEDO
!     ALVDR   - VIS DIFF SURFACE ALBEDO
!     ALNDR   - NIR DIFF SURFACE ALBEDO
!     KPRF, IDXC, CMIX, DENN
!             - AEROSOL DATA FOR THE SELECTED GRID POINTS
!
!   Nov. 97  - MODIFIED SNOW ALBEDO (USE HPRIF, JSNO)  - YH
!   JAN 98   - TO INCLUDE GRUMBINE'S SEAICE SCHEME
!              AND USE SLMSKR TO SETUP TWO BASIC
!              TYPES OF AEROSOLS (CONT-I, MAR-I)       - YH
!   MAR 00   - MODIFIED TO USE OPAC AEROSOL DATA(1998) - YH
!
!******************************************************************
! --- INPUT
!
      USE MACHINE , ONLY : kind_rad
      implicit none
!
      integer len, imxae, jmxae, nxc, ndn, kaer
! --- INPUT
      real (kind=kind_rad) SLMSK(LEN), SNOWF(LEN), ZORLF(LEN)
     &,                     TSEAF(LEN), COSZF(LEN), HPRIF(LEN)
     &,                     ALVSF(LEN), ALNSF(LEN), ALVWF(LEN)
     &,                     ALNWF(LEN), FACSF(LEN), FACWF(LEN)
     &,                     TGDF(LEN),  PI,         DLTG
     &,                     CMIXG(NXC,IMXAE,JMXAE), XLON(LEN)
     &,                     DENNG(NDN,IMXAE,JMXAE), XLAT(LEN)
!c-- XW: FOR SEA-ICE Nov04
      real (kind=kind_rad) FICE(LEN)
!c-- XW: END SEA-ICE
!
      integer IDXCG(NXC,IMXAE,JMXAE),KPRFG(IMXAE,JMXAE)
! --- OUTPUT
      real (kind=kind_rad) ALVBR(LEN), ALNBR(LEN), ALVDR(LEN)
     &,                     ALNDR(LEN), CMIX(NXC,LEN), DENN(NDN,LEN)
     &,                     TEMP1,      TEMP2
      integer               IDXC(NXC,LEN), KPRF(LEN)
! ---  Local VARIABLES
!c-- XW: FOR SEA-ICE Nov04
      real (kind=kind_rad) FFW, TICE, TFW
      SAVE TFW
      DATA TFW / 271.2 /
!c-- XW: END SEA-ICE
      real (kind=kind_rad) ASNVB, ASNNB, ASNVD, ASNND, ASEVB
     &,                     ASENB, ASEVD, ASEND, FSNO,  FSEA
     &,                     RFCS,  RFCW,  FLND
!
     &,                     ASNOW, ARGH,  HRGH,  FSNO0, FSNO1
     &,                     FLND0, FSEA0, DTSQ,  DTGD,  CSNOW
     &,                     A1, A2, B1, B2, T0C
     &,                     tmp1, tmp2, hdlt, rdg
      integer i,i1, i2, j1, j2, j3, k
cc
cc--------------------------------------------------------------------
cc
      real(kind=kind_rad) cons_0                !constant
      real(kind=kind_rad) cons_p025             !constant
      real(kind=kind_rad) cons_p2               !constant
      real(kind=kind_rad) cons_p5               !constant
      real(kind=kind_rad) cons_p98              !constant
      real(kind=kind_rad) cons_1                !constant
      real(kind=kind_rad) cons_5                !constant
cc
      cons_0          =         0.d0            !constant
      cons_p025       =       .025d0            !constant
      cons_p2         =         .2d0            !constant
      cons_p5         =         .5d0            !constant
      cons_p98        =        .98d0            !constant
      cons_1          =         1.d0            !constant
      cons_5          =         5.d0            !constant
cc
cc--------------------------------------------------------------------
cc
      DO I=1,LEN
!
! --- MODIFIED SNOW ALBEDO SCHEME - UNITS CONVERT TO M
!     (ORIGINALLY SNOWF IN MM; ZORLF IN CM)
         ASNOW = 0.02*SNOWF(I)
         ARGH  = MIN(cons_p5, MAX(cons_p025, 0.01*ZORLF(I)))     !constant
         HRGH  = MIN(cons_1, MAX(cons_p2, 1.0577-1.1538E-3*HPRIF(I) ) )     !constant
         FSNO0 = ASNOW / (ARGH + ASNOW) * HRGH
         IF (SLMSK(I).EQ.0.0 .AND. TSEAF(I).GT.271.2) FSNO0 = 0.0
         FSNO1 = 1.0 - FSNO0
         FLND0 = MIN(cons_1, FACSF(I)+FACWF(I))     !constant
         FSEA0 = MAX(cons_0, 1.0 - FLND0)     !constant
         FSNO  = FSNO0
         FSEA  = FSEA0 * FSNO1
         FLND  = FLND0 * FSNO1
! --- DIFFUSED SEA SURFACE ALBEDO
         IF (TSEAF(I) .GE. 271.5) THEN
            ASEVD = 0.06
            ASEND = 0.06
         ELSE IF (TSEAF(I) .LT. 271.1) THEN
            ASEVD = 0.70
            ASEND = 0.65
         ELSE
            DTSQ = (TSEAF(I) - 271.1)**2
            ASEVD = 0.7 - 4.0*DTSQ
            ASEND = 0.65 - 3.6875*DTSQ
         END IF
! --- DIFFUSED SNOW ALBEDO
!c-- XW: FOR SEA-ICE Nov04
!        IF (SLMSK(I) .EQ. 2.0) THEN
!!   (Bob Grumbine's method for snow covered sea ice)
!           DTGD  = MAX(0.0, MIN(5.0, 273.16-TGDF(I)) )
!           ASNVD = 0.70 + 0.03 * DTGD
!           ASNND = 0.60 + 0.03 * DTGD
!           ASEVD = 0.70
!           ASEND = 0.65
         IF (SLMSK(I) .GE. 2.0) THEN
            FFW   = 1.0 - FICE(I)
            IF (FFW .LT. 1.0) THEN
               TICE  = (TSEAF(I)-FFW*TFW)/FICE(I)
!mr            DTGD  = MAX(   0.0, MIN(   5.0, 273.16-TICE) )
               DTGD  = MAX(cons_0, MIN(cons_5, 273.16-TICE) )     !constant
         ELSE
               DTGD  = 0.0
            ENDIF
            ASNVD = (0.70 + 0.03*DTGD)*FICE(I) + 0.06*FFW
            ASNND = (0.60 + 0.03*DTGD)*FICE(I) + 0.06*FFW
            ASEVD = 0.70*FICE(I) + 0.06*FFW
            ASEND = 0.65*FICE(I) + 0.06*FFW
!c-- XW: END SEA-ICE
         ELSE
            ASNVD = 0.90
            ASNND = 0.75
         END IF
!
! --- DIRECT SNOW ALBEDO
         IF (COSZF(I) .LT. 0.5) THEN
            CSNOW = 0.5 * (3.0 / (1.0+4.0*COSZF(I)) - 1.0)
            ASNVB = MIN( cons_p98, ASNVD+(1.0-ASNVD)*CSNOW )     !constant
            ASNNB = MIN( cons_p98, ASNND+(1.0-ASNND)*CSNOW )     !constant
         ELSE
            ASNVB = ASNVD
            ASNNB = ASNND
         END IF
! --- DIRECT SEA SURFACE ALBEDO
         IF (COSZF(I) .GT.0.0) THEN
            RFCS = 1.4 / (1.0 + 0.8*COSZF(I))
!ERROR      RFCS = 1.4 / (1.0 + 0.4*COSZF(I))
            RFCW = 1.1 / (1.0 + 0.2*COSZF(I))
            IF (TSEAF(I) .GE. T0C) THEN
              ASEVB = MAX(ASEVD, 0.026/(COSZF(I)**1.7+0.065)
     &              + 0.15 * (COSZF(I)-0.1) * (COSZF(I)-0.5)
     &              * (COSZF(I)-1.0))
              ASENB = ASEVB
            ELSE
              ASEVB = ASEVD
              ASENB = ASEND
            END IF
         ELSE
            RFCS  = 1.0
            RFCW  = 1.0
            ASEVB = ASEVD
            ASENB = ASEND
        END IF
!
        A1   = ALVSF(I) * FACSF(I)
        B1   = ALVWF(I) * FACWF(I)
        A2   = ALNSF(I) * FACSF(I)
        B2   = ALNWF(I) * FACWF(I)
        ALVBR(I) = (A1*RFCS + B1*RFCW)     *FLND
     &           + ASEVB*FSEA + ASNVB*FSNO
        ALVDR(I) = (A1        + B1        )*FLND
     &           + ASEVD*FSEA + ASNVD*FSNO
        ALNBR(I) = (A2*RFCS   + B2*RFCW)   *FLND
     &           + ASENB*FSEA + ASNNB*FSNO
        ALNDR(I) = (A2        + B2        )*FLND
     &           + ASEND*FSEA + ASNND*FSNO
!
      ENDDO
!
      if (kaer .gt. 0) then
!
!....    AEROSOL DISTRIBUTIONS
!YH0400   USE OPAC AEROSOL DATA
        RDG = 180.0 / PI
        HDLT = 0.5 * DLTG
!
        DO I=1,LEN
          I2 = 1
          J2 = 1
          TMP1 = XLON(I) * RDG
          DO I1=1,IMXAE
            TMP2 = DLTG * (I1 - 1)
            IF (TMP2 .GT. 360.0-HDLT) THEN
              TMP2 = TMP2 - 360.0
            END IF
            IF (ABS(TMP1-TMP2) .LE. HDLT) THEN
              I2 = I1
              GO TO 40
            END IF
          END DO
  40      TMP1 = XLAT(I) * RDG
          DO J1=1,JMXAE
            TMP2 = 90.0 - DLTG * (J1 - 1)
            IF (ABS(TMP1-TMP2) .LE. HDLT) THEN
              J2 = J1
              GO TO 50
            END IF
          END DO
!
  50      KPRF(I) = KPRFG(I2,J2)
          DO K=1,NXC
            IDXC(K,I) = IDXCG(K,I2,J2)
            CMIX(K,I) = CMIXG(K,I2,J2)
          END DO
          DO K=1,NDN
            DENN(K,I) = DENNG(K,I2,J2)
          END DO
        ENDDO
      endif
!
      RETURN
      END

      SUBROUTINE GCLJMS (SI,KDIM) 2,1
cmy      USE MACHINE , ONLY : kind_phys,kind_rad
!     USE PHYSCONS
      USE COMCD1
      implicit none
!     include 'constant.h'
      integer i,j,kl,k,kdim,kk
      real (kind=kind_rad) xthk,silowxthk,silow
      real (kind=kind_rad) SI(KDIM+1), PPPTOP(4,2)
! --- PRESSURE LIMITS FOR SFC AND TOP OF EACH CLOUD DOMAIN (L,M,H)
!     IN MB, MODEL LAYERS FOR CLD TOPS ARE L=7,M=11,H=15 AT LOW
!     LATITUDES AND L= ,M= ,H=  , AT POLE REGION.
!....     PTOP ABOVE H CHANGED FROM 150 TO 100, CAUSE
!C    DATA PPPTOP /1050.,642.,350.,150., 1050.,750.,500.,150./
!          CODE WAS TRUNCATING TOPS OF CONVECTIVE CLOUDS
!C    DATA PPPTOP /1050.,642.,350.,100., 1050.,750.,500.,100./
!          use 0. for high domain, as CLW parameterization uses
!            all the upper model layers for clouds
      DATA PPPTOP /1050.,642.,350.,  0., 1050.,750.,500.,  0./
      integer ipnGlobal,its,mype
      logical :: DiagPrint = .false.
!     call PhysicsGetIpnItsMype(ipnGlobal,its,mype,DiagPrint)
!
!     ROCP = RD / CP
! --- INVERSON TYPE CLD CRITICAL VALUE-ISTRAT=0
!YH94 CLAPSE = -0.055E0
      CLAPSE = -0.06E0
! --- INVERSON TYPE CLD CRITICAL VALUE-ISTRAT=1
      CLAPKC = -0.05E0
!....CRITICAL DTHETA/DP FOR OCEAN STRATUS(WGT VARIES 0 TO 1
!                LINEARLY FROM CLAPSE TO CLPSE)
      DCLPS = -0.01E0
      CLPSE = CLAPKC + DCLPS
      CVTOP = 400.0E0
      PSTRT = 800.0E0
! --- LOW CLD BOTTOM (AT SIGMA=0.95) AND TOP SIGMA LEVEL
!JFM  DO 5 K=1,KDIM
      DO 5 K=2,KDIM  ! K-1 must be greater than 0
        KK=K
!        if(DiagPrint) then
!          print"('JFMclds1872',2i5,1p3e15.7)",its,kk,si(kk)
!        endif
        IF (SI(KK) .LE. 0.95E0) GO TO 10
   5  CONTINUE
  10  KLOWB = KK - 1
      SILOW = PPPTOP(2,1) * 1.0E-3
      DO 20 K=1,KDIM
        KK=K
        IF (SI(KK) .LT. SILOW) GO TO 30
!        if(DiagPrint) then
!          print"('JFMclds1882',2i5,1p3e15.7)",its,kk,si(kk),silow
!        endif
  20  CONTINUE
  30  KLOWT = KK ! KLOWT not used 3/19/07
! --- PRESURE LIMIT AT SFC AND AT TOP OF CLOUD DOMAINS (L,M,H) IN MB
      DO 40 J=1,2
      DO 40 I=1,4
       PTOPC(I,J) = PPPTOP(I,J)
  40  CONTINUE
! --- L CLD VERTICAL VEL ADJ BOUNDARIES
      VVCLD(1) =  0.0003E0
      VVCLD(2) = -0.0005E0
      CRHRH = 0.60E0
!--- COMPUTE LLYR--WHICH IS TOPMOST NON CLD(LOW) LAYER, FOR STRATIFORM
      XTHK = 0.E0
!....   DEFAULT LLYR
      KL = KDIM + 1
!....   TOPMOST NONCLOUD LAYER WILL BE THE ONE AT OR ABOVE LOWEST
!         0.1 OF THE ATMOSPHERE..
!JFM  DO 202 K=1,KDIM
      DO 202 K=2,KDIM  ! k-1 must be greater than 0
!       XTHK = XTHK + SI(K) - SI(K+1)
!       IF (XTHK.LT.0.1E0) GO TO 202
        KL = K
!       GO TO 204
        IF (SI(K).LT.0.9E0) GO TO 204
  202 CONTINUE
  204 LLYR = KL-1
!yt      PRINT 205,LLYR,KLOWB,KLOWT
  205 FORMAT(1H ,'-------LLYR,KLOWB =',2I5)
      RETURN
      END