*IF DEF,A10_1C                                                             VERTVE1C.2      
C ******************************COPYRIGHT******************************    VERTVE1C.3      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    VERTVE1C.4      
C                                                                          VERTVE1C.5      
C Use, duplication or disclosure of this code is subject to the            VERTVE1C.6      
C restrictions as set forth in the contract.                               VERTVE1C.7      
C                                                                          VERTVE1C.8      
C                Meteorological Office                                     VERTVE1C.9      
C                London Road                                               VERTVE1C.10     
C                BRACKNELL                                                 VERTVE1C.11     
C                Berkshire UK                                              VERTVE1C.12     
C                RG12 2SZ                                                  VERTVE1C.13     
C                                                                          VERTVE1C.14     
C If no contract has been raised with this copy of the code, the use,      VERTVE1C.15     
C duplication or disclosure of it is strictly prohibited.  Permission      VERTVE1C.16     
C to do so must first be obtained in writing from the Head of Numerical    VERTVE1C.17     
C Modelling at the above address.                                          VERTVE1C.18     
C ******************************COPYRIGHT******************************    VERTVE1C.19     
C                                                                          VERTVE1C.20     
CLL   SUBROUTINE VERT_VEL -------------------------------------------      VERTVE1C.21     
CLL                                                                        VERTVE1C.22     
CLL   PURPOSE:  CALCULATES DIVERGENCE FROM MASS-WEIGHTED HORIZONTAL        VERTVE1C.23     
CLL             VELOCITY COMPONENTS USING EQUATION (30).                   VERTVE1C.24     
CLL             THEN DERIVES MASS-WEIGHTED VERTICAL VELOCITY               VERTVE1C.25     
CLL             FIELD, EQUATION (29).                                      VERTVE1C.26     
CLL   NOT SUITABLE FOR SINGLE COLUMN USE.                                  VERTVE1C.27     
CLL   WAS VERSION FOR CRAY Y-MP                                            VERTVE1C.28     
CLL   WRITTEN BY M.H MAWSON.                                               VERTVE1C.29     
CLL                                                                        VERTVE1C.30     
CLL  MODEL            MODIFICATION HISTORY:                                VERTVE1C.31     
CLL VERSION  DATE                                                          VERTVE1C.32     
CLL                                                                        VERTVE1C.33     
!LL   4.4   11/08/97  New version optimised for T3E                        VERTVE1C.34     
!LL                   Not bit reproducible with VERTVE1A.                  VERTVE1C.35     
CLL   4.4   11/08/97  Initialisation of ETADOT_MEAN to zero built into     VERTVE1C.36     
CLL                   calculation of first adjustment timestep value.      VERTVE1C.37     
CLL                   A. Dickinson                                         VERTVE1C.38     
CLL                                                                        VERTVE1C.39     
!     4.4    17/07/97 SCALAR calculated using SEC_P_LATITUDE at both       VERTVE1C.40     
!                     poles for non MPP code to enable bit comparison      VERTVE1C.41     
!                     with MPP code.   I Edmond                            VERTVE1C.42     
CLL  4.5  19/12/97  Set North- & Southmost rows of ETADOT_MEAN to          ARB0F405.1      
CLL                 zero for limited area runs.  RTHBarnes.                ARB0F405.2      
!     4.5    30/04/98 Loop merging for T3E optimisation for MES            APB3F405.430    
!                     D.Salmond                                            APB3F405.431    
!                                                                          APB3F405.432    
CLL   PROGRAMMING STANDARD:                                                VERTVE1C.43     
CLL                                                                        VERTVE1C.44     
CLL   SYSTEM COMPONENTS COVERED: P112                                      VERTVE1C.45     
CLL                                                                        VERTVE1C.46     
CLL   SYSTEM TASK: P1                                                      VERTVE1C.47     
CLL                                                                        VERTVE1C.48     
CLL   DOCUMENTATION:       THE EQUATIONS USED ARE (29) AND (30)            VERTVE1C.49     
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10     VERTVE1C.50     
CLL                        M.J.P. CULLEN,T.DAVIES AND M.H. MAWSON,         VERTVE1C.51     
CLL                        VERSION 17 DATED 11/02/91.                      VERTVE1C.52     
CLLEND-------------------------------------------------------------        VERTVE1C.53     
                                                                           VERTVE1C.54     
