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

      SUBROUTINE DIV_DAMP                                                   2,14DIVDMP1D.49     
     1   (U,V,RS,SEC_U_LATITUDE,PSTAR_OLD,COS_U_LATITUDE,                  DIVDMP1D.50     
     2                 KD,LONGITUDE_STEP_INVERSE,LATITUDE_STEP_INVERSE,    DIVDMP1D.51     
     3                 P_FIELD,U_FIELD,ROW_LENGTH,P_LEVELS,                DIVDMP1D.52     
*CALL ARGFLDPT                                                             DIVDMP1D.53     
     4                 BKH,ADVECTION_TIMESTEP,DELTA_AK,                    DIVDMP1D.54     
     5                 DELTA_BK,COS_U_LONGITUDE,SIN_U_LONGITUDE,           DIVDMP1D.55     
     6                 SEC_P_LATITUDE)                                     DIVDMP1D.56     
                                                                           DIVDMP1D.57     
      IMPLICIT NONE                                                        DIVDMP1D.58     
                                                                           DIVDMP1D.59     
      INTEGER                                                              DIVDMP1D.60     
     *  P_FIELD            !IN DIMENSION OF FIELDS ON PRESSSURE GRID.      DIVDMP1D.61     
     *, U_FIELD            !IN DIMENSION OF FIELDS ON VELOCITY GRID        DIVDMP1D.62     
     *, P_LEVELS           !IN NUMBER OF PRESSURE LEVELS.                  DIVDMP1D.63     
     *, ROW_LENGTH         !IN NUMBER OF POINTS PER ROW                    DIVDMP1D.64     
! All TYPFLDPT arguments are intent IN                                     DIVDMP1D.65     
*CALL TYPFLDPT                                                             DIVDMP1D.66     
                                                                           DIVDMP1D.67     
      REAL                                                                 DIVDMP1D.68     
     * U(U_FIELD,P_LEVELS)       !IN  U VELOCITY FIELD                     DIVDMP1D.69     
     *,V(U_FIELD,P_LEVELS)       !IN  V VELOCITY FIELD                     DIVDMP1D.70     
     *  ,COS_U_LATITUDE(U_FIELD)  ! cos(lat) at u points (2nd array)       DIVDMP1D.71     
     *,PSTAR_OLD(U_FIELD)        !IN PSTAR AT PREVIOUS TIME-LEVEL AT       DIVDMP1D.72     
     *                           ! U POINTS                                DIVDMP1D.73     
     *,RS(P_FIELD,P_LEVELS)      !IN RS FIELD ON U GRID                    DIVDMP1D.74     
                                                                           DIVDMP1D.75     
      REAL                                                                 DIVDMP1D.76     
     * DELTA_AK(P_LEVELS)      !IN  LAYER THICKNESS                        DIVDMP1D.77     
     *,DELTA_BK(P_LEVELS)      !IN  LAYER THICKNESS                        DIVDMP1D.78     
     *,BKH(P_LEVELS+1)         !IN  SECOND TERM IN HYBRID CO-ORDS AT       DIVDMP1D.79     
     *                         !    HALF LEVELS.                           DIVDMP1D.80     
     *,SEC_U_LATITUDE(U_FIELD) !IN  1/COS(LAT) AT U POINTS (2-D ARRAY)     DIVDMP1D.81     
     *,SEC_P_LATITUDE(P_FIELD) !IN  1/COS(LAT) AT P POINTS (2-D ARRAY)     DIVDMP1D.82     
     *,COS_U_LONGITUDE(ROW_LENGTH) !IN  COS(LONGITUDE) AT U POINTS         DIVDMP1D.83     
     *,SIN_U_LONGITUDE(ROW_LENGTH) !IN  SIN(LONGITUDE) AT U POINTS         DIVDMP1D.84     
     *,LONGITUDE_STEP_INVERSE  !IN 1/(DELTA LAMDA)                         DIVDMP1D.85     
     *,LATITUDE_STEP_INVERSE   !IN 1/(DELTA PHI)                           DIVDMP1D.86     
     *,KD(P_LEVELS)            !IN DIVERGENCE COEFFICIENTS.                DIVDMP1D.87     
     *,ADVECTION_TIMESTEP      !IN                                         DIVDMP1D.88     
C*---------------------------------------------------------------------    DIVDMP1D.89     
                                                                           DIVDMP1D.90     
