*IF DEF,A12_1C,OR,DEF,A12_1D                                               ATJ0F402.11     
*IF DEF,MPP                                                                ATJ0F402.12     
C *****************************COPYRIGHT******************************     QTADV1C.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    QTADV1C.4      
C                                                                          QTADV1C.5      
C Use, duplication or disclosure of this code is subject to the            QTADV1C.6      
C restrictions as set forth in the contract.                               QTADV1C.7      
C                                                                          QTADV1C.8      
C                Meteorological Office                                     QTADV1C.9      
C                London Road                                               QTADV1C.10     
C                BRACKNELL                                                 QTADV1C.11     
C                Berkshire UK                                              QTADV1C.12     
C                RG12 2SZ                                                  QTADV1C.13     
C                                                                          QTADV1C.14     
C If no contract has been raised with this copy of the code, the use,      QTADV1C.15     
C duplication or disclosure of it is strictly prohibited.  Permission      QTADV1C.16     
C to do so must first be obtained in writing from the Head of Numerical    QTADV1C.17     
C Modelling at the above address.                                          QTADV1C.18     
C ******************************COPYRIGHT******************************    QTADV1C.19     
CLL   SUBROUTINE QT_ADV -------------------------------------------        QTADV1C.20     
CLL                                                                        QTADV1C.21     
CLL   PURPOSE:  CALCULATES MASS-WEIGHTED INCREMENTS TO QT                  QTADV1C.22     
CLL             DUE TO ADVECTION  BY USING EQUATION (36)                   QTADV1C.23     
CLL             TO CALCULATE PROVISIONAL VALUES OF QT AT                   QTADV1C.24     
CLL             THE NEW TIME-LEVEL, AND THEN RECALCULATING THE             QTADV1C.25     
CLL             ADVECTION TERMS ON THE RIGHT-HAND SIDE OF  (36)            QTADV1C.26     
CLL             USING THESE PROVISIONAL VALUES. THE FINAL INCREMENTS ARE   QTADV1C.27     
CLL             CALCULATED AS IN EQUATION (40). THOSE REQUIRING            QTADV1C.28     
CLL             FILTERING ARE FILTERED, THE INCREMENTS                     QTADV1C.29     
CLL             ARE ADDED ONTO THE FIELDS USING (40).                      QTADV1C.30     
CLL             IF RUNNING A GLOBAL MODEL POLAR IS CALLED                  QTADV1C.31     
CLL             TO UPDATE POLAR VALUES.                                    QTADV1C.32     
CLL   NOT SUITABLE FOR SINGLE COLUMN USE.                                  QTADV1C.33     
CLL   VERSION FOR CRAY Y-MP                                                QTADV1C.34     
CLL                                                                        QTADV1C.35     
CLL   WRITTEN BY M.H MAWSON.                                               QTADV1C.36     
CLL   MPP CODE ADDED BY P.BURTON                                           QTADV1C.37     
CLL                                                                        QTADV1C.38     
CLL  MODEL            MODIFICATION HISTORY FROM MODEL VERSION 4.1:         QTADV1C.39     
CLL VERSION  DATE                                                          QTADV1C.40     
CLL 4.1      29/11/95 New version of routine specifically for MPP          QTADV1C.41     
CLL                   Fourth order MPP code by Roar Skalin                 QTADV1C.42     
CLL                                                      P.Burton          QTADV1C.43     
!LL   4.2    16/08/96  Add TYPFLDPT arguments to FILTER subroutine         APB0F402.24     
!LL                    and make the FILTER_WAVE_NUMBER arrays              APB0F402.25     
!LL                    globally sized.                   P.Burton          APB0F402.26     
!LL   4.2    10/01/97  Initialise unprocessed points in QT_PROV.           ADR2F402.11     
!LL                    D. Robinson.                                        ADR2F402.12     
!LL 4.3      24/04/97 Fixes to 4th order calculations   P.Burton           GPB5F403.6      
C     vn4.3    Mar. 97   T3E migration : optimisation changes              GSS1F403.688    
C                                       D.Salmond                          GSS1F403.689    
CLL                                                                        QTADV1C.44     
CLL   PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4,       QTADV1C.45     
CLL                         STANDARD B.                                    QTADV1C.46     
CLL                                                                        QTADV1C.47     
CLL   SYSTEM COMPONENTS COVERED: P121                                      QTADV1C.48     
CLL                                                                        QTADV1C.49     
CLL   SYSTEM TASK: P1                                                      QTADV1C.50     
CLL                                                                        QTADV1C.51     
CLL   DOCUMENTATION:       THE EQUATIONS USED ARE (36) AND (40)            QTADV1C.52     
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10     QTADV1C.53     
CLL                        M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON           QTADV1C.54     
CLLEND-------------------------------------------------------------        QTADV1C.55     
                                                                           QTADV1C.56     
C*L   ARGUMENTS:---------------------------------------------------        QTADV1C.57     

      SUBROUTINE QT_ADV                                                     1,33QTADV1C.58     
     1              (QT,PSTAR_OLD,PSTAR,U_MEAN,V_MEAN,                     QTADV1C.59     
     2              SEC_P_LATITUDE,ETADOT_MEAN,RS,DELTA_AK,DELTA_BK,       QTADV1C.60     
     3              LATITUDE_STEP_INVERSE,ADVECTION_TIMESTEP,NU_BASIC,     QTADV1C.61     
     4              LONGITUDE_STEP_INVERSE,NORTHERN_FILTERED_P_ROW,        QTADV1C.62     
     5              SOUTHERN_FILTERED_P_ROW,Q_LEVELS,P_LEVELS,             QTADV1C.63     
     6              U_FIELD,P_FIELD,ROW_LENGTH,                            QTADV1C.64     
*CALL ARGFLDPT                                                             QTADV1C.65     
     7              TRIGS,IFAX,FILTER_WAVE_NUMBER_P_ROWS,SEC_U_LATITUDE,   QTADV1C.66     
     8              AKH,BKH,L_SECOND,                                      GSS1F403.690    
     9              extended_address,                                      GSS1F403.691    
     &              LWHITBROM)                                             GSS1F403.692    
                                                                           QTADV1C.68     
      IMPLICIT NONE                                                        QTADV1C.69     
                                                                           QTADV1C.70     
! All TYPFLDPT arguments are intent IN                                     QTADV1C.71     
*CALL TYPFLDPT                                                             QTADV1C.72     
                                                                           QTADV1C.73     
      INTEGER                                                              QTADV1C.74     
     *  P_FIELD            !IN DIMENSION OF FIELDS ON PRESSSURE GRID.      QTADV1C.75     
     *, U_FIELD            !IN DIMENSION OF FIELDS ON VELOCITY GRID        QTADV1C.76     
     *, P_LEVELS           !IN NUMBER OF PRESSURE LEVELS.                  QTADV1C.77     
     *, Q_LEVELS           !IN NUMBER OF MOIST LEVELS.                     QTADV1C.78     
     *, ROW_LENGTH         !IN NUMBER OF POINTS PER ROW                    QTADV1C.79     
     *, NORTHERN_FILTERED_P_ROW !IN ROW ON WHICH FILTERING STOPS           QTADV1C.80     
     *                          ! MOVING TOWARDS EQUATOR                   QTADV1C.81     
     *, SOUTHERN_FILTERED_P_ROW !IN ROW ON WHICH FILTERING STARTS AGAIN    QTADV1C.82     
     *                          ! MOVING TOWARDS SOUTH POLE                QTADV1C.83     
     &, FILTER_WAVE_NUMBER_P_ROWS(GLOBAL_P_FIELD/GLOBAL_ROW_LENGTH)        APB0F402.27     
     &       ! LAST WAVE NUMBER NOT TO BE CHOPPED                          APB0F402.28     
     *, IFAX(10)           !IN HOLDS FACTORS OF ROW_LENGTH USED BY         QTADV1C.86     
     *                     ! FILTERING.                                    QTADV1C.87     
                                                                           QTADV1C.88     
