*IF DEF,A12_1E                                                             UVADV1E.2      
*IF DEF,MPP                                                                UVADV1E.3      
C *****************************COPYRIGHT******************************     UVADV1E.4      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    UVADV1E.5      
C                                                                          UVADV1E.6      
C Use, duplication or disclosure of this code is subject to the            UVADV1E.7      
C restrictions as set forth in the contract.                               UVADV1E.8      
C                                                                          UVADV1E.9      
C                Meteorological Office                                     UVADV1E.10     
C                London Road                                               UVADV1E.11     
C                BRACKNELL                                                 UVADV1E.12     
C                Berkshire UK                                              UVADV1E.13     
C                RG12 2SZ                                                  UVADV1E.14     
C                                                                          UVADV1E.15     
C If no contract has been raised with this copy of the code, the use,      UVADV1E.16     
C duplication or disclosure of it is strictly prohibited.  Permission      UVADV1E.17     
C to do so must first be obtained in writing from the Head of Numerical    UVADV1E.18     
C Modelling at the above address.                                          UVADV1E.19     
C ******************************COPYRIGHT******************************    UVADV1E.20     
CLL   SUBROUTINE UV_ADV -------------------------------------------        UVADV1E.21     
CLL                                                                        UVADV1E.22     
CLL                   PURPOSE:                                             UVADV1E.23     
CLL  CALCULATES MASS-WEIGHTED INCREMENTS TO U AND V DUE TO                 UVADV1E.24     
CLL  ADVECTION  BY USING EQUATIONS (37) AND (38) TO CALCULATE              UVADV1E.25     
CLL  PROVISIONAL VALUES OF U AND V AT THE NEW TIME-LEVEL, AND THEN         UVADV1E.26     
CLL  RECALCULATING THE ADVECTION TERMS ON THE RIGHT-HAND SIDE OF (41)      UVADV1E.27     
CLL  AND (42) USING THESE PROVISIONAL VALUES.  THE CORIOLIS TERMS          UVADV1E.28     
CLL  ASSOCIATED WITH THE VERTICAL VELOCITY ARE CALCULATED AND INCLUDED     UVADV1E.29     
CLL  IN THE INCREMENTS.  THE FINAL INCREMENTS ARE CALCULATED AS IN         UVADV1E.30     
CLL  EQUATIONS (41) AND (42). IF RUNNING A GLOBAL MODEL POLAR_UV IS        UVADV1E.31     
CLL  CALLED TO UPDATE POLAR VALUES.                                        UVADV1E.32     
CLL                                                                        UVADV1E.33     
CLL                          CHANGES INCLUDE:-                             UVADV1E.34     
CLL U_MEAN AND V_MEAN FIELDS NOT OVER-WRITTEN WHEN INTERPOLATION TO        UVADV1E.35     
CLL U_GRID PERFORMED. ETADOT AND RS FIELDS INTERPOLATED TO U_GRID INSIDE   UVADV1E.36     
CLL THIS ROUTINE INSTEAD OF INSIDE ADV_CTL. THIS COSTS 8 EXTRA             UVADV1E.37     
CLL HORIZONTAL FIELDS BUT ALLOWS ROUTINE TO BE CALLED BEFORE TH_ADV SO     UVADV1E.38     
CLL THAT OMEGA CALCULATED HERE CAN BE USED INSIDE TH_ADV TO CALCULATE      UVADV1E.39     
CLL EXTRA THERMODYNAMIC TERM.                                              UVADV1E.40     
CLL                                                                        UVADV1E.41     
CLL INCLUSION OF L_SECOND TO CHOOSE CHEAPER SECOND ORDER ADVECTION         UVADV1E.42     
CLL SCHEME ALONG WITH REMOVAL OF CODE PREVIOUSLY UNDER *DEF FORECAST.      UVADV1E.43     
CLL CODE INCLUDED TO ALLOW HALF-TIMESTEP TO BE USED AT TOP LEVEL.          UVADV1E.44     
CLL                                                                        UVADV1E.45     
CLL   NOT SUITABLE FOR SINGLE COLUMN USE.                                  UVADV1E.46     
CLL   WAS VERSION FOR CRAY Y-MP                                            UVADV1E.47     
CLL                                                                        UVADV1E.48     
CLL   WRITTEN  M.H MAWSON.                                                 UVADV1E.49     
CLL   MPP CODE ADDED BY P.BURTON                                           UVADV1E.50     
CLL                                                                        UVADV1E.51     
CLL  MODEL            MODIFICATION HISTORY:                                UVADV1E.52     
CLL VERSION  DATE                                                          UVADV1E.53     
!LL   4.4   11/08/97  New version optimised for T3E.                       UVADV1E.54     
!LL                   Not bit-reproducible with UVADV1C.                   UVADV1E.55     
!LL 4.4      07/08/97 Removed GCG_RMIN call from loop over levels          UVADV1E.56     
!LL                                                      P.Burton          UVADV1E.57     
CLL  4.4     04/08/97 Optimisation for T3E   D.Salmond                     UVADV1E.58     
!LL   4.5    21/08/98  Comment out cdir$ cache_bypass directives due       GSM4F405.7      
!LL                    to t3e hardware error with new compiler.            GSM4F405.8      
!LL                    S.D.Mullerworth                                     GSM4F405.9      
CLL  4.5  19/12/97  Move calculation of 1/RS*RS*P outside 4th order IF     ARB0F405.26     
CLL                 test for section 2.1, so that it can be used later     ARB0F405.27     
CCL                 in 2nd order code too.                  RTHBarnes.     ARB0F405.28     
CLL                                                                        UVADV1E.59     
CLL   PROGRAMMING STANDARD:                                                UVADV1E.60     
CLL                                                                        UVADV1E.61     
CLL   SYSTEM COMPONENTS COVERED: P122                                      UVADV1E.62     
CLL                                                                        UVADV1E.63     
CLL   SYSTEM TASK: P1                                                      UVADV1E.64     
CLL                                                                        UVADV1E.65     
CLL   DOCUMENTATION:       THE EQUATIONS USED ARE (37-38) AND (41-42)      UVADV1E.66     
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10     UVADV1E.67     
CLL                        M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON           UVADV1E.68     
CLL                                                                        UVADV1E.69     
CLLEND-------------------------------------------------------------        UVADV1E.70     
                                                                           UVADV1E.71     
C*L   ARGUMENTS:---------------------------------------------------        UVADV1E.72     

      SUBROUTINE UV_ADV                                                     2,59UVADV1E.73     
     &              (U,V,PSTAR_OLD,PSTAR,U_MEAN,V_MEAN,SEC_U_LATITUDE,     UVADV1E.74     
     &              ETADOT_MEAN,RS,DELTA_AK,DELTA_BK,AK,BK,F1,F2,          UVADV1E.75     
     &              LATITUDE_STEP_INVERSE,ADVECTION_TIMESTEP,NU_BASIC,     UVADV1E.76     
     &              LONGITUDE_STEP_INVERSE,U_FIELD,P_FIELD,                UVADV1E.77     
     &              ROW_LENGTH,P_LEVELS,                                   UVADV1E.78     
*CALL ARGFLDPT                                                             UVADV1E.79     
     &              COS_U_LONGITUDE,SIN_U_LONGITUDE,SEC_P_LATITUDE,        UVADV1E.80     
     &              AKH,BKH,OMEGA,L_SECOND,LLINTS,                         UVADV1E.81     
     &              extended_address,                                      UVADV1E.82     
     &              LWHITBROM,X_FIELD)                                     UVADV1E.83     
                                                                           UVADV1E.84     
      IMPLICIT NONE                                                        UVADV1E.85     
                                                                           UVADV1E.86     
      INTEGER                                                              UVADV1E.87     
     &  P_FIELD            !IN DIMENSION OF FIELDS ON PRESSSURE GRID.      UVADV1E.88     
     &, U_FIELD            !IN DIMENSION OF FIELDS ON VELOCITY GRID        UVADV1E.89     
     &, X_FIELD            !IN 1 IF 2ND ORDER ELSE U_FIELD                 UVADV1E.90     
     &, P_LEVELS           !IN NUMBER OF PRESSURE LEVELS.                  UVADV1E.91     
     &, ROW_LENGTH         !IN NUMBER OF POINTS PER ROW                    UVADV1E.92     
                                                                           UVADV1E.93     