C*L   DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE-----------------    DIVDMP1D.91     
C DEFINE LOCAL ARRAYS: 7 ARE REQUIRED                                      DIVDMP1D.92     
      REAL                                                                 DIVDMP1D.93     
     *  D(P_FIELD)           ! HOLDS DIVERGENCE AT A LEVEL                 DIVDMP1D.94     
     *, D_BY_DLAT(P_FIELD)   ! HOLDS D/D(LAT) OF DIVERGENCE                DIVDMP1D.95     
     *, D_BY_DLAT2(P_FIELD)  ! HOLDS AVERAGED D_BY_DLAT                    DIVDMP1D.96     
     *, D_BY_DLONG(P_FIELD)  ! HOLDS D/D(LONG) OF DIVERGENCE               DIVDMP1D.97     
     *, DU_DLONGITUDE(U_FIELD)                                             DIVDMP1D.98     
     *, DV_DLATITUDE(U_FIELD)                                              DIVDMP1D.99     
     *, DV_DLATITUDE2(U_FIELD)                                             DIVDMP1D.100    
     *  ,U_MW(U_FIELD)      ! Mass weighted u field                        DIVDMP1D.101    
     *  ,V_MW(U_FIELD)      ! Mass weighted v field                        DIVDMP1D.102    
     *  ,RS_U_GRID(U_FIELD) ! RS field on u grid                           DIVDMP1D.103    
                                                                           DIVDMP1D.104    
C*---------------------------------------------------------------------    DIVDMP1D.105    
C DEFINE LOCAL VARIABLES                                                   DIVDMP1D.106    
                                                                           DIVDMP1D.107    
*IF DEF,MPP                                                                DIVDMP1D.108    
*IF DEF,GLOBAL                                                             DIVDMP1D.109    
      INTEGER info                                                         DIVDMP1D.110    
*ELSE                                                                      DIVDMP1D.111    
      INTEGER row_start_offset,row_end_offset                              DIVDMP1D.112    
*ENDIF                                                                     DIVDMP1D.113    
*ENDIF                                                                     DIVDMP1D.114    
C REAL SCALARS                                                             DIVDMP1D.115    
      REAL                                                                 DIVDMP1D.116    
     * SCALAR                                                              DIVDMP1D.117    
*IF DEF,GLOBAL                                                             DIVDMP1D.118    
     *,SUM_N,SUM_S                                                         DIVDMP1D.119    
*ENDIF                                                                     DIVDMP1D.120    
                                                                           DIVDMP1D.121    
C COUNT VARIABLES FOR DO LOOPS ETC.                                        DIVDMP1D.122    
      INTEGER                                                              DIVDMP1D.123    
     *  I,J,K                                                              DIVDMP1D.124    
                                                                           DIVDMP1D.125    
C*L   EXTERNAL SUBROUTINE CALLS:---------------------------------------    DIVDMP1D.126    
      EXTERNAL P_TO_UV                                                     DIVDMP1D.127    
*IF DEF,GLOBAL                                                             DIVDMP1D.128    
     &  ,POLAR_UV                                                          DIVDMP1D.129    
                                                                           GSS2F402.310    
*ELSE                                                                      DIVDMP1D.134    
C NO EXTERNAL SUBROUTINE CALLS                                             DIVDMP1D.135    
*ENDIF                                                                     DIVDMP1D.136    
C*---------------------------------------------------------------------    DIVDMP1D.137    
                                                                           DIVDMP1D.138    
CL    MAXIMUM VECTOR LENGTH ASSUMED IS P_POINTS_UPDATE                     DIVDMP1D.139    
CL---------------------------------------------------------------------    DIVDMP1D.140    
CL    INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS:                       DIVDMP1D.141    
CL---------------------------------------------------------------------    DIVDMP1D.142    
CL                                                                         DIVDMP1D.143    
CL---------------------------------------------------------------------    DIVDMP1D.144    
CL    SECTION 1.     INITIALISATION                                        DIVDMP1D.145    
CL---------------------------------------------------------------------    DIVDMP1D.146    
C INCLUDE LOCAL CONSTANTS FROM GENERAL CONSTANTS BLOCK                     DIVDMP1D.147    
                                                                           DIVDMP1D.148    
                                                                           DIVDMP1D.149    
