*IF DEF,A10_1A                                                             VERTVE1A.2      
C ******************************COPYRIGHT******************************    GTS2F400.11611  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.11612  
C                                                                          GTS2F400.11613  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.11614  
C restrictions as set forth in the contract.                               GTS2F400.11615  
C                                                                          GTS2F400.11616  
C                Meteorological Office                                     GTS2F400.11617  
C                London Road                                               GTS2F400.11618  
C                BRACKNELL                                                 GTS2F400.11619  
C                Berkshire UK                                              GTS2F400.11620  
C                RG12 2SZ                                                  GTS2F400.11621  
C                                                                          GTS2F400.11622  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.11623  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.11624  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.11625  
C Modelling at the above address.                                          GTS2F400.11626  
C ******************************COPYRIGHT******************************    GTS2F400.11627  
C                                                                          GTS2F400.11628  
CLL   SUBROUTINE VERT_VEL -------------------------------------------      VERTVE1A.3      
CLL                                                                        VERTVE1A.4      
CLL   PURPOSE:  CALCULATES DIVERGENCE FROM MASS-WEIGHTED HORIZONTAL        VERTVE1A.5      
CLL             VELOCITY COMPONENTS USING EQUATION (30).                   VERTVE1A.6      
CLL             THEN DERIVES MASS-WEIGHTED VERTICAL VELOCITY               VERTVE1A.7      
CLL             FIELD, EQUATION (29).                                      VERTVE1A.8      
CLL   NOT SUITABLE FOR SINGLE COLUMN USE.                                  VERTVE1A.9      
CLL   VERSION FOR CRAY Y-MP                                                VERTVE1A.10     
CLL   WRITTEN BY M.H MAWSON.                                               VERTVE1A.11     
CLL                                                                        VERTVE1A.12     
CLL  MODEL            MODIFICATION HISTORY FROM MODEL VERSION 3.0:         VERTVE1A.13     
CLL VERSION  DATE                                                          VERTVE1A.14     
CLL   3.1     24/02/93  Tidy code to remove QA Fortran messages.           MM240293.15     
CLL   3.4     23/06/94  Argument LLINTS added and passed to CALC_TS        GSS1F304.963    
CLL                     DEF NOWHBR replaced by LOGICAL LWHITBROM           GSS1F304.964    
CLL                                                       S.J.Swarbrick    GSS1F304.965    
CLL   4.0      1/02/95  Polar weighting defined by polar values of         ACH1F400.10     
CLL                     SEC_P_LATITUDE made consistent with other parts    ACH1F400.11     
CLL                     of dynamics.  C.D.Hall                             ACH1F400.12     
!     3.5    28/03/95 MPP code addition.  P.Burton                         APB0F305.351    
!     4.1    02/04/96 Added TYPFLDPT arguments to dynamics routines        APB0F401.500    
!                     which allows many of the differences between         APB0F401.501    
!                     MPP and "normal" code to be at top level.            APB0F401.502    
!                     Rewrite of summations.                               APB0F401.503    
!                     P.Burton                                             APB0F401.504    
!     4.4    17/07/97 SCALAR calculated using SEC_P_LATITUDE at both       AIE0F404.1      
!                     poles for non MPP code to enable bit comparison      AIE0F404.2      
!                     with MPP code.   I Edmond                            AIE0F404.3      
CLL                                                                        VERTVE1A.15     
CLL   PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4,       VERTVE1A.16     
CLL                         STANDARD B. VERSION 2, DATED 18/01/90          VERTVE1A.17     
CLL                                                                        VERTVE1A.18     
CLL   SYSTEM COMPONENTS COVERED: P112                                      VERTVE1A.19     
CLL                                                                        VERTVE1A.20     
CLL   SYSTEM TASK: P1                                                      VERTVE1A.21     
CLL                                                                        VERTVE1A.22     
CLL   DOCUMENTATION:       THE EQUATIONS USED ARE (29) AND (30)            VERTVE1A.23     
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10     VERTVE1A.24     
CLL                        M.J.P. CULLEN,T.DAVIES AND M.H. MAWSON,         VERTVE1A.25     
CLL                        VERSION 17 DATED 11/02/91.                      VERTVE1A.26     
CLLEND-------------------------------------------------------------        VERTVE1A.27     
                                                                           VERTVE1A.28     