! All TYPFLDPT arguments are intent IN                                     UVADV1E.94     
*CALL TYPFLDPT                                                             UVADV1E.95     
                                                                           UVADV1E.96     
C LOGICAL VARIABLE                                                         UVADV1E.97     
      LOGICAL                                                              UVADV1E.98     
     &  L_SECOND     ! SET TO TRUE IF NU_BASIC IS ZERO.                    UVADV1E.99     
     & ,LLINTS              ! Switch for linear TS calc in CALC_TS         UVADV1E.100    
     & ,LWHITBROM           ! Switch for White & Bromley terms             UVADV1E.101    
      INTEGER extended_address(P_FIELD)                                    UVADV1E.102    
                                                                           UVADV1E.103    
      REAL                                                                 UVADV1E.104    
     & U_MEAN(U_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED U VELOCITY      UVADV1E.105    
     &                          !   FROM ADJUSTMENT STEP HELD AT U         UVADV1E.106    
     &                          !   POINTS.                                UVADV1E.107    
     &,V_MEAN(U_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED V VELOCITY      UVADV1E.108    
     &                          !   * COS(LAT) FROM ADJUSTMENT STEP        UVADV1E.109    
     &,ETADOT_MEAN(P_FIELD,P_LEVELS)  !IN AVERAGED MASS-WEIGHTED           UVADV1E.110    
     &                          !VERTICAL VELOCITY FROM ADJUSTMENT STEP    UVADV1E.111    
                                                                           UVADV1E.112    
      REAL                                                                 UVADV1E.113    
     & U(U_FIELD,P_LEVELS)      !INOUT IN U FIELD,                         UVADV1E.114    
     &                          !  OUT MASS-WEIGHTED U FIELD.              UVADV1E.115    
     &,V(U_FIELD,P_LEVELS)      !INOUT IN V FIELD,                         UVADV1E.116    
     &                          !  OUT MASS-WEIGHTED V FIELD.              UVADV1E.117    
                                                                           UVADV1E.118    
      REAL                                                                 UVADV1E.119    
     & PSTAR(U_FIELD)           !IN PSTAR FIELD AT NEW TIME-LEVEL ON       UVADV1E.120    
     &                          ! U GRID.                                  UVADV1E.121    
     &,PSTAR_OLD(U_FIELD)       !IN PSTAR AT PREVIOUS TIME-LEVEL ON        UVADV1E.122    
     &                          ! U GRID.                                  UVADV1E.123    
     &,RS(P_FIELD,P_LEVELS)     !IN RS FIELD.                              UVADV1E.124    
     &,AK(P_LEVELS)             !IN FIRST TERM IN HYBRID CO-ORDS.          UVADV1E.125    
     &,BK(P_LEVELS)             !IN SECOND TERM IN HYBRID CO-ORDS.         UVADV1E.126    
     &,DELTA_AK(P_LEVELS)       !IN LAYER THICKNESS                        UVADV1E.127    
     &,DELTA_BK(P_LEVELS)       !IN LAYER THICKNESS                        UVADV1E.128    
     &,AKH(P_LEVELS+1)          !IN HYBRID CO-ORDINATE AT HALF LEVELS      UVADV1E.129    
     &,BKH(P_LEVELS+1)          !IN HYBRID CO-ORDINATE AT HALF LEVELS      UVADV1E.130    
     &,SEC_U_LATITUDE(U_FIELD)  !IN 1/COS(LAT) AT U POINTS (2-D ARRAY)     UVADV1E.131    
     &,SEC_P_LATITUDE(U_FIELD)  !IN 1/COS(LAT) AT P POINTS (2-D ARRAY)     UVADV1E.132    
     &,SIN_U_LONGITUDE(ROW_LENGTH)  !IN SIN(LONGITUDE) AT U POINTS.        UVADV1E.133    
     &,COS_U_LONGITUDE(ROW_LENGTH)  !IN COS(LONGITUDE) AT U POINTS.        UVADV1E.134    
                                                                           UVADV1E.135    
      REAL                                                                 UVADV1E.136    
     & LONGITUDE_STEP_INVERSE   !IN 1/(DELTA LAMDA)                        UVADV1E.137    
     &,LATITUDE_STEP_INVERSE    !IN 1/(DELTA PHI)                          UVADV1E.138    
     &,ADVECTION_TIMESTEP       !IN                                        UVADV1E.139    
     &,NU_BASIC                 !IN STANDARD NU TERM FOR MODEL RUN.        UVADV1E.140    
     &,F1(U_FIELD)              !IN A CORIOLIS TERM (SEE DOCUMENTATION)    UVADV1E.141    
     &,F2(U_FIELD)              !IN A CORIOLIS TERM (SEE DOCUMENTATION)    UVADV1E.142    
                                                                           UVADV1E.143    
      REAL                                                                 UVADV1E.144    
     & OMEGA(U_FIELD,P_LEVELS) !OUT TRUE VERTICAL VELOCITY                 UVADV1E.145    
                                                                           UVADV1E.146    
C*L   DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE-----------------    UVADV1E.147    
C DEFINE LOCAL ARRAYS: 35 ARE REQUIRED                                     UVADV1E.148    
      REAL                                                                 UVADV1E.149    
     & RS_U(U_FIELD,P_LEVELS)          ! RS AT U POINTS FOR CURRENT LEVE   UVADV1E.150    
     &,ETADOT_U(U_FIELD,P_LEVELS+1)  ! ETADOT AT U POINTS FOR CURRENT LE   UVADV1E.151    
     &,U_MEAN_P(U_FIELD,P_LEVELS) ! U MEAN AT P POINTS FOR CURRENT LEVEL   UVADV1E.152    
     &                   !   WITH FIRST POINT OF FIELD NOW                 UVADV1E.153    
     &                   !   BEING FIRST P POINT ON SECOND ROW             UVADV1E.154    
     &                   !   OF P-GRID.                                    UVADV1E.155    
     &,V_MEAN_P(U_FIELD,P_LEVELS) ! V MEAN AT P POINTS FOR CURRENT LEVEL   UVADV1E.156    
     &                   !   WITH FIRST POINT OF FIELD NOW                 UVADV1E.157    
     &                   !   BEING FIRST P POINT ON SECOND ROW             UVADV1E.158    
     &                   !   OF P-GRID.                                    UVADV1E.159    
                                                                           UVADV1E.160    
      REAL                                                                 UVADV1E.161    
     & U_SECOND_INC(U_FIELD,P_LEVELS)      ! HOLDS U INCREMENT             UVADV1E.162    
     &                            !RETURNED BY SECOND CALL TO ADV_U_GD     UVADV1E.163    
     &,U_PROV(U_FIELD,P_LEVELS)            ! HOLDS PROVISIONAL VALUE OF    UVADV1E.164    
                                                                           UVADV1E.165    
      REAL                                                                 UVADV1E.166    
     & V_SECOND_INC(U_FIELD,P_LEVELS)      ! HOLDS V INCREMENT             UVADV1E.167    
     &                            !RETURNED BY SECOND CALL TO ADV_U_GD     UVADV1E.168    
     &,V_PROV(U_FIELD,P_LEVELS)            ! HOLDS PROVISIONAL VALUE OF    UVADV1E.169    
                                                                           UVADV1E.170    
C NP DENOTES NORTH POLE, SP DENOTES SOUTH POLE.                            UVADV1E.171    
C POLAR INCREMENT ARRAYS ARE NOT USED IN LIMITED AREA MODEL BUT TO         UVADV1E.172    
C REMOVE THEM WOULD LEAD TO MODIFYING THE NUMBER OF VARIABLES              UVADV1E.173    
C PASSED TO ADV_U_GD. THE RETENTION OF THESE ARRAYS ADDS ONLY              UVADV1E.174    
C 12*ROW_LENGTH TO THE SPACE USED AND NOTHING TO THE CALCULATION           UVADV1E.175    
C TIME AS ALL USES OF THEM IN CALCULATION ARE CONTROLLED BY *IF'S.         UVADV1E.176    
                                                                           UVADV1E.177    
      REAL                                                                 UVADV1E.178    
     & NUX(X_FIELD,P_LEVELS)      ! COURANT NUMBER DEPENDENT NU AT U POI   UVADV1E.179    
     &                    ! USED IN EAST-WEST ADVECTION.                   UVADV1E.180    
     &,NUY(X_FIELD,P_LEVELS)      ! COURANT NUMBER DEPENDENT NU AT U POI   UVADV1E.181    
     &                    ! USED IN NORTH-SOUTH ADVECTION.                 UVADV1E.182    
                                                                           UVADV1E.183    
      REAL NUX_MIN(upd_U_ROWS,P_LEVELS),                                   UVADV1E.184    
!          minimum value of NUX along a row                                UVADV1E.185    
     &     NUY_MIN(ROW_LENGTH-2*EW_Halo,P_LEVELS)                          UVADV1E.186    
!          minimum value of NUY along a column                             UVADV1E.187    
                                                                           UVADV1E.188    
      REAL                                                                 UVADV1E.189    
     & DELTA_AKH(P_LEVELS+1)     ! LAYER THICKNESS  AK(K) - AK(K-1)        UVADV1E.190    
     &,DELTA_BKH(P_LEVELS+1)     ! LAYER THICKNESS  BK(K) - BK(K-1)        UVADV1E.191    
     &,WK(U_FIELD)               ! WK AS IN EQUATION (46).                 UVADV1E.192    
                                                                           UVADV1E.193    
! Work space required to allow the use of Fourth Order Advection           UVADV1E.194    
! U/V_MEAN_P_COPY and U/V_COPY arrays are defined with an extra halo       UVADV1E.195    
! this is required for the bigger stencil of the 4th order operator.       UVADV1E.196    
                                                                           UVADV1E.197    
      REAL U_MEAN_P_COPY((ROW_LENGTH+2*extra_EW_Halo)*                     UVADV1E.198    
     &                   (tot_U_ROWS+2*extra_NS_Halo),P_LEVELS),           UVADV1E.199    
     &  !    Copy of U_MEAN with extra halo space for 4th order            UVADV1E.200    
     &     V_MEAN_P_COPY((ROW_LENGTH+2*extra_EW_Halo)*                     UVADV1E.201    
     &                   (tot_U_ROWS+2*extra_NS_Halo),P_LEVELS),           UVADV1E.202    
     &  !    Copy of V_MEAN with extra halo space for 4th order            UVADV1E.203    
     &     U_COPY((ROW_LENGTH+2*extra_EW_Halo)*                            UVADV1E.204    
     &            (tot_U_ROWS+2*extra_NS_Halo),P_LEVELS),                  UVADV1E.205    
     &  !    Copy of U with extra halo space for 4th order                 UVADV1E.206    
     &     V_COPY((ROW_LENGTH+2*extra_EW_Halo)*                            UVADV1E.207    
     &            (tot_U_ROWS+2*extra_NS_Halo),P_LEVELS)                   UVADV1E.208    
     &  !    Copy of V with extra halo space for 4th order                 UVADV1E.209    
                                                                           UVADV1E.210    
      INTEGER  extended_P_FIELD,                                           UVADV1E.211    
     &         extended_U_FIELD                                            UVADV1E.212    
!  These are the sizes of the arrays with the extra halos                  UVADV1E.213    
                                                                           UVADV1E.214    
C*---------------------------------------------------------------------    UVADV1E.215    
C DEFINE LOCAL VARIABLES                                                   UVADV1E.216    
      INTEGER                                                              UVADV1E.217    
     &  U_POINTS_UPDATE    ! NUMBER OF U POINTS TO BE UPDATED.             UVADV1E.218    
     &                     !  = (ROWS-1)*ROWLENGTH                         UVADV1E.219    
                                                                           UVADV1E.220    
C REAL SCALARS                                                             UVADV1E.221    
      REAL                                                                 UVADV1E.222    
     & SCALAR1,SCALAR2,SCALAR3,SCALAR4,TIMESTEP                            UVADV1E.223    
                                                                           UVADV1E.224    
C COUNT VARIABLES FOR DO LOOPS ETC.                                        UVADV1E.225    
      INTEGER                                                              UVADV1E.226    
     &  I,J,KP,KM,IK,K,IL                                                  UVADV1E.227    
      INTEGER I_start,I_end                                                UVADV1E.228    
      INTEGER info  ! return code from comms                               UVADV1E.229    
                                                                           UVADV1E.230    
C*L   EXTERNAL SUBROUTINE CALLS:---------------------------------------    UVADV1E.231    
      EXTERNAL ADV_U_GD,POLAR_UV,V_CORIOL,UV_TO_P,P_TO_UV                  UVADV1E.232    
*IF DEF,CRAY                                                               UVADV1E.233    
      INTEGER ISMIN                                                        UVADV1E.234    
      EXTERNAL ISMIN                                                       UVADV1E.235    
*ENDIF                                                                     UVADV1E.236    
C*---------------------------------------------------------------------    UVADV1E.237    
                                                                           UVADV1E.238    
CL    MAXIMUM VECTOR LENGTH ASSUMED IS (ROWS+1) * ROWLENGTH                UVADV1E.239    
CL---------------------------------------------------------------------    UVADV1E.240    
CL    INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS:                       UVADV1E.241    
CL---------------------------------------------------------------------    UVADV1E.242    
CL                                                                         UVADV1E.243    
CL---------------------------------------------------------------------    UVADV1E.244    
CL    SECTION 1.     INITIALISATION                                        UVADV1E.245    
CL---------------------------------------------------------------------    UVADV1E.246    
C INCLUDE LOCAL CONSTANTS FROM GENERAL CONSTANTS BLOCK                     UVADV1E.247    
                                                                           UVADV1E.248    
      U_POINTS_UPDATE = upd_U_ROWS*ROW_LENGTH                              UVADV1E.249    
                                                                           UVADV1E.250    
! Initialise RS_U prior to P_TO_UV call                                    UVADV1E.251    
      DO K=1,P_LEVELS                                                      UVADV1E.252    
! cdir$ cache_bypass rs_u                                                  GSM4F405.10     
        DO I=1,FIRST_VALID_PT-1                                            UVADV1E.254    
          RS_U(I,K)=0.0                                                    UVADV1E.255    
        ENDDO                                                              UVADV1E.256    
! cdir$ cache_bypass rs_u                                                  GSM4F405.11     
        DO I=LAST_U_VALID_PT-ROW_LENGTH,U_FIELD                            UVADV1E.258    
          RS_U(I,K)=0.0                                                    UVADV1E.259    
      ENDDO                                                                UVADV1E.260    
      ENDDO                                                                UVADV1E.261    
                                                                           UVADV1E.262    
      DO K=1,P_LEVELS                                                      UVADV1E.263    
CL    INTERPOLATE RS ONTO U GRID.                                          UVADV1E.264    
                                                                           UVADV1E.265    
        CALL P_TO_UV(RS(FIRST_VALID_PT,K),RS_U(FIRST_VALID_PT,K),          UVADV1E.266    
     &               P_FIELD-FIRST_VALID_PT+1,U_FIELD-FIRST_VALID_PT+1,    UVADV1E.267    
     &               ROW_LENGTH,VALID_P_ROWS)                              UVADV1E.268    
      ENDDO                                                                UVADV1E.269    
                                                                           UVADV1E.270    
CL    INTERPOLATE ETADOT ONTO U GRID AND INCLUDE BOTTOM AND TOP            UVADV1E.271    
CL    BOUNDARY CONDITION                                                   UVADV1E.272    
                                                                           UVADV1E.273    
      DO K =2, P_LEVELS                                                    UVADV1E.274    
                                                                           UVADV1E.275    
        CALL P_TO_UV(ETADOT_MEAN(FIRST_VALID_PT,K),                        UVADV1E.276    
     &               ETADOT_U(FIRST_VALID_PT,K),                           UVADV1E.277    
     &               P_FIELD-FIRST_VALID_PT+1,U_FIELD-FIRST_VALID_PT+1,    UVADV1E.278    
     &               ROW_LENGTH,VALID_P_ROWS)                              UVADV1E.279    
      END DO                                                               UVADV1E.280    
      DO I = FIRST_VALID_PT,LAST_U_VALID_PT                                UVADV1E.281    
        ETADOT_U(I,1) = 0.0                                                UVADV1E.282    
        ETADOT_U(I,P_LEVELS+1) = 0.0                                       UVADV1E.283    
      END DO                                                               UVADV1E.284    
                                                                           UVADV1E.285    
      IF (LWHITBROM) THEN                                                  UVADV1E.286    
                                                                           UVADV1E.287    
                                                                           UVADV1E.288    
CL    CALCULATE BRSP TERM AT LEVEL K                                       UVADV1E.289    
C STORE IN OMEGA TO SAVE WORKSPACE                                         UVADV1E.290    
                                                                           UVADV1E.291    
        K=1                                                                UVADV1E.292    
        DO I=FIRST_VALID_PT,LAST_U_VALID_PT                                UVADV1E.293    
          OMEGA(I,K)=(3.*RS_U(I,K)+RS_U(I,K+1))*(RS_U(I,K)-RS_U(I,K+1))    UVADV1E.294    
     &                  *BKH(K+1)*.25*(PSTAR(I)-PSTAR_OLD(I))              UVADV1E.295    
        ENDDO                                                              UVADV1E.296    
        K=P_LEVELS                                                         UVADV1E.297    
        DO I=FIRST_VALID_PT,LAST_U_VALID_PT                                UVADV1E.298    
          OMEGA(I,K)=-(3.*RS_U(I,K)+RS_U(I,K-1))*(RS_U(I,K)-RS_U(I,K-1))   UVADV1E.299    
     &                   *BKH(K)*.25*(PSTAR(I)-PSTAR_OLD(I))               UVADV1E.300    
        ENDDO                                                              UVADV1E.301    
                                                                           UVADV1E.302    
        DO K=2,P_LEVELS -1                                                 UVADV1E.303    
          DO I=FIRST_VALID_PT,LAST_U_VALID_PT                              UVADV1E.304    
            OMEGA(I,K)=((3.*RS_U(I,K)+RS_U(I,K+1))                         UVADV1E.305    
     &                *(RS_U(I,K)-RS_U(I,K+1))*BKH(K+1)                    UVADV1E.306    
     &                *.25*(PSTAR(I)-PSTAR_OLD(I)))                        UVADV1E.307    
     &                -((3.*RS_U(I,K)+RS_U(I,K-1))                         UVADV1E.308    
     &                *(RS_U(I,K)-RS_U(I,K-1))*BKH(K)                      UVADV1E.309    
     &                *.25*(PSTAR(I)-PSTAR_OLD(I)))                        UVADV1E.310    
          ENDDO                                                            UVADV1E.311    
                                                                           UVADV1E.312    
        ENDDO                                                              UVADV1E.313    
      ENDIF                                                                UVADV1E.314    
                                                                           UVADV1E.315    
! Precalculate U_MEAN and V_MEAN interpolated onto P grid - since it       UVADV1E.316    
! requires a call to SWAPBOUNDS, if we do it outside the main loop         UVADV1E.317    
! over levels, we can do just one call rather than a seperate call         UVADV1E.318    
! for each level (inefficient)                                             UVADV1E.319    
                                                                           UVADV1E.320    
      DO K=1,P_LEVELS                                                      UVADV1E.321    
! Initialise U_MEAN_P and V_MEAN_P prior to UV_P call                      UVADV1E.322    
! cdir$ cache_bypass u_mean_p                                              GSM4F405.12     
        DO I=1,FIRST_VALID_PT-1                                            UVADV1E.324    
        U_MEAN_P(I,K)=0.0                                                  UVADV1E.325    
        ENDDO                                                              UVADV1E.326    
! cdir$ cache_bypass u_mean_p                                              GSM4F405.13     
        DO I=LAST_U_VALID_PT+1,U_FIELD                                     UVADV1E.328    
          U_MEAN_P(I,K)=0.0                                                UVADV1E.329    
        ENDDO                                                              UVADV1E.330    
! cdir$ cache_bypass v_mean_p                                              GSM4F405.14     
        DO I=1,FIRST_VALID_PT-1                                            UVADV1E.332    
        V_MEAN_P(I,K)=0.0                                                  UVADV1E.333    
      ENDDO                                                                UVADV1E.334    
! cdir$ cache_bypass v_mean_p                                              GSM4F405.15     
        DO I=LAST_U_VALID_PT+1,U_FIELD                                     UVADV1E.336    
          V_MEAN_P(I,K)=0.0                                                UVADV1E.337    
        ENDDO                                                              UVADV1E.338    
                                                                           UVADV1E.339    
        CALL UV_TO_P(U_MEAN(FIRST_VALID_PT,K),                             UVADV1E.340    
     &               U_MEAN_P(FIRST_VALID_PT,K),                           UVADV1E.341    
     &               U_FIELD-FIRST_VALID_PT+1,                             UVADV1E.342    
     &               U_FIELD-FIRST_VALID_PT+1,                             UVADV1E.343    
     &               ROW_LENGTH,upd_U_ROWS+2)                              UVADV1E.344    
                                                                           UVADV1E.345    
                                                                           UVADV1E.346    
        CALL UV_TO_P(V_MEAN(FIRST_VALID_PT,K),                             UVADV1E.347    
     &               V_MEAN_P(FIRST_VALID_PT,K),                           UVADV1E.348    
     &               U_FIELD-FIRST_VALID_PT+1,                             UVADV1E.349    
     &               U_FIELD-FIRST_VALID_PT+1,                             UVADV1E.350    
     &               ROW_LENGTH,upd_U_ROWS+2)                              UVADV1E.351    
                                                                           UVADV1E.352    
      ENDDO                                                                UVADV1E.353    
                                                                           UVADV1E.354    
CFPP$ NOCONCUR                                                             UVADV1E.355    
      DO I=2,P_LEVELS                                                      UVADV1E.356    
        DELTA_AKH(I) = AK(I) - AK(I-1)                                     UVADV1E.357    
        DELTA_BKH(I) = BK(I) - BK(I-1)                                     UVADV1E.358    
      ENDDO                                                                UVADV1E.359    
C THESE ZERO VALUES SAVE HAVING TO PASS THE ZERO VERTICAL VELOCITIES       UVADV1E.360    
C ON LOWER AND UPPER BOUNDARIES TO V_CORIOL AS THE ZERO VELOCITIES ARE     UVADV1E.361    
C NOT HELD. (SEE CALL TO V_CORIOL IN SECTION 3.3)                          UVADV1E.362    
      DELTA_AKH(1) = 0.0                                                   UVADV1E.363    
      DELTA_BKH(1) = 0.0                                                   UVADV1E.364    
      DELTA_AKH(P_LEVELS+1) = 0.0                                          UVADV1E.365    
      DELTA_BKH(P_LEVELS+1) = 0.0                                          UVADV1E.366    
                                                                           UVADV1E.367    
! In order to use the same call to adv_u_gd for both the second and        UVADV1E.368    
! fourth order advection, U/V_MEAN_P are copied into _COPY arrays.         UVADV1E.369    
! In the case of second order advection some of the work space is          UVADV1E.370    
! wasted as there is more halo than we need.                               UVADV1E.371    
                                                                           UVADV1E.372    
! Calculate the size of the extended arrays which contain an               UVADV1E.373    
! extra halo:                                                              UVADV1E.374    
      extended_U_FIELD=(ROW_LENGTH+2*extra_EW_Halo)*                       UVADV1E.375    
     &                 (tot_U_ROWS+2*extra_NS_Halo)                        UVADV1E.376    
      extended_P_FIELD=(ROW_LENGTH+2*extra_EW_Halo)*                       UVADV1E.377    
     &                 (tot_P_ROWS+2*extra_NS_Halo)                        UVADV1E.378    
                                                                           UVADV1E.379    
      IF (L_SECOND) THEN                                                   UVADV1E.380    
                                                                           UVADV1E.381    
! Copy U/V_MEAN to U/V_MEAN_COPY with the same sized halos                 UVADV1E.382    
        CALL COPY_FIELD(U_MEAN_P,U_MEAN_P_COPY,                            UVADV1E.383    
     &                  U_FIELD,extended_U_FIELD,                          UVADV1E.384    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    UVADV1E.385    
     &                  EW_Halo,NS_Halo,                                   UVADV1E.386    
     &                  EW_Halo,NS_Halo,                                   UVADV1E.387    
     &                  .FALSE.)                                           UVADV1E.388    
        CALL COPY_FIELD(V_MEAN_P,V_MEAN_P_COPY,                            UVADV1E.389    
     &                  U_FIELD,extended_U_FIELD,                          UVADV1E.390    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    UVADV1E.391    
     &                  EW_Halo,NS_Halo,                                   UVADV1E.392    
     &                  EW_Halo,NS_Halo,                                   UVADV1E.393    
     &                  .FALSE.)                                           UVADV1E.394    
                                                                           UVADV1E.395    
      ELSE  ! if its fourth order:                                         UVADV1E.396    
                                                                           UVADV1E.397    
        CALL COPY_FIELD(U_MEAN_P,U_MEAN_P_COPY,                            UVADV1E.398    
     &                  U_FIELD,extended_U_FIELD,                          UVADV1E.399    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    UVADV1E.400    
     &                  EW_Halo,NS_Halo,                                   UVADV1E.401    
     &                  halo_4th,halo_4th,                                 UVADV1E.402    
     &                  .TRUE.)                                            UVADV1E.403    
        CALL COPY_FIELD(V_MEAN_P,V_MEAN_P_COPY,                            UVADV1E.404    
     &                  U_FIELD,extended_U_FIELD,                          UVADV1E.405    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    UVADV1E.406    
     &                  EW_Halo,NS_Halo,                                   UVADV1E.407    
     &                  halo_4th,halo_4th,                                 UVADV1E.408    
     &                  .TRUE.)                                            UVADV1E.409    
        CALL COPY_FIELD(U,U_COPY,                                          UVADV1E.410    
     &                  U_FIELD,extended_U_FIELD,                          UVADV1E.411    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    UVADV1E.412    
     &                  EW_Halo,NS_Halo,                                   UVADV1E.413    
     &                  halo_4th,halo_4th,                                 UVADV1E.414    
     &                  .TRUE.)                                            UVADV1E.415    
        CALL COPY_FIELD(V,V_COPY,                                          UVADV1E.416    
     &                  U_FIELD,extended_U_FIELD,                          UVADV1E.417    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    UVADV1E.418    
     &                  EW_Halo,NS_Halo,                                   UVADV1E.419    
     &                  halo_4th,halo_4th,                                 UVADV1E.420    
     &                  .TRUE.)                                            UVADV1E.421    
                                                                           UVADV1E.422    
       ENDIF ! IF (L_SECOND)                                               UVADV1E.423    
                                                                           UVADV1E.424    
CL---------------------------------------------------------------------    UVADV1E.425    
CL    SECTION 2.     ADVECTION OF U AND V.                                 UVADV1E.426    
CL                   SECTION 2 WILL CALCULATE PROVISIONAL VALUES OF        UVADV1E.427    
CL                   U AND V. SECTION 3 WILL CALCULATE FINAL VALUES.       UVADV1E.428    
CL---------------------------------------------------------------------    UVADV1E.429    
                                                                           UVADV1E.430    
CL LOOP OVER P_LEVELS.                                                     UVADV1E.431    
C-----------------------------------------------------------------         ARB0F405.29     
C                                                                          ARB0F405.30     
C U_SECOND_INC is used for                                                 ARB0F405.31     
C                          1./(RS_U(I,K)*RS_U(I,K)                         ARB0F405.32     
C    &                    *(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I)))         ARB0F405.33     
C-----------------------------------------------------------------         ARB0F405.34     
      DO K=1,P_LEVELS                                                      ARB0F405.35     
        DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO                       ARB0F405.36     
           U_SECOND_INC(I,K) = 1.0/(RS_U(I,K)*RS_U(I,K)*                   ARB0F405.37     
     &              (DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I)))                ARB0F405.38     
        END DO                                                             ARB0F405.39     
      END DO                                                               ARB0F405.40     
                                                                           UVADV1E.432    