C*L   ARGUMENTS:---------------------------------------------------        VERTVE1C.55     
                                                                           VERTVE1C.56     

      SUBROUTINE VERT_VEL                                                   2,3VERTVE1C.57     
     1                  (U,V,ETADOT_MEAN,SEC_P_LATITUDE,SUM_DIVERGENCE,    VERTVE1C.58     
     2                   U_FIELD,P_FIELD,P_LEVELS,                         VERTVE1C.59     
*CALL ARGFLDPT                                                             VERTVE1C.60     
     3                   ROW_LENGTH,LATITUDE_STEP_INVERSE,                 VERTVE1C.61     
     4                   LONGITUDE_STEP_INVERSE,ADJUSTMENT_STEPS,AKH,      VERTVE1C.62     
     5                   BKH,RS,CALL_NUMBER,RECIP_RS_SQUARED_SURFACE,      VERTVE1C.63     
     6                   PSTAR,LLINTS,LWHITBROM)                           VERTVE1C.64     
                                                                           VERTVE1C.65     
      IMPLICIT NONE                                                        VERTVE1C.66     
      LOGICAL  LLINTS, LWHITBROM                                           VERTVE1C.67     
                                                                           VERTVE1C.68     
      INTEGER                                                              VERTVE1C.69     
     *  ROW_LENGTH         !IN    NUMBER OF POINTS PER ROW                 VERTVE1C.70     
     *, P_LEVELS           !IN    NUMBER OF PRESSURE LEVELS OF DATA        VERTVE1C.71     
     *, P_FIELD            !IN    NUMBER OF POINTS IN PRESSURE FIELD.      VERTVE1C.72     
     *, U_FIELD            !IN    NUMBER OF POINTS IN VELOCITY FIELD.      VERTVE1C.73     
     *, ADJUSTMENT_STEPS   !IN    HOLDS NUMBER OF ADJUSTMENT STEPS.        VERTVE1C.74     
     *, CALL_NUMBER        !IN    CURRENT ADJUSTMENT STEP NUMBER           VERTVE1C.75     
! All TYPFLDPT arguments are intent IN                                     VERTVE1C.76     
*CALL TYPFLDPT                                                             VERTVE1C.77     
                                                                           VERTVE1C.78     
      REAL                                                                 VERTVE1C.79     
     * U(U_FIELD,P_LEVELS)    !IN. MASS WEIGHTED U VELOCITY.               VERTVE1C.80     
     *,V(U_FIELD,P_LEVELS)    !IN. MASS WEIGHTED V VELOCITY*               VERTVE1C.81     
     *                        ! COS(LATITUDE)                              VERTVE1C.82     
     *,SEC_P_LATITUDE(P_FIELD)!IN  1/COS(LAT) AT P POINTS                  VERTVE1C.83     
     *,LONGITUDE_STEP_INVERSE !IN 1/LONGITUDE INCREMENT                    VERTVE1C.84     
     *,LATITUDE_STEP_INVERSE  !IN 1/LATITUDE INCREMENT                     VERTVE1C.85     
     *,BKH(P_LEVELS+1)        !IN. HOLDS COEFFICIENT WHICH                 VERTVE1C.86     
     *                        ! MULTIPLIES PSTAR IN HYBRID CO-ORDS         VERTVE1C.87     
     *                        ! AT LEVELS K-1/2                            VERTVE1C.88     
     *,AKH(P_LEVELS+1)        !IN. HOLDS FIRST COEFFICIENT                 VERTVE1C.89     
     *                        ! IN HYBRID CO-ORDS AT LEVELS K-1/2          VERTVE1C.90     
     *,RS(P_FIELD,P_LEVELS)   !IN. RADIUS OF EARTH AT P POINTS.            VERTVE1C.91     
     *,PSTAR(P_FIELD)         !IN. SURFACE PRESSURE AT P POINTS.           VERTVE1C.92     
                                                                           VERTVE1C.93     
      REAL                                                                 VERTVE1C.94     
     * SUM_DIVERGENCE(P_FIELD,P_LEVELS) !OUT. HOLDS MASS                   VERTVE1C.95     
     *                              ! WEIGHTED VERTICAL VELOCITY.          VERTVE1C.96     
                                                                           VERTVE1C.97     
      REAL                                                                 VERTVE1C.98     
     * ETADOT_MEAN(P_FIELD,P_LEVELS) !INOUT. HOLDS ACCUMULATED MASS-       VERTVE1C.99     
     *                              ! WEIGHTED VERTICAL VELOCITY DIVIDED   VERTVE1C.100    
     *                              ! BY NUMBER OF ADJUSTMENT_STEPS.       VERTVE1C.101    
     *,RECIP_RS_SQUARED_SURFACE(P_FIELD) !INOUT. HOLDS 1./(RS*RS) AT       VERTVE1C.102    
     *                              ! MODEL SURFACE. SET ON FIRST CALL     VERTVE1C.103    
     *                              ! AND HELD CONSTANT FOR ALL            VERTVE1C.104    
     *                              ! SUBSEQUENT ONES.                     VERTVE1C.105    
C*---------------------------------------------------------------------    VERTVE1C.106    
*IF DEF,MPP                                                                VERTVE1C.107    
! Parameters for MPP code                                                  VERTVE1C.108    
*ENDIF                                                                     VERTVE1C.109    
                                                                           VERTVE1C.110    
C*L   3 LOCAL ARRAYS NEEDED. -----------------------------------------     VERTVE1C.111    
                                                                           VERTVE1C.112    
      REAL                                                                 VERTVE1C.113    
     *  DU_DLONGITUDE(P_FIELD)                                             VERTVE1C.114    
     *, DV_DLATITUDE(P_FIELD)                                              VERTVE1C.115    
     *, DV_DLATITUDE2(U_FIELD)                                             VERTVE1C.116    
*IF DEF,MPP,AND,DEF,GLOBAL                                                 VERTVE1C.117    
      REAL                                                                 VERTVE1C.118    
     & sum_tmp(ROW_LENGTH-2*EW_Halo,P_LEVELS),                             VERTVE1C.119    
     & sums(P_LEVELS)                                                      VERTVE1C.120    
