*IF DEF,A06_3A                                                             GWVERT3A.2      
C ******************************COPYRIGHT******************************    GTS2F400.3727   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.3728   
C                                                                          GTS2F400.3729   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.3730   
C restrictions as set forth in the contract.                               GTS2F400.3731   
C                                                                          GTS2F400.3732   
C                Meteorological Office                                     GTS2F400.3733   
C                London Road                                               GTS2F400.3734   
C                BRACKNELL                                                 GTS2F400.3735   
C                Berkshire UK                                              GTS2F400.3736   
C                RG12 2SZ                                                  GTS2F400.3737   
C                                                                          GTS2F400.3738   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.3739   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.3740   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.3741   
C Modelling at the above address.                                          GTS2F400.3742   
C ******************************COPYRIGHT******************************    GTS2F400.3743   
C                                                                          GTS2F400.3744   
! SUBROUTINE GW_VERT TO CALCULATE VERTICAL DISTRIBUTION OF GW DRAG VECTR   GWVERT3A.3      
!                                                                          GWVERT3A.4      

      SUBROUTINE GW_VERT                                                    1,8GWVERT3A.5      
     1 (PSTAR,PEXNER,THETA,Q,U,V,S_X_STRESS,S_Y_STRESS,START_L,LEVELS      GWVERT3A.6      
     2 ,Q_LEVELS,POINTS,AKH,BKH,DELTA_AK,DELTA_BK,KAY,KAY_LEE,SD_OROG      ASW1F403.33     
     3 ,S_X_OROG,S_Y_OROG,SIGMA_XX,SIGMA_XY,SIGMA_YY,TEST,DU_DT,DV_DT      GWVERT3A.8      
     4 ,K_LIFT,U_S,V_S,RHO_S                                               GWVERT3A.9      
! Diagnostics                                                              GWVERT3A.10     
     5  ,STRESS_UD,POINTS_STRESS_UD,STRESS_UD_ON                           GWVERT3A.11     
     6  ,STRESS_VD,POINTS_STRESS_VD,STRESS_VD_ON                           GWVERT3A.12     
     7  ,DU_DT_SATN,POINTS_DU_DT_SATN,DU_DT_SATN_ON                        GWVERT3A.13     
     8  ,DV_DT_SATN,POINTS_DV_DT_SATN,DV_DT_SATN_ON                        GWVERT3A.14     
     9  ,DU_DT_JUMP,POINTS_DU_DT_JUMP,DU_DT_JUMP_ON                        GWVERT3A.15     
     &  ,DV_DT_JUMP,POINTS_DV_DT_JUMP,DV_DT_JUMP_ON                        GWVERT3A.16     
     &  ,DU_DT_LEE ,POINTS_DU_DT_LEE ,DU_DT_LEE_ON                         GWVERT3A.17     
     &  ,DV_DT_LEE ,POINTS_DV_DT_LEE ,DV_DT_LEE_ON                         GWVERT3A.18     
     &  ,TRANS_D   ,POINTS_TRANS_D   ,TRANS_D_ON   )                       GWVERT3A.19     
                                                                           GWVERT3A.20     
      IMPLICIT NONE                                                        GWVERT3A.21     
! Description: TO CALCULATE VERTICAL STRESS PROFILE DUE TO SUBGRID-SCALE   GWVERT3A.22     
!        ANISOTOPIC GRAVITY WAVES AND HENCE DRAG ON MEAN FLOW.             GWVERT3A.23     
!        HYDRAULIC JUMP IS DIAGNOSED WITH TEST CONTAINING ALPHA.           GWVERT3A.24     
!        THE HEIGHT OF THE UPSTREAM DIVIDING STREAMLINE IS                 GWVERT3A.25     
!        CALCULATED FOR JUMP POINTS, AND STRESS LINEARISED TO A            GWVERT3A.26     
!        THIRD OF SURFACE STRESS AT THIS HEIGHT. THE REMAINING             GWVERT3A.27     
!        WAVES AND NON_JUMP POINTS PROPOGATE VERTICALLY WITH               GWVERT3A.28     
!        STRESS INDEPENDENT OF HEIGHT UNLESS A CRITICAL LEVEL OR           GWVERT3A.29     
!        WAVE BREAKING IS DIAGNOSED. THE CRITICAL STRESS IS CALCULATED     GWVERT3A.30     
!        BY A LAYER SATURATION HYPOTHESIS USING WIND COMPONENT PARALLEL    GWVERT3A.31     
!             TO THE ORIGINAL SURFACE STRESS INSTEAD OF SURFACE WIND.      GWVERT3A.32     
!                                                                          GWVERT3A.33     
! Method: UNIFIED MODEL DOCUMENTATION PAPER NO. ?                          GWVERT3A.34     
!         THE EQUATIONS USED ARE (4),(5),(7),(8),(9)                       GWVERT3A.35     
!                                                                          GWVERT3A.36     
! Current code owner: S.Webster                                            ASW1F403.34     
!                                                                          GWVERT3A.38     
! History:                                                                 GWVERT3A.39     
! Version  Date      Comment                                               GWVERT3A.40     
!  3.4   18/10/94   Original Code. J.R.Mitchell                            GWVERT3A.41     
!  4.1   27/03/96   Mod to ensure H_CRIT is set correctly (S.Webster)      ASW1F401.1      
!  4.3    7/03/97   KAY_LEE passed in from namelist. S.Webster             ASW1F403.35     
!  4.4   19/09/97   Remove *IF -DEF,CRAY compile options. S.Webster        ASW1F404.8      
!                                                                          GWVERT3A.42     
! Code Description:                                                        GWVERT3A.43     
! Language: Fortran 77 + common extensions                                 GWVERT3A.44     
! This code is written to UMDP3 v6 programming standards.                  GWVERT3A.45     
! System component covered: ORIGINAL VERSION FOR CRAY Y-MP                 GWVERT3A.46     
! System task covered: PART OF P22                                         GWVERT3A.47     
! SUITABLE FOR SINGLE COLUMN USE,ROTATED GRIDS                             GWVERT3A.48     
! FURTHER ALTERATIONS MAY BE REQUIRED FOR AUTOTASKING EFFICIENCY           GWVERT3A.49     
                                                                           GWVERT3A.50     