C LOGICAL VARIABLE                                                         QTADV1C.89     
      LOGICAL                                                              QTADV1C.90     
     *  L_SECOND     ! SET TO TRUE IF NU_BASIC IS ZERO.                    QTADV1C.91     
     & ,LWHITBROM    ! LOGICAL SWITCH FOR WHITE & BROMLEY                  QTADV1C.92     
      INTEGER extended_address(P_FIELD)                                    GSS1F403.693    
                                                                           QTADV1C.93     
      REAL                                                                 QTADV1C.94     
     * U_MEAN(U_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED U VELOCITY      QTADV1C.95     
     *                          !   FROM ADJUSTMENT STEP                   QTADV1C.96     
     *,V_MEAN(U_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED V VELOCITY      QTADV1C.97     
     *                          !   * COS(LAT) FROM ADJUSTMENT STEP        QTADV1C.98     
     *,ETADOT_MEAN(P_FIELD,P_LEVELS)  !IN AVERAGED MASS-WEIGHTED           QTADV1C.99     
     *                          !VERTICAL VELOCITY FROM ADJUSTMENT STEP    QTADV1C.100    
     *,PSTAR(P_FIELD)           !IN PSTAR FIELD AT NEW TIME-LEVEL          QTADV1C.101    
     *,PSTAR_OLD(P_FIELD)       !IN PSTAR AT PREVIOUS TIME-LEVEL           QTADV1C.102    
     *,RS(P_FIELD,P_LEVELS)     !IN RS FIELD                               QTADV1C.103    
                                                                           QTADV1C.104    
      REAL                                                                 QTADV1C.105    
     * DELTA_AK(P_LEVELS)      !IN    LAYER THICKNESS                      QTADV1C.106    
     *,DELTA_BK(P_LEVELS)      !IN    LAYER THICKNESS                      QTADV1C.107    
     *,AKH(P_LEVELS+1)         !IN HYBRID CO-ORDINATE AT HALF LEVELS       QTADV1C.108    
     *,BKH(P_LEVELS+1)         !IN HYBRID CO-ORDINATE AT HALF LEVELS       QTADV1C.109    
     *,SEC_P_LATITUDE(P_FIELD) !IN  1/COS(LAT) AT P POINTS (2-D ARRAY)     QTADV1C.110    
     *,SEC_U_LATITUDE(U_FIELD) !IN  1/COS(LAT) AT U POINTS (2-D ARRAY)     QTADV1C.111    
     *,LONGITUDE_STEP_INVERSE  !IN 1/(DELTA LAMDA)                         QTADV1C.112    
     *,LATITUDE_STEP_INVERSE   !IN 1/(DELTA PHI)                           QTADV1C.113    
     *,ADVECTION_TIMESTEP      !IN                                         QTADV1C.114    
     *,NU_BASIC                !IN STANDARD NU TERM FOR MODEL RUN.         QTADV1C.115    
     *,TRIGS(ROW_LENGTH)       !IN HOLDS TRIGONOMETRIC FUNCTIONS USED      QTADV1C.116    
     *                         ! IN FILTERING.                             QTADV1C.117    
                                                                           QTADV1C.118    
      REAL                                                                 QTADV1C.119    
     * QT(P_FIELD,Q_LEVELS)    !INOUT QT FIELD.                            QTADV1C.120    
     *                         ! MASS-WEIGHTED ON OUTPUT.                  QTADV1C.121    
                                                                           QTADV1C.122    
C*L   DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE-----------------    QTADV1C.123    
C DEFINE LOCAL ARRAYS: 23 ARE REQUIRED                                     QTADV1C.124    
                                                                           QTADV1C.125    
      REAL                                                                 QTADV1C.126    
     * QT_FIRST_INC(P_FIELD,Q_LEVELS) ! HOLDS QT INCREMENT                 QTADV1C.127    
     *                       ! RETURNED BY FIRST CALL TO ADV_P_GD          QTADV1C.128    
     *,QT_SECOND_INC(P_FIELD)! HOLDS QT INCREMENT                          QTADV1C.129    
     *                       !RETURNED BY SECOND CALL TO ADV_P_GD          QTADV1C.130    
     *,QT_PROV(P_FIELD,Q_LEVELS)      ! HOLDS PROVISIONAL VALUE OF QT      QTADV1C.131    
                                                                           QTADV1C.132    
                                                                           QTADV1C.133    
      REAL                                                                 QTADV1C.134    
     * NUX(P_FIELD,Q_LEVELS)     ! COURANT NUMBER DEPENDENT NU AT P PTS    QTADV1C.135    
     *                   ! IN EAST-WEST ADVECTION.                         QTADV1C.136    
     *,NUY(P_FIELD,Q_LEVELS)     ! COURANT NUMBER DEPENDENT NU AT P PTS    QTADV1C.137    
     *                   ! IN NORTH-SOUTH ADVECTION.                       QTADV1C.138    
                                                                           QTADV1C.139    
      REAL NUX_MIN(upd_P_ROWS),  ! minimum value of NUX along a row        QTADV1C.140    
     &     NUY_MIN(ROW_LENGTH)   ! min of NUY along a column               QTADV1C.141    
                                                                           QTADV1C.142    
      REAL                                                                 QTADV1C.143    
     & ZERO(P_FIELD)              ! ARRAY OF ZEROES.                       QTADV1C.144    
     *,QT_INCREMENT(P_FIELD,Q_LEVELS)                                      QTADV1C.145    
                                                                           QTADV1C.146    
      REAL                                                                 QTADV1C.147    
     * BRSP(P_FIELD,Q_LEVELS) !MASS TERM AT LEVEL K                        QTADV1C.148    
                                                                           QTADV1C.149    
! Work space required to allow the use of Fourth Order Advection           QTADV1C.150    
! U/V_MEAN_COPY and Q_COPY arrays are defined with an extra halo           QTADV1C.151    
! this is required for the bigger stencil of the 4th order operator.       QTADV1C.152    
      REAL  U_MEAN_COPY((ROW_LENGTH+2*extra_EW_Halo)*                      QTADV1C.153    
     &                  (tot_U_ROWS+2*extra_NS_Halo),P_LEVELS),            QTADV1C.154    
     &  !    Copy of U_MEAN with extra halo space for 4th order            QTADV1C.155    
     &      V_MEAN_COPY((ROW_LENGTH+2*extra_EW_Halo)*                      QTADV1C.156    
     &                  (tot_U_ROWS+2*extra_NS_Halo),P_LEVELS),            QTADV1C.157    
     &  !    Copy of V_MEAN with extra halo space for 4th order            QTADV1C.158    
     &      Q_COPY((ROW_LENGTH+2*extra_EW_Halo)*                           QTADV1C.159    
     &             (tot_P_ROWS+2*extra_NS_Halo),Q_LEVELS)                  QTADV1C.160    
     &  !    Copy of QT with extra halo space for 4th order                QTADV1C.161    
                                                                           QTADV1C.162    
      INTEGER  extended_P_FIELD,                                           QTADV1C.163    
     &         extended_U_FIELD                                            QTADV1C.164    
!  These are the sizes of the arrays with the extra halos                  QTADV1C.165    
                                                                           QTADV1C.166    
C*---------------------------------------------------------------------    QTADV1C.167    
C DEFINE LOCAL VARIABLES                                                   QTADV1C.168    
      INTEGER                                                              QTADV1C.169    
     *  P_POINTS_UPDATE    ! NUMBER OF P POINTS TO BE UPDATED.             QTADV1C.170    
     *                     !  = ROWS*ROWLENGTH                             QTADV1C.171    
     *, U_POINTS_UPDATE    ! NUMBER OF U POINTS TO BE UPDATED.             QTADV1C.172    
     *                     !  = (ROWS-1)*ROWLENGTH                         QTADV1C.173    
     *, P_POINTS_REQUIRED  ! NUMBER OF P POINTS AT WHICH VALUES ARE        QTADV1C.174    
     *                     ! NEEDED TO UPDATE AT P_POINTS_UPDATE           QTADV1C.175    
     *, U_POINTS_REQUIRED  ! NUMBER OF U POINTS AT WHICH VALUES ARE        QTADV1C.176    
     *                     ! NEEDED TO UPDATE AT U_POINTS_UPDATE           QTADV1C.177    
     *, START_U_REQUIRED   ! FIRST U POINT OF VALUES REQUIRED TO UPDATE    QTADV1C.178    
     *                     ! AT P POINTS UPDATE.                           QTADV1C.179    
     *, END_U_REQUIRED     ! LAST U POINT OF REQUIRED VALUES.              QTADV1C.180    
                                                                           QTADV1C.181    
      INTEGER info  ! return code from comms                               QTADV1C.182    
                                                                           QTADV1C.183    
C REAL SCALARS                                                             QTADV1C.184    
      REAL                                                                 QTADV1C.185    
     & SCALAR1,SCALAR2,TIMESTEP                                            QTADV1C.186    
                                                                           QTADV1C.187    
C COUNT VARIABLES FOR DO LOOPS ETC.                                        QTADV1C.188    
      INTEGER                                                              QTADV1C.189    
     &  I,J,K1,IK,K                                                        QTADV1C.190    
     *, FILTER_SPACE ! HORIZONTAL DIMENSION OF SPACE NEEDED IN FILTERING   QTADV1C.191    
     *               ! ROUTINE.                                            QTADV1C.192    
     &, I_start,I_end                                                      QTADV1C.193    
                                                                           QTADV1C.194    
                                                                           QTADV1C.195    
C*L   EXTERNAL SUBROUTINE CALLS:---------------------------------------    QTADV1C.196    
      EXTERNAL ADV_P_GD,POLAR,UV_TO_P,FILTER                               QTADV1C.197    
*IF DEF,CRAY                                                               QTADV1C.198    
      INTEGER ISMIN                                                        QTADV1C.199    
      EXTERNAL ISMIN                                                       QTADV1C.200    
*ENDIF                                                                     QTADV1C.201    
C*---------------------------------------------------------------------    QTADV1C.202    
                                                                           QTADV1C.203    
CL    MAXIMUM VECTOR LENGTH ASSUMED IS P_FIELD.                            QTADV1C.204    
CL---------------------------------------------------------------------    QTADV1C.205    
CL    INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS:                       QTADV1C.206    
CL---------------------------------------------------------------------    QTADV1C.207    
CL                                                                         QTADV1C.208    
CL---------------------------------------------------------------------    QTADV1C.209    
CL    SECTION 1.     INITIALISATION                                        QTADV1C.210    
CL---------------------------------------------------------------------    QTADV1C.211    
C INCLUDE LOCAL CONSTANTS FROM GENERAL CONSTANTS BLOCK                     QTADV1C.212    
                                                                           QTADV1C.213    
      P_POINTS_UPDATE   = upd_P_ROWS*ROW_LENGTH                            QTADV1C.214    
      U_POINTS_UPDATE   = upd_U_ROWS*ROW_LENGTH                            QTADV1C.215    
      P_POINTS_REQUIRED = (upd_P_ROWS+2)*ROW_LENGTH                        QTADV1C.216    
      U_POINTS_REQUIRED = (upd_U_ROWS+2)*ROW_LENGTH                        QTADV1C.217    
      START_U_REQUIRED  = START_POINT_NO_HALO-ROW_LENGTH                   QTADV1C.218    
      END_U_REQUIRED    = END_U_POINT_NO_HALO+ROW_LENGTH                   QTADV1C.219    
                                                                           QTADV1C.220    
C *IF -DEF,NOWHBR replaced by LWHITBROM logical                            QTADV1C.221    
      IF (LWHITBROM) THEN                                                  QTADV1C.222    
CL    CALCULATE BRSP TERM AT LEVEL K                                       QTADV1C.223    
                                                                           QTADV1C.224    
      K=1                                                                  QTADV1C.225    
! Loop over entire field                                                   QTADV1C.226    
      DO I=FIRST_VALID_PT,LAST_P_VALID_PT                                  QTADV1C.227    
        BRSP(I,K)=(3.*RS(I,K)+RS(I,K+1))*(RS(I,K)-RS(I,K+1))               QTADV1C.228    
     *                *BKH(K+1)*.25*(PSTAR(I)-PSTAR_OLD(I))                QTADV1C.229    
      ENDDO                                                                QTADV1C.230    
      K=Q_LEVELS                                                           QTADV1C.231    
! Loop over entire field                                                   QTADV1C.232    
      DO I=FIRST_VALID_PT,LAST_P_VALID_PT                                  QTADV1C.233    
        BRSP(I,K)=-(3.*RS(I,K)+RS(I,K-1))*(RS(I,K)-RS(I,K-1))              QTADV1C.234    
     *                *BKH(K)*.25*(PSTAR(I)-PSTAR_OLD(I))                  QTADV1C.235    
      ENDDO                                                                QTADV1C.236    
                                                                           QTADV1C.237    
      DO K=2,Q_LEVELS -1                                                   QTADV1C.238    
! Loop over entire field                                                   QTADV1C.239    
        DO I=FIRST_VALID_PT,LAST_P_VALID_PT                                QTADV1C.240    
          BRSP(I,K)=((3.*RS(I,K)+RS(I,K+1))*(RS(I,K)-RS(I,K+1))*BKH(K+1)   QTADV1C.241    
     *              *.25*(PSTAR(I)-PSTAR_OLD(I)))                          QTADV1C.242    
     *              -((3.*RS(I,K)+RS(I,K-1))*(RS(I,K)-RS(I,K-1))*BKH(K)    QTADV1C.243    
     *              *.25*(PSTAR(I)-PSTAR_OLD(I)))                          QTADV1C.244    
        ENDDO                                                              QTADV1C.245    
                                                                           QTADV1C.246    
      ENDDO                                                                QTADV1C.247    
      END IF                                                               QTADV1C.248    
C *ENDIF                                                                   QTADV1C.249    
                                                                           QTADV1C.250    
! Loop over entire field                                                   QTADV1C.251    
      DO I=FIRST_VALID_PT,LAST_P_VALID_PT                                  QTADV1C.252    
        ZERO(I) = 0.                                                       QTADV1C.253    
      ENDDO                                                                QTADV1C.254    
                                                                           QTADV1C.255    
! In order to use the same call to adv_p_gd for both the second and        QTADV1C.256    
! fourth order advection, U/V_MEAN are copied into _COPY arrays.           QTADV1C.257    
! In the case of second order advection some of the work space is          QTADV1C.258    
! wasted as there is more halo than we need.                               QTADV1C.259    
                                                                           QTADV1C.260    
! Calculate the size of the extended arrays which contain an               QTADV1C.261    
! extra halo:                                                              QTADV1C.262    
      extended_U_FIELD=(ROW_LENGTH+2*extra_EW_Halo)*                       QTADV1C.263    
     &                 (tot_U_ROWS+2*extra_NS_Halo)                        QTADV1C.264    
      extended_P_FIELD=(ROW_LENGTH+2*extra_EW_Halo)*                       QTADV1C.265    
     &                 (tot_P_ROWS+2*extra_NS_Halo)                        QTADV1C.266    
                                                                           QTADV1C.267    
      IF (L_SECOND) THEN                                                   QTADV1C.268    
                                                                           QTADV1C.269    
! Copy U/V_MEAN to U/V_MEAN_COPY with the same sized halos                 QTADV1C.270    
        CALL COPY_FIELD(U_MEAN,U_MEAN_COPY,                                QTADV1C.271    
     &                  U_FIELD,extended_U_FIELD,                          QTADV1C.272    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    QTADV1C.273    
     &                  EW_Halo,NS_Halo,                                   QTADV1C.274    
     &                  EW_Halo,NS_Halo,                                   QTADV1C.275    
     &                  .FALSE.)                                           QTADV1C.276    
        CALL COPY_FIELD(V_MEAN,V_MEAN_COPY,                                QTADV1C.277    
     &                  U_FIELD,extended_U_FIELD,                          QTADV1C.278    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    QTADV1C.279    
     &                  EW_Halo,NS_Halo,                                   QTADV1C.280    
     &                  EW_Halo,NS_Halo,                                   QTADV1C.281    
     &                  .FALSE.)                                           QTADV1C.282    
                                                                           QTADV1C.283    
      ELSE  ! if its fourth order:                                         QTADV1C.284    
                                                                           QTADV1C.285    
        CALL COPY_FIELD(U_MEAN,U_MEAN_COPY,                                QTADV1C.286    
     &                  U_FIELD,extended_U_FIELD,                          QTADV1C.287    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    QTADV1C.288    
     &                  EW_Halo,NS_Halo,                                   QTADV1C.289    
     &                  halo_4th,halo_4th,                                 QTADV1C.290    
     &                  .TRUE.)                                            QTADV1C.291    
        CALL COPY_FIELD(V_MEAN,V_MEAN_COPY,                                QTADV1C.292    
     &                  U_FIELD,extended_U_FIELD,                          QTADV1C.293    
     &                  ROW_LENGTH,tot_U_ROWS,P_LEVELS,                    QTADV1C.294    
     &                  EW_Halo,NS_Halo,                                   QTADV1C.295    
     &                  halo_4th,halo_4th,                                 QTADV1C.296    
     &                  .TRUE.)                                            QTADV1C.297    
        CALL COPY_FIELD(QT,Q_COPY,                                         QTADV1C.298    
     &                  P_FIELD,extended_P_FIELD,                          QTADV1C.299    
     &                  ROW_LENGTH,tot_P_ROWS,Q_LEVELS,                    QTADV1C.300    
     &                  EW_Halo,NS_Halo,                                   QTADV1C.301    
     &                  halo_4th,halo_4th,                                 QTADV1C.302    
     &                  .TRUE.)                                            QTADV1C.303    
                                                                           QTADV1C.304    
       ENDIF ! IF (L_SECOND)                                               QTADV1C.305    
                                                                           QTADV1C.306    
CL LOOP OVER Q_LEVELS+1.                                                   QTADV1C.307    
CL    ON 1 TO Q_LEVELS PROVISIONAL VALUES OF THE FIELD ARE CALCULATED.     QTADV1C.308    
CL    ON 2 TO Q_LEVELS+1 THE FINAL INCREMENTS ARE CALCULATED AND ADDED     QTADV1C.309    
CL    ON. THE REASON FOR THIS LOGIC IS THAT THE PROVISIONAL VALUE AT       QTADV1C.310    
CL    LEVEL K+1 IS NEEDED BEFORE THE FINAL INCREMENT AT LEVEL K CAN BE     QTADV1C.311    
CL    CALCULATED.                                                          QTADV1C.312    
                                                                           QTADV1C.313    
      DO K=1,Q_LEVELS+1                                                    QTADV1C.314    
                                                                           QTADV1C.315    
        TIMESTEP = ADVECTION_TIMESTEP                                      QTADV1C.316    
                                                                           QTADV1C.317    
CL IF NOT AT Q_LEVELS+1 THEN                                               QTADV1C.318    
        IF(K.LE.Q_LEVELS) THEN                                             QTADV1C.319    
                                                                           QTADV1C.320    
CL---------------------------------------------------------------------    QTADV1C.321    
CL    SECTION 2.     CALCULATE COURANT NUMBER DEPENDENT NU IF IN           QTADV1C.322    
CL                   FORECAST MODE. CALCULATE PROVISIONAL VALUES OF        QTADV1C.323    
CL                   QT AT NEW TIME-LEVEL.                                 QTADV1C.324    
CL---------------------------------------------------------------------    QTADV1C.325    
                                                                           QTADV1C.326    
C ---------------------------------------------------------------------    QTADV1C.327    
CL    SECTION 2.1    SET NU TO NU_BASIC DEPENDENT ON MAX COURANT           QTADV1C.328    
CL                   NUMBER.                                               QTADV1C.329    
C ---------------------------------------------------------------------    QTADV1C.330    
CL    IF NU_BASIC NOT SET TO ZERO                                          QTADV1C.331    
          IF(.NOT.L_SECOND) THEN                                           QTADV1C.332    
CL    THEN SET NU DEPENDING ON NU_BASIC AND MAX                            QTADV1C.333    
CL    COURANT NUMBER.                                                      QTADV1C.334    
CL    CALCULATE COURANT NUMBER                                             QTADV1C.335    
C NOTE: RS AND TRIG TERMS WILL BE INCLUDED AFTER INTERPOLATION TO P        QTADV1C.336    
C       GRID.                                                              QTADV1C.337    
CL    CALL UV_TO_P TO MOVE MEAN VELOCITIES ONTO P GRID                     QTADV1C.338    
                                                                           QTADV1C.339    
          CALL UV_TO_P(U_MEAN(START_U_REQUIRED,K),                         QTADV1C.340    
     *                 NUX(START_POINT_NO_HALO,K),U_POINTS_REQUIRED,       QTADV1C.341    
     *                 P_POINTS_UPDATE,ROW_LENGTH,upd_P_ROWS+1)            QTADV1C.342    
                                                                           QTADV1C.343    
          CALL UV_TO_P(V_MEAN(START_U_REQUIRED,K),                         QTADV1C.344    
     *                 NUY(START_POINT_NO_HALO,K),U_POINTS_REQUIRED,       QTADV1C.345    
     *                 P_POINTS_UPDATE,ROW_LENGTH,upd_P_ROWS+1)            QTADV1C.346    
                                                                           QTADV1C.347    
CL    CALCULATE NU FROM COURANT NUMBER INCLUDING TRIG AND RS TERMS.        QTADV1C.348    
          DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                     QTADV1C.349    
            NUX(I,K) = NUX(I,K)*LONGITUDE_STEP_INVERSE                     QTADV1C.350    
            NUY(I,K) = NUY(I,K)*LATITUDE_STEP_INVERSE                      QTADV1C.351    
            SCALAR1 = TIMESTEP/(RS(I,K)*                                   QTADV1C.352    
     *                RS(I,K)*(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I)))      QTADV1C.353    
            SCALAR2 = SEC_P_LATITUDE(I)*SCALAR1                            QTADV1C.354    
            SCALAR1 = SCALAR1*SCALAR1                                      QTADV1C.355    
            SCALAR2 = SCALAR2*SCALAR2                                      QTADV1C.356    
            NUX(I,K) = (1. - NUX(I,K)*NUX(I,K)*SCALAR2)*NU_BASIC           QTADV1C.357    
            NUY(I,K) = (1. - NUY(I,K)*NUY(I,K)*SCALAR1)*NU_BASIC           QTADV1C.358    
          ENDDO                                                            QTADV1C.359    
                                                                           QTADV1C.360    
! Set NUX equal to minimum value along each row                            QTADV1C.361    
                                                                           QTADV1C.362    
          DO J=FIRST_ROW,FIRST_ROW+upd_P_ROWS-1                            QTADV1C.363    
            I_start=(J-1)*ROW_LENGTH+FIRST_ROW_PT ! start and end of       QTADV1C.364    
            I_end=(J-1)*ROW_LENGTH+LAST_ROW_PT    ! row, missing halos.    QTADV1C.365    
                                                                           QTADV1C.366    
! Calculate minimum along this row                                         QTADV1C.367    
*IF DEF,CRAY                                                               QTADV1C.368    
            IK=ISMIN(I_end-I_start+1,NUX(I_start,K),1)                     QTADV1C.369    
            SCALAR1=NUX(IK+I_start-1,K)                                    QTADV1C.370    
*ELSE                                                                      QTADV1C.371    
            SCALAR1=NUX(I_start,K)                                         QTADV1C.372    
            DO I=I_start+1,I_end                                           QTADV1C.373    
              IF (NUX(I,K) .LT. SCALAR1) SCALAR1=NUX(I,K)                  QTADV1C.374    
            ENDDO                                                          QTADV1C.375    
*ENDIF                                                                     QTADV1C.376    
            NUX_MIN(J-FIRST_ROW+1)=SCALAR1                                 QTADV1C.377    
! The indexing of NUX_MIN goes from 1..ROWS                                QTADV1C.378    
          ENDDO ! J : loop over rows                                       QTADV1C.379    
                                                                           QTADV1C.380    
! So far we have only calculated the minimum along our local               QTADV1C.381    
! part of the row. Now we must find the minimum of all the                 QTADV1C.382    
! local minimums along the row                                             QTADV1C.383    
          CALL GCG_RMIN(upd_P_ROWS,GC_ROW_GROUP,info,NUX_MIN)              QTADV1C.384    
                                                                           QTADV1C.385    
! and now set all values of NUX to the minimum along the row               QTADV1C.386    
          DO J=FIRST_ROW,FIRST_ROW+upd_P_ROWS-1                            QTADV1C.387    
            IF (NUX_MIN(J-FIRST_ROW+1) .LT. 0.0)                           QTADV1C.388    
     &        NUX_MIN(J-FIRST_ROW+1)=0.0                                   QTADV1C.389    
                                                                           QTADV1C.390    
            I_start=(J-1)*ROW_LENGTH+1  ! beginning and                    QTADV1C.391    
            I_end=J*ROW_LENGTH          ! end of row                       QTADV1C.392    
                                                                           QTADV1C.393    
            DO I=I_start,I_end                                             QTADV1C.394    
              NUX(I,K)=NUX_MIN(J-FIRST_ROW+1)                              QTADV1C.395    
            ENDDO                                                          QTADV1C.396    
                                                                           QTADV1C.397    
          ENDDO ! J : loop over rows                                       QTADV1C.398    
                                                                           QTADV1C.399    
! Set NUY equal to minimum value along each column                         QTADV1C.400    
                                                                           QTADV1C.401    
          DO J=FIRST_ROW_PT,LAST_ROW_PT                                    GPB5F403.7      
            I_start=(FIRST_ROW-1)*ROW_LENGTH+J                             QTADV1C.404    
! I_start points to the beginning of column J                              QTADV1C.405    
                                                                           QTADV1C.406    
! Calculate the minimum along this column                                  QTADV1C.407    
*IF DEF,CRAY                                                               QTADV1C.408    
            IK=ISMIN(upd_P_ROWS,NUY(I_start,K),ROW_LENGTH)                 QTADV1C.409    
            SCALAR1=NUY((IK-1)*ROW_LENGTH+I_start,K)                       GPB5F403.8      
*ELSE                                                                      QTADV1C.411    
            I_end=I_start+(upd_P_ROWS-1)*ROW_LENGTH                        GPB5F403.9      
! I_end points to the end of column J                                      QTADV1C.413    
            SCALAR1=NUY(I_start,K)                                         QTADV1C.414    
            DO I=I_start+ROW_LENGTH,I_end,ROW_LENGTH                       QTADV1C.415    
              IF (NUY(I,K) .LT. SCALAR1) SCALAR1=NUY(I,K)                  QTADV1C.416    
            ENDDO                                                          QTADV1C.417    
*ENDIF                                                                     QTADV1C.418    
            NUY_MIN(J)=SCALAR1                                             QTADV1C.419    
                                                                           QTADV1C.420    
          ENDDO ! J : loop over columns                                    QTADV1C.421    
! Once again, this is only the minimum along our local part                QTADV1C.422    
! of each column. We must now find the miniumum of all the local           QTADV1C.423    
! minimums along the column                                                QTADV1C.424    
          CALL GCG_RMIN(ROW_LENGTH-2*EW_Halo,GC_COL_GROUP,info,            GPB5F403.10     
     &                  NUY_MIN(EW_Halo+1))                                GPB5F403.11     
                                                                           QTADV1C.426    
! and now set all values of NUY to the minimum along the column            QTADV1C.427    
          DO J=FIRST_ROW_PT,LAST_ROW_PT                                    GPB5F403.12     
            IF (NUY_MIN(J) .LT. 0.0) NUY_MIN(J)=0.0                        QTADV1C.430    
                                                                           QTADV1C.431    
            I_start=(FIRST_ROW-1)*ROW_LENGTH+J                             QTADV1C.432    
            I_end=I_start+(upd_P_ROWS-1)*ROW_LENGTH                        GPB5F403.13     
                                                                           QTADV1C.434    
            DO I=I_start,I_end,ROW_LENGTH                                  QTADV1C.435    
              NUY(I,K)=NUY_MIN(J)                                          QTADV1C.436    
            ENDDO                                                          QTADV1C.437    
                                                                           QTADV1C.438    
          ENDDO ! J : loop over columns                                    QTADV1C.439    
                                                                           QTADV1C.440    
        ENDIF  ! IF its fourth order advection                             QTADV1C.441    
CL                                                                         QTADV1C.442    
C ---------------------------------------------------------------------    QTADV1C.443    
CL    SECTION 2.3    CALL ADV_P_GD TO OBTAIN FIRST INCREMENT DUE TO        QTADV1C.444    
CL                   ADVECTION.                                            QTADV1C.445    
C ---------------------------------------------------------------------    QTADV1C.446    
                                                                           QTADV1C.447    
CL    CALL ADV_P_GD FOR QT.                                                QTADV1C.448    
          K1=K+1                                                           QTADV1C.449    
                                                                           QTADV1C.450    
          IF(K.EQ.Q_LEVELS) THEN                                           QTADV1C.451    
          K1=K-1                                                           QTADV1C.452    
          CALL ADV_P_GD(QT(1,K1),QT(1,K),QT(1,K1),                         QTADV1C.453    
     &                  U_MEAN_COPY(1,K),V_MEAN_COPY(1,K),                 QTADV1C.454    
     &                  ETADOT_MEAN(1,K),ZERO,SEC_P_LATITUDE,              QTADV1C.455    
     *                  QT_FIRST_INC(1,K),NUX(1,K),NUY(1,K),P_FIELD,       QTADV1C.456    
     *                  U_FIELD,ROW_LENGTH,                                QTADV1C.457    
*CALL ARGFLDPT                                                             QTADV1C.458    
     &                  TIMESTEP,LATITUDE_STEP_INVERSE,                    QTADV1C.459    
     *                  LONGITUDE_STEP_INVERSE,                            QTADV1C.460    
     &                  SEC_U_LATITUDE,BRSP(1,K),L_SECOND,LWHITBROM,       QTADV1C.461    
     &                  Q_COPY(1,K),extended_P_FIELD,extended_U_FIELD,     GSS1F403.694    
     &                  extended_address)                                  GSS1F403.695    
          ELSE IF(K.EQ.1)THEN                                              QTADV1C.463    
                                                                           QTADV1C.464    
C PASS ANY QT VALUES FOR LEVEL K-1 AS ETADOT AT LEVEL 1                    QTADV1C.465    
C IS SET TO ZERO BY USING ARRAY ZERO.                                      QTADV1C.466    
                                                                           QTADV1C.467    
          CALL ADV_P_GD(QT(1,K1),QT(1,K),QT(1,K1),                         QTADV1C.468    
     &                  U_MEAN_COPY(1,K),V_MEAN_COPY(1,K),                 QTADV1C.469    
     &                  ZERO,ETADOT_MEAN(1,K1),                            QTADV1C.470    
     *                  SEC_P_LATITUDE,QT_FIRST_INC(1,K),                  QTADV1C.471    
     *                  NUX(1,K),NUY(1,K),                                 QTADV1C.472    
     *                  P_FIELD,U_FIELD,ROW_LENGTH,                        QTADV1C.473    
*CALL ARGFLDPT                                                             QTADV1C.474    
     &                  TIMESTEP,                                          QTADV1C.475    
     *                  LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE,      QTADV1C.476    
     &                  SEC_U_LATITUDE,BRSP(1,K),L_SECOND,LWHITBROM,       QTADV1C.477    
     &                  Q_COPY(1,K),extended_P_FIELD,extended_U_FIELD,     GSS1F403.696    
     &                  extended_address)                                  GSS1F403.697    
          ELSE                                                             QTADV1C.479    
          CALL ADV_P_GD(QT(1,K-1),QT(1,K),QT(1,K1),                        QTADV1C.480    
     &                  U_MEAN_COPY(1,K),V_MEAN_COPY(1,K),                 QTADV1C.481    
     &                  ETADOT_MEAN(1,K),ETADOT_MEAN(1,K1),                QTADV1C.482    
     *                  SEC_P_LATITUDE,QT_FIRST_INC(1,K),                  QTADV1C.483    
     *                  NUX(1,K),NUY(1,K),                                 QTADV1C.484    
     *                  P_FIELD,U_FIELD,ROW_LENGTH,                        QTADV1C.485    
*CALL ARGFLDPT                                                             QTADV1C.486    
     &                  TIMESTEP,                                          QTADV1C.487    
     *                  LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE,      QTADV1C.488    
     &                  SEC_U_LATITUDE,BRSP(1,K),L_SECOND,LWHITBROM,       QTADV1C.489    
     &                  Q_COPY(1,K),extended_P_FIELD,extended_U_FIELD,     GSS1F403.698    
     &                  extended_address)                                  GSS1F403.699    
          END IF                                                           QTADV1C.491    
                                                                           QTADV1C.492    
C ---------------------------------------------------------------------    QTADV1C.493    
CL    SECTION 2.4    REMOVE MASS-WEIGHTING FROM INCREMENT AND ADD ONTO     QTADV1C.494    
CL                   FIELD TO OBTAIN PROVISIONAL VALUE.                    QTADV1C.495    
C ---------------------------------------------------------------------    QTADV1C.496    
                                                                           QTADV1C.497    
          DO I=1,START_POINT_NO_HALO-1                                     ADR2F402.13     
            QT_PROV(I,K) = 0.0                                             ADR2F402.14     
          ENDDO                                                            ADR2F402.15     
                                                                           ADR2F402.16     
          DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                     QTADV1C.498    
            SCALAR1 = RS(I,K)*RS(I,K)                                      QTADV1C.499    
     *                      *(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I))        QTADV1C.500    
            QT_FIRST_INC(I,K) = QT_FIRST_INC(I,K)/SCALAR1                  QTADV1C.501    
            QT_PROV(I,K) = QT(I,K)-QT_FIRST_INC(I,K)                       QTADV1C.502    
          ENDDO                                                            QTADV1C.503    
                                                                           ADR2F402.17     
          DO I=END_P_POINT_NO_HALO+1,P_FIELD                               ADR2F402.18     
            QT_PROV(I,K) = 0.0                                             ADR2F402.19     
          ENDDO                                                            ADR2F402.20     
                                                                           ADR2F402.21     
