*IF DEF,A11_1A                                                             TRACAD1A.2      
C ******************************COPYRIGHT******************************    GTS2F400.10477  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.10478  
C                                                                          GTS2F400.10479  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.10480  
C restrictions as set forth in the contract.                               GTS2F400.10481  
C                                                                          GTS2F400.10482  
C                Meteorological Office                                     GTS2F400.10483  
C                London Road                                               GTS2F400.10484  
C                BRACKNELL                                                 GTS2F400.10485  
C                Berkshire UK                                              GTS2F400.10486  
C                RG12 2SZ                                                  GTS2F400.10487  
C                                                                          GTS2F400.10488  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.10489  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.10490  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.10491  
C Modelling at the above address.                                          GTS2F400.10492  
C ******************************COPYRIGHT******************************    GTS2F400.10493  
C                                                                          GTS2F400.10494  
CLL   SUBROUTINE TRAC_ADV ---------------------------------------------    TRACAD1A.3      
CLL                                                                        TRACAD1A.4      
CLL   PURPOSE:   CALCULATES ADVECTION INCREMENTS TO A FIELD AT A           TRACAD1A.5      
CLL              SINGLE MODEL LEVEL USING A POSITIVE DEFINITE SCHEME.      TRACAD1A.6      
CLL              IN CALCULATING THE INCREMENTS THE TEST FOR THE            TRACAD1A.7      
CLL              DIRECTION OF THE WIND HAS BEEN REVERSED TO TAKE INTO      TRACAD1A.8      
CLL              ACCOUNT THE CHANGE IN SIGN INTRODUCED BY MASS             TRACAD1A.9      
CLL              WEIGHTING.                                                TRACAD1A.10     
CLL   NOT SUITABLE FOR SINGLE COLUMN USE.                                  TRACAD1A.11     
CLL                                                                        TRACAD1A.12     
CLL   VERSION FOR CRAY Y-MP                                                TRACAD1A.13     
CLL                                                                        TRACAD1A.14     
CLL M.MAWSON    <- PROGRAMMER OF SOME OR ALL OF PREVIOUS CODE OR CHANGES   TRACAD1A.15     
CLL                                                                        TRACAD1A.16     
CLL  MODEL            MODIFICATION HISTORY FROM MODEL VERSION 3.0:         TRACAD1A.17     
CLL VERSION  DATE                                                          TRACAD1A.18     
CLL  4.2  20/08/96  MPP code added.  RTHBarnes.                            ARB1F402.377    
CLL  4.3  17/03/97  Corrections to MPP code.  RTHBarnes.                   ARB1F403.8      
CLL       WARNING   Owing to compiler optimisation differences,            ARB1F403.9      
CLL       non-MPP & MPP runs will only bit compare if this deck            ARB1F403.10     
CLL       is compiled with minimum optimisation (-Oscalar0).               ARB1F403.11     
!LL  4.4  05/09/97  Ensure halos OK both at start and end of routine.      GSM6F404.1      
!LL                 S.D.Mullerworth                                        GSM6F404.2      
!LL  4.5  23/06/98  Single PE optimisations                                GPB7F405.242    
!LL                 D.Salmond, B.Carruthers and P.Burton                   GPB7F405.243    
CLL                                                                        TRACAD1A.19     
CLL   PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4,       TRACAD1A.20     
CLL                         STANDARD B.                                    TRACAD1A.21     
CLL                                                                        TRACAD1A.22     
CLL   SYSTEM COMPONENTS COVERED: P123                                      TRACAD1A.23     
CLL                                                                        TRACAD1A.24     
CLL   SYSTEM TASK: P1                                                      TRACAD1A.25     
CLL                                                                        TRACAD1A.26     
CLL   DOCUMENTATION: U.M. Doc. Paper 11, by M.J.P. Cullen                  TRACAD1A.27     
CLL                                                                        TRACAD1A.28     
CLLEND-----------------------------------------------------------------    TRACAD1A.29     
                                                                           TRACAD1A.30     
C                                                                          TRACAD1A.31     
C*L   ARGUMENTS:-------------------------------------------------------    TRACAD1A.32     

      SUBROUTINE TRAC_ADV                                                   17,17TRACAD1A.33     
     &                   (FIELD,N_SWEEP,U_MEAN,V_MEAN,U_FIELD,P_FIELD,     ARB1F402.378    
     &                    ADVECTION_TIMESTEP,ROW_LENGTH,                   ARB1F402.379    
*CALL ARGFLDPT                                                             ARB1F402.380    
     &                    SEC_P_LATITUDE,COS_P_LATITUDE,RS,PSTAR,          ARB1F402.381    
     &                    DELTA_AK,DELTA_BK,LATITUDE_STEP_INVERSE,         ARB1F402.382    
     &                    LONGITUDE_STEP_INVERSE,L_SUPERBEE)               TRACAD1A.39     
                                                                           TRACAD1A.40     
      IMPLICIT NONE                                                        TRACAD1A.41     
                                                                           TRACAD1A.42     
*CALL TYPFLDPT                                                             ARB1F402.383    
*CALL PARVARS                                                              ARB1F402.384    
      LOGICAL                                                              TRACAD1A.43     
     & L_SUPERBEE          !IN True then use SUPERBEE limiter,             TRACAD1A.44     
     &                     !   False then use VAN LEER limiter.            TRACAD1A.45     
                                                                           TRACAD1A.46     
      INTEGER                                                              TRACAD1A.47     
     & P_FIELD             !IN DIMENSION OF FIELDS ON PRESSURE GRID.       TRACAD1A.48     
     &,U_FIELD             !IN DIMENSION OF FIELDS ON VELOCITY GRID.       TRACAD1A.49     
     &,ROW_LENGTH          !IN NUMBER OF POINTS PER ROW.                   TRACAD1A.50     
*IF DEF,MPP                                                                ARB1F402.385    
     &,N_SWEEP(glsize(2))  ! Number of sweeps to be done East-West         ARB1F402.386    
!             ! for each row in full domain (needed for MAX_SWEEPS)        ARB1F402.387    
*ELSE                                                                      ARB1F402.388    
     &,N_SWEEP(P_FIELD/ROW_LENGTH) ! Number of sweeps to be done in        TRACAD1A.52     
     &                     ! East West calculation for each row.           TRACAD1A.53     
*ENDIF                                                                     ARB1F402.389    
                                                                           TRACAD1A.54     
      REAL                                                                 TRACAD1A.55     
     & U_MEAN(U_FIELD)        !IN ADVECTING U FIELD, MASS-WEIGHTED.        TRACAD1A.56     
     &,V_MEAN(U_FIELD)        !IN ADVECTING V FIELD, MASS-WEIGHTED.        TRACAD1A.57     
     &,FIELD(P_FIELD)         !IN FIELD TO BE ADVECTED.                    TRACAD1A.58     
     &,ADVECTION_TIMESTEP     !IN                                          TRACAD1A.59     
                                                                           TRACAD1A.60     
      REAL                                                                 TRACAD1A.61     
     & LONGITUDE_STEP_INVERSE     !IN 1/(DELTA LAMDA)                      TRACAD1A.62     
     &,LATITUDE_STEP_INVERSE      !IN 1/(DELTA PHI)                        TRACAD1A.63     
     &,SEC_P_LATITUDE(P_FIELD)    !IN 1/COS(LAT) AT P POINTS               TRACAD1A.64     
     &,COS_P_LATITUDE(P_FIELD)    !IN COS(LAT) AT P POINTS                 TRACAD1A.65     
     &,RS(P_FIELD)                !IN RS_FIELD                             TRACAD1A.66     
     &,PSTAR(P_FIELD)             !IN                                      TRACAD1A.67     
     &,DELTA_AK                   !IN                                      TRACAD1A.68     
     &,DELTA_BK                   !IN                                      TRACAD1A.69     
                                                                           TRACAD1A.70     
C*---------------------------------------------------------------------    TRACAD1A.71     
                                                                           TRACAD1A.72     
C*L   DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE-----------------    TRACAD1A.73     
C DEFINE LOCAL ARRAYS: 15 ARE REQUIRED                                     TRACAD1A.74     
                                                                           TRACAD1A.75     
      REAL                                                                 TRACAD1A.76     
*IF DEF,T3E                                                                GPB7F405.244    
     & FLUX_DELTA_T(0:P_FIELD)                                             GPB7F405.245    
                             ! FLUX * ADVECTION TIMESTEP                   GPB7F405.246    
*ELSE                                                                      GPB7F405.247    
     & FLUX_DELTA_T(P_FIELD) ! FLUX * ADVECTION TIMESTEP                   TRACAD1A.77     
*ENDIF                                                                     GPB7F405.248    
     &,B1(P_FIELD)           ! ARGUMENT OF B_TERM                          TRACAD1A.78     
     &,B2(P_FIELD)           ! ARGUMENT OF B_TERM                          TRACAD1A.79     
*IF DEF,T3E                                                                GPB7F405.249    
     &,B_TERM(0:P_FIELD)     !                                             GPB7F405.250    
*ELSE                                                                      GPB7F405.251    
     &,B_TERM(P_FIELD)       !                                             TRACAD1A.80     
*ENDIF                                                                     GPB7F405.252    
     &,COURANT(P_FIELD)      ! COURANT NUMBER                              TRACAD1A.81     
     &,ABS_COURANT(P_FIELD)  ! ABSOLUTE VALUE OF COURANT NUMBER            TRACAD1A.82     
     &,COURANT_MW(P_FIELD)   ! MASS WEIGHTED COURANT NUMBER                TRACAD1A.83     
     &,RS_SQUARED_DELTAP(P_FIELD) ! MASS * RADIUS OF EARTH                 TRACAD1A.84     
     &,MW(P_FIELD)           ! MASS WEIGHTING ASSOCIATED WITH              TRACAD1A.85     
     &                       ! GRID BOX BOUNDARY FLUXES                    TRACAD1A.86     
     &,MW_RECIP(P_FIELD)     ! 1./MW                                       TRACAD1A.87     
     &,RS_SQUARED_DELTAP_RECIP(P_FIELD) ! HOLDS 1./RS_SQUARED_DELTAP       TRACAD1A.88     
     &,FIELD_INC(P_FIELD)    ! HOLDS INCREMENT TO FIELD.                   TRACAD1A.89     
*IF DEF,GLOBAL,AND,-DEF,MPP                                                GPB7F405.253    
     &,WORK(P_FIELD)         ! General work-space.                         TRACAD1A.90     
*ENDIF                                                                     GPB7F405.254    
     &,B_SWITCH(P_FIELD)     ! Entropy condition switch.                   TRACAD1A.91     
