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

      SUBROUTINE QSAT_VARS(fixhd,len_fixhd,pstar,                           2,1QSATVAR1.24     
     &                    levdepc,len1_levdepc,len2_levdepc,               QSATVAR1.25     
     &                    p_levels,q_levels,                               QSATVAR1.26     
     &                    p_field,level,                                   QSATVAR1.27     
     &                    d1,d2,d3,d4)                                     QSATVAR1.28     
                                                                           QSATVAR1.29     
      IMPLICIT NONE                                                        QSATVAR1.30     
!                                                                          QSATVAR1.31     
! Description: Calculates the relative humidity and rate of change of      QSATVAR1.32     
!              saturated vapour pressure (es) wrt temperature on PF        QSATVAR1.33     
!              theta levels.                                               QSATVAR1.34     
!                                                                          QSATVAR1.35     
! Method:                                                                  QSATVAR1.36     
!                                                                          QSATVAR1.37     
! Current Code Owner: I Edmond                                             QSATVAR1.38     
!                                                                          QSATVAR1.39     
! History:                                                                 QSATVAR1.40     
! Version   Date     Comment                                               QSATVAR1.41     
! -------   ----     -------                                               QSATVAR1.42     
! 4.1       15/6/96  Original code. Ian Edmond                             QSATVAR1.43     
! 4.4      09/04/97  Comments about thetaL qT changed to theta and         PXDG1406.1      
!                    in line with changes made in UMDP107 Ian Edmond       PXDG1406.2      
! 4.5      14/09/98  Optimisation changes for T3E D.M. Goddard             PXDG1406.3      
! 4.6      29/07/99  Correct compile error in non-T3E branch D.M. Goddar   PXDG1406.4      
! 4.5       29/07/98 Optimisation changes for T3E Rewrote **KAPPA          UDG5F405.514    
!                    calculations to reduce number of "**"'s and           UDG5F405.515    
!                    replaced "**"'s with vector function powr_v           UDG5F405.516    
!                    Author D.M. Goddard                                   UDG5F405.517    
!                                                                          QSATVAR1.44     
! Code Description:                                                        QSATVAR1.45     
!   Language: FORTRAN 77 + common extensions.                              QSATVAR1.46     
!   This code is written to UMDP3 v6 programming standards.                QSATVAR1.47     
!                                                                          QSATVAR1.48     
! System component covered: <appropriate code>                             QSATVAR1.49     
! System Task:              <appropriate code>                             QSATVAR1.50     
!                                                                          QSATVAR1.51     
! Declarations:                                                            QSATVAR1.52     
!   These are of the form:-                                                QSATVAR1.53     
!     INTEGER      ExampleVariable      !Description of variable           QSATVAR1.54     
!                                                                          QSATVAR1.55     
! 1.0 Global variables (*CALLed COMDECKs etc...):                          QSATVAR1.56     
*CALL C_R_CP                                                               QSATVAR1.57     
                                                                           QSATVAR1.58     
! Subroutine arguments                                                     QSATVAR1.59     
!   Scalar arguments with intent(in):                                      QSATVAR1.60     
      INTEGER                                                              QSATVAR1.61     
     & level                                                               QSATVAR1.62     
     &,len_fixhd     ! Length of fixed length header                       QSATVAR1.63     
     &,len2_levdepc  ! 2nd dim of lev dep consts                           QSATVAR1.64     
     &,len1_levdepc  ! 1st dim of lev dep consts                           QSATVAR1.65     
     &,p_field       ! No of p-points per level                            QSATVAR1.66     
     &,p_levels      ! No of levels                                        QSATVAR1.67     
     &,q_levels      ! No of wet levels                                    QSATVAR1.68     
                                                                           QSATVAR1.69     
!   Array  arguments with intent(in):                                      QSATVAR1.70     
      INTEGER                                                              QSATVAR1.71     
     & fixhd(256)                                                          QSATVAR1.72     
                                                                           QSATVAR1.73     
      REAL                                                                 QSATVAR1.74     
     & levdepc(1+len1_levdepc*len2_levdepc)                                QSATVAR1.75     
                                                                           QSATVAR1.76     