!L If NU_BASIC not equal to zero (ie. 4th order)                           UVADV1E.433    
      IF (.NOT. L_SECOND) THEN                                             UVADV1E.434    
                                                                           UVADV1E.435    
      TIMESTEP=ADVECTION_TIMESTEP                                          UVADV1E.436    
                                                                           UVADV1E.437    
      DO K=1,P_LEVELS                                                      UVADV1E.438    
                                                                           UVADV1E.439    
C ---------------------------------------------------------------------    UVADV1E.440    
CL    SECTION 2.1    SET NU DEPENDENT ON NU_BASIC AND MAX COURANT          UVADV1E.441    
CL                   NUMBER.                                               UVADV1E.442    
C ---------------------------------------------------------------------    UVADV1E.443    
CL    THEN SET NU DEPENDENT ON NU_BASIC AND MAX                            UVADV1E.444    
CL    COURANT NUMBER.                                                      UVADV1E.445    
CL CALCULATE COURANT NUMBER SQUARED.                                       UVADV1E.446    
C-----------------------------------------------------------------         ARB0F405.41     
          DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO                     UVADV1E.453    
            SCALAR1 = U_MEAN_P(I,K)*LONGITUDE_STEP_INVERSE                 UVADV1E.457    
            SCALAR2 = V_MEAN_P(I,K)*LATITUDE_STEP_INVERSE                  UVADV1E.458    
            SCALAR3 = TIMESTEP*U_SECOND_INC(I,K)                           UVADV1E.459    
            SCALAR4 = SEC_U_LATITUDE(I)*SCALAR3                            UVADV1E.460    
            SCALAR1 = SCALAR1*SCALAR1                                      UVADV1E.461    
            SCALAR2 = SCALAR2*SCALAR2                                      UVADV1E.462    
            SCALAR3 = SCALAR3*SCALAR3                                      UVADV1E.463    
            SCALAR4 = SCALAR4*SCALAR4                                      UVADV1E.464    