*IF DEF,GLOBAL                                                             QTADV1C.504    
          IF (at_top_of_LPG) THEN                                          QTADV1C.505    
! Do North Pole                                                            QTADV1C.506    
            DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                  QTADV1C.507    
              QT_PROV(I,K) = QT(I,K)                                       QTADV1C.508    
              QT_FIRST_INC(I,K) = -QT_FIRST_INC(I,K)/(RS(I,K)*RS(I,K)      QTADV1C.509    
     &                       *(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I)))      QTADV1C.510    
            ENDDO                                                          QTADV1C.511    
          ENDIF                                                            QTADV1C.512    
                                                                           QTADV1C.513    
          IF (at_base_of_LPG) THEN                                         QTADV1C.514    
! Do South Pole                                                            QTADV1C.515    
            DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1              QTADV1C.516    
              QT_PROV(I,K) = QT(I,K)                                       QTADV1C.517    
              QT_FIRST_INC(I,K) = -QT_FIRST_INC(I,K)/(RS(I,K)*RS(I,K)      QTADV1C.518    
     &                       *(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I)))      QTADV1C.519    
            ENDDO                                                          QTADV1C.520    
          ENDIF                                                            QTADV1C.521    
                                                                           QTADV1C.522    
*ELSE                                                                      QTADV1C.523    
CL    LIMITED AREA MODEL THEN SET PROVISIONAL VALUES ON BOUNDARIES         QTADV1C.524    
CL    EQUAL TO QT AT OLD TIME LEVEL.                                       QTADV1C.525    
      IF (at_top_of_LPG) THEN                                              QTADV1C.526    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      QTADV1C.527    
          QT_PROV(I,K)=QT(I,K)                                             QTADV1C.528    
        ENDDO                                                              QTADV1C.529    
      ENDIF                                                                QTADV1C.530    
      IF (at_base_of_LPG) THEN                                             QTADV1C.531    
        DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                  QTADV1C.532    
          QT_PROV(I,K)=QT(I,K)                                             QTADV1C.533    
        ENDDO                                                              QTADV1C.534    
      ENDIF                                                                QTADV1C.535    