! Global Variables                                                         GWVERT3A.51     
*CALL C_G                                                                  GWVERT3A.52     
*CALL C_R_CP                                                               GWVERT3A.53     
! Local constants                                                          GWVERT3A.54     
*CALL C_GWAVE                                                              GWVERT3A.55     
                                                                           GWVERT3A.56     
! Subroutine arguements:                                                   GWVERT3A.57     
                                                                           GWVERT3A.58     
      INTEGER                                                              GWVERT3A.59     
     * LEVELS              !IN    NUMBER OF MODEL LEVELS                   GWVERT3A.60     
     *,Q_LEVELS            !IN    NUMBER OF WET LEVELS                     GWVERT3A.61     
     *,START_L             !IN    START LEVEL FOR WAVE-BREAKING TEST       GWVERT3A.62     
     *,POINTS              !IN    NUMBER OF POINTS                         GWVERT3A.63     
     *,K_LIFT(POINTS)      !IN    MODEL LEVEL AT TOP OF BLOCKED LAYER      GWVERT3A.64     
     *,POINTS_STRESS_UD    !IN    ) No of land points in diagnostic        GWVERT3A.65     
     *,POINTS_STRESS_VD    !IN    ) arrays for GW stress - u and v         GWVERT3A.66     
     *,POINTS_DU_DT_SATN   !IN    ) No of land points in diagnostic        GWVERT3A.67     
     *,POINTS_DV_DT_SATN   !IN    ) arrays for GW satn - du and dv         GWVERT3A.68     
     *,POINTS_DU_DT_JUMP   !IN    ) No of land points in diagnostic        GWVERT3A.69     
     *,POINTS_DV_DT_JUMP   !IN    ) arrays for GW satn - du and dv         GWVERT3A.70     
     *,POINTS_DU_DT_LEE    !IN    ) No of land points in diagnostic        GWVERT3A.71     
     *,POINTS_DV_DT_LEE    !IN    ) arrays for GW lee - du and dv          GWVERT3A.72     
     *,POINTS_TRANS_D      !IN    ) No of land points for trans diag       GWVERT3A.73     
                                                                           GWVERT3A.74     
      REAL                                                                 GWVERT3A.75     
     * PSTAR(POINTS)                    !IN    PSTAR FIELD                 GWVERT3A.76     
     *,PEXNER(POINTS,LEVELS+1)          !IN    PEXNER                      GWVERT3A.77     
     *,THETA(POINTS,LEVELS)             !IN    THETA FIELD                 GWVERT3A.78     
     *,Q(POINTS,Q_LEVELS)               !IN    SATURATION FIELD            GWVERT3A.79     
     *,U(POINTS,LEVELS)                 !IN    U FIELD                     GWVERT3A.80     
     *,V(POINTS,LEVELS)                 !IN    V FIELD                     GWVERT3A.81     
     *,U_S(POINTS)                      !IN    'SURFACE' U FIELD           GWVERT3A.82     
     *,V_S(POINTS)                      !IN    'SURFACE' V FIELD           GWVERT3A.83     
     *,RHO_S(POINTS)                    !IN    'SURFACE' DENSITY           GWVERT3A.84     
     *,S_X_STRESS(POINTS)               !IN    'SURFACE' X_STRESS          GWVERT3A.85     
     *,S_Y_STRESS(POINTS)               !IN    'SURFACE' Y_STRESS          GWVERT3A.86     
     *,S_X_OROG(POINTS)                 !IN    'SURFACE' X_STRESS          GWVERT3A.87     
     *,S_Y_OROG(POINTS)                 !IN    'SURFACE' Y_STRESS          GWVERT3A.88     
     *,SIGMA_XX(POINTS)  !IN    DH/DX SQUARED GRADIENT OROGRAPHY           GWVERT3A.89     
     *,SIGMA_XY(POINTS)  !IN   (DH/DX)(DH/DY) GRADIENT OROGRAPHY           GWVERT3A.90     
     *,SIGMA_YY(POINTS)  !IN    DH/DY SQUARED GRADIENT OROGRAPHY           GWVERT3A.91     
     *,TEST(POINTS)      !IN  TEST HYDROLOIC JUMP (SIMILAR TO FROUDE)      GWVERT3A.92     
     *,SD_OROG(POINTS)   !IN  STANDARD DEVIATION OF OROGRAPHY              GWVERT3A.93     
!      AKH,BKH  DEFINE HYBRID VERTICAL COORDINATES P=A+BP*-LAYER EDGES,    GWVERT3A.94     
!      DELTA_AK,DELTA_BK  DEFINE PRESSURE DIFFERENCES ACROSS LAYERS        GWVERT3A.95     
     *,AKH(LEVELS+1)          !IN    VALUE AT LAYER BOUNDARY               GWVERT3A.96     
     *,BKH(LEVELS+1)          !IN    VALUE AT LAYER BOUMDARY               GWVERT3A.97     
     *,DELTA_AK (LEVELS)      !IN    DIFFERENCE ACROSS LAYER               GWVERT3A.98     
     *,DELTA_BK (LEVELS)      !IN    DIFFERENCE ACROSS LAYER               GWVERT3A.99     
     *,KAY                    !IN    stress constant (m-1)                 GWVERT3A.100    
     *,KAY_LEE                !IN    TRAPPED LEE WAVE CONSTANT             ASW1F403.36     
     *,DU_DT(POINTS,LEVELS)   !OUT   U-ACCELERATION                        GWVERT3A.101    
     *,DV_DT(POINTS,LEVELS)   !OUT   V-ACCELERATION                        GWVERT3A.102    
                                                                           GWVERT3A.103    