*IF DEF,MPP                                                                ARB1F402.390    
     &,SHIFT_N(ROW_LENGTH,2)   ! Local copy of polar rows for 180 deg      ARB1F402.391    
     &,B2_SHIFT_N(ROW_LENGTH)  ! rotational shift by GCG_RVECSHIFT         ARB1F402.392    
     &,SHIFT_S(ROW_LENGTH,2)   ! Local copy of polar rows for 180 deg      ARB1F402.393    
     &,B2_SHIFT_S(ROW_LENGTH)  ! rotational shift by GCG_RVECSHIFT         ARB1F402.394    
*ENDIF                                                                     ARB1F402.395    
                                                                           TRACAD1A.92     
C*---------------------------------------------------------------------    TRACAD1A.93     
C DEFINE LOCAL VARIABLES                                                   TRACAD1A.94     
      INTEGER                                                              TRACAD1A.95     
     &  P_POINTS_UPDATE ! NUMBER OF P POINTS TO BE UPDATED                 TRACAD1A.96     
     & ,START_P_UPDATE  ! FIRST P POINT TO BE UPDATED                      TRACAD1A.97     
     & ,END_P_UPDATE    ! LAST P POINT TO BE UPDATED                       TRACAD1A.98     
     & ,ROWS            ! NUMBER OF ROWS TO BE UPDATED                     TRACAD1A.99     
     & ,I,J,L           ! Do loop counters.                                TRACAD1A.100    
     & ,I_SWEEP         ! holds east-west sweep number                     TRACAD1A.101    
     & ,MAX_SWEEPS      ! holds maximum number of east-west sweeps         TRACAD1A.102    
     & ,I_CNTL          ! Control variable for do loop inside do while.    TRACAD1A.103    
     & ,START_P(2)      ! Start point for loop with I_CNTL =1 or 2         TRACAD1A.104    
     & ,END_P(2)        ! End point for loop with I_CNTL=1 or 2            TRACAD1A.105    
     & ,U_ROWS          ! Number of u rows                                 TRACAD1A.106    
     & ,N_HEMI          ! Number of hemispheres east-west advection        TRACAD1A.107    
     &                  ! being performed in.                              TRACAD1A.108    
     & ,J1,J2,J3        ! for deciding which rows still need E-W sweeps    ARB1F402.396    
*IF DEF,MPP                                                                ARB1F402.397    
     & ,info            ! return code for GCom routines                    ARB1F402.398    
     & ,HALF_RL         ! ROW_LENGTH/2 for GCG_RVECSHIFT function.         ARB1F402.399    
*ENDIF                                                                     ARB1F402.400    
                                                                           TRACAD1A.109    
      REAL                                                                 TRACAD1A.110    
     & NORTH_POLE_INC                                                      TRACAD1A.111    
     &,SOUTH_POLE_INC                                                      TRACAD1A.112    
     &,ROW_LENGTH_RECIP     ! 1/ROW_LENGTH                                 TRACAD1A.113    
     &,R_SWEEP              ! 1/N_SWEEP(J-1)                               ARB1F402.401    
                                                                           TRACAD1A.114    
      INTEGER II                                                           GPB7F405.255    
      REAL real_ROW_LENGTH                                                 GPB7F405.256    
C*L   NO EXTERNAL SUBROUTINE CALLS:------------------------------------    TRACAD1A.115    
C*---------------------------------------------------------------------    TRACAD1A.116    
                                                                           TRACAD1A.117    
CL    MAXIMUM VECTOR LENGTH ASSUMED IS P_FIELD                             TRACAD1A.121    
CL---------------------------------------------------------------------    TRACAD1A.122    
CL    INTERNAL STRUCTURE.                                                  TRACAD1A.123    
CL---------------------------------------------------------------------    TRACAD1A.124    
CL                                                                         TRACAD1A.125    
CL---------------------------------------------------------------------    TRACAD1A.126    
CL    SECTION 0.     INITIALISATION                                        TRACAD1A.127    
CL---------------------------------------------------------------------    TRACAD1A.128    
                                                                           TRACAD1A.129    
      ROWS             = P_FIELD/ROW_LENGTH                                TRACAD1A.130    
      P_POINTS_UPDATE  = (ROWS-2) * ROW_LENGTH                             TRACAD1A.132    
*IF DEF,MPP                                                                ARB1F402.402    
      IF (at_top_of_LPG) P_POINTS_UPDATE = P_POINTS_UPDATE-ROW_LENGTH      ARB1F402.403    
      IF (at_base_of_LPG) P_POINTS_UPDATE = P_POINTS_UPDATE-ROW_LENGTH     ARB1F402.404    
*ENDIF                                                                     ARB1F402.405    
      START_P_UPDATE   = (FIRST_ROW-1) * ROW_LENGTH + 1                    TRACAD1A.133    
      END_P_UPDATE     = START_P_UPDATE + P_POINTS_UPDATE - 1              TRACAD1A.134    
      I_SWEEP          = 1                                                 TRACAD1A.136    
*IF DEF,MPP                                                                ARB1F402.406    
      MAX_SWEEPS       = MAX(N_SWEEP(2),N_SWEEP(glsize(2)-1))              ARB1F402.407    
      ROW_LENGTH_RECIP = 1./GLOBAL_ROW_LENGTH                              ARB1F402.408    
*IF DEF,MPP                                                                GSM6F404.3      
! Ensure halos are OK before starting                                      GSM6F404.4      
*ENDIF                                                                     GSM6F404.6      
*ELSE                                                                      ARB1F402.409    
      MAX_SWEEPS       = MAX(N_SWEEP(2),N_SWEEP(U_FIELD/ROW_LENGTH))       TRACAD1A.137    
      ROW_LENGTH_RECIP = 1./ROW_LENGTH                                     ARB1F402.410    
*ENDIF                                                                     ARB1F402.411    
      real_ROW_LENGTH=ROW_LENGTH                                           GPB7F405.257    
                                                                           TRACAD1A.138    
CL                                                                         TRACAD1A.139    
CL---------------------------------------------------------------------    TRACAD1A.140    
CL    SECTION 1.     CALCULATE FIELD INCREMENTS FOR U ADVECTION            TRACAD1A.141    
CL---------------------------------------------------------------------    TRACAD1A.142    
                                                                           TRACAD1A.143    
C----------------------------------------------------------------------    TRACAD1A.144    
CL    SECTION 1.1    CALCULATE COURANT NUMBER                              TRACAD1A.145    
C----------------------------------------------------------------------    TRACAD1A.146    
                                                                           TRACAD1A.147    
C DIVIDE BY N_SWEEP TO ENSURE COURANT NUMBER LESS THAN 1.                  TRACAD1A.148    
                                                                           TRACAD1A.149    
*IF DEF,MPP                                                                ARB1F402.412    
      DO  J = datastart(2)+FIRST_ROW-1,datastart(2)+P_LAST_ROW-1           ARB1F402.413    
        J1 = (J-datastart(2))*ROW_LENGTH                                   ARB1F402.414    
! Because of unused 1st row of global fields.                              ARB1F402.415    
          R_SWEEP = 1.0/N_SWEEP(J-1)                                       ARB1F402.416    
        DO I = 1,ROW_LENGTH                                                ARB1F402.417    
          COURANT_MW(J1+I) = 0.5*(U_MEAN(J1+I-ROW_LENGTH)+U_MEAN(J1+I))    ARB1F402.418    
     &                * ADVECTION_TIMESTEP * LONGITUDE_STEP_INVERSE        ARB1F402.419    
     &                * SEC_P_LATITUDE(J1+I) * R_SWEEP                     ARB1F402.420    
        END DO                                                             ARB1F402.421    
      END DO                                                               ARB1F402.422    
*ELSE                                                                      ARB1F402.423    
      DO I=START_P_UPDATE,END_P_UPDATE                                     TRACAD1A.150    
        J = (I+ROW_LENGTH-1) / ROW_LENGTH                                  TRACAD1A.151    
        R_SWEEP = 1.0/N_SWEEP(J)                                           ARB1F403.12     
        COURANT_MW(I) = 0.5*(U_MEAN(I-ROW_LENGTH)+U_MEAN(I)) *             TRACAD1A.152    
     &                  ADVECTION_TIMESTEP * LONGITUDE_STEP_INVERSE *      TRACAD1A.153    
     &                  SEC_P_LATITUDE(I) * R_SWEEP                        ARB1F403.13     
      END DO                                                               TRACAD1A.155    
*ENDIF                                                                     ARB1F402.424    
                                                                           TRACAD1A.156    
      DO I=START_P_UPDATE-ROW_LENGTH,END_P_UPDATE+ROW_LENGTH               ARB1F402.425    
!      DO I=1,P_FIELD                                                      ARB1F402.426    
        RS_SQUARED_DELTAP(I) = RS(I)*RS(I)*(DELTA_AK+DELTA_BK*PSTAR(I))    TRACAD1A.158    
        RS_SQUARED_DELTAP_RECIP(I) = 1./RS_SQUARED_DELTAP(I)               TRACAD1A.159    
      END DO                                                               TRACAD1A.160    
                                                                           TRACAD1A.161    
      DO I = START_P_UPDATE,END_P_UPDATE                                   TRACAD1A.162    
        MW(I)=0.5*(RS_SQUARED_DELTAP(I)+RS_SQUARED_DELTAP(I+1))            TRACAD1A.163    
        II=MIN(0.0,SIGN(1.0,COURANT_MW(I)))                                GPB7F405.258    
        COURANT(I) = COURANT_MW(I)*RS_SQUARED_DELTAP_RECIP(I-II)           GPB7F405.259    
      END DO                                                               TRACAD1A.167    
                                                                           TRACAD1A.168    
*IF DEF,MPP                                                                ARB1F402.427    
! Do EW Swapbounds to fill in right halo points.                           ARB1F402.428    
      CALL SWAPBOUNDS(MW,ROW_LENGTH,ROWS,EW_Halo,0,1) !single level        ARB1F402.429    
      CALL SWAPBOUNDS(COURANT,ROW_LENGTH,ROWS,EW_Halo,0,1)                 ARB1F402.430    
*ELSE                                                                      ARB1F402.431    
*IF DEF,GLOBAL                                                             TRACAD1A.169    
C END POINTS                                                               TRACAD1A.170    
      DO I=START_P_UPDATE+ROW_LENGTH-1,END_P_UPDATE,ROW_LENGTH             TRACAD1A.171    
        MW(I)=.5*(RS_SQUARED_DELTAP(I)+                                    TRACAD1A.172    
     &            RS_SQUARED_DELTAP(I+1-ROW_LENGTH))                       TRACAD1A.173    
        IF (COURANT_MW(I).LT.0.) COURANT(I) = COURANT_MW(I)                TRACAD1A.174    
     &                         *RS_SQUARED_DELTAP_RECIP(I+1-ROW_LENGTH)    TRACAD1A.175    
      END DO                                                               TRACAD1A.176    
*ELSE                                                                      TRACAD1A.177    
      MW(END_P_UPDATE) = 1.                                                TRACAD1A.178    
      COURANT(END_P_UPDATE)=1.                                             TRACAD1A.179    
