*IF DEF,A07_1A                                                             VERTDF1A.2      
C ******************************COPYRIGHT******************************    GTS2F400.11593  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.11594  
C                                                                          GTS2F400.11595  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.11596  
C restrictions as set forth in the contract.                               GTS2F400.11597  
C                                                                          GTS2F400.11598  
C                Meteorological Office                                     GTS2F400.11599  
C                London Road                                               GTS2F400.11600  
C                BRACKNELL                                                 GTS2F400.11601  
C                Berkshire UK                                              GTS2F400.11602  
C                RG12 2SZ                                                  GTS2F400.11603  
C                                                                          GTS2F400.11604  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.11605  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.11606  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.11607  
C Modelling at the above address.                                          GTS2F400.11608  
C ******************************COPYRIGHT******************************    GTS2F400.11609  
C                                                                          GTS2F400.11610  
CLL  SUBROUTINE VDIF_CTL and VERT_DIF --------------------------           VERTDF1A.3      
CLL                                                                        VERTDF1A.4      
CLL  PURPOSE:   CONTROL SECTION FOR VERTICAL DIFFUSION ROUTINE WHICH       VERTDF1A.5      
CLL APPLIES VERTICAL DIFFUSION TO WIND COMPONENTS WITHIN A LATITUDE BAND   VERTDF1A.6      
CLL SYMMETRIC ABOUT THE EQUATOR.  THE DIFFUSION COEFFICIENT TAILS OFF      VERTDF1A.7      
CLL AWAY FROM THE EQUATOR AND IS ZERO OUTSIDE THE BAND.                    VERTDF1A.8      
CLL                                                                        VERTDF1A.9      
CLL  FURTHER ALTERATIONS MAY BE REQUIRED FOR AUTOTASKING EFFICIENCY        VERTDF1A.10     
CLL  SUITABLE FOR SINGLE COLUMN USE, CALL TO P_TO_UV BY-PASSED             VERTDF1A.11     
CLL  SUITABLE FOR ROTATED GRIDS                                            VERTDF1A.12     
CLL                                                                        VERTDF1A.13     
CLL  ORIGINAL VERSION FOR CRAY Y-MP                                        VERTDF1A.14     
CLL                                                                        VERTDF1A.15     
CLL  WRITTEN BY C. WILSON                                                  VERTDF1A.16     
CLL                                                                        VERTDF1A.17     
CLL  Model            Modification history from model version 3.0:         VERTDF1A.18     
CLL version  Date                                                          VERTDF1A.19     
CLL                                                                        VERTDF1A.20     
CLL   3.3   15/11/93  Removal of DIAG07 directive. New arguments to        DR151193.54     
CLL                   dimension diagnostic arrays. D. Robinson.            DR151193.55     
!     3.5    9/5/95   MPP code: Change updateable area  P.Burton           APB1F305.443    
CLL   4.2    Oct. 96  T3E migration: *DEF CRAY removed                     GSS1F402.102    
CLL                    (was used to switch on WHENFGT)                     GSS1F402.103    
CLL                                    S.J.Swarbrick                       GSS1F402.104    
!LL   4.4    17/06/97 Only prints out warning if there are no points       GPB1F404.1      
!LL                   on all processors                     P.Burton       GPB1F404.2      
CLL   4.5    Jul. 98  Kill the IBM specific lines (JCThil)                 AJC1F405.39     
CLL                                                                        VERTDF1A.21     
CLL  Programming standard: Unified Model documentation paper no. 4,        VERTDF1A.22     
CLL  version 1, dated 12/09/89                                             VERTDF1A.23     
CLL                                                                        VERTDF1A.24     
CLL  Logical components covered: P21                                       VERTDF1A.25     
CLL                                                                        VERTDF1A.26     
CLL  Project task:                                                         VERTDF1A.27     
CLL                                                                        VERTDF1A.28     
CLL  Documentation:        The equation used is (2)                        VERTDF1A.29     
CLL                        in Unified Model documentation paper no.p21     VERTDF1A.30     
CLL                        C. Wilson, version 2,dated 30/10/89             VERTDF1A.31     
CLLEND-------------------------------------------------------------        VERTDF1A.32     
C                                                                          VERTDF1A.33     
C*L  ARGUMENTS:---------------------------------------------------         VERTDF1A.34     

      SUBROUTINE VDIF_CTL                                                   1,4VERTDF1A.35     
     *  (PSTAR,U,V,                                                        DR151193.56     
     *   P_FIELD,U_FIELD,ROWS,FIRST_ROW,ROW_LENGTH,                        DR151193.57     
     *   LEVEL_START,LEVEL_END,LEVELS_VD,P_LEVELS,                         DR151193.58     
     *   AK,BK,DELTA_AK,DELTA_BK,COS_LAT, LATITUDE_BAND,                   DR151193.59     
     *   VERTICAL_DIFFUSION, TIMESTEP,                                     DR151193.60     
     *   STASH_U_FLUX,FLUX_UD_ON,U_LIST,                                   DR151193.61     
     *   STASH_V_FLUX,FLUX_VD_ON,V_LIST,                                   DR151193.62     
     *   LEN_STASH_U_FLUX,LEN_STASH_V_FLUX,                                DR151193.63     
     *   POINTS_FLUX_U,POINTS_FLUX_V,LEVELS_FLUX,                          DR151193.64     
     *   IRET)                                                             DR151193.65     
                                                                           VERTDF1A.44     
      IMPLICIT NONE                                                        VERTDF1A.45     
                                                                           VERTDF1A.46     
      INTEGER                                                              VERTDF1A.47     
     *  P_FIELD            !IN    1ST DIMENSION OF FIELD OF PSTAR          VERTDF1A.48     
     *, U_FIELD            !IN    1ST DIMENSION OF FIELD OF U,V            VERTDF1A.49     
     *, ROWS               !IN    NUMBER OF ROWS TO BE UPDATED.            VERTDF1A.50     
     *, FIRST_ROW          !IN    NUMBER OF FIRST ROW IN DATA ARRAY        VERTDF1A.51     
     *, ROW_LENGTH         !IN    NUMBER OF POINTS PER ROW                 VERTDF1A.52     
     *, LEVEL_START        !IN    BOTTOM LEVEL TO BE UPDATED.              VERTDF1A.53     
     *, LEVEL_END          !IN    TOP    LEVEL TO BE UPDATED.              VERTDF1A.54     
     *, LEVELS_VD          !IN    NO OF VERTICAL DIFFUSION LEVELS          DR151193.66     
     *, P_LEVELS           !IN    NUMBER OF MODEL LEVELS                   DR151193.67     
     *, LEN_STASH_U_FLUX   !IN    DIMENSION OF STASH_U_FLUX                DR151193.68     
     *, LEN_STASH_V_FLUX   !IN    DIMENSION OF STASH_V_FLUX                DR151193.69     
     *, POINTS_FLUX_U      !IN    NO OF POINTS IN U FLUX FIELD             DR151193.70     
     *, POINTS_FLUX_V      !IN    NO OF POINTS IN V FLUX FIELD             DR151193.71     
     *, LEVELS_FLUX        !IN    NO OF FLUX LEVELS                        DR151193.72     
     *, IRET               ! RETURN CODE      :    IRET=0   NORMAL EXIT    VERTDF1A.56     
                                                                           VERTDF1A.59     
      REAL                                                                 VERTDF1A.60     
     * PSTAR(P_FIELD)         !IN    PRIMARY MODEL ARRAY FOR PSTAR FIELD   VERTDF1A.61     
     *,U(U_FIELD,P_LEVELS)    !INOUT PRIMARY MODEL ARRAY FOR U FIELD       DR151193.73     
     *,V(U_FIELD,P_LEVELS)    !INOUT PRIMARY MODEL ARRAY FOR V FIELD       DR151193.74     