C*L   ARGUMENTS:---------------------------------------------------        VERTVE1A.29     
                                                                           VERTVE1A.30     

      SUBROUTINE VERT_VEL                                                   2,3VERTVE1A.31     
     1                  (U,V,ETADOT_MEAN,SEC_P_LATITUDE,SUM_DIVERGENCE,    VERTVE1A.32     
     2                   U_FIELD,P_FIELD,P_LEVELS,                         APB0F401.505    
*CALL ARGFLDPT                                                             APB0F401.506    
     3                   ROW_LENGTH,LATITUDE_STEP_INVERSE,                 VERTVE1A.34     
     4                   LONGITUDE_STEP_INVERSE,ADJUSTMENT_STEPS,AKH,      VERTVE1A.35     
     5                   BKH,RS,CALL_NUMBER,RECIP_RS_SQUARED_SURFACE,      VERTVE1A.36     
     6                   PSTAR,LLINTS,LWHITBROM)                           GSS1F304.966    
                                                                           VERTVE1A.38     
      IMPLICIT NONE                                                        VERTVE1A.39     
      LOGICAL  LLINTS, LWHITBROM                                           GSS1F304.967    
                                                                           VERTVE1A.40     
      INTEGER                                                              VERTVE1A.41     
     *  ROW_LENGTH         !IN    NUMBER OF POINTS PER ROW                 VERTVE1A.42     
     *, P_LEVELS           !IN    NUMBER OF PRESSURE LEVELS OF DATA        VERTVE1A.43     
     *, P_FIELD            !IN    NUMBER OF POINTS IN PRESSURE FIELD.      VERTVE1A.44     
     *, U_FIELD            !IN    NUMBER OF POINTS IN VELOCITY FIELD.      VERTVE1A.45     
     *, ADJUSTMENT_STEPS   !IN    HOLDS NUMBER OF ADJUSTMENT STEPS.        VERTVE1A.48     
     *, CALL_NUMBER        !IN    CURRENT ADJUSTMENT STEP NUMBER           VERTVE1A.49     
! All TYPFLDPT arguments are intent IN                                     APB0F401.507    
*CALL TYPFLDPT                                                             APB0F401.508    
                                                                           VERTVE1A.50     
      REAL                                                                 VERTVE1A.51     
     * U(U_FIELD,P_LEVELS)    !IN. MASS WEIGHTED U VELOCITY.               VERTVE1A.52     
     *,V(U_FIELD,P_LEVELS)    !IN. MASS WEIGHTED V VELOCITY*               VERTVE1A.53     
     *                        ! COS(LATITUDE)                              VERTVE1A.54     
     *,SEC_P_LATITUDE(P_FIELD)!IN  1/COS(LAT) AT P POINTS                  VERTVE1A.55     
     *,LONGITUDE_STEP_INVERSE !IN 1/LONGITUDE INCREMENT                    VERTVE1A.56     
     *,LATITUDE_STEP_INVERSE  !IN 1/LATITUDE INCREMENT                     VERTVE1A.57     
     *,BKH(P_LEVELS+1)        !IN. HOLDS COEFFICIENT WHICH                 VERTVE1A.58     
     *                        ! MULTIPLIES PSTAR IN HYBRID CO-ORDS         VERTVE1A.59     
     *                        ! AT LEVELS K-1/2                            VERTVE1A.60     
     *,AKH(P_LEVELS+1)        !IN. HOLDS FIRST COEFFICIENT                 VERTVE1A.61     
     *                        ! IN HYBRID CO-ORDS AT LEVELS K-1/2          VERTVE1A.62     
     *,RS(P_FIELD,P_LEVELS)   !IN. RADIUS OF EARTH AT P POINTS.            VERTVE1A.63     
     *,PSTAR(P_FIELD)         !IN. SURFACE PRESSURE AT P POINTS.           VERTVE1A.64     
                                                                           VERTVE1A.65     
      REAL                                                                 VERTVE1A.66     
     * SUM_DIVERGENCE(P_FIELD,P_LEVELS) !OUT. HOLDS MASS                   VERTVE1A.67     
     *                              ! WEIGHTED VERTICAL VELOCITY.          VERTVE1A.68     
                                                                           VERTVE1A.69     
      REAL                                                                 VERTVE1A.70     
     * ETADOT_MEAN(P_FIELD,P_LEVELS) !INOUT. HOLDS ACCUMULATED MASS-       VERTVE1A.71     
     *                              ! WEIGHTED VERTICAL VELOCITY DIVIDED   VERTVE1A.72     
     *                              ! BY NUMBER OF ADJUSTMENT_STEPS.       VERTVE1A.73     
     *,RECIP_RS_SQUARED_SURFACE(P_FIELD) !INOUT. HOLDS 1./(RS*RS) AT       VERTVE1A.74     
     *                              ! MODEL SURFACE. SET ON FIRST CALL     VERTVE1A.75     
     *                              ! AND HELD CONSTANT FOR ALL            VERTVE1A.76     
     *                              ! SUBSEQUENT ONES.                     VERTVE1A.77     
C*---------------------------------------------------------------------    VERTVE1A.78     
*IF DEF,MPP                                                                APB0F305.352    
! Parameters for MPP code                                                  APB0F401.509    
*ENDIF                                                                     APB0F305.355    
                                                                           VERTVE1A.79     