*ENDIF                                                                     VERTVE1C.121    
C*---------------------------------------------------------------------    VERTVE1C.122    
                                                                           VERTVE1C.123    
C DEFINE COUNT VARIABLES FOR DO LOOPS ETC.                                 VERTVE1C.124    
      INTEGER                                                              VERTVE1C.125    
     *  I,J,K                                                              VERTVE1C.126    
     *  ,START_POINT,END_POINT                                             VERTVE1C.127    
     *,LEVEL                                                               VERTVE1C.128    
     &, POINTS                                                             VERTVE1C.129    
*IF DEF,MPP                                                                VERTVE1C.130    
      INTEGER info                                                         VERTVE1C.131    
*ENDIF                                                                     VERTVE1C.132    
C DEFINE LOCAL SCALARS                                                     VERTVE1C.133    
      REAL                                                                 VERTVE1C.134    
     * RECIP_ADJUSTMENT_STEPS                                              VERTVE1C.135    
*IF -DEF,MPP                                                               VERTVE1C.136    
      REAL                                                                 VERTVE1C.137    
     *  SCALAR1                                                            VERTVE1C.138    
     *, SCALAR2                                                            VERTVE1C.139    
*ELSE                                                                      VERTVE1C.140    
      REAL                                                                 VERTVE1C.141    
     *  SCALAR                                                             VERTVE1C.142    
*ENDIF                                                                     VERTVE1C.143    
                                                                           VERTVE1C.144    
*IF DEF,GLOBAL                                                             VERTVE1C.145    
      REAL SUM_N,SUM_S                                                     VERTVE1C.146    
*ENDIF                                                                     VERTVE1C.147    
                                                                           VERTVE1C.148    
C*---------------------------------------------------------------------    VERTVE1C.149    
*CALL C_A                                                                  VERTVE1C.150    
C*L   EXTERNAL SUBROUTINE CALLS:- ( IF LWHITBROM ) ---------------         VERTVE1C.151    
      EXTERNAL CALC_RS                                                     VERTVE1C.152    
C*---------------------------------------------------------------------    VERTVE1C.153    
                                                                           VERTVE1C.154    
CL    MAXIMUM VECTOR LENGTH ASSUMED IS ROWS*ROW_LENGTH.                    VERTVE1C.155    
CL---------------------------------------------------------------------    VERTVE1C.156    
CL    INTERNAL STRUCTURE.                                                  VERTVE1C.157    
! All references to poles in the comments, apply equally to the            VERTVE1C.158    
! Northern and Southern rows when used in LAM configuration.               VERTVE1C.159    
! References to halos apply only to MPP code.                              VERTVE1C.160    
CL---------------------------------------------------------------------    VERTVE1C.161    
CL                                                                         VERTVE1C.162    
CL---------------------------------------------------------------------    VERTVE1C.163    
CL    SECTION 1. CALCULATE DIVERGENCE AS IN EQUATION (30).                 VERTVE1C.164    
CL---------------------------------------------------------------------    VERTVE1C.165    
                                                                           VERTVE1C.166    
      POINTS=LAST_P_VALID_PT-FIRST_VALID_PT+1                              VERTVE1C.167    
! Number of points to be processed by CALC_RS. For non-MPP runs this       VERTVE1C.168    
! is simply P_FIELD, for MPP, it is all the points, minus any              VERTVE1C.169    
! unused halo areas (ie. the halo above North pole row, and beneath        VERTVE1C.170    
! South pole row)                                                          VERTVE1C.171    
                                                                           VERTVE1C.172    
C LOOP OVER LEVELS                                                         VERTVE1C.173    
      DO 100 K=1,P_LEVELS                                                  VERTVE1C.174    
                                                                           VERTVE1C.175    
*IF DEF,GLOBAL                                                             APB3F405.433    
C CALCULATE DU/D(LAMDA)                                                    VERTVE1C.176    
! Loop over all points except South Pole, missing halos                    VERTVE1C.177    
        DO 110 I=START_POINT_NO_HALO - ROW_LENGTH +1,                      VERTVE1C.178    
     &           END_P_POINT_NO_HALO                                       VERTVE1C.179    
          DU_DLONGITUDE(I) = LONGITUDE_STEP_INVERSE*(U(I,K)-U(I-1,K))      VERTVE1C.180    
 110    CONTINUE                                                           VERTVE1C.181    
                                                                           VERTVE1C.182    
C CALCULATE DV/D(PHI)                                                      VERTVE1C.183    
! Loop over all non-polar points, missing halos                            VERTVE1C.184    
        DO 120 I=START_POINT_NO_HALO , END_P_POINT_NO_HALO                 VERTVE1C.185    
          DV_DLATITUDE(I) = LATITUDE_STEP_INVERSE*(V(I-ROW_LENGTH,K)       VERTVE1C.186    
     *                         -V(I,K))                                    VERTVE1C.187    
 120    CONTINUE                                                           VERTVE1C.188    
                                                                           VERTVE1C.189    