!   Array  arguments with intent(InOut):                                   QSATVAR1.77     
       REAL                                                                QSATVAR1.78     
     & d1(p_field)      ! Theta / T on PF theta or UM full levels          UIE2F404.1324   
     &,d2(p_field)      ! q on PF theta or UM full levels                  QSATVAR1.80     
                                                                           QSATVAR1.81     
!   Scalar arguments with intent(out):                                     QSATVAR1.82     
                                                                           QSATVAR1.83     
!   Array  arguments with intent(out):                                     QSATVAR1.84     
       REAL                                                                QSATVAR1.85     
     & d3(p_field)      ! RH/qs on PF theta or UM full levels              QSATVAR1.86     
     &,d4(p_field)      ! dlnesBydT on PF theta or UM full levels          QSATVAR1.87     
                                                                           QSATVAR1.88     
!   ErrorStatus                                                            QSATVAR1.89     
       INTEGER                                                             QSATVAR1.90     
     & len_io                                                              QSATVAR1.91     
     &,icode                ! Return code; successful=0                    QSATVAR1.92     
                            !                 error > 0                    QSATVAR1.93     
       CHARACTER*(40)                                                      QSATVAR1.94     
     & cmessage             ! Error message If icode > 0                   QSATVAR1.95     
                                                                           QSATVAR1.96     
! Local scalars:                                                           QSATVAR1.97     
       INTEGER                                                             QSATVAR1.98     
     & i                                                                   QSATVAR1.99     
                                                                           QSATVAR1.100    
      REAL                                                                 QSATVAR1.101    
     & press1    !Intermediate temporaries used in calc of pstar           QSATVAR1.102    
     &,press2    !Intermediate temporaries used in calc of pstar           QSATVAR1.103    
     &,pexner1                                                             QSATVAR1.104    
     &,pexner2                                                             QSATVAR1.105    
                                                                           QSATVAR1.106    
! Local dynamic arrays:                                                    QSATVAR1.107    
      REAL                                                                 QSATVAR1.108    
     & pstar(p_field)          ! Pstar on output grid                      QSATVAR1.109    
     &,pfield(p_field)         ! Pressure of individual output level       QSATVAR1.110    
     &,exner(p_field)          ! Exner pressure on output half levels      QSATVAR1.111    
     &                         ! or theta levels.                          QSATVAR1.112    
*IF DEF,VECTLIB                                                            PXVECTLB.126    
     &,a_pexner1(p_field)                                                  UDG5F405.519    
     &,a_pexner2(p_field)                                                  UDG5F405.520    
     &,a_pexner1_kappa(p_field)                                            UDG5F405.521    
     &,a_pexner2_kappa(p_field)                                            UDG5F405.522    
*ENDIF                                                                     UDG5F405.523    
! Function & Subroutine calls:                                             UDG5F405.524    
      External qsat_pf                                                     UDG5F405.525    
!- End of header                                                           QSATVAR1.114    
                                                                           QSATVAR1.116    
