*IF DEF,A12_1E                                                             ADVPGD1E.2      
*IF DEF,MPP                                                                ADVPGD1E.3      
C *****************************COPYRIGHT******************************     ADVPGD1E.4      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    ADVPGD1E.5      
C                                                                          ADVPGD1E.6      
C Use, duplication or disclosure of this code is subject to the            ADVPGD1E.7      
C restrictions as set forth in the contract.                               ADVPGD1E.8      
C                                                                          ADVPGD1E.9      
C                Meteorological Office                                     ADVPGD1E.10     
C                London Road                                               ADVPGD1E.11     
C                BRACKNELL                                                 ADVPGD1E.12     
C                Berkshire UK                                              ADVPGD1E.13     
C                RG12 2SZ                                                  ADVPGD1E.14     
C                                                                          ADVPGD1E.15     
C If no contract has been raised with this copy of the code, the use,      ADVPGD1E.16     
C duplication or disclosure of it is strictly prohibited.  Permission      ADVPGD1E.17     
C to do so must first be obtained in writing from the Head of Numerical    ADVPGD1E.18     
C Modelling at the above address.                                          ADVPGD1E.19     
C ******************************COPYRIGHT******************************    ADVPGD1E.20     
CLL   SUBROUTINE ADV_P_GD -------------------------------------------      ADVPGD1E.21     
CLL                                                                        ADVPGD1E.22     
CLL   PURPOSE:   CALCULATES ADVECTION INCREMENTS TO A FIELD AT A           ADVPGD1E.23     
CLL              SINGLE MODEL LEVEL USING AN EQUATION OF THE FORM(36).     ADVPGD1E.24     
CLL              NOT SUITABLE FOR SINGLE COLUMN USE.                       ADVPGD1E.25     
CLL                                                                        ADVPGD1E.26     
CLL   WAS VERSION FOR CRAY Y-MP                                            ADVPGD1E.27     
CLL                                                                        ADVPGD1E.28     
CLL   WRITTEN  BY M.H MAWSON.                                              ADVPGD1E.29     
CLL   MPP CODE ADDED BY P.BURTON                                           ADVPGD1E.30     
CLL                                                                        ADVPGD1E.31     
CLL  Model            Modification history:                                ADVPGD1E.32     
CLL version  Date                                                          ADVPGD1E.33     
!LL   4.4   11/08/97  New version optimised for T3E.                       ADVPGD1E.34     
!LL                   Not bit-reproducible with ADVPGD1C.                  ADVPGD1E.35     
CLL    4.4   04/08/97 Optimisation for T3E   D.Salmond                     ADVPGD1E.36     
CLL    4.5   31/03/98 Correct uninitialised value of U_TERM which can      ARR4F405.9      
CLL                   cause failures for LAM with 4th order advection.     ARR4F405.10     
CLL                   R. Rawlins.                                          ARR4F405.11     
CLL                                                                        ADVPGD1E.37     
CLL    4.5   29/4/98   T3E Optimisation for MES D.Salmond                  APB3F405.1      
CLL                                                                        APB3F405.2      
CLL   PROGRAMMING STANDARD:                                                ADVPGD1E.38     
CLL                                                                        ADVPGD1E.39     
CLL   LOGICAL COMPONENTS COVERED: P121                                     ADVPGD1E.40     
CLL                                                                        ADVPGD1E.41     
CLL   PROJECT TASK: P1                                                     ADVPGD1E.42     
CLL                                                                        ADVPGD1E.43     
CLL   DOCUMENTATION:       THE EQUATION USED IS (35)                       ADVPGD1E.44     
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10     ADVPGD1E.45     
CLL                        M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON           ADVPGD1E.46     
CLLEND-------------------------------------------------------------        ADVPGD1E.47     
C                                                                          ADVPGD1E.48     
C*L   ARGUMENTS:---------------------------------------------------        ADVPGD1E.49     

      SUBROUTINE ADV_P_GD                                                   34,6ADVPGD1E.50     
     1                   (P_LEVELS,FIELD,U,V,                              ADVPGD1E.51     
     1                   ETADOT,                                           ADVPGD1E.52     
     2                   SEC_P_LATITUDE,FIELD_INC,NUX,NUY,P_FIELD,         ADVPGD1E.53     
     3                   U_FIELD,ROW_LENGTH,                               ADVPGD1E.54     
*CALL ARGFLDPT                                                             ADVPGD1E.55     
     4                   ADVECTION_TIMESTEP,                               ADVPGD1E.56     
     5                   LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE,     ADVPGD1E.57     
     6                   SEC_U_LATITUDE,BRSP,                              ADVPGD1E.58     
     7                   L_SECOND,LWHITBROM,                               ADVPGD1E.59     
     &                   extended_FIELD,                                   ADVPGD1E.60     
     &                   extended_P_FIELD,extended_U_FIELD,                ADVPGD1E.61     
     &                   extended_address)                                 ADVPGD1E.62     
                                                                           ADVPGD1E.63     
      IMPLICIT NONE                                                        ADVPGD1E.64     
                                                                           ADVPGD1E.65     
      INTEGER                                                              ADVPGD1E.66     
     *  P_LEVELS                                                           ADVPGD1E.67     
     *, P_FIELD             !IN DIMENSION OF FIELDS ON PRESSSURE GRID.     ADVPGD1E.68     
     *, U_FIELD             !IN DIMENSION OF FIELDS ON VELOCITY GRID       ADVPGD1E.69     
     &, extended_P_FIELD    !IN DIMESNION of P fields with extra halo      ADVPGD1E.70     
     &, extended_U_FIELD    !IN DIMESNION of U fields with extra halo      ADVPGD1E.71     
     *, ROW_LENGTH          !IN NUMBER OF POINTS PER ROW                   ADVPGD1E.72     
                                                                           ADVPGD1E.73     
! All TYPFLDPT arguments are intent IN                                     ADVPGD1E.74     
*CALL TYPFLDPT                                                             ADVPGD1E.75     
                                                                           ADVPGD1E.76     
      LOGICAL                                                              ADVPGD1E.77     
     *  L_SECOND     ! SET TO TRUE IF NU_BASIC IS ZERO.                    ADVPGD1E.78     
     * ,LWHITBROM    ! SWITCH FOR WHITE & BROMLEY TERMS                    ADVPGD1E.79     
                                                                           ADVPGD1E.80     
      REAL                                                                 ADVPGD1E.81     
     * U(extended_U_FIELD,P_LEVELS)                                        ADVPGD1E.82     
!               !IN ADVECTING U FIELD, MASS-WEIGHTED.                      ADVPGD1E.83     
     *,V(extended_U_FIELD,P_LEVELS)                                        ADVPGD1E.84     
!               !IN ADVECTING V FIELD, MASS-WEIGHTED.                      ADVPGD1E.85     
     *,ETADOT(P_FIELD,P_LEVELS)!IN ADVECTING VERTICAL VELOC AT K+1/2,      ADVPGD1E.86     
     *                      !   MASS-WEIGHTED.                             ADVPGD1E.87     
     *,FIELD(P_FIELD,P_LEVELS)       !IN FIELD TO BE ADVECTED.             ADVPGD1E.88     
     *,NUX(P_FIELD,P_LEVELS)                                               ADVPGD1E.89     
!               !IN HOLDS PARAMETER NU FOR EAST-WEST ADVECTION.            ADVPGD1E.90     
     *,NUY(P_FIELD,P_LEVELS)                                               ADVPGD1E.91     
!               !IN HOLDS PARAMETER NU FOR NORTH-SOUTH ADVECTION.          ADVPGD1E.92     
     *,SEC_P_LATITUDE(P_FIELD) !IN HOLDS 1/COS(PHI) AT P POINTS.           ADVPGD1E.93     
     *,SEC_U_LATITUDE(U_FIELD) !IN HOLDS 1/COS(PHI) AT U POINTS.           ADVPGD1E.94     
     *,ADVECTION_TIMESTEP   !IN                                            ADVPGD1E.95     
     *,LATITUDE_STEP_INVERSE  !IN 1/(DELTA PHI)                            ADVPGD1E.96     
     *,LONGITUDE_STEP_INVERSE !IN 1/(DELTA LAMDA)                          ADVPGD1E.97     
                                                                           ADVPGD1E.98     
      REAL                                                                 ADVPGD1E.99     
     * BRSP(P_FIELD,P_LEVELS)                                              ADVPGD1E.100    
!               !IN BRSP TERM AT LEVEL (SEE DOC.PAPER NO 10)               ADVPGD1E.101    
                                                                           ADVPGD1E.102    
      REAL                                                                 ADVPGD1E.103    
     * FIELD_INC(P_FIELD,P_LEVELS)   !OUT HOLDS INCREMENT TO FIELD.        ADVPGD1E.104    
                                                                           ADVPGD1E.105    
      REAL                                                                 ADVPGD1E.106    
     & extended_FIELD(extended_P_FIELD,P_LEVELS)                           ADVPGD1E.107    
