!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer, 
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms 
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer 
!version 3 or (at your option) any later version that should be found at: 
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html 
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software; 
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), 
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
***S/P ISCCP_SIM_DRIVER - PART OF THE ISCCP CLOUD SIMULATOR PACKAGE
*

      SUBROUTINE ISCCP_SIM_DRIVER(CLDPT, CLDTP, CLDTAU, CLDEP, CLDFRAC,  ! OUTPUT 1,2
     1                            SUNLIT,
     2                            CLW_SUB, CIC_SUB, PRESSG, SHJ, SHTJ,   ! INPUT
     3                            IL1, IL2, ILG, LAY, LEV,
     4                            COSZ, GT, T, Q, MG, ML) 


#include "impnone.cdk"
C
#include "nbsnbl.cdk"
#include "consphy.cdk"
C
#include "phy_macros_f.h"
#include "mcica.cdk"

      EXTERNAL compute_re
*
*Author
*
*
*        Jason Cole Dec. 16, 2005
*
*Revisions
*
* 001
*
*Object
*
!---------------------------------------------------------------------------------
! This code generates is a slightly modified version of the ISCCP simulator.
! Rather than use the cloud generator provided with the simulator this version
! uses as input subcolumns generated by the stochastic cloud generator of Barker 
! and Rasiasen.  I.e., the ISCCP simulator works on the same clouds as the radiation
! in the Monte Carlo Independent Column Approximation.
!---------------------------------------------------------------------------------

!
!
! INPUT DATA
!

      REAL, INTENT(IN) ::
     1 CLW_SUB(ILG,LAY,NX_LOC),
     2 CIC_SUB(ILG,LAY,NX_LOC), 
     3 PRESSG(ILG),
     4 SHJ(ILG,LAY), 
     5 SHTJ(ILG,LEV),
     6 COSZ(ILG),
     7 GT(ILG),
     8 T(ILG,LAY),
     9 Q(ILG,LAY),
     A MG(ILG),
     B ML(ILG)

      INTEGER, INTENT(IN) ::
     1 IL1,
     2 IL2,
     3 ILG,
     4 LAY,
     5 LEV

!
! OUTPUT DATA
!

      REAL, INTENT(OUT) ::
     1 CLDPT(ILG,NTAU*NPTOP),
     2 CLDTP(ILG),
     3 CLDTAU(ILG),
     4 CLDEP(ILG),
     5 CLDFRAC(ILG),
     6 SUNLIT(ILG)

!
! WORK DATA
!

      REAL ::
     1 CLDMASK(ILG,LAY),
     2 TAU_VIS(ILG,LAY), 
     3 EMS_CLD(ILG,LAY),
     4 PFULL(ILG,LAY),
     6 CIC(ILG,LAY),
     7 CLW(ILG,LAY),
     8 DZ(ILG,LAY),
     9 PHALF(ILG,LEV), 
     A EMS_SFC(ILG),
     B TAU_SUB(ILG),
     C LOGTAU_SUB(ILG),
     D PTOP_SUB(ILG),
     E RAN_NUM(ILG),
     F REI(ILG,LAY),
     G REL(ILG,LAY),
     H AIRD(ILG,LAY)

      INTEGER ::
     1 RAN_INDEX(ILG),
     2 SUNLIT_LOC(ILG)

!
! LOCAL DATA (SCALAR)
!

      INTEGER ::
     1 ICOL,
     2 IND1,
     3 IL,
     4 ILAY,
     5 ILEV,
     6 ILAYP1,
     7 ITAU,
     8 IPRES,
     9 IT,
     A IP,
     B ITP
      
      REAL ::
     3 INVREL,
     4 INVREI,
     5 ROG,
     6 TAULIQVIS,
     7 TAULIQIR,
     8 TAUICEVIS,
     9 TAUICEIR,
     A TAU_IR,
     B TEMP,
     C A,
     D B,
     E C,
     F DP1,
     G DP2,
     H DP3,
     I DP_LOC

!
! PARAMETERS
!

      REAL, PARAMETER :: COSZ_MIN = 0.2          ! CUTOFF FOR DAYLIGHT PER ISCCP
      REAL, PARAMETER :: THIRD    = 0.3333333333333
      REAL, PARAMETER :: RU       = 1.6487213