C            AK,BK  DEFINE HYBRID VERTICAL COORDINATES P=A+BP*,            VERTDF1A.64     
C       DELTA_AK,DELTA_BK  DEFINE LAYER PRESSURE THICKNESS PD=AD+BDP*,     VERTDF1A.65     
     *,DELTA_AK(P_LEVELS)     !IN    LAYER THICKNESS                       DR151193.75     
     *,DELTA_BK(P_LEVELS)     !IN    LAYER THICKNESS                       DR151193.76     
     *,AK (P_LEVELS)          !IN    VALUE AT LAYER CENTRE                 DR151193.77     
     *,BK (P_LEVELS)          !IN    VALUE AT LAYER CENTRE                 DR151193.78     
     *,COS_LAT(U_FIELD)       !IN    COS(LAT) AT U POINTS                  VERTDF1A.71     
     *,LATITUDE_BAND          !IN    LATITUDE(RADIANS)                     VERTDF1A.72     
     *                        !      WHERE DIFFUSION PRESCRIBED ZERO       VERTDF1A.73     
     *,VERTICAL_DIFFUSION     !IN    VALUE OF DIFFUSION COEFFICIENT        VERTDF1A.74     
     *,TIMESTEP               !IN    TIMESTEP                              VERTDF1A.75     
     *,STASH_U_FLUX(LEN_STASH_U_FLUX,*) !U MOMENTUM FLUX - Diagnostic      DR151193.79     
     *,STASH_V_FLUX(LEN_STASH_V_FLUX,*) !V MOMENTUM FLUX - Diagnostic      DR151193.80     
                                                                           VERTDF1A.83     
C WARNING : Storage is only assigned by the controling routine             VERTDF1A.84     
C           for the number of levels requested.                            VERTDF1A.85     
                                                                           VERTDF1A.86     
      LOGICAL                                                              VERTDF1A.87     
     * FLUX_UD_ON                !U momentum diagnostic switch             VERTDF1A.88     
     *,FLUX_VD_ON                !V momentum diagnostic switch             VERTDF1A.89     
     *,U_LIST(P_LEVELS)          ! List of levels required                 DR151193.81     
     *,V_LIST(P_LEVELS)          ! List of levels required                 DR151193.82     
                                                                           VERTDF1A.94     