CL LOOP OVER P_LEVELS                                                      DIVDMP1D.150    
                                                                           DIVDMP1D.151    
      DO 100 K=1,P_LEVELS                                                  DIVDMP1D.152    
        IF(KD(K).GT.0.) THEN                                               DIVDMP1D.153    
CL      CALCULATE MASS WEIGHTED VELOCITY COMPONENTS                        DIVDMP1D.154    
      CALL P_TO_UV(RS(1,K),RS_U_GRID,P_FIELD,U_FIELD,ROW_LENGTH,           DIVDMP1D.155    
     &             tot_P_ROWS)                                             DIVDMP1D.156    
*IF DEF,MPP                                                                ATJ0F403.205    
      call swapbounds(RS_U_GRID,row_length,tot_u_rows,1,1,1)               ATJ0F403.206    
*ENDIF                                                                     ATJ0F403.207    
! Loop over field, missing North and South halos                           DIVDMP1D.157    
      DO I=FIRST_VALID_PT,LAST_U_VALID_PT                                  ATJ0F403.208    
      SCALAR=RS_U_GRID(I)*(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I))           DIVDMP1D.159    
      U_MW(I)=U(I,K)*SCALAR                                                DIVDMP1D.160    
      V_MW(I)=V(I,K)*SCALAR*COS_U_LATITUDE(I)                              DIVDMP1D.161    
      ENDDO                                                                DIVDMP1D.162    
                                                                           DIVDMP1D.163    
CL                                                                         DIVDMP1D.164    
CL---------------------------------------------------------------------    DIVDMP1D.165    
CL    SECTION 2.     CALCULATE DIVERGENCE USING EQUATION (30)              DIVDMP1D.166    
CL---------------------------------------------------------------------    DIVDMP1D.167    
                                                                           DIVDMP1D.168    
C CALCULATE DU/D(LAMDA)                                                    DIVDMP1D.169    
! Loop over field, starting at second row and ending on row above          DIVDMP1D.170    
! last row. Missing out North and South halos                              DIVDMP1D.171    
          DO 210 I=START_POINT_NO_HALO-ROW_LENGTH+1,                       DIVDMP1D.172    
     &         LAST_U_VALID_PT                                             ATJ0F403.209    
            DU_DLONGITUDE(I) = LONGITUDE_STEP_INVERSE*                     DIVDMP1D.174    
     &  (U_MW(I)-U_MW(I-1))                                                DIVDMP1D.175    
 210      CONTINUE                                                         DIVDMP1D.176    
                                                                           DIVDMP1D.177    
C CALCULATE DV/D(PHI)                                                      DIVDMP1D.178    
! Loop over field, missing top and bottom rows and North and South halos   DIVDMP1D.179    
      DO 220 I=START_POINT_NO_HALO,LAST_U_VALID_PT                         ATJ0F403.210    
            DV_DLATITUDE(I) = LATITUDE_STEP_INVERSE*                       DIVDMP1D.181    
     &  (V_MW(I-ROW_LENGTH)-V_MW(I))                                       DIVDMP1D.182    
 220      CONTINUE                                                         DIVDMP1D.183    
                                                                           DIVDMP1D.184    
*IF DEF,GLOBAL                                                             DIVDMP1D.185    
C CALCULATE AVERAGE OF DV_DLATITUDE                                        DIVDMP1D.186    
! Loop over field, missing first point, poles and North and South halos    DIVDMP1D.187    
      DO 230 I=START_POINT_NO_HALO+1,LAST_U_VALID_PT                       ATJ0F403.211    
            DV_DLATITUDE2(I) = DV_DLATITUDE(I) + DV_DLATITUDE(I-1)         DIVDMP1D.189    
 230      CONTINUE                                                         DIVDMP1D.190    
                                                                           DIVDMP1D.191    
C NOW DO FIRST POINT ON EACH SLICE FOR DU_DLONGITUDE AND DV_DLATITUDE2     DIVDMP1D.192    
*IF -DEF,MPP                                                               DIVDMP1D.193    
          I=START_POINT_NO_HALO-ROW_LENGTH                                 DIVDMP1D.194    
      DU_DLONGITUDE(I)=LONGITUDE_STEP_INVERSE*                             DIVDMP1D.195    
     &                 (U_MW(I)-U_MW(I+ROW_LENGTH-1))                      DIVDMP1D.196    