! LOWER BOUNDS CLOUD TAU AND CLOUD TOP PRESSURE BINS
      REAL, PARAMETER :: P_TOP_BNDS(NPTOP) = (/0.0  ,180.0,310.0,440.0,
     1                                         560.0, 680.0, 800.0/)
      REAL, PARAMETER :: TAU_BNDS(NTAU) = (/0.0 ,0.3 ,1.3,3.6,9.4,
     1                                      23.0,60.0/)

      REAL, PARAMETER :: TAUCHK = 0.000001 !-1.*log(0.9999999)
!
! ZERO OUT SOME ARRAYS
!     

      DO ILAY = 1, LAY
         DO IL = IL1, IL2
            TAU_VIS(IL,ILAY) = 0.0
         END DO ! IL
      END DO ! ILAY

      DO IL = IL1, IL2
         CLDTP(IL)   = 0.0
         CLDTAU(IL)  = 0.0
         CLDEP(IL)   = 0.0
         CLDFRAC(IL) = 0.0
         SUNLIT(IL)  = 0.0
      END DO ! IL
      
      DO ITP = 1, NPTOP*NTAU
         DO IL = IL1, IL2
            CLDPT(IL,ITP) = 0.0
         END DO ! IL
      END DO ! ITP

C
C----------------------------------------------------------------------C
C     COMPUTE THE AIR DENSITY IN KG/M^3 AND THE LAYER THICKNESS IN M   C
C----------------------------------------------------------------------C
C

      DO ILAY = 1, LAY
         DO IL = IL1, IL2
            AIRD(IL,ILAY) =  SHJ(IL,ILAY) * PRESSG(IL) 
     1                    / ( T(IL,ILAY) * RGASD )
            DP1=0.5*(SHJ(IL,MIN(ILAY+1,LAY))-SHJ(IL,MAX(ILAY-1,1)))
            DP2=0.5*(SHJ(IL,1)+SHJ(IL,2))
            DP3=0.5*(1.-SHJ(IL,LAY))
            IF (ILAY .EQ. 1) THEN
               DP_LOC = DP2
            ELSE IF (ILAY .EQ. LAY) THEN
               DP_LOC = DP3
            ELSE
               DP_LOC = DP1
            ENDIF
            
            DP_LOC= MAX(DP_LOC*PRESSG(IL),0.)
            DZ(IL,ILAY)= DP_LOC/(AIRD(IL,ILAY)*GRAV)
         END DO ! IL
      END DO ! ILAY

! SET SURFACE EMISSIVITY TO 0.9999999
! SHOULD BE PASSED IN WHEN SURFACE EMISSIVITY IS COMPUTED BY
! GCM

      DO IL = IL1, IL2
         EMS_SFC(IL) = 0.9999999
      END DO ! IL

! SUNLIT ARRAY
      DO IL = IL1, IL2
         IF (COSZ(IL) .GE. COSZ_MIN) THEN
            SUNLIT_LOC(IL) = 1
         ELSE
            SUNLIT_LOC(IL) = 0
         END IF
      END DO     

! COMPUTE PRESSURES

      DO IL = IL1, IL2
         PHALF(IL,LEV) = SHTJ(IL,LEV)*PRESSG(IL)
      END DO ! IL

      DO ILAY = 1, LAY
         DO IL = IL1, IL2
            PHALF(IL,ILAY) = SHTJ(IL,ILAY)*PRESSG(IL)
            PFULL(IL,ILAY) = SHJ(IL,ILAY)*PRESSG(IL)
         END DO ! IL
      END DO ! ILAY

! LOOP OVER THE SUBCOLUMNS TO SAMPLE FROM, RANDOMLY SELECT SUBCOLUMNS
! AND APPLY THE ISCCP SIMULATOR ALGORIGHTM TO THE SUBCOLUMNS.
! THE RESULTS FOR EACH SUBCOLUMN ARE THEN ACCUMULATED TO GIVE A 
! GCM COLUMN MEAN.

      DO ICOL = 1, NSUBCOL

! RANDOMLY SELECT A SUBCOLUMN 

         CALL RANDOM_NUMBER(RAN_NUM)
         DO Il = IL1, IL2
            IND1 = INT(RAN_NUM(IL)*REAL(NX_LOC))
            IF (IND1 .GT. NX_LOC) IND1 = NX_LOC
            IF (IND1 .LT. 1)      IND1 = 1
            RAN_INDEX(IL) = IND1
         END DO ! IL
         DO IL = IL1, IL2
            IND1 = RAN_INDEX(IL)
            DO ILAY = 1, LAY
               CLW(IL,ILAY) = CLW_SUB(IL,ILAY,IND1)
               CIC(IL,ILAY) = CIC_SUB(IL,ILAY,IND1)
               IF ((CLW(IL,ILAY)+CIC(IL,ILAY)) .GT. 1.0e-9) THEN
                  CLDMASK(IL,ILAY) = 1.0
               ELSE
                  CLDMASK(IL,ILAY) = 0.0
               END IF
            END DO ! ILAY
         END DO ! IL

