*IF DEF,A12_1C,OR,DEF,A12_1D                                               ATJ0F402.17     
*IF DEF,MPP                                                                ATJ0F402.18     
C *****************************COPYRIGHT******************************     ADVPGD1C.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    ADVPGD1C.4      
C                                                                          ADVPGD1C.5      
C Use, duplication or disclosure of this code is subject to the            ADVPGD1C.6      
C restrictions as set forth in the contract.                               ADVPGD1C.7      
C                                                                          ADVPGD1C.8      
C                Meteorological Office                                     ADVPGD1C.9      
C                London Road                                               ADVPGD1C.10     
C                BRACKNELL                                                 ADVPGD1C.11     
C                Berkshire UK                                              ADVPGD1C.12     
C                RG12 2SZ                                                  ADVPGD1C.13     
C                                                                          ADVPGD1C.14     
C If no contract has been raised with this copy of the code, the use,      ADVPGD1C.15     
C duplication or disclosure of it is strictly prohibited.  Permission      ADVPGD1C.16     
C to do so must first be obtained in writing from the Head of Numerical    ADVPGD1C.17     
C Modelling at the above address.                                          ADVPGD1C.18     
C ******************************COPYRIGHT******************************    ADVPGD1C.19     
CLL   SUBROUTINE ADV_P_GD -------------------------------------------      ADVPGD1C.20     
CLL                                                                        ADVPGD1C.21     
CLL   PURPOSE:   CALCULATES ADVECTION INCREMENTS TO A FIELD AT A           ADVPGD1C.22     
CLL              SINGLE MODEL LEVEL USING AN EQUATION OF THE FORM(36).     ADVPGD1C.23     
CLL              NOT SUITABLE FOR SINGLE COLUMN USE.                       ADVPGD1C.24     
CLL                                                                        ADVPGD1C.25     
CLL   VERSION FOR CRAY Y-MP                                                ADVPGD1C.26     
CLL                                                                        ADVPGD1C.27     
CLL   WRITTEN  BY M.H MAWSON.                                              ADVPGD1C.28     
CLL   MPP CODE ADDED BY P.BURTON                                           ADVPGD1C.29     
CLL                                                                        ADVPGD1C.30     
CLL  Model            Modification history from model version 3.0:         ADVPGD1C.31     
CLL version  Date                                                          ADVPGD1C.32     
CLL 4.1      29/11/95 New version of routine specifically for MPP          ADVPGD1C.33     
CLL                   Fourth order MPP code by Roar Skalin                 ADVPGD1C.34     
CLL                                                      P.Burton          ADVPGD1C.35     
!LL 4.2      10/01/97 Amend calculation to prevent different answers       ADR2F402.34     
!LL                   with different compiler options. D. Robinson.        ADR2F402.35     
!     4.3    22/04/97 Added optimised vector shift                         GSS2F403.1      
!                     B. Carruthers                                        GSS2F403.2      
C     vn4.3    Mar. 97   T3E migration : optimisation changes              GSS1F403.734    
C                                       D.Salmond                          GSS1F403.735    
CLL 4.5      31/03/98 Correct uninitialised value of U_TERM which can      ARR4F405.1      
CLL                   cause failures for LAM with 4th order advection.     ARR4F405.2      
CLL                   R. Rawlins.                                          ARR4F405.3      
CLL                                                                        ADVPGD1C.36     
CLL   PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4,       ADVPGD1C.37     
CLL                         STANDARD B. VERSION 2, DATED 18/01/90          ADVPGD1C.38     
CLL                                                                        ADVPGD1C.39     
CLL   LOGICAL COMPONENTS COVERED: P121                                     ADVPGD1C.40     
CLL                                                                        ADVPGD1C.41     
CLL   PROJECT TASK: P1                                                     ADVPGD1C.42     
CLL                                                                        ADVPGD1C.43     
CLL   DOCUMENTATION:       THE EQUATION USED IS (35)                       ADVPGD1C.44     
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10     ADVPGD1C.45     
CLL                        M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON           ADVPGD1C.46     
CLLEND-------------------------------------------------------------        ADVPGD1C.47     
C                                                                          ADVPGD1C.48     
C*L   ARGUMENTS:---------------------------------------------------        ADVPGD1C.49     

      SUBROUTINE ADV_P_GD                                                   34,6ADVPGD1C.50     
     1                   (FIELD_LOWER,FIELD,FIELD_UPPER,U,V,               ADVPGD1C.51     
     1                   ETADOT_LOWER,ETADOT_UPPER,                        ADVPGD1C.52     
     2                   SEC_P_LATITUDE,FIELD_INC,NUX,NUY,P_FIELD,         ADVPGD1C.53     
     3                   U_FIELD,ROW_LENGTH,                               ADVPGD1C.54     
*CALL ARGFLDPT                                                             ADVPGD1C.55     
     4                   ADVECTION_TIMESTEP,                               ADVPGD1C.56     
     5                   LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE,     ADVPGD1C.57     
     6                   SEC_U_LATITUDE,BRSP,                              ADVPGD1C.58     
     7                   L_SECOND,LWHITBROM,                               ADVPGD1C.59     
     &                   extended_FIELD,                                   ADVPGD1C.60     
     &                   extended_P_FIELD,extended_U_FIELD,                GSS1F403.736    
     &                   extended_address)                                 GSS1F403.737    
                                                                           ADVPGD1C.62     
      IMPLICIT NONE                                                        ADVPGD1C.63     
                                                                           ADVPGD1C.64     
      INTEGER                                                              ADVPGD1C.65     
     *  P_FIELD             !IN DIMENSION OF FIELDS ON PRESSSURE GRID.     ADVPGD1C.66     
     *, U_FIELD             !IN DIMENSION OF FIELDS ON VELOCITY GRID       ADVPGD1C.67     
     &, extended_P_FIELD    !IN DIMESNION of P fields with extra halo      ADVPGD1C.68     
     &, extended_U_FIELD    !IN DIMESNION of U fields with extra halo      ADVPGD1C.69     
     *, ROW_LENGTH          !IN NUMBER OF POINTS PER ROW                   ADVPGD1C.70     
                                                                           ADVPGD1C.71     