*ENDIF                                                                     TRACAD1A.180    
*ENDIF                                                                     ARB1F402.432    
      MW(START_P_UPDATE-1)=1.                                              TRACAD1A.181    
      MW(END_P_UPDATE+1)=1.                                                TRACAD1A.182    
      MW_RECIP(START_P_UPDATE-1) = 1.                                      TRACAD1A.183    
      MW_RECIP(END_P_UPDATE+1) = 1.                                        TRACAD1A.184    
      COURANT(START_P_UPDATE-1)=0.                                         TRACAD1A.185    
      COURANT(END_P_UPDATE+1)=0.                                           TRACAD1A.186    
                                                                           TRACAD1A.187    
C SET ABSOLUTE VALUE OF COURANT NUMBER. THIS LOOP IS SEPARATE              ARB1F402.433    
C TO LOOPS CALCULATING COURANT NUMBER SINCE INCLUDING IT THERE             TRACAD1A.189    
C PREVENTS TOTAL OPTIMISATION.                                             TRACAD1A.190    
                                                                           TRACAD1A.191    
      DO I= START_P_UPDATE,END_P_UPDATE                                    TRACAD1A.192    
        ABS_COURANT(I) = ABS(COURANT(I))                                   TRACAD1A.193    
        MW_RECIP(I) = 1./MW(I)                                             TRACAD1A.194    
      END DO                                                               TRACAD1A.195    
                                                                           TRACAD1A.196    
      ABS_COURANT(START_P_UPDATE-1) = COURANT(START_P_UPDATE-1)            TRACAD1A.197    
      ABS_COURANT(END_P_UPDATE+1) = COURANT(END_P_UPDATE+1)                TRACAD1A.198    
                                                                           TRACAD1A.199    
CL    PERFORM N_SWEEPS OF ADVECTION ON EACH ROW.                           TRACAD1A.200    
CL    LOOP OVER NUMBER OF SWEEPS REQUIRED.                                 TRACAD1A.201    
                                                                           TRACAD1A.202    
      DO I_SWEEP = 1,MAX_SWEEPS                                            TRACAD1A.203    
        N_HEMI = 1                                                         TRACAD1A.204    
                                                                           TRACAD1A.205    
! Loop over non-halo rows to decide which points need computed this        ARB1F402.434    
!  sweep.                                                                  ARB1F402.435    
C IF FIRST SWEEP THEN PERFORM ADVECTION OVER ALL POINTS.                   TRACAD1A.206    
        IF(I_SWEEP.EQ.1) THEN                                              TRACAD1A.207    
          START_P(1) = START_P_UPDATE                                      TRACAD1A.208    
          END_P(1) = END_P_UPDATE                                          TRACAD1A.209    
        ELSE                                                               ARB1F402.436    
! Initialise                                                               ARB1F402.437    
          J1 = 0                                                           ARB1F402.438    
          J2 = P_LAST_ROW                                                  ARB1F402.439    
          J3 = 0                                                           ARB1F402.440    
          START_P(1) = 0                                                   ARB1F402.441    
                                                                           TRACAD1A.210    
          DO  J = FIRST_ROW,P_LAST_ROW                                     ARB1F402.442    
*IF DEF,MPP                                                                ARB1F402.443    
            I = J+datastart(2)-Offy-1                                      ARB1F402.444    
!  above line because N_SWEEP is global array of values for all rows       ARB1F402.445    
*ELSE                                                                      ARB1F402.446    
            I = J                                                          ARB1F402.447    
*ENDIF                                                                     ARB1F402.448    
            IF (J1 .eq. 0 .and. N_SWEEP(I) .ge. I_SWEEP)  J1 = J           ARB1F402.449    
            IF (J1 .ne. 0 .and. N_SWEEP(I) .lt. I_SWEEP .and.              ARB1F402.450    
     &          J2 .eq. P_LAST_ROW)  J2 = J-1                              ARB1F402.451    
            IF (J3 .eq. 0 .and. N_SWEEP(I) .ge. I_SWEEP .and.              ARB1F402.452    
     &          J2 .ne. P_LAST_ROW)  J3 = J                                ARB1F402.453    
          END DO                                                           TRACAD1A.218    
          IF (J1 .gt. 0) THEN                                              ARB1F402.454    
            START_P(1) = START_POINT_NO_HALO+(J1-FIRST_ROW)*ROW_LENGTH     ARB1F402.455    
            END_P(1) = END_P_POINT_NO_HALO-(P_LAST_ROW-J2)*ROW_LENGTH      ARB1F402.456    
          END IF                                                           ARB1F402.457    
          IF (J3 .gt. 0) THEN                                              ARB1F402.458    
            START_P(2) = START_POINT_NO_HALO+(J3-FIRST_ROW)*ROW_LENGTH     ARB1F402.459    
            END_P(2) = END_P_POINT_NO_HALO                                 ARB1F402.460    
            N_HEMI = 2                                                     TRACAD1A.227    
          END IF                                                           TRACAD1A.234    
        END IF ! I_SWEEP                                                   ARB1F402.461    
                                                                           TRACAD1A.235    
CL    LOOP OVER NUMBER OF HEMISPHERES.                                     TRACAD1A.248    
                                                                           TRACAD1A.249    
*IF DEF,MPP                                                                ARB1F402.466    
! There may be no work for some processors to do,                          ARB1F402.467    
        IF (START_P(1) .gt. 0) THEN                                        ARB1F402.468    
*ENDIF                                                                     ARB1F402.469    
        DO I_CNTL = 1,N_HEMI                                               TRACAD1A.250    
          START_P_UPDATE = START_P(I_CNTL)                                 TRACAD1A.251    
          END_P_UPDATE = END_P(I_CNTL)                                     TRACAD1A.252    
                                                                           TRACAD1A.253    
C----------------------------------------------------------------------    TRACAD1A.254    
CL    SECTION 1.2    CALCULATE FLUX_DELTA_T AND B1                         TRACAD1A.255    
C----------------------------------------------------------------------    TRACAD1A.256    
                                                                           TRACAD1A.257    
C CALCULATE TERM AT ALL POINTS                                             TRACAD1A.258    
                                                                           TRACAD1A.259    
          DO I=START_P_UPDATE,END_P_UPDATE                                 TRACAD1A.260    
            FLUX_DELTA_T(I) = (FIELD(I+1) - FIELD(I)) *                    TRACAD1A.261    
     &                         COURANT_MW(I)                               TRACAD1A.262    
            FIELD_INC(I) = 0.0                                             TRACAD1A.263    
            B1(I)=FLUX_DELTA_T(I)*0.5*(1.0-ABS_COURANT(I))                 TRACAD1A.264    
          END DO                                                           TRACAD1A.265    
                                                                           TRACAD1A.266    
*IF DEF,MPP                                                                ARB1F402.470    
! but all processors must call SWAPBOUNDS together,                        ARB1F402.471    
! so also end possible loop over hemispheres.                              ARB1F402.472    
        END DO                                                             ARB1F402.473    
        END IF                                                             ARB1F402.474    
! Do EW Swapbounds to fill in right halo points.                           ARB1F402.475    
      CALL SWAPBOUNDS(FLUX_DELTA_T(1),ROW_LENGTH,ROWS,EW_Halo,0,1)         GPB7F405.260    
        IF (START_P(1) .gt. 0) THEN                                        ARB1F402.477    
        DO I_CNTL = 1,N_HEMI                                               ARB1F402.478    
          START_P_UPDATE = START_P(I_CNTL)                                 ARB1F402.479    
          END_P_UPDATE = END_P(I_CNTL)                                     ARB1F402.480    
*ELSE                                                                      ARB1F402.481    
*IF DEF,GLOBAL                                                             TRACAD1A.267    
C RECALCULATE LAST VALUES ON EACH ROW                                      TRACAD1A.268    
                                                                           TRACAD1A.269    
          DO I=START_P_UPDATE+ROW_LENGTH-1,END_P_UPDATE,ROW_LENGTH         TRACAD1A.270    
            FLUX_DELTA_T(I)= (FIELD(I+1-ROW_LENGTH)-                       TRACAD1A.271    
     &                        FIELD(I)) * COURANT_MW(I)                    TRACAD1A.272    
            B1(I)=FLUX_DELTA_T(I)*0.5*(1.0-ABS_COURANT(I))                 TRACAD1A.273    
          END DO                                                           TRACAD1A.274    
*ENDIF                                                                     TRACAD1A.275    
*ENDIF                                                                     ARB1F402.482    
                                                                           TRACAD1A.276    
C----------------------------------------------------------------------    TRACAD1A.277    
CL    SECTION 1.3    CALCULATE B1 AND B2                                   TRACAD1A.278    
C----------------------------------------------------------------------    TRACAD1A.279    
                                                                           TRACAD1A.280    
*IF DEF,GLOBAL                                                             TRACAD1A.281    
                                                                           TRACAD1A.282    
C GLOBAL MODEL.                                                            TRACAD1A.283    
C LOOP OVER ALL POINTS                                                     TRACAD1A.284    
                                                                           TRACAD1A.285    
          FLUX_DELTA_T(START_P_UPDATE-1)=0.                                TRACAD1A.286    
          FLUX_DELTA_T(END_P_UPDATE+1)=0.                                  TRACAD1A.287    
          DO I=START_P_UPDATE,END_P_UPDATE                                 TRACAD1A.288    
            II=SIGN(1.0,COURANT_MW(I))                                     GPB7F405.262    
            B2(I) = FLUX_DELTA_T(I+II)*0.5*(MW(I)*MW_RECIP(I+II)-          GPB7F405.263    
     &              ABS_COURANT(I+II))                                     GPB7F405.264    
            B_SWITCH(I) = SIGN(1.,COURANT(I)*COURANT(I+II))                GPB7F405.265    
          END DO                                                           TRACAD1A.297    
*IF -DEF,MPP                                                               ARB1F402.483    
C RECALCULATE  VALUES AT FIRST POINTS ON EACH ROW                          TRACAD1A.299    
C WHERE FIRST LOOP CALCULATED THEM INCORRECTLY.                            TRACAD1A.300    
                                                                           TRACAD1A.301    
CDIR$ IVDEP                                                                TRACAD1A.302    
          DO I=START_P_UPDATE,END_P_UPDATE,ROW_LENGTH                      TRACAD1A.303    
            IF (COURANT_MW(I).LT.0.0) THEN                                 TRACAD1A.304    
              B2(I) = FLUX_DELTA_T(I-1+ROW_LENGTH)*0.5*(MW(I)              TRACAD1A.305    
     &                         *MW_RECIP(I-1+ROW_LENGTH)                   TRACAD1A.306    
     &                         -ABS_COURANT(I-1+ROW_LENGTH))               TRACAD1A.307    
              B_SWITCH(I)= SIGN(1.,COURANT(I)*COURANT(I-1+ROW_LENGTH))     TRACAD1A.308    
            END IF                                                         TRACAD1A.309    
