*IF DEF,C92_1A                                                             TROP1A.2      
C ******************************COPYRIGHT******************************    GTS2F400.10657  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.10658  
C                                                                          GTS2F400.10659  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.10660  
C restrictions as set forth in the contract.                               GTS2F400.10661  
C                                                                          GTS2F400.10662  
C                Meteorological Office                                     GTS2F400.10663  
C                London Road                                               GTS2F400.10664  
C                BRACKNELL                                                 GTS2F400.10665  
C                Berkshire UK                                              GTS2F400.10666  
C                RG12 2SZ                                                  GTS2F400.10667  
C                                                                          GTS2F400.10668  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.10669  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.10670  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.10671  
C Modelling at the above address.                                          GTS2F400.10672  
C ******************************COPYRIGHT******************************    GTS2F400.10673  
C                                                                          GTS2F400.10674  
CLL  SUBROUTINE TROP--------------------------------------------------     TROP1A.3      
CLL                                                                        TROP1A.4      
CLL  Purpose:  Calculates tropopause temperature and pressure.             TROP1A.5      
CLL            (This version uses approximation that z is linear with      TROP1A.6      
CLL            Exner function within a layer)                              TROP1A.7      
CLL            Note also routine TROPIN - any physical changes to one      AWI1F402.36     
CLL            should be considered for mirroring in the other.            AWI1F402.37     
CLL                                                                        TROP1A.8      
CLL AD,DR,RS    <- programmer of some or all of previous code or changes   TROP1A.9      
CLL                                                                        TROP1A.10     
CLL  Model            Modification history from model version 3.0:         TROP1A.11     
CLL version  Date                                                          TROP1A.12     
CLL   3.2  19/04/93  Code for new real missing data indicator (TCJ).       TJ050593.122    
CLL                                                                        TROP1A.13     
CLL   3.3  25/11/93  Ensure no overshoot for trop height  (C Wilson)       CW251193.1      
CLL   4.2  Nov. 96   T3E migration: Hf functions & *DEF CRAY replaced      GSS5F402.376    
CLL                  by T3E function rtor_v & *DEF T3E; code               GSS5F402.377    
CLL                  restructured appropriately.  S.J.Swarbrick            GSS5F402.378    
CLL   4.4  18/06/97  Initialise P_EXNER_T. Set PT to RMDI if               GDR2F404.8      
CLL                  Tropopause not found. S. Lorrimer                     GDR2F404.9      
CLL                                                                        CW251193.2      
CLL  Logical components covered: P3                                        TROP1A.14     
CLL                                                                        TROP1A.15     
CLL  Project task:                                                         TROP1A.16     
CLL                                                                        TROP1A.17     
CLL  Documentation: The interpolation formulae are described in            TROP1A.18     
CLL                 unified model on-line documentation paper S1.          TROP1A.19     
CLL                                                                        TROP1A.20     
CLLEND----------------------------------------------------------------     TROP1A.21     
C                                                                          TROP1A.22     
C*L  Arguments:-------------------------------------------------------     TROP1A.23     

      SUBROUTINE TROP                                                       2TROP1A.24     
     *(PSTAR,THETA,P_EXNER_HALF,ZH,TT,PT,ZT,POINTS,P_LEVELS,               TROP1A.25     
     * MIN_TROP_LEVEL,AKH,BKH)                                             TROP1A.26     
                                                                           TROP1A.27     
      IMPLICIT NONE                                                        TROP1A.28     
                                                                           TROP1A.29     
      INTEGER                                                              TROP1A.30     
     * POINTS    !IN Number of points to be processed                      TROP1A.31     
     *,P_LEVELS  !IN Number of model levels                                TROP1A.32     
     *,MIN_TROP_LEVEL  !IN Level no. for lowest possible tropopause.       TROP1A.33     
     *                 !   Set to first level above boundary layer         TROP1A.34     
                                                                           TROP1A.35     
      REAL                                                                 TROP1A.36     
     * PSTAR(POINTS)          !IN P Star                                   TROP1A.37     
     *,THETA(POINTS,P_LEVELS) !IN Potential temperature at full levels     TROP1A.38     
     *,P_EXNER_HALF(POINTS,P_LEVELS+1) !IN Exner pressure at model         TROP1A.39     
     *                                 !   half levels                     TROP1A.40     
     *,ZH(POINTS,P_LEVELS+1)  !IN Height of model half levels              TROP1A.41     
     *,AKH(P_LEVELS+1)        !IN Hybrid Coords. A values for half levs.   TROP1A.42     
     *,BKH(P_LEVELS+1)        !IN Hybrid Coords. B values for half levs.   TROP1A.43     
     *,TT(POINTS)             !OUT Temperature of tropopause               TROP1A.44     
     *,PT(POINTS)             !OUT Pressure of tropopause                  TROP1A.45     
     *,ZT(POINTS)             !OUT Height of tropopause                    TROP1A.46     
                                                                           TROP1A.47     