C*L   3 LOCAL ARRAYS NEEDED. -----------------------------------------     VERTVE1A.80     
                                                                           VERTVE1A.81     
      REAL                                                                 VERTVE1A.82     
     *  DU_DLONGITUDE(P_FIELD)                                             VERTVE1A.83     
     *, DV_DLATITUDE(P_FIELD)                                              VERTVE1A.84     
     *, DV_DLATITUDE2(U_FIELD)                                             VERTVE1A.85     
*IF DEF,MPP,AND,DEF,GLOBAL                                                 APB0F305.356    
      REAL                                                                 APB0F401.510    
     & sum_tmp(ROW_LENGTH-2*EW_Halo,P_LEVELS),                             APB0F401.511    
     & sums(P_LEVELS)                                                      APB0F401.512    
*ENDIF                                                                     APB0F305.359    
C*---------------------------------------------------------------------    VERTVE1A.86     
                                                                           VERTVE1A.87     
C DEFINE COUNT VARIABLES FOR DO LOOPS ETC.                                 VERTVE1A.88     
      INTEGER                                                              VERTVE1A.89     
     *  I,J,K                                                              VERTVE1A.90     
     *  ,START_POINT,END_POINT                                             MM240293.16     
     *,LEVEL                                                               VERTVE1A.92     
     &, POINTS                                                             APB0F401.513    
*IF DEF,MPP                                                                APB0F305.360    
      INTEGER info                                                         APB0F305.361    
*ENDIF                                                                     APB0F305.362    
C DEFINE LOCAL SCALARS                                                     VERTVE1A.93     
      REAL                                                                 VERTVE1A.94     
     * RECIP_ADJUSTMENT_STEPS                                              VERTVE1A.95     
*IF -DEF,MPP                                                               AIE0F404.4      
      REAL                                                                 AIE0F404.5      
     *  SCALAR1                                                            AIE0F404.6      
     *, SCALAR2                                                            AIE0F404.7      
*ELSE                                                                      AIE0F404.8      
      REAL                                                                 AIE0F404.9      
     *  SCALAR                                                             AIE0F404.10     
*ENDIF                                                                     AIE0F404.11     
                                                                           VERTVE1A.97     
*IF DEF,GLOBAL                                                             VERTVE1A.98     
      REAL SUM_N,SUM_S                                                     VERTVE1A.99     
*ENDIF                                                                     VERTVE1A.100    
                                                                           VERTVE1A.101    
C*---------------------------------------------------------------------    VERTVE1A.104    
*CALL C_A                                                                  VERTVE1A.105    
C*L   EXTERNAL SUBROUTINE CALLS:- ( IF LWHITBROM ) ---------------         GSS1F304.968    
      EXTERNAL CALC_RS                                                     VERTVE1A.108    
C*---------------------------------------------------------------------    VERTVE1A.109    
                                                                           VERTVE1A.111    
CL    MAXIMUM VECTOR LENGTH ASSUMED IS ROWS*ROW_LENGTH.                    VERTVE1A.112    
CL---------------------------------------------------------------------    VERTVE1A.113    
CL    INTERNAL STRUCTURE.                                                  VERTVE1A.114    
! All references to poles in the comments, apply equally to the            APB0F401.514    
! Northern and Southern rows when used in LAM configuration.               APB0F401.515    
! References to halos apply only to MPP code.                              APB0F401.516    
CL---------------------------------------------------------------------    VERTVE1A.115    
CL                                                                         VERTVE1A.116    
CL---------------------------------------------------------------------    VERTVE1A.117    
CL    SECTION 1. CALCULATE DIVERGENCE AS IN EQUATION (30).                 VERTVE1A.118    
CL---------------------------------------------------------------------    VERTVE1A.119    
                                                                           VERTVE1A.120    
      POINTS=LAST_P_VALID_PT-FIRST_VALID_PT+1                              APB0F401.517    
! Number of points to be processed by CALC_RS. For non-MPP runs this       APB0F401.518    
! is simply P_FIELD, for MPP, it is all the points, minus any              APB0F401.519    
! unused halo areas (ie. the halo above North pole row, and beneath        APB0F401.520    
! South pole row)                                                          APB0F401.521    
                                                                           APB0F401.522    
C LOOP OVER LEVELS                                                         VERTVE1A.121    
      DO 100 K=1,P_LEVELS                                                  VERTVE1A.122    
                                                                           VERTVE1A.123    
C CALCULATE DU/D(LAMDA)                                                    VERTVE1A.124    
! Loop over all points except South Pole, missing halos                    APB0F401.523    
        DO 110 I=START_POINT_NO_HALO - ROW_LENGTH +1,                      APB0F401.524    
     &           END_P_POINT_NO_HALO                                       APB0F401.525    
          DU_DLONGITUDE(I) = LONGITUDE_STEP_INVERSE*(U(I,K)-U(I-1,K))      VERTVE1A.126    
 110    CONTINUE                                                           VERTVE1A.127    
                                                                           VERTVE1A.128    