! Loop over the first point of each row between top and bottom rows        DIVDMP1D.197    
          DO 240 I=START_POINT_NO_HALO,END_P_POINT_NO_HALO,ROW_LENGTH      DIVDMP1D.198    
      DU_DLONGITUDE(I)=LONGITUDE_STEP_INVERSE*                             DIVDMP1D.199    
     &                 (U_MW(I)-U_MW(I+ROW_LENGTH-1))                      DIVDMP1D.200    
          DV_DLATITUDE2(I)=DV_DLATITUDE(I)+DV_DLATITUDE(I-1+ROW_LENGTH)    DIVDMP1D.201    
 240      CONTINUE                                                         DIVDMP1D.202    
*ELSE                                                                      DIVDMP1D.203    
          DU_DLONGITUDE(START_POINT_NO_HALO-ROW_LENGTH)=0.0                DIVDMP1D.204    
          DV_DLATITUDE2(START_POINT_NO_HALO)=0.0                           DIVDMP1D.205    
! No need to do recalculations of end points, but just need to set first   DIVDMP1D.206    
! point of the arrays.                                                     DIVDMP1D.207    
*ENDIF                                                                     DIVDMP1D.208    
                                                                           DIVDMP1D.209    
C CALCULATE DIVERGENCES                                                    DIVDMP1D.210    
                                                                           DIVDMP1D.211    
! Loop over field, missing top and bottom rows and North and South halos   DIVDMP1D.212    
      DO 250 J=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO                   ATJ0F403.212    
            D(J)= SEC_P_LATITUDE(J)*.5*(DU_DLONGITUDE(J)                   DIVDMP1D.214    
     *                           + DU_DLONGITUDE(J-ROW_LENGTH)             DIVDMP1D.215    
     *                           + DV_DLATITUDE2(J))                       DIVDMP1D.216    
 250      CONTINUE                                                         DIVDMP1D.217    
*IF DEF,MPP                                                                ATJ0F403.213    
      call swapbounds(d,row_length,tot_p_rows,1,1,1)                       ATJ0F403.214    
*ENDIF                                                                     ATJ0F403.215    
*ELSE                                                                      DIVDMP1D.218    
! Set first point of top row to zero                                       DIVDMP1D.219    
          DU_DLONGITUDE(START_POINT_NO_HALO-ROW_LENGTH) = 0.0              DIVDMP1D.220    
                                                                           DIVDMP1D.221    
C CALCULATE DIVERGENCES                                                    DIVDMP1D.222    
                                                                           DIVDMP1D.223    
      DO 230 J=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO                   DIVDMP1D.224    
            D(J)= SEC_P_LATITUDE(J)*.5*(DU_DLONGITUDE(J)                   DIVDMP1D.225    
     *                         + DU_DLONGITUDE(J-ROW_LENGTH)               DIVDMP1D.226    
     *                         + DV_DLATITUDE(J) + DV_DLATITUDE(J-1))      DIVDMP1D.227    
 230      CONTINUE                                                         DIVDMP1D.228    
*IF DEF,MPP                                                                ATJ0F403.216    
      call swapbounds(d,row_length,tot_p_rows,1,1,1)                       ATJ0F403.217    
*ENDIF                                                                     ATJ0F403.218    
                                                                           DIVDMP1D.229    
C ZERO DIVERGENCES ON BOUNDARIES.                                          DIVDMP1D.230    
*IF DEF,MPP                                                                DIVDMP1D.231    
          IF (at_top_of_LPG) THEN                                          DIVDMP1D.232    
*ENDIF                                                                     DIVDMP1D.233    
! Loop over Northern row                                                   DIVDMP1D.234    
            DO J=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                  DIVDMP1D.235    
              D(J)=0.0                                                     DIVDMP1D.236    
            ENDDO                                                          DIVDMP1D.237    
*IF DEF,MPP                                                                DIVDMP1D.238    
          ENDIF                                                            DIVDMP1D.239    
                                                                           DIVDMP1D.240    
          IF (at_base_of_LPG) THEN                                         DIVDMP1D.241    
*ENDIF                                                                     DIVDMP1D.242    
! Loop over Southern row                                                   DIVDMP1D.243    
            DO J=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1              DIVDMP1D.244    
              D(J)=0.0                                                     DIVDMP1D.245    
            ENDDO                                                          DIVDMP1D.246    
*IF DEF,MPP                                                                DIVDMP1D.247    
          ENDIF                                                            DIVDMP1D.248    
                                                                           DIVDMP1D.249    
          IF (at_left_of_LPG) THEN                                         DIVDMP1D.250    
