*IF DEF,RECON                                                              PFLCLD1A.2      
C *****************************COPYRIGHT******************************     PFLCLD1A.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    PFLCLD1A.4      
C                                                                          PFLCLD1A.5      
C Use, duplication or disclosure of this code is subject to the            PFLCLD1A.6      
C restrictions as set forth in the contract.                               PFLCLD1A.7      
C                                                                          PFLCLD1A.8      
C                Meteorological Office                                     PFLCLD1A.9      
C                London Road                                               PFLCLD1A.10     
C                BRACKNELL                                                 PFLCLD1A.11     
C                Berkshire UK                                              PFLCLD1A.12     
C                RG12 2SZ                                                  PFLCLD1A.13     
C                                                                          PFLCLD1A.14     
C If no contract has been raised with this copy of the code, the use,      PFLCLD1A.15     
C duplication or disclosure of it is strictly prohibited.  Permission      PFLCLD1A.16     
C to do so must first be obtained in writing from the Head of Numerical    PFLCLD1A.17     
C Modelling at the above address.                                          PFLCLD1A.18     
C ******************************COPYRIGHT******************************    PFLCLD1A.19     
!                                                                          PFLCLD1A.20     
!+ Subroutine interface                                                    PFLCLD1A.21     

      SUBROUTINE PF_LS_CLD(                                                 3,2PFLCLD1A.22     
     + AK,BK,AKABOVE,BKABOVE,PSTAR,RHCRIT,POINTS,PFIELD,                   PFLCLD1A.23     
     & T,Q,QC,D_TYPE,ERROR)                                                PFLCLD1A.24     
                                                                           PFLCLD1A.25     
      IMPLICIT NONE                                                        PFLCLD1A.26     
!                                                                          PFLCLD1A.27     
! Description:                                                             PFLCLD1A.28     
!           For a single pressure level on UM grid OR theta level on       UDG6F405.9      
!           the PF vertical grid ,the                                      UDG6F405.10     
!           routine calculates cloud amount, total cloud water amount,     UDG6F405.11     
!           and potential temperature and specific humidity increments     UDG6F405.12     
!           due to cloud formation, from cloud-conserved and other         UDG6F405.13     
!           model variables. It returns the potential temperature          UDG6F405.14     
!           specific humidity and total cloud water amount                 UDG6F405.15     
!           fields/increments.                                             UDG6F405.16     
                                                                           UDG6F405.17     
!                                                                          PFLCLD1A.34     
! Method: The routine is based on the UM Cloud scheme 1A.                  PFLCLD1A.35     
!                                                                          PFLCLD1A.36     
! Current Code Owner: I Edmond                                             PFLCLD1A.37     
!                                                                          PFLCLD1A.38     
! History:                                                                 PFLCLD1A.39     
! Version   Date     Comment                                               PFLCLD1A.40     
! -------   ----     -------                                               PFLCLD1A.41     
! <version> <date>   Original code. <Your name>                            PFLCLD1A.42     
!     3.4   5/08/94 Remove calls to TIMER (under *DEF TIMER). R.Rawlins    PFLCLD1A.43     
!                                                                          PFLCLD1A.44     
!     4.0   9/05/95 Changed argument list to export mean cloud water       PFLCLD1A.45     
!                   content, QC, and bs for precipitation. A.C.Bushell     PFLCLD1A.46     
!                                                                          PFLCLD1A.47     
!     4.1  31/05/95 Reduced argument list to reduce the amount of memory   PFLCLD1A.48     
!                   allocated for the VAR reconfiguration. Temperature     PFLCLD1A.49     
!                   and specific humidity output only. Calculations done   PFLCLD1A.50     
!                   for a single level only.                               PFLCLD1A.51     
!    4.2  Oct. 96   T3E migration: *DEF CRAY removed                       GSS9F402.84     
!                              S.J.Swarbrick                               GSS9F402.85     
!     4.5  29/07/98  Optimisation changes for T3E Rewrote **KAPPA          UDG5F405.422    
!                    calculations to reduce number of "**"'s and           UDG5F405.423    
!                    replaced "**"'s with vector function powr_v           UDG5F405.424    
!                    Author D.M. Goddard                                   UDG5F405.425    
!     4.5  29/07/98  Add comments to declaration of D_TYPE.                UDG6F405.18     
!                    Author D.M. Goddard                                   UDG6F405.19     
!                                                                          PFLCLD1A.52     
! Code Description:                                                        PFLCLD1A.53     
!   Language: FORTRAN 77 + common extensions.                              PFLCLD1A.54     
!   This code is written to UMDP3 v6 programming standards.                PFLCLD1A.55     
!                                                                          PFLCLD1A.56     
! System component covered: <appropriate code>                             PFLCLD1A.57     
! System Task:              <appropriate code>                             PFLCLD1A.58     
!                                                                          PFLCLD1A.59     
! Declarations:                                                            PFLCLD1A.60     
!   These are of the form:-                                                PFLCLD1A.61     
!     INTEGER      ExampleVariable      !Description of variable           PFLCLD1A.62     
!                                                                          PFLCLD1A.63     
! 1.0 Global variables (*Called COMDECKs etc...):                          PFLCLD1A.64     
*CALL C_R_CP                                                               PFLCLD1A.65     
                                                                           PFLCLD1A.66     