! Diagnostics                                                              GWVERT3A.104    
      REAL                                                                 GWVERT3A.105    
     * STRESS_UD(POINTS_STRESS_UD,LEVELS+1) !U STRESS DIAG                 GWVERT3A.106    
     *,STRESS_VD(POINTS_STRESS_VD,LEVELS+1) !V STRESS DIAG                 GWVERT3A.107    
     *,DU_DT_SATN(POINTS_DU_DT_SATN,LEVELS) !U ACCELN DIAG (SATURATION)    GWVERT3A.108    
     *,DV_DT_SATN(POINTS_DV_DT_SATN,LEVELS) !V ACCELN DIAG (SATURATION)    GWVERT3A.109    
     *,DU_DT_JUMP(POINTS_DU_DT_JUMP,LEVELS) !U ACCELN DIAG (HYDR JUMP)     GWVERT3A.110    
     *,DV_DT_JUMP(POINTS_DV_DT_JUMP,LEVELS) !V ACCELN DIAG (HYDR JUMP)     GWVERT3A.111    
     *,DU_DT_LEE(POINTS_DU_DT_LEE,LEVELS)   !U ACCELN DIAG (LEE WAVE)      GWVERT3A.112    
     *,DV_DT_LEE(POINTS_DV_DT_LEE,LEVELS)   !V ACCELN DIAG (LEE WAVE)      GWVERT3A.113    
     *,TRANS_D(POINTS_TRANS_D)   ! TRANSMITTION COEFFICIENT DIAGNOSTIC     GWVERT3A.114    
                                                                           GWVERT3A.115    
      LOGICAL                                                              GWVERT3A.116    
     * STRESS_UD_ON           !U stress diagnostic switch                  GWVERT3A.117    
     *,STRESS_VD_ON           !V stress diagnostic switch                  GWVERT3A.118    
     *,DU_DT_SATN_ON          !U accel (saturation) diagnostic switch      GWVERT3A.119    
     *,DV_DT_SATN_ON          !V accel (saturation) diagnostic switch      GWVERT3A.120    
     *,DU_DT_JUMP_ON          !U accel (hydr jump) diagnostic switch       GWVERT3A.121    
     *,DV_DT_JUMP_ON          !V accel (hydr jump) diagnostic switch       GWVERT3A.122    
     *,DU_DT_LEE_ON           !U accel (lee wave) diagnostic switch        GWVERT3A.123    
     *,DV_DT_LEE_ON           !V accel (lee wave) diagnostic switch        GWVERT3A.124    
     *,TRANS_D_ON             !Transmittion coefficient diag switch        GWVERT3A.125    
                                                                           GWVERT3A.126    
! Local parameters                                                         GWVERT3A.127    
      REAL CPBYG                                                           GWVERT3A.128    
      PARAMETER(CPBYG=CP/G)                                                GWVERT3A.129    
! Local scalers                                                            GWVERT3A.130    
      REAL                                                                 GWVERT3A.131    
     * UCPTSPD              ! |U|COS(.) COMPONENT SPEEED DIRN STRESS       GWVERT3A.132    
     *,S_STRESS_SQ          ! SURFACE STRESS SQUARE MAGNITUDE              GWVERT3A.133    
     *,S_STRESS             ! SURFACE STRESS MAGNITUDE                     GWVERT3A.134    
     *,ALPHA1               ! ALLOWS SWAP OF ALPHA AND BETA                GWVERT3A.135    
     *,BETA1                !             "                                GWVERT3A.136    
     *,SPEED                ! WIND SPEED IN DIR OF STRESS AT LEVEL         GWVERT3A.137    
     *,N_SQAV               ! AVERAGE OF BRUNT VAISALLA FREQ SQ            GWVERT3A.138    
     *,NOVERU               ! NBYU FOR ONE LAYER                           GWVERT3A.139    
     *,DEL_EXNER            ! EXNER DIFFERENCE ACROSS LAYER                GWVERT3A.140    
     *,TEST_CALC            ! CALCULATION FOR JUMP HEIGHT TEST             GWVERT3A.141    
     *,PU,PL,PB             ! PRESSURES                                    GWVERT3A.142    
                                                                           GWVERT3A.143    
      LOGICAL   FLAG                                                       GWVERT3A.144    
                                                                           GWVERT3A.145    
      INTEGER   I,K       ! LOOP COUNTER IN ROUTINE                        GWVERT3A.146    
      INTEGER   KK,KL,KU  ! LEVEL COUNTERS IN ROUTINE                      GWVERT3A.147    
      INTEGER   K_TROP    ! LIMIT OF LEVELS FOR H_JUMP                     GWVERT3A.148    
                                                                           GWVERT3A.149    