*ENDIF                                                                     DIVDMP1D.251    
! Loop over first point in each row                                        DIVDMP1D.252    
            DO J=START_POINT_NO_HALO+FIRST_ROW_PT-1,                       DIVDMP1D.253    
     &           END_P_POINT_NO_HALO,ROW_LENGTH                            DIVDMP1D.254    
              D(J)=0.0                                                     DIVDMP1D.255    
            ENDDO                                                          DIVDMP1D.256    
*IF DEF,MPP                                                                DIVDMP1D.257    
          ENDIF                                                            DIVDMP1D.258    
                                                                           DIVDMP1D.259    
          IF (at_right_of_LPG) THEN                                        DIVDMP1D.260    
*ENDIF                                                                     DIVDMP1D.261    
! Loop over last point in each row                                         DIVDMP1D.262    
            DO J=START_POINT_NO_HALO+LAST_ROW_PT-1,                        DIVDMP1D.263    
     &           END_P_POINT_NO_HALO,ROW_LENGTH                            DIVDMP1D.264    
              D(J)=0.0                                                     DIVDMP1D.265    
            ENDDO                                                          DIVDMP1D.266    
*IF DEF,MPP                                                                DIVDMP1D.267    
          ENDIF                                                            DIVDMP1D.268    
*ENDIF                                                                     DIVDMP1D.269    
*ENDIF                                                                     DIVDMP1D.270    
                                                                           DIVDMP1D.271    
*IF DEF,GLOBAL                                                             DIVDMP1D.272    
C CALCULATE DIVERGENCE AT POLES.                                           DIVDMP1D.273    
! Note that factor 8. is incorrect, but consistent with HADCM2             DIVDMP1D.274    
        SCALAR = 8.*LATITUDE_STEP_INVERSE * LATITUDE_STEP_INVERSE /        DIVDMP1D.275    
     &           GLOBAL_ROW_LENGTH                                         DIVDMP1D.276    
                                                                           DIVDMP1D.277    
        SUM_N = 0.0                                                        DIVDMP1D.278    
        SUM_S = 0.0                                                        DIVDMP1D.279    
                                                                           DIVDMP1D.280    
! North Pole                                                               DIVDMP1D.281    
*IF -DEF,MPP                                                               DIVDMP1D.282    
! Loop over North Pole row                                                 DIVDMP1D.283    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      DIVDMP1D.284    
          SUM_N=SUM_N-V_MW(I)                                              DIVDMP1D.285    
        ENDDO                                                              DIVDMP1D.286    
*ELSE                                                                      DIVDMP1D.287    
        IF (at_top_of_LPG) THEN                                            DIVDMP1D.288    
          CALL GCG_RVECSUMR(U_FIELD,ROW_LENGTH-2*EW_Halo,                  DIVDMP1D.289    
     &                      TOP_ROW_START+FIRST_ROW_PT-1,1,                DIVDMP1D.290    
     &                      V_MW,GC_ROW_GROUP,info,SUM_N)                  DIVDMP1D.291    
          SUM_N=-SUM_N                                                     DIVDMP1D.292    
*ENDIF                                                                     DIVDMP1D.293    
                                                                           DIVDMP1D.294    
! Set all points on North Pole row to this value                           DIVDMP1D.295    
          DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                    DIVDMP1D.296    
            D(I)=SUM_N                                                     DIVDMP1D.297    
          ENDDO                                                            DIVDMP1D.298    
*IF DEF,MPP                                                                DIVDMP1D.299    
        ENDIF                                                              DIVDMP1D.300    
*ENDIF                                                                     DIVDMP1D.301    
                                                                           DIVDMP1D.302    
! South Pole                                                               DIVDMP1D.303    
*IF -DEF,MPP                                                               DIVDMP1D.304    
! Loop over South Pole row                                                 DIVDMP1D.305    
        DO I=U_BOT_ROW_START,U_BOT_ROW_START+ROW_LENGTH-1                  DIVDMP1D.306    
          SUM_S=SUM_S+V_MW(I)                                              DIVDMP1D.307    
        ENDDO                                                              DIVDMP1D.308    