! All TYPFLDPT arguments are intent IN                                     ADVPGD1C.72     
*CALL TYPFLDPT                                                             ADVPGD1C.73     
                                                                           ADVPGD1C.74     
      LOGICAL                                                              ADVPGD1C.75     
     *  L_SECOND     ! SET TO TRUE IF NU_BASIC IS ZERO.                    ADVPGD1C.76     
     * ,LWHITBROM    ! SWITCH FOR WHITE & BROMLEY TERMS                    ADVPGD1C.77     
                                                                           ADVPGD1C.78     
      REAL                                                                 ADVPGD1C.79     
     * U(extended_U_FIELD)  !IN ADVECTING U FIELD, MASS-WEIGHTED.          ADVPGD1C.80     
     *,V(extended_U_FIELD)  !IN ADVECTING V FIELD, MASS-WEIGHTED.          ADVPGD1C.81     
     *,ETADOT_UPPER(P_FIELD)!IN ADVECTING VERTICAL VELOC AT K+1/2,         ADVPGD1C.82     
     *                      !   MASS-WEIGHTED.                             ADVPGD1C.83     
     *,ETADOT_LOWER(P_FIELD)!IN ADVECTING VERTICAL VELOC AT K-1/2,         ADVPGD1C.84     
     *                      !   MASS-WEIGHTED.                             ADVPGD1C.85     
     *,FIELD(P_FIELD)       !IN FIELD TO BE ADVECTED.                      ADVPGD1C.86     
     *,FIELD_UPPER(P_FIELD) !IN FIELD TO BE ADVECTED AT LEVEL + 1 .        ADVPGD1C.87     
     *,FIELD_LOWER(P_FIELD) !IN FIELD TO BE ADVECTED AT LEVEL - 1 .        ADVPGD1C.88     
     *,NUX(P_FIELD)   !IN HOLDS PARAMETER NU FOR EAST-WEST ADVECTION.      ADVPGD1C.89     
     *,NUY(P_FIELD)   !IN HOLDS PARAMETER NU FOR NORTH-SOUTH ADVECTION.    ADVPGD1C.90     
     *,SEC_P_LATITUDE(P_FIELD) !IN HOLDS 1/COS(PHI) AT P POINTS.           ADVPGD1C.91     
     *,SEC_U_LATITUDE(U_FIELD) !IN HOLDS 1/COS(PHI) AT U POINTS.           ADVPGD1C.92     
     *,ADVECTION_TIMESTEP   !IN                                            ADVPGD1C.93     
     *,LATITUDE_STEP_INVERSE  !IN 1/(DELTA PHI)                            ADVPGD1C.94     
     *,LONGITUDE_STEP_INVERSE !IN 1/(DELTA LAMDA)                          ADVPGD1C.95     
                                                                           ADVPGD1C.96     
      REAL                                                                 ADVPGD1C.97     
     * BRSP(P_FIELD)  !IN BRSP TERM AT LEVEL (SEE DOC.PAPER NO 10)         ADVPGD1C.98     
                                                                           ADVPGD1C.99     
      REAL                                                                 ADVPGD1C.100    
     * FIELD_INC(P_FIELD)   !OUT HOLDS INCREMENT TO FIELD.                 ADVPGD1C.101    
                                                                           ADVPGD1C.102    
      REAL                                                                 ADVPGD1C.103    
     & extended_FIELD(extended_P_FIELD) ! IN field to be advected with     ADVPGD1C.104    
  !                                     !    extra halos for 4th order     ADVPGD1C.105    
      INTEGER extended_address(P_FIELD)                                    GSS1F403.738    
C                                                                          ADVPGD1C.106    
                                                                           ADVPGD1C.107    
C*L   DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE-----------------    ADVPGD1C.108    
C DEFINE LOCAL ARRAYS: 3 ARE REQUIRED                                      ADVPGD1C.109    
                                                                           ADVPGD1C.110    
      REAL                                                                 ADVPGD1C.111    
     * WORK(P_FIELD)        ! GENERAL WORK-SPACE.                          ADVPGD1C.112    
     *,U_TERM(P_FIELD)      ! HOLDS U ADVECTION TERM FROM EQUATION (35)    ADVPGD1C.113    
     *,V_TERM(P_FIELD)      ! HOLDS V ADVECTION TERM FROM EQUATION (35)    ADVPGD1C.114    
C*---------------------------------------------------------------------    ADVPGD1C.115    
C DEFINE LOCAL VARIABLES                                                   ADVPGD1C.116    
                                                                           ADVPGD1C.117    
C REAL SCALARS                                                             ADVPGD1C.118    
      REAL                                                                 ADVPGD1C.119    
     * SCALAR1,SCALAR2                                                     ADVPGD1C.120    
                                                                           ADVPGD1C.121    
C COUNT VARIABLES FOR DO LOOPS ETC.                                        ADVPGD1C.122    
      INTEGER                                                              ADVPGD1C.123    
     *  I,IJ,IK,IL,IM,J                                                    ADVPGD1C.124    
                                                                           ADVPGD1C.125    
! Work space and scalars for the MPP Fourth Order Advection                ADVPGD1C.126    
       INTEGER  info,            ! return code from comms operations       ADVPGD1C.127    
     &          extended_index,  ! index for position in extended array    ADVPGD1C.128    
     &          extended_START_POINT_NO_HALO,                              ADVPGD1C.129    
!                                ! start position in extended array        ADVPGD1C.130    
     &          extended_END_P_POINT_NO_HALO,                              ADVPGD1C.131    
!                                ! end position in extended array          ADVPGD1C.132    
     &          extended_ROW_LENGTH    ! row length of extended array      ADVPGD1C.133    
*IF DEF,MPP,AND,DEF,T3E                                                    GSS2F403.3      
                                                                           GSS2F403.4      
*CALL AMAXSIZE                                                             GSS2F403.5      
*ENDIF                                                                     GSS2F403.6      
                                                                           ADVPGD1C.134    
      REAL                                                                 ADR2F402.36     
*IF DEF,MPP,AND,DEF,T3E                                                    GSS2F403.7      
     &          rot_work(row_length_max),     ! work space for rotated p   GSS2F403.8      
     &          rot_work_out(row_length_max), ! work space for rotated p   GSS2F403.9      
*ELSE                                                                      GSS2F403.10     
     &          rot_work(ROW_LENGTH), ! work space for rotated pole rows   ADVPGD1C.136    
*ENDIF                                                                     GSS2F403.11     
     &          extended_WORK(extended_P_FIELD)  ! extended work space     ADVPGD1C.137    
*IF DEF,MPP,AND,DEF,T3E                                                    GSS2F403.12     
      integer ipad1(32), ipad2(32)                                         GSS2F403.13     
c                                                                          GSS2F403.14     
      common/adv_p_gd_shmem/ ipad1, rot_work, ipad2                        GSS2F403.15     
c                                                                          GSS2F403.16     
*CALL PARVARS                                                              GSS2F403.17     
      integer g_start(maxproc), g_new_start, l_new_length,                 GSS2F403.18     
     2 l_iadd, current_length, l_rem_iadd, my_row_pe                       GSS2F403.19     
*ENDIF                                                                     GSS2F403.20     
                                                                           ADVPGD1C.138    
                                                                           ADVPGD1C.142    
C*L   NO EXTERNAL SUBROUTINE CALLS:------------------------------------    ADVPGD1C.143    
C*---------------------------------------------------------------------    ADVPGD1C.144    
                                                                           ADVPGD1C.145    
CL    MAXIMUM VECTOR LENGTH ASSUMED IS                                     ADVPGD1C.146    
CL    END_P_POINT_NO_HALO-START_POINT_NO_HALO+1                            ADVPGD1C.147    
CL---------------------------------------------------------------------    ADVPGD1C.148    
                                                                           ADVPGD1C.149    
      IF (.NOT. L_SECOND) THEN                                             ADVPGD1C.150    