! 2.0 Subroutine arguments                                                 PFLCLD1A.67     
!   2.1 Scalar arguments with intent(in):                                  PFLCLD1A.68     
      INTEGER                                                              PFLCLD1A.69     
     & POINTS              ! No. of gridpoints being processed.            PFLCLD1A.70     
     &,PFIELD              ! No. of points in global field (at one         PFLCLD1A.71     
                           ! vertical level).                              PFLCLD1A.72     
     &,D_TYPE  ! Specifies whether input UM or PF dump and determines      UDG6F405.20     
               ! whether the pressure on theta levels of PF vertical       UDG6F405.21     
               ! grid or pressure on UM pressure levels is calculated.     UDG6F405.22     
                                                                           UDG6F405.23     
                                                                           UDG6F405.24     
                                                                           PFLCLD1A.74     
      REAL                                                                 PFLCLD1A.75     
     & PSTAR(PFIELD)       ! Surface pressure (Pa).                        PFLCLD1A.76     
     &,RHCRIT              ! Critical relative humidity.  See the          PFLCLD1A.77     
                           ! the paragraph incorporating eqs P292.11       PFLCLD1A.78     
                           ! to P292.14; the values need to be tuned       PFLCLD1A.79     
                           ! for the given set of levels.                  PFLCLD1A.80     
     &,AK                                                                  PFLCLD1A.81     
     &,BK                                                                  PFLCLD1A.82     
     &,AKABOVE   ! Hybrid "A" co-ordinate.                                 PFLCLD1A.83     
     &,BKABOVE   ! Hybrid "B" co-ordinate.                                 PFLCLD1A.84     
     &,PR_OUT    !Intermediate temporaries used in calc of pressure        PFLCLD1A.85     
     &,PR_OUT2   !Intermediate temporaries used in calc of pressure        PFLCLD1A.86     
     &,PEXNER                                                              PFLCLD1A.87     
     &,PEXNER1                                                             PFLCLD1A.88     
                                                                           PFLCLD1A.89     
!   2.2 Array  arguments with intent(InOut):                               PFLCLD1A.90     
      REAL                                                                 PFLCLD1A.91     
     + Q(PFIELD)           ! On input: Total water content (QW)            PFLCLD1A.92     
                           ! (kg per kg air).                              PFLCLD1A.93     
                           ! On output: Specific humidity at               PFLCLD1A.94     
                           ! processed levels (kg water per kg air).       PFLCLD1A.95     
     +,T(PFIELD)           ! On input: Liquid/frozen water                 PFLCLD1A.96     
                           ! temperature (TL) (K).                         PFLCLD1A.97     
                           ! On output: Temperature at processed           PFLCLD1A.98     
                           ! levels (K).                                   PFLCLD1A.99     
                                                                           PFLCLD1A.100    
!   2.3 Array  arguments with intent(out):                                 PFLCLD1A.101    
      REAL                                                                 PFLCLD1A.102    
     & QC(PFIELD)          ! Cloud water content at a level                PFLCLD1A.103    
                           ! (kg per kg air).                              PFLCLD1A.104    
                                                                           PFLCLD1A.105    
!   2.4 ErrorStatus                                                        PFLCLD1A.106    
      INTEGER ERROR        ! OUT 0 if OK; 1 if bad arguments.              PFLCLD1A.107    
                                                                           PFLCLD1A.108    
! 3.0 Local parameters:                                                    PFLCLD1A.109    
      INTEGER MAXPOINTS                                                    PFLCLD1A.110    
      PARAMETER (MAXPOINTS=96*72)                                          PFLCLD1A.111    
                                                                           PFLCLD1A.112    
! 4.0 Local scalars:                                                       PFLCLD1A.113    
      INTEGER I         ! Loop counters: I - horizontal field index.       PFLCLD1A.114    
      INTEGER QC_POINTS ! No. points with non-zero cloud                   PFLCLD1A.115    
                                                                           PFLCLD1A.116    
! 5.0 Local dynamic arrays:                                                PFLCLD1A.117    
      REAL                                                                 PFLCLD1A.118    
     + CF(PFIELD)          ! Cloud fraction at processed levels            PFLCLD1A.119    
                           ! (decimal fraction).                           PFLCLD1A.120    
     +,QCF(PFIELD)         ! Cloud ice content at processed levels         PFLCLD1A.121    
                           ! (kg per kg air).                              PFLCLD1A.122    
     +,QCL(PFIELD)         ! Cloud liquid water content at                 PFLCLD1A.123    
                           ! processed levels (kg per kg air).             PFLCLD1A.124    
                                                                           PFLCLD1A.125    
      REAL                 ! "Automatic" arrays on Cray.                   PFLCLD1A.127    
     & P(POINTS)           ! WORK Pressure at successive levels (Pa).      PFLCLD1A.128    
     &,QSL(POINTS)         ! WORK Saturated spec humidity for temp TL.     PFLCLD1A.129    
     &,QN(POINTS)          ! WORK Cloud water normalised with BS.          PFLCLD1A.130    
                                                                           PFLCLD1A.131    
      LOGICAL                                                              PFLCLD1A.132    
     & LQC(POINTS)         ! WORK True for points with non-zero cloud      PFLCLD1A.133    
                                                                           PFLCLD1A.134    
      INTEGER                                                              PFLCLD1A.135    
     & INDEX(POINTS)       ! WORK Index for points with non-zero cloud     PFLCLD1A.136    
*IF DEF,VECTLIB                                                            PXVECTLB.118    
      REAL                                                                 UDG5F405.427    
     & a_pexner(points)                                                    UDG5F405.428    
     &,a_pexner1(points)                                                   UDG5F405.429    
     &,a_pexner_kappa(points)                                              UDG5F405.430    
     &,a_pexner1_kappa(points)                                             UDG5F405.431    
*ENDIF                                                                     UDG5F405.432    
                                                                           PFLCLD1A.149    
! Function & Subroutine calls:                                             PFLCLD1A.150    
      EXTERNAL QSAT,PF_LS_CLD_C                                            PFLCLD1A.151    
                                                                           PFLCLD1A.155    
!- End of header                                                           PFLCLD1A.156    
                                                                           PFLCLD1A.157    
!-----------------------------------------------------------------------   PFLCLD1A.158    
!  Check input arguments for potential over-writing problems.              PFLCLD1A.159    
!-----------------------------------------------------------------------   PFLCLD1A.160    
      ERROR=0                                                              PFLCLD1A.161    
      IF(POINTS.GT.PFIELD)THEN                                             PFLCLD1A.162    
        ERROR=1                                                            PFLCLD1A.163    
        GOTO1000                                                           PFLCLD1A.164    
      ENDIF                                                                PFLCLD1A.165    
                                                                           PFLCLD1A.166    
!-----------------------------------------------------------------------   PFLCLD1A.167    
!  1. Calculate QSAT at liquid/ice water temperature, TL,                  PFLCLD1A.168    
!     and initialise cloud ice, water and fraction arrays.                 PFLCLD1A.169    
!     This requires a preliminary calculation of the pressure.             PFLCLD1A.170    
!     NB: On entry to the subroutine 'T' is TL and 'Q' is QW.              PFLCLD1A.171    
!-----------------------------------------------------------------------   PFLCLD1A.172    
                                                                           PFLCLD1A.173    
       IF (D_TYPE.EQ.5) THEN                                               PFLCLD1A.174    