C RECALCULATE  VALUES AT LAST POINTS ON EACH ROW                           TRACAD1A.310    
C WHERE FIRST LOOP CALCULATED THEM INCORRECTLY.                            TRACAD1A.311    
                                                                           TRACAD1A.312    
            IF (COURANT_MW(I+ROW_LENGTH-1).GE.0.0) THEN                    TRACAD1A.313    
              B2(I+ROW_LENGTH-1) = FLUX_DELTA_T(I)*.5*                     TRACAD1A.314    
     &                 (MW(I+ROW_LENGTH-1)*MW_RECIP(I)-ABS_COURANT(I))     TRACAD1A.315    
              B_SWITCH(I+ROW_LENGTH-1) =                                   TRACAD1A.316    
     &                     SIGN(1.,COURANT(I+ROW_LENGTH-1)*COURANT(I))     TRACAD1A.317    
            END IF                                                         TRACAD1A.318    
          END DO                                                           TRACAD1A.319    
*ENDIF                                                                     ARB1F402.484    
                                                                           TRACAD1A.320    
*ELSE                                                                      TRACAD1A.321    
                                                                           TRACAD1A.322    
C LIMITED AREA MODEL                                                       TRACAD1A.323    
C LOOP OVER ALL POINTS.                                                    TRACAD1A.324    
                                                                           TRACAD1A.325    
          DO I=START_P_UPDATE+1,END_P_UPDATE-1                             TRACAD1A.326    
            II=SIGN(1.0,COURANT_MW(I))                                     GPB7F405.266    
            B2(I) = FLUX_DELTA_T(I+II)*0.5*(MW(I)*MW_RECIP(I+II)-          GPB7F405.267    
     &              ABS_COURANT(I+II))                                     GPB7F405.268    
            B_SWITCH(I) = SIGN(1.,COURANT(I)*COURANT(I+II))                GPB7F405.269    
          END DO                                                           TRACAD1A.335    
          B2(START_P_UPDATE)=0.                                            TRACAD1A.336    
          B2(END_P_UPDATE)=0.                                              TRACAD1A.337    
          B_SWITCH(START_P_UPDATE) = 0.                                    TRACAD1A.338    
          B_SWITCH(END_P_UPDATE) = 0.                                      TRACAD1A.339    
C For Limited Area Model, set W & E edge values of B2 to zero              ARB1F403.14     
C since these may involve wraparound values of flux_delta_t etc.           ARB1F403.15     
C Because B2 is on u_grid, also need to zero first interior E points.      ARB1F403.16     
*IF DEF,MPP                                                                ARB1F403.17     
      if (atleft) then                                                     ARB1F403.18     
      do i = START_P_UPDATE,END_P_UPDATE,row_length                        ARB1F403.19     
        B2(i+EW_Halo) = 0.0                                                ARB1F403.20     
      end do                                                               ARB1F403.21     
      end if                                                               ARB1F403.22     
      if (atright) then                                                    ARB1F403.23     
      do i = START_P_UPDATE,END_P_UPDATE,row_length                        ARB1F403.24     
        B2(i+row_length-EW_Halo-1) = 0.0                                   ARB1F403.25     
        B2(i+row_length-EW_Halo-2) = 0.0                                   ARB1F403.26     
      end do                                                               ARB1F403.27     
      end if                                                               ARB1F403.28     
*ELSE                                                                      ARB1F403.29     
      do i = START_P_UPDATE,END_P_UPDATE,row_length                        ARB1F403.30     
        B2(i) = 0.0                                                        ARB1F403.31     
      end do                                                               ARB1F403.32     
      do i = START_P_UPDATE,END_P_UPDATE,row_length                        ARB1F403.33     
        B2(i+row_length-1) = 0.0                                           ARB1F403.34     
        B2(i+row_length-2) = 0.0                                           ARB1F403.35     
      end do                                                               ARB1F403.36     
*ENDIF                                                                     ARB1F403.37     
                                                                           TRACAD1A.340    
*ENDIF                                                                     TRACAD1A.341    
                                                                           TRACAD1A.342    
C----------------------------------------------------------------------    TRACAD1A.343    
CL    SECTION 1.4    CALCULATE B_TERM                                      TRACAD1A.344    
C----------------------------------------------------------------------    TRACAD1A.345    
                                                                           TRACAD1A.346    
          IF (L_SUPERBEE) THEN                                             TRACAD1A.347    
                                                                           TRACAD1A.348    
CL    SUPERBEE LIMITER.                                                    TRACAD1A.349    
                                                                           TRACAD1A.350    
            DO I=START_P_UPDATE,END_P_UPDATE                               TRACAD1A.351    
              IF(ABS(B2(I)).GT.1.0E-8) THEN                                TRACAD1A.352    
                B_SWITCH(I) = B_SWITCH(I)*B1(I)/B2(I)                      TRACAD1A.353    
              IF (B_SWITCH(I).GT.0.5.AND.                                  TRACAD1A.361    
     &                 B_SWITCH(I).LT.2.0) THEN                            TRACAD1A.362    
                B_TERM(I) = B2(I) * MAX(B_SWITCH(I),1.0)                   TRACAD1A.363    
              ELSE IF (B_SWITCH(I).LE.0.0) THEN                            TRACAD1A.364    
                B_TERM(I) = 0.0                                            TRACAD1A.365    
              ELSE                                                         TRACAD1A.366    
                B_TERM(I) = 2.0 * B2(I) * MIN(B_SWITCH(I),1.0)             TRACAD1A.367    
              END IF                                                       TRACAD1A.368    
              ELSE                                                         GPB7F405.270    
                B_SWITCH(I) = 0.                                           GPB7F405.271    
                  B_TERM(I) = 0.0                                          GPB7F405.272    
              END IF                                                       GPB7F405.273    
            END DO                                                         TRACAD1A.369    
                                                                           TRACAD1A.370    
                                                                           GPB7F405.274    
          ELSE                                                             TRACAD1A.371    
                                                                           TRACAD1A.372    
CL    VAN LEER LIMITER.                                                    TRACAD1A.373    
                                                                           TRACAD1A.374    
C LOOP OVER ALL POINTS                                                     TRACAD1A.375    
            DO I=START_P_UPDATE,END_P_UPDATE                               TRACAD1A.376    
              B_TERM(I) = 0.0                                              TRACAD1A.377    
              IF (B1(I)*B2(I)*B_SWITCH(I).GT.0.0)                          TRACAD1A.378    
     &           B_TERM(I) = 2.0*B1(I)*B2(I)*B_SWITCH(I)/                  TRACAD1A.379    
     &                       (B1(I)+B2(I)*B_SWITCH(I))                     TRACAD1A.380    
            END DO                                                         TRACAD1A.381    
                                                                           TRACAD1A.382    
          END IF                                                           TRACAD1A.383    
                                                                           TRACAD1A.384    
*IF DEF,MPP                                                                ARB1F402.485    
! All processors must call SWAPBOUNDS together,                            ARB1F402.486    
! so also end possible loop over hemispheres.                              ARB1F402.487    
        END DO                                                             ARB1F402.488    
        END IF                                                             ARB1F402.489    
! Do EW Swapbounds to fill in left halo points.                            ARB1F402.490    
      CALL SWAPBOUNDS(B_TERM(1),ROW_LENGTH,ROWS,EW_Halo,0,1)               GPB7F405.261    
        IF (START_P(1) .gt. 0) THEN                                        ARB1F402.492    
        DO I_CNTL = 1,N_HEMI                                               ARB1F402.493    
          START_P_UPDATE = START_P(I_CNTL)                                 ARB1F402.494    
          END_P_UPDATE = END_P(I_CNTL)                                     ARB1F402.495    
*ENDIF                                                                     ARB1F402.496    
                                                                           ARB1F402.497    
C----------------------------------------------------------------------    TRACAD1A.385    
CL    SECTION 1.5    CALCULATE INCREMENTS TO FIELD                         TRACAD1A.386    
C----------------------------------------------------------------------    TRACAD1A.387    
                                                                           TRACAD1A.388    
*IF DEF,T3E                                                                GPB7F405.275    
          b_term(0)=0.                                                     GPB7F405.276    
          flux_delta_t(0)=0.                                               GPB7F405.277    
*ENDIF                                                                     GPB7F405.278    
          DO I=START_P_UPDATE,END_P_UPDATE                                 TRACAD1A.389    
*IF DEF,T3E                                                                GPB7F405.279    
            ii=max(0, nint(sign(real(i), courant_mw(i))))                  GPB7F405.280    
            FIELD_INC(I) = (FIELD_INC(I) - B_TERM(I)) +                    GPB7F405.281    
     &       (2.*B_TERM(II)- FLUX_DELTA_T(II))                             GPB7F405.282    
*ELSE                                                                      GPB7F405.283    
            FIELD_INC(I) = FIELD_INC(I) - B_TERM(I)                        TRACAD1A.390    
            IF (COURANT_MW(I).GE.0.0)                                      TRACAD1A.391    
     &        FIELD_INC(I)= FIELD_INC(I)+ 2.*B_TERM(I)- FLUX_DELTA_T(I)    TRACAD1A.392    
*ENDIF                                                                     GPB7F405.284    
          END DO                                                           TRACAD1A.393    
                                                                           TRACAD1A.394    
          DO I=START_P_UPDATE,END_P_UPDATE-1                               TRACAD1A.395    
*IF DEF,T3E                                                                GPB7F405.285    
            ii=max(0,-nint(sign(real(i), courant_mw(i))))                  GPB7F405.286    
            FIELD_INC(I+1) = (FIELD_INC(I+1)-B_TERM(I)) +                  GPB7F405.287    
     &       (2.*B_TERM(II)- FLUX_DELTA_T(II))                             GPB7F405.288    
*ELSE                                                                      GPB7F405.289    
            FIELD_INC(I+1) = FIELD_INC(I+1)-B_TERM(I)                      TRACAD1A.396    
            IF (COURANT_MW(I).LT.0.0)                                      TRACAD1A.397    
     &         FIELD_INC(I+1) = FIELD_INC(I+1) + 2.*B_TERM(I)-             TRACAD1A.398    
     &                                          FLUX_DELTA_T(I)            TRACAD1A.399    
*ENDIF                                                                     GPB7F405.290    
          END DO                                                           TRACAD1A.400    
                                                                           TRACAD1A.401    