*ENDIF                                                                     QTADV1C.536    
                                                                           QTADV1C.537    
        END IF                                                             QTADV1C.538    
CL END CONDITIONAL ON LEVEL BEING LESS THAN Q_LEVELS+1                     QTADV1C.539    
      ENDDO                                                                QTADV1C.540    
                                                                           QTADV1C.541    
*IF DEF,GLOBAL                                                             QTADV1C.542    
CL    CALL POLAR TO OBTAIN PROVISIONAL VALUE.                              QTADV1C.543    
      CALL POLAR(QT_PROV,QT_FIRST_INC,QT_FIRST_INC,                        QTADV1C.544    
*CALL ARGFLDPT                                                             QTADV1C.545    
     &           P_FIELD,P_FIELD,P_FIELD,                                  QTADV1C.546    
     &           TOP_ROW_START,P_BOT_ROW_START,                            QTADV1C.547    
     &           ROW_LENGTH,Q_LEVELS)                                      QTADV1C.548    
*ENDIF                                                                     QTADV1C.549    
                                                                           QTADV1C.550    
      IF (L_SECOND) THEN                                                   QTADV1C.551    
                                                                           QTADV1C.552    
! Do a halo update on QT_PROV                                              QTADV1C.553    
        CALL SWAPBOUNDS(QT_PROV,ROW_LENGTH,tot_P_ROWS,                     QTADV1C.554    
     &                  EW_Halo,NS_Halo,Q_LEVELS)                          QTADV1C.555    