*ELSE                                                                      DIVDMP1D.309    
        IF (at_base_of_LPG) THEN                                           DIVDMP1D.310    
          CALL GCG_RVECSUMR(U_FIELD,ROW_LENGTH-2*EW_Halo,                  DIVDMP1D.311    
     &                     U_BOT_ROW_START+FIRST_ROW_PT-1,1,               DIVDMP1D.312    
     &                     V_MW,GC_ROW_GROUP,info,SUM_S)                   DIVDMP1D.313    
*ENDIF                                                                     DIVDMP1D.314    
                                                                           DIVDMP1D.315    
! Set all points on South Pole row to this value                           DIVDMP1D.316    
          DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                DIVDMP1D.317    
            D(I)=SUM_S                                                     DIVDMP1D.318    
          ENDDO                                                            DIVDMP1D.319    
*IF DEF,MPP                                                                DIVDMP1D.320    
        ENDIF                                                              DIVDMP1D.321    
*ENDIF                                                                     DIVDMP1D.322    
*ENDIF                                                                     DIVDMP1D.323    
                                                                           DIVDMP1D.324    
CL                                                                         DIVDMP1D.325    
CL---------------------------------------------------------------------    DIVDMP1D.326    
CL    SECTION 3.     CALCULATE D(D)/D(LONGITUDE)                           DIVDMP1D.327    
CL---------------------------------------------------------------------    DIVDMP1D.328    
                                                                           DIVDMP1D.329    
! Loop over field, missing top and bottom rows and halos                   DIVDMP1D.330    
      DO 300 I=START_POINT_NO_HALO,END_P_POINT_INC_HALO-1                  ATJ0F403.219    
            D_BY_DLONG(I) = (D(I+1) - D(I))*LONGITUDE_STEP_INVERSE         DIVDMP1D.332    
 300      CONTINUE                                                         DIVDMP1D.333    
                                                                           DIVDMP1D.334    
CL                                                                         DIVDMP1D.335    
CL---------------------------------------------------------------------    DIVDMP1D.336    
CL    SECTION 4.     CALCULATE D(D)/D(LATITUDE)                            DIVDMP1D.337    
CL                   UPDATE V FIELD WITH DIVERGENCE.                       DIVDMP1D.338    
CL                   UPDATE U FIELD WITH DIVERGENCE                        DIVDMP1D.339    
CL                   IF GLOBAL CALL POLAR_UV TO UPDATE U AND V AT POLE.    DIVDMP1D.340    
CL---------------------------------------------------------------------    DIVDMP1D.341    
                                                                           DIVDMP1D.342    
C----------------------------------------------------------------------    DIVDMP1D.343    
CL    SECTION 4.1    CALCULATE D(D)/D(LATITUDE)                            DIVDMP1D.344    
C----------------------------------------------------------------------    DIVDMP1D.345    
                                                                           DIVDMP1D.346    
! Loop over field, including Northern row but missing Southern row and     DIVDMP1D.347    
! top and bottom halos                                                     DIVDMP1D.348    
          DO 410 I=START_POINT_NO_HALO-ROW_LENGTH,                         DIVDMP1D.349    
     &              END_P_POINT_NO_HALO                                    DIVDMP1D.350    
            D_BY_DLAT(I) = (D(I)-D(I+ROW_LENGTH))*LATITUDE_STEP_INVERSE    DIVDMP1D.351    
 410      CONTINUE                                                         DIVDMP1D.352    
                                                                           DIVDMP1D.353    
C----------------------------------------------------------------------    DIVDMP1D.354    
CL    SECTION 4.2    UPDATE V FIELD WITH DIVERGENCE                        DIVDMP1D.355    
CL                   UPDATE U FIELD WITH DIVERGENCE                        DIVDMP1D.356    
C----------------------------------------------------------------------    DIVDMP1D.357    
                                                                           DIVDMP1D.358    
*IF DEF,GLOBAL                                                             DIVDMP1D.359    
C GLOBAL MODEL, CALCULATE SECOND V TERM IN EQUATION.                       DIVDMP1D.360    
! Loop over field, including Northern row, but missing Southern row, and   DIVDMP1D.361    
! last point of last row, and top and bottom halos                         DIVDMP1D.362    
          DO 420 I=START_POINT_NO_HALO-ROW_LENGTH,                         DIVDMP1D.363    
     &              END_P_POINT_NO_HALO-1                                  DIVDMP1D.364    
            D_BY_DLAT2(I) =  KD(K)*.5*(D_BY_DLAT(I)+D_BY_DLAT(I+1))        DIVDMP1D.365    
     *                   *ADVECTION_TIMESTEP                               DIVDMP1D.366    
 420      CONTINUE                                                         DIVDMP1D.367    
                                                                           DIVDMP1D.368    