CL    CALCULATE NU PARAMETER.                                              UVADV1E.465    
                                                                           UVADV1E.466    
            NUX(I,K) = (1.- SCALAR4*SCALAR1)*NU_BASIC                      UVADV1E.467    
            NUY(I,K) = (1.- SCALAR3*SCALAR2)*NU_BASIC                      UVADV1E.468    
          ENDDO                                                            UVADV1E.469    
                                                                           UVADV1E.470    
! Set NUX equal to minimum value along each row                            UVADV1E.471    
                                                                           UVADV1E.472    
                                                                           UVADV1E.473    
          DO J=FIRST_ROW,FIRST_ROW+upd_U_ROWS-1                            UVADV1E.474    
            I_start=(J-1)*ROW_LENGTH+FIRST_ROW_PT ! start and end of row   UVADV1E.475    
            I_end=(J-1)*ROW_LENGTH+LAST_ROW_PT    ! missing out halos      UVADV1E.476    
! Calculate minimum along this row                                         UVADV1E.477    
                                                                           UVADV1E.478    
                                                                           UVADV1E.479    
*IF DEF,CRAY                                                               UVADV1E.480    
            IK=ISMIN(I_end-I_start+1,NUX(I_start,K),1)                     UVADV1E.481    
            SCALAR1=NUX(IK+I_start-1,K)                                    UVADV1E.482    