C CALCULATE AVERAGE OF DV_DLATITUDE                                        VERTVE1C.191    
! Loop over all non-polar points, missing halos and first point            VERTVE1C.192    
        DO 130 I=START_POINT_NO_HALO+1 , END_P_POINT_NO_HALO               VERTVE1C.193    
          DV_DLATITUDE2(I) = DV_DLATITUDE(I) + DV_DLATITUDE(I-1)           VERTVE1C.194    
 130    CONTINUE                                                           VERTVE1C.195    
                                                                           VERTVE1C.196    
*IF -DEF,MPP                                                               VERTVE1C.197    
C NOW DO FIRST POINT ON EACH SLICE FOR DU_DLONGITUDE AND DV_DLATITUDE2     VERTVE1C.198    
! Set the first point of the Northern row we missed in loop 110            VERTVE1C.199    
        I=START_POINT_NO_HALO - ROW_LENGTH                                 VERTVE1C.200    
        DU_DLONGITUDE(I) = LONGITUDE_STEP_INVERSE * (U(I,K)                VERTVE1C.201    
     *                        - U(I + ROW_LENGTH - 1,K))                   VERTVE1C.202    
! Loop over all non-polar points, missing halos                            VERTVE1C.203    
        DO 140 I=START_POINT_NO_HALO , END_P_POINT_NO_HALO,                VERTVE1C.204    
     &           ROW_LENGTH                                                VERTVE1C.205    
          DU_DLONGITUDE(I) = LONGITUDE_STEP_INVERSE * (U(I,K)              VERTVE1C.206    
     *                        - U(I + ROW_LENGTH - 1,K))                   VERTVE1C.207    
         DV_DLATITUDE2(I)=DV_DLATITUDE(I)+DV_DLATITUDE(I-1+ROW_LENGTH)     VERTVE1C.208    
 140    CONTINUE                                                           VERTVE1C.209    
*ELSE                                                                      VERTVE1C.210    
! Set the first element of arrays where loops have skipped:                VERTVE1C.211    
! Loop 110:                                                                VERTVE1C.212    
        DU_DLONGITUDE(START_POINT_NO_HALO - ROW_LENGTH)=                   VERTVE1C.213    
     &    DU_DLONGITUDE(START_POINT_NO_HALO - ROW_LENGTH + 1)              VERTVE1C.214    
! Loop 130:                                                                VERTVE1C.215    
        DV_DLATITUDE2(START_POINT_NO_HALO)=                                VERTVE1C.216    
     &    DV_DLATITUDE2(START_POINT_NO_HALO+1)                             VERTVE1C.217    
*ENDIF                                                                     VERTVE1C.218    
                                                                           VERTVE1C.219    
C CALCULATE DIVERGENCES.                                                   VERTVE1C.220    
                                                                           VERTVE1C.221    
! Loop over all non-polar points, missing halos                            VERTVE1C.222    
        DO 150 J=START_POINT_NO_HALO , END_P_POINT_NO_HALO                 VERTVE1C.223    
          SUM_DIVERGENCE(J,K)= SEC_P_LATITUDE(J)*.5*(DU_DLONGITUDE(J)      VERTVE1C.224    
     *                           + DU_DLONGITUDE(J-ROW_LENGTH)             VERTVE1C.225    
     *                           + DV_DLATITUDE2(J))                       VERTVE1C.226    
 150    CONTINUE                                                           VERTVE1C.227    
*ELSE                                                                      VERTVE1C.228    
! I don't think the following code is required:                            VERTVE1C.229    
!      DU_DLONGITUDE(1) = 0.                                               VERTVE1C.230    
! MPP: DU_DLONGITUDE(Offy*ROW_LENGTH+1) = 0.                               VERTVE1C.231    
                                                                           VERTVE1C.232    
C CALCULATE DIVERGENCES.                                                   VERTVE1C.233    
                                                                           VERTVE1C.234    
! Loop over all non-polar points, missing first and last points            VERTVE1C.235    
        DO 130 I=START_POINT_NO_HALO+1 , END_P_POINT_NO_HALO-1             APB3F405.434    
          SUM_DIVERGENCE(I,K)= SEC_P_LATITUDE(I)*.5*                       APB3F405.435    
     *                  (LONGITUDE_STEP_INVERSE*(U(I,K)-U(I-1,K)           APB3F405.436    
     *                + U(I-ROW_LENGTH,K)-U(I-1-ROW_LENGTH,K))             APB3F405.437    
     *                + LATITUDE_STEP_INVERSE*(V(I-ROW_LENGTH,K)-V(I,K)    APB3F405.438    
     *                + V(I-1-ROW_LENGTH,K)-V(I-1,K)))                     APB3F405.439    
 130    CONTINUE                                                           VERTVE1C.240    
                                                                           VERTVE1C.241    
*IF DEF,MPP                                                                VERTVE1C.242    
! Put some real numbers at start and end                                   VERTVE1C.243    
        SUM_DIVERGENCE(START_POINT_NO_HALO,K)=0.0                          VERTVE1C.244    
        SUM_DIVERGENCE(END_P_POINT_NO_HALO,K)=0.0                          VERTVE1C.245    