!        CALL SET_SIDES(QT_PROV,P_FIELD,ROW_LENGTH,                        QTADV1C.556    
!     &                 Q_LEVELS,fld_type_p)                               QTADV1C.557    
                                                                           QTADV1C.558    
      ELSE  ! fourth order advection                                       QTADV1C.559    
                                                                           QTADV1C.560    
! Copy QT_PROV into Q_COPY which has double halos for fourth               QTADV1C.561    
! order advection, and do swap to fill these halos                         QTADV1C.562    
        CALL COPY_FIELD(QT_PROV,Q_COPY,                                    QTADV1C.563    
     &                  P_FIELD,extended_P_FIELD,                          QTADV1C.564    
     &                  ROW_LENGTH,tot_P_ROWS,Q_LEVELS,                    QTADV1C.565    
     &                  EW_Halo,NS_Halo,                                   QTADV1C.566    
     &                  halo_4th,halo_4th,                                 QTADV1C.567    
     &                  .TRUE.)                                            QTADV1C.568    
                                                                           QTADV1C.569    
      ENDIF                                                                QTADV1C.570    
                                                                           QTADV1C.571    
CL BEGIN CONDITIONAL ON LEVEL BEING GREATER THAN 1                         QTADV1C.572    
cmic$ do parallel                                                          QTADV1C.573    
      DO K=1,Q_LEVELS+1                                                    QTADV1C.574    
        IF(K.GT.1) THEN                                                    QTADV1C.575    