! Variables passed into the cloud scheme are on the PF vertical grid.      PFLCLD1A.175    
! Calculation of pressure on successsive theta levels on the PF vertical   PFLCLD1A.176    
! grid is made from exner pressure (on pressure levels, using the ak and   PFLCLD1A.177    
! values and pstar) and an equation derived in documentation working pap   PFLCLD1A.178    
*IF DEF,VECTLIB                                                            PXVECTLB.119    
       DO I=1,points                                                       UDG5F405.434    
! Exner pressure at pressure level just below theta level                  UDG5F405.435    
! of interest on PF vertical grid.                                         UDG5F405.436    
         PR_OUT  = AK + BK * PSTAR(I)                                      UDG5F405.437    
         a_PEXNER(i) = (PR_OUT / PREF)                                     UDG5F405.438    
                                                                           UDG5F405.439    
! Exner pressure at pressure level just above theta level                  UDG5F405.440    
! of interest on PF vertical grid.                                         UDG5F405.441    
         PR_OUT2 = AKABOVE + BKABOVE * pstar(i)                            UDG5F405.442    
         a_PEXNER1(i) = (PR_OUT2 / PREF)                                   UDG5F405.443    
       ENDDO                                                               UDG5F405.444    
                                                                           UDG5F405.445    
       call powr_v(points,a_pexner,kappa,a_pexner_kappa)                   UDG5F405.446    
       call powr_v(points,a_pexner1,kappa,a_pexner1_kappa)                 UDG5F405.447    
                                                                           UDG5F405.448    
! Pressure on (theta) level of PF vertical grid.                           UDG5F405.449    
       DO I=1,points                                                       UDG5F405.450    
         PEXNER1=a_pexner1_kappa(i)                                        UDG5F405.451    
         PEXNER=a_pexner_kappa(i)                                          UDG5F405.452    
                                                                           UDG5F405.453    
         P(I) = (PEXNER1 - PEXNER)/((a_PEXNER1(i) -                        UDG5F405.454    
     &          a_PEXNER(i))*KAPPA)                                        UDG5F405.455    
                                                                           UDG5F405.456    
        ENDDO                                                              UDG5F405.457    
        call powr_v(points,p,(1/(KAPPA-1)),p)                              UDG5F405.458    
        DO I=1,points                                                      UDG5F405.459    
          P(I)=P(I)*PREF                                                   UDG5F405.460    
          QCF(I)=0.0                                                       UDG5F405.461    
          QCL(I)=0.0                                                       UDG5F405.462    
          QC(I) =0.0                                                       UDG5F405.463    
          CF(I) =0.0                                                       UDG5F405.464    
        ENDDO ! Loop over points                                           UDG5F405.465    
*ELSE                                                                      UDG5F405.466    
        DO I=1,points                                                      PFLCLD1A.179    
                                                                           PFLCLD1A.180    
! Exner pressure at pressure level just below theta level                  PFLCLD1A.181    
! of interest on PF vertical grid.                                         PFLCLD1A.182    
         PR_OUT  = AK + BK * PSTAR(I)                                      PFLCLD1A.183    
         PEXNER = (PR_OUT / PREF)**KAPPA                                   PFLCLD1A.184    
                                                                           PFLCLD1A.185    
! Exner pressure at pressure level just above theta level                  PFLCLD1A.186    
! of interest on PF vertical grid.                                         PFLCLD1A.187    
         PR_OUT2 = AKABOVE + BKABOVE * pstar(i)                            PFLCLD1A.188    
         PEXNER1 = (PR_OUT2 / pref)**KAPPA                                 PFLCLD1A.189    
                                                                           PFLCLD1A.190    
! Pressure on (theta) level of PF vertical grid.                           PFLCLD1A.191    
          P(I) = PREF*((PEXNER1 - PEXNER)/((PEXNER1**(1/KAPPA) -           PFLCLD1A.192    
     &           PEXNER**(1/KAPPA))*KAPPA))**(1/(KAPPA-1))                 PFLCLD1A.193    
          QCF(I)=0.0                                                       PFLCLD1A.194    
          QCL(I)=0.0                                                       PFLCLD1A.195    
          QC(I) =0.0                                                       PFLCLD1A.196    
          CF(I) =0.0                                                       PFLCLD1A.197    
        ENDDO ! Loop over points                                           PFLCLD1A.198    
*ENDIF                                                                     UDG5F405.467    
                                                                           PFLCLD1A.199    
       ELSE                                                                PFLCLD1A.200    
                                                                           PFLCLD1A.201    
        DO I=1,points                                                      PFLCLD1A.202    
                                                                           PFLCLD1A.203    
! Obtain full level pressure on UM vertical grid.                          PFLCLD1A.204    
          P(I)= AK + BK * PSTAR(I)                                         PFLCLD1A.205    
          QCF(I)=0.0                                                       PFLCLD1A.206    
          QCL(I)=0.0                                                       PFLCLD1A.207    
          QC(I) =0.0                                                       PFLCLD1A.208    
          CF(I) =0.0                                                       PFLCLD1A.209    
                                                                           PFLCLD1A.210    
        ENDDO ! Loop over points                                           PFLCLD1A.211    
       ENDIF                                                               PFLCLD1A.212    
                                                                           PFLCLD1A.213    
                                                                           PFLCLD1A.214    
        CALL QSAT(QSL,T(1),P,POINTS)                                       PFLCLD1A.215    
                                                                           PFLCLD1A.216    
        DO I=1,POINTS                                                      PFLCLD1A.217    
          IF (RHCRIT .LT. 1.) THEN                                         PFLCLD1A.218    
                                                                           PFLCLD1A.219    
!-----------------------------------------------------------------------   PFLCLD1A.220    
! 2. Calculate the quantity QN = QC/BS = (QW/QSL-1)/(1-RHcrit)             PFLCLD1A.221    
!    if RHcrit is less than 1                                              PFLCLD1A.222    
!-----------------------------------------------------------------------   PFLCLD1A.223    
                                                                           PFLCLD1A.224    
            QN(I) = (Q(I)/QSL(I)-1.)/(1.-RHCRIT)                           PFLCLD1A.225    
                                                                           PFLCLD1A.226    