*IF DEF,GLOBAL,AND,-DEF,MPP                                                ARB1F402.498    
C RECALCULATE FIRST POINT ON ROW                                           TRACAD1A.403    
C Reorder code to be similar to loops over whole field.                    ARB1F403.38     
CDIR$ IVDEP                                                                TRACAD1A.404    
          DO I=START_P_UPDATE,END_P_UPDATE,ROW_LENGTH                      TRACAD1A.405    
            J=I-1+ROW_LENGTH                                               TRACAD1A.406    
            FIELD_INC(I) =  -B_TERM(I)                                     ARB1F403.39     
      IF (COURANT_MW(I).GE.0.0)                                            ARB1F403.40     
     & FIELD_INC(I) = FIELD_INC(I)+2.*B_TERM(I)-FLUX_DELTA_T(I)            ARB1F403.41     
            FIELD_INC(I) =  FIELD_INC(I) - B_TERM(J)                       ARB1F403.42     
      IF (COURANT_MW(J).LT.0.0)                                            ARB1F403.43     
     & FIELD_INC(I) = FIELD_INC(I)+2.*B_TERM(J)-FLUX_DELTA_T(J)            ARB1F403.44     
          END DO                                                           TRACAD1A.414    
                                                                           TRACAD1A.415    
*ENDIF                                                                     TRACAD1A.416    
                                                                           TRACAD1A.417    
C----------------------------------------------------------------------    TRACAD1A.418    
CL    SECTION 1.6    UPDATE FIELD                                          TRACAD1A.419    
C----------------------------------------------------------------------    TRACAD1A.420    
                                                                           TRACAD1A.421    
C UPDATE MASS WEIGHTING FIELDS                                             TRACAD1A.423    
          COURANT_MW(START_P_UPDATE-1) = 0.                                TRACAD1A.424    
*IF DEF,GLOBAL,AND,-DEF,MPP                                                GPB7F405.291    
          DO I=START_P_UPDATE,END_P_UPDATE                                 TRACAD1A.425    
            WORK(I) = COURANT_MW(I-1)  - COURANT_MW(I)                     TRACAD1A.426    
          END DO                                                           TRACAD1A.427    
                                                                           TRACAD1A.428    
C     RECALCULATE END POINT VALUES                                         TRACAD1A.429    
          DO I=START_P_UPDATE,END_P_UPDATE,ROW_LENGTH                      TRACAD1A.430    
            WORK(I)= COURANT_MW(I-1+ROW_LENGTH) - COURANT_MW(I)            TRACAD1A.431    
          END DO                                                           TRACAD1A.432    
                                                                           TRACAD1A.433    
          DO I=START_P_UPDATE,END_P_UPDATE                                 TRACAD1A.434    
            RS_SQUARED_DELTAP(I) = RS_SQUARED_DELTAP(I) + WORK(I)          TRACAD1A.435    
            RS_SQUARED_DELTAP_RECIP(I) = 1./RS_SQUARED_DELTAP(I)           TRACAD1A.436    
          END DO                                                           TRACAD1A.437    
*ELSE                                                                      GPB7F405.292    
          DO I=START_P_UPDATE,END_P_UPDATE                                 GPB7F405.293    
            RS_SQUARED_DELTAP(I) = RS_SQUARED_DELTAP(I) +                  GPB7F405.294    
     &        (COURANT_MW(I-1)  - COURANT_MW(I))                           GPB7F405.295    
            RS_SQUARED_DELTAP_RECIP(I) = 1./RS_SQUARED_DELTAP(I)           GPB7F405.296    
          END DO                                                           GPB7F405.297    
*ENDIF                                                                     GPB7F405.298    
                                                                           TRACAD1A.439    
C ADD INCREMENTS TO FIELD                                                  TRACAD1A.440    
*IF DEF,GLOBAL                                                             TRACAD1A.441    
          DO I=START_P_UPDATE,END_P_UPDATE                                 TRACAD1A.442    
            FIELD(I) = FIELD(I)+FIELD_INC(I)*RS_SQUARED_DELTAP_RECIP(I)    TRACAD1A.443    
          END DO                                                           TRACAD1A.444    
*ELSE                                                                      TRACAD1A.445    
        J1 = 1                                                             ARB1F402.501    
        J2 = ROW_LENGTH-2                                                  ARB1F402.502    
*IF DEF,MPP                                                                ARB1F403.45     
          if (atleft) J1 = J1+EW_Halo                                      ARB1F403.46     
          if (atright) J2 = J2-EW_Halo                                     ARB1F403.47     
*ENDIF                                                                     ARB1F403.48     
CFPP$ NODEPCHK                                                             TRACAD1A.446    
          DO 150 J=START_P_UPDATE,END_P_UPDATE,ROW_LENGTH                  TRACAD1A.447    
            DO I = J1,J2                                                   ARB1F402.507    
              FIELD(J+I) = FIELD(J+I)+FIELD_INC(J+I)*                      TRACAD1A.449    
     &                     RS_SQUARED_DELTAP_RECIP(J+I)                    TRACAD1A.450    
            END DO                                                         TRACAD1A.451    
 150      CONTINUE                                                         TRACAD1A.452    
*ENDIF                                                                     TRACAD1A.453    
                                                                           TRACAD1A.454    
CL    END INNER LOOP OVER NUMBER OF HEMISPHERES.                           TRACAD1A.455    
        END DO                                                             TRACAD1A.456    
*IF DEF,MPP                                                                ARB1F402.508    
        END IF ! START_P(1) > 0                                            ARB1F402.509    
! Do EW Swapbounds to fill in left & right halo points.                    ARB1F402.510    
      IF (I_SWEEP .lt. MAX_SWEEPS) THEN                                    ARB1F402.511    
        CALL SWAPBOUNDS(FIELD,ROW_LENGTH,ROWS,EW_Halo,0,1)                 ARB1F402.512    
      END IF                                                               ARB1F402.513    
*ENDIF                                                                     ARB1F402.514    
                                                                           TRACAD1A.457    
CL    END LOOP OVER NUMBER OF SWEEPS                                       TRACAD1A.458    
      END DO                                                               TRACAD1A.459    
                                                                           TRACAD1A.460    
*IF DEF,MPP                                                                ARB1F402.515    
! Swap all halo points to ensure updated arrays are fully up-to-date       ARB1F402.516    
!  for North-South sweep.                                                  ARB1F402.517    
      CALL SWAPBOUNDS(FIELD,ROW_LENGTH,ROWS,EW_Halo,NS_Halo,1)             ARB1F402.518    
      CALL SWAPBOUNDS(RS_SQUARED_DELTAP,ROW_LENGTH,ROWS,                   ARB1F402.519    
     &                EW_Halo,NS_Halo,1)                                   ARB1F402.520    
      CALL SWAPBOUNDS(RS_SQUARED_DELTAP_RECIP,ROW_LENGTH,ROWS,             ARB1F402.521    
     &                EW_Halo,NS_Halo,1)                                   ARB1F402.522    
!!! Might be better to recompute RS_SQUARED_DELTAP_RECIP haloes.           ARB1F402.523    
*ENDIF                                                                     ARB1F402.524    
CL                                                                         TRACAD1A.461    
CL---------------------------------------------------------------------    TRACAD1A.462    
CL    SECTION 2.     CALCULATE FIELD INCREMENTS FOR V ADVECTION            TRACAD1A.463    
CL---------------------------------------------------------------------    TRACAD1A.464    
                                                                           TRACAD1A.465    
      DO I=1,P_FIELD                                                       TRACAD1A.466    
        FIELD_INC(I)=0.0                                                   TRACAD1A.467    
      END DO                                                               TRACAD1A.468    
                                                                           TRACAD1A.469    
C----------------------------------------------------------------------    TRACAD1A.470    
CL    SECTION 2.1    CALCULATE COURANT NUMBER                              TRACAD1A.471    
C----------------------------------------------------------------------    TRACAD1A.472    
                                                                           TRACAD1A.473    
      DO  I = FIRST_VALID_PT+1,LAST_U_VALID_PT                             ARB1F402.525    
!      DO I=2,U_FIELD                                                      ARB1F402.526    
        COURANT_MW(I) = 0.5*(V_MEAN(I)+V_MEAN(I-1))*ADVECTION_TIMESTEP*    TRACAD1A.475    
     &                    LATITUDE_STEP_INVERSE                            TRACAD1A.476    
      END DO                                                               TRACAD1A.477    
                                                                           TRACAD1A.478    
*IF DEF,GLOBAL                                                             TRACAD1A.479    
*IF DEF,MPP                                                                ARB1F402.527    
! Do EW Swapbounds to fill in west halo points.                            ARB1F402.528    
      CALL SWAPBOUNDS(COURANT_MW,ROW_LENGTH,ROWS,EW_Halo,0,1)              ARB1F402.529    
*ELSE                                                                      ARB1F402.530    
C  REPEAT FOR END POINTS                                                   TRACAD1A.480    
                                                                           TRACAD1A.481    
      DO I=1,U_FIELD,ROW_LENGTH                                            TRACAD1A.482    
        COURANT_MW(I) = 0.5*(V_MEAN(I)+V_MEAN(I+ROW_LENGTH-1))*            TRACAD1A.483    
     &                   ADVECTION_TIMESTEP * LATITUDE_STEP_INVERSE        TRACAD1A.484    
      END DO                                                               TRACAD1A.485    
*ENDIF                                                                     ARB1F402.531    
*ELSE                                                                      TRACAD1A.486    
! For limited area or MPP just make sure have sensible value               ARB1F402.532    
      COURANT_MW(FIRST_VALID_PT) = V_MEAN(FIRST_VALID_PT)*                 ARB1F403.49     
     &            ADVECTION_TIMESTEP*LATITUDE_STEP_INVERSE                 ARB1F403.50     
*ENDIF                                                                     TRACAD1A.489    
                                                                           TRACAD1A.490    
      DO  I = FIRST_VALID_PT,LAST_U_FLD_PT                                 ARB1F402.533    
!      DO I=1,U_FIELD                                                      ARB1F402.534    
*IF DEF,MPP                                                                ARB1F402.535    
        MW(I)=0.5*(RS_SQUARED_DELTAP(I)*COS_P_LATITUDE(I)+                 ARB1F402.536    
     &     RS_SQUARED_DELTAP(I+ROW_LENGTH)*COS_P_LATITUDE(I+ROW_LENGTH))   ARB1F402.537    
*ENDIF                                                                     ARB1F402.538    
! Split this loop to try and retain MPP & nonMPP bit comparison            ARB1F403.51     
        COURANT(I) = COURANT_MW(I)*RS_SQUARED_DELTAP_RECIP(I)              ARB1F403.52     
        COURANT(I) = COURANT(I)*SEC_P_LATITUDE(I)                          ARB1F403.53     
        IF (COURANT_MW(I).GT.0.) THEN                                      TRACAD1A.494    
          COURANT(I) = COURANT_MW(I)*SEC_P_LATITUDE(I+ROW_LENGTH)          TRACAD1A.495    
     &                 *RS_SQUARED_DELTAP_RECIP(I+ROW_LENGTH)              TRACAD1A.496    
        ENDIF                                                              TRACAD1A.497    
      END DO                                                               TRACAD1A.498    
                                                                           TRACAD1A.499    