CL---------------------------------------------------------------------    QTADV1C.576    
CL    SECTION 3.     ALL WORK IN THIS SECTION PERFORMED AT LEVEL-1.        QTADV1C.577    
CL                   CALCULATE SECOND INCREMENT DUE TO ADVECTION.          QTADV1C.578    
CL                   CALCULATE TOTAL INCREMENT TO FIELD AND FILTER         QTADV1C.579    
CL                   WHERE NECESSARY THEN UPDATE FIELD.                    QTADV1C.580    
CL                   THE POLAR INCREMENTS ARE THEN CALCULATED AND ADDED    QTADV1C.581    
CL                   ON BY CALLING POLAR.                                  QTADV1C.582    
CL---------------------------------------------------------------------    QTADV1C.583    
                                                                           QTADV1C.584    
          TIMESTEP = ADVECTION_TIMESTEP                                    QTADV1C.585    
                                                                           QTADV1C.586    
C ---------------------------------------------------------------------    QTADV1C.587    
CL    SECTION 3.1    CALL ADV_P_GD TO OBTAIN SECOND INCREMENT DUE TO       QTADV1C.588    
CL                   ADVECTION.                                            QTADV1C.589    
C ---------------------------------------------------------------------    QTADV1C.590    
                                                                           QTADV1C.591    
          K1=K-1                                                           QTADV1C.592    