C NOW DO END POINTS.                                                       DIVDMP1D.369    
*IF -DEF,MPP                                                               DIVDMP1D.370    
! Loop over last point of each row                                         DIVDMP1D.371    
          DO 424 I=START_POINT_NO_HALO+LAST_ROW_PT-1,                      DIVDMP1D.372    
     &             END_P_POINT_NO_HALO,ROW_LENGTH                          DIVDMP1D.373    
            D_BY_DLAT2(I)= KD(K)*.5*(D_BY_DLAT(I)+                         DIVDMP1D.374    
     *                    D_BY_DLAT(I+1-ROW_LENGTH))*ADVECTION_TIMESTEP    DIVDMP1D.375    
C DO END POINTS FOR SECTION 3.1                                            DIVDMP1D.376    
          D_BY_DLONG(I)=(D(I+1-ROW_LENGTH)-D(I))*LONGITUDE_STEP_INVERSE    DIVDMP1D.377    
 424      CONTINUE                                                         DIVDMP1D.378    
                                                                           DIVDMP1D.379    
C DO FIRST END POINT OF SECTION 4.1.                                       DIVDMP1D.380    
          D_BY_DLAT2(TOP_ROW_START+LAST_ROW_PT-1)= KD(K)*.5*               DIVDMP1D.381    
     &      (D_BY_DLAT(TOP_ROW_START)+                                     DIVDMP1D.382    
     &       D_BY_DLAT(TOP_ROW_START+LAST_ROW_PT-1))*ADVECTION_TIMESTEP    DIVDMP1D.383    
*ELSE                                                                      DIVDMP1D.384    
          D_BY_DLAT2(END_P_POINT_NO_HALO)=                                 DIVDMP1D.385    
     &      D_BY_DLAT2(END_P_POINT_NO_HALO-1)                              DIVDMP1D.386    
! MPP Code : No need to do recalculations of end points because cyclic     DIVDMP1D.387    
! boundary conditions means that halos do this for us automatically        DIVDMP1D.388    
                                                                           DIVDMP1D.389    
*ENDIF                                                                     DIVDMP1D.390    
                                                                           DIVDMP1D.391    
C UPDATE U AND V FIELDS WITH DIVERGENCE                                    DIVDMP1D.392    
                                                                           DIVDMP1D.393    
C UPDATE ALL POINTS.                                                       DIVDMP1D.394    
! Loop over U field, missing Northern and Southern rows and top and        DIVDMP1D.395    
! bottom halos.                                                            DIVDMP1D.396    
      DO 426 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO-1                   ATJ0F403.220    
            SCALAR=1./(RS_U_GRID(I)*RS_U_GRID(I)*RS_U_GRID(I)              DIVDMP1D.398    
     *               *(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I)))              DIVDMP1D.399    
            U(I,K) = U(I,K) + KD(K)*.5*(D_BY_DLONG(I)+                     DIVDMP1D.400    
     *               D_BY_DLONG(I+ROW_LENGTH))                             DIVDMP1D.401    
     *               *SEC_U_LATITUDE(I)*ADVECTION_TIMESTEP*SCALAR          DIVDMP1D.402    
            V(I,K) = V(I,K) + D_BY_DLAT2(I)*SCALAR                         DIVDMP1D.403    
 426      CONTINUE                                                         DIVDMP1D.404    
*ELSE                                                                      DIVDMP1D.405    
CL    LIMITED AREA MODEL. FIRST,PENULTIMATE AND LAST V VALUES ON A ROW     DIVDMP1D.406    
CL    NOT UPDATED.                                                         DIVDMP1D.407    
*IF DEF,MPP                                                                DIVDMP1D.408    
! For the MPP code this requires a little more code. Only processors       DIVDMP1D.409    
! at the left and right of the LPG need to miss points out.                DIVDMP1D.410    
! We can also be sneaky and use the code structure to avoid duplicate      DIVDMP1D.411    
! calculations by avoiding the halo areas.                                 DIVDMP1D.412    
          IF (at_left_of_LPG) THEN                                         DIVDMP1D.413    
            row_start_offset=EW_Halo+1  ! Miss halo and first point        DIVDMP1D.414    
          ELSE                                                             DIVDMP1D.415    
            row_start_offset=EW_Halo    ! Miss halo only                   DIVDMP1D.416    
          ENDIF                                                            DIVDMP1D.417    
                                                                           DIVDMP1D.418    
          IF (at_right_of_LPG) THEN                                        DIVDMP1D.419    
            row_end_offset=ROW_LENGTH-EW_Halo-2-1  ! Miss last two         DIVDMP1D.420    