!                     ! IN field to be advected with                       ADVPGD1E.108    
!                     !    extra halos for 4th order                       ADVPGD1E.109    
      INTEGER extended_address(P_FIELD)                                    ADVPGD1E.110    
C                                                                          ADVPGD1E.111    
                                                                           ADVPGD1E.112    
C*L   DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE-----------------    ADVPGD1E.113    
C DEFINE LOCAL ARRAYS: 3 ARE REQUIRED                                      ADVPGD1E.114    
                                                                           ADVPGD1E.115    
      REAL                                                                 ADVPGD1E.116    
     * WORK(P_FIELD)        ! GENERAL WORK-SPACE.                          ADVPGD1E.117    
     *,U_TERM(P_FIELD)      ! HOLDS U ADVECTION TERM FROM EQUATION (35)    ADVPGD1E.118    
     *,V_TERM(P_FIELD)      ! HOLDS V ADVECTION TERM FROM EQUATION (35)    ADVPGD1E.119    
C*---------------------------------------------------------------------    ADVPGD1E.120    
C DEFINE LOCAL VARIABLES                                                   ADVPGD1E.121    
                                                                           ADVPGD1E.122    
C REAL SCALARS                                                             ADVPGD1E.123    
      REAL                                                                 ADVPGD1E.124    
     * SCALAR1,SCALAR2                                                     ADVPGD1E.125    
                                                                           ADVPGD1E.126    
C COUNT VARIABLES FOR DO LOOPS ETC.                                        ADVPGD1E.127    
      INTEGER                                                              ADVPGD1E.128    
     *  I,IJ,IK,IL,IM,J,K                                                  ADVPGD1E.129    
      INTEGER START_ADD_base,START_ADD_top                                 ADVPGD1E.130    
                                                                           ADVPGD1E.131    
! Work space and scalars for the MPP Fourth Order Advection                ADVPGD1E.132    
       INTEGER  info,            ! return code from comms operations       ADVPGD1E.133    
     &          extended_index,  ! index for position in extended array    ADVPGD1E.134    
     &          extended_START_POINT_NO_HALO,                              ADVPGD1E.135    
!                                ! start position in extended array        ADVPGD1E.136    
     &          extended_END_P_POINT_NO_HALO,                              ADVPGD1E.137    
!                                ! end position in extended array          ADVPGD1E.138    
     &          extended_ROW_LENGTH    ! row length of extended array      ADVPGD1E.139    
*IF DEF,MPP,AND,DEF,T3E                                                    ADVPGD1E.140    
                                                                           ADVPGD1E.141    
*CALL AMAXSIZE                                                             ADVPGD1E.142    
*ENDIF                                                                     ADVPGD1E.143    
                                                                           ADVPGD1E.144    
      REAL                                                                 ADVPGD1E.145    
*IF DEF,MPP,AND,DEF,T3E                                                    ADVPGD1E.146    
     &          rot_work(row_length_max),     ! work space for rotated p   ADVPGD1E.147    
     &          rot_work_out(row_length_max), ! work space for rotated p   ADVPGD1E.148    
*ELSE                                                                      ADVPGD1E.149    
     &          rot_work(ROW_LENGTH), ! work space for rotated pole rows   ADVPGD1E.150    
*ENDIF                                                                     ADVPGD1E.151    
     &          extended_WORK(extended_P_FIELD)  ! extended work space     ADVPGD1E.152    
*IF DEF,MPP,AND,DEF,T3E                                                    ADVPGD1E.153    
      integer ipad1(32), ipad2(32)                                         ADVPGD1E.154    
c                                                                          ADVPGD1E.155    
      common/adv_p_gd_shmem/ ipad1, rot_work, ipad2                        ADVPGD1E.156    
c                                                                          ADVPGD1E.157    
*CALL PARVARS                                                              ADVPGD1E.158    
      integer g_start(maxproc), g_new_start, l_new_length,                 ADVPGD1E.159    
     2 l_iadd, current_length, l_rem_iadd, my_row_pe                       ADVPGD1E.160    
*ENDIF                                                                     ADVPGD1E.161    
                                                                           ADVPGD1E.162    
                                                                           ADVPGD1E.163    
C*L   NO EXTERNAL SUBROUTINE CALLS:------------------------------------    ADVPGD1E.164    
C*---------------------------------------------------------------------    ADVPGD1E.165    
                                                                           ADVPGD1E.166    
CL    MAXIMUM VECTOR LENGTH ASSUMED IS                                     ADVPGD1E.167    
CL    END_P_POINT_NO_HALO-START_POINT_NO_HALO+1                            ADVPGD1E.168    
CL---------------------------------------------------------------------    ADVPGD1E.169    
                                                                           ADVPGD1E.170    
      IF(L_SECOND) THEN                                                    APB3F405.3      
!  SECOND ORDER ADEVCTION                                                  APB3F405.4      
                                                                           APB3F405.5      
      DO K=1,P_LEVELS                                                      APB3F405.6      
                                                                           APB3F405.7      
CL                                                                         APB3F405.8      
CL---------------------------------------------------------------------    APB3F405.9      
CL    SECTION 1.     CALCULATE U_TERM IN EQUATION (35).                    APB3F405.10     
CL---------------------------------------------------------------------    APB3F405.11     
                                                                           APB3F405.12     
C----------------------------------------------------------------------    APB3F405.13     
CL    SECTION 1.1    CALCULATE TERM U D(FIELD)/D(LAMDA).                   APB3F405.14     
C----------------------------------------------------------------------    APB3F405.15     
                                                                           APB3F405.16     
C----------------------------------------------------------------------    APB3F405.17     
CL    SECTION 1.2    CALCULATE U ADVECTION TERM IN EQUATION (35).          APB3F405.18     
CL                   IF L_SECOND = TRUE PERFORM SECOND ORDER ADVECTION     APB3F405.19     
CL                   ONLY.                                                 APB3F405.20     
C----------------------------------------------------------------------    APB3F405.21     
                                                                           APB3F405.22     
CL                                                                         APB3F405.23     
CL---------------------------------------------------------------------    APB3F405.24     
CL    SECTION 2.     CALCULATE V_TERM IN EQUATION (35).                    APB3F405.25     
CL---------------------------------------------------------------------    APB3F405.26     
                                                                           APB3F405.27     
C----------------------------------------------------------------------    APB3F405.28     
CL    SECTION 2.1    CALCULATE TERM V D(FIELD)/D(PHI).                     APB3F405.29     
C----------------------------------------------------------------------    APB3F405.30     
                                                                           APB3F405.31     
C----------------------------------------------------------------------    APB3F405.32     
CL    SECTION 2.2    CALCULATE V ADVECTION TERM IN EQUATION (35).          APB3F405.33     
CL                   IF L_SECOND = TRUE PERFORM SECOND ORDER ADVECTION     APB3F405.34     
CL                   ONLY.                                                 APB3F405.35     
C----------------------------------------------------------------------    APB3F405.36     
                                                                           APB3F405.37     
CL                                                                         APB3F405.38     
CL---------------------------------------------------------------------    APB3F405.39     
CL    SECTION 3.     CALCULATE VERTICAL FLUX AND COMBINE WITH U AND V      APB3F405.40     
CL                   TERMS TO FORM INCREMENT.                              APB3F405.41     
CL---------------------------------------------------------------------    APB3F405.42     
                                                                           APB3F405.43     
CL    VERTICAL FLUX ON INPUT IS .5*TIMESTEP*ETADOT*D(FIELD)/D(ETA)         APB3F405.44     
CL    AT LEVEL K-1/2. AT THE END OF THIS SECTION IT IS THE SAME            APB3F405.45     
CL    QUANTITY BUT AT LEVEL K+1/2.                                         APB3F405.46     
                                                                           APB3F405.47     
! Loop over field, missing top and bottom rows and halos                   APB3F405.48     
      if(k.ne.1.and.k.ne.P_LEVELS)then                                     APB3F405.49     
                                                                           APB3F405.50     
cdir$ unroll4                                                              APB3F405.51     
      DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                         APB3F405.52     
        SCALAR1 = .5 * ADVECTION_TIMESTEP *                                APB3F405.53     
     *         ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))                 APB3F405.54     
        SCALAR2 = WORK(I)                                                  APB3F405.55     
        FIELD_INC(I,K) = SCALAR1 +SCALAR2                                  APB3F405.56     
      IF (LWHITBROM) FIELD_INC(I,K) = FIELD_INC(I,K)                       APB3F405.57     
     *                  + FIELD(I,K)*BRSP(I,K)                             APB3F405.58     
        WORK(I)=SCALAR1                                                    APB3F405.59     
      ENDDO                                                                APB3F405.60     
      else if(k.eq.1) then                                                 APB3F405.61     