C CALCULATE DV/D(PHI)                                                      VERTVE1A.129    
! Loop over all non-polar points, missing halos                            APB0F401.526    
        DO 120 I=START_POINT_NO_HALO , END_P_POINT_NO_HALO                 APB0F401.527    
          DV_DLATITUDE(I) = LATITUDE_STEP_INVERSE*(V(I-ROW_LENGTH,K)       VERTVE1A.131    
     *                         -V(I,K))                                    VERTVE1A.132    
 120    CONTINUE                                                           VERTVE1A.133    
                                                                           VERTVE1A.134    
*IF DEF,GLOBAL                                                             VERTVE1A.135    
C CALCULATE AVERAGE OF DV_DLATITUDE                                        VERTVE1A.136    
! Loop over all non-polar points, missing halos and first point            APB0F401.528    
        DO 130 I=START_POINT_NO_HALO+1 , END_P_POINT_NO_HALO               APB0F401.529    
          DV_DLATITUDE2(I) = DV_DLATITUDE(I) + DV_DLATITUDE(I-1)           VERTVE1A.138    
 130    CONTINUE                                                           VERTVE1A.139    
                                                                           VERTVE1A.140    
*IF -DEF,MPP                                                               APB0F305.363    
C NOW DO FIRST POINT ON EACH SLICE FOR DU_DLONGITUDE AND DV_DLATITUDE2     VERTVE1A.141    
! Set the first point of the Northern row we missed in loop 110            APB0F401.530    
        I=START_POINT_NO_HALO - ROW_LENGTH                                 APB0F401.531    
        DU_DLONGITUDE(I) = LONGITUDE_STEP_INVERSE * (U(I,K)                VERTVE1A.143    
     *                        - U(I + ROW_LENGTH - 1,K))                   VERTVE1A.144    
! Loop over all non-polar points, missing halos                            APB0F401.532    
        DO 140 I=START_POINT_NO_HALO , END_P_POINT_NO_HALO,                APB0F401.533    
     &           ROW_LENGTH                                                APB0F401.534    
          DU_DLONGITUDE(I) = LONGITUDE_STEP_INVERSE * (U(I,K)              VERTVE1A.146    
     *                        - U(I + ROW_LENGTH - 1,K))                   VERTVE1A.147    
         DV_DLATITUDE2(I)=DV_DLATITUDE(I)+DV_DLATITUDE(I-1+ROW_LENGTH)     VERTVE1A.148    
 140    CONTINUE                                                           VERTVE1A.149    
*ELSE                                                                      APB0F305.364    
! Set the first element of arrays where loops have skipped:                APB0F401.535    
! Loop 110:                                                                APB0F401.536    
        DU_DLONGITUDE(START_POINT_NO_HALO - ROW_LENGTH)=                   APB0F401.537    
     &    DU_DLONGITUDE(START_POINT_NO_HALO - ROW_LENGTH + 1)              APB0F401.538    
! Loop 130:                                                                APB0F401.539    
        DV_DLATITUDE2(START_POINT_NO_HALO)=                                APB0F401.540    
     &    DV_DLATITUDE2(START_POINT_NO_HALO+1)                             APB0F401.541    
*ENDIF                                                                     APB0F305.370    
                                                                           VERTVE1A.150    
C CALCULATE DIVERGENCES.                                                   VERTVE1A.151    
                                                                           VERTVE1A.152    
! Loop over all non-polar points, missing halos                            APB0F401.542    
        DO 150 J=START_POINT_NO_HALO , END_P_POINT_NO_HALO                 APB0F401.543    
          SUM_DIVERGENCE(J,K)= SEC_P_LATITUDE(J)*.5*(DU_DLONGITUDE(J)      VERTVE1A.154    
     *                           + DU_DLONGITUDE(J-ROW_LENGTH)             VERTVE1A.155    
     *                           + DV_DLATITUDE2(J))                       VERTVE1A.156    
 150    CONTINUE                                                           VERTVE1A.157    
*ELSE                                                                      VERTVE1A.158    
! I don't think the following code is required:                            APB0F401.544    
!      DU_DLONGITUDE(1) = 0.                                               APB0F401.545    
! MPP: DU_DLONGITUDE(Offy*ROW_LENGTH+1) = 0.                               APB0F401.546    
                                                                           VERTVE1A.160    
C CALCULATE DIVERGENCES.                                                   VERTVE1A.161    
                                                                           VERTVE1A.162    