! COMPUTE THE CLOUD OPTICAL THICKNESS AT ~0.6 AND ~10.5 MICRONS
! THESE VALUES ARE FROM J. LI (JAN. 22, 2006)

! COMPUTE THE CLOUD EFFECTIVE RADII

         CALL COMPUTE_RE(REI, REL,
     1                   CLW, CIC, AIRD,
     2                   CLDMASK, MG, ML, ILG, LAY)
 
!         WRITE(22,*) MAXVAL(REI),MAXVAL(REL),MINVAL(REI),MINVAL(REL)

! COMPUTE THE CLOUD OPTICAL THICKNESS AT ~0.6 AND ~10.5 MICRONS
! THESE CO-EFFICIENTS ARE FROM J. LI (JAN. 22, 2006)

         DO ILAY = 1, LAY
            DO IL = IL1, IL2
               
               IF (CLDMASK(IL,ILAY) .GT. 0.0) THEN

                  INVREL = 1.0/REL(IL,ILAY)
                  INVREI = 1.0/REI(IL,ILAY)

! COMPUTE OPTICAL THICKNESS WATER CLOUDS
                  IF (CLW(IL,ILAY) .GT. 0.0) THEN
                   TAULIQVIS = CLW(IL,ILAY)*(4.483e-04 + INVREL * (1.501 
     1                       + INVREL*(7.441e-01 - INVREL * 9.620e-01)))
                   TAULIQIR  = CLW(IL,ILAY)*(0.14532e-01 - 0.47449e-03 
     1                       * REL(IL,ILAY) + INVREL*(0.22898e+01 - INVREL 
     2                       * (0.92402e+01 - INVREL * 0.100999e+02)))
                  ELSE
                     TAULIQVIS = 0.0
                     TAULIQIR  = 0.0
                  END IF

! COMPUTE OPTICAL THICKNESS ICE CLOUDS
                  IF (CIC(IL,ILAY) .GT. 0.0) THEN
                     TAUICEVIS = CIC(IL,ILAY) 
     1                         * (-0.303108e-04 + 0.251805e+01 * INVREI)

                     TAUICEIR = CIC(IL,ILAY) * (-7.627102e-03 + 3.406420 
     1                        * INVREI - 1.732583e+01 * (INVREI**2))
                  ELSE
                     TAUICEVIS = 0.0
                     TAUICEIR  = 0.0
                  END IF
                  
                  TAU_VIS(IL,ILAY) = (TAULIQVIS + TAUICEVIS)*DZ(IL,ILAY)
                  TAU_IR           = (TAULIQIR  + TAUICEIR)*DZ(IL,ILAY)
                  EMS_CLD(IL,ILAY) = 1.0-EXP(-RU*TAU_IR)
               ELSE
                  TAU_VIS(IL,ILAY)  = 0.0
                  EMS_CLD(IL,ILAY) = 0.0
               END IF
             
            END DO              ! IL
         END DO                 ! ILAY

! CALL THE ISCCP SIMULATOR
         CALL ISCCP_SIM(TAU_SUB, PTOP_SUB,                                ! OUTPUT
     1                  IL1, IL2,ILG, LAY, CLD_HGT,                       ! INPUT
     2                  PFULL, PHALF, Q, CLDMASK, TAU_VIS, EMS_CLD, T,
     3                  GT, EMS_SFC, SUNLIT_LOC)
        
! CONVERT PTOP FROM Pa TO hPa

         DO IL = IL1, IL2
            PTOP_SUB(IL) = PTOP_SUB(IL)/100.0
         END DO
   
! COMPUTE THE VARIOUS ISCCP QUANTITIES
         
         DO IL = IL1, IL2