cdir$ unroll4                                                              APB3F405.62     
      DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                         APB3F405.63     
        SCALAR1 = .5 * ADVECTION_TIMESTEP *                                APB3F405.64     
     *         ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))                 APB3F405.65     
        FIELD_INC(I,K) = SCALAR1                                           APB3F405.66     
      IF (LWHITBROM) FIELD_INC(I,K) = FIELD_INC(I,K)                       APB3F405.67     
     *                  + FIELD(I,K)*BRSP(I,K)                             APB3F405.68     
      WORK(I)=SCALAR1                                                      APB3F405.69     
      END DO                                                               APB3F405.70     
      else if(k.eq.P_LEVELS) then                                          APB3F405.71     
cdir$ unroll4                                                              APB3F405.72     
      DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                         APB3F405.73     
        SCALAR2 = WORK(I)                                                  APB3F405.74     
        FIELD_INC(I,K) =  SCALAR2                                          APB3F405.75     
      IF (LWHITBROM) FIELD_INC(I,K) = FIELD_INC(I,K)                       APB3F405.76     
     *                  + FIELD(I,K)*BRSP(I,K)                             APB3F405.77     
      END DO                                                               APB3F405.78     
      endif ! if(k.ne.1.and.k.ne.P_LEVELS)then                             APB3F405.79     
                                                                           APB3F405.80     
      DO I=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO-1                     APB3F405.81     
        FIELD_INC(I,K) = FIELD_INC(I,K) +                                  APB3F405.82     
     *               .25*ADVECTION_TIMESTEP * SEC_P_LATITUDE(I) *          APB3F405.83     
     *                  (LONGITUDE_STEP_INVERSE*                           APB3F405.84     
     *                    ((U(I,K)+U(I-ROW_LENGTH,K))*                     APB3F405.85     
     *                           (FIELD(I+1,K)-FIELD(I,K))+                APB3F405.86     
     *                     (U(I-1,K)+U(I-1-ROW_LENGTH,K))*                 APB3F405.87     
     *                           (FIELD(I,K)-FIELD(I-1,K)))                APB3F405.88     
     *                 +                                                   APB3F405.89     
     *                   LATITUDE_STEP_INVERSE*                            APB3F405.90     
     *                    ((V(I-ROW_LENGTH,K)+V(I-1-ROW_LENGTH,K))*        APB3F405.91     
     *               (FIELD(I-ROW_LENGTH,K) - FIELD(I,K))+                 APB3F405.92     
     &                     (V(I,K)+V(I-1,K))*                              APB3F405.93     
     *               (FIELD(I,K) - FIELD(I+ROW_LENGTH,K))))                APB3F405.94     
      ENDDO                                                                APB3F405.95     
                                                                           APB3F405.96     
                                                                           APB3F405.97     
*IF DEF,GLOBAL                                                             ADVPGD1E.171    
                                                                           APB3F405.98     
      if(k.ne.1.and.k.ne.P_LEVELS)then                                     APB3F405.99     
                                                                           APB3F405.100    
      IF (at_top_of_LPG) THEN                                              APB3F405.101    
! North Pole Flux                                                          APB3F405.102    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      APB3F405.103    
          SCALAR1 = 0.5 * ADVECTION_TIMESTEP *                             APB3F405.104    
     &              ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))            APB3F405.105    
          SCALAR2 = WORK(I)                                                APB3F405.106    
          FIELD_INC(I,K) = SCALAR1 + SCALAR2                               APB3F405.107    
                                                                           APB3F405.108    
          IF (LWHITBROM)                                                   APB3F405.109    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             APB3F405.110    
          WORK(I)=SCALAR1                                                  APB3F405.111    
        ENDDO                                                              APB3F405.112    
      ENDIF ! (at_top_of_LPG)                                              APB3F405.113    
      IF (at_base_of_LPG) THEN                                             ADVPGD1E.175    
! South Pole Flux                                                          APB3F405.114    
        DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                  APB3F405.115    
          SCALAR1 = 0.5 * ADVECTION_TIMESTEP *                             APB3F405.116    
     &              ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))            APB3F405.117    
          SCALAR2 = WORK(I)                                                APB3F405.118    
          FIELD_INC(I,K) = SCALAR1 + SCALAR2                               APB3F405.119    
                                                                           APB3F405.120    
          IF (LWHITBROM)                                                   APB3F405.121    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             APB3F405.122    
          WORK(I)=SCALAR1                                                  APB3F405.123    
        ENDDO                                                              APB3F405.124    
      ENDIF ! (at_base_of_LPG)                                             APB3F405.125    
      else if(k.eq.1)then                                                  APB3F405.126    
      IF (at_top_of_LPG) THEN                                              APB3F405.127    
! North Pole Flux                                                          APB3F405.128    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      APB3F405.129    
          SCALAR1 = 0.5 * ADVECTION_TIMESTEP *                             APB3F405.130    
     &              ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))            APB3F405.131    
          FIELD_INC(I,K) =  SCALAR1                                        APB3F405.132    
                                                                           APB3F405.133    
          IF (LWHITBROM)                                                   APB3F405.134    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             APB3F405.135    
          WORK(I)=SCALAR1                                                  APB3F405.136    
        ENDDO                                                              APB3F405.137    
      ENDIF ! (at_top_of_LPG)                                              APB3F405.138    
      IF (at_base_of_LPG) THEN                                             APB3F405.139    
! North Pole Flux & South Pole Flux                                        APB3F405.140    
        DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                  APB3F405.141    
          SCALAR1 = 0.5 * ADVECTION_TIMESTEP *                             APB3F405.142    
     &              ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))            APB3F405.143    
          FIELD_INC(I,K) =  SCALAR1                                        APB3F405.144    
                                                                           APB3F405.145    
          IF (LWHITBROM)                                                   APB3F405.146    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             APB3F405.147    
          WORK(I)=SCALAR1                                                  APB3F405.148    
        ENDDO                                                              APB3F405.149    
       ENDIF ! (at_base_of_LPG)                                            APB3F405.150    
      else if(k.eq.P_LEVELS) then                                          APB3F405.151    
      IF (at_top_of_LPG) THEN                                              APB3F405.152    
! North Pole Flux                                                          APB3F405.153    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      APB3F405.154    
          SCALAR2 = WORK(I)                                                APB3F405.155    
          FIELD_INC(I,K) = SCALAR2                                         APB3F405.156    
                                                                           APB3F405.157    
          IF (LWHITBROM)                                                   APB3F405.158    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             APB3F405.159    
        ENDDO                                                              APB3F405.160    
      ENDIF ! (at_top_of_LPG)                                              APB3F405.161    
      IF (at_base_of_LPG) THEN                                             APB3F405.162    
! South Pole Flux                                                          APB3F405.163    
        DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                  APB3F405.164    
          SCALAR2 = WORK(I)                                                APB3F405.165    
          FIELD_INC(I,K) = SCALAR2                                         APB3F405.166    
                                                                           APB3F405.167    
          IF (LWHITBROM)                                                   APB3F405.168    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             APB3F405.169    
        ENDDO                                                              APB3F405.170    
      ENDIF ! (at_base_of_LPG)                                             APB3F405.171    
      endif ! if(k.ne.1.and.k.ne.P_LEVELS)                                 APB3F405.172    
      IF (at_top_of_LPG) THEN                                              APB3F405.173    
        DO I=TOP_ROW_START+1,TOP_ROW_START+ROW_LENGTH-1                    APB3F405.174    
          FIELD_INC(I,K) = FIELD_INC(I,K) +                                APB3F405.175    
     *            ADVECTION_TIMESTEP * SEC_P_LATITUDE(I) *                 APB3F405.176    
     *            .25*LATITUDE_STEP_INVERSE*                               APB3F405.177    
     *            (V(I,K)+V(I-1,K))*                                       APB3F405.178    
     *            (FIELD(I,K) - FIELD(I+ROW_LENGTH,K))                     APB3F405.179    
        ENDDO                                                              APB3F405.180    
      ENDIF ! (at_top_of_LPG)                                              APB3F405.181    
      IF (at_base_of_LPG) THEN                                             APB3F405.182    
        DO I=P_BOT_ROW_START+1,P_BOT_ROW_START+ROW_LENGTH-1                APB3F405.183    
          FIELD_INC(I,K) = FIELD_INC(I,K) +                                APB3F405.184    
     *            ADVECTION_TIMESTEP * SEC_P_LATITUDE(I) *                 APB3F405.185    
     *            .25*LATITUDE_STEP_INVERSE*                               APB3F405.186    
     *            (V(I-ROW_LENGTH,K)+V(I-1-ROW_LENGTH,K))*                 APB3F405.187    
     *            (FIELD(I-ROW_LENGTH,K) - FIELD(I,K))                     APB3F405.188    
      ENDDO                                                                APB3F405.189    
      ENDIF ! (at_base_of_LPG)                                             APB3F405.190    