C*---------------------------------------------------------------------    VERTDF1A.95     
                                                                           VERTDF1A.96     
*IF DEF,MPP                                                                APB1F305.444    
! Parameters and Common blocks                                             APB1F305.445    
*CALL PARVARS                                                              APB1F305.446    
                                                                           GPB1F404.3      
      INTEGER global_points  ! maximum number of points on any PEs         GPB1F404.4      
     &,       info           ! GCOM return code                            GPB1F404.5      
*ENDIF                                                                     APB1F305.447    
C*L  WORKSPACE USAGE:-------------------------------------------------     VERTDF1A.97     
C   DEFINE LOCAL WORKSPACE ARRAYS: 4+(LEVEL_END-LEVEL_START+1)*2           VERTDF1A.98     
                                                                           VERTDF1A.99     
C    +(LEVEL_END-LEVEL_START)*2                                            DR151193.83     
                                                                           VERTDF1A.105    
C   REAL ARRAYS REQUIRED AT FULL FIELD LENGTH                              VERTDF1A.106    
C   1 INTEGER INDEX ARRAY                                                  VERTDF1A.107    
                                                                           VERTDF1A.108    
                                                                           VERTDF1A.126    
      REAL                                                                 VERTDF1A.127    
     * PSTAR_UV( ROWS*ROW_LENGTH )   ! INTERPOLATED PSTAR ON UV-GRID       VERTDF1A.128    
     *,PSTAR_VD( ROWS*ROW_LENGTH )   ! GATHERED INTERPOLATED PSTAR         VERTDF1A.129    
     *,VERT_DIF_LAT(ROWS*ROW_LENGTH) ! LAT. DEPENDENT DIFFUSION*TIMESTEP   VERTDF1A.130    
     *,VERT_DIF_VD(ROWS*ROW_LENGTH)  ! GATHERED NON_ZERO DIFFUSION         VERTDF1A.131    
     *,U_VD(ROWS*ROW_LENGTH*LEVELS_VD)  !GATHERED U                        DR151193.88     
     *,V_VD(ROWS*ROW_LENGTH*LEVELS_VD)  !GATHERED V                        DR151193.89     
     *,FLUX_U_DG(POINTS_FLUX_U,LEVELS_FLUX) !GATHERED FLUX                 DR151193.90     
     *,FLUX_V_DG(POINTS_FLUX_V,LEVELS_FLUX) !GATHERED FLUX                 DR151193.91     
                                                                           VERTDF1A.134    
      INTEGER                                                              VERTDF1A.143    
     * VERT_INDEX(ROWS*ROW_LENGTH)                                         VERTDF1A.144    
                                                                           VERTDF1A.145    
                                                                           VERTDF1A.147    
C*---------------------------------------------------------------------    VERTDF1A.148    
C                                                                          VERTDF1A.149    
C*L EXTERNAL SUBROUTINES CALLED---------------------------------------     VERTDF1A.150    
      EXTERNAL P_TO_UV ,VERT_DIF,TIMER                                     GSS1F402.105    
C*------------------------------------------------------------------       VERTDF1A.152    
CL  MAXIMUM VECTOR LENGTH ASSUMED IS (ROWS+1) * ROWLENGTH                  VERTDF1A.153    
CL---------------------------------------------------------------------    VERTDF1A.154    
C----------------------------------------------------------------------    VERTDF1A.155    
C    DEFINE LOCAL VARIABLES                                                VERTDF1A.156    
      INTEGER                                                              VERTDF1A.157    
     *  P_POINTS      !     NUMBER OF P POINTS NEEDED                      VERTDF1A.158    
     *, ROWS_P        !     NUMBER OF P ROWS   NEEDED                      VERTDF1A.159    
     *, U_POINTS      !     NUMBER OF U POINTS UPDATED                     VERTDF1A.160    
     *, START_P       !     START POSITION FOR P POINTS NEEDED             VERTDF1A.161    
     *, START_U       !     START POSITION FOR U POINTS UPDATED            VERTDF1A.162    
     *, POINTS_VD     !     NUMBER OF POINTS NON-ZERO DIFFUSION COEFFS     DR151193.92     
                                                                           DR151193.93     
      REAL                                                                 VERTDF1A.165    
     *  COS_LAT_BAND    ! COS LAT AT WHICH DIFFUSION SET TO ZERO           VERTDF1A.166    
     *, COEFF           ! LATITUDE-DEPENDENT DIFFUSION * TIMESTEP          VERTDF1A.167    
C                                                                          VERTDF1A.168    
      INTEGER    K,I,II,IK,! LOOP COUNTERS IN ROUTINE                      VERTDF1A.169    
     *           KOUT_U,KOUT_V                                             VERTDF1A.170    
C                                                                          VERTDF1A.171    
                                                                           VERTDF1A.172    