! Local dynamic arrays                                                     GWVERT3A.150    
! LOCAL WORKSPACE ARRAYS: 21  ARRAYS OF FULL FIELD LENGTH                  GWVERT3A.151    
!                                                                          GWVERT3A.152    
      LOGICAL                                                              GWVERT3A.162    
     * H_JUMP(POINTS)       ! TRUE IF HYDROLIC JUMP REGIME                 GWVERT3A.163    
     *,H_CRIT(POINTS)       ! TRUE IF CRITICAL LEVEL WITHIN JUMP           GWVERT3A.164    
     *,L_CONT(POINTS)       ! LEVEL CONTINUE                               GWVERT3A.165    
     *,L_LEE(POINTS)        ! TRUE IF TRAPPED LEE WAVE DIAGNOSED           GWVERT3A.166    
                                                                           GWVERT3A.167    
      INTEGER                                                              GWVERT3A.168    
     * H_O_LEV(POINTS)           ! MODEL LEVEL HEIGHT OF H_JUMP/H_CRIT     GWVERT3A.169    
     *,K_LEE(POINTS,2)           ! MODEL LEVEL OF TRAPPED LEE WAVE         GWVERT3A.170    
     *                           ! 'HEIGHT' AND TOP OF WAVE                GWVERT3A.171    
                                                                           GWVERT3A.172    
      REAL                                                                 GWVERT3A.173    
     * NBYU_P(POINTS)         ! U/N FOR CALCULATION OF H_O; AVERAGED       GWVERT3A.174    
     *,UNIT_X(POINTS)         ! X_COMPNT OF UNIT STRESS VECTOR             GWVERT3A.175    
     *,UNIT_Y(POINTS)         ! Y_COMPNT OF UNIT STRESS VECTOR             GWVERT3A.176    
     *,H_O(POINTS)            ! GEOPOTENTIAL HEIGHT ABOVE SURFACE OF       GWVERT3A.177    
     *                        ! HYDROLIC JUMP                              GWVERT3A.178    
     *,P_EXNER_CENTRE(POINTS,2) ! EXNER PRESSURE AT LAYER CENTRES          GWVERT3A.179    
     *,N_SQ(POINTS,2)         ! SQUARE OF BRUNT_VAISALA FREQUENCY          GWVERT3A.180    
     *,ZH(POINTS)             ! TOTAL HEIGHT OF JUMP CALCUALTION           GWVERT3A.181    
     *,P0(POINTS)             ! PSTAR OR PRESS AT TOP OF K_LIFT            GWVERT3A.182    
     *,TRANS(POINTS)          ! COEFFICIENT FOR TRANSMITTION OF            GWVERT3A.183    
     *                        ! SURFACE STRESS                             GWVERT3A.184    
     *,H_LEE(POINTS)          ! TRAPPED LEE WAVE 'HEIGHT' (SEE DOC)        GWVERT3A.185    
     *,LSQ_LEE(POINTS,2)      ! SCORER PARAMETER AVERAGED BELOW            GWVERT3A.186    
     *                        ! AND ABOVE TRAPPED LEE WAVE HEIGHT          GWVERT3A.187    
                                                                           GWVERT3A.189    
! Function and subroutine calls:                                           GWVERT3A.190    
      EXTERNAL GW_SCOR,GW_SATN,GW_JUMP,GW_LEE                              GWVERT3A.191    
*CALL P_EXNERC                                                             GWVERT3A.192    
                                                                           GWVERT3A.193    
!-------------------------------------------------------------------       GWVERT3A.194    
!   1.0 START  PRELIMINARIES                                               GWVERT3A.195    
! Initialise increment and increment diagnostics                           GWVERT3A.196    
!------------------------------------------------------------              GWVERT3A.197    
      DO K=1,LEVELS                                                        GWVERT3A.198    
                                                                           GWVERT3A.199    
        DO I=1,POINTS                                                      GWVERT3A.200    
          DU_DT(I,K)=0.0                                                   GWVERT3A.201    
          DV_DT(I,K)=0.0                                                   GWVERT3A.202    
        END DO                                                             GWVERT3A.203    
                                                                           GWVERT3A.204    
        IF( DU_DT_SATN_ON ) THEN                                           GWVERT3A.205    
          DO I=1,POINTS                                                    GWVERT3A.206    
            DU_DT_SATN(I,K)=0.0                                            GWVERT3A.207    
          END DO                                                           GWVERT3A.208    
        ENDIF                                                              GWVERT3A.209    
                                                                           GWVERT3A.210    
        IF( DV_DT_SATN_ON ) THEN                                           GWVERT3A.211    
          DO I=1,POINTS                                                    GWVERT3A.212    
            DV_DT_SATN(I,K)=0.0                                            GWVERT3A.213    
          END DO                                                           GWVERT3A.214    
        ENDIF                                                              GWVERT3A.215    
                                                                           GWVERT3A.216    
        IF( DU_DT_JUMP_ON ) THEN                                           GWVERT3A.217    
          DO I=1,POINTS                                                    GWVERT3A.218    
            DU_DT_JUMP(I,K)=0.0                                            GWVERT3A.219    
          END DO                                                           GWVERT3A.220    
        ENDIF                                                              GWVERT3A.221    
                                                                           GWVERT3A.222    
        IF( DV_DT_JUMP_ON ) THEN                                           GWVERT3A.223    
          DO I=1,POINTS                                                    GWVERT3A.224    
            DV_DT_JUMP(I,K)=0.0                                            GWVERT3A.225    
          END DO                                                           GWVERT3A.226    
        ENDIF                                                              GWVERT3A.227    
                                                                           GWVERT3A.228    
        IF( DU_DT_LEE_ON ) THEN                                            GWVERT3A.229    
          DO I=1,POINTS                                                    GWVERT3A.230    
            DU_DT_LEE(I,K)=0.0                                             GWVERT3A.231    
          END DO                                                           GWVERT3A.232    
        ENDIF                                                              GWVERT3A.233    
                                                                           GWVERT3A.234    
        IF( DV_DT_LEE_ON ) THEN                                            GWVERT3A.235    
          DO I=1,POINTS                                                    GWVERT3A.236    
            DV_DT_LEE(I,K)=0.0                                             GWVERT3A.237    
          END DO                                                           GWVERT3A.238    
        ENDIF                                                              GWVERT3A.239    
                                                                           GWVERT3A.240    
      ENDDO ! Levels                                                       GWVERT3A.241    
!-----------------------------------------------------------------         GWVERT3A.242    
!     Code assumes ALPHA < BETA . Swap is possible because of              GWVERT3A.243    
!     symmetry of calculation( SEE EQN(55), DOC )                          GWVERT3A.244    
!----------------------------------------------------------------          GWVERT3A.245    
      IF( ALPHA.GT.BETA ) THEN                                             GWVERT3A.246    
         ALPHA1 = BETA                                                     GWVERT3A.247    
         BETA1  = ALPHA                                                    GWVERT3A.248    
      ELSE                                                                 GWVERT3A.249    
         ALPHA1 = ALPHA                                                    GWVERT3A.250    
         BETA1  = BETA                                                     GWVERT3A.251    
      ENDIF                                                                GWVERT3A.252    
                                                                           GWVERT3A.253    
      IF( START_L.LE.2 ) THEN                                              GWVERT3A.254    
        WRITE(6,*) 'ERROR G_WAVE: ** START_L MUST BE GREATER THAN 2 ** '   GIE0F403.256    
        START_L=3                                                          GWVERT3A.256    
      ENDIF                                                                GWVERT3A.257    
                                                                           GWVERT3A.258    
      KL=1                                                                 GWVERT3A.259    
      KU=2                                                                 GWVERT3A.260    
                                                                           GWVERT3A.261    
      DO I=1,POINTS                                                        GWVERT3A.262    
                                                                           GWVERT3A.263    