*ELSE                                                                      UVADV1E.483    
            SCALAR1=NUX(I_start,K)                                         UVADV1E.484    
            DO I=I_start+1,I_end                                           UVADV1E.485    
              IF (NUX(I,K) .LT. SCALAR1) SCALAR1=NUX(I,K)                  UVADV1E.486    
            ENDDO                                                          UVADV1E.487    
*ENDIF                                                                     UVADV1E.488    
            NUX_MIN(J-FIRST_ROW+1,K)=MAX(SCALAR1,0.0)                      UVADV1E.489    
! The indexing of NUX_MIN goes from 1..ROWS                                UVADV1E.490    
          ENDDO ! J : loop over rows                                       UVADV1E.491    
                                                                           UVADV1E.492    
! Set NUY equal to minimum value along each column                         UVADV1E.493    
                                                                           UVADV1E.494    
          DO J=FIRST_ROW_PT,LAST_ROW_PT                                    UVADV1E.495    
            I_start=(FIRST_ROW-1)*ROW_LENGTH+J                             UVADV1E.496    
! I_start points to the beginning of column J                              UVADV1E.497    
                                                                           UVADV1E.498    
! Calculate the minimum along this column                                  UVADV1E.499    
*IF DEF,CRAY                                                               UVADV1E.500    
            IK=ISMIN(upd_U_ROWS,NUY(I_start,K),ROW_LENGTH)                 UVADV1E.501    
            SCALAR1=NUY((IK-1)*ROW_LENGTH+I_start,K)                       UVADV1E.502    