C-------------------------------------------------------------------       VERTDF1A.173    
CL    INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS:                       VERTDF1A.174    
CL    1.     INITIALISATION                                                VERTDF1A.175    
C--------------------------                                                VERTDF1A.176    
                                                                           VERTDF1A.177    
        START_P       = (FIRST_ROW-1)*ROW_LENGTH                           VERTDF1A.178    
        START_U       = START_P                                            VERTDF1A.179    
*IF -DEF,MPP                                                               APB1F305.448    
        ROWS_P        = ROWS+1                                             VERTDF1A.180    
*ELSE                                                                      APB1F305.449    
      IF (atbase) THEN                                                     APB1F305.450    
        ROWS_P=ROWS                                                        APB1F305.451    
      ELSE                                                                 APB1F305.452    
        ROWS_P=ROWS+1                                                      APB1F305.453    
      ENDIF                                                                APB1F305.454    
*ENDIF                                                                     APB1F305.455    
        P_POINTS      = (ROWS_P)*ROW_LENGTH                                VERTDF1A.181    
*IF -DEF,MPP                                                               APB1F305.456    
        U_POINTS      = ROWS*ROW_LENGTH                                    VERTDF1A.182    
*ELSE                                                                      APB1F305.457    
      IF (atbase) THEN                                                     APB1F305.458    
        U_POINTS=(ROWS-1)*ROW_LENGTH                                       APB1F305.459    
      ELSE                                                                 APB1F305.460    
        U_POINTS=ROWS*ROW_LENGTH                                           APB1F305.461    
      ENDIF                                                                APB1F305.462    
*ENDIF                                                                     APB1F305.463    
                                                                           VERTDF1A.183    
C------------------------------------------------------------------        VERTDF1A.184    
CL    1.1  CALCULATE LATITUDE-DEPENDENT DIFFUSION COEFFICIENTS*TIMESTEP    VERTDF1A.185    
CL         AND DETERMINE WHICH POINTS DIFFUSION IS APPLIED                 VERTDF1A.186    
C------------------------------------------------------------------        VERTDF1A.187    
                                                                           VERTDF1A.188    
        COS_LAT_BAND = COS(LATITUDE_BAND)                                  VERTDF1A.189    
        COEFF = VERTICAL_DIFFUSION * TIMESTEP / (1.- COS_LAT_BAND)         VERTDF1A.190    
C                                                                          VERTDF1A.191    
        DO I=1,U_POINTS                                                    VERTDF1A.192    
         VERT_DIF_LAT(I) = COEFF * ( COS_LAT(START_U+I) - COS_LAT_BAND)    VERTDF1A.193    
        END DO                                                             VERTDF1A.194    
CL      SET UP INDEX FOR POINTS WITH NON-ZERO DIFFUSION                    VERTDF1A.195    
                                                                           VERTDF1A.196    
                                                                           VERTDF1A.204    
        POINTS_VD = 0                                                      DR151193.95     
        II = 1                                                             VERTDF1A.206    
        DO I=1,U_POINTS                                                    VERTDF1A.207    
          IF(VERT_DIF_LAT(I).GT.0) THEN                                    VERTDF1A.208    
            VERT_INDEX(II)=I                                               VERTDF1A.209    
            II=II + 1                                                      VERTDF1A.210    
            POINTS_VD=POINTS_VD + 1                                        DR151193.96     
          END IF                                                           VERTDF1A.212    
       END DO                                                              VERTDF1A.213    
                                                                           VERTDF1A.214    
*IF DEF,MPP                                                                GPB1F404.6      
      global_points=POINTS_VD                                              GPB1F404.7      
                                                                           GPB1F404.8      
      CALL GC_IMAX(1,nproc,info,global_points)                             GPB1F404.9      
                                                                           GPB1F404.10     
*ENDIF                                                                     GPB1F404.11     
                                                                           VERTDF1A.216    
CL      TEST FOR NO NON-ZERO DIFFUSION                                     VERTDF1A.217    
        IF(POINTS_VD.EQ.0) THEN                                            DR151193.97     
*IF DEF,MPP                                                                GPB1F404.12     
        IF(global_points.EQ.0) THEN                                        GPB1F404.13     
*ENDIF                                                                     GPB1F404.14     
      WRITE(6,*) ' *************VERT_DIF WARNING*******************'       GIE0F403.667    
      WRITE(6,*) ' * NO POINTS WITH NON_ZERO DIFFUSION COEFFICIENT*'       GIE0F403.668    
      WRITE(6,*) ' *************VERT_DIF WARNING*******************'       GIE0F403.669    
*IF DEF,MPP                                                                GPB1F404.15     
        ENDIF                                                              GPB1F404.16     
*ENDIF                                                                     GPB1F404.17     
           IRET = 0                                                        VERTDF1A.222    
           GOTO 1000                                                       VERTDF1A.223    
        END IF                                                             VERTDF1A.224    
                                                                           VERTDF1A.225    