!-----------------------------------------------------------------------   PFLCLD1A.227    
! 3. Set logical variable for cloud, LQC, for the case RHcrit < 1;         PFLCLD1A.228    
!     where QN > -1, i.e. qW/qSAT(TL,P) > RHcrit, there is cloud           PFLCLD1A.229    
!-----------------------------------------------------------------------   PFLCLD1A.230    
                                                                           PFLCLD1A.231    
            LQC(I) = (QN(I) .GT. -1.)                                      PFLCLD1A.232    
          ELSE                                                             PFLCLD1A.233    
                                                                           PFLCLD1A.234    
!-----------------------------------------------------------------------   PFLCLD1A.235    
! 2.a Calculate QN = QW - QSL if RHcrit equals 1                           PFLCLD1A.236    
!-----------------------------------------------------------------------   PFLCLD1A.237    
                                                                           PFLCLD1A.238    
            QN(I) = Q(I) - QSL(I)                                          PFLCLD1A.239    
                                                                           PFLCLD1A.240    
!-----------------------------------------------------------------------   PFLCLD1A.241    
! 3.a Set logical variable for cloud, LQC, for the case RHcrit = 1;        PFLCLD1A.242    
!     where QN > 0, i.e. qW > qSAT(TL,P), there is cloud                   PFLCLD1A.243    
!-----------------------------------------------------------------------   PFLCLD1A.244    
                                                                           PFLCLD1A.245    
            LQC(I) = (QN(I) .GT. 0.)                                       PFLCLD1A.246    
          ENDIF ! Test on RHCRIT                                           PFLCLD1A.247    
        ENDDO ! Loop over points                                           PFLCLD1A.248    
                                                                           PFLCLD1A.249    
!-----------------------------------------------------------------------   PFLCLD1A.250    
! 4. Form index of points where non-zero cloud fraction                    PFLCLD1A.251    
!-----------------------------------------------------------------------   PFLCLD1A.252    
                                                                           PFLCLD1A.253    
        QC_POINTS=0                                                        PFLCLD1A.257    
        DO I=1,POINTS                                                      PFLCLD1A.258    
          IF(LQC(I)) THEN                                                  PFLCLD1A.259    
            QC_POINTS=QC_POINTS+1                                          PFLCLD1A.260    
            INDEX(QC_POINTS)=I                                             PFLCLD1A.261    
          ENDIF                                                            PFLCLD1A.262    
        ENDDO ! Loop over points                                           PFLCLD1A.263    
                                                                           PFLCLD1A.265    
!-----------------------------------------------------------------------   PFLCLD1A.266    
! 5. Call PF_LS_CLD_C to calculate cloud ice and water contents, cloud     PFLCLD1A.267    
!                  fractions, spec. humidity and determine temperature     PFLCLD1A.268    
!-----------------------------------------------------------------------   PFLCLD1A.269    
                                                                           PFLCLD1A.270    
        IF(QC_POINTS.GT.0) THEN                                            PFLCLD1A.271    
          CALL PF_LS_CLD_C(P,RHCRIT,QSL,QN,Q(1),T(1),QCF(1),               PFLCLD1A.272    
     &                  QCL(1),QC(1),CF(1),INDEX,QC_POINTS,POINTS)         PFLCLD1A.273    
        ENDIF ! qc_points > 0                                              PFLCLD1A.274    
                                                                           PFLCLD1A.275    
                                                                           PFLCLD1A.276    
 1000 CONTINUE ! Error exit                                                PFLCLD1A.277    
      RETURN                                                               PFLCLD1A.278    
      END                                                                  PFLCLD1A.279    
                                                                           PFLCLD1A.280    
!+                                                                         PFLCLD1A.281    
!                                                                          PFLCLD1A.282    
! Subroutine Interface:                                                    PFLCLD1A.283    

      SUBROUTINE PF_LS_CLD_C(                                               1,1PFLCLD1A.284    
     & P_F,RHCRIT,QSL_F,QN_F,Q_F,T_F                                       PFLCLD1A.285    
     &,QCF_F,QCL_F,QC_F,CF_F,INDEX,POINTS,POINTS_F)                        PFLCLD1A.286    
                                                                           PFLCLD1A.287    
      IMPLICIT NONE                                                        PFLCLD1A.288    
!                                                                          PFLCLD1A.289    
! Description:                                                             PFLCLD1A.290    
!          Calculates cloud water amounts (ice and liquid), cloud          PFLCLD1A.291    
!          amounts and temperature and specific humidity                   PFLCLD1A.292    
!          from cloud-conserved and other model variables.                 PFLCLD1A.293    
!          This is done for one level.                                     PFLCLD1A.294    
!          Iteration is used to improve the determination of               PFLCLD1A.295    
!          alphal, hence al and so qcf, qcl, Q and T.                      PFLCLD1A.296    
! Method: see documentation: UMDP No.29                                    PFLCLD1A.297    
! Current Code Owner: I Edmond                                             PFLCLD1A.298    
!                                                                          PFLCLD1A.299    
! History:                                                                 PFLCLD1A.300    
! Version   Date     Comment                                               PFLCLD1A.301    
! -------   ----     -------                                               PFLCLD1A.302    
! 4.1       15/6/96   Original code. Ian Edmond                            PFLCLD1A.303    
!                                                                          PFLCLD1A.304    
! Code Description:                                                        PFLCLD1A.305    
!   Language: FORTRAN 77 + common extensions.                              PFLCLD1A.306    
!   This code is written to UMDP3 v6 programming standards.                PFLCLD1A.307    
!                                                                          PFLCLD1A.308    
! System component covered: <appropriate code>                             PFLCLD1A.309    
! System Task:              <appropriate code>                             PFLCLD1A.310    
!                                                                          PFLCLD1A.311    
! Declarations:                                                            PFLCLD1A.312    
!   These are of the form:-                                                PFLCLD1A.313    
!     INTEGER      ExampleVariable      !Description of variable           PFLCLD1A.314    
!                                                                          PFLCLD1A.315    
! 1.0 Global variables (*Called COMDECKs etc...):                          PFLCLD1A.316    
*CALL C_R_CP                                                               PFLCLD1A.317    
*CALL C_EPSLON                                                             PFLCLD1A.318    
*CALL C_LHEAT                                                              PFLCLD1A.319    
*CALL C_0_DG_C                                                             PFLCLD1A.320    
                                                                           PFLCLD1A.321    