! ADD CONTRIBUTIONS TO THE HISTOGRAM OF CLOUD TOP PRESSURE AND CLOUD OPTICAL THICKNESS
! DO SO IF SUN IS UP
            IF (SUNLIT_LOC(IL) .GT. 0) THEN
              
               IPRES = 0

               IP = 1
               IF (PTOP_SUB(IL) .GT. P_TOP_BNDS(IP) .AND.
     1              PTOP_SUB(IL) .LT. P_TOP_BNDS(IP+1)) THEN
                  IPRES = IP
               END IF

               DO IP = 2, NPTOP-1
                  IF (PTOP_SUB(IL) .GE. P_TOP_BNDS(IP) .AND.
     1                 PTOP_SUB(IL) .LT. P_TOP_BNDS(IP+1)) THEN
                     IPRES = IP
                  END IF
               END DO ! IP

               IF (PTOP_SUB(IL) .GE. P_TOP_BNDS(NPTOP)) IPRES=NPTOP
            
               ITAU = 0
               IT = 1
                  IF (TAU_SUB(IL) .GT. TAUCHK .AND.
     1                 TAU_SUB(IL) .LT. TAU_BNDS(IT+1)) THEN
                     ITAU = IT
                  END IF

               DO IT = 2, NTAU-1
                  IF (TAU_SUB(IL) .GE. TAU_BNDS(IT) .AND.
     1                 TAU_SUB(IL) .LT. TAU_BNDS(IT+1)) THEN
                     ITAU = IT
                  END IF
               END DO ! IT

               IF (TAU_SUB(IL) .GE. TAU_BNDS(NPTOP)) ITAU=NTAU           

               IF (IPRES .GT. 0 .AND. ITAU .GT. 0) THEN
                  ITP = (IPRES-1)*NTAU+ITAU
                  CLDPT(IL,ITP) = CLDPT(IL,ITP) + 1.0 
               END IF
            END IF
         END DO ! IL

! ACCUMULATE THE DOMAIN-MEAN PROPERTIES

         DO IL = IL1, IL2
            IF (SUNLIT_LOC(IL) .GT. 0   .AND.
     1           PTOP_SUB(IL)  .GT. 0.0 .AND.
     2           TAU_SUB(IL)   .GT. TAUCHK) THEN

! LINEAR TAU
               CLDTAU(IL) = CLDTAU(IL) + TAU_SUB(IL)

! CLOUD LOG MEAN VISIBLE OPTICAL THICKNESS (ACTUALLY ALBEDO (RADIATIVE) MEAN)
               CLDEP(IL) = CLDEP(IL)
     1                + REAL(INVTAU(MIN(NINT(100.0*TAU_SUB(IL)),45000)))

! CLOUD MEAN CLOUD TOP PRESSURE
               CLDTP(IL) = CLDTP(IL) + PTOP_SUB(IL)

! TOTAL CLOUD FRACTION
               CLDFRAC(IL) = CLDFRAC(IL) + 1.0
            END IF
         END DO ! IL
      END DO ! ICOL

! NOW THAT WE HAVE WORKED OVER THE ALL OF THE SUBCOLUMNS COMPUTE THE
! PROPER MEANS

      DO IL = IL1, IL2
! VARIABLES RELATED TO CLOUD OPTICAL THICKNESS AND VARIABLITY
         IF (SUNLIT_LOC(IL) .GT. 0) THEN
            IF (CLDFRAC(IL) .GT. 0.0) THEN
               CLDTAU(IL)  = CLDTAU(IL)/CLDFRAC(IL)
               A           = CLDEP(IL)/CLDFRAC(IL)
               B           = TAUTAB(MIN(255,MAX(1,NINT(A))))
               C           = MIN(B,CLDTAU(IL))
               CLDEP(IL)   = 1.0-C/CLDTAU(IL)
               CLDTAU(IL)  = B ! USE RADIATIVELY AVERAGED CLOUD OPTICAL THICKNESS
               CLDTP(IL)   = CLDTP(IL)/CLDFRAC(IL)
               CLDFRAC(IL) = CLDFRAC(IL)/REAL(NSUBCOL)
               DO ITP = 1, NPTOP*NTAU
                 CLDPT(IL,ITP) = CLDPT(IL,ITP)/REAL(NSUBCOL) 
               END DO ! ITP
            ELSE
               CLDTAU(IL)  = -999.0
               CLDEP(IL)   = -999.0
               CLDTP(IL)   = -999.0
               CLDFRAC(IL) = 0.0
            END IF
         ELSE
            CLDTAU(IL)  = -999.0
            CLDEP(IL)   = -999.0
            CLDTP(IL)   = -999.0
            CLDFRAC(IL) = -999.0
            DO ITP = 1, NPTOP*NTAU
               CLDPT(IL,ITP) = -999.0
            END DO ! ITP
         END IF
         SUNLIT(IL) = REAL(SUNLIT_LOC(IL))
      END DO ! IL

      END