C------------------------------------------------------------------        VERTDF1A.226    
CL    1.2 INTERPOLATE PSTAR TO UV GRID                                     VERTDF1A.227    
C------------------------------------------------------------------        VERTDF1A.228    
                                                                           VERTDF1A.229    
*IF DEF,SCMA                                                               AJC1F405.40     
                                                                           VERTDF1A.231    
      DO I=1,U_POINTS                                                      VERTDF1A.232    
       PSTAR_UV(I) =PSTAR(I)                                               VERTDF1A.233    
      END DO                                                               VERTDF1A.234    
                                                                           VERTDF1A.235    
*ELSE                                                                      VERTDF1A.236    
                                                                           VERTDF1A.237    
      CALL P_TO_UV(PSTAR(START_P+1),PSTAR_UV,P_POINTS,U_POINTS,            VERTDF1A.238    
     * ROW_LENGTH,ROWS_P)                                                  VERTDF1A.239    
                                                                           VERTDF1A.240    
*ENDIF                                                                     VERTDF1A.241    
                                                                           VERTDF1A.242    
C------------------------------------------------------------------        VERTDF1A.243    
CL    2. GATHER PSTAR,WINDS AND DIFFUSION COEFFICIENT AT POINTS            VERTDF1A.244    
CL       WHERE NON-ZERO DIFFUSION                                          VERTDF1A.245    
C------------------------------------------------------------------        VERTDF1A.246    
                                                                           VERTDF1A.247    
      DO I=1,POINTS_VD                                                     DR151193.98     
       PSTAR_VD(I)  = PSTAR_UV(VERT_INDEX(I))                              VERTDF1A.249    
       VERT_DIF_VD(I)  = VERT_DIF_LAT(VERT_INDEX(I))                       VERTDF1A.250    
      END DO                                                               VERTDF1A.251    
                                                                           VERTDF1A.252    
CL    LOOP OVER LEVELS                                                     VERTDF1A.253    
                                                                           VERTDF1A.254    
      DO K = LEVEL_START, LEVEL_END                                        VERTDF1A.255    
         IK = (K-LEVEL_START)*POINTS_VD                                    DR151193.99     
         DO I=1,POINTS_VD                                                  DR151193.100    
           U_VD(I+IK)=U(START_U+VERT_INDEX(I),K)                           VERTDF1A.258    
           V_VD(I+IK)=V(START_U+VERT_INDEX(I),K)                           VERTDF1A.259    
         END DO                                                            VERTDF1A.260    
      END DO                                                               VERTDF1A.261    
      LEVELS_VD=LEVEL_END-LEVEL_START+1                                    VERTDF1A.262    
                                                                           VERTDF1A.263    
CL  3.  CALL VERT_DIF AND UPDATE WINDS                                     VERTDF1A.264    
                                                                           VERTDF1A.265    
      CALL VERT_DIF(PSTAR_VD,U_VD,V_VD,LEVELS_VD,POINTS_VD,                DR151193.101    
     &              AK(LEVEL_START),BK(LEVEL_START),                       VERTDF1A.267    
     &              DELTA_AK(LEVEL_START),DELTA_BK(LEVEL_START),           VERTDF1A.268    
     &              VERT_DIF_VD,FLUX_U_DG,FLUX_V_DG,                       DR151193.102    
     &              POINTS_FLUX_U,POINTS_FLUX_V,LEVELS_FLUX,               DR151193.103    
     &              FLUX_UD_ON,FLUX_VD_ON)                                 DR151193.104    
                                                                           VERTDF1A.284    
      DO K = LEVEL_START, LEVEL_END                                        VERTDF1A.285    
                                                                           VERTDF1A.286    
         IK = (K-LEVEL_START)*POINTS_VD                                    DR151193.105    
                                                                           VERTDF1A.295    
         DO I=1,POINTS_VD                                                  DR151193.106    
           U(START_U+VERT_INDEX(I),K)  = U_VD(I+IK)                        VERTDF1A.299    
           V(START_U+VERT_INDEX(I),K)  = V_VD(I+IK)                        VERTDF1A.300    
         END DO                                                            DR151193.107    
                                                                           VERTDF1A.301    
      END DO                                                               DR151193.108    
                                                                           VERTDF1A.303    
      IF (FLUX_UD_ON .OR. FLUX_VD_ON) THEN                                 DR151193.109    
                                                                           VERTDF1A.312    
        KOUT_U=0                                                           DR151193.110    
        KOUT_V=0                                                           DR151193.111    
                                                                           VERTDF1A.314    
        DO K = LEVEL_START,LEVEL_END-1                                     DR151193.112    
                                                                           DR151193.113    
          IF (U_LIST(K)) THEN                                              DR151193.114    
            KOUT_U=KOUT_U+1                                                DR151193.115    
          END IF                                                           DR151193.116    
          IF (V_LIST(K)) THEN                                              DR151193.117    
            KOUT_V=KOUT_V+1                                                DR151193.118    
          END IF                                                           DR151193.119    
                                                                           DR151193.120    
          IK = K-LEVEL_START+1                                             DR151193.121    
                                                                           DR151193.122    
          DO I=1,POINTS_VD                                                 DR151193.123    
                                                                           DR151193.124    
          IF (FLUX_UD_ON .AND. U_LIST(K)) THEN                             DR151193.125    
           STASH_U_FLUX(START_U+VERT_INDEX(I),KOUT_U) = FLUX_U_DG(I,IK)    DR151193.126    
          ENDIF                                                            DR151193.127    
          IF (FLUX_VD_ON .AND. V_LIST(K)) THEN                             DR151193.128    
           STASH_V_FLUX(START_U+VERT_INDEX(I),KOUT_V) = FLUX_V_DG(I,IK)    DR151193.129    
          ENDIF                                                            DR151193.130    
                                                                           DR151193.131    
          ENDDO                                                            DR151193.132    
                                                                           DR151193.133    
        ENDDO                                                              DR151193.134    
                                                                           DR151193.135    
      ENDIF                                                                DR151193.136    
                                                                           VERTDF1A.317    
      IRET=0                                                               VERTDF1A.318    
                                                                           VERTDF1A.319    