*ENDIF                                                                     VERTVE1C.246    
C ZERO DIVERGENCES ON BOUNDARIES.                                          VERTVE1C.247    
*IF -DEF,MPP                                                               VERTVE1C.248    
! Loop over all non-polar points at left edge of grid (ie. first           VERTVE1C.249    
! point of each row)                                                       VERTVE1C.250    
        DO 140 J=START_POINT_NO_HALO,END_P_POINT_NO_HALO,ROW_LENGTH        VERTVE1C.251    
          SUM_DIVERGENCE(J,K) = 0.                                         VERTVE1C.252    
          SUM_DIVERGENCE(J+ROW_LENGTH-1,K) = 0.                            VERTVE1C.253    
 140    CONTINUE                                                           VERTVE1C.254    
*ELSE                                                                      VERTVE1C.255    
        IF (at_left_of_LPG) THEN                                           VERTVE1C.256    
! Loop over first real (ie. not halo) non-polar point of each row          VERTVE1C.257    
          DO J=START_POINT_NO_HALO+FIRST_ROW_PT-1,                         VERTVE1C.258    
     &         END_P_POINT_NO_HALO,ROW_LENGTH                              VERTVE1C.259    
            SUM_DIVERGENCE(J,K) = 0.0                                      VERTVE1C.260    
          ENDDO                                                            VERTVE1C.261    
        ENDIF                                                              VERTVE1C.262    
                                                                           VERTVE1C.263    
        IF (at_right_of_LPG) THEN                                          VERTVE1C.264    
! Loop over last real (ie. not halo) non-polar point of each row           VERTVE1C.265    
          DO J=START_POINT_NO_HALO+LAST_ROW_PT-1,                          VERTVE1C.266    
     &         END_P_POINT_NO_HALO,ROW_LENGTH                              VERTVE1C.267    
            SUM_DIVERGENCE(J,K) = 0.0                                      VERTVE1C.268    
          ENDDO                                                            VERTVE1C.269    
        ENDIF                                                              VERTVE1C.270    
*ENDIF                                                                     VERTVE1C.271    
*ENDIF                                                                     VERTVE1C.272    
                                                                           VERTVE1C.273    
                                                                           VERTVE1C.274    
C END LOOP OVER LEVELS                                                     VERTVE1C.275    
 100  CONTINUE                                                             VERTVE1C.276    
*IF DEF,GLOBAL                                                             VERTVE1C.277    
! Calculate divergence at poles by summing DV/D(LAT) around polar          VERTVE1C.278    
! circle and averaging.                                                    VERTVE1C.279    
                                                                           VERTVE1C.280    
!      START_POINT=TOP_ROW_START+LAST_ROW_PT-1   ! Last point of NP row    VERTVE1C.281    
!      END_POINT= P_BOT_ROW_START+FIRST_ROW_PT-1 ! First point of SP row   VERTVE1C.282    
       START_POINT=START_POINT_NO_HALO-1                                   VERTVE1C.283    
       END_POINT=END_P_POINT_NO_HALO+1                                     VERTVE1C.284    
                                                                           VERTVE1C.285    
                                                                           VERTVE1C.286    
! New start and end points to include one point of each pole               VERTVE1C.287    
                                                                           VERTVE1C.288    
*IF -DEF,MPP                                                               VERTVE1C.289    
      SCALAR1= SEC_P_LATITUDE(TOP_ROW_START)*LATITUDE_STEP_INVERSE /       VERTVE1C.290    
     &         GLOBAL_ROW_LENGTH                                           VERTVE1C.291    
      SCALAR2= SEC_P_LATITUDE(P_BOT_ROW_START)                             VERTVE1C.292    
     &          *LATITUDE_STEP_INVERSE / GLOBAL_ROW_LENGTH                 VERTVE1C.293    
                                                                           VERTVE1C.294    
      DO K=1,P_LEVELS                                                      VERTVE1C.295    
        SUM_N=0.0                                                          VERTVE1C.296    
        SUM_S=0.0                                                          VERTVE1C.297    
        DO I=1,ROW_LENGTH                                                  VERTVE1C.298    
          SUM_N = SUM_N - V(I,K)*SCALAR1                                   VERTVE1C.299    
          SUM_S = SUM_S + V(U_BOT_ROW_START-1+I,K)*SCALAR2                 VERTVE1C.300    
        ENDDO                                                              VERTVE1C.301    
        SUM_DIVERGENCE(START_POINT,K) = SUM_N                              VERTVE1C.302    
        SUM_DIVERGENCE(END_POINT,K) = SUM_S                                VERTVE1C.303    
      ENDDO                                                                VERTVE1C.304    
*ELSE                                                                      VERTVE1C.305    
! Do sum across North Pole                                                 VERTVE1C.306    
      IF (at_top_of_LPG) THEN                                              VERTVE1C.307    
        SCALAR = SEC_P_LATITUDE(TOP_ROW_START)*LATITUDE_STEP_INVERSE /     VERTVE1C.308    
     &           GLOBAL_ROW_LENGTH                                         VERTVE1C.309    
        DO K=1,P_LEVELS                                                    VERTVE1C.310    
! Copy up the items to be summed into a temporary array                    VERTVE1C.311    
! Loop over all the non-halo points on a row                               VERTVE1C.312    
          DO I=FIRST_ROW_PT,LAST_ROW_PT                                    VERTVE1C.313    
            sum_tmp(I-FIRST_ROW_PT+1,K)=                                   VERTVE1C.314    
     &         -V(TOP_ROW_START+I-1,K)*SCALAR                              VERTVE1C.315    
          ENDDO                                                            VERTVE1C.316    
        ENDDO                                                              VERTVE1C.317    
                                                                           VERTVE1C.318    