C K1 HOLDS K-1.                                                            QTADV1C.593    
                                                                           QTADV1C.594    
          IF(K.GT.Q_LEVELS) THEN                                           QTADV1C.595    
C THE ZERO VERTICAL FLUX AT THE TOP IS ENSURED BY PASSING ETADOT AS        QTADV1C.596    
C ZERO.                                                                    QTADV1C.597    
                                                                           QTADV1C.598    
          CALL ADV_P_GD(QT_PROV(1,K-2),QT_PROV(1,K-1),                     QTADV1C.599    
     *                  QT_PROV(1,K-2),                                    QTADV1C.600    
     &                  U_MEAN_COPY(1,K1),V_MEAN_COPY(1,K1),               QTADV1C.601    
     &                  ETADOT_MEAN(1,K-1),                                QTADV1C.602    
     *                  ZERO,SEC_P_LATITUDE,                               QTADV1C.603    
     *                  QT_SECOND_INC,NUX(1,K-1),NUY(1,K-1),P_FIELD,       QTADV1C.604    
     *                  U_FIELD,ROW_LENGTH,                                QTADV1C.605    
*CALL ARGFLDPT                                                             QTADV1C.606    
     &                  TIMESTEP,LATITUDE_STEP_INVERSE,                    QTADV1C.607    
     *                  LONGITUDE_STEP_INVERSE,SEC_U_LATITUDE,             QTADV1C.608    
     &                  BRSP(1,K-1),L_SECOND,LWHITBROM,                    QTADV1C.609    
     &                  Q_COPY(1,K-1),extended_P_FIELD,extended_U_FIELD,   GSS1F403.700    
     &                  extended_address)                                  GSS1F403.701    
                                                                           QTADV1C.611    
          ELSE IF(K.EQ.2) THEN                                             QTADV1C.612    
                                                                           QTADV1C.613    
C THE ZERO VERTICAL FLUX AT THE BOTTOM IS ENSURED BY PASSING ETADOT AS     QTADV1C.614    
C ZERO.                                                                    QTADV1C.615    
                                                                           QTADV1C.616    
          CALL ADV_P_GD(QT_PROV(1,K),QT_PROV(1,K-1),                       QTADV1C.617    
     *                  QT_PROV(1,K),                                      QTADV1C.618    
     &                  U_MEAN_COPY(1,K1),V_MEAN_COPY(1,K1),ZERO,          QTADV1C.619    
     *                  ETADOT_MEAN(1,K),                                  QTADV1C.620    
     *                 SEC_P_LATITUDE,QT_SECOND_INC,                       QTADV1C.621    
     *                 NUX(1,K-1),NUY(1,K-1),                              QTADV1C.622    
     *                  P_FIELD,U_FIELD,ROW_LENGTH,                        QTADV1C.623    
*CALL ARGFLDPT                                                             QTADV1C.624    
     &                  TIMESTEP,                                          QTADV1C.625    
     *                  LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE,      QTADV1C.626    
     *                  SEC_U_LATITUDE,                                    QTADV1C.627    
     &                  BRSP(1,K-1),L_SECOND,LWHITBROM,                    QTADV1C.628    
     &                  Q_COPY(1,K-1),extended_P_FIELD,extended_U_FIELD,   GSS1F403.702    
     &                  extended_address)                                  GSS1F403.703    
          ELSE                                                             QTADV1C.630    
                                                                           QTADV1C.631    
          CALL ADV_P_GD(QT_PROV(1,K-2),QT_PROV(1,K-1),                     QTADV1C.632    
     *                  QT_PROV(1,K),                                      QTADV1C.633    
     &                  U_MEAN_COPY(1,K1),V_MEAN_COPY(1,K1),               QTADV1C.634    
     &                  ETADOT_MEAN(1,K-1),                                QTADV1C.635    
     *                  ETADOT_MEAN(1,K),                                  QTADV1C.636    
     *                 SEC_P_LATITUDE,QT_SECOND_INC,                       QTADV1C.637    
     *                 NUX(1,K-1),NUY(1,K-1),                              QTADV1C.638    
     *                  P_FIELD,U_FIELD,ROW_LENGTH,                        QTADV1C.639    
*CALL ARGFLDPT                                                             QTADV1C.640    
     &                  TIMESTEP,                                          QTADV1C.641    
     *                  LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE,      QTADV1C.642    
     *                  SEC_U_LATITUDE,                                    QTADV1C.643    
     &                  BRSP(1,K-1),L_SECOND,LWHITBROM,                    QTADV1C.644    
     &                  Q_COPY(1,K-1),extended_P_FIELD,extended_U_FIELD,   GSS1F403.704    
     &                  extended_address)                                  GSS1F403.705    
                                                                           QTADV1C.646    
          END IF                                                           QTADV1C.647    
                                                                           QTADV1C.648    
C ---------------------------------------------------------------------    QTADV1C.649    
CL    SECTION 3.2    CALCULATE TOTAL MASS-WEIGHTED INCREMENT TO FIELD.     QTADV1C.650    
C ---------------------------------------------------------------------    QTADV1C.651    
                                                                           QTADV1C.652    