1000  CONTINUE                                                             VERTDF1A.320    
      RETURN                                                               VERTDF1A.321    
      END                                                                  VERTDF1A.322    
CLL  SUBROUTINE VERT_DIF--------------------------------------------       VERTDF1A.323    
CLL                                                                        VERTDF1A.324    
CLL  PURPOSE:   TO APPLY VERTICAL DIFFUSION TO WIND COMPONENTS             VERTDF1A.325    
CLL             WITHIN A LATITUDE BAND SYMMETRIC ABOUT THE EQUATOR.        VERTDF1A.326    
CLL             THE DIFFUSION COEFFICIENT TAILS OFF AWAY FROM THE          VERTDF1A.327    
CLL             EQUATOR AND IS ZERO OUTSIDE THE BAND.                      VERTDF1A.328    
CLL             THIS ROUTINE APPLIES A PRECALCULATED                       VERTDF1A.329    
CLL             DIFFUSION COEFFICIENT TO ALL POINTS PASSED TO IT           VERTDF1A.330    
CLL  SUITABLE FOR SINGLE COLUMN USE                                        VERTDF1A.331    
CLL  SUITABLE FOR ROTATED GRIDS                                            VERTDF1A.332    
CLL  FURTHER ALTERATIONS MAY BE REQUIRED FOR AUTOTASKING EFFICIENCY        VERTDF1A.333    
CLL  ORIGINAL VERSION FOR CRAY Y-MP                                        VERTDF1A.334    
CLL                                                                        VERTDF1A.335    
CLL  WRITTEN BY C. WILSON                                                  VERTDF1A.336    
CLL                                                                        VERTDF1A.337    
CLL  Model            Modification history from model version 3.0:         VERTDF1A.338    
CLL version  Date                                                          VERTDF1A.339    
CLL                                                                        VERTDF1A.340    
CLL   3.3   15/11/93  Removal of DIAG07 directive. New arguments to        DR151193.137    
CLL                   dimension diagnostic arrays. D. Robinson.            DR151193.138    
CLL   4.5    Jul. 98  Kill the IBM specific lines (JCThil)                 AJC1F405.41     
CLL                                                                        DR151193.139    
CLL  PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4,        VERTDF1A.341    
CLL  VERSION 1, DATED 12/09/89                                             VERTDF1A.342    
CLL                                                                        VERTDF1A.343    
CLL  LOGICAL COMPONENTS COVERED: P21                                       VERTDF1A.344    
CLL                                                                        VERTDF1A.345    
CLL  PROJECT TASK:                                                         VERTDF1A.346    
CLL                                                                        VERTDF1A.347    
CLL  DOCUMENTATION:        THE EQUATIONS USED ARE (1) TO (4)               VERTDF1A.348    
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER NO.P21     VERTDF1A.349    
CLL                        C. WILSON, VERSION 2,DATED 30/10/89             VERTDF1A.350    
CLLEND-------------------------------------------------------------        VERTDF1A.351    
                                                                           VERTDF1A.352    