! Calculate indexes in extended_arrays                                     ADVPGD1C.151    
                                                                           ADVPGD1C.152    
      extended_ROW_LENGTH=ROW_LENGTH+2*extra_EW_Halo                       ADVPGD1C.154    
                                                                           ADVPGD1C.170    
        extended_START_POINT_NO_HALO=                                      ADVPGD1C.171    
     &    extended_address(START_POINT_NO_HALO)                            ADVPGD1C.172    
                                                                           ADVPGD1C.173    
        extended_END_P_POINT_NO_HALO=                                      ADVPGD1C.174    
     &    extended_address(END_P_POINT_NO_HALO)                            ADVPGD1C.175    
                                                                           ADVPGD1C.176    
      ENDIF                                                                ADVPGD1C.177    
CL                                                                         ADVPGD1C.178    
CL---------------------------------------------------------------------    ADVPGD1C.179    
CL    SECTION 1.     CALCULATE U_TERM IN EQUATION (35).                    ADVPGD1C.180    
CL---------------------------------------------------------------------    ADVPGD1C.181    
                                                                           ADVPGD1C.182    
C----------------------------------------------------------------------    ADVPGD1C.183    
CL    SECTION 1.1    CALCULATE TERM U D(FIELD)/D(LAMDA).                   ADVPGD1C.184    
C----------------------------------------------------------------------    ADVPGD1C.185    
                                                                           ADVPGD1C.186    
C CALCULATE TERM AT ALL POINTS EXCEPT LAST AND STORE IN WORK.              ADVPGD1C.187    
                                                                           ADVPGD1C.188    
      IF (L_SECOND) THEN                                                   ADVPGD1C.189    
! Loop over field missing top and bottom rows and halos and last point     ADVPGD1C.190    
        DO 110 I=START_POINT_NO_HALO,END_P_POINT_NO_HALO-1                 ADVPGD1C.191    
          WORK(I) = .5*(U(I)+U(I-ROW_LENGTH))*LONGITUDE_STEP_INVERSE*      ADVPGD1C.192    
     *               (FIELD(I+1) - FIELD(I))                               ADVPGD1C.193    
 110    CONTINUE                                                           ADVPGD1C.194    
                                                                           ADVPGD1C.195    
*IF DEF,GLOBAL                                                             ADVPGD1C.196    
        WORK(END_P_POINT_NO_HALO)=WORK(END_P_POINT_NO_HALO-1)              ADVPGD1C.197    
*ENDIF                                                                     ADVPGD1C.198    
                                                                           ADVPGD1C.199    
      ELSE ! fourth order                                                  ADVPGD1C.200    
! Loop over extended field, missing top and bottom rows and halos rows     ADVPGD1C.201    
        DO I=extended_START_POINT_NO_HALO-1,                               ADVPGD1C.202    
     &       extended_END_P_POINT_NO_HALO+1                                ADVPGD1C.203    
          extended_WORK(I)=0.5*(U(I)+U(I-extended_ROW_LENGTH))*            ADVPGD1C.204    
     &                     LONGITUDE_STEP_INVERSE*                         ADVPGD1C.205    
     &                     (extended_FIELD(I+1)-extended_FIELD(I))         ADVPGD1C.206    
        ENDDO                                                              ADVPGD1C.207    
                                                                           ADVPGD1C.208    
      ENDIF ! IF (L_SECOND)                                                ADVPGD1C.209    
                                                                           ADVPGD1C.210    
                                                                           ADVPGD1C.211    
C----------------------------------------------------------------------    ADVPGD1C.212    
CL    SECTION 1.2    CALCULATE U ADVECTION TERM IN EQUATION (35).          ADVPGD1C.213    
CL                   IF L_SECOND = TRUE PERFORM SECOND ORDER ADVECTION     ADVPGD1C.214    
CL                   ONLY.                                                 ADVPGD1C.215    
C----------------------------------------------------------------------    ADVPGD1C.216    
                                                                           ADVPGD1C.217    
      IF(L_SECOND) THEN                                                    ADVPGD1C.218    
*IF DEF,GLOBAL                                                             ADVPGD1C.219    
C LOOP OVER ALL POINTS.                                                    ADVPGD1C.220    
                                                                           ADVPGD1C.221    
! Loop over field, missing top and bottom rows and halos, and              ADVPGD1C.222    
! first point.                                                             ADVPGD1C.223    
        DO J=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO                     ADVPGD1C.224    
           U_TERM(J) = .5*(WORK(J)+WORK(J-1))                              ADVPGD1C.225    
        END DO                                                             ADVPGD1C.226    
                                                                           ADVPGD1C.227    
C CALCULATE  VALUES AT FIRST,SECOND AND LAST POINTS ON A ROW.              ADVPGD1C.228    
C WHERE FIRST LOOP CALCULATED THEM INCORRECTLY.                            ADVPGD1C.229    
                                                                           ADVPGD1C.230    
        U_TERM(START_POINT_NO_HALO)=U_TERM(START_POINT_NO_HALO+1)          ADVPGD1C.231    
! MPP Code : No need to do recalculations of end points because cyclic     ADVPGD1C.232    
! boundary conditions means that halos do this for us automatically        ADVPGD1C.233    
                                                                           ADVPGD1C.234    
*ELSE                                                                      ADVPGD1C.235    
C LIMITED AREA MODEL.                                                      ADVPGD1C.236    
                                                                           ADVPGD1C.237    
! Loop over field, missing top and bottom rows and halos, and              ADVPGD1C.238    
! first and last points.                                                   ADVPGD1C.239    
        DO J=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO-1                   ADVPGD1C.240    
          U_TERM(J) = .5*(WORK(J)+WORK(J-1))                               ADVPGD1C.241    
        END DO                                                             ADVPGD1C.242    
                                                                           ADVPGD1C.243    
C CORNER VALUES                                                            ADVPGD1C.244    
                                                                           ADVPGD1C.245    
        U_TERM(START_POINT_NO_HALO)=0.0                                    ADVPGD1C.246    
        U_TERM(END_P_POINT_NO_HALO)=0.0                                    ADVPGD1C.247    
                                                                           ADVPGD1C.248    
*ENDIF                                                                     ADVPGD1C.249    
      ELSE ! Fourth order                                                  ADVPGD1C.250    
                                                                           ADVPGD1C.251    
C LOOP OVER ALL POINTS.                                                    ADVPGD1C.252    
                                                                           ADVPGD1C.253    
! Loop over field, missing top and bottom rows and halos, and              ADVPGD1C.254    
! first point.                                                             ADVPGD1C.255    
        DO 120 J=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO                 ADVPGD1C.256    
          extended_index=extended_address(J)                               ADVPGD1C.257    
                                                                           ADVPGD1C.258    
          U_TERM(J) = (1.+NUX(J))*.5*(extended_WORK(extended_index)+       ADVPGD1C.259    
     &                                extended_WORK(extended_index-1))     ADVPGD1C.260    
     &                 -  NUX(J) *.5*(extended_WORK(extended_index+1)+     ADVPGD1C.261    
     &                                extended_WORK(extended_index-2))     ADVPGD1C.262    
 120    CONTINUE                                                           ADVPGD1C.263    
                                                                           ADVPGD1C.264    
*IF DEF,GLOBAL                                                             ADVPGD1C.265    
        U_TERM(START_POINT_NO_HALO)= U_TERM(START_POINT_NO_HALO+1)         ADVPGD1C.266    
                                                                           ADVPGD1C.267    
*ELSE                                                                      ADVPGD1C.268    
                                                                           ARR4F405.4      