!                                                  ! points and halo       DIVDMP1D.421    
          ELSE                                                             DIVDMP1D.422    
            row_end_offset=ROW_LENGTH-EW_Halo-1    ! Miss out halo only    DIVDMP1D.423    
          ENDIF                                                            DIVDMP1D.424    
*ENDIF                                                                     DIVDMP1D.425    
          DO 420 J=START_POINT_NO_HALO,END_U_POINT_NO_HALO,ROW_LENGTH      DIVDMP1D.426    
*IF -DEF,MPP                                                               DIVDMP1D.427    
            DO 422 I=J+1,J+ROW_LENGTH-3                                    DIVDMP1D.428    
*ELSE                                                                      DIVDMP1D.429    
          DO 422 I=J+row_start_offset,J+row_end_offset                     DIVDMP1D.430    
*ENDIF                                                                     DIVDMP1D.431    
            SCALAR=1./(RS_U_GRID(I)*RS_U_GRID(I)*RS_U_GRID(I)              DIVDMP1D.432    
     *               *(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I)))              DIVDMP1D.433    
              U(I,K) = U(I,K) + KD(K)*.5*(D_BY_DLONG(I)+                   DIVDMP1D.434    
     *                D_BY_DLONG(I+ROW_LENGTH))                            DIVDMP1D.435    
     *                *SEC_U_LATITUDE(I)*ADVECTION_TIMESTEP*SCALAR         DIVDMP1D.436    
              V(I,K)=V(I,K)+KD(K)*.5*(D_BY_DLAT(I)+                        DIVDMP1D.437    
     *             D_BY_DLAT(I+1))*ADVECTION_TIMESTEP*SCALAR               DIVDMP1D.438    
 422        CONTINUE                                                       DIVDMP1D.439    
 420      CONTINUE                                                         DIVDMP1D.440    
*ENDIF                                                                     ATJ0F403.221    
*IF DEF,MPP                                                                ATJ0F403.222    
      call swapbounds(u,row_length,tot_u_rows,1,1,p_levels)                ATJ0F403.223    
      call swapbounds(v,row_length,tot_u_rows,1,1,p_levels)                ATJ0F403.224    
*ENDIF                                                                     DIVDMP1D.441    
                                                                           DIVDMP1D.442    
C----------------------------------------------------------------------    DIVDMP1D.443    
CL    SECTION 4.3    GLOBAL MODEL POLAR UPDATE OF U AND V.                 DIVDMP1D.444    
C----------------------------------------------------------------------    DIVDMP1D.445    
                                                                           DIVDMP1D.446    
*IF DEF,GLOBAL                                                             DIVDMP1D.447    
                                                                           DIVDMP1D.448    
CL    CALL POLAR_UV TO UPDATE U AND V.                                     DIVDMP1D.449    
                                                                           DIVDMP1D.450    
          CALL POLAR_UV(U(1,K),V(1,K),ROW_LENGTH,U_FIELD,1,                DIVDMP1D.451    
*CALL ARGFLDPT                                                             DIVDMP1D.452    
     &              COS_U_LONGITUDE,SIN_U_LONGITUDE)                       DIVDMP1D.453    
                                                                           DIVDMP1D.454    
*ENDIF                                                                     DIVDMP1D.455    
                                                                           DIVDMP1D.456    
        END IF                                                             DIVDMP1D.457    
CL END LOOP OVER LEVELS                                                    DIVDMP1D.458    
                                                                           DIVDMP1D.459    
 100  CONTINUE                                                             DIVDMP1D.460    
                                                                           DIVDMP1D.461    
CL    END OF ROUTINE DIV_DAMP                                              DIVDMP1D.462    
                                                                           DIVDMP1D.463    
      RETURN                                                               DIVDMP1D.464    
      END                                                                  DIVDMP1D.465    
*ENDIF                                                                     DIVDMP1D.466