*ENDIF                                                                     APB3F405.191    
                                                                           APB3F405.192    
*IF -DEF,GLOBAL                                                            APB3F405.193    
                                                                           APB3F405.194    
CL   LIMITED AREA MODEL SET BOUNDARY INCREMENTS                            APB3F405.195    
CL   TO ZERO.                                                              APB3F405.196    
                                                                           APB3F405.197    
       IF (at_left_of_LPG) THEN                                            APB3F405.198    
          DO I=START_POINT_NO_HALO+FIRST_ROW_PT-1,                         APB3F405.199    
     &         END_P_POINT_NO_HALO,ROW_LENGTH                              APB3F405.200    
            FIELD_INC(I,K)=0.                                              APB3F405.201    
          ENDDO                                                            APB3F405.202    
        ENDIF                                                              APB3F405.203    
                                                                           APB3F405.204    
        IF (at_right_of_LPG) THEN                                          APB3F405.205    
          DO I=START_POINT_NO_HALO+LAST_ROW_PT-1,                          APB3F405.206    
     &         END_P_POINT_NO_HALO,ROW_LENGTH                              APB3F405.207    
            FIELD_INC(I,K)=0.                                              APB3F405.208    
          ENDDO                                                            APB3F405.209    
      ENDIF                                                                ADVPGD1E.177    
                                                                           APB3F405.210    
*ENDIF                                                                     ADVPGD1E.178    
      ENDDO                                                                APB3F405.211    
                                                                           APB3F405.212    
      ELSE  !IF(L_SECOND)                                                  APB3F405.213    
!  FOURTH ORDER ADEVCTION                                                  APB3F405.214    
                                                                           APB3F405.215    
! Calculate indexes in extended_arrays                                     ADVPGD1E.180    
                                                                           ADVPGD1E.181    
      extended_ROW_LENGTH=ROW_LENGTH+2*extra_EW_Halo                       ADVPGD1E.182    
                                                                           ADVPGD1E.183    
        extended_START_POINT_NO_HALO=                                      ADVPGD1E.184    
     &    extended_address(START_POINT_NO_HALO)                            ADVPGD1E.185    
                                                                           ADVPGD1E.186    
        extended_END_P_POINT_NO_HALO=                                      ADVPGD1E.187    
     &    extended_address(END_P_POINT_NO_HALO)                            ADVPGD1E.188    
                                                                           ADVPGD1E.189    
                                                                           ADVPGD1E.191    
      DO K=1,P_LEVELS                                                      ADVPGD1E.192    
                                                                           ADVPGD1E.193    
CL                                                                         ADVPGD1E.194    
CL---------------------------------------------------------------------    ADVPGD1E.195    
CL    SECTION 1.     CALCULATE U_TERM IN EQUATION (35).                    ADVPGD1E.196    
CL---------------------------------------------------------------------    ADVPGD1E.197    
                                                                           ADVPGD1E.198    
C----------------------------------------------------------------------    ADVPGD1E.199    
CL    SECTION 1.1    CALCULATE TERM U D(FIELD)/D(LAMDA).                   ADVPGD1E.200    
C----------------------------------------------------------------------    ADVPGD1E.201    
                                                                           ADVPGD1E.202    
C CALCULATE TERM AT ALL POINTS EXCEPT LAST AND STORE IN WORK.              ADVPGD1E.203    
                                                                           ADVPGD1E.204    
! Loop over extended field, missing top and bottom rows and halos rows     ADVPGD1E.217    
        DO I=extended_START_POINT_NO_HALO-1,                               ADVPGD1E.218    
     &       extended_END_P_POINT_NO_HALO+1                                ADVPGD1E.219    
          extended_WORK(I)=0.5*(U(I,K)+U(I-extended_ROW_LENGTH,K))*        ADVPGD1E.220    
     &                     LONGITUDE_STEP_INVERSE*                         ADVPGD1E.221    
     &                     (extended_FIELD(I+1,K)-extended_FIELD(I,K))     ADVPGD1E.222    
        ENDDO                                                              ADVPGD1E.223    
                                                                           ADVPGD1E.224    
                                                                           ADVPGD1E.226    
                                                                           ADVPGD1E.227    
C----------------------------------------------------------------------    ADVPGD1E.228    
CL    SECTION 1.2    CALCULATE U ADVECTION TERM IN EQUATION (35).          ADVPGD1E.229    
CL                   IF L_SECOND = TRUE PERFORM SECOND ORDER ADVECTION     ADVPGD1E.230    
CL                   ONLY.                                                 ADVPGD1E.231    
C----------------------------------------------------------------------    ADVPGD1E.232    
                                                                           ADVPGD1E.233    
                                                                           ADVPGD1E.267    
C LOOP OVER ALL POINTS.                                                    ADVPGD1E.268    
                                                                           ADVPGD1E.269    
! Loop over field, missing top and bottom rows and halos, and              ADVPGD1E.270    
! first point.                                                             ADVPGD1E.271    
        DO 120 J=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO                 ADVPGD1E.272    
          extended_index=extended_address(J)                               ADVPGD1E.273    
                                                                           ADVPGD1E.274    
          U_TERM(J) = (1.+NUX(J,K))*.5*(extended_WORK(extended_index)+     ADVPGD1E.275    
     &                                extended_WORK(extended_index-1))     ADVPGD1E.276    
     &                 -  NUX(J,K) *.5*(extended_WORK(extended_index+1)+   ADVPGD1E.277    
     &                                extended_WORK(extended_index-2))     ADVPGD1E.278    
 120    CONTINUE                                                           ADVPGD1E.279    
                                                                           ADVPGD1E.280    
*IF DEF,GLOBAL                                                             ADVPGD1E.281    
        U_TERM(START_POINT_NO_HALO)= U_TERM(START_POINT_NO_HALO+1)         ADVPGD1E.282    
                                                                           ADVPGD1E.283    
*ELSE                                                                      ADVPGD1E.284    
                                                                           ARR4F405.12     
! Initialise first value to avoid potential flop exception failure         ARR4F405.13     
                                                                           ARR4F405.14     
        U_TERM(START_POINT_NO_HALO)= 0.0                                   ARR4F405.15     
                                                                           ADVPGD1E.285    
C CALCULATE  VALUES AT SECOND AND NEXT TO LAST POINTS ON A ROW.            ADVPGD1E.286    
C THESE VALUES ARE JUST SECOND ORDER.                                      ADVPGD1E.287    
                                                                           ADVPGD1E.288    
        IF (at_left_of_LPG) THEN                                           ADVPGD1E.289    
! Do second point along each row                                           ADVPGD1E.290    
          DO I=START_POINT_NO_HALO+FIRST_ROW_PT,END_P_POINT_NO_HALO,       ADVPGD1E.291    
     &         ROW_LENGTH                                                  ADVPGD1E.292    
            extended_index=extended_address(I)                             ADVPGD1E.293    
                                                                           ADVPGD1E.294    
            U_TERM(I)= 0.5*(extended_WORK(extended_index)+                 ADVPGD1E.295    
     &                      extended_WORK(extended_index-1))               ADVPGD1E.296    
          ENDDO                                                            ADVPGD1E.297    
        ENDIF                                                              ADVPGD1E.298    
                                                                           ADVPGD1E.299    
! Do penultimate point along each row                                      ADVPGD1E.300    
                                                                           ADVPGD1E.301    
        IF (at_right_of_LPG) THEN                                          ADVPGD1E.302    
          DO I=START_POINT_NO_HALO+LAST_ROW_PT-2,END_P_POINT_NO_HALO,      ADVPGD1E.303    
     &         ROW_LENGTH                                                  ADVPGD1E.304    
            extended_index=extended_address(I)                             ADVPGD1E.305    
                                                                           ADVPGD1E.306    
            U_TERM(I)= 0.5*(extended_WORK(extended_index)+                 ADVPGD1E.307    
     &                      extended_WORK(extended_index-1))               ADVPGD1E.308    
          ENDDO                                                            ADVPGD1E.309    
        ENDIF                                                              ADVPGD1E.310    
                                                                           ADVPGD1E.311    
*ENDIF                                                                     ADVPGD1E.312    
                                                                           ADVPGD1E.314    
CL                                                                         ADVPGD1E.315    
CL---------------------------------------------------------------------    ADVPGD1E.316    
CL    SECTION 2.     CALCULATE V_TERM IN EQUATION (35).                    ADVPGD1E.317    
CL---------------------------------------------------------------------    ADVPGD1E.318    
                                                                           ADVPGD1E.319    
C----------------------------------------------------------------------    ADVPGD1E.320    
CL    SECTION 2.1    CALCULATE TERM V D(FIELD)/D(PHI).                     ADVPGD1E.321    
C----------------------------------------------------------------------    ADVPGD1E.322    
                                                                           ADVPGD1E.323    