! Initialise first value to avoid potential flop exception failure         ARR4F405.5      
                                                                           ARR4F405.6      
        U_TERM(START_POINT_NO_HALO)= 0.0                                   ARR4F405.7      
                                                                           ARR4F405.8      
                                                                           ADVPGD1C.269    
C CALCULATE  VALUES AT SECOND AND NEXT TO LAST POINTS ON A ROW.            ADVPGD1C.270    
C THESE VALUES ARE JUST SECOND ORDER.                                      ADVPGD1C.271    
                                                                           ADVPGD1C.272    
        IF (at_left_of_LPG) THEN                                           ADVPGD1C.273    
! Do second point along each row                                           ADVPGD1C.274    
          DO I=START_POINT_NO_HALO+FIRST_ROW_PT,END_P_POINT_NO_HALO,       ADVPGD1C.275    
     &         ROW_LENGTH                                                  ADVPGD1C.276    
            extended_index=extended_address(I)                             ADVPGD1C.277    
                                                                           ADVPGD1C.278    
            U_TERM(I)= 0.5*(extended_WORK(extended_index)+                 ADVPGD1C.279    
     &                      extended_WORK(extended_index-1))               ADVPGD1C.280    
          ENDDO                                                            ADVPGD1C.281    
        ENDIF                                                              ADVPGD1C.282    
                                                                           ADVPGD1C.283    
! Do penultimate point along each row                                      ADVPGD1C.284    
                                                                           ADVPGD1C.285    
        IF (at_right_of_LPG) THEN                                          ADVPGD1C.286    
          DO I=START_POINT_NO_HALO+LAST_ROW_PT-2,END_P_POINT_NO_HALO,      ADVPGD1C.287    
     &         ROW_LENGTH                                                  ADVPGD1C.288    
            extended_index=extended_address(I)                             ADVPGD1C.289    
                                                                           ADVPGD1C.290    
            U_TERM(I)= 0.5*(extended_WORK(extended_index)+                 ADVPGD1C.291    
     &                      extended_WORK(extended_index-1))               ADVPGD1C.292    
          ENDDO                                                            ADVPGD1C.293    
        ENDIF                                                              ADVPGD1C.294    
                                                                           ADVPGD1C.295    
*ENDIF                                                                     ADVPGD1C.296    
      END IF                                                               ADVPGD1C.297    
                                                                           ADVPGD1C.298    
CL                                                                         ADVPGD1C.299    
CL---------------------------------------------------------------------    ADVPGD1C.300    
CL    SECTION 2.     CALCULATE V_TERM IN EQUATION (35).                    ADVPGD1C.301    
CL---------------------------------------------------------------------    ADVPGD1C.302    
                                                                           ADVPGD1C.303    
C----------------------------------------------------------------------    ADVPGD1C.304    
CL    SECTION 2.1    CALCULATE TERM V D(FIELD)/D(PHI).                     ADVPGD1C.305    
C----------------------------------------------------------------------    ADVPGD1C.306    
                                                                           ADVPGD1C.307    
C CALCULATE TERM AT ALL POINTS EXCEPT FIRST AND STORE IN WORK.             ADVPGD1C.308    
                                                                           ADVPGD1C.309    
      IF (L_SECOND) THEN                                                   ADVPGD1C.310    
                                                                           ADVPGD1C.311    
! Loop over field, missing bottom row and top and bottom halos, and        ADVPGD1C.312    
! first point                                                              ADVPGD1C.313    
        DO 210 I=START_POINT_NO_HALO-ROW_LENGTH+1,END_P_POINT_NO_HALO      ADVPGD1C.314    
          WORK(I) = .5*(V(I)+V(I-1))*LATITUDE_STEP_INVERSE*                ADVPGD1C.315    
     *               (FIELD(I) - FIELD(I+ROW_LENGTH))                      ADVPGD1C.316    
 210    CONTINUE                                                           ADVPGD1C.317    
                                                                           ADVPGD1C.318    
*IF DEF,GLOBAL                                                             ADVPGD1C.319    
        WORK(START_POINT_NO_HALO-ROW_LENGTH)=                              ADVPGD1C.320    
     &    WORK(START_POINT_NO_HALO-ROW_LENGTH+1)                           ADVPGD1C.321    
*ENDIF                                                                     ADVPGD1C.322    
                                                                           ADVPGD1C.323    
      ELSE ! Fourth order                                                  ADVPGD1C.324    
! Calculate WORK at the Southern halo too. This is needed for the          ADVPGD1C.325    
! computation of the Southern row                                          ADVPGD1C.326    
                                                                           ADVPGD1C.327    
        DO I=extended_START_POINT_NO_HALO-2*extended_ROW_LENGTH,           ADVPGD1C.328    
     &       extended_END_P_POINT_NO_HALO+extended_ROW_LENGTH              ADVPGD1C.329    
          extended_WORK(I)=0.5*(V(I)+V(I-1))*LATITUDE_STEP_INVERSE*        ADVPGD1C.330    
     &      (extended_FIELD(I)-extended_FIELD(I+extended_ROW_LENGTH))      ADVPGD1C.331    
        ENDDO                                                              ADVPGD1C.332    
                                                                           ADVPGD1C.333    
      ENDIF ! L_SECOND                                                     ADVPGD1C.334    
                                                                           ADVPGD1C.335    
                                                                           ADVPGD1C.336    
C----------------------------------------------------------------------    ADVPGD1C.337    
CL    SECTION 2.2    CALCULATE V ADVECTION TERM IN EQUATION (35).          ADVPGD1C.338    
CL                   IF L_SECOND = TRUE PERFORM SECOND ORDER ADVECTION     ADVPGD1C.339    
CL                   ONLY.                                                 ADVPGD1C.340    
C----------------------------------------------------------------------    ADVPGD1C.341    
                                                                           ADVPGD1C.342    
      IF(L_SECOND) THEN                                                    ADVPGD1C.343    
*IF DEF,GLOBAL                                                             ADVPGD1C.344    
C GLOBAL MODEL.                                                            ADVPGD1C.345    
C CALCULATE ALL VALUES EXCEPT ON ROWS NEXT TO POLES.                       ADVPGD1C.346    
                                                                           ADVPGD1C.347    
! Loop over field, missing top and bottom rows and halos                   ADVPGD1C.348    
        DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                       ADVPGD1C.349    
          V_TERM(I) = .5*(WORK(I-ROW_LENGTH)+WORK(I))                      ADVPGD1C.350    
        END DO                                                             ADVPGD1C.351    
                                                                           ADVPGD1C.352    
C CALCULATE VALUES ON SLICES NEXT TO POLES.                                ADVPGD1C.353    
                                                                           ADVPGD1C.354    
        IF (at_top_of_LPG) THEN                                            ADVPGD1C.355    
          DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                    ADVPGD1C.356    
            V_TERM(I)=WORK(I)*0.5                                          ADVPGD1C.357    
          ENDDO                                                            ADVPGD1C.358    
        ENDIF                                                              ADVPGD1C.359    
                                                                           ADVPGD1C.360    
        IF (at_base_of_LPG) THEN                                           ADVPGD1C.361    
          DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                ADVPGD1C.362    
            V_TERM(I)=WORK(I-ROW_LENGTH)*0.5                               ADVPGD1C.363    
          ENDDO                                                            ADVPGD1C.364    
        ENDIF                                                              ADVPGD1C.365    
                                                                           ADVPGD1C.366    
                                                                           ADVPGD1C.367    