C                                                                          VERTDF1A.353    
C*L  ARGUMENTS:---------------------------------------------------         VERTDF1A.354    

      SUBROUTINE VERT_DIF                                                   2VERTDF1A.355    
     *  (PSTAR,U,V,LEVELS_VD,POINTS_VD,AK,BK,DELTA_AK,DELTA_BK,            DR151193.140    
     *   DIFFUSION_K,FLUX_U_DG,FLUX_V_DG,POINTS_FLUX_U,POINTS_FLUX_V,      DR151193.141    
     *   LEVELS_FLUX,FLUX_UD_ON,FLUX_VD_ON)                                DR151193.142    
                                                                           VERTDF1A.367    
      IMPLICIT NONE                                                        VERTDF1A.368    
                                                                           VERTDF1A.369    
      INTEGER                                                              VERTDF1A.370    
     *  POINTS_VD          !IN    NUMBER OF POINTS TO BE UPDATED           DR151193.143    
     *, LEVELS_VD          !IN    NUMBER OF LEVELS TO BE UPDATED           VERTDF1A.372    
     *, POINTS_FLUX_U      !IN    NUMBER OF LEVELS TO BE UPDATED           DR151193.144    
     *, POINTS_FLUX_V      !IN    NUMBER OF LEVELS TO BE UPDATED           DR151193.145    
     *, LEVELS_FLUX        !IN    NUMBER OF LEVELS TO BE UPDATED           DR151193.146    
                                                                           VERTDF1A.375    
      REAL                                                                 VERTDF1A.376    
     * PSTAR(POINTS_VD)       !IN    PSTAR FIELD                           DR151193.147    
     *,U(POINTS_VD,LEVELS_VD) !INOUT ARRAY FOR U FIELD                     DR151193.148    
     *,V(POINTS_VD,LEVELS_VD) !INOUT ARRAY FOR V FIELD                     DR151193.149    
C            AK,BK  DEFINE HYBRID VERTICAL COORDINATES P=A+BP*,            VERTDF1A.380    
C       DELTA_AK,DELTA_BK  DEFINE LAYER PRESSURE THICKNESS PD=AD+BDP*,     VERTDF1A.381    
     *,DELTA_AK(LEVELS_VD)     !IN    LAYER THICKNESS                      DR151193.150    
     *,DELTA_BK(LEVELS_VD)     !IN    LAYER THICKNESS                      VERTDF1A.384    
     *,AK (LEVELS_VD)          !IN    VALUE AT LAYER CENTRE                VERTDF1A.385    
     *,BK (LEVELS_VD)          !IN    VALUE AT LAYER CENTRE                VERTDF1A.386    
     *,DIFFUSION_K(POINTS_VD)  ! LAT. DEPENDENT DIFFUSION*TIMESTEP         DR151193.151    
     *,FLUX_U_DG(POINTS_FLUX_U,LEVELS_FLUX) ! U MOMENTUM FLUX              DR151193.152    
     *                                      ! DIAGNOSTIC                   DR151193.153    
     *,FLUX_V_DG(POINTS_FLUX_V,LEVELS_FLUX) ! V MOMENTUM FLUX              DR151193.154    
     *                                      ! DIAGNOSTIC                   DR151193.155    
      LOGICAL                                                              VERTDF1A.395    
     * FLUX_UD_ON                !U momentum diagnostic switch             VERTDF1A.396    
     *,FLUX_VD_ON                !V momentum diagnostic switch             VERTDF1A.397    
                                                                           VERTDF1A.400    
C*---------------------------------------------------------------------    VERTDF1A.401    
                                                                           VERTDF1A.402    
C*L  WORKSPACE USAGE:-------------------------------------------------     VERTDF1A.403    
C   DEFINE LOCAL WORKSPACE ARRAYS: 4 REAL ARRAYS REQUIRED                  VERTDF1A.404    
C   AT FULL FIELD LENGTH (=POINTS)                                         VERTDF1A.405    
C                                                                          VERTDF1A.406    
                                                                           VERTDF1A.412    
      REAL                                                                 VERTDF1A.413    
     * FLUX_U(POINTS_VD,2)           ! DOWNWARD FLUXES U-MOMENTUM          DR151193.156    
     *,FLUX_V(POINTS_VD,2)           ! DOWNWARD FLUXES V-MOMENTUM          DR151193.157    
                                                                           VERTDF1A.416    
                                                                           VERTDF1A.418    
C*---------------------------------------------------------------------    VERTDF1A.419    
C                                                                          VERTDF1A.420    
C*L EXTERNAL SUBROUTINES CALLED---------------------------------------     VERTDF1A.421    
C     NONE                                                                 VERTDF1A.422    
C*------------------------------------------------------------------       VERTDF1A.423    
CL  MAXIMUM VECTOR LENGTH ASSUMED =POINTS                                  VERTDF1A.424    
CL---------------------------------------------------------------------    VERTDF1A.425    
C----------------------------------------------------------------------    VERTDF1A.426    
C    DEFINE LOCAL VARIABLES                                                VERTDF1A.427    
      REAL                                                                 VERTDF1A.428    
     *  DEL_AK          ! DIFFERENCE OF AK ACROSS FULL-LEVELS              VERTDF1A.429    
     *, DEL_BK          ! DIFFERENCE OF BK ACROSS FULL-LEVELS              VERTDF1A.430    
     *,DELTA_P          ! P(K+1/2) - P(K-1/2)                              VERTDF1A.431    
     *,DELTA_PL         ! P(K+1)   - P(K)                                  VERTDF1A.432    
C                                                                          VERTDF1A.433    
      INTEGER    K,I      ! LOOP COUNTERS IN ROUTINE                       VERTDF1A.434    
      INTEGER    KL,KU,KK ! LEVEL COUNTERS IN ROUTINE                      VERTDF1A.435    