*ELSE                                                                      UVADV1E.503    
            I_end=I_start+(upd_U_ROWS-1)*ROW_LENGTH                        UVADV1E.504    
! I_end points to the end of column J                                      UVADV1E.505    
            SCALAR1=NUY(I_start,K)                                         UVADV1E.506    
            DO I=I_start+ROW_LENGTH,I_end,ROW_LENGTH                       UVADV1E.507    
              IF (NUY(I,K) .LT. SCALAR1) SCALAR1=NUY(I,K)                  UVADV1E.508    
            ENDDO                                                          UVADV1E.509    
*ENDIF                                                                     UVADV1E.510    
            NUY_MIN(J-FIRST_ROW_PT+1,K)=MAX(SCALAR1,0.0)                   UVADV1E.511    
                                                                           UVADV1E.512    
          ENDDO ! J : loop over columns                                    UVADV1E.513    
                                                                           UVADV1E.514    
      ENDDO ! K: loop over levels                                          UVADV1E.515    
                                                                           UVADV1E.516    
! We have so far only calculated local NUX_MIN and NUY_MINs. We must       UVADV1E.517    
! now calculate the minimum values across all processors in the row/       UVADV1E.518    
! column respectively.                                                     UVADV1E.519    
                                                                           UVADV1E.520    
      CALL GCG_RMIN(upd_U_ROWS*P_LEVELS,GC_ROW_GROUP,info,NUX_MIN)         UVADV1E.521    
                                                                           UVADV1E.522    
      CALL GCG_RMIN((ROW_LENGTH-2*EW_Halo)*P_LEVELS,GC_COL_GROUP,          UVADV1E.523    
     &              info,NUY_MIN)                                          UVADV1E.524    
                                                                           UVADV1E.525    
! And now copy these values back to NUX and NUY arrays                     UVADV1E.526    
                                                                           UVADV1E.527    
      DO K=1,P_LEVELS                                                      UVADV1E.528    
                                                                           UVADV1E.529    
        DO J=FIRST_ROW,FIRST_ROW+upd_U_ROWS-1                              UVADV1E.530    
                                                                           UVADV1E.531    
          DO I=FIRST_ROW_PT,LAST_ROW_PT                                    UVADV1E.532    
                                                                           UVADV1E.533    
            NUX(I+(J-1)*ROW_LENGTH,K)=NUX_MIN(J-FIRST_ROW+1,K)             UVADV1E.534    
                                                                           UVADV1E.535    
            NUY(I+(J-1)*ROW_LENGTH,K)=NUY_MIN(I-FIRST_ROW_PT+1,K)          UVADV1E.536    
                                                                           UVADV1E.537    
            ENDDO                                                          UVADV1E.538    
                                                                           UVADV1E.539    
        ENDDO                                                              UVADV1E.540    
                                                                           UVADV1E.541    
      ENDDO                                                                UVADV1E.542    
                                                                           UVADV1E.543    
      ENDIF ! End of 4th order calculations                                UVADV1E.544    
                                                                           UVADV1E.545    
                                                                           UVADV1E.546    
C ---------------------------------------------------------------------    UVADV1E.547    
CL    SECTION 2.3    CALL ADV_U_GD TO OBTAIN FIRST INCREMENT DUE TO        UVADV1E.548    
CL                   ADVECTION.                                            UVADV1E.549    
C ---------------------------------------------------------------------    UVADV1E.550    
                                                                           UVADV1E.551    
        TIMESTEP=ADVECTION_TIMESTEP                                        UVADV1E.552    
                                                                           UVADV1E.553    
C BRSP IS CURRENTLY HELD IN OMEGA                                          UVADV1E.554    
                                                                           UVADV1E.555    
                                                                           UVADV1E.556    
          CALL ADV_U_GD(P_LEVELS,U,                                        UVADV1E.557    
     &                    U_MEAN_P_COPY,V_MEAN_P_COPY,                     UVADV1E.558    
     &                    ETADOT_U,                                        UVADV1E.559    
     &                    SEC_U_LATITUDE,U_PROV,                           UVADV1E.560    
     &                    NUX,NUY,U_FIELD,                                 UVADV1E.561    
     &                    ROW_LENGTH,                                      UVADV1E.562    
*CALL ARGFLDPT                                                             UVADV1E.563    
     &                    TIMESTEP,LATITUDE_STEP_INVERSE,                  UVADV1E.564    
     &                    LONGITUDE_STEP_INVERSE,SEC_P_LATITUDE,           UVADV1E.565    
     &                    OMEGA,L_SECOND,LWHITBROM,                        UVADV1E.566    
     &                    U_COPY,extended_U_FIELD,                         UVADV1E.567    
     &                    extended_address)                                UVADV1E.568    
                                                                           UVADV1E.569    
CL    CALL ADV_U_GD FOR V.                                                 UVADV1E.570    
          CALL ADV_U_GD(P_LEVELS,V,                                        UVADV1E.571    
     &                    U_MEAN_P_COPY,V_MEAN_P_COPY,                     UVADV1E.572    
     &                    ETADOT_U,                                        UVADV1E.573    
     &                    SEC_U_LATITUDE,V_PROV,                           UVADV1E.574    
     &                    NUX,NUY,U_FIELD,                                 UVADV1E.575    
     &                    ROW_LENGTH,                                      UVADV1E.576    
*CALL ARGFLDPT                                                             UVADV1E.577    
     &                    TIMESTEP,LATITUDE_STEP_INVERSE,                  UVADV1E.578    
     &                    LONGITUDE_STEP_INVERSE,SEC_P_LATITUDE,           UVADV1E.579    
     &                    OMEGA,L_SECOND,LWHITBROM,                        UVADV1E.580    
     &                    V_COPY,extended_U_FIELD,                         UVADV1E.581    
     &                    extended_address)                                UVADV1E.582    
                                                                           UVADV1E.583    
                                                                           UVADV1E.584    