*ELSE                                                                      ADVPGD1C.368    
C LIMITED AREA MODEL.                                                      ADVPGD1C.369    
                                                                           ADVPGD1C.370    
! Loop over field, missing top and bottom rows and halos, and              ADVPGD1C.371    
! first and last points.                                                   ADVPGD1C.372    
        DO I=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO-1                   ADVPGD1C.373    
          V_TERM(I) = .5*(WORK(I-ROW_LENGTH)+WORK(I))                      ADVPGD1C.374    
        END DO                                                             ADVPGD1C.375    
                                                                           ADVPGD1C.376    
        V_TERM(START_POINT_NO_HALO) = 0.0                                  ADVPGD1C.377    
        V_TERM(END_P_POINT_NO_HALO) = 0.0                                  ADVPGD1C.378    
                                                                           ADVPGD1C.379    
*ENDIF                                                                     ADVPGD1C.380    
      ELSE                                                                 ADVPGD1C.381    
*IF DEF,GLOBAL                                                             ADVPGD1C.382    
C GLOBAL MODEL.                                                            ADVPGD1C.383    
! Calculate all values except on rows next to poles and next to the        ADVPGD1C.384    
! processor interfaces                                                     ADVPGD1C.385    
                                                                           ADVPGD1C.386    
        DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                       ADVPGD1C.387    
          extended_index=extended_address(I)                               ADVPGD1C.388    
                                                                           ADVPGD1C.389    
          V_TERM(I) = (1.0+NUY(I))*0.5*                                    ADVPGD1C.390    
     &     (extended_WORK(extended_index-extended_ROW_LENGTH)              ADVPGD1C.391    
     &    + extended_WORK(extended_index))                                 ADVPGD1C.392    
     &                   - NUY(I) *0.5*                                    ADVPGD1C.393    
     &     (extended_WORK(extended_index+extended_ROW_LENGTH)              ADVPGD1C.394    
     &    + extended_WORK(extended_index-2*extended_ROW_LENGTH))           ADVPGD1C.395    
        ENDDO                                                              ADVPGD1C.396    
*IF DEF,MPP,AND,DEF,T3E                                                    GSS2F403.21     
c                                                                          GSS2F403.22     
c--for MPP Code, check that we have enough processors                      GSS2F403.23     
        if(nproc_x.eq.1 .or. nproc_y.eq.1) then                            GSS2F403.24     
*ENDIF                                                                     GSS2F403.25     
                                                                           ADVPGD1C.397    
        IF (at_top_of_LPG) THEN                                            ADVPGD1C.398    
! North Pole Rows                                                          ADVPGD1C.399    
! We want to advect across the pole - which requires us to know the        ADVPGD1C.400    
! values on the opposite side of the pole. To do this we rotate the        ADVPGD1C.401    
! polar row by half a row in a work array - so each point in the           ADVPGD1C.402    
! original array matches its opposite point in the rotated array           ADVPGD1C.403    
                                                                           ADVPGD1C.404    
          DO I=1,ROW_LENGTH                                                ADVPGD1C.405    
!            rot_work(I)=extended_WORK(halo_4th*extended_ROW_LENGTH+I+1)   ADVPGD1C.406    
            rot_work(I)=                                                   ADVPGD1C.407    
     &        extended_WORK(extended_address(TOP_ROW_START+I-1))           ADVPGD1C.408    
          ENDDO                                                            ADVPGD1C.409    
                                                                           ADVPGD1C.410    
          CALL GCG_RVECSHIFT(ROW_LENGTH,ROW_LENGTH-2*EW_Halo,              ADVPGD1C.411    
     &                       halo_4th,1,                                   ADVPGD1C.412    
     &                       GLOBAL_ROW_LENGTH/2,.TRUE.,rot_work,          ADVPGD1C.413    
     &                       GC_ROW_GROUP,info)                            ADVPGD1C.414    
                                                                           ADVPGD1C.415    
          DO I=1,ROW_LENGTH                                                ADVPGD1C.416    
            IK=START_POINT_NO_HALO-1+I ! point in row beneath polar row    ADVPGD1C.417    
            extended_index=extended_address(IK)                            ADVPGD1C.418    
!            extended_index=(Offy+2)*extended_ROW_LENGTH +I+1              ADVPGD1C.419    
!                                    ! same point in extended field        ADVPGD1C.420    
                                                                           ADVPGD1C.421    
! Calculate V_TERM in row beneath polar row                                ADVPGD1C.422    
            V_TERM(IK)= (1.0+NUY(IK))*0.5*                                 ADVPGD1C.423    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1C.424    
     &       + extended_WORK(extended_index))                              ADVPGD1C.425    
     &                     - NUY(IK) *0.5*                                 ADVPGD1C.426    
     &        (extended_WORK(extended_index+extended_ROW_LENGTH)           ADVPGD1C.427    
     &       + rot_work(I))                                                ADVPGD1C.428    
                                                                           ADVPGD1C.429    
! Calculate V_TERM in polar row                                            ADVPGD1C.430    
            V_TERM(IK-ROW_LENGTH) = (1.0+NUY(IK))*0.5*                     ADVPGD1C.431    
     &         extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1C.432    
     &      - NUY(IK)*0.5*extended_WORK(extended_index)                    ADVPGD1C.433    
                                                                           ADVPGD1C.434    
          ENDDO                                                            ADVPGD1C.435    
                                                                           ADVPGD1C.436    
        ENDIF ! (attop)                                                    ADVPGD1C.437    
                                                                           ADVPGD1C.438    
        IF (at_base_of_LPG) THEN                                           ADVPGD1C.439    
! South Pole Rows : similar code to that for North Pole                    ADVPGD1C.440    
                                                                           ADVPGD1C.441    
          DO I=1,ROW_LENGTH                                                ADVPGD1C.442    
            extended_index=                                                ADVPGD1C.443    
     &        extended_address(P_BOT_ROW_START-ROW_LENGTH+I-1)             ADVPGD1C.444    
!            extended_index=extended_P_FIELD-                              ADVPGD1C.445    
!     &                      (Offy+3)*extended_ROW_LENGTH +I+1             ADVPGD1C.446    
            rot_work(I)=extended_WORK(extended_index)                      ADVPGD1C.447    
          ENDDO                                                            ADVPGD1C.448    
                                                                           ADVPGD1C.449    
          CALL GCG_RVECSHIFT(ROW_LENGTH,ROW_LENGTH-2*EW_Halo,              ADVPGD1C.450    
     &                       halo_4th,1,                                   ADVPGD1C.451    
     &                       GLOBAL_ROW_LENGTH/2,.TRUE.,rot_work,          ADVPGD1C.452    
     &                       GC_ROW_GROUP,info)                            ADVPGD1C.453    
                                                                           ADVPGD1C.454    
          DO I=1,ROW_LENGTH                                                ADVPGD1C.455    
            IJ=END_P_POINT_NO_HALO-ROW_LENGTH+I ! row above South Pole     ADVPGD1C.456    
            extended_index=extended_address(IJ)                            ADVPGD1C.457    