! 2.0 Subroutine arguments                                                 PFLCLD1A.322    
                                                                           PFLCLD1A.323    
!   2.1 Scalar arguments with intent(in):                                  PFLCLD1A.324    
      INTEGER                                                              PFLCLD1A.325    
     & POINTS_F            ! No. of gridpoints being processed.            PFLCLD1A.326    
     &,POINTS              ! No. of gridpoints with non-zero cloud         PFLCLD1A.327    
     &,INDEX(POINTS)       ! INDEX for  points with non-zero cloud         PFLCLD1A.328    
                           ! from lowest model level.                      PFLCLD1A.329    
      REAL                                                                 PFLCLD1A.330    
     & P_F(POINTS_F)       ! pressure (Pa).                                PFLCLD1A.331    
     &,QSL_F(POINTS_F)     ! saturated humidity at temperature TL,         PFLCLD1A.332    
                           ! and pressure P_F                              PFLCLD1A.333    
     &,QN_F(POINTS_F)      ! Normalised super/subsaturation (=QC/BS).      PFLCLD1A.334    
     &,RHCRIT              ! Critical relative humidity.  See the          PFLCLD1A.335    
                           ! the paragraph incorporating eqs P292.11       PFLCLD1A.336    
                           ! to P292.14;                                   PFLCLD1A.337    
                                                                           PFLCLD1A.338    
!   2.3 Array  arguments with intent(InOut):                               PFLCLD1A.339    
      REAL                                                                 PFLCLD1A.340    
     & Q_F(POINTS_F)       ! On input: Total water content (QW)            PFLCLD1A.341    
                           ! (kg per kg air).                              PFLCLD1A.342    
                           ! On output: Specific humidity at               PFLCLD1A.343    
                           ! processed levels (kg water per kg             PFLCLD1A.344    
                           ! air).                                         PFLCLD1A.345    
     &,T_F(POINTS_F)       ! On input: Liquid/frozen water                 PFLCLD1A.346    
                           ! temperature (TL) (K).                         PFLCLD1A.347    
                           ! On output: Temperature at processed           PFLCLD1A.348    
                           ! levels (K).                                   PFLCLD1A.349    
                                                                           PFLCLD1A.350    
!   2.4 Array  arguments with intent(Out):                                 PFLCLD1A.351    
      REAL                                                                 PFLCLD1A.352    
     & QCF_F(POINTS_F)     ! Cloud ice content at processed levels         PFLCLD1A.353    
                           ! (kg per kg air).                              PFLCLD1A.354    
     &,QCL_F(POINTS_F)     ! Cloud liquid water content at                 PFLCLD1A.355    
                           ! processed levels (kg per kg air).             PFLCLD1A.356    
     &,QC_F(POINTS_F)      ! Total cloud water content at                  PFLCLD1A.357    
                           ! processed levels (kg per kg air).             PFLCLD1A.358    
     &,CF_F(POINTS_F)      ! Cloud fraction at processed levels.           PFLCLD1A.359    
                                                                           PFLCLD1A.360    
     &,GRID_QC_F(POINTS_F) ! Super/subsaturation on processed levels       PFLCLD1A.361    
                                                                           PFLCLD1A.362    
     &,BS_F(POINTS_F)      ! Value of bs at processed levels.              PFLCLD1A.363    
                                                                           PFLCLD1A.364    
! 3.0 Local parameters:                                                    PFLCLD1A.365    
      INTEGER MAXPOINTS                                                    PFLCLD1A.366    
      PARAMETER (MAXPOINTS=96*72)                                          PFLCLD1A.367    
                                                                           PFLCLD1A.368    
      INTEGER ITS                              ! Total number of iterati   PFLCLD1A.369    
      PARAMETER (ITS=5)                                                    PFLCLD1A.370    
                                                                           PFLCLD1A.371    
      REAL alphf                                                           PFLCLD1A.372    
      PARAMETER (ALPHF=EPSILON*(LF+LC)/R) ! For frozen AlphaL calculatio   PFLCLD1A.373    
                                                                           PFLCLD1A.374    
      REAL alphl                                                           PFLCLD1A.375    
      PARAMETER (ALPHL=EPSILON*LC/R)      ! For liquid AlphaL calculatio   PFLCLD1A.376    
                                                                           PFLCLD1A.377    
      REAL lsrcp                                                           PFLCLD1A.378    
      PARAMETER (LSRCP=(LF+LC)/CP)        ! Lat ht of sublimation/Cp.      PFLCLD1A.379    
                                                                           PFLCLD1A.380    
      REAL LCRCP                                                           PFLCLD1A.381    
      PARAMETER (LCRCP=LC/CP)             ! Lat ht of condensation/Cp.     PFLCLD1A.382    
                                                                           PFLCLD1A.383    
      REAL LFRCP                                                           PFLCLD1A.384    
      PARAMETER (LFRCP=LF/CP)             ! Lat ht of fusion/Cp.           PFLCLD1A.385    
                                                                           PFLCLD1A.386    
      REAL cprlf                                                           PFLCLD1A.387    
      PARAMETER (CPRLF=CP/LF)             ! Cp/lat ht of fusion.           PFLCLD1A.388    
                                                                           PFLCLD1A.389    
      REAL wtn                                                             PFLCLD1A.390    
      PARAMETER (WTN=0.75)                                                 PFLCLD1A.391    
                                                                           PFLCLD1A.392    
! 4.0 Local scalars:                                                       PFLCLD1A.393    
      INTEGER I,N                         ! Counters                       PFLCLD1A.394    
                                                                           PFLCLD1A.395    
      REAL                                                                 PFLCLD1A.396    
     & AL                  ! al (see equation P292.6).                     PFLCLD1A.397    
     &,ALPHAL              ! alphal (see equation P292.5).                 PFLCLD1A.398    
     &,TESTT               ! temporary temperature for partition           PFLCLD1A.399    
                           ! of cloud water into ice and liquid            PFLCLD1A.400    
     &,FRACF               ! Fraction of cloud water which is frozen.      PFLCLD1A.401    
                                                                           PFLCLD1A.402    