C CALCULATE TERM AT ALL POINTS EXCEPT FIRST AND STORE IN WORK.             ADVPGD1E.324    
                                                                           ADVPGD1E.325    
! Calculate WORK at the Southern halo too. This is needed for the          ADVPGD1E.341    
! computation of the Southern row                                          ADVPGD1E.342    
                                                                           ADVPGD1E.343    
        DO I=extended_START_POINT_NO_HALO-2*extended_ROW_LENGTH,           ADVPGD1E.344    
     &       extended_END_P_POINT_NO_HALO+extended_ROW_LENGTH              ADVPGD1E.345    
         extended_WORK(I)=0.5*(V(I,K)+V(I-1,K))*LATITUDE_STEP_INVERSE*     ADVPGD1E.346    
     &   (extended_FIELD(I,K)-extended_FIELD(I+extended_ROW_LENGTH,K))     ADVPGD1E.347    
        ENDDO                                                              ADVPGD1E.348    
                                                                           ADVPGD1E.349    
                                                                           ADVPGD1E.352    
C----------------------------------------------------------------------    ADVPGD1E.353    
CL    SECTION 2.2    CALCULATE V ADVECTION TERM IN EQUATION (35).          ADVPGD1E.354    
CL                   IF L_SECOND = TRUE PERFORM SECOND ORDER ADVECTION     ADVPGD1E.355    
CL                   ONLY.                                                 ADVPGD1E.356    
C----------------------------------------------------------------------    ADVPGD1E.357    
                                                                           ADVPGD1E.358    
*IF DEF,GLOBAL                                                             ADVPGD1E.398    
C GLOBAL MODEL.                                                            ADVPGD1E.399    
! Calculate all values except on rows next to poles and next to the        ADVPGD1E.400    
! processor interfaces                                                     ADVPGD1E.401    
                                                                           ADVPGD1E.402    
        DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                       ADVPGD1E.403    
          extended_index=extended_address(I)                               ADVPGD1E.404    
                                                                           ADVPGD1E.405    
          V_TERM(I) = (1.0+NUY(I,K))*0.5*                                  ADVPGD1E.406    
     &     (extended_WORK(extended_index-extended_ROW_LENGTH)              ADVPGD1E.407    
     &    + extended_WORK(extended_index))                                 ADVPGD1E.408    
     &                   - NUY(I,K) *0.5*                                  ADVPGD1E.409    
     &     (extended_WORK(extended_index+extended_ROW_LENGTH)              ADVPGD1E.410    
     &    + extended_WORK(extended_index-2*extended_ROW_LENGTH))           ADVPGD1E.411    
        ENDDO                                                              ADVPGD1E.412    
*IF DEF,MPP,AND,DEF,T3E                                                    ADVPGD1E.413    
c                                                                          ADVPGD1E.414    
c--for MPP Code, check that we have enough processors                      ADVPGD1E.415    
        if(nproc_x.eq.1 .or. nproc_y.eq.1) then                            ADVPGD1E.416    
*ENDIF                                                                     ADVPGD1E.417    
                                                                           ADVPGD1E.418    
        IF (at_top_of_LPG) THEN                                            ADVPGD1E.419    
! North Pole Rows                                                          ADVPGD1E.420    
! We want to advect across the pole - which requires us to know the        ADVPGD1E.421    
! values on the opposite side of the pole. To do this we rotate the        ADVPGD1E.422    
! polar row by half a row in a work array - so each point in the           ADVPGD1E.423    
! original array matches its opposite point in the rotated array           ADVPGD1E.424    
                                                                           ADVPGD1E.425    
          DO I=1,ROW_LENGTH                                                ADVPGD1E.426    
!            rot_work(I)=extended_WORK(halo_4th*extended_ROW_LENGTH+I+1)   ADVPGD1E.427    
            rot_work(I)=                                                   ADVPGD1E.428    
     &        extended_WORK(extended_address(TOP_ROW_START+I-1))           ADVPGD1E.429    
          ENDDO                                                            ADVPGD1E.430    
                                                                           ADVPGD1E.431    
          CALL GCG_RVECSHIFT(ROW_LENGTH,ROW_LENGTH-2*EW_Halo,              ADVPGD1E.432    
     &                       halo_4th,1,                                   ADVPGD1E.433    
     &                       GLOBAL_ROW_LENGTH/2,.TRUE.,rot_work,          ADVPGD1E.434    
     &                       GC_ROW_GROUP,info)                            ADVPGD1E.435    
                                                                           ADVPGD1E.436    
          DO I=1,ROW_LENGTH                                                ADVPGD1E.437    
            IK=START_POINT_NO_HALO-1+I ! point in row beneath polar row    ADVPGD1E.438    
            extended_index=extended_address(IK)                            ADVPGD1E.439    
!            extended_index=(Offy+2)*extended_ROW_LENGTH +I+1              ADVPGD1E.440    
!                                    ! same point in extended field        ADVPGD1E.441    
                                                                           ADVPGD1E.442    
! Calculate V_TERM in row beneath polar row                                ADVPGD1E.443    
            V_TERM(IK)= (1.0+NUY(IK,K))*0.5*                               ADVPGD1E.444    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1E.445    
     &       + extended_WORK(extended_index))                              ADVPGD1E.446    
     &                     - NUY(IK,K) *0.5*                               ADVPGD1E.447    
     &        (extended_WORK(extended_index+extended_ROW_LENGTH)           ADVPGD1E.448    
     &       + rot_work(I))                                                ADVPGD1E.449    
                                                                           ADVPGD1E.450    
! Calculate V_TERM in polar row                                            ADVPGD1E.451    
            V_TERM(IK-ROW_LENGTH) = (1.0+NUY(IK,K))*0.5*                   ADVPGD1E.452    
     &         extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1E.453    
     &      - NUY(IK,K)*0.5*extended_WORK(extended_index)                  ADVPGD1E.454    
                                                                           ADVPGD1E.455    
          ENDDO                                                            ADVPGD1E.456    
                                                                           ADVPGD1E.457    
        ENDIF ! (attop)                                                    ADVPGD1E.458    
                                                                           ADVPGD1E.459    
        IF (at_base_of_LPG) THEN                                           ADVPGD1E.460    
! South Pole Rows : similar code to that for North Pole                    ADVPGD1E.461    
                                                                           ADVPGD1E.462    
          DO I=1,ROW_LENGTH                                                ADVPGD1E.463    
            extended_index=                                                ADVPGD1E.464    
     &        extended_address(P_BOT_ROW_START-ROW_LENGTH+I-1)             ADVPGD1E.465    
!            extended_index=extended_P_FIELD-                              ADVPGD1E.466    
!     &                      (Offy+3)*extended_ROW_LENGTH +I+1             ADVPGD1E.467    
            rot_work(I)=extended_WORK(extended_index)                      ADVPGD1E.468    
          ENDDO                                                            ADVPGD1E.469    
                                                                           ADVPGD1E.470    
          CALL GCG_RVECSHIFT(ROW_LENGTH,ROW_LENGTH-2*EW_Halo,              ADVPGD1E.471    
     &                       halo_4th,1,                                   ADVPGD1E.472    
     &                       GLOBAL_ROW_LENGTH/2,.TRUE.,rot_work,          ADVPGD1E.473    
     &                       GC_ROW_GROUP,info)                            ADVPGD1E.474    
                                                                           ADVPGD1E.475    
          DO I=1,ROW_LENGTH                                                ADVPGD1E.476    
            IJ=END_P_POINT_NO_HALO-ROW_LENGTH+I ! row above South Pole     ADVPGD1E.477    
            extended_index=extended_address(IJ)                            ADVPGD1E.478    
!            IJ=P_FIELD-(Offy+2)*ROW_LENGTH+I ! row above South Pole       ADVPGD1E.479    
!            extended_index=extended_P_FIELD-                              ADVPGD1E.480    
!     &                       (Offy+3)*extended_ROW_LENGTH +I+1            ADVPGD1E.481    
                                                                           ADVPGD1E.482    
! Calculate V_TERM in row above polar row                                  ADVPGD1E.483    
            V_TERM(IJ)= (1.0+NUY(IJ,K))*0.5*                               ADVPGD1E.484    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1E.485    
     &       + extended_WORK(extended_index))                              ADVPGD1E.486    
     &                     - NUY(IJ,K) *0.5*                               ADVPGD1E.487    
     &        (rot_work(I)+                                                ADVPGD1E.488    
     &         extended_WORK(extended_index-2*extended_ROW_LENGTH))        ADVPGD1E.489    
                                                                           ADVPGD1E.490    