!            IJ=P_FIELD-(Offy+2)*ROW_LENGTH+I ! row above South Pole       ADVPGD1C.458    
!            extended_index=extended_P_FIELD-                              ADVPGD1C.459    
!     &                       (Offy+3)*extended_ROW_LENGTH +I+1            ADVPGD1C.460    
                                                                           ADVPGD1C.461    
! Calculate V_TERM in row above polar row                                  ADVPGD1C.462    
            V_TERM(IJ)= (1.0+NUY(IJ))*0.5*                                 ADVPGD1C.463    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1C.464    
     &       + extended_WORK(extended_index))                              ADVPGD1C.465    
     &                     - NUY(IJ) *0.5*                                 ADVPGD1C.466    
     &        (rot_work(I)+                                                ADVPGD1C.467    
     &         extended_WORK(extended_index-2*extended_ROW_LENGTH))        ADVPGD1C.468    
                                                                           ADVPGD1C.469    
! Calculate V_TERM in polar row                                            ADVPGD1C.470    
            V_TERM(IJ+ROW_LENGTH) = (1.0+NUY(IJ))*0.5*                     ADVPGD1C.471    
     &         extended_WORK(extended_index) - NUY(IJ)*0.5*                ADVPGD1C.472    
     &         extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1C.473    
                                                                           ADVPGD1C.474    
          ENDDO                                                            ADVPGD1C.475    
                                                                           ADVPGD1C.476    
        ENDIF ! (atbase)                                                   ADVPGD1C.477    
*IF DEF,MPP,AND,DEF,T3E                                                    GSS2F403.26     
c                                                                          GSS2F403.27     
        else ! MPP/T3E and only 1 processor along either direction         GSS2F403.28     
c                                                                          GSS2F403.29     
        call barrier()                                                     GSS2F403.30     
c                                                                          GSS2F403.31     
        IF (at_top_of_LPG) THEN                                            GSS2F403.32     
! North Pole Rows                                                          GSS2F403.33     
                                                                           GSS2F403.34     
          DO I=1,ROW_LENGTH                                                GSS2F403.35     
!            rot_work(I)=extended_WORK(halo_4th*extended_ROW_LENGTH+I+1)   GSS2F403.36     
            rot_work(I)=                                                   GSS2F403.37     
     &        extended_WORK(extended_address(TOP_ROW_START+I-1))           GSS2F403.38     
          ENDDO                                                            GSS2F403.39     
        ENDIF ! (attop)                                                    GSS2F403.40     
                                                                           GSS2F403.41     
        IF (at_base_of_LPG) THEN                                           GSS2F403.42     
! South Pole Rows : similar code to that for North Pole                    GSS2F403.43     
                                                                           GSS2F403.44     
          DO I=1,ROW_LENGTH                                                GSS2F403.45     
            extended_index=                                                GSS2F403.46     
     &        extended_address(P_BOT_ROW_START-ROW_LENGTH+I-1)             GSS2F403.47     
!            extended_index=extended_P_FIELD-                              GSS2F403.48     
!     &                      (Offy+3)*extended_ROW_LENGTH +I+1             GSS2F403.49     
            rot_work(I)=extended_WORK(extended_index)                      GSS2F403.50     
          ENDDO                                                            GSS2F403.51     
        ENDIF ! (atbase)                                                   GSS2F403.52     
c                                                                          GSS2F403.53     
        call barrier()                                                     GSS2F403.54     
c                                                                          GSS2F403.55     
c--process North and South Rows together                                   GSS2F403.56     
        IF (at_top_of_LPG .or. at_base_of_LPG) THEN                        GSS2F403.57     
c--work out the PE at the start of my Row                                  GSS2F403.58     
          my_row_pe=(mype/nproc_x)*nproc_x                                 GSS2F403.59     
          g_start(1)=1                                                     GSS2F403.60     
c--find the global start addresses for PE's in my row                      GSS2F403.61     
          do i=2, nproc_x+1                                                GSS2F403.62     
            g_start(i)=g_start(i-1)+g_blsizep(1,i-2)                       GSS2F403.63     
          end do                                                           GSS2F403.64     
c          write(0,*) my_pe(), (g_start(i), i=1, nproc_x+1)                GSS2F403.65     
c                                                                          GSS2F403.66     
c--set the global start address for the start of my exchange               GSS2F403.67     
          g_new_start=g_start(mype-my_row_pe+1)+global_row_length/2        GSS2F403.68     
c--set the length of the data to exchange                                  GSS2F403.69     
          l_new_length=row_length-2*ew_halo                                GSS2F403.70     
c--set the start address                                                   GSS2F403.71     
          l_iadd=halo_4th                                                  GSS2F403.72     
c--loop until we have moved all the segments for this PE                   GSS2F403.73     
1000    continue                                                           GSS2F403.74     
c--check we not off the end                                                GSS2F403.75     
            if(g_new_start.gt.glsize(1)) g_new_start=                      GSS2F403.76     
     2       g_new_start-glsize(1)                                         GSS2F403.77     
c--loop over the PE's in a row                                             GSS2F403.78     
            do i=1, nproc_x                                                GSS2F403.79     
c--check if this glocal address is on the the current remote PE            GSS2F403.80     
              if(g_new_start.ge.g_start(i) .and.                           GSS2F403.81     
     2         g_new_start.lt.g_start(i+1)) then                           GSS2F403.82     
c--compute the new local address on the remote PE                          GSS2F403.83     
                l_rem_iadd=g_new_start-g_start(i)                          GSS2F403.84     
c--compute the number of words to move on this get                         GSS2F403.85     
                current_length=min(l_new_length,                           GSS2F403.86     
     2           g_start(i+1)-g_new_start)                                 GSS2F403.87     
c                write(0,*) my_pe(), ' fetch ', current_length,            GSS2F403.88     
c     2           ' from PE ',i-1, ' from ',l_rem_iadd+halo_4th,           GSS2F403.89     
c     3           ' to ', l_iadd                                           GSS2F403.90     
c--get the data                                                            GSS2F403.91     
                call shmem_get(rot_work_out(l_iadd),                       GSS2F403.92     
     2           rot_work(l_rem_iadd+halo_4th), current_length,            GSS2F403.93     
     3           my_row_pe+i-1)                                            GSS2F403.94     
                                                                           GSS2F403.95     
c--update the global address and local addresses and lengths               GSS2F403.96     
                g_new_start=g_new_start+current_length                     GSS2F403.97     
                l_iadd=l_iadd+current_length                               GSS2F403.98     
                l_new_length=l_new_length-current_length                   GSS2F403.99     
c--check if we have finished                                               GSS2F403.100    
                if(l_new_length.gt.0) goto 1000                            GSS2F403.101    
                goto 1100                                                  GSS2F403.102    
              endif                                                        GSS2F403.103    
            end do                                                         GSS2F403.104    
            write(0,*)'PE ', my_pe(), ' is Lost in ADV_P_GD ',             GSS2F403.105    
     2       l_new_length, current_length, l_rem_iadd+halo_4th, l_iadd,    GSS2F403.106    
     3       g_new_start, (g_start(i), i=1, nproc_x+1)                     GSS2F403.107    
            call abort('Lost in ADV_P_GD')                                 GSS2F403.108    
                                                                           GSS2F403.109    