! 5.0 Local dynamic arrays:                                                PFLCLD1A.403    
                                                                           PFLCLD1A.404    
      REAL                 ! "Automatic" arrays on Cray.                   PFLCLD1A.406    
     & P(POINTS)           ! Pressure  (Pa).                               PFLCLD1A.407    
     &,TL(POINTS)          ! Liquid/ice water temperature.                 PFLCLD1A.408    
     &,QW(POINTS)          ! Total water content.                          PFLCLD1A.409    
     &,QSL(POINTS)         ! Saturated spec humidity for temp TL.          PFLCLD1A.410    
     &,QS(POINTS)          ! Saturated spec humidity for temp T.           PFLCLD1A.411    
     &,QCN(POINTS)         ! Cloud water normalised with BS.               PFLCLD1A.412    
     &,T(POINTS)           ! temperature.                                  PFLCLD1A.413    
     &,Q(POINTS)           ! specific humidity.                            PFLCLD1A.414    
     &,QCF(POINTS)         ! Cloud ice content.                            PFLCLD1A.415    
     &,QCL(POINTS)         ! Cloud water content.                          PFLCLD1A.416    
     &,CF(POINTS)          ! Cloud fraction.                               PFLCLD1A.417    
     &,BS(POINTS)          ! Sigmas*sqrt(6): sigmas the parametric         PFLCLD1A.418    
                           ! standard deviation of local cloud             PFLCLD1A.419    
                           ! water content fluctuations.                   PFLCLD1A.420    
     &,ALPHAL_NM1(POINTS)  ! ALPHAL at previous iteration.                 PFLCLD1A.421    
     &,ALPHAL_NM1_F(POINTS_F) ! ALPHAL at previous iteration.              PFLCLD1A.422    
                                                                           PFLCLD1A.442    
! Function & Subroutine calls:                                             PFLCLD1A.443    
      EXTERNAL QSAT                                                        PFLCLD1A.444    
                                                                           PFLCLD1A.445    
!-End of header                                                            PFLCLD1A.446    
                                                                           PFLCLD1A.447    
!-----------------------------------------------------------------------   PFLCLD1A.448    
! 1. Calculate ALPHAL (eq P292.5), AL (P292.6), BS (ie. sigma*sqrt(6),     PFLCLD1A.449    
!    where sigma is as in P292.14)                                         PFLCLD1A.450    
!-----------------------------------------------------------------------   PFLCLD1A.451    
                                                                           PFLCLD1A.452    
        DO I=1,POINTS_F                                                    PFLCLD1A.453    
          IF (T_F(I) .GT. TM) THEN                                         PFLCLD1A.454    
            ALPHAL = ALPHL * QSL_F(I) / (T_F(I) * T_F(I)) ! P292.5         PFLCLD1A.455    
            AL = 1.0 / (1.0 + (LCRCP * ALPHAL))           ! P292.6         PFLCLD1A.456    
          ELSE                                                             PFLCLD1A.457    
            ALPHAL = ALPHF * QSL_F(I) / (T_F(I) * T_F(I)) ! P292.5         PFLCLD1A.458    
            AL = 1.0 / (1.0 + (LSRCP * ALPHAL))           ! P292.6         PFLCLD1A.459    
          ENDIF                                                            PFLCLD1A.460    
          IF (RHCRIT .LT. 1.) THEN                                         PFLCLD1A.461    
            BS_F(I) = (1.0 - RHCRIT) * AL * QSL_F(I)      ! P292.14        PFLCLD1A.462    
          ELSE                                                             PFLCLD1A.463    
            BS_F(I) = AL                                                   PFLCLD1A.464    
          ENDIF                                                            PFLCLD1A.465    
          GRID_QC_F(I) = QN_F(I) * BS_F(I)                                 PFLCLD1A.466    
          ALPHAL_NM1_F(I) = ALPHAL                                         PFLCLD1A.467    
        END DO ! Loop over points_f                                        PFLCLD1A.468    
                                                                           PFLCLD1A.469    
!-----------------------------------------------------------------------   PFLCLD1A.470    
! 1.a Gather points with non-zero cloud fraction.                          PFLCLD1A.471    
!-----------------------------------------------------------------------   PFLCLD1A.472    
                                                                           PFLCLD1A.473    
        DO I=1,POINTS                                                      PFLCLD1A.474    
          P(I)=P_F(INDEX(I))                                               PFLCLD1A.475    
          TL(I)=T_F(INDEX(I))                                              PFLCLD1A.476    
          QW(I)=Q_F(INDEX(I))                                              PFLCLD1A.477    
          QSL(I)=QSL_F(INDEX(I))                                           PFLCLD1A.478    
          QCN(I)=QN_F(INDEX(I))                                            PFLCLD1A.479    
          BS(I)=BS_F(INDEX(I))                                             PFLCLD1A.480    
          ALPHAL_NM1(I)=ALPHAL_NM1_F(INDEX(I))                             PFLCLD1A.481    
        END DO ! Loop over points                                          PFLCLD1A.482    
                                                                           PFLCLD1A.483    
!-----------------------------------------------------------------------   PFLCLD1A.484    
! Loop over points with cloud.                                             PFLCLD1A.485    
!-----------------------------------------------------------------------   PFLCLD1A.486    
                                                                           PFLCLD1A.487    
        DO I=1,POINTS                                                      PFLCLD1A.488    
          IF (RHCRIT .LT. 1.) THEN                                         PFLCLD1A.489    