! Calculate V_TERM in polar row                                            ADVPGD1E.491    
            V_TERM(IJ+ROW_LENGTH) = (1.0+NUY(IJ,K))*0.5*                   ADVPGD1E.492    
     &         extended_WORK(extended_index) - NUY(IJ,K)*0.5*              ADVPGD1E.493    
     &         extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1E.494    
                                                                           ADVPGD1E.495    
          ENDDO                                                            ADVPGD1E.496    
                                                                           ADVPGD1E.497    
        ENDIF ! (atbase)                                                   ADVPGD1E.498    
*IF DEF,MPP,AND,DEF,T3E                                                    ADVPGD1E.499    
c                                                                          ADVPGD1E.500    
        else ! MPP/T3E and only 1 processor along either direction         ADVPGD1E.501    
c                                                                          ADVPGD1E.502    
        call barrier()                                                     ADVPGD1E.503    
c                                                                          ADVPGD1E.504    
        IF (at_top_of_LPG) THEN                                            ADVPGD1E.505    
! North Pole Rows                                                          ADVPGD1E.506    
                                                                           ADVPGD1E.507    
          DO I=1,ROW_LENGTH                                                ADVPGD1E.508    
!            rot_work(I)=extended_WORK(halo_4th*extended_ROW_LENGTH+I+1)   ADVPGD1E.509    
            rot_work(I)=                                                   ADVPGD1E.510    
     &        extended_WORK(extended_address(TOP_ROW_START+I-1))           ADVPGD1E.511    
          ENDDO                                                            ADVPGD1E.512    
        ENDIF ! (attop)                                                    ADVPGD1E.513    
                                                                           ADVPGD1E.514    
        IF (at_base_of_LPG) THEN                                           ADVPGD1E.515    
! South Pole Rows : similar code to that for North Pole                    ADVPGD1E.516    
                                                                           ADVPGD1E.517    
          DO I=1,ROW_LENGTH                                                ADVPGD1E.518    
            extended_index=                                                ADVPGD1E.519    
     &        extended_address(P_BOT_ROW_START-ROW_LENGTH+I-1)             ADVPGD1E.520    
!            extended_index=extended_P_FIELD-                              ADVPGD1E.521    
!     &                      (Offy+3)*extended_ROW_LENGTH +I+1             ADVPGD1E.522    
            rot_work(I)=extended_WORK(extended_index)                      ADVPGD1E.523    
          ENDDO                                                            ADVPGD1E.524    
        ENDIF ! (atbase)                                                   ADVPGD1E.525    
c                                                                          ADVPGD1E.526    
        call barrier()                                                     ADVPGD1E.527    
c                                                                          ADVPGD1E.528    
c--process North and South Rows together                                   ADVPGD1E.529    
        IF (at_top_of_LPG .or. at_base_of_LPG) THEN                        ADVPGD1E.530    
c--work out the PE at the start of my Row                                  ADVPGD1E.531    
          my_row_pe=(mype/nproc_x)*nproc_x                                 ADVPGD1E.532    
          g_start(1)=1                                                     ADVPGD1E.533    
c--find the global start addresses for PE's in my row                      ADVPGD1E.534    
          do i=2, nproc_x+1                                                ADVPGD1E.535    
            g_start(i)=g_start(i-1)+g_blsizep(1,i-2)                       ADVPGD1E.536    
          end do                                                           ADVPGD1E.537    
c          write(0,*) my_pe(), (g_start(i), i=1, nproc_x+1)                ADVPGD1E.538    
c                                                                          ADVPGD1E.539    
c--set the global start address for the start of my exchange               ADVPGD1E.540    
          g_new_start=g_start(mype-my_row_pe+1)+global_row_length/2        ADVPGD1E.541    
c--set the length of the data to exchange                                  ADVPGD1E.542    
          l_new_length=row_length-2*ew_halo                                ADVPGD1E.543    
c--set the start address                                                   ADVPGD1E.544    
          l_iadd=halo_4th                                                  ADVPGD1E.545    
c--loop until we have moved all the segments for this PE                   ADVPGD1E.546    
1000    continue                                                           ADVPGD1E.547    
c--check we not off the end                                                ADVPGD1E.548    
            if(g_new_start.gt.glsize(1)) g_new_start=                      ADVPGD1E.549    
     2       g_new_start-glsize(1)                                         ADVPGD1E.550    
c--loop over the PE's in a row                                             ADVPGD1E.551    
            do i=1, nproc_x                                                ADVPGD1E.552    
c--check if this glocal address is on the the current remote PE            ADVPGD1E.553    
              if(g_new_start.ge.g_start(i) .and.                           ADVPGD1E.554    
     2         g_new_start.lt.g_start(i+1)) then                           ADVPGD1E.555    
c--compute the new local address on the remote PE                          ADVPGD1E.556    
                l_rem_iadd=g_new_start-g_start(i)                          ADVPGD1E.557    
c--compute the number of words to move on this get                         ADVPGD1E.558    
                current_length=min(l_new_length,                           ADVPGD1E.559    
     2           g_start(i+1)-g_new_start)                                 ADVPGD1E.560    
c                write(0,*) my_pe(), ' fetch ', current_length,            ADVPGD1E.561    
c     2           ' from PE ',i-1, ' from ',l_rem_iadd+halo_4th,           ADVPGD1E.562    
c     3           ' to ', l_iadd                                           ADVPGD1E.563    
c--get the data                                                            ADVPGD1E.564    
                call shmem_get(rot_work_out(l_iadd),                       ADVPGD1E.565    
     2           rot_work(l_rem_iadd+halo_4th), current_length,            ADVPGD1E.566    
     3           my_row_pe+i-1)                                            ADVPGD1E.567    
                                                                           ADVPGD1E.568    
c--update the global address and local addresses and lengths               ADVPGD1E.569    
                g_new_start=g_new_start+current_length                     ADVPGD1E.570    
                l_iadd=l_iadd+current_length                               ADVPGD1E.571    
                l_new_length=l_new_length-current_length                   ADVPGD1E.572    
c--check if we have finished                                               ADVPGD1E.573    
                if(l_new_length.gt.0) goto 1000                            ADVPGD1E.574    
                goto 1100                                                  ADVPGD1E.575    
              endif                                                        ADVPGD1E.576    
            end do                                                         ADVPGD1E.577    
            write(0,*)'PE ', my_pe(), ' is Lost in ADV_P_GD ',             ADVPGD1E.578    
     2       l_new_length, current_length, l_rem_iadd+halo_4th, l_iadd,    ADVPGD1E.579    
     3       g_new_start, (g_start(i), i=1, nproc_x+1)                     ADVPGD1E.580    
            call abort('Lost in ADV_P_GD')                                 ADVPGD1E.581    
                                                                           ADVPGD1E.582    
1100        continue                                                       ADVPGD1E.583    
            rot_work_out(1)=rot_work(1)                                    ADVPGD1E.584    
            rot_work_out(row_length)=rot_work(row_length)                  ADVPGD1E.585    
c            write(0,*) my_pe(), (rot_work_out(i), i=1,                    ADVPGD1E.586    
c     2       row_length)                                                  ADVPGD1E.587    
                                                                           ADVPGD1E.588    
        ENDIF ! (at_top_of_LPG .or. at_base_of_LPG)                        ADVPGD1E.589    
c                                                                          ADVPGD1E.590    
        IF (at_top_of_LPG) THEN                                            ADVPGD1E.591    
! North Pole                                                               ADVPGD1E.592    
                                                                           ADVPGD1E.593    
          DO I=1,ROW_LENGTH                                                ADVPGD1E.594    
            IK=START_POINT_NO_HALO-1+I ! point in row beneath polar row    ADVPGD1E.595    
            extended_index=extended_address(IK)                            ADVPGD1E.596    
!            extended_index=(Offy+2)*extended_ROW_LENGTH +I+1              ADVPGD1E.597    
!                                    ! same point in extended field        ADVPGD1E.598    
                                                                           ADVPGD1E.599    
! Calculate V_TERM in row beneath polar row                                ADVPGD1E.600    
            V_TERM(IK)= (1.0+NUY(IK,K))*0.5*                               ADVPGD1E.601    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1E.602    
     &       + extended_WORK(extended_index))                              ADVPGD1E.603    
     &                     - NUY(IK,K) *0.5*                               ADVPGD1E.604    
     &        (extended_WORK(extended_index+extended_ROW_LENGTH)           ADVPGD1E.605    
     &       + rot_work_out(I))                                            ADVPGD1E.606    
                                                                           ADVPGD1E.607    
! Calculate V_TERM in polar row                                            ADVPGD1E.608    
            V_TERM(IK-ROW_LENGTH) = (1.0+NUY(IK,K))*0.5*                   ADVPGD1E.609    
     &         extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1E.610    
     &      - NUY(IK,K)*0.5*extended_WORK(extended_index)                  ADVPGD1E.611    
                                                                           ADVPGD1E.612    
          ENDDO                                                            ADVPGD1E.613    
        ENDIF ! (IF at_top_of_LPG)                                         ADVPGD1E.614    