C Workspace usage:-----------------------------------------------------    TROP1A.48     
       REAL LAPSE_RATE(POINTS,MIN_TROP_LEVEL:P_LEVELS)                     TROP1A.49     
       LOGICAL LTROP(POINTS)                                               TROP1A.50     
C External subroutines called:-----------------------------------------    TROP1A.51     
C*---------------------------------------------------------------------    TROP1A.53     
C Define local variables:----------------------------------------------    TROP1A.54     
      INTEGER I,J,JP1                                                      TROP1A.55     
      REAL PJP1,PJ,PJM1  !  Pressures at half levels J+1/J/J-1             TROP1A.56     
      REAL P_EXNER_FULL_J,P_EXNER_FULL_JM1                                 TROP1A.57     
     *,DEL_EXNER_J,DEL_EXNER_JM1,TERM1,TERM2                               TROP1A.58     
     *,ZDT                                                                 GSS5F402.379    
     *,ZDJM1,ZDJ                                                           TROP1A.60     
C     REAL P_EXNER_T                                                       GSS5F402.380    
      REAL P_EXNER_T(POINTS)                                               GSS5F402.381    
      REAL POWER(POINTS)                                                   GSS5F402.382    
C----------------------------------------------------------------------    TROP1A.64     
C Constants from comdecks:---------------------------------------------    TROP1A.65     
*CALL C_MDI                                                                TJ050593.123    
*CALL C_G                                                                  TROP1A.66     
*CALL C_R_CP                                                               TROP1A.67     
*CALL C_LAPSE                                                              TROP1A.68     
                                                                           TROP1A.69     
CL 1. Set up local constants and initialise arrays                         TROP1A.70     
                                                                           TROP1A.71     
      REAL CP_OVER_G,ONE_OVER_KAPPA,P_EXNER_500,P_EXNER_50                 TROP1A.72     
      PARAMETER(CP_OVER_G=CP/G)                                            TROP1A.73     
      PARAMETER(ONE_OVER_KAPPA=1./KAPPA)                                   TROP1A.74     
                                                                           TROP1A.75     
C----------------------------------------------------------------------    TROP1A.76     
                                                                           TROP1A.77     
*CALL P_EXNERC                                                             TROP1A.78     
                                                                           TROP1A.79     
      P_EXNER_500=(500./1000.)**KAPPA                                      TROP1A.80     
      P_EXNER_50=(50./1000.)**KAPPA                                        TROP1A.81     
                                                                           TROP1A.82     
      DO 100 I=1,POINTS                                                    TROP1A.83     
                                                                           TROP1A.84     
C Initialise logical string which indicates whether tropopause found       TROP1A.85     
C at a lower level: LTROP=T is not found; LTROP=F is found.                TROP1A.86     
                                                                           TROP1A.87     
      LTROP(I)=.TRUE.                                                      TROP1A.88     
                                                                           TROP1A.89     
C Initialise tropopause height and pressure to missing data                TROP1A.90     
                                                                           TROP1A.91     
      P_EXNER_T(I)=0                                                       GDR2F404.10     
      TT(I)=RMDI                                                           TJ050593.125    
      ZT(I)=RMDI                                                           TJ050593.126    
                                                                           TROP1A.95     
100   CONTINUE                                                             TROP1A.96     
                                                                           TROP1A.97     
CL 2. Compute lapse rate between full levels: equation (3.16)              TROP1A.98     
                                                                           TROP1A.99     
                                                                           TROP1A.100    
      DO 200 J=MIN_TROP_LEVEL,P_LEVELS                                     TROP1A.101    
      DO 210 I=1,POINTS                                                    TROP1A.102    
                                                                           TROP1A.103    