!-----------------------------------------------------------------------   PFLCLD1A.490    
! 2. Calculate cloud fraction C and normalised cloud water QCN=qc/BS       PFLCLD1A.491    
!    using eqs P292.15 & 16 if RHcrit < 1.                                 PFLCLD1A.492    
!  N.B. QN (input) is initially in QCN                                     PFLCLD1A.493    
!  N.B. QN does not depend on AL and so the calculation of CF              PFLCLD1A.494    
!  and QCN  can be done outside the iteration (which is performed in       PFLCLD1A.495    
!  LS_CLD_C). QN is > -1 for all points processed so CF > 0.               PFLCLD1A.496    
!-----------------------------------------------------------------------   PFLCLD1A.497    
            IF (QCN(I) .LE. 0.) THEN                                       PFLCLD1A.498    
              CF(I)=0.5*(1.+QCN(I))*(1.+QCN(I))                            PFLCLD1A.499    
              QCN(I)=(1.+QCN(I))*(1.+QCN(I))*(1.+QCN(I))/6.                PFLCLD1A.500    
            ELSEIF (QCN(I) .LT. 1.) THEN                                   PFLCLD1A.501    
              CF(I)=1.-0.5*(1.-QCN(I))*(1.-QCN(I))                         PFLCLD1A.502    
              QCN(I)=QCN(I) + (1.-QCN(I))*(1.-QCN(I))*(1.-QCN(I))/6.       PFLCLD1A.503    
            ELSE ! QN .GE. 1                                               PFLCLD1A.504    
              CF(I)=1.                                                     PFLCLD1A.505    
            ENDIF ! Tests on QN                                            PFLCLD1A.506    
          ELSE ! i.e. if RHcrit =1                                         PFLCLD1A.507    
!-----------------------------------------------------------------------   PFLCLD1A.508    
! 3.a Set the cloud fraction to 1 if RHcrit = 1.                           PFLCLD1A.509    
!      For the case RHcrit =1, QN is > 0 for all points processed          PFLCLD1A.510    
!      so CF =1.                                                           PFLCLD1A.511    
!-----------------------------------------------------------------------   PFLCLD1A.512    
            CF(I) = 1.                                                     PFLCLD1A.513    
          ENDIF ! Test on RHCRIT                                           PFLCLD1A.514    
                                                                           PFLCLD1A.515    
!-----------------------------------------------------------------------   PFLCLD1A.516    
! 3.1 Calculate 1st approx. to qc (store in QCL)                           PFLCLD1A.517    
!-----------------------------------------------------------------------   PFLCLD1A.518    
                                                                           PFLCLD1A.519    
          QCL(I)=QCN(I)*BS(I)                                              PFLCLD1A.520    
                                                                           PFLCLD1A.521    
!-----------------------------------------------------------------------   PFLCLD1A.522    
! 3.2 Calculate 1st approx. specific humidity (total minus cloud water)    PFLCLD1A.523    
!-----------------------------------------------------------------------   PFLCLD1A.524    
                                                                           PFLCLD1A.525    
          Q(I)=QW(I)-QCL(I)                                                PFLCLD1A.526    
                                                                           PFLCLD1A.527    
!-----------------------------------------------------------------------   PFLCLD1A.528    
! 3.3 Perform  partition of cloud water into liquid and ice                PFLCLD1A.529    
!     components, and calculate 1st approx. to temperature,                PFLCLD1A.530    
!     accounting for latent heating.                                       PFLCLD1A.531    
!     First assume cloud water is all liquid.                              PFLCLD1A.532    
!-----------------------------------------------------------------------   PFLCLD1A.533    
                                                                           PFLCLD1A.534    
          T(I)=TL(I)+LCRCP*QCL(I)                                          PFLCLD1A.535    
          IF(T(I) .GT. TM) THEN          ! Liquid case                     PFLCLD1A.536    
            QCF(I)=0.0                                                     PFLCLD1A.537    
          ELSE                           ! Frozen or mixed phase           PFLCLD1A.538    
                                                                           PFLCLD1A.539    
!-----------------------------------------------------------------------   PFLCLD1A.540    
! 3.4 Cloud ice present; either all cloud water is cloud ice and T<TM      PFLCLD1A.541    
!     or a mixture of ice and liquid and T=TM                              PFLCLD1A.542    
!                                                                          PFLCLD1A.543    
!      Form test temperature assuming all ice                              PFLCLD1A.544    
!      N.B. total cloud water stored in QCL at this stage                  PFLCLD1A.545    
!-----------------------------------------------------------------------   PFLCLD1A.546    
                                                                           PFLCLD1A.547    
            TESTT =T(I)+LFRCP*QCL(I)                                       PFLCLD1A.548    
            IF(TESTT .LT. TM) THEN       ! Frozen case                     PFLCLD1A.549    
              QCF(I)=QCL(I)                                                PFLCLD1A.550    
              T(I)=TESTT                                                   PFLCLD1A.551    
            ELSE                         ! Mixed phase case                PFLCLD1A.552    
              QCF(I)= CPRLF*(TM-T(I))                                      PFLCLD1A.553    
              T(I)=TM                                                      PFLCLD1A.554    
            ENDIF                        ! End frozen                      PFLCLD1A.555    
          ENDIF                          ! End liquid                      PFLCLD1A.556    
                                                                           PFLCLD1A.557    
!-----------------------------------------------------------------------   PFLCLD1A.558    
! 3.5 Calculate 1st approx. to cloud liquid water content.                 PFLCLD1A.559    
!-----------------------------------------------------------------------   PFLCLD1A.560    
                                                                           PFLCLD1A.561    
          QCL(I) = QCL(I) - QCF(I)                                         PFLCLD1A.562    
        ENDDO ! Loop over points                                           PFLCLD1A.563    
                                                                           PFLCLD1A.564    
