*IF DEF,A12_1C,OR,DEF,A12_1D                                               ATJ0F402.14     
*IF DEF,MPP                                                                ATJ0F402.15     
C *****************************COPYRIGHT******************************     UVADV1C.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    UVADV1C.4      
C                                                                          UVADV1C.5      
C Use, duplication or disclosure of this code is subject to the            UVADV1C.6      
C restrictions as set forth in the contract.                               UVADV1C.7      
C                                                                          UVADV1C.8      
C                Meteorological Office                                     UVADV1C.9      
C                London Road                                               UVADV1C.10     
C                BRACKNELL                                                 UVADV1C.11     
C                Berkshire UK                                              UVADV1C.12     
C                RG12 2SZ                                                  UVADV1C.13     
C                                                                          UVADV1C.14     
C If no contract has been raised with this copy of the code, the use,      UVADV1C.15     
C duplication or disclosure of it is strictly prohibited.  Permission      UVADV1C.16     
C to do so must first be obtained in writing from the Head of Numerical    UVADV1C.17     
C Modelling at the above address.                                          UVADV1C.18     
C ******************************COPYRIGHT******************************    UVADV1C.19     
CLL   SUBROUTINE UV_ADV -------------------------------------------        UVADV1C.20     
CLL                                                                        UVADV1C.21     
CLL                   PURPOSE:                                             UVADV1C.22     
CLL  CALCULATES MASS-WEIGHTED INCREMENTS TO U AND V DUE TO                 UVADV1C.23     
CLL  ADVECTION  BY USING EQUATIONS (37) AND (38) TO CALCULATE              UVADV1C.24     
CLL  PROVISIONAL VALUES OF U AND V AT THE NEW TIME-LEVEL, AND THEN         UVADV1C.25     
CLL  RECALCULATING THE ADVECTION TERMS ON THE RIGHT-HAND SIDE OF (41)      UVADV1C.26     
CLL  AND (42) USING THESE PROVISIONAL VALUES.  THE CORIOLIS TERMS          UVADV1C.27     
CLL  ASSOCIATED WITH THE VERTICAL VELOCITY ARE CALCULATED AND INCLUDED     UVADV1C.28     
CLL  IN THE INCREMENTS.  THE FINAL INCREMENTS ARE CALCULATED AS IN         UVADV1C.29     
CLL  EQUATIONS (41) AND (42). IF RUNNING A GLOBAL MODEL POLAR_UV IS        UVADV1C.30     
CLL  CALLED TO UPDATE POLAR VALUES.                                        UVADV1C.31     
CLL                                                                        UVADV1C.32     
CLL                          CHANGES INCLUDE:-                             UVADV1C.33     
CLL U_MEAN AND V_MEAN FIELDS NOT OVER-WRITTEN WHEN INTERPOLATION TO        UVADV1C.34     
CLL U_GRID PERFORMED. ETADOT AND RS FIELDS INTERPOLATED TO U_GRID INSIDE   UVADV1C.35     
CLL THIS ROUTINE INSTEAD OF INSIDE ADV_CTL. THIS COSTS 8 EXTRA             UVADV1C.36     
CLL HORIZONTAL FIELDS BUT ALLOWS ROUTINE TO BE CALLED BEFORE TH_ADV SO     UVADV1C.37     
CLL THAT OMEGA CALCULATED HERE CAN BE USED INSIDE TH_ADV TO CALCULATE      UVADV1C.38     
CLL EXTRA THERMODYNAMIC TERM.                                              UVADV1C.39     
CLL                                                                        UVADV1C.40     
CLL INCLUSION OF L_SECOND TO CHOOSE CHEAPER SECOND ORDER ADVECTION         UVADV1C.41     
CLL SCHEME ALONG WITH REMOVAL OF CODE PREVIOUSLY UNDER *DEF FORECAST.      UVADV1C.42     
CLL CODE INCLUDED TO ALLOW HALF-TIMESTEP TO BE USED AT TOP LEVEL.          UVADV1C.43     
CLL                                                                        UVADV1C.44     
CLL   NOT SUITABLE FOR SINGLE COLUMN USE.                                  UVADV1C.45     
CLL   VERSION FOR CRAY Y-MP                                                UVADV1C.46     
CLL                                                                        UVADV1C.47     
CLL   WRITTEN  M.H MAWSON.                                                 UVADV1C.48     
CLL   MPP CODE ADDED BY P.BURTON                                           UVADV1C.49     
CLL                                                                        UVADV1C.50     
CLL  MODEL            MODIFICATION HISTORY FROM MODEL VERSION 4.1:         UVADV1C.51     
CLL VERSION  DATE                                                          UVADV1C.52     
CLL 4.1      08/12/95 New version of routine specifically for MPP          UVADV1C.53     
CLL                   P.Burton                                             UVADV1C.54     
!LL 4.2      10/01/97 Initialise unprocessed points in U_PROV              ADR2F402.22     
!LL                   and V_PROV. D. Robinson.                             ADR2F402.23     
!LL 4.3      24/04/97 Fixes to 4th order calculations   P.Burton           GPB5F403.33     
C     vn4.3    Mar. 97   T3E migration : optimisation changes              GSS1F403.722    
C                                       D.Salmond                          GSS1F403.723    
                                                                           UVADV1C.55     
CLL   PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4,       UVADV1C.56     
CLL                         STANDARD B.                                    UVADV1C.57     
CLL                                                                        UVADV1C.58     
CLL   SYSTEM COMPONENTS COVERED: P122                                      UVADV1C.59     
CLL                                                                        UVADV1C.60     
CLL   SYSTEM TASK: P1                                                      UVADV1C.61     
CLL                                                                        UVADV1C.62     
CLL   DOCUMENTATION:       THE EQUATIONS USED ARE (37-38) AND (41-42)      UVADV1C.63     
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10     UVADV1C.64     
CLL                        M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON           UVADV1C.65     
CLL                                                                        UVADV1C.66     
CLLEND-------------------------------------------------------------        UVADV1C.67     
                                                                           UVADV1C.68     
C*L   ARGUMENTS:---------------------------------------------------        UVADV1C.69     

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