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

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