C ABSOLUTE VALUE OF COURANT NUMBER CALCULATED IN THIS LOOP AS PUTTING      TRACAD1A.500    
C IT IN PREVIOUS LOOP PREVENTS FULL OPTIMISATION.                          TRACAD1A.501    
                                                                           TRACAD1A.502    
*IF DEF,MPP                                                                ARB1F402.539    
! Do NS Swapbounds to fill in south halo points.                           ARB1F402.540    
      CALL SWAPBOUNDS(MW,ROW_LENGTH,ROWS,0,NS_Halo,1) !single level        ARB1F402.541    
      CALL SWAPBOUNDS(COURANT,ROW_LENGTH,ROWS,0,NS_Halo,1)                 ARB1F402.542    
*ENDIF                                                                     ARB1F403.54     
                                                                           ARB1F402.543    
      DO  I = FIRST_VALID_PT,LAST_U_VALID_PT                               ARB1F402.544    
*IF -DEF,MPP                                                               ARB1F402.547    
        MW(I)=0.5*(RS_SQUARED_DELTAP(I)*COS_P_LATITUDE(I)+                 TRACAD1A.504    
     &     RS_SQUARED_DELTAP(I+ROW_LENGTH)*COS_P_LATITUDE(I+ROW_LENGTH))   TRACAD1A.505    
*ENDIF                                                                     ARB1F402.548    
        ABS_COURANT(I) = ABS(COURANT(I))                                   TRACAD1A.506    
        MW_RECIP(I) = 1./MW(I)                                             TRACAD1A.507    
      END DO                                                               TRACAD1A.508    
                                                                           TRACAD1A.509    
C----------------------------------------------------------------------    TRACAD1A.510    
CL    SECTION 2.2    CALCULATE FLUX_DELTA_T AND B1                         TRACAD1A.511    
C----------------------------------------------------------------------    TRACAD1A.512    
                                                                           TRACAD1A.513    
      DO  I = FIRST_VALID_PT,LAST_U_FLD_PT                                 ARB1F402.549    
!      DO I=1,U_FIELD                                                      ARB1F402.550    
        FLUX_DELTA_T(I) = COURANT_MW(I) * (FIELD(I)-FIELD(I+ROW_LENGTH))   TRACAD1A.515    
*IF -DEF,MPP                                                               ARB1F402.551    
        B1(I) = FLUX_DELTA_T(I)*0.5*(1.0-ABS_COURANT(I))                   TRACAD1A.516    
*ENDIF                                                                     ARB1F402.552    
      END DO                                                               TRACAD1A.517    
                                                                           TRACAD1A.518    
*IF DEF,MPP                                                                ARB1F402.553    
! Do NS Swapbounds to fill in south halo points.                           ARB1F402.554    
      CALL SWAPBOUNDS(FLUX_DELTA_T(1),ROW_LENGTH,ROWS,0,NS_Halo,1)         GPB7F405.299    
      DO  I = FIRST_VALID_PT,LAST_U_FLD_PT                                 ARB1F402.556    
        B1(I) = FLUX_DELTA_T(I)*0.5*(1.0-ABS_COURANT(I))                   ARB1F402.557    
      END DO                                                               ARB1F402.558    
*ENDIF                                                                     ARB1F402.559    
                                                                           ARB1F402.560    
C----------------------------------------------------------------------    TRACAD1A.519    
CL    SECTION 2.3    CALCULATE B1 AND B2                                   TRACAD1A.520    
C----------------------------------------------------------------------    TRACAD1A.521    
                                                                           TRACAD1A.522    
C CALCULATE FLUXES AT VELOCITY POINTS.                                     TRACAD1A.523    
C FIRST LOOP OVER ALL POINTS NOT AT NORTHERN OR SOUTHERN BOUNDARY.         TRACAD1A.524    
                                                                           TRACAD1A.525    
      real_row_length=row_length                                           GPB7F405.300    
cdir$ unroll                                                               GPB7F405.301    
      DO  I = START_POINT_NO_HALO,END_U_POINT_NO_HALO                      ARB1F402.561    
        ii=nint(sign(real_row_length, courant_mw(i)))                      GPB7F405.302    
        B2(I) = FLUX_DELTA_T(I-II)*0.5*(MW(I)                              GPB7F405.303    
     &           *MW_RECIP(I-II) - ABS_COURANT(I-II))                      GPB7F405.304    
      END DO                                                               GPB7F405.305    
c                                                                          GPB7F405.306    
      DO  I = START_POINT_NO_HALO,END_U_POINT_NO_HALO                      GPB7F405.307    
        ii=nint(sign(real_row_length, courant_mw(i)))                      GPB7F405.308    
        B_SWITCH(I) = SIGN(1.,COURANT(I)*COURANT(I-II))                    GPB7F405.309    
      END DO                                                               TRACAD1A.535    
                                                                           TRACAD1A.536    
*IF DEF,MPP                                                                ARB1F402.563    
      IF (at_top_of_LPG) THEN                                              ARB1F402.564    
*IF DEF,GLOBAL                                                             ARB1F402.565    
! Needs values over top of pole on another processor                       ARB1F402.566    
      HALF_RL = GLOBAL_ROW_LENGTH/2                                        ARB1F402.567    
! Copy North polar row into copy arrays                                    ARB1F402.568    
      DO  I = 1,ROW_LENGTH                                                 ARB1F402.569    
        SHIFT_N(I,1) = MW(TOP_ROW_START+I-1)                               ARB1F402.570    
        SHIFT_N(I,2) = COURANT(TOP_ROW_START+I-1)                          ARB1F402.571    
      END DO                                                               ARB1F402.572    
! Rotate these arrays by half the global row length to get values on       ARB1F402.573    
!  opposite side of the pole.                                              ARB1F402.574    
      CALL GCG_RVECSHIFT(ROW_LENGTH,ROW_LENGTH-2*Offx,1+Offx,2,            ARB1F402.575    
     &                   HALF_RL,.TRUE.,SHIFT_N,GC_ROW_GROUP,info)         ARB1F402.576    
      DO  I = 1,ROW_LENGTH                                                 ARB1F402.577    
        B2_SHIFT_N(I) =                                                    ARB1F402.578    
     &    FLUX_DELTA_T(TOP_ROW_START+I-1)*0.5*(SHIFT_N(I,1)                ARB1F402.579    
     &   *MW_RECIP(TOP_ROW_START+I-1)-ABS_COURANT(TOP_ROW_START+I-1))      ARB1F402.580    
        B_SWITCH(TOP_ROW_START+I-1) =                                      ARB1F403.55     
     & SIGN(1.0,COURANT(TOP_ROW_START+I-1)*SHIFT_N(I,2))                   ARB1F403.56     
      END DO                                                               ARB1F402.582    
      CALL GCG_RVECSHIFT(ROW_LENGTH,ROW_LENGTH-2*Offx,1+Offx,1,            ARB1F402.583    
     &                   HALF_RL,.TRUE.,B2_SHIFT_N,GC_ROW_GROUP,info)      ARB1F402.584    
      DO  I = 1,ROW_LENGTH                                                 ARB1F402.585    
        B2(TOP_ROW_START+I-1) = B2_SHIFT_N(I)                              ARB1F402.586    
      END DO                                                               ARB1F402.587    
*ELSE                                                                      ARB1F402.588    
      DO  I = TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                     ARB1F402.589    
        B2(I) = 0.0                                                        ARB1F402.590    
        B_SWITCH(I) = 0.0                                                  ARB1F402.591    
      END DO                                                               ARB1F402.592    
*ENDIF                                                                     ARB1F402.593    
      DO  I = TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                     ARB1F402.594    
        IF (COURANT_MW(I) .lt. 0.0) THEN                                   ARB1F402.595    
          B2(I) = FLUX_DELTA_T(I+ROW_LENGTH)*0.5*(MW(I)                    ARB1F402.596    
     &          *MW_RECIP(I+ROW_LENGTH) - ABS_COURANT(I+ROW_LENGTH))       ARB1F402.597    
          B_SWITCH(I) = SIGN(1.,COURANT(I)*COURANT(I+ROW_LENGTH))          ARB1F402.598    
        END IF                                                             ARB1F402.599    
      END DO                                                               ARB1F402.600    
      END IF ! at_top_of_LPG                                               ARB1F402.601    
                                                                           ARB1F402.602    
      IF (at_base_of_LPG) THEN                                             ARB1F402.603    
      DO  I = U_BOT_ROW_START,LAST_U_VALID_PT                              ARB1F402.604    
        B2(I) = FLUX_DELTA_T(I-ROW_LENGTH)*0.5*(MW(I)                      ARB1F402.605    
     &          *MW_RECIP(I-ROW_LENGTH)-ABS_COURANT(I-ROW_LENGTH))         ARB1F402.606    
        B_SWITCH(I) = SIGN(1.0,COURANT(I)*COURANT(I-ROW_LENGTH))           ARB1F402.607    
      END DO                                                               ARB1F402.608    
*IF DEF,GLOBAL                                                             ARB1F402.609    
      HALF_RL = GLOBAL_ROW_LENGTH/2                                        ARB1F402.610    
      DO  I = 1,ROW_LENGTH                                                 ARB1F402.611    
        SHIFT_S(I,1) = MW(U_BOT_ROW_START+I-1)                             ARB1F402.612    
        SHIFT_S(I,2) = COURANT(U_BOT_ROW_START+I-1)                        ARB1F402.613    
      END DO                                                               ARB1F402.614    
      CALL GCG_RVECSHIFT(ROW_LENGTH,ROW_LENGTH-2*Offx,1+Offx,2,            ARB1F402.615    
     &                   HALF_RL,.TRUE.,SHIFT_S,GC_ROW_GROUP,info)         ARB1F402.616    
      DO  I = 1,ROW_LENGTH                                                 ARB1F402.617    
        B2_SHIFT_S(I) =                                                    ARB1F402.619    
     &    FLUX_DELTA_T(U_BOT_ROW_START+I-1)*0.5*(SHIFT_S(I,1)              ARB1F402.620    
     & *MW_RECIP(U_BOT_ROW_START+I-1)-ABS_COURANT(U_BOT_ROW_START+I-1))    ARB1F402.621    
        IF (COURANT_MW(U_BOT_ROW_START+I-1) .lt. 0.0) THEN                 ARB1F403.57     
        B_SWITCH(U_BOT_ROW_START+I-1) = SIGN(1.0,                          ARB1F402.622    
     &   COURANT(U_BOT_ROW_START+I-1)*SHIFT_S(I,2))                        ARB1F402.623    
        END IF                                                             ARB1F402.624    
      END DO                                                               ARB1F402.625    
      CALL GCG_RVECSHIFT(ROW_LENGTH,ROW_LENGTH-2*Offx,1+Offx,1,            ARB1F402.626    
     &                   HALF_RL,.TRUE.,B2_SHIFT_S,GC_ROW_GROUP,info)      ARB1F402.627    
      DO  I = 1,ROW_LENGTH                                                 ARB1F402.628    
        IF (COURANT_MW(U_BOT_ROW_START+I-1) .lt. 0.0) THEN                 ARB1F403.58     
        B2(U_BOT_ROW_START+I-1) = B2_SHIFT_S(I)                            ARB1F402.629    
        END IF                                                             ARB1F403.59     
      END DO                                                               ARB1F402.630    