C TOTAL MASS-WEIGHTED INCREMENT IS CALCULATED AND THEN STORED IN           QTADV1C.653    
C QT_INCREMENT.                                                            QTADV1C.654    
                                                                           QTADV1C.655    
          DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO                     QTADV1C.656    
            QT_INCREMENT(I,K1) = .5*(QT_SECOND_INC(I) +                    QTADV1C.657    
     *                      QT_FIRST_INC(I,K-1)*RS(I,K1)*RS(I,K1)          QTADV1C.658    
     *                      *(DELTA_AK(K1)+DELTA_BK(K1)*PSTAR(I)))         QTADV1C.659    
          ENDDO                                                            QTADV1C.660    
                                                                           QTADV1C.661    
C ---------------------------------------------------------------------    QTADV1C.662    
CL    SECTION 3.3    IF GLOBAL MODEL CALCULATE POLAR INCREMENTS.           QTADV1C.663    
CL                   IF LIMITED AREA MASS-WEIGHT BOUNDARY VALUES.          QTADV1C.664    
C ---------------------------------------------------------------------    QTADV1C.665    
                                                                           QTADV1C.666    
CL    GLOBAL MODEL SO CALCULATE POLAR INCREMENT.                           QTADV1C.667    
CL    CALCULATE MERIDIONAL FLUX AROUND POLES BY ADDING THE TWO             QTADV1C.668    
CL    INCREMENTS AND ALSO MASS-WEIGHTING POLAR FIELDS.                     QTADV1C.669    
C NEGATIVE SIGN BEFORE FIRST INCS IS DUE TO THEIR SIGN BEING CHANGED       QTADV1C.670    
C PRIOR TO THE INTERMEDIATE VALUE BEING CALCULATED.                        QTADV1C.671    
          IF (at_top_of_LPG) THEN                                          QTADV1C.672    
! Do Northen boundary/pole                                                 QTADV1C.673    
            DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                  QTADV1C.674    
              SCALAR1 = RS(I,K1)*RS(I,K1)*                                 QTADV1C.675    
     &                  (DELTA_AK(K1)+DELTA_BK(K1)*PSTAR(I))               QTADV1C.676    
*IF DEF,GLOBAL                                                             QTADV1C.677    
              QT_INCREMENT(I,K1) = -.5*(QT_SECOND_INC(I) -                 QTADV1C.678    
     &                             QT_FIRST_INC(I,K-1)*SCALAR1)            QTADV1C.679    
*ENDIF                                                                     QTADV1C.680    
              QT(I,K1)=QT(I,K1)*SCALAR1                                    QTADV1C.681    
            ENDDO                                                          QTADV1C.682    
          ENDIF ! (attop)                                                  QTADV1C.683    
                                                                           QTADV1C.684    
          IF (at_base_of_LPG) THEN                                         QTADV1C.685    
! Do Southern boundary/pole                                                QTADV1C.686    
            DO IK=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1             QTADV1C.687    
              SCALAR2 = RS(IK,K1)*RS(IK,K1)*                               QTADV1C.688    
     &                  (DELTA_AK(K1)+DELTA_BK(K1)*PSTAR(IK))              QTADV1C.689    
*IF DEF,GLOBAL                                                             QTADV1C.690    
              QT_INCREMENT(IK,K1) = -.5*(QT_SECOND_INC(IK) -               QTADV1C.691    
     &                              QT_FIRST_INC(IK,K-1)*SCALAR2)          QTADV1C.692    
*ENDIF                                                                     QTADV1C.693    
              QT(IK,K1)     = QT(IK,K1)*SCALAR2                            QTADV1C.694    
            ENDDO                                                          QTADV1C.695    
          ENDIF ! (atbase)                                                 QTADV1C.696    
                                                                           QTADV1C.697    
CL END CONDITIONAL LEVEL GREATER THAN ONE                                  QTADV1C.698    
        END IF                                                             QTADV1C.699    
                                                                           QTADV1C.700    
CL END LOOP OVER Q_LEVELS+1                                                QTADV1C.701    
      ENDDO                                                                QTADV1C.702    
                                                                           QTADV1C.703    
CL---------------------------------------------------------------------    QTADV1C.704    
CL    SECTION 4      IF GLOBAL MODEL THEN FILTER INCREMENTS AND            QTADV1C.705    
CL                   UPDATE POLAR VALUES BY CALLING POLAR.                 QTADV1C.706    
CL                   UPDATE ALL OTHER VALUES.                              QTADV1C.707    
CL---------------------------------------------------------------------    QTADV1C.708    
                                                                           QTADV1C.709    
*IF DEF,GLOBAL                                                             QTADV1C.710    
C ---------------------------------------------------------------------    QTADV1C.711    
CL    SECTION 4.1    CALL FILTER TO DO FILTERING.                          QTADV1C.712    
C ---------------------------------------------------------------------    QTADV1C.713    
                                                                           QTADV1C.714    
C SET FILTER_SPACE WHICH IS ROW_LENGTH+2 TIMES THE NUMBER OF ROWS TO       QTADV1C.715    
C BE FILTERED.                                                             QTADV1C.716    
                                                                           QTADV1C.717    
      FILTER_SPACE = (ROW_LENGTH+2)*(NORTHERN_FILTERED_P_ROW-1+            QTADV1C.718    
     *                tot_P_ROWS-SOUTHERN_FILTERED_P_ROW)                  QTADV1C.719    
CL    CALL FILTER FOR QT INCREMENTS                                        QTADV1C.720    
                                                                           QTADV1C.721    
      CALL FILTER(QT_INCREMENT,P_FIELD,Q_LEVELS,                           APB0F402.29     
     &            FILTER_SPACE,ROW_LENGTH,                                 APB0F402.30     
*CALL ARGFLDPT                                                             APB0F402.31     
     &            FILTER_WAVE_NUMBER_P_ROWS,TRIGS,IFAX,                    APB0F402.32     
     *            NORTHERN_FILTERED_P_ROW,SOUTHERN_FILTERED_P_ROW)         QTADV1C.725    
                                                                           QTADV1C.726    
C ---------------------------------------------------------------------    QTADV1C.727    
CL    SECTION 4.2    CALL POLAR TO UPDATE POLAR VALUES                     QTADV1C.728    
C ---------------------------------------------------------------------    QTADV1C.729    
                                                                           QTADV1C.730    
      CALL POLAR(QT,QT_INCREMENT,QT_INCREMENT,                             QTADV1C.731    
*CALL ARGFLDPT                                                             QTADV1C.732    
     &           P_FIELD,P_FIELD,P_FIELD,                                  QTADV1C.733    
     &           TOP_ROW_START,P_BOT_ROW_START,                            QTADV1C.734    
     &           ROW_LENGTH,Q_LEVELS)                                      QTADV1C.735    
                                                                           QTADV1C.736    
*ENDIF                                                                     QTADV1C.737    
C ---------------------------------------------------------------------    QTADV1C.738    
CL    SECTION 4.3    UPDATE ALL OTHER POINTS.                              QTADV1C.739    
C ---------------------------------------------------------------------    QTADV1C.740    
                                                                           QTADV1C.741    
      DO K=1,Q_LEVELS                                                      QTADV1C.742    
C UPDATE QT.                                                               QTADV1C.743    
CFPP$ SELECT(CONCUR)                                                       QTADV1C.744    
        DO I= START_POINT_NO_HALO,END_P_POINT_NO_HALO                      QTADV1C.745    
          QT(I,K)=QT(I,K)*RS(I,K)*RS(I,K)*                                 QTADV1C.746    
     &            (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I))-QT_INCREMENT(I,K)     QTADV1C.747    
        ENDDO                                                              QTADV1C.748    
      ENDDO                                                                QTADV1C.749    
                                                                           QTADV1C.750    
CL    END OF ROUTINE QT_ADV                                                QTADV1C.751    
                                                                           QTADV1C.752    
      RETURN                                                               QTADV1C.753    
      END                                                                  QTADV1C.754    
*ENDIF                                                                     ATJ0F402.13     
*ENDIF                                                                     QTADV1C.755