!------------------------------------------------------------------        GWVERT3A.264    
! Calculate logical array for hydraulic jump regime.                       GWVERT3A.265    
!------------------------------------------------------------------        GWVERT3A.266    
        IF( TEST(I).GE.ALPHA1 ) THEN                                       GWVERT3A.267    
          H_JUMP(I)=.TRUE.                                                 GWVERT3A.268    
        ELSE                                                               GWVERT3A.269    
          H_JUMP(I)=.FALSE.                                                GWVERT3A.270    
        ENDIF                                                              GWVERT3A.271    
!-------------------------------------------------------------------       GWVERT3A.272    
! Initialisation. UNIT_X is x_compnt of unit surface stress vector         GWVERT3A.273    
!-------------------------------------------------------------------       GWVERT3A.274    
        L_CONT(I) = .TRUE.                                                 GWVERT3A.275    
        NBYU_P(I) = 0.0                                                    GWVERT3A.276    
        S_STRESS_SQ = S_X_STRESS(I)**2 + S_Y_STRESS(I)**2                  GWVERT3A.277    
        IF ( S_STRESS_SQ .LE. 0.0 ) THEN                                   GWVERT3A.278    
          UNIT_X(I) = 0.0                                                  GWVERT3A.279    
          UNIT_Y(I) = 0.0                                                  GWVERT3A.280    
        ELSE                                                               GWVERT3A.281    
          S_STRESS = SQRT( S_STRESS_SQ )                                   GWVERT3A.282    
          UNIT_X(I) = S_X_STRESS(I) / S_STRESS                             GWVERT3A.283    
          UNIT_Y(I) = S_Y_STRESS(I) / S_STRESS                             GWVERT3A.284    
        ENDIF                                                              GWVERT3A.285    
                                                                           GWVERT3A.286    
      ENDDO   ! Points                                                     GWVERT3A.287    
                                                                           GWVERT3A.288    
!--------------------------------------------------------------------      GWVERT3A.289    
!  2.0 Assess the vertical structure by calculating Scorer parameter       GWVERT3A.290    
!      for each level. Determine transmittion factor allowing              GWVERT3A.291    
!      reduction of surface stress from reflection of wave energy          GWVERT3A.292    
!      off contrast in averaged Scoror profile. Determine trapped          GWVERT3A.293    
!      lee wave height ( if exists ) and associated paramters              GWVERT3A.294    
!----------------------------------------------------------------          GWVERT3A.295    
      CALL GW_SCOR                                                         GWVERT3A.296    
     1 (PSTAR,PEXNER,THETA,U,V,LEVELS,START_L,H_JUMP,POINTS,AKH,BKH        GWVERT3A.297    
     2 ,UNIT_X,UNIT_Y,TRANS,K_LEE,H_LEE,LSQ_LEE,L_LEE)                     GWVERT3A.298    
                                                                           GWVERT3A.299    
      DO I=1,POINTS                                                        GWVERT3A.300    
        S_X_STRESS(I)=S_X_STRESS(I)*TRANS(I)                               GWVERT3A.301    
        S_Y_STRESS(I)=S_Y_STRESS(I)*TRANS(I)                               GWVERT3A.302    
      ENDDO                                                                GWVERT3A.303    
                                                                           GWVERT3A.304    
      IF( TRANS_D_ON ) THEN                                                GWVERT3A.305    
        DO I=1,POINTS                                                      GWVERT3A.306    
          TRANS_D(I)=TRANS(I)                                              GWVERT3A.307    
        END DO                                                             GWVERT3A.308    
      ENDIF                                                                GWVERT3A.309    
                                                                           GWVERT3A.310    
!---------------------------------------------------------------------     GWVERT3A.311    
! 3.0 Find approximate height of tropopause for maximum jump height        GWVERT3A.312    
!     limit and level limit of orography                                   GWVERT3A.313    
!---------------------------------------------------------------------     GWVERT3A.314    
      FLAG = .TRUE.                                                        GWVERT3A.315    
      K_TROP = LEVELS-2                                                    GWVERT3A.316    
      DO K= 3,LEVELS-2                                                     GWVERT3A.317    
         IF (FLAG) THEN                                                    GWVERT3A.318    
           PU=100000.*BKH(K+1) + AKH(K+1)                                  GWVERT3A.319    
           IF ( PU .LT. 25000. ) THEN                                      GWVERT3A.320    
             K_TROP = K                                                    GWVERT3A.321    
             FLAG = .FALSE.                                                GWVERT3A.322    
           ENDIF                                                           GWVERT3A.323    
         ENDIF                                                             GWVERT3A.324    
      ENDDO                                                                GWVERT3A.325    
                                                                           GWVERT3A.326    
!---------------------------------------------------------------------     GWVERT3A.327    
! 3.2 Calculate N by U averaged over levels K_LIFT to a max of K_TROP      GWVERT3A.328    
!     to test if N/UdeltaZ is greater than 3PI/2. Where this occurs        GWVERT3A.329    
!     is the jump height, H_O_LEVEL (eqn 8,9)                              GWVERT3A.330    
!     N_SQAV is linearised from N_SQ at layer boundaries                   GWVERT3A.331    
!---------------------------------------------------------------------     GWVERT3A.332    
      DO K=2,K_TROP                                                        GWVERT3A.333    
        DO I=1,POINTS                                                      GWVERT3A.334    
          IF( H_JUMP(I) .AND. L_CONT(I)                                    GWVERT3A.335    
     &        .AND. K.GT.K_LIFT(I) ) THEN                                  GWVERT3A.336    
                                                                           GWVERT3A.337    
            IF( K.EQ.K_LIFT(I)+1 .OR. K_LIFT(I).EQ.0) THEN                 GWVERT3A.338    
              ZH(I)=0.0                                                    GWVERT3A.339    
              P0(I)=PSTAR(I)*BKH(K_LIFT(I)+1) +AKH(K_LIFT(I)+1)            GWVERT3A.340    
              PU=PSTAR(I)*BKH(K) + AKH(K)                                  GWVERT3A.341    
              PL=PSTAR(I)*BKH(K-1) + AKH(K-1)                              GWVERT3A.342    