*IF DEF,VECTLIB                                                            PXVECTLB.127    
         If (fixhd(3).eq.5) then ! LS dump                                 UDG5F405.527    
                                                                           UDG5F405.528    
          Do i=1,p_field                                                   UDG5F405.529    
          ! Find exner pressures on theta levels on PF vertical grid       UDG5F405.530    
          ! if LS variables. Otherwise (UM variables) use exner pressure   UDG5F405.531    
          ! on full UM levels.                                             UDG5F405.532    
                                                                           UDG5F405.533    
           press1 = levdepc(level)                                         UDG5F405.534    
     &              + levdepc(level+p_levels) * pstar(i)                   UDG5F405.535    
           a_pexner1(i) = (press1 / pref)                                  UDG5F405.536    
                                                                           UDG5F405.537    
          ! Exner pressure at pressure level just above theta level        UDG5F405.538    
          ! of interest on PF vertical grid.                               UDG5F405.539    
           press2 = levdepc(level+1)                                       UDG5F405.540    
     &              + levdepc(level+1+p_levels) * pstar(i)                 UDG5F405.541    
           a_pexner2(i) = (press2 / pref)                                  UDG5F405.542    
          End Do                                                           UDG5F405.543    
          call powr_v(p_field,a_pexner1,kappa,a_pexner1_kappa)             UDG5F405.544    
          call powr_v(p_field,a_pexner2,kappa,a_pexner2_kappa)             UDG5F405.545    
                                                                           UDG5F405.546    
          Do i=1,p_field                                                   UDG5F405.547    
                                                                           UDG5F405.548    
          ! Pressures on theta levels of PF vertical grid read into        UDG5F405.549    
          ! pfield for each level separately.                              UDG5F405.550    
           pexner2=a_pexner2_kappa(i)                                      UDG5F405.551    
           pexner1=a_pexner1_kappa(i)                                      UDG5F405.552    
           pfield(i) =   (pexner2 - pexner1)                               UDG5F405.553    
     &                  / ( (a_pexner2(i)                                  UDG5F405.554    
     &                    -  a_pexner1(i) ) * kappa)                       UDG5F405.555    
         End Do                                                            UDG5F405.556    
         call powr_v(p_field,pfield,(1/(kappa-1)),pfield)                  UDG5F405.557    
                                                                           UDG5F405.558    
         Do i=1,p_field                                                    UDG5F405.559    
                                                                           UDG5F405.560    
         pfield(i)=pfield(i)*pref                                          UDG5F405.561    
                                                                           UDG5F405.562    
         End Do                                                            UDG5F405.563    
                                                                           UDG5F405.564    
        else if (fixhd(3).eq.1) then ! UM dump                             UDG5F405.565    
                                                                           UDG5F405.566    
         Do i=1,p_field                                                    UDG5F405.567    
           pfield(i) = levdepc(level)                                      UDG5F405.568    
     &                 + levdepc(level+p_levels) * pstar(i)                UDG5F405.569    
         Enddo                                                             UDG5F405.570    
                                                                           UDG5F405.571    
        else                                                               UDG5F405.572    
                                                                           UDG5F405.573    
          write(*,*)'Check vertical coordinate type of dump'               UDG5F405.574    
                                                                           UDG5F405.575    
        end if                                                             UDG5F405.576    
                                                                           UDG5F405.577    
        Do i=1,p_field                                                     UDG5F405.578    
                                                                           UDG5F405.579    
         ! Exner pressures on theta levels on PF vertical grid or          UDG5F405.580    
         ! full levels on UM grid.                                         UDG5F405.581    
         exner(i) = (pfield(i) / pref)                                     UDG5F405.582    
                                                                           UDG5F405.583    
        End Do                                                             UDG5F405.584    
        call powr_v(p_field,exner,kappa,exner)                             UDG5F405.585    
                                                                           UDG5F405.586    
        Do i=1,p_field                                                     UDG5F405.587    
         ! Find T from theta and the theta level exner pressure.           UDG5F405.588    
         d1(i) = d1(i) * exner(i)                                          UDG5F405.589    
        End do                                                             UDG5F405.590    