C Exner pressure at full levels                                            TROP1A.104    
      PJP1 = AKH(J+1) + BKH(J+1)*PSTAR(I)                                  TROP1A.105    
      PJ   = AKH(J)   + BKH(J)  *PSTAR(I)                                  TROP1A.106    
      PJM1 = AKH(J-1) + BKH(J-1)*PSTAR(I)                                  TROP1A.107    
      P_EXNER_FULL_J = P_EXNER_C                                           TROP1A.108    
     +(P_EXNER_HALF(I,J+1),P_EXNER_HALF(I,J),PJP1,PJ,KAPPA)                TROP1A.109    
      P_EXNER_FULL_JM1 = P_EXNER_C                                         TROP1A.110    
     +(P_EXNER_HALF(I,J),P_EXNER_HALF(I,J-1),PJ,PJM1,KAPPA)                TROP1A.111    
                                                                           TROP1A.112    
C Exner pressure difference across half layers                             TROP1A.113    
      DEL_EXNER_J=P_EXNER_HALF(I,J)-P_EXNER_FULL_J                         TROP1A.114    
      DEL_EXNER_JM1=P_EXNER_FULL_JM1-P_EXNER_HALF(I,J)                     TROP1A.115    
                                                                           TROP1A.116    
C Denominator                                                              TROP1A.117    
      TERM2=CP_OVER_G*(THETA(I,J-1)*DEL_EXNER_JM1                          TROP1A.118    
     *       +THETA(I,J)*DEL_EXNER_J)                                      TROP1A.119    
                                                                           TROP1A.120    
C Numerator                                                                TROP1A.121    
      TERM1=THETA(I,J-1)*P_EXNER_FULL_JM1-THETA(I,J)*P_EXNER_FULL_J        TROP1A.122    
                                                                           TROP1A.123    
C Lapse rate between level j-1 and j                                       TROP1A.124    
      LAPSE_RATE(I,J)=TERM1/TERM2                                          TROP1A.125    
210   CONTINUE                                                             TROP1A.126    
200   CONTINUE                                                             TROP1A.127    
                                                                           TROP1A.128    
CL 3. Calculate tropopause temperature, height  and pressure               TROP1A.129    
                                                                           TROP1A.130    
      DO 300 J=MIN_TROP_LEVEL+1,P_LEVELS                                   TROP1A.131    
                                                                           TROP1A.132    
C 'J+1' level for lapse rate test; allows J iteration up to P_LEVELS       TROP1A.133    
      JP1=MIN(J+1,P_LEVELS)                                                TROP1A.134    
                                                                           TROP1A.135    
      DO 310 I=1,POINTS                                                    TROP1A.136    
                                                                           TROP1A.137    
C Exner pressure at full levels                                            TROP1A.138    
      PJP1 = AKH(J+1) + BKH(J+1)*PSTAR(I)                                  TROP1A.139    
      PJ   = AKH(J)   + BKH(J)  *PSTAR(I)                                  TROP1A.140    
      PJM1 = AKH(J-1) + BKH(J-1)*PSTAR(I)                                  TROP1A.141    
      P_EXNER_FULL_J = P_EXNER_C                                           TROP1A.142    
     +(P_EXNER_HALF(I,J+1),P_EXNER_HALF(I,J),PJP1,PJ,KAPPA)                TROP1A.143    
      P_EXNER_FULL_JM1 = P_EXNER_C                                         TROP1A.144    
     +(P_EXNER_HALF(I,J),P_EXNER_HALF(I,J-1),PJ,PJM1,KAPPA)                TROP1A.145    
                                                                           TROP1A.146    
C Criteria for layer containing tropopause                                 TROP1A.147    
C (where 'layer' is interval between level j and level j-1)                TROP1A.148    
      IF(P_EXNER_FULL_J.LT.P_EXNER_500.AND.                                TROP1A.149    
     * P_EXNER_FULL_JM1.GT.P_EXNER_50.AND.                                 TROP1A.150    
     * LAPSE_RATE(I,J).LT.LAPSE_TROP.AND.                                  TROP1A.151    
     * LAPSE_RATE(I,JP1).LT.LAPSE_TROP.AND.                                TROP1A.152    
     * LTROP(I))THEN                                                       TROP1A.153    
                                                                           TROP1A.154    