! And perform the sum                                                      VERTVE1C.319    
        CALL GCG_RVECSUMR(ROW_LENGTH-2*EW_Halo , ROW_LENGTH-2*EW_Halo,     VERTVE1C.320    
     &                    1,P_LEVELS,sum_tmp,GC_ROW_GROUP,                 VERTVE1C.321    
     &                    info,sums)                                       VERTVE1C.322    
                                                                           VERTVE1C.323    
! And store the result back                                                VERTVE1C.324    
        DO K=1,P_LEVELS                                                    VERTVE1C.325    
          SUM_DIVERGENCE(START_POINT,K)=sums(K)                            VERTVE1C.326    
        ENDDO                                                              VERTVE1C.327    
      ELSE  ! If this processor not at top of LPG                          VERTVE1C.328    
        START_POINT=START_POINT_NO_HALO  ! no North Pole point here        VERTVE1C.329    
      ENDIF                                                                VERTVE1C.330    
                                                                           VERTVE1C.331    
! And sum across South Pole                                                VERTVE1C.332    
      IF (at_base_of_LPG) THEN                                             VERTVE1C.333    
        SCALAR=SEC_P_LATITUDE(P_BOT_ROW_START)*LATITUDE_STEP_INVERSE/      VERTVE1C.334    
     &         GLOBAL_ROW_LENGTH                                           VERTVE1C.335    
                                                                           VERTVE1C.336    
        DO K=1,P_LEVELS                                                    VERTVE1C.337    
! Copy up the items to be summed into a temporary array                    VERTVE1C.338    
! Loop over all the non-halo points on a row                               VERTVE1C.339    
          DO I=FIRST_ROW_PT,LAST_ROW_PT                                    VERTVE1C.340    
            sum_tmp(I-FIRST_ROW_PT+1,K)=                                   VERTVE1C.341    
     &        V(U_BOT_ROW_START+I-1,K)*SCALAR                              VERTVE1C.342    
          ENDDO                                                            VERTVE1C.343    
        ENDDO                                                              VERTVE1C.344    
                                                                           VERTVE1C.345    
! And perform the sum                                                      VERTVE1C.346    
        CALL GCG_RVECSUMR(ROW_LENGTH-2*EW_Halo , ROW_LENGTH-2*EW_Halo,     VERTVE1C.347    
     &                    1,P_LEVELS,sum_tmp,GC_ROW_GROUP,                 VERTVE1C.348    
     &                    info,sums)                                       VERTVE1C.349    
                                                                           VERTVE1C.350    
! And store the result back                                                VERTVE1C.351    
        DO K=1,P_LEVELS                                                    VERTVE1C.352    
          SUM_DIVERGENCE(END_POINT,K)=sums(K)                              VERTVE1C.353    
        ENDDO                                                              VERTVE1C.354    
      ELSE  ! If this processor not at the bottom of LPG                   VERTVE1C.355    
        END_POINT=END_P_POINT_NO_HALO  ! no South Pole point here          VERTVE1C.356    
      ENDIF                                                                VERTVE1C.357    
*ENDIF                                                                     VERTVE1C.358    
*ELSE                                                                      VERTVE1C.359    
      START_POINT=START_POINT_NO_HALO                                      VERTVE1C.360    
      END_POINT=END_P_POINT_NO_HALO                                        VERTVE1C.361    
*ENDIF                                                                     VERTVE1C.362    
                                                                           VERTVE1C.363    
CL                                                                         VERTVE1C.364    
CL---------------------------------------------------------------------    VERTVE1C.365    
CL    SECTION 2. CALCULATE VERTICAL VELOCITY. EQUATION (29).               VERTVE1C.366    
CL---------------------------------------------------------------------    VERTVE1C.367    
                                                                           VERTVE1C.368    
                                                                           VERTVE1C.369    
C ---------------------------------------------------------------------    VERTVE1C.370    
CL    SECTION 2.1 SUM DIVERGENCES THROUGHOUT ATMOSPHERE.                   VERTVE1C.371    
C ---------------------------------------------------------------------    VERTVE1C.372    
                                                                           VERTVE1C.373    
C BY CODING THE SUMMATION AS FOLLOWS THE VALUES PUT INTO EACH LEVEL        VERTVE1C.374    
C OF SUM_DIVERGENCE ARE THE ONES NEEDED FOR THE SECOND SUMMATION TERM      VERTVE1C.375    
C IN EQUATION 29, WHILE THE TOTAL SUM IS HELD IN SUM_DIVERGENCE( ,1)       VERTVE1C.376    
                                                                           VERTVE1C.377    
      DO 210 K=P_LEVELS-1,1,-1                                             VERTVE1C.378    
        DO 212 I=START_POINT,END_POINT                                     VERTVE1C.379    
          SUM_DIVERGENCE(I,K)= SUM_DIVERGENCE(I,K)+SUM_DIVERGENCE(I,K+1)   VERTVE1C.380    
 212    CONTINUE                                                           VERTVE1C.381    
 210  CONTINUE                                                             VERTVE1C.382    
                                                                           VERTVE1C.383    