! Loop over all non-polar points, missing first and last points            APB0F401.547    
        DO 130 J=START_POINT_NO_HALO+1 , END_P_POINT_NO_HALO-1             APB0F401.548    
          SUM_DIVERGENCE(J,K)= SEC_P_LATITUDE(J)*.5*(DU_DLONGITUDE(J)      VERTVE1A.164    
     *                         + DU_DLONGITUDE(J-ROW_LENGTH)               VERTVE1A.165    
     *                         + DV_DLATITUDE(J) + DV_DLATITUDE(J-1))      VERTVE1A.166    
 130    CONTINUE                                                           VERTVE1A.167    
                                                                           VERTVE1A.168    
*IF DEF,MPP                                                                APB0F305.375    
! Put some real numbers at start and end                                   APB0F305.376    
        SUM_DIVERGENCE(START_POINT_NO_HALO,K)=0.0                          APB0F401.549    
        SUM_DIVERGENCE(END_P_POINT_NO_HALO,K)=0.0                          APB0F401.550    
*ENDIF                                                                     APB0F305.379    
C ZERO DIVERGENCES ON BOUNDARIES.                                          VERTVE1A.169    
*IF -DEF,MPP                                                               APB0F305.380    
! Loop over all non-polar points at left edge of grid (ie. first           APB0F401.551    
! point of each row)                                                       APB0F401.552    
        DO 140 J=START_POINT_NO_HALO,END_P_POINT_NO_HALO,ROW_LENGTH        APB0F401.553    
          SUM_DIVERGENCE(J,K) = 0.                                         VERTVE1A.171    
          SUM_DIVERGENCE(J+ROW_LENGTH-1,K) = 0.                            VERTVE1A.172    
 140    CONTINUE                                                           VERTVE1A.173    
*ELSE                                                                      APB0F305.381    
        IF (at_left_of_LPG) THEN                                           APB0F401.554    
! Loop over first real (ie. not halo) non-polar point of each row          APB0F401.555    
          DO J=START_POINT_NO_HALO+FIRST_ROW_PT-1,                         APB0F401.556    
     &         END_P_POINT_NO_HALO,ROW_LENGTH                              APB0F401.557    
            SUM_DIVERGENCE(J,K) = 0.0                                      APB0F401.558    
          ENDDO                                                            APB0F401.559    
        ENDIF                                                              APB0F401.560    
                                                                           APB0F401.561    
        IF (at_right_of_LPG) THEN                                          APB0F401.562    
! Loop over last real (ie. not halo) non-polar point of each row           APB0F401.563    
          DO J=START_POINT_NO_HALO+LAST_ROW_PT-1,                          APB0F401.564    
     &         END_P_POINT_NO_HALO,ROW_LENGTH                              APB0F401.565    
            SUM_DIVERGENCE(J,K) = 0.0                                      APB0F401.566    
          ENDDO                                                            APB0F401.567    
        ENDIF                                                              APB0F401.568    
*ENDIF                                                                     APB0F305.392    
*ENDIF                                                                     VERTVE1A.174    
                                                                           VERTVE1A.175    
                                                                           VERTVE1A.176    
C END LOOP OVER LEVELS                                                     VERTVE1A.191    
 100  CONTINUE                                                             VERTVE1A.192    
*IF DEF,GLOBAL                                                             APB0F401.569    
! Calculate divergence at poles by summing DV/D(LAT) around polar          APB0F401.570    
! circle and averaging.                                                    APB0F401.571    
                                                                           APB0F401.572    
!      START_POINT=TOP_ROW_START+LAST_ROW_PT-1   ! Last point of NP row    APB0F401.573    
!      END_POINT= P_BOT_ROW_START+FIRST_ROW_PT-1 ! First point of SP row   APB0F401.574    
       START_POINT=START_POINT_NO_HALO-1                                   APB0F401.575    
       END_POINT=END_P_POINT_NO_HALO+1                                     APB0F401.576    
                                                                           APB0F401.577    
                                                                           APB0F401.578    
! New start and end points to include one point of each pole               APB0F401.579    
                                                                           APB0F401.580    
*IF -DEF,MPP                                                               APB0F401.581    
      SCALAR1= SEC_P_LATITUDE(TOP_ROW_START)*LATITUDE_STEP_INVERSE /       AIE0F404.12     
     &         GLOBAL_ROW_LENGTH                                           APB0F401.583    
      SCALAR2= SEC_P_LATITUDE(P_BOT_ROW_START)                             AIE0F404.13     
     &          *LATITUDE_STEP_INVERSE / GLOBAL_ROW_LENGTH                 AIE0F404.14     
                                                                           APB0F401.584    
      DO K=1,P_LEVELS                                                      APB0F401.585    
        SUM_N=0.0                                                          APB0F401.586    
        SUM_S=0.0                                                          APB0F401.587    
        DO I=1,ROW_LENGTH                                                  APB0F401.588    
          SUM_N = SUM_N - V(I,K)*SCALAR1                                   AIE0F404.15     
          SUM_S = SUM_S + V(U_BOT_ROW_START-1+I,K)*SCALAR2                 AIE0F404.16     
        ENDDO                                                              APB0F401.591    
        SUM_DIVERGENCE(START_POINT,K) = SUM_N                              APB0F401.592    
        SUM_DIVERGENCE(END_POINT,K) = SUM_S                                APB0F401.593    
      ENDDO                                                                APB0F401.594    