C ---------------------------------------------------------------------    UVADV1E.585    
CL    SECTION 2.4    REMOVE MASS-WEIGHTING FROM INCREMENT AND ADD ONTO     UVADV1E.586    
CL                   FIELD TO OBTAIN INTERMEDIATE VALUE.                   UVADV1E.587    
C ---------------------------------------------------------------------    UVADV1E.588    
                                                                           UVADV1E.589    
       DO K=1,P_LEVELS                                                     UVADV1E.590    
                                                                           UVADV1E.591    
                                                                           UVADV1E.592    
c-----------------------------------------------------------------         UVADV1E.593    
c                                                                          UVADV1E.594    
c U_SECOND_INC is used for                                                 UVADV1E.595    
c                          1./(RS_U(I,K)*RS_U(I,K)                         UVADV1E.596    
c    &                    *(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I))          UVADV1E.597    
c-----------------------------------------------------------------         UVADV1E.598    
          DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO-1                   UVADV1E.599    
                                                                           UVADV1E.600    
            SCALAR1=U_SECOND_INC(I,K)                                      UVADV1E.601    
            U_PROV(I,K) = U(I,K)- U_PROV(I,K)*SCALAR1                      UVADV1E.602    
            V_PROV(I,K) = V(I,K)-V_PROV(I,K)*SCALAR1                       UVADV1E.603    
          ENDDO                                                            UVADV1E.604    
                                                                           UVADV1E.605    
                                                                           UVADV1E.606    
                                                                           UVADV1E.607    
*IF -DEF,GLOBAL                                                            UVADV1E.608    
CL    LIMITED AREA MODEL THEN FORM PROVISIONAL VALUES ON BOUNDARIES        UVADV1E.609    
CL    EQUAL TO FIELD VALUES AT OLD TIME LEVEL.                             UVADV1E.610    
      IF (at_top_of_LPG) THEN                                              UVADV1E.611    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      UVADV1E.612    
          U_PROV(I,K)= U(I,K)                                              UVADV1E.613    
          V_PROV(I,K)= V(I,K)                                              UVADV1E.614    
        ENDDO                                                              UVADV1E.615    
      ENDIF                                                                UVADV1E.616    
      IF (at_base_of_LPG) THEN                                             UVADV1E.617    
        DO I=U_BOT_ROW_START,U_BOT_ROW_START+ROW_LENGTH-1                  UVADV1E.618    
          U_PROV(I,K)=U(I,K)                                               UVADV1E.619    
          V_PROV(I,K)=V(I,K)                                               UVADV1E.620    
        ENDDO                                                              UVADV1E.621    
      ENDIF                                                                UVADV1E.622    
*ENDIF                                                                     UVADV1E.623    
                                                                           UVADV1E.624    
      ENDDO                                                                UVADV1E.625    
                                                                           UVADV1E.626    
*IF DEF,GLOBAL                                                             UVADV1E.627    
!    IF GLOBAL MODEL CALCULATE PROVISIONAL POLAR VALUES.                   UVADV1E.628    
!    CALL POLAR_UV TO FORM PROVISIONAL VALUES.                             UVADV1E.629    
                                                                           UVADV1E.630    
      CALL POLAR_UV(U_PROV,V_PROV,ROW_LENGTH,                              UVADV1E.631    
     &              U_FIELD,P_LEVELS,                                      UVADV1E.632    
*CALL ARGFLDPT                                                             UVADV1E.633    
     &              COS_U_LONGITUDE,SIN_U_LONGITUDE)                       UVADV1E.634    
*ENDIF                                                                     UVADV1E.635    
                                                                           UVADV1E.636    
                                                                           UVADV1E.637    
      IF (L_SECOND) THEN                                                   UVADV1E.638    
                                                                           UVADV1E.639    
! Swap boundaries of U_PROV and V_PROV                                     UVADV1E.640    
        CALL SWAPBOUNDS(U_PROV,ROW_LENGTH,tot_U_ROWS,                      UVADV1E.641    
     &                  EW_Halo,NS_Halo,P_LEVELS)                          UVADV1E.642    
        CALL SWAPBOUNDS(V_PROV,ROW_LENGTH,tot_U_ROWS,                      UVADV1E.643    
     &                  EW_Halo,NS_Halo,P_LEVELS)                          UVADV1E.644    
                                                                           UVADV1E.645    
                                                                           UVADV1E.646    
      ELSE ! fourth order advection                                        UVADV1E.647    
                                                                           UVADV1E.648    
! Copy U/V_PROV into U/V_COPY which have double halos for fourth           UVADV1E.649    
! order advection, and do swap to fill these halos                         UVADV1E.650    
        CALL COPY_FIELD(U_PROV,U_COPY,                                     UVADV1E.651    
     &                  U_FIELD,extended_U_FIELD,                          UVADV1E.652    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    UVADV1E.653    
     &                  EW_Halo,NS_Halo,                                   UVADV1E.654    
     &                  halo_4th,halo_4th,                                 UVADV1E.655    
     &                  .TRUE.)                                            UVADV1E.656    
                                                                           UVADV1E.657    
        CALL COPY_FIELD(V_PROV,V_COPY,                                     UVADV1E.658    
     &                  U_FIELD,extended_U_FIELD,                          UVADV1E.659    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    UVADV1E.660    
     &                  EW_Halo,NS_Halo,                                   UVADV1E.661    
     &                  halo_4th,halo_4th,                                 UVADV1E.662    
     &                  .TRUE.)                                            UVADV1E.663    
                                                                           UVADV1E.664    
      ENDIF                                                                UVADV1E.665    
                                                                           UVADV1E.666    
CL---------------------------------------------------------------------    UVADV1E.667    
CL    SECTION 3.     Second advection step.                                UVADV1E.668    
CL---------------------------------------------------------------------    UVADV1E.669    
                                                                           UVADV1E.670    
          TIMESTEP = ADVECTION_TIMESTEP                                    UVADV1E.671    
C ---------------------------------------------------------------------    UVADV1E.672    
CL    SECTION 3.1    CALL ADV_U_GD TO OBTAIN SECOND INCREMENT DUE TO       UVADV1E.673    
CL                   ADVECTION.                                            UVADV1E.674    
C ---------------------------------------------------------------------    UVADV1E.675    
                                                                           UVADV1E.676    
                                                                           UVADV1E.677    
CL    CALL ADV_U_GD FOR U.                                                 UVADV1E.678    
                                                                           UVADV1E.679    
C BRSP IS CURRENTLY HELD IN OMEGA                                          UVADV1E.680    
                                                                           UVADV1E.681    
          CALL ADV_U_GD(P_LEVELS,U_PROV,                                   UVADV1E.682    
     &                  U_MEAN_P_COPY,V_MEAN_P_COPY,                       UVADV1E.683    
     &                  ETADOT_U,SEC_U_LATITUDE,                           UVADV1E.684    
     &                  U_SECOND_INC,NUX,NUY,U_FIELD,                      UVADV1E.685    
     &                  ROW_LENGTH,                                        UVADV1E.686    
*CALL ARGFLDPT                                                             UVADV1E.687    
     &                  TIMESTEP,LATITUDE_STEP_INVERSE,                    UVADV1E.688    
     &                  LONGITUDE_STEP_INVERSE,SEC_P_LATITUDE,             UVADV1E.689    
     &                  OMEGA,L_SECOND,LWHITBROM,                          UVADV1E.690    
     &                  U_COPY,extended_U_FIELD,                           UVADV1E.691    
     &                  extended_address)                                  UVADV1E.692    
                                                                           UVADV1E.693    