c                                                                          ADVPGD1E.615    
        IF (at_base_of_LPG) THEN                                           ADVPGD1E.616    
! South Pole                                                               ADVPGD1E.617    
                                                                           ADVPGD1E.618    
          DO I=1,ROW_LENGTH                                                ADVPGD1E.619    
            IJ=END_P_POINT_NO_HALO-ROW_LENGTH+I ! row above South Pole     ADVPGD1E.620    
            extended_index=extended_address(IJ)                            ADVPGD1E.621    
!            IJ=P_FIELD-(Offy+2)*ROW_LENGTH+I ! row above South Pole       ADVPGD1E.622    
!            extended_index=extended_P_FIELD-                              ADVPGD1E.623    
!     &                       (Offy+3)*extended_ROW_LENGTH +I+1            ADVPGD1E.624    
                                                                           ADVPGD1E.625    
! Calculate V_TERM in row above polar row                                  ADVPGD1E.626    
            V_TERM(IJ)= (1.0+NUY(IJ,K))*0.5*                               ADVPGD1E.627    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1E.628    
     &       + extended_WORK(extended_index))                              ADVPGD1E.629    
     &                     - NUY(IJ,K) *0.5*                               ADVPGD1E.630    
     &       (rot_work_out(I)+                                             ADVPGD1E.631    
     &         extended_WORK(extended_index-2*extended_ROW_LENGTH))        ADVPGD1E.632    
                                                                           ADVPGD1E.633    
! Calculate V_TERM in polar row                                            ADVPGD1E.634    
            V_TERM(IJ+ROW_LENGTH) = (1.0+NUY(IJ,K))*0.5*                   ADVPGD1E.635    
     &         extended_WORK(extended_index) - NUY(IJ,K)*0.5*              ADVPGD1E.636    
     &         extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1E.637    
                                                                           ADVPGD1E.638    
          ENDDO                                                            ADVPGD1E.639    
        ENDIF ! (IF at_base_of_LPG)                                        ADVPGD1E.640    
c                                                                          ADVPGD1E.641    
        endif ! Code for more then one processor in each direction         ADVPGD1E.642    
c                                                                          ADVPGD1E.643    
*ENDIF                                                                     ADVPGD1E.644    
                                                                           ADVPGD1E.645    
*ELSE                                                                      ADVPGD1E.646    
C LIMITED AREA MODEL.                                                      ADVPGD1E.647    
! Calculate all values except on rows next to poles and next to the        ADVPGD1E.648    
! processor interfaces                                                     ADVPGD1E.649    
                                                                           ADVPGD1E.650    
! Loop over field, missing top and bottom rows and halos                   ADVPGD1E.651    
        DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                       ADVPGD1E.652    
          extended_index=extended_address(I)                               ADVPGD1E.653    
                                                                           ADVPGD1E.654    
          V_TERM(I) = (1.0+NUY(I,K))*0.5*                                  ADVPGD1E.655    
     &     (extended_WORK(extended_index-extended_ROW_LENGTH)              ADVPGD1E.656    
     &    + extended_WORK(extended_index))                                 ADVPGD1E.657    
     &                   - NUY(I,K) *0.5*                                  ADVPGD1E.658    
     &     (extended_WORK(extended_index+extended_ROW_LENGTH)              ADVPGD1E.659    
     &    + extended_WORK(extended_index-2*extended_ROW_LENGTH))           ADVPGD1E.660    
        ENDDO                                                              ADVPGD1E.661    
                                                                           ADVPGD1E.662    
                                                                           ADVPGD1E.663    
C CALCULATE VALUES ON SLICES NEXT TO BOUNDARIES AS SECOND ORDER.           ADVPGD1E.664    
                                                                           ADVPGD1E.665    
        IF (at_top_of_LPG) THEN                                            ADVPGD1E.666    
! Loop over row beneath top row, missing halos                             ADVPGD1E.667    
          DO I=START_POINT_NO_HALO+FIRST_ROW_PT-1,                         ADVPGD1E.668    
     &         START_POINT_NO_HALO+LAST_ROW_PT-1                           ADVPGD1E.669    
            extended_index=extended_address(I)                             ADVPGD1E.670    
                                                                           ADVPGD1E.671    
            V_TERM(I)=0.5*                                                 ADVPGD1E.672    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1E.673    
     &       + extended_WORK(extended_index))                              ADVPGD1E.674    
          ENDDO                                                            ADVPGD1E.675    
        ENDIF                                                              ADVPGD1E.676    
                                                                           ADVPGD1E.677    
        IF (at_base_of_LPG) THEN                                           ADVPGD1E.678    
! Loop over row above bottom row, missing halos                            ADVPGD1E.679    
          DO I=END_P_POINT_NO_HALO-ROW_LENGTH+FIRST_ROW_PT,                ADVPGD1E.680    
     &         END_P_POINT_NO_HALO-ROW_LENGTH+LAST_ROW_PT                  ADVPGD1E.681    
            extended_index=extended_address(I)                             ADVPGD1E.682    
            V_TERM(I)=0.5*                                                 ADVPGD1E.683    
     &        (extended_WORK(extended_index-extended_ROW_LENGTH)           ADVPGD1E.684    
     &       + extended_WORK(extended_index))                              ADVPGD1E.685    
          ENDDO                                                            ADVPGD1E.686    
        ENDIF                                                              ADVPGD1E.687    
                                                                           ADVPGD1E.688    
*ENDIF                                                                     ADVPGD1E.689    
                                                                           ADVPGD1E.691    
CL                                                                         ADVPGD1E.692    
CL---------------------------------------------------------------------    ADVPGD1E.693    
CL    SECTION 3.     CALCULATE VERTICAL FLUX AND COMBINE WITH U AND V      ADVPGD1E.694    
CL                   TERMS TO FORM INCREMENT.                              ADVPGD1E.695    
CL---------------------------------------------------------------------    ADVPGD1E.696    
                                                                           ADVPGD1E.697    
CL    VERTICAL FLUX ON INPUT IS .5*TIMESTEP*ETADOT*D(FIELD)/D(ETA)         ADVPGD1E.698    
CL    AT LEVEL K-1/2. AT THE END OF THIS SECTION IT IS THE SAME            ADVPGD1E.699    
CL    QUANTITY BUT AT LEVEL K+1/2.                                         ADVPGD1E.700    
                                                                           ADVPGD1E.701    
! Loop over field, missing top and bottom rows and halos                   ADVPGD1E.702    
      if(k.ne.1.and.k.ne.P_LEVELS)then                                     ADVPGD1E.703    
                                                                           ADVPGD1E.704    
cdir$ unroll4                                                              ADVPGD1E.705    
      DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                         ADVPGD1E.706    
        SCALAR1 = .5 * ADVECTION_TIMESTEP *                                ADVPGD1E.707    
     *         ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))                 ADVPGD1E.708    
        SCALAR2 = WORK(I)                                                  ADVPGD1E.709    
        FIELD_INC(I,K) = SCALAR1 +SCALAR2                                  ADVPGD1E.710    
      IF (LWHITBROM) FIELD_INC(I,K) = FIELD_INC(I,K)                       ADVPGD1E.711    
     *                  + FIELD(I,K)*BRSP(I,K)                             ADVPGD1E.712    
        WORK(I)=SCALAR1                                                    ADVPGD1E.713    
      ENDDO                                                                ADVPGD1E.714    
      else if(k.eq.1) then                                                 ADVPGD1E.721    
cdir$ unroll4                                                              ADVPGD1E.722    
      DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                         ADVPGD1E.723    
        SCALAR1 = .5 * ADVECTION_TIMESTEP *                                ADVPGD1E.724    
     *         ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))                 ADVPGD1E.725    
        FIELD_INC(I,K) = SCALAR1                                           ADVPGD1E.726    
      IF (LWHITBROM) FIELD_INC(I,K) = FIELD_INC(I,K)                       ADVPGD1E.727    
     *                  + FIELD(I,K)*BRSP(I,K)                             ADVPGD1E.728    
      WORK(I)=SCALAR1                                                      ADVPGD1E.729    
      END DO                                                               ADVPGD1E.730    
      else if(k.eq.P_LEVELS) then                                          ADVPGD1E.737    
cdir$ unroll4                                                              ADVPGD1E.738    
      DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                         ADVPGD1E.739    
        SCALAR2 = WORK(I)                                                  ADVPGD1E.740    
        FIELD_INC(I,K) =  SCALAR2                                          ADVPGD1E.741    
      IF (LWHITBROM) FIELD_INC(I,K) = FIELD_INC(I,K)                       ADVPGD1E.742    
     *                  + FIELD(I,K)*BRSP(I,K)                             ADVPGD1E.743    
      END DO                                                               ADVPGD1E.744    
      endif ! if(k.ne.1.and.k.ne.P_LEVELS)then                             APB3F405.216    