C ---------------------------------------------------------------------    VERTVE1C.384    
CL    SECTION 2.2 CALCULATE MASS-WEIGHTED VERTICAL VELOCITY.               VERTVE1C.385    
CL                CALCULATE 1/(RS*RS) IF THIS IS CALL NUMBER ONE.          VERTVE1C.386    
C ---------------------------------------------------------------------    VERTVE1C.387    
                                                                           VERTVE1C.388    
      IF(CALL_NUMBER.EQ.1) THEN                                            VERTVE1C.389    
CL    CALCULATE 1/(RS*RS) AT MODEL SURFACE                                 VERTVE1C.390    
                                                                           VERTVE1C.391    
      IF (.NOT.LWHITBROM) THEN                                             VERTVE1C.392    
                                                                           VERTVE1C.393    
! loop over all points, including valid halos                              VERTVE1C.394    
        DO 220 I=FIRST_VALID_PT,LAST_P_VALID_PT                            VERTVE1C.395    
          RECIP_RS_SQUARED_SURFACE(I) = 1./(A*A)                           VERTVE1C.396    
 220    CONTINUE                                                           VERTVE1C.397    
                                                                           VERTVE1C.398    
      ELSE                                                                 VERTVE1C.399    
                                                                           VERTVE1C.400    
        LEVEL=1                                                            VERTVE1C.401    
C DV_DLATITUDE,DU_DLONGITUDE ARE DUMMY ARRAYS REQUIRED BY CALC_RS AND      VERTVE1C.402    
C THE CONTENTS TRANSFERED TO AND RETURNED FROM IT ARE IRRELEVANT.          VERTVE1C.403    
        CALL CALC_RS(PSTAR(FIRST_VALID_PT),AKH,BKH,                        VERTVE1C.404    
     &               DV_DLATITUDE(FIRST_VALID_PT),                         VERTVE1C.405    
     &               DU_DLONGITUDE(FIRST_VALID_PT),                        VERTVE1C.406    
     *               RECIP_RS_SQUARED_SURFACE(FIRST_VALID_PT),             VERTVE1C.407    
     &               POINTS,LEVEL,P_LEVELS,LLINTS)                         VERTVE1C.408    
! loop over all points, including valid halos                              VERTVE1C.409    
        DO 320 I=FIRST_VALID_PT,LAST_P_VALID_PT                            VERTVE1C.410    
          RECIP_RS_SQUARED_SURFACE(I)= 1./(RECIP_RS_SQUARED_SURFACE(I)*    VERTVE1C.411    
     *                                 RECIP_RS_SQUARED_SURFACE(I))        VERTVE1C.412    
 320    CONTINUE                                                           VERTVE1C.413    
                                                                           VERTVE1C.414    
      END IF      !     LWHITBROM                                          VERTVE1C.415    
                                                                           VERTVE1C.416    
      END IF                                                               VERTVE1C.417    
                                                                           VERTVE1C.418    
C DP/D(PSTAR) IS NOTHING MORE THAN THE BK COEFFICENT.                      VERTVE1C.419    
*IF -DEF,STRAT                                                             VERTVE1C.420    
                                                                           VERTVE1C.421    
      DO 222 K= P_LEVELS,2,-1                                              VERTVE1C.422    
CFPP$ SELECT(CONCUR)                                                       VERTVE1C.423    
        DO 224 I=START_POINT,END_POINT                                     VERTVE1C.424    
          SUM_DIVERGENCE(I,K)= SUM_DIVERGENCE(I,K) - BKH(K)                VERTVE1C.425    
     *                          * SUM_DIVERGENCE(I,1)*RS(I,K)*RS(I,K)*     VERTVE1C.426    
     *                          RECIP_RS_SQUARED_SURFACE(I)                VERTVE1C.427    
 224    CONTINUE                                                           VERTVE1C.428    
 222  CONTINUE                                                             VERTVE1C.429    
                                                                           VERTVE1C.430    
*ENDIF                                                                     VERTVE1C.431    
C ---------------------------------------------------------------------    VERTVE1C.432    
CL    SECTION 2.3 ACCUMULATE MASS-WEIGHTED VERTICAL VELOCITY DIVIDED       VERTVE1C.433    
CL                BY NUMBER OF ADJUSTMENT TIMESTEPS.                       VERTVE1C.434    
C ---------------------------------------------------------------------    VERTVE1C.435    
                                                                           VERTVE1C.436    
      RECIP_ADJUSTMENT_STEPS = 1./ ADJUSTMENT_STEPS                        VERTVE1C.437    
      DO K= 1,P_LEVELS                                                     VERTVE1C.438    
                                                                           VERTVE1C.439    
      IF (CALL_NUMBER.EQ.1)THEN                                            VERTVE1C.440    
                                                                           VERTVE1C.441    
CFPP$ SELECT(CONCUR)                                                       VERTVE1C.442    
        DO  I=START_POINT,END_POINT                                        VERTVE1C.443    
          ETADOT_MEAN(I,K)= SUM_DIVERGENCE(I,K)                            VERTVE1C.444    
     *                          * RECIP_ADJUSTMENT_STEPS                   VERTVE1C.445    
        ENDDO                                                              VERTVE1C.446    
                                                                           VERTVE1C.447    