! lower layer labelled KU                                                  GWVERT3A.343    
              P_EXNER_CENTRE(I,KU)=                                        GWVERT3A.344    
     &        P_EXNER_C( PEXNER(I,K),PEXNER(I,K-1),PU,PL,KAPPA )           GWVERT3A.345    
              PL=PU                                                        GWVERT3A.346    
              PU=PSTAR(I)*BKH(K+1) + AKH(K+1)                              GWVERT3A.347    
! upper layer labelled KL ready for next level stage                       GWVERT3A.348    
              P_EXNER_CENTRE(I,KL)= P_EXNER_C(                             GWVERT3A.349    
     &         PEXNER(I,K+1),PEXNER(I,K),PU,PL,KAPPA)                      GWVERT3A.350    
              N_SQ(I,KL) = G*(THETA(I,K)-THETA(I,K-1))/(THETA(I,K)*        GWVERT3A.351    
     &         THETA(I,K-1)*(P_EXNER_CENTRE(I,KU)-P_EXNER_CENTRE(I,KL))*   GWVERT3A.352    
     &         CPBYG)                                                      GWVERT3A.353    
              IF( N_SQ(I,KL).LE. 0.0 ) THEN                                GWVERT3A.354    
                H_JUMP(I)=.FALSE.                                          GWVERT3A.355    
              ENDIF                                                        GWVERT3A.356    
            ENDIF                                                          GWVERT3A.357    
                                                                           GWVERT3A.358    
! next level stage                                                         GWVERT3A.359    
            PU=PSTAR(I)*BKH(K+2) + AKH(K+2)                                GWVERT3A.360    
            PL=PSTAR(I)*BKH(K+1) + AKH(K+1)                                GWVERT3A.361    
            P_EXNER_CENTRE(I,KU)=                                          GWVERT3A.362    
     &             P_EXNER_C( PEXNER(I,K+2),PEXNER(I,K+1),PU,PL,KAPPA)     GWVERT3A.363    
            N_SQ(I,KU) = G*(THETA(I,K+1)-THETA(I,K))/(THETA(I,K+1)*        GWVERT3A.364    
     &       THETA(I,K)*(P_EXNER_CENTRE(I,KL)-P_EXNER_CENTRE(I,KU))*       GWVERT3A.365    
     &       CPBYG)                                                        GWVERT3A.366    
            N_SQAV = ( (PEXNER(I,K)-P_EXNER_CENTRE(I,KL))*N_SQ(I,KU) +     GWVERT3A.367    
     &             (P_EXNER_CENTRE(I,KL) - PEXNER(I,K+1))*N_SQ(I,KL) )     GWVERT3A.368    
     &                   / ( PEXNER(I,K) - PEXNER(I,K+1) )                 GWVERT3A.369    
            IF( N_SQAV .LE. 0.0 ) THEN                                     GWVERT3A.370    
              H_JUMP(I)=.FALSE.                                            GWVERT3A.371    
              TEST_CALC = 0.0                                              GWVERT3A.372    
            ELSE                                                           GWVERT3A.373    
!--------------------------------------------------------------------      GWVERT3A.374    
!   Note U is component parallel to stress vector                          GWVERT3A.375    
!--------------------------------------------------------------------      GWVERT3A.376    
              UCPTSPD = U(I,K)*UNIT_X(I) + V(I,K)*UNIT_Y(I)                GWVERT3A.377    
              IF ( UCPTSPD .LE. 0.0 ) THEN                                 GWVERT3A.378    
                NOVERU =  0.0                                              GWVERT3A.379    
              ELSE                                                         GWVERT3A.380    
                NOVERU =  SQRT( N_SQAV ) / UCPTSPD                         GWVERT3A.381    
              ENDIF                                                        GWVERT3A.382    
              IF ( K_LIFT(I).EQ.0 ) THEN                                   GWVERT3A.383    
                PB=PSTAR(I)                                                GWVERT3A.384    
                DEL_EXNER = PEXNER(I,1) - PEXNER(I,2)                      GWVERT3A.385    
                ZH(I) = CPBYG*THETA(I,1)*DEL_EXNER                         GWVERT3A.386    
                K_LIFT(I)=1                                                GWVERT3A.387    
              ELSE                                                         GWVERT3A.388    
                PB=PSTAR(I)*BKH(K) + AKH(K)                                GWVERT3A.389    
              ENDIF                                                        GWVERT3A.390    
              NBYU_P(I) = NBYU_P(I) + NOVERU*(PB-PL)                       GWVERT3A.391    
              DEL_EXNER = PEXNER(I,K) - PEXNER(I,K+1)                      GWVERT3A.392    
              ZH(I) = ZH(I) + CPBYG*THETA(I,K)*DEL_EXNER                   GWVERT3A.393    
              TEST_CALC = ZH(I)*NBYU_P(I)/ ( P0(I)-PL )                    GWVERT3A.394    
            ENDIF                                                          GWVERT3A.395    