*ELSE                                                                      UDG5F405.591    
         Do i=1,p_field                                                    PXDG1406.5      
                                                                           QSATVAR1.118    
          ! Find exner pressures on theta levels on PF vertical grid       QSATVAR1.119    
          ! if LS variables. Otherwise (UM variables) use exner pressure   QSATVAR1.120    
          ! on full UM levels.                                             QSATVAR1.121    
          If (fixhd(3).eq.5) then ! LS dump                                QSATVAR1.122    
                                                                           QSATVAR1.123    
           press1 = levdepc(level)                                         QSATVAR1.124    
     &              + levdepc(level+p_levels) * pstar(i)                   QSATVAR1.125    
           pexner1 = (press1 / pref)**kappa                                QSATVAR1.126    
                                                                           QSATVAR1.127    
          ! Exner pressure at pressure level just above theta level        QSATVAR1.128    
          ! of interest on PF vertical grid.                               QSATVAR1.129    
           press2 = levdepc(level+1)                                       QSATVAR1.130    
     &              + levdepc(level+1+p_levels) * pstar(i)                 QSATVAR1.131    
           pexner2 = (press2 / pref)**kappa                                QSATVAR1.132    
                                                                           QSATVAR1.133    
          ! Pressures on theta levels of PF vertical grid read into        QSATVAR1.134    
          ! pfield for each level separately.                              QSATVAR1.135    
           pfield(i) = (  (pexner2 - pexner1)                              QSATVAR1.136    
     &                  / ( (pexner2**(1/kappa)                            QSATVAR1.137    
     &                    -  pexner1**(1/kappa) ) * kappa)                 QSATVAR1.138    
     &                 )**(1/(kappa-1))*pref                               QSATVAR1.139    
                                                                           QSATVAR1.140    
         else if (fixhd(3).eq.1) then ! UM dump                            QSATVAR1.141    
                                                                           QSATVAR1.142    
           pfield(i) = levdepc(level)                                      QSATVAR1.143    
     &                 + levdepc(level+p_levels) * pstar(i)                QSATVAR1.144    
                                                                           QSATVAR1.145    
         else                                                              QSATVAR1.146    
                                                                           QSATVAR1.147    
           write(*,*)'Check vertical coordinate type of dump'              QSATVAR1.148    
                                                                           QSATVAR1.149    
         End if                                                            QSATVAR1.150    
                                                                           QSATVAR1.151    
         ! Exner pressures on theta levels on PF vertical grid or          QSATVAR1.152    
         ! full levels on UM grid.                                         QSATVAR1.153    
         exner(i) = (pfield(i) / pref)**kappa                              QSATVAR1.154    
                                                                           QSATVAR1.155    
         ! Find T from theta and the theta level exner pressure.           UIE2F404.1325   
         d1(i) = d1(i) * exner(i)                                          QSATVAR1.157    
                                                                           QSATVAR1.158    
        End do                                                             QSATVAR1.159    
*ENDIF                                                                     UDG5F405.592    
                                                                           QSATVAR1.160    
       ! Saturated mixing ratio qs for a single level read into d3.        QSATVAR1.161    
       ! Rate of change of saturated vapour pressure es wrt temperature    QSATVAR1.162    
       ! for a single level read into d4.                                  QSATVAR1.163    
         Call qsat_pf(d3,         ! OUT qs                                 QSATVAR1.164    
     &                d4,         ! OUT dlnesBydT                          QSATVAR1.165    
     &                d1,         ! IN  TL                                 QSATVAR1.166    
     &                pfield,     ! IN  P on PF theta levels               QSATVAR1.167    
     &                p_field)    ! IN  Size of fields                     QSATVAR1.168    
                                                                           QSATVAR1.169    
         Do i=1,p_field                                                    QSATVAR1.170    
                                                                           QSATVAR1.171    
          ! By definition, RH = q/qs.                                      QSATVAR1.172    
           d3(i) = d2(i)/d3(i)                                             QSATVAR1.173    
                                                                           QSATVAR1.174    
          ! Convert temperature back into theta using theta level          QSATVAR1.175    
          ! exner pressures. T -> Theta = d1                               UIE2F404.1326   
           d1(i) = d1(i) / exner(i)                                        QSATVAR1.177    
                                                                           QSATVAR1.178    
         End do ! i                                                        QSATVAR1.179    
                                                                           QSATVAR1.180    
      RETURN                                                               QSATVAR1.181    
      END                                                                  QSATVAR1.182    
*ENDIF                                                                     UDG5F405.593