!-----------------------------------------------------------------------   PFLCLD1A.565    
! 4. Iteration to find better cloud water values.                          PFLCLD1A.566    
!-----------------------------------------------------------------------   PFLCLD1A.567    
                                                                           PFLCLD1A.568    
        IF(ITS.GE.2) THEN                                                  PFLCLD1A.569    
         DO N=2,ITS                                                        PFLCLD1A.570    
                                                                           PFLCLD1A.571    
          CALL QSAT(QS,T,P,POINTS)                                         PFLCLD1A.572    
                                                                           PFLCLD1A.573    
          DO I=1,POINTS                                                    PFLCLD1A.574    
           IF(T(I).GT.TL(I)) THEN                                          PFLCLD1A.575    
            ! N.B. Cloud water > 0 implies T > TL and so the               PFLCLD1A.576    
            !        denominator in the following statement is non-zero.   PFLCLD1A.577    
            ALPHAL=(QS(I)-QSL(I))/(T(I)-TL(I))                             PFLCLD1A.578    
            ALPHAL=WTN*ALPHAL+(1.0-WTN)*ALPHAL_NM1(I)                      PFLCLD1A.579    
            ALPHAL_NM1(I)=ALPHAL                                           PFLCLD1A.580    
            FRACF=QCF(I)/(QCL(I)+QCF(I))                                   PFLCLD1A.581    
            AL=1.0/(1.0 + (LCRCP+FRACF*LFRCP)*ALPHAL)                      PFLCLD1A.582    
            IF (RHCRIT .LT. 1.) THEN                                       PFLCLD1A.583    
              BS(I)=(1.0-RHCRIT)*AL*QSL(I)                     ! P292.14   PFLCLD1A.584    
            ELSE                                                           PFLCLD1A.585    
              BS(I)=AL                                                     PFLCLD1A.586    
            ENDIF                                                          PFLCLD1A.587    
                                                                           PFLCLD1A.588    
!-----------------------------------------------------------------------   PFLCLD1A.589    
! 4.1 Calculate Nth approx. to qc (store in QCL).                          PFLCLD1A.590    
!-----------------------------------------------------------------------   PFLCLD1A.591    
                                                                           PFLCLD1A.592    
            QCL(I)=QCN(I)*BS(I)                                            PFLCLD1A.593    
                                                                           PFLCLD1A.594    
!-----------------------------------------------------------------------   PFLCLD1A.595    
! 4.2 Calculate Nth approx. spec. humidity (total minus cloud water).      PFLCLD1A.596    
!-----------------------------------------------------------------------   PFLCLD1A.597    
                                                                           PFLCLD1A.598    
            Q(I)=QW(I)-QCL(I)                                              PFLCLD1A.599    
                                                                           PFLCLD1A.600    
!-----------------------------------------------------------------------   PFLCLD1A.601    
! 4.3 Perform  partition of cloud water into liquid and ice                PFLCLD1A.602    
!     components, and calculate Nth approx. to temperature,                PFLCLD1A.603    
!     accounting for latent heating.                                       PFLCLD1A.604    
!     First assume cloud water is all liquid.                              PFLCLD1A.605    
!-----------------------------------------------------------------------   PFLCLD1A.606    
                                                                           PFLCLD1A.607    
            T(I)=TL(I)+LCRCP*QCL(I)                                        PFLCLD1A.608    
            IF(T(I) .GT. TM) THEN        ! Liquid case                     PFLCLD1A.609    
              QCF(I)=0.0                                                   PFLCLD1A.610    
            ELSE                         ! Frozen or mixed phase           PFLCLD1A.611    
                                                                           PFLCLD1A.612    
!-----------------------------------------------------------------------   PFLCLD1A.613    
! 4.4 Cloud ice present; either all cloud water is cloud ice and T<TM      PFLCLD1A.614    
!     or a mixture of ice and liquid and T=TM                              PFLCLD1A.615    
!                                                                          PFLCLD1A.616    
!      Form test temperature assuming all ice                              PFLCLD1A.617    
!      N.B. total cloud water stored in QCL at this stage                  PFLCLD1A.618    
!-----------------------------------------------------------------------   PFLCLD1A.619    
                                                                           PFLCLD1A.620    
              TESTT =T(I)+LFRCP*QCL(I)                                     PFLCLD1A.621    
              IF(TESTT .LT. TM) THEN     ! Frozen case                     PFLCLD1A.622    
                QCF(I)=QCL(I)                                              PFLCLD1A.623    
                T(I)=TESTT                                                 PFLCLD1A.624    
              ELSE                       ! Mixed phase case                PFLCLD1A.625    
                QCF(I)= CPRLF*(TM-T(I))                                    PFLCLD1A.626    
                T(I)=TM                                                    PFLCLD1A.627    
              ENDIF                      ! End frozen                      PFLCLD1A.628    
            ENDIF                        ! End liquid                      PFLCLD1A.629    
                                                                           PFLCLD1A.630    
!-----------------------------------------------------------------------   PFLCLD1A.631    
! 4.5 Calculate Nth approx. to cloud liquid water content.                 PFLCLD1A.632    
!-----------------------------------------------------------------------   PFLCLD1A.633    
                                                                           PFLCLD1A.634    
            QCL(I) = QCL(I) - QCF(I)                                       PFLCLD1A.635    
           ENDIF ! T > TL                                                  PFLCLD1A.636    
          ENDDO ! Loop over points                                         PFLCLD1A.637    
         ENDDO ! Loop over iterations                                      PFLCLD1A.638    
        ENDIF ! ITS ge 2                                                   PFLCLD1A.639    
                                                                           PFLCLD1A.640    
!-----------------------------------------------------------------------   PFLCLD1A.641    
! 5. Finally scatter back results                                          PFLCLD1A.642    
!-----------------------------------------------------------------------   PFLCLD1A.643    
                                                                           PFLCLD1A.644    
CDIR$ IVDEP                                                                PFLCLD1A.645    
      DO I=1,POINTS                                                        PFLCLD1A.646    
        Q_F(INDEX(I)) = Q(I)                                               PFLCLD1A.647    
        T_F(INDEX(I)) = T(I)                                               PFLCLD1A.648    
        QCF_F(INDEX(I)) = QCF(I)                                           PFLCLD1A.649    
        QCL_F(INDEX(I)) = QCL(I)                                           PFLCLD1A.650    
        QC_F(INDEX(I)) = QCL(I) + QCF(I)                                   PFLCLD1A.651    
        CF_F(INDEX(I)) = CF(I)                                             PFLCLD1A.652    
        GRID_QC_F(INDEX(I)) = BS(I) * QN_F(INDEX(I))                       PFLCLD1A.653    
        BS_F(INDEX(I)) = BS(I)                                             PFLCLD1A.654    
      END DO ! Loop over points                                            PFLCLD1A.655    
                                                                           PFLCLD1A.656    
      RETURN                                                               PFLCLD1A.657    
      END                                                                  PFLCLD1A.658    
*ENDIF                                                                     PFLCLD1A.659