!------------------------------------------------------------------        GWVERT3A.396    
!  Test to see if jump height is reached                                   GWVERT3A.397    
!  Note:  (3*PI) / 2 = 4.712389                                            GWVERT3A.398    
!  Jump height is defined above LIFT (height of blocked layer)             GWVERT3A.399    
!------------------------------------------------------------------        GWVERT3A.400    
            IF( TEST_CALC .GT. 4.712389 ) THEN                             GWVERT3A.401    
              H_O_LEV(I) = K                                               GWVERT3A.402    
              L_CONT(I) = .FALSE.                                          GWVERT3A.403    
                                                                           GWVERT3A.404    
              IF (  H_O_LEV(I) .LE. START_L ) THEN                         GWVERT3A.405    
                H_JUMP(I) = .FALSE.                                        GWVERT3A.406    
              ENDIF                                                        GWVERT3A.407    
                                                                           GWVERT3A.408    
            ENDIF   ! Test > 4.712                                         GWVERT3A.409    
                                                                           GWVERT3A.410    
            IF ( K .EQ. K_TROP .AND. L_CONT(I) ) THEN                      GWVERT3A.411    
              H_JUMP(I) = .FALSE.                                          GWVERT3A.412    
            ENDIF                                                          GWVERT3A.413    
                                                                           GWVERT3A.414    
          ENDIF ! H_Jump and L_Cont                                        GWVERT3A.415    
        ENDDO   ! Points                                                   GWVERT3A.416    
!  Rename lower centre array as upper centre ready for next level          GWVERT3A.417    
        KK=KU                                                              GWVERT3A.418    
        KU=KL                                                              GWVERT3A.419    
        KL=KK                                                              GWVERT3A.420    
      ENDDO     ! Levels 2 to K_Trop                                       GWVERT3A.421    
                                                                           GWVERT3A.422    
!------------------------------------------------------------------        GWVERT3A.423    
! 3.3 Find if critical layer occurs before H_O_LEV(I)                      GWVERT3A.424    
!------------------------------------------------------------------        GWVERT3A.425    
       DO I=1,POINTS                                                       ASW1F401.2      
          H_CRIT(I)=.FALSE.                                                ASW1F401.3      
       ENDDO                                                               ASW1F401.4      
                                                                           ASW1F401.5      
      DO K=START_L+1,LEVELS                                                GWVERT3A.426    
        DO I=1,POINTS                                                      GWVERT3A.427    
          IF( H_JUMP(I) .AND. K.LE.H_O_LEV(I) ) THEN                       GWVERT3A.429    
            SPEED=S_X_STRESS(I)*U(I,K)+S_Y_STRESS(I)*V(I,K)                GWVERT3A.430    
            IF(SPEED .LE. 0.0) THEN                                        GWVERT3A.431    
              H_CRIT(I)=.TRUE.                                             GWVERT3A.432    
              H_O_LEV(I)=K                                                 GWVERT3A.433    
            ENDIF                                                          GWVERT3A.434    
          ENDIF                                                            GWVERT3A.435    
        ENDDO   ! Points                                                   GWVERT3A.436    
      ENDDO     ! Levels 1 to 5                                            GWVERT3A.437    
                                                                           GWVERT3A.438    
!---------------------------------------------------------------------     GWVERT3A.439    
!  4.0 If no hydraulic jump the saturation hypothesis is applied from      GWVERT3A.440    
!      START_L with S_STRESS.                                              GWVERT3A.441    
!      Else for jump points, saturation is applied from H_O_LEV with       GWVERT3A.442    
!      S_STRESS/3. If a critical level has been found GW_SATN skipped      GWVERT3A.443    
!---------------------------------------------------------------------     GWVERT3A.444    
      CALL GW_SATN                                                         GWVERT3A.445    
     1  (PSTAR,PEXNER,THETA,U,V,S_X_STRESS,S_Y_STRESS,START_L,LEVELS       GWVERT3A.446    
     2  ,POINTS,AKH,BKH,DELTA_AK,DELTA_BK,KAY,SD_OROG,H_O_LEV,H_JUMP       GWVERT3A.447    
     3  ,H_CRIT,S_X_OROG,S_Y_OROG,DU_DT,DV_DT                              GWVERT3A.448    
! Diagnostics                                                              GWVERT3A.449    
     4  ,STRESS_UD,POINTS_STRESS_UD,STRESS_UD_ON                           GWVERT3A.450    
     5  ,STRESS_VD,POINTS_STRESS_VD,STRESS_VD_ON                           GWVERT3A.451    
     6  ,DU_DT_SATN,POINTS_DU_DT_SATN,DU_DT_SATN_ON                        GWVERT3A.452    
     7  ,DV_DT_SATN,POINTS_DV_DT_SATN,DV_DT_SATN_ON )                      GWVERT3A.453    
                                                                           GWVERT3A.454    
                                                                           GWVERT3A.455    
!                                                                          GWVERT3A.456    
!------------------------------------------------------------------        GWVERT3A.457    
! 5.0 Linearize stress profile with pressure up to H_O_LEV and             GWVERT3A.458    
!     S_STRESS/3 if H_JUMP true. If H_CRIT true then linearise             GWVERT3A.459    
!     upto zero stress. Skip for non-jump, non-critical points             GWVERT3A.460    
!------------------------------------------------------------------        GWVERT3A.461    
      CALL GW_JUMP                                                         GWVERT3A.462    
     1  (PSTAR,PEXNER,S_X_STRESS,S_Y_STRESS,START_L,LEVELS                 GWVERT3A.463    
     2   ,POINTS,AKH,BKH,DELTA_AK,DELTA_BK,H_O_LEV,H_JUMP                  GWVERT3A.464    
     3   ,H_CRIT,DU_DT,DV_DT                                               GWVERT3A.465    
! Diagnostics                                                              GWVERT3A.466    
     4  ,STRESS_UD,POINTS_STRESS_UD,STRESS_UD_ON                           GWVERT3A.467    
     5  ,STRESS_VD,POINTS_STRESS_VD,STRESS_VD_ON                           GWVERT3A.468    
     6  ,DU_DT_JUMP,POINTS_DU_DT_JUMP,DU_DT_JUMP_ON                        GWVERT3A.469    
     7  ,DV_DT_JUMP,POINTS_DV_DT_JUMP,DV_DT_JUMP_ON )                      GWVERT3A.470    
                                                                           GWVERT3A.471    
                                                                           GWVERT3A.472    