1100        continue                                                       GSS2F403.110    
            rot_work_out(1)=rot_work(1)                                    GSS2F403.111    
            rot_work_out(row_length)=rot_work(row_length)                  GSS2F403.112    
c            write(0,*) my_pe(), (rot_work_out(i), i=1,                    GSS2F403.113    
c     2       row_length)                                                  GSS2F403.114    
                                                                           GSS2F403.115    
        ENDIF ! (at_top_of_LPG .or. at_base_of_LPG)                        GSS2F403.116    
c                                                                          GSS2F403.117    
        IF (at_top_of_LPG) THEN                                            GSS2F403.118    
! North Pole                                                               GSS2F403.119    
                                                                           GSS2F403.120    
          DO I=1,ROW_LENGTH                                                GSS2F403.121    
            IK=START_POINT_NO_HALO-1+I ! point in row beneath polar row    GSS2F403.122    
            extended_index=extended_address(IK)                            GSS2F403.123    
!            extended_index=(Offy+2)*extended_ROW_LENGTH +I+1              GSS2F403.124    
!                                    ! same point in extended field        GSS2F403.125    
                                                                           GSS2F403.126    
! Calculate V_TERM in row beneath polar row                                GSS2F403.127    
            V_TERM(IK)= (1.0+NUY(IK))*0.5*                                 GSS2F403.128    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           GSS2F403.129    
     &       + extended_WORK(extended_index))                              GSS2F403.130    
     &                     - NUY(IK) *0.5*                                 GSS2F403.131    
     &        (extended_WORK(extended_index+extended_ROW_LENGTH)           GSS2F403.132    
     &       + rot_work_out(I))                                            GSS2F403.133    
                                                                           GSS2F403.134    
! Calculate V_TERM in polar row                                            GSS2F403.135    
            V_TERM(IK-ROW_LENGTH) = (1.0+NUY(IK))*0.5*                     GSS2F403.136    
     &         extended_WORK(extended_index-extended_ROW_LENGTH)           GSS2F403.137    
     &      - NUY(IK)*0.5*extended_WORK(extended_index)                    GSS2F403.138    
                                                                           GSS2F403.139    
          ENDDO                                                            GSS2F403.140    
        ENDIF ! (IF at_top_of_LPG)                                         GSS2F403.141    
c                                                                          GSS2F403.142    
        IF (at_base_of_LPG) THEN                                           GSS2F403.143    
! South Pole                                                               GSS2F403.144    
                                                                           GSS2F403.145    
          DO I=1,ROW_LENGTH                                                GSS2F403.146    
            IJ=END_P_POINT_NO_HALO-ROW_LENGTH+I ! row above South Pole     GSS2F403.147    
            extended_index=extended_address(IJ)                            GSS2F403.148    
!            IJ=P_FIELD-(Offy+2)*ROW_LENGTH+I ! row above South Pole       GSS2F403.149    
!            extended_index=extended_P_FIELD-                              GSS2F403.150    
!     &                       (Offy+3)*extended_ROW_LENGTH +I+1            GSS2F403.151    
                                                                           GSS2F403.152    
! Calculate V_TERM in row above polar row                                  GSS2F403.153    
            V_TERM(IJ)= (1.0+NUY(IJ))*0.5*                                 GSS2F403.154    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           GSS2F403.155    
     &       + extended_WORK(extended_index))                              GSS2F403.156    
     &                     - NUY(IJ) *0.5*                                 GSS2F403.157    
     &       (rot_work_out(I)+                                             GSS2F403.158    
     &         extended_WORK(extended_index-2*extended_ROW_LENGTH))        GSS2F403.159    
                                                                           GSS2F403.160    
! Calculate V_TERM in polar row                                            GSS2F403.161    
            V_TERM(IJ+ROW_LENGTH) = (1.0+NUY(IJ))*0.5*                     GSS2F403.162    
     &         extended_WORK(extended_index) - NUY(IJ)*0.5*                GSS2F403.163    
     &         extended_WORK(extended_index-extended_ROW_LENGTH)           GSS2F403.164    
                                                                           GSS2F403.165    
          ENDDO                                                            GSS2F403.166    
        ENDIF ! (IF at_base_of_LPG)                                        GSS2F403.167    
c                                                                          GSS2F403.168    
        endif ! Code for more then one processor in each direction         GSS2F403.169    
c                                                                          GSS2F403.170    
*ENDIF                                                                     GSS2F403.171    
                                                                           ADVPGD1C.478    
*ELSE                                                                      ADVPGD1C.479    
C LIMITED AREA MODEL.                                                      ADVPGD1C.480    
! Calculate all values except on rows next to poles and next to the        ADVPGD1C.481    
! processor interfaces                                                     ADVPGD1C.482    
                                                                           ADVPGD1C.483    
! Loop over field, missing top and bottom rows and halos                   ADVPGD1C.484    
        DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                       ADVPGD1C.485    
          extended_index=extended_address(I)                               ADVPGD1C.486    
                                                                           ADVPGD1C.487    
          V_TERM(I) = (1.0+NUY(I))*0.5*                                    ADVPGD1C.488    
     &     (extended_WORK(extended_index-extended_ROW_LENGTH)              ADVPGD1C.489    
     &    + extended_WORK(extended_index))                                 ADVPGD1C.490    
     &                   - NUY(I) *0.5*                                    ADVPGD1C.491    
     &     (extended_WORK(extended_index+extended_ROW_LENGTH)              ADVPGD1C.492    
     &    + extended_WORK(extended_index-2*extended_ROW_LENGTH))           ADVPGD1C.493    
        ENDDO                                                              ADVPGD1C.494    
                                                                           ADVPGD1C.495    
                                                                           ADVPGD1C.496    
C CALCULATE VALUES ON SLICES NEXT TO BOUNDARIES AS SECOND ORDER.           ADVPGD1C.497    
                                                                           ADVPGD1C.498    
        IF (at_top_of_LPG) THEN                                            ADVPGD1C.499    
! Loop over row beneath top row, missing halos                             ADVPGD1C.500    
          DO I=START_POINT_NO_HALO+FIRST_ROW_PT-1,                         ADVPGD1C.501    
     &         START_POINT_NO_HALO+LAST_ROW_PT-1                           ADVPGD1C.502    
            extended_index=extended_address(I)                             ADVPGD1C.503    
                                                                           ADVPGD1C.504    
            V_TERM(I)=0.5*                                                 ADVPGD1C.505    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1C.506    
     &       + extended_WORK(extended_index))                              ADVPGD1C.507    
          ENDDO                                                            ADVPGD1C.508    
        ENDIF                                                              ADVPGD1C.509    
                                                                           ADVPGD1C.510    
        IF (at_base_of_LPG) THEN                                           ADVPGD1C.511    