*ELSE                                                                      ARB1F402.631    
      DO  I = U_BOT_ROW_START,LAST_U_VALID_PT                              ARB1F402.632    
        IF (COURANT_MW(I) .lt. 0.0) THEN                                   ARB1F402.633    
          B2(I) = 0.0                                                      ARB1F402.634    
          B_SWITCH(I) = 0.0                                                ARB1F402.635    
        END IF                                                             ARB1F402.636    
      END DO                                                               ARB1F402.637    
*ENDIF                                                                     ARB1F402.638    
      END IF ! at_base_of LPG                                              ARB1F402.639    
                                                                           ARB1F402.640    
*ELSE                                                                      ARB1F402.641    
CFPP$ NODEPCHK                                                             TRACAD1A.537    
      DO L=1,ROW_LENGTH                                                    TRACAD1A.538    
C NORTHERN BOUNDARY.                                                       TRACAD1A.539    
                                                                           TRACAD1A.540    
*IF DEF,GLOBAL                                                             TRACAD1A.541    
        J = MOD(L-1+ROW_LENGTH/2,ROW_LENGTH)+1                             TRACAD1A.542    
        B2(L) = FLUX_DELTA_T(J)*0.5*(MW(L)*MW_RECIP(J)-ABS_COURANT(J))     TRACAD1A.543    
        B_SWITCH(L) = SIGN(1.,COURANT(L)*COURANT(J))                       TRACAD1A.544    
*ELSE                                                                      TRACAD1A.545    
        B2(L) = 0.0                                                        TRACAD1A.546    
        B_SWITCH(L) = 0.                                                   TRACAD1A.547    
*ENDIF                                                                     TRACAD1A.548    
                                                                           TRACAD1A.549    
        IF(COURANT_MW(L).LT. 0.0) THEN                                     TRACAD1A.550    
          B2(L) = FLUX_DELTA_T(L+ROW_LENGTH)*0.5*(MW(L)                    TRACAD1A.551    
     &          *MW_RECIP(L+ROW_LENGTH) - ABS_COURANT(L+ROW_LENGTH))       TRACAD1A.552    
          B_SWITCH(L) = SIGN(1.,COURANT(L)*COURANT(L+ROW_LENGTH))          TRACAD1A.553    
        END IF                                                             TRACAD1A.554    
                                                                           TRACAD1A.555    
C SOUTHERN BOUNDARY.                                                       TRACAD1A.556    
        I= U_FIELD - ROW_LENGTH + L                                        TRACAD1A.557    
        B2(I) = FLUX_DELTA_T(I-ROW_LENGTH)*0.5*(MW(I)                      TRACAD1A.558    
     &             *MW_RECIP(I-ROW_LENGTH) - ABS_COURANT(I-ROW_LENGTH))    TRACAD1A.559    
        B_SWITCH(I) = SIGN(1.,COURANT(I)*COURANT(I-ROW_LENGTH))            TRACAD1A.560    
                                                                           TRACAD1A.561    
        IF(COURANT_MW(I).LT. 0.0) THEN                                     TRACAD1A.562    
*IF DEF,GLOBAL                                                             TRACAD1A.563    
         J = MOD(I-1+ROW_LENGTH/2,ROW_LENGTH)+U_FIELD-ROW_LENGTH+1         TRACAD1A.564    
         B2(I) = FLUX_DELTA_T(J)*0.5*(MW(I)*MW_RECIP(J)-ABS_COURANT(J))    TRACAD1A.565    
         B_SWITCH(I) = SIGN(1.,COURANT(I)*COURANT(J))                      TRACAD1A.566    
*ELSE                                                                      TRACAD1A.567    
         B2(I) = 0.0                                                       TRACAD1A.568    
         B_SWITCH(I) = 0.                                                  TRACAD1A.569    
*ENDIF                                                                     TRACAD1A.570    
        ENDIF                                                              TRACAD1A.571    
                                                                           TRACAD1A.572    
      END DO                                                               TRACAD1A.573    
*ENDIF                                                                     ARB1F402.642    
                                                                           TRACAD1A.574    
C----------------------------------------------------------------------    TRACAD1A.575    
CL    SECTION 2.4    CALCULATE B_TERM                                      TRACAD1A.576    
C----------------------------------------------------------------------    TRACAD1A.577    
                                                                           TRACAD1A.578    
      IF (L_SUPERBEE) THEN                                                 TRACAD1A.579    
                                                                           TRACAD1A.580    
CL    SUPERBEE LIMITER.                                                    TRACAD1A.581    
                                                                           TRACAD1A.582    
        DO  I = FIRST_FLD_PT,LAST_U_FLD_PT                                 ARB1F402.643    
!        DO I=1,U_FIELD                                                    ARB1F402.644    
          IF(ABS(B2(I)).GT.1.0E-8) THEN                                    TRACAD1A.584    
            B_SWITCH(I) = B_SWITCH(I)*B1(I)/B2(I)                          TRACAD1A.585    
            IF (B_SWITCH(I).GT.0.5.AND.B_SWITCH(I).LT.2.0) THEN            GPB7F405.310    
              B_TERM(I) = B2(I) * MAX(B_SWITCH(I),1.0)                     GPB7F405.311    
            ELSE IF (B_SWITCH(I).LE.0.0) THEN                              GPB7F405.312    
              B_TERM(I) = 0.0                                              GPB7F405.313    
            ELSE                                                           GPB7F405.314    
              B_TERM(I) = 2.0 * B2(I) * MIN(B_SWITCH(I),1.0)               GPB7F405.315    
            END IF                                                         GPB7F405.316    
          ELSE                                                             TRACAD1A.586    
            B_SWITCH(I) = 0.                                               TRACAD1A.587    
            B_TERM(I) = 0.0                                                GPB7F405.317    
          END IF                                                           TRACAD1A.588    
        END DO                                                             TRACAD1A.589    
                                                                           TRACAD1A.601    
      ELSE                                                                 TRACAD1A.602    
                                                                           TRACAD1A.603    
CL    VAN LEER LIMITER.                                                    TRACAD1A.604    
                                                                           TRACAD1A.605    
C LOOP OVER ALL POINTS                                                     TRACAD1A.606    
        DO  I = FIRST_FLD_PT,LAST_U_FLD_PT                                 ARB1F402.647    
!        DO I=1,U_FIELD                                                    ARB1F402.648    
          B_TERM(I) = 0.0                                                  TRACAD1A.608    
          IF (B1(I)*B2(I)*B_SWITCH(I).GT.0.0)                              TRACAD1A.609    
     &           B_TERM(I) = 2.0*B1(I)*B2(I)*B_SWITCH(I)/                  TRACAD1A.610    
     &                       (B1(I)+B2(I)*B_SWITCH(I))                     TRACAD1A.611    
        END DO                                                             TRACAD1A.612    
                                                                           TRACAD1A.613    
      END IF                                                               TRACAD1A.614    
                                                                           TRACAD1A.615    
*IF DEF,MPP                                                                ARB1F402.649    
! Do NS Swapbounds to fill in halo points.                                 ARB1F402.650    
      CALL SWAPBOUNDS(B_TERM(1),ROW_LENGTH,ROWS,0,NS_Halo,1)               GPB7F405.318    
*ENDIF                                                                     ARB1F402.652    
                                                                           ARB1F402.653    
C----------------------------------------------------------------------    TRACAD1A.616    
CL    SECTION 2.5    CALCULATE INCREMENTS TO FIELD                         TRACAD1A.617    
CL---------------------------------------------------------------------    TRACAD1A.618    
                                                                           TRACAD1A.619    
CDIR$ IVDEP                                                                TRACAD1A.620    
*IF DEF,T3E                                                                GPB7F405.319    
      b_term(0)=0.                                                         GPB7F405.320    
      flux_delta_t(0)=0.                                                   GPB7F405.321    
cdir$ unroll                                                               GPB7F405.322    
*ENDIF                                                                     GPB7F405.323    
      DO  I = FIRST_FLD_PT,LAST_U_FLD_PT                                   ARB1F402.654    
!      DO I=1,U_FIELD                                                      ARB1F402.655    
*IF DEF,T3E                                                                GPB7F405.324    
        ii=max(0, -nint(sign(real(i), courant_mw(i))))                     GPB7F405.325    
        FIELD_INC(I) = (FIELD_INC(I) -                                     GPB7F405.326    
     &                  B_TERM(I)) +                                       GPB7F405.327    
     &                 (2.*B_TERM(II) - FLUX_DELTA_T(II))                  GPB7F405.328    
*ELSE                                                                      GPB7F405.329    
        FIELD_INC(I) = FIELD_INC(I) - B_TERM(I)                            TRACAD1A.622    
        IF (COURANT_MW(I).LT.0.0)                                          TRACAD1A.623    
     &    FIELD_INC(I) = FIELD_INC(I) - FLUX_DELTA_T(I) +2.*B_TERM(I)      TRACAD1A.624    
*ENDIF                                                                     GPB7F405.330    
      END DO                                                               TRACAD1A.625    
CDIR$ IVDEP                                                                TRACAD1A.626    
      DO  I = FIRST_VALID_PT,LAST_U_FLD_PT                                 ARB1F402.656    
!      DO I=1,U_FIELD                                                      ARB1F402.657    
*IF DEF,T3E                                                                GPB7F405.331    
        ii=max(0, nint(sign(real(i), courant_mw(i))))                      GPB7F405.332    
        FIELD_INC(I+ROW_LENGTH) = (FIELD_INC(I+ROW_LENGTH) -               GPB7F405.333    
     &                             B_TERM(I)) +                            GPB7F405.334    
     &                            (2.*B_TERM(II) - FLUX_DELTA_T(II))       GPB7F405.335    
*ELSE                                                                      GPB7F405.336    
        FIELD_INC(I+ROW_LENGTH) = FIELD_INC(I+ROW_LENGTH) -                TRACAD1A.628    
     &                              B_TERM(I)                              TRACAD1A.629    
        IF (COURANT_MW(I).GE.0.0)                                          TRACAD1A.630    
     &    FIELD_INC(I+ROW_LENGTH) = FIELD_INC(I+ROW_LENGTH) -              TRACAD1A.631    
     &                              FLUX_DELTA_T(I) + 2.*B_TERM(I)         TRACAD1A.632    
*ENDIF                                                                     GPB7F405.337    
      END DO                                                               TRACAD1A.633    
                                                                           TRACAD1A.634    
*IF DEF,GLOBAL                                                             TRACAD1A.635    
                                                                           TRACAD1A.636    