*ELSE                                                                      APB0F401.595    
! Do sum across North Pole                                                 APB0F401.596    
      IF (at_top_of_LPG) THEN                                              APB0F401.597    
        SCALAR = SEC_P_LATITUDE(TOP_ROW_START)*LATITUDE_STEP_INVERSE /     APB0F401.598    
     &           GLOBAL_ROW_LENGTH                                         APB0F401.599    
        DO K=1,P_LEVELS                                                    APB0F401.600    
! Copy up the items to be summed into a temporary array                    APB0F401.601    
! Loop over all the non-halo points on a row                               APB0F401.602    
          DO I=FIRST_ROW_PT,LAST_ROW_PT                                    APB0F401.603    
            sum_tmp(I-FIRST_ROW_PT+1,K)=                                   APB0F401.604    
     &         -V(TOP_ROW_START+I-1,K)*SCALAR                              APB0F401.605    
          ENDDO                                                            APB0F401.606    
        ENDDO                                                              APB0F401.607    
                                                                           APB0F401.608    
! And perform the sum                                                      APB0F401.609    
        CALL GCG_RVECSUMR(ROW_LENGTH-2*EW_Halo , ROW_LENGTH-2*EW_Halo,     APB0F401.610    
     &                    1,P_LEVELS,sum_tmp,GC_ROW_GROUP,                 APB0F401.611    
     &                    info,sums)                                       APB0F401.612    
                                                                           APB0F401.613    
! And store the result back                                                APB0F401.614    
        DO K=1,P_LEVELS                                                    APB0F401.615    
          SUM_DIVERGENCE(START_POINT,K)=sums(K)                            APB0F401.616    
        ENDDO                                                              APB0F401.617    
      ELSE  ! If this processor not at top of LPG                          APB0F401.618    
        START_POINT=START_POINT_NO_HALO  ! no North Pole point here        APB0F401.619    
      ENDIF                                                                APB0F401.620    
                                                                           APB0F401.621    
! And sum across South Pole                                                APB0F401.622    
      IF (at_base_of_LPG) THEN                                             APB0F401.623    
        SCALAR=SEC_P_LATITUDE(P_BOT_ROW_START)*LATITUDE_STEP_INVERSE/      APB0F401.624    
     &         GLOBAL_ROW_LENGTH                                           APB0F401.625    
                                                                           APB0F401.626    
        DO K=1,P_LEVELS                                                    APB0F401.627    
! Copy up the items to be summed into a temporary array                    APB0F401.628    
! Loop over all the non-halo points on a row                               APB0F401.629    
          DO I=FIRST_ROW_PT,LAST_ROW_PT                                    APB0F401.630    
            sum_tmp(I-FIRST_ROW_PT+1,K)=                                   APB0F401.631    
     &        V(U_BOT_ROW_START+I-1,K)*SCALAR                              APB0F401.632    
          ENDDO                                                            APB0F401.633    
        ENDDO                                                              APB0F401.634    
                                                                           APB0F401.635    
! And perform the sum                                                      APB0F401.636    
        CALL GCG_RVECSUMR(ROW_LENGTH-2*EW_Halo , ROW_LENGTH-2*EW_Halo,     APB0F401.637    
     &                    1,P_LEVELS,sum_tmp,GC_ROW_GROUP,                 APB0F401.638    
     &                    info,sums)                                       APB0F401.639    
                                                                           APB0F401.640    
! And store the result back                                                APB0F401.641    
        DO K=1,P_LEVELS                                                    APB0F401.642    
          SUM_DIVERGENCE(END_POINT,K)=sums(K)                              APB0F401.643    
        ENDDO                                                              APB0F401.644    
      ELSE  ! If this processor not at the bottom of LPG                   APB0F401.645    
        END_POINT=END_P_POINT_NO_HALO  ! no South Pole point here          APB0F401.646    
      ENDIF                                                                APB0F401.647    
*ENDIF                                                                     APB0F401.648    
*ELSE                                                                      APB0F401.649    
      START_POINT=START_POINT_NO_HALO                                      APB0F401.650    
      END_POINT=END_P_POINT_NO_HALO                                        APB0F401.651    
*ENDIF                                                                     APB0F401.652    
                                                                           VERTVE1A.193    
CL                                                                         VERTVE1A.194    
CL---------------------------------------------------------------------    VERTVE1A.195    
CL    SECTION 2. CALCULATE VERTICAL VELOCITY. EQUATION (29).               VERTVE1A.196    
CL---------------------------------------------------------------------    VERTVE1A.197    
                                                                           VERTVE1A.198    
                                                                           VERTVE1A.207    