C Reset logical string to say tropopause now found                         AWI1F402.38     
      LTROP(I)=.FALSE.                                                     TROP1A.156    
                                                                           TROP1A.157    
C Z(j-1)-Z(j-1/2); Z(j)-Z(j-1/2)                                           TROP1A.158    
      ZDJM1=CP_OVER_G*THETA(I,J-1)*(P_EXNER_HALF(I,J)-P_EXNER_FULL_JM1)    TROP1A.159    
      ZDJ=CP_OVER_G*THETA(I,J)*(P_EXNER_HALF(I,J)-P_EXNER_FULL_J)          TROP1A.160    
                                                                           TROP1A.161    
C Z(tropopause) - Z(j-1/2): equation (3.19)                                TROP1A.162    
      ZDT=(THETA(I,J-1)*P_EXNER_FULL_JM1-THETA(I,J)*P_EXNER_FULL_J         TROP1A.163    
     *+LAPSE_RATE(I,J-1)*ZDJM1                                             TROP1A.164    
     *-LAPSE_RATE(I,JP1)*ZDJ)                                              TROP1A.165    
     */(LAPSE_RATE(I,J-1)-LAPSE_RATE(I,JP1))                               TROP1A.166    
                                                                           TROP1A.167    
C Ensure trop level doesn't undershoot Z(j-1)                              CW251193.3      
      ZDT=MAX(ZDT,ZDJM1)                                                   TROP1A.169    
                                                                           CW251193.4      
C Ensure trop level doesn't overshoot Z(j)                                 CW251193.5      
      ZDT=MIN(ZDT,ZDJ)                                                     CW251193.6      
                                                                           TROP1A.170    
C Tropopause height                                                        TROP1A.171    
      ZT(I)=ZDT+ZH(I,J)                                                    TROP1A.172    
                                                                           TROP1A.173    
C Tropopause temperature : equation (3.20)                                 TROP1A.174    
      TT(I)=THETA(I,J)*P_EXNER_FULL_J                                      TROP1A.175    
     *     -LAPSE_RATE(I,JP1)*(ZDT-ZDJ)                                    TROP1A.176    
                                                                           TROP1A.177    
C Exner pressure of tropopause: equation (3.22)                            TROP1A.178    
      IF(ZDT.GT.0.0)THEN                                                   TROP1A.179    
        P_EXNER_T(I)=P_EXNER_HALF(I,J)-G*ZDT/(CP*THETA(I,J))               GSS5F402.383    
      ELSE                                                                 TROP1A.181    
        P_EXNER_T(I)=P_EXNER_HALF(I,J)-G*ZDT/(CP*THETA(I,J-1))             GSS5F402.384    
      ENDIF                                                                TROP1A.183    
                                                                           TROP1A.191    
      ENDIF                                                                TROP1A.192    
                                                                           TROP1A.193    
310   CONTINUE                                                             TROP1A.194    
300   CONTINUE                                                             TROP1A.195    
                                                                           GSS5F402.385    
C Pressure of tropopause: equation (3.21)                                  GSS5F402.386    
*IF DEF,VECTLIB                                                            PXVECTLB.147    
      DO I=1,POINTS                                                        GSS5F402.388    
        POWER(I)=ONE_OVER_KAPPA                                            GSS5F402.389    
      END DO                                                               GSS5F402.390    
      call rtor_v(points,P_EXNER_T,POWER,P_EXNER_T)                        GSS5F402.391    
*ELSE                                                                      GSS5F402.392    
      DO I=1,POINTS                                                        GSS5F402.393    
        P_EXNER_T(I)=P_EXNER_T(I)**ONE_OVER_KAPPA                          GSS5F402.394    
      END DO                                                               GSS5F402.395    
*ENDIF                                                                     GSS5F402.396    
      DO I=1,POINTS                                                        GSS5F402.397    
        PT(I)=PREF*P_EXNER_T(I)                                            GSS5F402.398    
        IF (LTROP(I)) THEN                                                 GDR2F404.11     
          PT(I)=RMDI                                                       GDR2F404.12     
        ENDIF                                                              GDR2F404.13     
                                                                           GDR2F404.14     
      END DO                                                               GSS5F402.399    
                                                                           TROP1A.196    
      RETURN                                                               TROP1A.197    
      END                                                                  TROP1A.198    
*ENDIF                                                                     TROP1A.199