C----------------------------------------------------------------------    TRACAD1A.637    
CL    SECTION 2.6    CALCULATE POLAR INCREMENTS                            TRACAD1A.638    
CL---------------------------------------------------------------------    TRACAD1A.639    
                                                                           TRACAD1A.640    
C CALCULATE AVERAGE POLAR INCREMENT                                        TRACAD1A.641    
      NORTH_POLE_INC = 0.0                                                 TRACAD1A.642    
      SOUTH_POLE_INC = 0.0                                                 TRACAD1A.643    
                                                                           TRACAD1A.644    
*IF DEF,MPP                                                                ARB1F402.658    
! Use reproducible vector sum of points on polar rows.                     ARB1F402.659    
      IF (at_top_of_LPG) THEN                                              ARB1F402.660    
        CALL GCG_RVECSUMR(P_FIELD,ROW_LENGTH-2*EW_Halo,                    ARB1F402.661    
     &                    TOP_ROW_START+EW_Halo,1,                         ARB1F402.662    
     &                    FIELD_INC,GC_ROW_GROUP,info,NORTH_POLE_INC)      ARB1F402.663    
      END IF                                                               ARB1F402.664    
! Because values are summed in reverse order in non-MPP loop               ARB1F402.665    
! SOUTH_POLE_INC will probably not bit-compare                             ARB1F402.666    
      IF (at_base_of_LPG) THEN                                             ARB1F402.667    
        CALL GCG_RVECSUMR(P_FIELD,ROW_LENGTH-2*EW_Halo,                    ARB1F402.668    
     &                    P_BOT_ROW_START+EW_Halo,1,                       ARB1F402.669    
     &                    FIELD_INC,GC_ROW_GROUP,info,SOUTH_POLE_INC)      ARB1F402.670    
      END IF                                                               ARB1F402.671    
*ELSE                                                                      ARB1F402.672    
      DO I=1,ROW_LENGTH                                                    TRACAD1A.645    
        NORTH_POLE_INC = NORTH_POLE_INC + FIELD_INC(I)                     TRACAD1A.646    
        SOUTH_POLE_INC = SOUTH_POLE_INC + FIELD_INC(P_FIELD+1-I)           TRACAD1A.647    
      END DO                                                               TRACAD1A.648    
*ENDIF                                                                     ARB1F402.673    
                                                                           TRACAD1A.649    
      NORTH_POLE_INC = NORTH_POLE_INC * ROW_LENGTH_RECIP * 2.0             TRACAD1A.650    
      SOUTH_POLE_INC = SOUTH_POLE_INC * ROW_LENGTH_RECIP * 2.0             TRACAD1A.651    
                                                                           TRACAD1A.652    
*IF DEF,MPP                                                                ARB1F402.674    
      IF (at_top_of_LPG) THEN                                              ARB1F402.675    
        DO  I = TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                   ARB1F402.676    
          FIELD_INC(I) =  NORTH_POLE_INC                                   ARB1F402.677    
        END DO                                                             ARB1F402.678    
      END IF                                                               ARB1F402.679    
      IF (at_base_of_LPG) THEN                                             ARB1F402.680    
        DO  J = P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1               ARB1F402.681    
          FIELD_INC(J) = SOUTH_POLE_INC                                    ARB1F402.682    
        END DO                                                             ARB1F402.683    
      END IF                                                               ARB1F402.684    
*ELSE                                                                      ARB1F402.685    
CDIR$ IVDEP                                                                TRACAD1A.653    
      DO I=1,ROW_LENGTH                                                    TRACAD1A.654    
        FIELD_INC(I) = NORTH_POLE_INC                                      TRACAD1A.655    
        FIELD_INC(P_FIELD+1-I) = SOUTH_POLE_INC                            TRACAD1A.656    
      END DO                                                               TRACAD1A.657    
*ENDIF                                                                     TRACAD1A.658    
*ENDIF                                                                     ARB1F402.686    
                                                                           TRACAD1A.659    
C----------------------------------------------------------------------    TRACAD1A.660    
CL    SECTION 2.7    UPDATE FIELD                                          TRACAD1A.661    
CL---------------------------------------------------------------------    TRACAD1A.662    
                                                                           TRACAD1A.663    
C UPDATE MASS WEIGHTING                                                    TRACAD1A.664    
      DO  I = START_POINT_NO_HALO,END_P_POINT_NO_HALO                      ARB1F402.687    
!      DO I=ROW_LENGTH+1,P_FIELD-ROW_LENGTH                                ARB1F402.688    
        RS_SQUARED_DELTAP(I) = RS_SQUARED_DELTAP(I) +                      TRACAD1A.666    
     &        (COURANT_MW(I)-COURANT_MW(I-ROW_LENGTH))*SEC_P_LATITUDE(I)   TRACAD1A.667    
      END DO                                                               TRACAD1A.668    
                                                                           TRACAD1A.669    
*IF DEF,GLOBAL                                                             TRACAD1A.670    
C     POLAR VALUES                                                         TRACAD1A.671    
      NORTH_POLE_INC = 0.                                                  TRACAD1A.672    
      SOUTH_POLE_INC = 0.                                                  TRACAD1A.673    
*IF DEF,MPP                                                                ARB1F402.689    
! Use reproducible vector sum of points on polar rows.                     ARB1F402.690    
      IF (at_top_of_LPG) THEN                                              ARB1F402.691    
        CALL GCG_RVECSUMR(P_FIELD,ROW_LENGTH-2*EW_Halo,                    ARB1F402.692    
     &                    TOP_ROW_START+EW_Halo,1,                         ARB1F402.693    
     &                    COURANT_MW,GC_ROW_GROUP,info,NORTH_POLE_INC)     ARB1F402.694    
      END IF                                                               ARB1F402.695    
      IF (at_base_of_LPG) THEN                                             ARB1F402.696    
        CALL GCG_RVECSUMR(P_FIELD,ROW_LENGTH-2*EW_Halo,                    ARB1F402.697    
     &                    U_BOT_ROW_START+EW_Halo,1,                       ARB1F402.698    
     &                    COURANT_MW,GC_ROW_GROUP,info,SOUTH_POLE_INC)     ARB1F402.699    
      SOUTH_POLE_INC = -SOUTH_POLE_INC                                     ARB1F402.700    
      END IF                                                               ARB1F402.701    
*ELSE                                                                      ARB1F402.702    
      DO I=1,ROW_LENGTH                                                    TRACAD1A.674    
        NORTH_POLE_INC = NORTH_POLE_INC + COURANT_MW(I)                    TRACAD1A.675    
         J=P_FIELD-2*ROW_LENGTH+I                                          TRACAD1A.676    
        SOUTH_POLE_INC = SOUTH_POLE_INC - COURANT_MW(J)                    TRACAD1A.677    
      END DO                                                               TRACAD1A.678    
*ENDIF                                                                     ARB1F402.703    
                                                                           TRACAD1A.679    
      NORTH_POLE_INC = NORTH_POLE_INC*ROW_LENGTH_RECIP*                    TRACAD1A.680    
     &                   SEC_P_LATITUDE(TOP_ROW_START)*2                   ARB1F403.60     
      SOUTH_POLE_INC = SOUTH_POLE_INC*ROW_LENGTH_RECIP*                    TRACAD1A.682    
     &                   SEC_P_LATITUDE(P_BOT_ROW_START)*2                 ARB1F403.61     
*IF DEF,MPP                                                                ARB1F402.704    
      IF (at_top_of_LPG) THEN                                              ARB1F402.705    
        DO  I = TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                   ARB1F402.706    
          RS_SQUARED_DELTAP(I) = RS_SQUARED_DELTAP(I) + NORTH_POLE_INC     ARB1F402.707    
        END DO                                                             ARB1F402.708    
      END IF                                                               ARB1F402.709    
      IF (at_base_of_LPG) THEN                                             ARB1F402.710    
        DO  J = P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1               ARB1F402.711    
          RS_SQUARED_DELTAP(J) = RS_SQUARED_DELTAP(J) + SOUTH_POLE_INC     ARB1F402.712    
        END DO                                                             ARB1F402.713    
      END IF                                                               ARB1F402.714    
*ELSE                                                                      ARB1F402.715    
      DO I=1,ROW_LENGTH                                                    TRACAD1A.684    
        RS_SQUARED_DELTAP(I) = RS_SQUARED_DELTAP(I) + NORTH_POLE_INC       TRACAD1A.685    
         J=P_FIELD-ROW_LENGTH+I                                            TRACAD1A.686    
        RS_SQUARED_DELTAP(J) = RS_SQUARED_DELTAP(J) + SOUTH_POLE_INC       TRACAD1A.687    
      END DO                                                               TRACAD1A.688    
*ENDIF                                                                     ARB1F402.716    
                                                                           TRACAD1A.689    
C ADD INCREMENTS TO FIELD                                                  TRACAD1A.690    
      DO  I = FIRST_FLD_PT,LAST_P_FLD_PT                                   ARB1F402.717    
!      DO I=1,P_FIELD                                                      ARB1F402.718    
        FIELD(I) = FIELD(I)+                                               TRACAD1A.692    
     &     FIELD_INC(I)*SEC_P_LATITUDE(I) / RS_SQUARED_DELTAP(I)           TRACAD1A.693    
      END DO                                                               TRACAD1A.694    
                                                                           TRACAD1A.695    
*ELSE                                                                      TRACAD1A.696    
                                                                           TRACAD1A.697    
C ADD INCREMENTS TO FIELD                                                  TRACAD1A.698    
      J1 = 1                                                               ARB1F402.719    
      J2 = ROW_LENGTH-2                                                    ARB1F402.720    
*IF DEF,MPP                                                                ARB1F403.62     
          if (atleft) J1 = J1+EW_Halo                                      ARB1F403.63     
          if (atright) J2 = J2-EW_Halo                                     ARB1F403.64     
*ENDIF                                                                     ARB1F403.65     
CFPP$ NODEPCHK                                                             TRACAD1A.699    
      DO 270 J = START_POINT_NO_HALO,END_P_POINT_NO_HALO,ROW_LENGTH        ARB1F402.721    
        DO I = J1,J2                                                       ARB1F402.726    
          FIELD(J+I) = FIELD(J+I)+FIELD_INC(J+I)*SEC_P_LATITUDE(J+I)/      TRACAD1A.702    
     &                 RS_SQUARED_DELTAP(J+I)                              TRACAD1A.703    
        END DO                                                             TRACAD1A.704    
 270  CONTINUE                                                             TRACAD1A.705    
*ENDIF                                                                     TRACAD1A.706    
*IF DEF,MPP                                                                GSM6F404.7      
*ENDIF                                                                     GSM6F404.9      
CL    END OF ROUTINE TRAC_ADV                                              TRACAD1A.708    
                                                                           TRACAD1A.709    
      RETURN                                                               TRACAD1A.710    
      END                                                                  TRACAD1A.711    
*ENDIF                                                                     TRACAD1A.712