*IF -DEF,GLOBAL                                                            ARB0F405.3      
C For limited area runs need to set North- & Southmost rows of             ARB0F405.4      
C ETADOT_MEAN to zero, to avoid failure in P_TO_UV in UV_ADV.              ARB0F405.5      
                                                                           ARB0F405.6      
*IF DEF,MPP                                                                ARB0F405.7      
        IF (at_top_of_LPG) THEN                                            ARB0F405.8      
*ENDIF                                                                     ARB0F405.9      
          DO I = TOP_ROW_START,TOP_ROW_START+ROW_LENGTH                    ARB0F405.10     
            ETADOT_MEAN(I,K) = 0.0                                         ARB0F405.11     
          END DO                                                           ARB0F405.12     
*IF DEF,MPP                                                                ARB0F405.13     
        END IF                                                             ARB0F405.14     
                                                                           ARB0F405.15     
        IF (at_base_of_LPG) THEN                                           ARB0F405.16     
*ENDIF                                                                     ARB0F405.17     
          DO I = P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH                ARB0F405.18     
            ETADOT_MEAN(I,K) = 0.0                                         ARB0F405.19     
          END DO                                                           ARB0F405.20     
*IF DEF,MPP                                                                ARB0F405.21     
        END IF                                                             ARB0F405.22     
*ENDIF                                                                     ARB0F405.23     
                                                                           ARB0F405.24     
*ENDIF                                                                     ARB0F405.25     
      ELSE                                                                 VERTVE1C.448    
                                                                           VERTVE1C.449    
CFPP$ SELECT(CONCUR)                                                       VERTVE1C.450    
        DO  I=START_POINT,END_POINT                                        VERTVE1C.451    
          ETADOT_MEAN(I,K)= ETADOT_MEAN(I,K) + SUM_DIVERGENCE(I,K)         VERTVE1C.452    
     *                          * RECIP_ADJUSTMENT_STEPS                   VERTVE1C.453    
        ENDDO                                                              VERTVE1C.454    
                                                                           VERTVE1C.455    
      ENDIF                                                                VERTVE1C.456    
      ENDDO                                                                VERTVE1C.457    
                                                                           VERTVE1C.458    
*IF DEF,GLOBAL                                                             VERTVE1C.459    
C IF GLOBAL MODEL SET ALL POINTS AT POLES TO THE UNIQUE VALUE.             VERTVE1C.460    
      DO 240 K=1,P_LEVELS                                                  VERTVE1C.461    
CDIR$ IVDEP                                                                VERTVE1C.462    
! Fujitsu vectorization directive                                          GRB0F405.555    
!OCL NOVREC                                                                GRB0F405.556    
*IF DEF,MPP                                                                VERTVE1C.463    
        IF (at_top_of_LPG) THEN                                            VERTVE1C.464    
*ENDIF                                                                     VERTVE1C.465    
! Loop over North Pole points, missing out the last (START_POINT)          VERTVE1C.466    
! point.                                                                   VERTVE1C.467    
          DO I=TOP_ROW_START+FIRST_ROW_PT-1,                               VERTVE1C.468    
     &         TOP_ROW_START+LAST_ROW_PT-1                                 VERTVE1C.469    
            ETADOT_MEAN(I,K)=ETADOT_MEAN(START_POINT,K)                    VERTVE1C.470    
            SUM_DIVERGENCE(I,K)=SUM_DIVERGENCE(START_POINT,K)              VERTVE1C.471    
          ENDDO                                                            VERTVE1C.472    
*IF DEF,MPP                                                                VERTVE1C.473    
        ENDIF  ! at North Pole                                             VERTVE1C.474    
*ENDIF                                                                     VERTVE1C.475    
                                                                           VERTVE1C.476    
*IF DEF,MPP                                                                VERTVE1C.477    
        IF (at_base_of_LPG) THEN                                           VERTVE1C.478    
*ENDIF                                                                     VERTVE1C.479    
! Loop over South Pole points, missing out the first (END_POINT)           VERTVE1C.480    
! point.                                                                   VERTVE1C.481    
          DO I=P_BOT_ROW_START+FIRST_ROW_PT-1,                             VERTVE1C.482    
     &         P_BOT_ROW_START+LAST_ROW_PT-1                               VERTVE1C.483    
            ETADOT_MEAN(I,K)=ETADOT_MEAN(END_POINT,K)                      VERTVE1C.484    
            SUM_DIVERGENCE(I,K)=SUM_DIVERGENCE(END_POINT,K)                VERTVE1C.485    
          ENDDO                                                            VERTVE1C.486    
*IF DEF,MPP                                                                VERTVE1C.487    
        ENDIF  ! at South Pole                                             VERTVE1C.488    
*ENDIF                                                                     VERTVE1C.489    
 240  CONTINUE                                                             VERTVE1C.490    
*ENDIF                                                                     VERTVE1C.491    
                                                                           VERTVE1C.492    
CL    END OF ROUTINE VERT_VEL                                              VERTVE1C.493    
                                                                           VERTVE1C.494    
      RETURN                                                               VERTVE1C.495    
      END                                                                  VERTVE1C.496    
*ENDIF                                                                     VERTVE1C.497