*IF DEF,A10_1B                                                             VERTVE1B.2      
C ******************************COPYRIGHT******************************    VERTVE1B.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    VERTVE1B.4      
C                                                                          VERTVE1B.5      
C Use, duplication or disclosure of this code is subject to the            VERTVE1B.6      
C restrictions as set forth in the contract.                               VERTVE1B.7      
C                                                                          VERTVE1B.8      
C                Meteorological Office                                     VERTVE1B.9      
C                London Road                                               VERTVE1B.10     
C                BRACKNELL                                                 VERTVE1B.11     
C                Berkshire UK                                              VERTVE1B.12     
C                RG12 2SZ                                                  VERTVE1B.13     
C                                                                          VERTVE1B.14     
C If no contract has been raised with this copy of the code, the use,      VERTVE1B.15     
C duplication or disclosure of it is strictly prohibited.  Permission      VERTVE1B.16     
C to do so must first be obtained in writing from the Head of Numerical    VERTVE1B.17     
C Modelling at the above address.                                          VERTVE1B.18     
C ******************************COPYRIGHT******************************    VERTVE1B.19     
C                                                                          VERTVE1B.20     
CLL   SUBROUTINE VERT_VEL -------------------------------------------      VERTVE1B.21     
CLL                                                                        VERTVE1B.22     
CLL   PURPOSE:  CALCULATES DIVERGENCE FROM MASS-WEIGHTED HORIZONTAL        VERTVE1B.23     
CLL             VELOCITY COMPONENTS USING EQUATION (30).                   VERTVE1B.24     
CLL             THEN DERIVES MASS-WEIGHTED VERTICAL VELOCITY               VERTVE1B.25     
CLL             FIELD, EQUATION (29).                                      VERTVE1B.26     
CLL   NOT SUITABLE FOR SINGLE COLUMN USE.                                  VERTVE1B.27     
CLL   VERSION FOR CRAY Y-MP                                                VERTVE1B.28     
CLL   WRITTEN BY M.H MAWSON.                                               VERTVE1B.29     
CLL                                                                        VERTVE1B.30     
CLL  MODEL            MODIFICATION HISTORY:                                VERTVE1B.31     
CLL VERSION  DATE                                                          VERTVE1B.32     
!LL   4.2   28/10/96  New deck for HADCM2-specific section A10_1B,         VERTVE1B.33     
!LL                   as VERTVE1A but with inconsistent 'old' type         VERTVE1B.34     
!LL                   of polar weights.  T.Johns                           VERTVE1B.35     
!LL   4.3   14/04/97  Updated in line with MPP optimisations.  T Johns     ATJ0F403.67     
CLL                                                                        VERTVE1B.36     
CLL   PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4,       VERTVE1B.37     
CLL                         STANDARD B. VERSION 2, DATED 18/01/90          VERTVE1B.38     
CLL                                                                        VERTVE1B.39     
CLL   SYSTEM COMPONENTS COVERED: P112                                      VERTVE1B.40     
CLL                                                                        VERTVE1B.41     
CLL   SYSTEM TASK: P1                                                      VERTVE1B.42     
CLL                                                                        VERTVE1B.43     
CLL   DOCUMENTATION:       THE EQUATIONS USED ARE (29) AND (30)            VERTVE1B.44     
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10     VERTVE1B.45     
CLL                        M.J.P. CULLEN,T.DAVIES AND M.H. MAWSON,         VERTVE1B.46     
CLL                        VERSION 17 DATED 11/02/91.                      VERTVE1B.47     
CLLEND-------------------------------------------------------------        VERTVE1B.48     
                                                                           VERTVE1B.49     
C*L   ARGUMENTS:---------------------------------------------------        VERTVE1B.50     
                                                                           VERTVE1B.51     

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