cdir$ unroll4                                                              ADVPGD1E.745    
      DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                         ADVPGD1E.746    
        FIELD_INC(I,K) = FIELD_INC(I,K) +                                  ADVPGD1E.747    
     *                   ADVECTION_TIMESTEP * SEC_P_LATITUDE(I) *          ADVPGD1E.748    
     *                  (U_TERM(I)+V_TERM(I))                              ADVPGD1E.749    
      ENDDO                                                                ADVPGD1E.750    
                                                                           ADVPGD1E.752    
*IF DEF,GLOBAL                                                             ADVPGD1E.753    
      if(k.ne.1.and.k.ne.P_LEVELS)then                                     ADVPGD1E.754    
                                                                           ADVPGD1E.755    
      IF (at_top_of_LPG) THEN                                              ADVPGD1E.756    
! North Pole Flux                                                          ADVPGD1E.757    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      APB3F405.217    
          SCALAR1 = 0.5 * ADVECTION_TIMESTEP *                             ADVPGD1E.759    
     &              ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))            ADVPGD1E.760    
          SCALAR2 = WORK(I)                                                ADVPGD1E.761    
          FIELD_INC(I,K) = SCALAR1 + SCALAR2                               ADVPGD1E.762    
                                                                           ADVPGD1E.763    
          IF (LWHITBROM)                                                   ADVPGD1E.764    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             ADVPGD1E.765    
          WORK(I)=SCALAR1                                                  ADVPGD1E.766    
        ENDDO                                                              ADVPGD1E.767    
      ENDIF ! (at_top_of_LPG)                                              ADVPGD1E.772    
      IF (at_base_of_LPG) THEN                                             ADVPGD1E.773    
! South Pole Flux                                                          ADVPGD1E.774    
        DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                  APB3F405.218    
          SCALAR1 = 0.5 * ADVECTION_TIMESTEP *                             ADVPGD1E.776    
     &              ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))            ADVPGD1E.777    
          SCALAR2 = WORK(I)                                                ADVPGD1E.778    
          FIELD_INC(I,K) = SCALAR1 + SCALAR2                               ADVPGD1E.779    
                                                                           ADVPGD1E.780    
          IF (LWHITBROM)                                                   ADVPGD1E.781    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             ADVPGD1E.782    
          WORK(I)=SCALAR1                                                  ADVPGD1E.783    
        ENDDO                                                              ADVPGD1E.784    
      ENDIF ! (at_base_of_LPG)                                             ADVPGD1E.789    
      else if(k.eq.1)then                                                  ADVPGD1E.790    
      IF (at_top_of_LPG) THEN                                              ADVPGD1E.791    
! North Pole Flux                                                          ADVPGD1E.792    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      APB3F405.219    
          SCALAR1 = 0.5 * ADVECTION_TIMESTEP *                             ADVPGD1E.794    
     &              ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))            ADVPGD1E.795    
          FIELD_INC(I,K) =  SCALAR1                                        ADVPGD1E.796    
                                                                           ADVPGD1E.797    
          IF (LWHITBROM)                                                   ADVPGD1E.798    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             ADVPGD1E.799    
          WORK(I)=SCALAR1                                                  ADVPGD1E.800    
        ENDDO                                                              ADVPGD1E.801    
      ENDIF ! (at_top_of_LPG)                                              ADVPGD1E.806    
      IF (at_base_of_LPG) THEN                                             ADVPGD1E.807    
! North Pole Flux & South Pole Flux                                        ADVPGD1E.808    
        DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                  APB3F405.220    
          SCALAR1 = 0.5 * ADVECTION_TIMESTEP *                             ADVPGD1E.810    
     &              ETADOT(I,K+1) * (FIELD(I,K+1) - FIELD(I,K))            ADVPGD1E.811    
          FIELD_INC(I,K) =  SCALAR1                                        ADVPGD1E.812    
                                                                           ADVPGD1E.813    
          IF (LWHITBROM)                                                   ADVPGD1E.814    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             ADVPGD1E.815    
          WORK(I)=SCALAR1                                                  ADVPGD1E.816    
        ENDDO                                                              ADVPGD1E.817    
       ENDIF ! (at_base_of_LPG)                                            ADVPGD1E.822    
      else if(k.eq.P_LEVELS) then                                          ADVPGD1E.823    
      IF (at_top_of_LPG) THEN                                              ADVPGD1E.824    
! North Pole Flux                                                          ADVPGD1E.825    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      APB3F405.221    
          SCALAR2 = WORK(I)                                                ADVPGD1E.827    
          FIELD_INC(I,K) = SCALAR2                                         ADVPGD1E.828    
                                                                           ADVPGD1E.829    
          IF (LWHITBROM)                                                   ADVPGD1E.830    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             ADVPGD1E.831    
        ENDDO                                                              ADVPGD1E.832    
      ENDIF ! (at_top_of_LPG)                                              ADVPGD1E.837    
      IF (at_base_of_LPG) THEN                                             ADVPGD1E.838    
! South Pole Flux                                                          ADVPGD1E.839    
        DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                  APB3F405.222    
          SCALAR2 = WORK(I)                                                ADVPGD1E.841    
          FIELD_INC(I,K) = SCALAR2                                         ADVPGD1E.842    
                                                                           ADVPGD1E.843    
          IF (LWHITBROM)                                                   ADVPGD1E.844    
     &    FIELD_INC(I,K) = FIELD_INC(I,K)+FIELD(I,K)*BRSP(I,K)             ADVPGD1E.845    
        ENDDO                                                              ADVPGD1E.846    
      ENDIF ! (at_base_of_LPG)                                             APB3F405.223    
      endif ! if(k.ne.1.and.k.ne.P_LEVELS)                                 APB3F405.224    
      IF (at_top_of_LPG) THEN                                              APB3F405.225    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      APB3F405.226    
          FIELD_INC(I,K) = FIELD_INC(I,K) +                                APB3F405.227    
     *            ADVECTION_TIMESTEP * SEC_P_LATITUDE(I) * V_TERM(I)       APB3F405.228    
        ENDDO                                                              APB3F405.229    
      ENDIF ! (at_top_of_LPG)                                              APB3F405.230    
      IF (at_base_of_LPG) THEN                                             APB3F405.231    
        DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                  APB3F405.232    
          FIELD_INC(I,K) = FIELD_INC(I,K) +                                ADVPGD1E.848    
     *            ADVECTION_TIMESTEP * SEC_P_LATITUDE(I) * V_TERM(I)       ADVPGD1E.849    
      ENDDO                                                                ADVPGD1E.850    
      ENDIF ! (at_base_of_LPG)                                             ADVPGD1E.851    
*ENDIF                                                                     ADVPGD1E.853    
                                                                           ADVPGD1E.854    
*IF -DEF,GLOBAL                                                            ADVPGD1E.855    
                                                                           ADVPGD1E.856    
CL   LIMITED AREA MODEL SET BOUNDARY INCREMENTS                            ADVPGD1E.857    
CL   TO ZERO.                                                              ADVPGD1E.858    
                                                                           ADVPGD1E.859    
       IF (at_left_of_LPG) THEN                                            ADVPGD1E.860    
          DO I=START_POINT_NO_HALO+FIRST_ROW_PT-1,                         ADVPGD1E.861    
     &         END_P_POINT_NO_HALO,ROW_LENGTH                              ADVPGD1E.862    
            FIELD_INC(I,K)=0.                                              ADVPGD1E.863    
          ENDDO                                                            ADVPGD1E.864    
        ENDIF                                                              ADVPGD1E.865    
                                                                           ADVPGD1E.866    
        IF (at_right_of_LPG) THEN                                          ADVPGD1E.867    
          DO I=START_POINT_NO_HALO+LAST_ROW_PT-1,                          ADVPGD1E.868    
     &         END_P_POINT_NO_HALO,ROW_LENGTH                              ADVPGD1E.869    
            FIELD_INC(I,K)=0.                                              ADVPGD1E.870    
          ENDDO                                                            ADVPGD1E.871    
        ENDIF                                                              ADVPGD1E.872    
                                                                           ADVPGD1E.873    
*ENDIF                                                                     ADVPGD1E.874    
      ENDDO !DO K=1,P_LEVELS                                               APB3F405.233    
                                                                           APB3F405.234    
      ENDIF !IF(L_SECOND)                                                  APB3F405.235    
                                                                           ADVPGD1E.876    
CL    END OF ROUTINE ADV_P_GD                                              ADVPGD1E.877    
                                                                           ADVPGD1E.878    
      RETURN                                                               ADVPGD1E.879    
      END                                                                  ADVPGD1E.880    
*ENDIF                                                                     ADVPGD1E.881    
*ENDIF                                                                     ADVPGD1E.882