!---------------------------------------------------------------------     GWVERT3A.473    
! 6.0 Calculate linearized stress profile for trapped lee wave points      GWVERT3A.474    
!     Lee surface stress is calculated independantly of S_X_STRESS.        GWVERT3A.475    
!     Lee Stress is distributed vertically upto K_LEE(I,1) where its       GWVERT3A.476    
!     value at K_LEE(I,1) is reduced by a ratio also calculated            GWVERT3A.477    
!     within GW_LEE. The remaining stress is deposited by a second         GWVERT3A.478    
!     gradient, upto K_LEE(I,2). Drags calculated are ADDITIONAL.          GWVERT3A.479    
!---------------------------------------------------------------------     GWVERT3A.480    
      CALL GW_LEE                                                          GWVERT3A.481    
     1  (PSTAR,START_L,LEVELS,POINTS,AKH,BKH,DELTA_AK,DELTA_BK             GWVERT3A.482    
     2  ,U_S,V_S,RHO_S,L_LEE,LSQ_LEE,H_LEE,K_LEE,KAY_LEE                   ASW1F403.37     
     3  ,SIGMA_XX,SIGMA_XY,SIGMA_YY,DU_DT,DV_DT                            GWVERT3A.484    
! Diagnostics                                                              GWVERT3A.485    
     4  ,STRESS_UD,POINTS_STRESS_UD,STRESS_UD_ON                           GWVERT3A.486    
     5  ,STRESS_VD,POINTS_STRESS_VD,STRESS_VD_ON                           GWVERT3A.487    
     6  ,DU_DT_LEE,POINTS_DU_DT_LEE,DU_DT_LEE_ON                           GWVERT3A.488    
     7  ,DV_DT_LEE,POINTS_DV_DT_LEE,DV_DT_LEE_ON )                         GWVERT3A.489    
                                                                           GWVERT3A.490    
!------------------------------------------------------------------        GWVERT3A.491    
!  7.0 SET ACCELERATION SAME IN ALL LAYERS 2 UP TO START_L                 GWVERT3A.492    
!------------------------------------------------------------------        GWVERT3A.493    
      DO KK=2,START_L-1                                                    GWVERT3A.494    
        DO I=1,POINTS                                                      GWVERT3A.495    
          DU_DT(I,KK) = DU_DT(I,START_L)                                   GWVERT3A.496    
          DV_DT(I,KK) = DV_DT(I,START_L)                                   GWVERT3A.497    
        END DO                                                             GWVERT3A.498    
      END DO                                                               GWVERT3A.499    
                                                                           GWVERT3A.500    
      IF( DU_DT_SATN_ON ) THEN                                             GWVERT3A.501    
        DO KK=2,START_L-1                                                  GWVERT3A.502    
          DO I=1,POINTS                                                    GWVERT3A.503    
            DU_DT_SATN(I,KK) = DU_DT_SATN(I,START_L)                       GWVERT3A.504    
          END DO                                                           GWVERT3A.505    
        END DO                                                             GWVERT3A.506    
      ENDIF                                                                GWVERT3A.507    
                                                                           GWVERT3A.508    
      IF( DV_DT_SATN_ON ) THEN                                             GWVERT3A.509    
        DO KK=2,START_L-1                                                  GWVERT3A.510    
          DO I=1,POINTS                                                    GWVERT3A.511    
            DV_DT_SATN(I,KK) = DV_DT_SATN(I,START_L)                       GWVERT3A.512    
          END DO                                                           GWVERT3A.513    
        END DO                                                             GWVERT3A.514    
      ENDIF                                                                GWVERT3A.515    
                                                                           GWVERT3A.516    
      IF( DU_DT_JUMP_ON ) THEN                                             GWVERT3A.517    
        DO KK=2,START_L-1                                                  GWVERT3A.518    
          DO I=1,POINTS                                                    GWVERT3A.519    
            DU_DT_JUMP(I,KK) = DU_DT_JUMP(I,START_L)                       GWVERT3A.520    
          END DO                                                           GWVERT3A.521    
        END DO                                                             GWVERT3A.522    
      ENDIF                                                                GWVERT3A.523    
                                                                           GWVERT3A.524    
      IF( DV_DT_JUMP_ON ) THEN                                             GWVERT3A.525    
        DO KK=2,START_L-1                                                  GWVERT3A.526    
          DO I=1,POINTS                                                    GWVERT3A.527    
            DV_DT_JUMP(I,KK) = DV_DT_JUMP(I,START_L)                       GWVERT3A.528    
          END DO                                                           GWVERT3A.529    
        END DO                                                             GWVERT3A.530    
      ENDIF                                                                GWVERT3A.531    
                                                                           GWVERT3A.532    
      IF( DU_DT_LEE_ON ) THEN                                              GWVERT3A.533    
        DO KK=2,START_L-1                                                  GWVERT3A.534    
          DO I=1,POINTS                                                    GWVERT3A.535    
            DU_DT_LEE(I,KK) = DU_DT_LEE(I,START_L)                         GWVERT3A.536    
          END DO                                                           GWVERT3A.537    
        END DO                                                             GWVERT3A.538    
      ENDIF                                                                GWVERT3A.539    
                                                                           GWVERT3A.540    
      IF( DV_DT_LEE_ON ) THEN                                              GWVERT3A.541    
        DO KK=2,START_L-1                                                  GWVERT3A.542    
          DO I=1,POINTS                                                    GWVERT3A.543    
            DV_DT_LEE(I,KK) = DV_DT_LEE(I,START_L)                         GWVERT3A.544    
          END DO                                                           GWVERT3A.545    
        END DO                                                             GWVERT3A.546    
      ENDIF                                                                GWVERT3A.547    
                                                                           GWVERT3A.548    
      RETURN                                                               GWVERT3A.549    
      END                                                                  GWVERT3A.550    
                                                                           GWVERT3A.551    
*ENDIF                                                                     GWVERT3A.552