CL    CALL ADV_U_GD FOR V.                                                 UVADV1E.694    
          CALL ADV_U_GD(P_LEVELS,V_PROV,                                   UVADV1E.695    
     &                  U_MEAN_P_COPY,V_MEAN_P_COPY,                       UVADV1E.696    
     &                  ETADOT_U,SEC_U_LATITUDE,                           UVADV1E.697    
     &                  V_SECOND_INC,NUX,NUY,U_FIELD,                      UVADV1E.698    
     &                  ROW_LENGTH,                                        UVADV1E.699    
*CALL ARGFLDPT                                                             UVADV1E.700    
     &                  TIMESTEP,LATITUDE_STEP_INVERSE,                    UVADV1E.701    
     &                  LONGITUDE_STEP_INVERSE,SEC_P_LATITUDE,             UVADV1E.702    
     &                  OMEGA,L_SECOND,LWHITBROM,                          UVADV1E.703    
     &                  V_COPY,extended_U_FIELD,                           UVADV1E.704    
     &                  extended_address)                                  UVADV1E.705    
                                                                           UVADV1E.706    
C ---------------------------------------------------------------------    UVADV1E.707    
CL    SECTION 3.2    CALL V_CORIOL TO OBTAIN WK AS IN EQUATION (46).       UVADV1E.708    
C ---------------------------------------------------------------------    UVADV1E.709    
                                                                           UVADV1E.710    
                                                                           UVADV1E.711    
      DO K=1,P_LEVELS                                                      UVADV1E.712    
                                                                           UVADV1E.713    
          CALL V_CORIOL(ETADOT_U(1,K),ETADOT_U(1,K+1),PSTAR,               UVADV1E.714    
     &              PSTAR_OLD,U_MEAN_P(1,K),V_MEAN_P(1,K),RS_U(1,K),       UVADV1E.715    
     &              SEC_U_LATITUDE,TIMESTEP,AK(K),BK(K),                   UVADV1E.716    
     &              DELTA_AK(K),DELTA_BK(K),DELTA_AKH(K),                  UVADV1E.717    
     &              DELTA_BKH(K),DELTA_AKH(K+1),DELTA_BKH(K+1),            UVADV1E.718    
     &              ROW_LENGTH,                                            UVADV1E.719    
*CALL ARGFLDPT                                                             UVADV1E.720    
     &              LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE,          UVADV1E.721    
     &              WK,U_FIELD,OMEGA(1,K),LLINTS)                          UVADV1E.722    
                                                                           UVADV1E.723    
C ---------------------------------------------------------------------    UVADV1E.724    
CL    SECTION 3.3    CALCULATE TOTAL MASS-WEIGHTED INCREMENT TO FIELD      UVADV1E.725    
CL                   INCLUDING CORIOLIS TERM AND ADD ONTO MASS-WEIGHTED    UVADV1E.726    
CL                   FIELD.                                                UVADV1E.727    
CL                   IF GLOBAL CALL POLAR_UV TO UPDATE POLAR VALUES.       UVADV1E.728    
CL                   IF LIMITED AREA MASS-WEIGHT BOUNDARY VALUES.          UVADV1E.729    
C ---------------------------------------------------------------------    UVADV1E.730    
                                                                           UVADV1E.731    
      DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO                         UVADV1E.732    
        SCALAR1=RS_U(I,K)*RS_U(I,K)*                                       UVADV1E.733    
     &                           (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I))        UVADV1E.734    
        U_SECOND_INC(I,K)=U_SECOND_INC(I,K)/SCALAR1                        UVADV1E.735    
        V_SECOND_INC(I,K)=V_SECOND_INC(I,K)/SCALAR1                        UVADV1E.736    
        WK(I)=WK(I)/SCALAR1                                                UVADV1E.737    
      END DO                                                               UVADV1E.738    
CL    TOTAL MASS-WEIGHTED INCREMENT IS CALCULATED INCLUDING VERTICAL       UVADV1E.739    
CL    CORIOIS TERM AND ADDED ONTO MASS-WEIGHTED FIELD.                     UVADV1E.740    
                                                                           UVADV1E.741    
                                                                           UVADV1E.742    
        DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO                       UVADV1E.743    
          SCALAR3 = 1./RS_U(I,K)                                           UVADV1E.744    
          U(I,K)=0.5 * (U(I,K)-U_SECOND_INC(I,K)+U_PROV(I,K))              UVADV1E.745    
          V(I,K)=0.5 * (V(I,K)-V_SECOND_INC(I,K)+V_PROV(I,K))              UVADV1E.746    
        ENDDO                                                              UVADV1E.747    
        IF (LWHITBROM) THEN                                                UVADV1E.748    
          DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO                     UVADV1E.749    
            SCALAR3 = 1.0/RS_U(I,K)                                        UVADV1E.750    
            U(I,K) = U(I,K) -(F2(I) + U(I,K)*SCALAR3)*WK(I)*TIMESTEP       UVADV1E.751    
            V(I,K) = V(I,K) +(F1(I) - V(I,K)*SCALAR3)*WK(I)*TIMESTEP       UVADV1E.752    
          ENDDO                                                            UVADV1E.753    
        ENDIF                                                              UVADV1E.754    
                                                                           UVADV1E.755    
CL    SET POLAR VALUES FOR OMEGA                                           UVADV1E.756    
      IF (at_top_of_LPG) THEN                                              UVADV1E.757    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      UVADV1E.758    
          OMEGA(I,K)=OMEGA(I+ROW_LENGTH,K)                                 UVADV1E.759    
        ENDDO                                                              UVADV1E.760    
      ENDIF                                                                UVADV1E.761    
      IF (at_base_of_LPG) THEN                                             UVADV1E.762    
        DO I=U_BOT_ROW_START,U_BOT_ROW_START+ROW_LENGTH-1                  UVADV1E.763    
          OMEGA(I,K)=OMEGA(I-ROW_LENGTH,K)                                 UVADV1E.764    
        ENDDO                                                              UVADV1E.765    
      ENDIF                                                                UVADV1E.766    
                                                                           UVADV1E.767    
CL END LOOP OVER P_LEVELS                                                  UVADV1E.768    
      ENDDO                                                                UVADV1E.769    
                                                                           UVADV1E.770    
*IF DEF,GLOBAL                                                             UVADV1E.771    
!    UPDATE POLAR VALUES BY CALLING POLAR_UV.                              UVADV1E.772    
                                                                           UVADV1E.773    
      CALL POLAR_UV(U,V,ROW_LENGTH,                                        UVADV1E.774    
     &              U_FIELD,P_LEVELS,                                      UVADV1E.775    
*CALL ARGFLDPT                                                             UVADV1E.776    
     &              COS_U_LONGITUDE,SIN_U_LONGITUDE)                       UVADV1E.777    
*ENDIF                                                                     UVADV1E.778    
                                                                           UVADV1E.779    
CL MASS WEIGHT THE OUTPUT FIELDS                                           UVADV1E.780    
                                                                           UVADV1E.781    
      DO K=1,P_LEVELS                                                      UVADV1E.782    
        DO I=FIRST_FLD_PT,LAST_U_FLD_PT                                    UVADV1E.783    
          U(I,K)=U(I,K)*RS_U(I,K)*RS_U(I,K)*(DELTA_AK(K)+                  UVADV1E.784    
     &           DELTA_BK(K)*PSTAR(I))                                     UVADV1E.785    
          V(I,K)=V(I,K)*RS_U(I,K)*RS_U(I,K)*(DELTA_AK(K)+                  UVADV1E.786    
     &           DELTA_BK(K)*PSTAR(I))                                     UVADV1E.787    
        ENDDO                                                              UVADV1E.788    
      ENDDO                                                                UVADV1E.789    
                                                                           UVADV1E.790    
CL    END OF ROUTINE UV_ADV                                                UVADV1E.791    
                                                                           UVADV1E.792    
      RETURN                                                               UVADV1E.793    
      END                                                                  UVADV1E.794    
*ENDIF                                                                     UVADV1E.795    
*ENDIF                                                                     UVADV1E.796