C                                                                          VERTDF1A.436    
                                                                           VERTDF1A.437    
C-------------------------------------------------------------------       VERTDF1A.438    
CL    INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS:                       VERTDF1A.439    
C------------------------------------------------------------------        VERTDF1A.440    
CL    1. CALCULATE VERTICAL FLUX OF MOMENTUM , EQN(1) DOCUMENTATION        VERTDF1A.441    
CL       AND UPDATE U,V                                                    VERTDF1A.442    
C------------------------------------------------------------------        VERTDF1A.443    
                                                                           VERTDF1A.444    
      KL = 1                                                               VERTDF1A.445    
      KU = 2                                                               VERTDF1A.446    
      DO I=1,POINTS_VD                                                     DR151193.158    
       FLUX_U(I,KL) = 0.0                                                  VERTDF1A.448    
       FLUX_V(I,KL) = 0.0                                                  VERTDF1A.449    
      END DO                                                               VERTDF1A.450    
                                                                           VERTDF1A.451    
CL    LOOP OVER LEVELS                                                     VERTDF1A.452    
                                                                           VERTDF1A.453    
      DO K = 1,LEVELS_VD-1                                                 VERTDF1A.454    
                                                                           VERTDF1A.455    
CL      1.1  CALCULATE DELTA_P(K) AND DELTA_PL(K)                          VERTDF1A.456    
        DEL_AK=AK(K+1) - AK(K)                                             VERTDF1A.457    
        DEL_BK=BK(K+1) - BK(K)                                             VERTDF1A.458    
                                                                           VERTDF1A.459    
        DO I=1,POINTS_VD                                                   DR151193.159    
          DELTA_P=DELTA_AK(K)+DELTA_BK(K)*PSTAR(I)                         VERTDF1A.461    
          DELTA_PL=DEL_AK+DEL_BK*PSTAR(I)                                  VERTDF1A.462    
                                                                           VERTDF1A.463    
CL      1.2  COMPUTE FLUX (+VE UP) AND INCREMENT                           VERTDF1A.464    
                                                                           VERTDF1A.465    
          FLUX_U(I,KU)=(U(I,K+1) - U(I,K))*DIFFUSION_K(I)/DELTA_PL         VERTDF1A.466    
          FLUX_V(I,KU)=(V(I,K+1) - V(I,K))*DIFFUSION_K(I)/DELTA_PL         VERTDF1A.467    
                                                                           VERTDF1A.468    
          U(I,K) = U(I,K) + (FLUX_U(I,KU) - FLUX_U(I,KL))/DELTA_P          VERTDF1A.476    
          V(I,K) = V(I,K) + (FLUX_V(I,KU) - FLUX_V(I,KL))/DELTA_P          VERTDF1A.477    
                                                                           DR151193.160    
        END DO                                                             VERTDF1A.478    
                                                                           DR151193.161    
        IF (FLUX_UD_ON) THEN   !  SF(201,7)                                DR151193.162    
          DO I=1,POINTS_VD                                                 DR151193.163    
            FLUX_U_DG(I,K)= FLUX_U(I,KU)                                   DR151193.164    
          ENDDO                                                            DR151193.165    
        ENDIF                                                              DR151193.166    
        IF (FLUX_VD_ON) THEN   !  SF(202,7)                                DR151193.167    
          DO I=1,POINTS_VD                                                 DR151193.168    
            FLUX_V_DG(I,K)= FLUX_V(I,KU)                                   DR151193.169    
          ENDDO                                                            DR151193.170    
        ENDIF                                                              DR151193.171    
                                                                           VERTDF1A.479    
C       SWAP STORAGE LOCATIONS FOR LOWER AND UPPER FLUXES                  VERTDF1A.480    
        KK = KL                                                            VERTDF1A.481    
        KL = KU                                                            VERTDF1A.482    
        KU = KK                                                            VERTDF1A.483    
                                                                           VERTDF1A.484    
      END DO                                                               VERTDF1A.485    
CL  END LOOP OVER LEVELS                                                   VERTDF1A.486    
                                                                           VERTDF1A.487    
CL    LAST LEVEL                                                           VERTDF1A.488    
      K=LEVELS_VD                                                          VERTDF1A.489    
      DO I=1,POINTS_VD                                                     DR151193.172    
        DELTA_P=DELTA_AK(K)+DELTA_BK(K)*PSTAR(I)                           VERTDF1A.491    
        U(I,K) = U(I,K) - FLUX_U(I,KL)/DELTA_P                             VERTDF1A.492    
        V(I,K) = V(I,K) - FLUX_V(I,KL)/DELTA_P                             VERTDF1A.493    
      END DO                                                               VERTDF1A.494    
                                                                           VERTDF1A.495    
      RETURN                                                               VERTDF1A.496    
      END                                                                  VERTDF1A.497    
*ENDIF                                                                     VERTDF1A.498