C ---------------------------------------------------------------------    VERTVE1A.208    
CL    SECTION 2.1 SUM DIVERGENCES THROUGHOUT ATMOSPHERE.                   VERTVE1A.209    
C ---------------------------------------------------------------------    VERTVE1A.210    
                                                                           VERTVE1A.211    
C BY CODING THE SUMMATION AS FOLLOWS THE VALUES PUT INTO EACH LEVEL        VERTVE1A.212    
C OF SUM_DIVERGENCE ARE THE ONES NEEDED FOR THE SECOND SUMMATION TERM      VERTVE1A.213    
C IN EQUATION 29, WHILE THE TOTAL SUM IS HELD IN SUM_DIVERGENCE( ,1)       VERTVE1A.214    
                                                                           VERTVE1A.215    
      DO 210 K=P_LEVELS-1,1,-1                                             VERTVE1A.216    
        DO 212 I=START_POINT,END_POINT                                     MM240293.21     
          SUM_DIVERGENCE(I,K)= SUM_DIVERGENCE(I,K)+SUM_DIVERGENCE(I,K+1)   VERTVE1A.218    
 212    CONTINUE                                                           VERTVE1A.219    
 210  CONTINUE                                                             VERTVE1A.220    
                                                                           VERTVE1A.221    
C ---------------------------------------------------------------------    VERTVE1A.222    
CL    SECTION 2.2 CALCULATE MASS-WEIGHTED VERTICAL VELOCITY.               VERTVE1A.223    
CL                CALCULATE 1/(RS*RS) IF THIS IS CALL NUMBER ONE.          VERTVE1A.224    
C ---------------------------------------------------------------------    VERTVE1A.225    
                                                                           VERTVE1A.226    
      IF(CALL_NUMBER.EQ.1) THEN                                            VERTVE1A.227    
CL    CALCULATE 1/(RS*RS) AT MODEL SURFACE                                 VERTVE1A.228    
                                                                           GSS1F304.969    
      IF (.NOT.LWHITBROM) THEN                                             GSS1F304.970    
                                                                           GSS1F304.971    
! loop over all points, including valid halos                              APB0F401.653    
        DO 220 I=FIRST_VALID_PT,LAST_P_VALID_PT                            APB0F401.654    
          RECIP_RS_SQUARED_SURFACE(I) = 1./(A*A)                           VERTVE1A.231    
 220    CONTINUE                                                           VERTVE1A.232    
                                                                           GSS1F304.972    
      ELSE                                                                 GSS1F304.973    
                                                                           GSS1F304.974    
        LEVEL=1                                                            VERTVE1A.234    
C DV_DLATITUDE,DU_DLONGITUDE ARE DUMMY ARRAYS REQUIRED BY CALC_RS AND      VERTVE1A.235    
C THE CONTENTS TRANSFERED TO AND RETURNED FROM IT ARE IRRELEVANT.          VERTVE1A.236    
        CALL CALC_RS(PSTAR(FIRST_VALID_PT),AKH,BKH,                        APB0F401.655    
     &               DV_DLATITUDE(FIRST_VALID_PT),                         APB0F401.656    
     &               DU_DLONGITUDE(FIRST_VALID_PT),                        APB0F401.657    
     *               RECIP_RS_SQUARED_SURFACE(FIRST_VALID_PT),             APB0F401.658    
     &               POINTS,LEVEL,P_LEVELS,LLINTS)                         APB0F401.659    
! loop over all points, including valid halos                              APB0F401.660    
        DO 320 I=FIRST_VALID_PT,LAST_P_VALID_PT                            APB0F401.661    
          RECIP_RS_SQUARED_SURFACE(I)= 1./(RECIP_RS_SQUARED_SURFACE(I)*    VERTVE1A.240    
     *                                 RECIP_RS_SQUARED_SURFACE(I))        VERTVE1A.241    
 320    CONTINUE                                                           GSS1F304.978    
                                                                           GSS1F304.979    
      END IF      !     LWHITBROM                                          GSS1F304.980    
                                                                           GSS1F304.981    
      END IF                                                               VERTVE1A.244    
                                                                           VERTVE1A.245    
C DP/D(PSTAR) IS NOTHING MORE THAN THE BK COEFFICENT.                      VERTVE1A.246    
*IF -DEF,STRAT                                                             VERTVE1A.247    
                                                                           VERTVE1A.248    
      DO 222 K= P_LEVELS,2,-1                                              VERTVE1A.249    