! Loop over row above bottom row, missing halos                            ADVPGD1C.512    
          DO I=END_P_POINT_NO_HALO-ROW_LENGTH+FIRST_ROW_PT,                ADVPGD1C.513    
     &         END_P_POINT_NO_HALO-ROW_LENGTH+LAST_ROW_PT                  ADVPGD1C.514    
            extended_index=extended_address(I)                             ADVPGD1C.515    
            V_TERM(I)=0.5*                                                 ADVPGD1C.516    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1C.517    
     &       + extended_WORK(extended_index))                              ADVPGD1C.518    
          ENDDO                                                            ADVPGD1C.519    
        ENDIF                                                              ADVPGD1C.520    
                                                                           ADVPGD1C.521    
*ENDIF                                                                     ADVPGD1C.522    
      END IF                                                               ADVPGD1C.523    
                                                                           ADVPGD1C.524    
CL                                                                         ADVPGD1C.525    
CL---------------------------------------------------------------------    ADVPGD1C.526    
CL    SECTION 3.     CALCULATE VERTICAL FLUX AND COMBINE WITH U AND V      ADVPGD1C.527    
CL                   TERMS TO FORM INCREMENT.                              ADVPGD1C.528    
CL---------------------------------------------------------------------    ADVPGD1C.529    
                                                                           ADVPGD1C.530    
CL    VERTICAL FLUX ON INPUT IS .5*TIMESTEP*ETADOT*D(FIELD)/D(ETA)         ADVPGD1C.531    
CL    AT LEVEL K-1/2. AT THE END OF THIS SECTION IT IS THE SAME            ADVPGD1C.532    
CL    QUANTITY BUT AT LEVEL K+1/2.                                         ADVPGD1C.533    
                                                                           ADVPGD1C.534    
! Loop over field, missing top and bottom rows and halos                   ADVPGD1C.535    
      DO 300 I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                     ADVPGD1C.536    
        SCALAR1 = .5 * ADVECTION_TIMESTEP *                                ADVPGD1C.537    
     *         ETADOT_UPPER(I) * (FIELD_UPPER(I) - FIELD(I))               ADVPGD1C.538    
        SCALAR2 = .5 * ADVECTION_TIMESTEP *                                ADVPGD1C.539    
     *         ETADOT_LOWER(I) * (FIELD(I) - FIELD_LOWER(I))               ADVPGD1C.540    
        FIELD_INC(I) = ADVECTION_TIMESTEP * SEC_P_LATITUDE(I) *            ADVPGD1C.541    
     *                  (U_TERM(I)+V_TERM(I))                              ADVPGD1C.542    
     &                   + SCALAR1+SCALAR2                                 ADVPGD1C.543    
      IF (LWHITBROM) THEN                                                  ADVPGD1C.544    
        FIELD_INC(I) = FIELD_INC(I)                                        ADVPGD1C.545    
     *                  + FIELD(I)*BRSP(I)                                 ADVPGD1C.546    
      END IF                                                               ADVPGD1C.547    
 300  CONTINUE                                                             ADVPGD1C.548    
                                                                           ADVPGD1C.549    
*IF DEF,GLOBAL                                                             ADVPGD1C.550    
      IF (at_top_of_LPG) THEN                                              ADVPGD1C.551    
! North Pole Flux                                                          ADVPGD1C.552    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      ADVPGD1C.553    
          SCALAR1 = 0.5 * ADVECTION_TIMESTEP *                             ADVPGD1C.554    
     &              ETADOT_UPPER(I) * (FIELD_UPPER(I) - FIELD(I))          ADVPGD1C.555    
          SCALAR2 = 0.5 * ADVECTION_TIMESTEP *                             ADVPGD1C.556    
     &              ETADOT_LOWER(I) * (FIELD(I) - FIELD_LOWER(I))          ADVPGD1C.557    
          FIELD_INC(I) = ADVECTION_TIMESTEP * SEC_P_LATITUDE(I) *          ADVPGD1C.558    
     &                   V_TERM(I) + SCALAR1 + SCALAR2                     ADVPGD1C.559    
                                                                           ADVPGD1C.560    
          IF (LWHITBROM) FIELD_INC(I) = FIELD_INC(I)+FIELD(I)*BRSP(I)      ADVPGD1C.561    
        ENDDO                                                              ADVPGD1C.562    
      ENDIF ! (attop)                                                      ADVPGD1C.563    
                                                                           ADVPGD1C.564    
      IF (at_base_of_LPG) THEN                                             ADVPGD1C.565    
! South Pole Flux                                                          ADVPGD1C.566    
        DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                  ADVPGD1C.567    
          SCALAR1 = 0.5 * ADVECTION_TIMESTEP *                             ADVPGD1C.568    
     &              ETADOT_UPPER(I) * (FIELD_UPPER(I) - FIELD(I))          ADVPGD1C.569    
          SCALAR2 = .5 * ADVECTION_TIMESTEP *                              ADVPGD1C.570    
     &              ETADOT_LOWER(I) * (FIELD(I) - FIELD_LOWER(I))          ADVPGD1C.571    
          FIELD_INC(I) = ADVECTION_TIMESTEP * SEC_P_LATITUDE(I) *          ADVPGD1C.572    
     &                   V_TERM(I) + SCALAR1 + SCALAR2                     ADVPGD1C.573    
                                                                           ADVPGD1C.574    
          IF (LWHITBROM) FIELD_INC(I) = FIELD_INC(I)+FIELD(I)*BRSP(I)      ADVPGD1C.575    
        ENDDO                                                              ADVPGD1C.576    
      ENDIF ! (atbase)                                                     ADVPGD1C.577    
                                                                           ADVPGD1C.578    
*ELSE                                                                      ADVPGD1C.579    
                                                                           ADVPGD1C.580    
CL   LIMITED AREA MODEL SET BOUNDARY INCREMENTS                            ADVPGD1C.581    
CL   TO ZERO.                                                              ADVPGD1C.582    
                                                                           ADVPGD1C.583    
       IF (at_left_of_LPG) THEN                                            ADVPGD1C.584    
          DO I=START_POINT_NO_HALO+FIRST_ROW_PT-1,                         ADVPGD1C.585    
     &         END_P_POINT_NO_HALO,ROW_LENGTH                              ADVPGD1C.586    
            FIELD_INC(I)=0.                                                ADVPGD1C.587    
          ENDDO                                                            ADVPGD1C.588    
        ENDIF                                                              ADVPGD1C.589    
                                                                           ADVPGD1C.590    
        IF (at_right_of_LPG) THEN                                          ADVPGD1C.591    
          DO I=START_POINT_NO_HALO+LAST_ROW_PT-1,                          ADVPGD1C.592    
     &         END_P_POINT_NO_HALO,ROW_LENGTH                              ADVPGD1C.593    
            FIELD_INC(I)=0.                                                ADVPGD1C.594    
          ENDDO                                                            ADVPGD1C.595    
        ENDIF                                                              ADVPGD1C.596    
                                                                           ADVPGD1C.597    
*ENDIF                                                                     ADVPGD1C.598    
                                                                           ADVPGD1C.599    
CL    END OF ROUTINE ADV_P_GD                                              ADVPGD1C.600    
                                                                           ADVPGD1C.601    
      RETURN                                                               ADVPGD1C.602    
      END                                                                  ADVPGD1C.603    
*ENDIF                                                                     ATJ0F402.19     
*ENDIF                                                                     ADVPGD1C.604