CFPP$ SELECT(CONCUR)                                                       VERTVE1A.250    
        DO 224 I=START_POINT,END_POINT                                     MM240293.22     
          SUM_DIVERGENCE(I,K)= SUM_DIVERGENCE(I,K) - BKH(K)                VERTVE1A.252    
     *                          * SUM_DIVERGENCE(I,1)*RS(I,K)*RS(I,K)*     VERTVE1A.253    
     *                          RECIP_RS_SQUARED_SURFACE(I)                VERTVE1A.254    
 224    CONTINUE                                                           VERTVE1A.255    
 222  CONTINUE                                                             VERTVE1A.256    
                                                                           VERTVE1A.257    
*ENDIF                                                                     VERTVE1A.258    
C ---------------------------------------------------------------------    VERTVE1A.259    
CL    SECTION 2.3 ACCUMULATE MASS-WEIGHTED VERTICAL VELOCITY DIVIDED       VERTVE1A.260    
CL                BY NUMBER OF ADJUSTMENT TIMESTEPS.                       VERTVE1A.261    
C ---------------------------------------------------------------------    VERTVE1A.262    
                                                                           VERTVE1A.263    
      RECIP_ADJUSTMENT_STEPS = 1./ ADJUSTMENT_STEPS                        VERTVE1A.264    
                                                                           VERTVE1A.265    
      DO 230 K= 1,P_LEVELS                                                 VERTVE1A.266    
CFPP$ SELECT(CONCUR)                                                       VERTVE1A.267    
        DO 232 I=START_POINT,END_POINT                                     MM240293.23     
          ETADOT_MEAN(I,K)= ETADOT_MEAN(I,K) + SUM_DIVERGENCE(I,K)         VERTVE1A.269    
     *                          * RECIP_ADJUSTMENT_STEPS                   VERTVE1A.270    
 232    CONTINUE                                                           VERTVE1A.271    
 230  CONTINUE                                                             VERTVE1A.272    
                                                                           VERTVE1A.273    
*IF DEF,GLOBAL                                                             VERTVE1A.274    
C IF GLOBAL MODEL SET ALL POINTS AT POLES TO THE UNIQUE VALUE.             VERTVE1A.275    
      DO 240 K=1,P_LEVELS                                                  VERTVE1A.276    
CDIR$ IVDEP                                                                VERTVE1A.277    
! Fujitsu vectorization directive                                          GRB0F405.553    
!OCL NOVREC                                                                GRB0F405.554    
*IF DEF,MPP                                                                APB0F401.662    
        IF (at_top_of_LPG) THEN                                            APB0F401.663    
*ENDIF                                                                     APB0F401.664    
! Loop over North Pole points, missing out the last (START_POINT)          APB0F401.665    
! point.                                                                   APB0F401.666    
          DO I=TOP_ROW_START+FIRST_ROW_PT-1,                               APB0F401.667    
!     &         TOP_ROW_START+LAST_ROW_PT-2                                APB0F401.668    
     &         TOP_ROW_START+LAST_ROW_PT-1                                 APB0F401.669    
            ETADOT_MEAN(I,K)=ETADOT_MEAN(START_POINT,K)                    APB0F401.670    
            SUM_DIVERGENCE(I,K)=SUM_DIVERGENCE(START_POINT,K)              APB0F401.671    
          ENDDO                                                            APB0F401.672    
*IF DEF,MPP                                                                APB0F401.673    
        ENDIF  ! at North Pole                                             APB0F401.674    
*ENDIF                                                                     APB0F401.675    
                                                                           APB0F401.676    
*IF DEF,MPP                                                                APB0F401.677    
        IF (at_base_of_LPG) THEN                                           APB0F401.678    
*ENDIF                                                                     APB0F401.679    
! Loop over South Pole points, missing out the first (END_POINT)           APB0F401.680    
! point.                                                                   APB0F401.681    
!          DO I=P_BOT_ROW_START+FIRST_ROW_PT,                              APB0F401.682    
          DO I=P_BOT_ROW_START+FIRST_ROW_PT-1,                             APB0F401.683    
     &         P_BOT_ROW_START+LAST_ROW_PT-1                               APB0F401.684    
            ETADOT_MEAN(I,K)=ETADOT_MEAN(END_POINT,K)                      APB0F401.685    
            SUM_DIVERGENCE(I,K)=SUM_DIVERGENCE(END_POINT,K)                APB0F401.686    
          ENDDO                                                            APB0F401.687    
*IF DEF,MPP                                                                APB0F401.688    
        ENDIF  ! at South Pole                                             APB0F401.689    
*ENDIF                                                                     APB0F401.690    
 240  CONTINUE                                                             VERTVE1A.284    
*ENDIF                                                                     VERTVE1A.285    
                                                                           VERTVE1A.286    
CL    END OF ROUTINE VERT_VEL                                              VERTVE1A.287    
                                                                           VERTVE1A.288    
      RETURN                                                               VERTVE1A.289    
      END                                                                  VERTVE1A.290    
*ENDIF                                                                     VERTVE1A.291