*IF DEF,A07_1B                                                             VERTDF1B.2      
C ******************************COPYRIGHT******************************    VERTDF1B.3      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    VERTDF1B.4      
C                                                                          VERTDF1B.5      
C Use, duplication or disclosure of this code is subject to the            VERTDF1B.6      
C restrictions as set forth in the contract.                               VERTDF1B.7      
C                                                                          VERTDF1B.8      
C                Meteorological Office                                     VERTDF1B.9      
C                London Road                                               VERTDF1B.10     
C                BRACKNELL                                                 VERTDF1B.11     
C                Berkshire UK                                              VERTDF1B.12     
C                RG12 2SZ                                                  VERTDF1B.13     
C                                                                          VERTDF1B.14     
C If no contract has been raised with this copy of the code, the use,      VERTDF1B.15     
C duplication or disclosure of it is strictly prohibited.  Permission      VERTDF1B.16     
C to do so must first be obtained in writing from the Head of Numerical    VERTDF1B.17     
C Modelling at the above address.                                          VERTDF1B.18     
C ******************************COPYRIGHT******************************    VERTDF1B.19     
C                                                                          VERTDF1B.20     
CLL  SUBROUTINE VDIF_CTL and VERT_DIF --------------------------           VERTDF1B.21     
CLL                                                                        VERTDF1B.22     
CLL  PURPOSE:   CONTROL SECTION FOR VERTICAL DIFFUSION ROUTINE WHICH       VERTDF1B.23     
CLL APPLIES VERTICAL DIFFUSION TO WIND COMPONENTS WITHIN A LATITUDE BAND   VERTDF1B.24     
CLL SYMMETRIC ABOUT THE EQUATOR.  THE DIFFUSION COEFFICIENT TAILS OFF      VERTDF1B.25     
CLL AWAY FROM THE EQUATOR AND IS ZERO OUTSIDE THE BAND.                    VERTDF1B.26     
CLL                                                                        VERTDF1B.27     
CLL  FURTHER ALTERATIONS MAY BE REQUIRED FOR AUTOTASKING EFFICIENCY        VERTDF1B.28     
CLL  SUITABLE FOR SINGLE COLUMN USE, CALL TO P_TO_UV BY-PASSED             VERTDF1B.29     
CLL  SUITABLE FOR ROTATED GRIDS                                            VERTDF1B.30     
CLL                                                                        VERTDF1B.31     
CLL  ORIGINAL VERSION FOR CRAY Y-MP                                        VERTDF1B.32     
CLL                                                                        VERTDF1B.33     
CLL  WRITTEN BY C. WILSON                                                  VERTDF1B.34     
CLL                                                                        VERTDF1B.35     
CLL  Model            Modification history:                                VERTDF1B.36     
CLL version  Date                                                          VERTDF1B.37     
CLL                                                                        VERTDF1B.38     
!LL   4.4   11/08/97  New version optimised for T3E.                       VERTDF1B.39     
!LL                   Not bit-reproducible with VERTDF1A.                  VERTDF1B.40     
CLL   4.4    14/07/97 Gather to diffusion points removed, since it         VERTDF1B.41     
CLL                   it becomes an overhead on T3E for equatorial         VERTDF1B.42     
CLL                   PEs.                                                 VERTDF1B.43     
CLL                   A. Dickinson                                         VERTDF1B.44     
CLL   4.5    Jul. 98  Kill the IBM specific lines (JCThil)                 AJC1F405.36     
CLL                                                                        VERTDF1B.45     
CLL  Programming standard:                                                 VERTDF1B.46     
CLL                                                                        VERTDF1B.47     
CLL  Logical components covered: P21                                       VERTDF1B.48     
CLL                                                                        VERTDF1B.49     
CLL  Project task:                                                         VERTDF1B.50     
CLL                                                                        VERTDF1B.51     
CLL  Documentation:        The equation used is (2)                        VERTDF1B.52     
CLL                        in Unified Model documentation paper no.p21     VERTDF1B.53     
CLL                        C. Wilson, version 2,dated 30/10/89             VERTDF1B.54     
CLLEND-------------------------------------------------------------        VERTDF1B.55     
C                                                                          VERTDF1B.56     
C*L  ARGUMENTS:---------------------------------------------------         VERTDF1B.57     

      SUBROUTINE VDIF_CTL                                                   1,4VERTDF1B.58     
     *  (PSTAR,U,V,                                                        VERTDF1B.59     
     *   P_FIELD,U_FIELD,ROWS,FIRST_ROW,ROW_LENGTH,                        VERTDF1B.60     
     *   LEVEL_START,LEVEL_END,LEVELS_VD,P_LEVELS,                         VERTDF1B.61     
     *   AK,BK,DELTA_AK,DELTA_BK,COS_LAT, LATITUDE_BAND,                   VERTDF1B.62     
     *   VERTICAL_DIFFUSION, TIMESTEP,                                     VERTDF1B.63     
     *   STASH_U_FLUX,FLUX_UD_ON,U_LIST,                                   VERTDF1B.64     
     *   STASH_V_FLUX,FLUX_VD_ON,V_LIST,                                   VERTDF1B.65     
     *   LEN_STASH_U_FLUX,LEN_STASH_V_FLUX,                                VERTDF1B.66     
     *   POINTS_FLUX_U,POINTS_FLUX_V,LEVELS_FLUX,                          VERTDF1B.67     
     *   IRET)                                                             VERTDF1B.68     
                                                                           VERTDF1B.69     
      IMPLICIT NONE                                                        VERTDF1B.70     
                                                                           VERTDF1B.71     
      INTEGER                                                              VERTDF1B.72     
     *  P_FIELD            !IN    1ST DIMENSION OF FIELD OF PSTAR          VERTDF1B.73     
     *, U_FIELD            !IN    1ST DIMENSION OF FIELD OF U,V            VERTDF1B.74     
     *, ROWS               !IN    NUMBER OF ROWS TO BE UPDATED.            VERTDF1B.75     
     *, FIRST_ROW          !IN    NUMBER OF FIRST ROW IN DATA ARRAY        VERTDF1B.76     
     *, ROW_LENGTH         !IN    NUMBER OF POINTS PER ROW                 VERTDF1B.77     
     *, LEVEL_START        !IN    BOTTOM LEVEL TO BE UPDATED.              VERTDF1B.78     
     *, LEVEL_END          !IN    TOP    LEVEL TO BE UPDATED.              VERTDF1B.79     
     *, LEVELS_VD          !IN    NO OF VERTICAL DIFFUSION LEVELS          VERTDF1B.80     
     *, P_LEVELS           !IN    NUMBER OF MODEL LEVELS                   VERTDF1B.81     
     *, LEN_STASH_U_FLUX   !IN    DIMENSION OF STASH_U_FLUX                VERTDF1B.82     
     *, LEN_STASH_V_FLUX   !IN    DIMENSION OF STASH_V_FLUX                VERTDF1B.83     
     *, POINTS_FLUX_U      !IN    NO OF POINTS IN U FLUX FIELD             VERTDF1B.84     
     *, POINTS_FLUX_V      !IN    NO OF POINTS IN V FLUX FIELD             VERTDF1B.85     
     *, LEVELS_FLUX        !IN    NO OF FLUX LEVELS                        VERTDF1B.86     
     *, IRET               ! RETURN CODE      :    IRET=0   NORMAL EXIT    VERTDF1B.87     
                                                                           VERTDF1B.88     
      REAL                                                                 VERTDF1B.89     
     * PSTAR(P_FIELD)         !IN    PRIMARY MODEL ARRAY FOR PSTAR FIELD   VERTDF1B.90     
     *,U(U_FIELD,P_LEVELS)    !INOUT PRIMARY MODEL ARRAY FOR U FIELD       VERTDF1B.91     
     *,V(U_FIELD,P_LEVELS)    !INOUT PRIMARY MODEL ARRAY FOR V FIELD       VERTDF1B.92     
C            AK,BK  DEFINE HYBRID VERTICAL COORDINATES P=A+BP*,            VERTDF1B.93     
C       DELTA_AK,DELTA_BK  DEFINE LAYER PRESSURE THICKNESS PD=AD+BDP*,     VERTDF1B.94     
     *,DELTA_AK(P_LEVELS)     !IN    LAYER THICKNESS                       VERTDF1B.95     
     *,DELTA_BK(P_LEVELS)     !IN    LAYER THICKNESS                       VERTDF1B.96     
     *,AK (P_LEVELS)          !IN    VALUE AT LAYER CENTRE                 VERTDF1B.97     
     *,BK (P_LEVELS)          !IN    VALUE AT LAYER CENTRE                 VERTDF1B.98     
     *,COS_LAT(U_FIELD)       !IN    COS(LAT) AT U POINTS                  VERTDF1B.99     
     *,LATITUDE_BAND          !IN    LATITUDE(RADIANS)                     VERTDF1B.100    
     *                        !      WHERE DIFFUSION PRESCRIBED ZERO       VERTDF1B.101    
     *,VERTICAL_DIFFUSION     !IN    VALUE OF DIFFUSION COEFFICIENT        VERTDF1B.102    
     *,TIMESTEP               !IN    TIMESTEP                              VERTDF1B.103    
     *,STASH_U_FLUX(LEN_STASH_U_FLUX,*) !U MOMENTUM FLUX - Diagnostic      VERTDF1B.104    
     *,STASH_V_FLUX(LEN_STASH_V_FLUX,*) !V MOMENTUM FLUX - Diagnostic      VERTDF1B.105    
                                                                           VERTDF1B.106    
C WARNING : Storage is only assigned by the controling routine             VERTDF1B.107    
C           for the number of levels requested.                            VERTDF1B.108    
                                                                           VERTDF1B.109    
      LOGICAL                                                              VERTDF1B.110    
     * FLUX_UD_ON                !U momentum diagnostic switch             VERTDF1B.111    
     *,FLUX_VD_ON                !V momentum diagnostic switch             VERTDF1B.112    
     *,U_LIST(P_LEVELS)          ! List of levels required                 VERTDF1B.113    
     *,V_LIST(P_LEVELS)          ! List of levels required                 VERTDF1B.114    
                                                                           VERTDF1B.115    
C*---------------------------------------------------------------------    VERTDF1B.116    
                                                                           VERTDF1B.117    
*IF DEF,MPP                                                                VERTDF1B.118    
! Parameters and Common blocks                                             VERTDF1B.119    
*CALL PARVARS                                                              VERTDF1B.120    
*ENDIF                                                                     VERTDF1B.121    
C*L  WORKSPACE USAGE:-------------------------------------------------     VERTDF1B.122    
C   DEFINE LOCAL WORKSPACE ARRAYS: 4+(LEVEL_END-LEVEL_START+1)*2           VERTDF1B.123    
                                                                           VERTDF1B.124    
C    +(LEVEL_END-LEVEL_START)*2                                            VERTDF1B.125    
                                                                           VERTDF1B.126    
C   REAL ARRAYS REQUIRED AT FULL FIELD LENGTH                              VERTDF1B.127    
C   1 INTEGER INDEX ARRAY                                                  VERTDF1B.128    
                                                                           VERTDF1B.129    
      REAL                                                                 VERTDF1B.138    
     * PSTAR_UV( ROWS*ROW_LENGTH )   ! INTERPOLATED PSTAR ON UV-GRID       VERTDF1B.139    
     *,VERT_DIF_LAT(ROWS*ROW_LENGTH) ! LAT. DEPENDENT DIFFUSION*TIMESTEP   VERTDF1B.140    
     *,FLUX_U_DG(POINTS_FLUX_U,LEVELS_FLUX) !FLUX                          VERTDF1B.141    
     *,FLUX_V_DG(POINTS_FLUX_V,LEVELS_FLUX) !FLUX                          VERTDF1B.142    
                                                                           VERTDF1B.143    
                                                                           VERTDF1B.144    
                                                                           VERTDF1B.146    
C*---------------------------------------------------------------------    VERTDF1B.147    
C                                                                          VERTDF1B.148    
C*L EXTERNAL SUBROUTINES CALLED---------------------------------------     VERTDF1B.149    
      EXTERNAL P_TO_UV ,VERT_DIF,TIMER                                     VERTDF1B.150    
C*------------------------------------------------------------------       VERTDF1B.151    
CL  MAXIMUM VECTOR LENGTH ASSUMED IS (ROWS+1) * ROWLENGTH                  VERTDF1B.152    
CL---------------------------------------------------------------------    VERTDF1B.153    
C----------------------------------------------------------------------    VERTDF1B.154    
C    DEFINE LOCAL VARIABLES                                                VERTDF1B.155    
      INTEGER                                                              VERTDF1B.156    
     *  P_POINTS      !     NUMBER OF P POINTS NEEDED                      VERTDF1B.157    
     *, ROWS_P        !     NUMBER OF P ROWS   NEEDED                      VERTDF1B.158    
     *, U_POINTS      !     NUMBER OF U POINTS UPDATED                     VERTDF1B.159    
     *, START_P       !     START POSITION FOR P POINTS NEEDED             VERTDF1B.160    
     *, START_U       !     START POSITION FOR U POINTS UPDATED            VERTDF1B.161    
     *, POINTS_VD     !     NUMBER OF POINTS NON-ZERO DIFFUSION COEFFS     VERTDF1B.162    
                                                                           VERTDF1B.163    
      REAL                                                                 VERTDF1B.164    
     *  COS_LAT_BAND    ! COS LAT AT WHICH DIFFUSION SET TO ZERO           VERTDF1B.165    
     *, COEFF           ! LATITUDE-DEPENDENT DIFFUSION * TIMESTEP          VERTDF1B.166    
C                                                                          VERTDF1B.167    
      INTEGER    K,I,II,IK,! LOOP COUNTERS IN ROUTINE                      VERTDF1B.168    
     *           KOUT_U,KOUT_V                                             VERTDF1B.169    
C                                                                          VERTDF1B.170    
                                                                           VERTDF1B.171    
C-------------------------------------------------------------------       VERTDF1B.172    
CL    INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS:                       VERTDF1B.173    
CL    1.     INITIALISATION                                                VERTDF1B.174    
C--------------------------                                                VERTDF1B.175    
                                                                           VERTDF1B.176    
        START_P       = (FIRST_ROW-1)*ROW_LENGTH                           VERTDF1B.177    
        START_U       = START_P                                            VERTDF1B.178    
*IF -DEF,MPP                                                               VERTDF1B.179    
        ROWS_P        = ROWS+1                                             VERTDF1B.180    
*ELSE                                                                      VERTDF1B.181    
      IF (atbase) THEN                                                     VERTDF1B.182    
        ROWS_P=ROWS                                                        VERTDF1B.183    
      ELSE                                                                 VERTDF1B.184    
        ROWS_P=ROWS+1                                                      VERTDF1B.185    
      ENDIF                                                                VERTDF1B.186    
*ENDIF                                                                     VERTDF1B.187    
        P_POINTS      = (ROWS_P)*ROW_LENGTH                                VERTDF1B.188    
*IF -DEF,MPP                                                               VERTDF1B.189    
        U_POINTS      = ROWS*ROW_LENGTH                                    VERTDF1B.190    
*ELSE                                                                      VERTDF1B.191    
      IF (atbase) THEN                                                     VERTDF1B.192    
        U_POINTS=(ROWS-1)*ROW_LENGTH                                       VERTDF1B.193    
      ELSE                                                                 VERTDF1B.194    
        U_POINTS=ROWS*ROW_LENGTH                                           VERTDF1B.195    
      ENDIF                                                                VERTDF1B.196    
*ENDIF                                                                     VERTDF1B.197    
                                                                           VERTDF1B.198    
C------------------------------------------------------------------        VERTDF1B.199    
CL    1.1  CALCULATE LATITUDE-DEPENDENT DIFFUSION COEFFICIENTS*TIMESTEP    VERTDF1B.200    
CL         AND SET TO ZERO WHERE NO DIFFUSION REQUIRED                     VERTDF1B.201    
C------------------------------------------------------------------        VERTDF1B.202    
                                                                           VERTDF1B.203    
        COS_LAT_BAND = COS(LATITUDE_BAND)                                  VERTDF1B.204    
        COEFF = VERTICAL_DIFFUSION * TIMESTEP / (1.- COS_LAT_BAND)         VERTDF1B.205    
C                                                                          VERTDF1B.206    
        DO I=1,U_POINTS                                                    VERTDF1B.207    
         VERT_DIF_LAT(I) = COEFF * ( COS_LAT(START_U+I) - COS_LAT_BAND)    VERTDF1B.208    
         IF(VERT_DIF_LAT(I).LT.0.0)VERT_DIF_LAT(I)=0.0                     VERTDF1B.209    
        END DO                                                             VERTDF1B.210    
                                                                           VERTDF1B.211    
C------------------------------------------------------------------        VERTDF1B.212    
CL    1.2 INTERPOLATE PSTAR TO UV GRID                                     VERTDF1B.213    
C------------------------------------------------------------------        VERTDF1B.214    
                                                                           VERTDF1B.215    
*IF DEF,SCMA                                                               AJC1F405.37     
                                                                           VERTDF1B.217    
      DO I=1,U_POINTS                                                      VERTDF1B.218    
       PSTAR_UV(I) =PSTAR(I)                                               VERTDF1B.219    
      END DO                                                               VERTDF1B.220    
                                                                           VERTDF1B.221    
*ELSE                                                                      VERTDF1B.222    
                                                                           VERTDF1B.223    
      CALL P_TO_UV(PSTAR(START_P+1),PSTAR_UV,P_POINTS,U_POINTS,            VERTDF1B.224    
     * ROW_LENGTH,ROWS_P)                                                  VERTDF1B.225    
                                                                           VERTDF1B.226    
*ENDIF                                                                     VERTDF1B.227    
                                                                           VERTDF1B.228    
                                                                           VERTDF1B.229    
      LEVELS_VD=LEVEL_END-LEVEL_START+1                                    VERTDF1B.230    
                                                                           VERTDF1B.231    
C------------------------------------------------------------------        VERTDF1B.232    
CL  2.  CALL VERT_DIF AND UPDATE WINDS                                     VERTDF1B.233    
C------------------------------------------------------------------        VERTDF1B.234    
                                                                           VERTDF1B.235    
      CALL VERT_DIF(PSTAR_UV,                                              VERTDF1B.236    
     &        U(START_U+1,LEVEL_START),V(START_U+1,LEVEL_START),           VERTDF1B.237    
     &              LEVELS_VD,U_POINTS,U_FIELD,                            VERTDF1B.238    
     &              AK(LEVEL_START),BK(LEVEL_START),                       VERTDF1B.239    
     &              DELTA_AK(LEVEL_START),DELTA_BK(LEVEL_START),           VERTDF1B.240    
     &              VERT_DIF_LAT,FLUX_U_DG,FLUX_V_DG,                      VERTDF1B.241    
     &              POINTS_FLUX_U,POINTS_FLUX_V,LEVELS_FLUX,               VERTDF1B.242    
     &              FLUX_UD_ON,FLUX_VD_ON)                                 VERTDF1B.243    
                                                                           VERTDF1B.244    
                                                                           VERTDF1B.245    
      IF (FLUX_UD_ON .OR. FLUX_VD_ON) THEN                                 VERTDF1B.246    
                                                                           VERTDF1B.247    
        KOUT_U=0                                                           VERTDF1B.248    
        KOUT_V=0                                                           VERTDF1B.249    
                                                                           VERTDF1B.250    
        DO K = LEVEL_START,LEVEL_END-1                                     VERTDF1B.251    
                                                                           VERTDF1B.252    
          IF (U_LIST(K)) THEN                                              VERTDF1B.253    
            KOUT_U=KOUT_U+1                                                VERTDF1B.254    
          END IF                                                           VERTDF1B.255    
          IF (V_LIST(K)) THEN                                              VERTDF1B.256    
            KOUT_V=KOUT_V+1                                                VERTDF1B.257    
          END IF                                                           VERTDF1B.258    
                                                                           VERTDF1B.259    
          IK = K-LEVEL_START+1                                             VERTDF1B.260    
                                                                           VERTDF1B.261    
          DO I=1,U_POINTS                                                  VERTDF1B.262    
                                                                           VERTDF1B.263    
          IF (FLUX_UD_ON .AND. U_LIST(K)) THEN                             VERTDF1B.264    
           STASH_U_FLUX(START_U+I,KOUT_U) = FLUX_U_DG(I,IK)                VERTDF1B.265    
          ENDIF                                                            VERTDF1B.266    
          IF (FLUX_VD_ON .AND. V_LIST(K)) THEN                             VERTDF1B.267    
           STASH_V_FLUX(START_U+I,KOUT_V) = FLUX_V_DG(I,IK)                VERTDF1B.268    
          ENDIF                                                            VERTDF1B.269    
                                                                           VERTDF1B.270    
          ENDDO                                                            VERTDF1B.271    
                                                                           VERTDF1B.272    
        ENDDO                                                              VERTDF1B.273    
                                                                           VERTDF1B.274    
      ENDIF                                                                VERTDF1B.275    
                                                                           VERTDF1B.276    
      IRET=0                                                               VERTDF1B.277    
                                                                           VERTDF1B.278    
1000  CONTINUE                                                             VERTDF1B.279    
      RETURN                                                               VERTDF1B.280    
      END                                                                  VERTDF1B.281    
CLL  SUBROUTINE VERT_DIF--------------------------------------------       VERTDF1B.282    
CLL                                                                        VERTDF1B.283    
CLL  PURPOSE:   TO APPLY VERTICAL DIFFUSION TO WIND COMPONENTS             VERTDF1B.284    
CLL             WITHIN A LATITUDE BAND SYMMETRIC ABOUT THE EQUATOR.        VERTDF1B.285    
CLL             THE DIFFUSION COEFFICIENT TAILS OFF AWAY FROM THE          VERTDF1B.286    
CLL             EQUATOR AND IS ZERO OUTSIDE THE BAND.                      VERTDF1B.287    
CLL             THIS ROUTINE APPLIES A PRECALCULATED                       VERTDF1B.288    
CLL             DIFFUSION COEFFICIENT TO ALL POINTS PASSED TO IT           VERTDF1B.289    
CLL  SUITABLE FOR SINGLE COLUMN USE                                        VERTDF1B.290    
CLL  SUITABLE FOR ROTATED GRIDS                                            VERTDF1B.291    
CLL  FURTHER ALTERATIONS MAY BE REQUIRED FOR AUTOTASKING EFFICIENCY        VERTDF1B.292    
CLL  ORIGINAL VERSION FOR CRAY Y-MP                                        VERTDF1B.293    
CLL                                                                        VERTDF1B.294    
CLL  WRITTEN BY C. WILSON                                                  VERTDF1B.295    
CLL                                                                        VERTDF1B.296    
CLL  Model            Modification history:                                VERTDF1B.297    
CLL version  Date                                                          VERTDF1B.298    
CLL   4.5    Jul. 98  Kill the IBM specific lines (JCThil)                 AJC1F405.38     
CLL                                                                        VERTDF1B.299    
CLL  PROGRAMMING STANDARD:                                                 VERTDF1B.300    
CLL                                                                        VERTDF1B.301    
CLL  LOGICAL COMPONENTS COVERED: P21                                       VERTDF1B.302    
CLL                                                                        VERTDF1B.303    
CLL  PROJECT TASK:                                                         VERTDF1B.304    
CLL                                                                        VERTDF1B.305    
CLL  DOCUMENTATION:        THE EQUATIONS USED ARE (1) TO (4)               VERTDF1B.306    
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER NO.P21     VERTDF1B.307    
CLL                        C. WILSON, VERSION 2,DATED 30/10/89             VERTDF1B.308    
CLLEND-------------------------------------------------------------        VERTDF1B.309    
                                                                           VERTDF1B.310    
C                                                                          VERTDF1B.311    
C*L  ARGUMENTS:---------------------------------------------------         VERTDF1B.312    

      SUBROUTINE VERT_DIF                                                   2VERTDF1B.313    
     *  (PSTAR,U,V,LEVELS_VD,POINTS_VD,UFIELD,AK,BK,DELTA_AK,DELTA_BK,     VERTDF1B.314    
     *   DIFFUSION_K,FLUX_U_DG,FLUX_V_DG,POINTS_FLUX_U,POINTS_FLUX_V,      VERTDF1B.315    
     *   LEVELS_FLUX,FLUX_UD_ON,FLUX_VD_ON)                                VERTDF1B.316    
                                                                           VERTDF1B.317    
      IMPLICIT NONE                                                        VERTDF1B.318    
                                                                           VERTDF1B.319    
      INTEGER                                                              VERTDF1B.320    
     *  POINTS_VD          !IN    NUMBER OF POINTS TO BE UPDATED           VERTDF1B.321    
     *, LEVELS_VD          !IN    NUMBER OF LEVELS TO BE UPDATED           VERTDF1B.322    
     *, UFIELD             !IN    DIMENSION OF HORIZ FIELD                 VERTDF1B.323    
     *, POINTS_FLUX_U      !IN    NUMBER OF LEVELS TO BE UPDATED           VERTDF1B.324    
     *, POINTS_FLUX_V      !IN    NUMBER OF LEVELS TO BE UPDATED           VERTDF1B.325    
     *, LEVELS_FLUX        !IN    NUMBER OF LEVELS TO BE UPDATED           VERTDF1B.326    
                                                                           VERTDF1B.327    
      REAL                                                                 VERTDF1B.328    
     * PSTAR(UFIELD)       !IN    PSTAR FIELD                              VERTDF1B.329    
     *,U(UFIELD,LEVELS_VD) !INOUT ARRAY FOR U FIELD                        VERTDF1B.330    
     *,V(UFIELD,LEVELS_VD) !INOUT ARRAY FOR V FIELD                        VERTDF1B.331    
C            AK,BK  DEFINE HYBRID VERTICAL COORDINATES P=A+BP*,            VERTDF1B.332    
C       DELTA_AK,DELTA_BK  DEFINE LAYER PRESSURE THICKNESS PD=AD+BDP*,     VERTDF1B.333    
     *,DELTA_AK(LEVELS_VD)     !IN    LAYER THICKNESS                      VERTDF1B.334    
     *,DELTA_BK(LEVELS_VD)     !IN    LAYER THICKNESS                      VERTDF1B.335    
     *,AK (LEVELS_VD)          !IN    VALUE AT LAYER CENTRE                VERTDF1B.336    
     *,BK (LEVELS_VD)          !IN    VALUE AT LAYER CENTRE                VERTDF1B.337    
     *,DIFFUSION_K(UFIELD)     ! LAT. DEPENDENT DIFFUSION*TIMESTEP         VERTDF1B.338    
     *,FLUX_U_DG(POINTS_FLUX_U,LEVELS_FLUX) ! U MOMENTUM FLUX              VERTDF1B.339    
     *                                      ! DIAGNOSTIC                   VERTDF1B.340    
     *,FLUX_V_DG(POINTS_FLUX_V,LEVELS_FLUX) ! V MOMENTUM FLUX              VERTDF1B.341    
     *                                      ! DIAGNOSTIC                   VERTDF1B.342    
      LOGICAL                                                              VERTDF1B.343    
     * FLUX_UD_ON                !U momentum diagnostic switch             VERTDF1B.344    
     *,FLUX_VD_ON                !V momentum diagnostic switch             VERTDF1B.345    
                                                                           VERTDF1B.346    
C*---------------------------------------------------------------------    VERTDF1B.347    
                                                                           VERTDF1B.348    
C*L  WORKSPACE USAGE:-------------------------------------------------     VERTDF1B.349    
C   DEFINE LOCAL WORKSPACE ARRAYS: 4 REAL ARRAYS REQUIRED                  VERTDF1B.350    
C   AT FULL FIELD LENGTH (=POINTS)                                         VERTDF1B.351    
C                                                                          VERTDF1B.352    
      REAL                                                                 VERTDF1B.359    
     * FLUX_U(POINTS_VD,2)           ! DOWNWARD FLUXES U-MOMENTUM          VERTDF1B.360    
     *,FLUX_V(POINTS_VD,2)           ! DOWNWARD FLUXES V-MOMENTUM          VERTDF1B.361    
                                                                           VERTDF1B.362    
                                                                           VERTDF1B.364    
C*---------------------------------------------------------------------    VERTDF1B.365    
C                                                                          VERTDF1B.366    
C*L EXTERNAL SUBROUTINES CALLED---------------------------------------     VERTDF1B.367    
C     NONE                                                                 VERTDF1B.368    
C*------------------------------------------------------------------       VERTDF1B.369    
CL  MAXIMUM VECTOR LENGTH ASSUMED =POINTS                                  VERTDF1B.370    
CL---------------------------------------------------------------------    VERTDF1B.371    
C----------------------------------------------------------------------    VERTDF1B.372    
C    DEFINE LOCAL VARIABLES                                                VERTDF1B.373    
      REAL                                                                 VERTDF1B.374    
     *  DEL_AK          ! DIFFERENCE OF AK ACROSS FULL-LEVELS              VERTDF1B.375    
     *, DEL_BK          ! DIFFERENCE OF BK ACROSS FULL-LEVELS              VERTDF1B.376    
     *,DELTA_P          ! P(K+1/2) - P(K-1/2)                              VERTDF1B.377    
     *,DELTA_PL         ! P(K+1)   - P(K)                                  VERTDF1B.378    
C                                                                          VERTDF1B.379    
      INTEGER    K,I      ! LOOP COUNTERS IN ROUTINE                       VERTDF1B.380    
      INTEGER    KL,KU,KK ! LEVEL COUNTERS IN ROUTINE                      VERTDF1B.381    
C                                                                          VERTDF1B.382    
                                                                           VERTDF1B.383    
C-------------------------------------------------------------------       VERTDF1B.384    
CL    INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS:                       VERTDF1B.385    
C------------------------------------------------------------------        VERTDF1B.386    
CL    1. CALCULATE VERTICAL FLUX OF MOMENTUM , EQN(1) DOCUMENTATION        VERTDF1B.387    
CL       AND UPDATE U,V                                                    VERTDF1B.388    
C------------------------------------------------------------------        VERTDF1B.389    
                                                                           VERTDF1B.390    
      KL = 1                                                               VERTDF1B.391    
      KU = 2                                                               VERTDF1B.392    
      DO I=1,POINTS_VD                                                     VERTDF1B.393    
       FLUX_U(I,KL) = 0.0                                                  VERTDF1B.394    
       FLUX_V(I,KL) = 0.0                                                  VERTDF1B.395    
      END DO                                                               VERTDF1B.396    
                                                                           VERTDF1B.397    
CL    LOOP OVER LEVELS                                                     VERTDF1B.398    
                                                                           VERTDF1B.399    
      DO K = 1,LEVELS_VD-1                                                 VERTDF1B.400    
                                                                           VERTDF1B.401    
CL      1.1  CALCULATE DELTA_P(K) AND DELTA_PL(K)                          VERTDF1B.402    
        DEL_AK=AK(K+1) - AK(K)                                             VERTDF1B.403    
        DEL_BK=BK(K+1) - BK(K)                                             VERTDF1B.404    
                                                                           VERTDF1B.405    
        DO I=1,POINTS_VD                                                   VERTDF1B.406    
          DELTA_P=DELTA_AK(K)+DELTA_BK(K)*PSTAR(I)                         VERTDF1B.407    
          DELTA_PL=DEL_AK+DEL_BK*PSTAR(I)                                  VERTDF1B.408    
                                                                           VERTDF1B.409    
CL      1.2  COMPUTE FLUX (+VE UP) AND INCREMENT                           VERTDF1B.410    
                                                                           VERTDF1B.411    
          FLUX_U(I,KU)=(U(I,K+1) - U(I,K))*DIFFUSION_K(I)/DELTA_PL         VERTDF1B.412    
          FLUX_V(I,KU)=(V(I,K+1) - V(I,K))*DIFFUSION_K(I)/DELTA_PL         VERTDF1B.413    
                                                                           VERTDF1B.414    
          U(I,K) = U(I,K) + (FLUX_U(I,KU) - FLUX_U(I,KL))/DELTA_P          VERTDF1B.415    
          V(I,K) = V(I,K) + (FLUX_V(I,KU) - FLUX_V(I,KL))/DELTA_P          VERTDF1B.416    
                                                                           VERTDF1B.417    
        END DO                                                             VERTDF1B.418    
                                                                           VERTDF1B.419    
        IF (FLUX_UD_ON) THEN   !  SF(201,7)                                VERTDF1B.420    
          DO I=1,POINTS_VD                                                 VERTDF1B.421    
            FLUX_U_DG(I,K)= FLUX_U(I,KU)                                   VERTDF1B.422    
          ENDDO                                                            VERTDF1B.423    
        ENDIF                                                              VERTDF1B.424    
        IF (FLUX_VD_ON) THEN   !  SF(202,7)                                VERTDF1B.425    
          DO I=1,POINTS_VD                                                 VERTDF1B.426    
            FLUX_V_DG(I,K)= FLUX_V(I,KU)                                   VERTDF1B.427    
          ENDDO                                                            VERTDF1B.428    
        ENDIF                                                              VERTDF1B.429    
                                                                           VERTDF1B.430    
C       SWAP STORAGE LOCATIONS FOR LOWER AND UPPER FLUXES                  VERTDF1B.431    
        KK = KL                                                            VERTDF1B.432    
        KL = KU                                                            VERTDF1B.433    
        KU = KK                                                            VERTDF1B.434    
                                                                           VERTDF1B.435    
      END DO                                                               VERTDF1B.436    
CL  END LOOP OVER LEVELS                                                   VERTDF1B.437    
                                                                           VERTDF1B.438    
CL    LAST LEVEL                                                           VERTDF1B.439    
      K=LEVELS_VD                                                          VERTDF1B.440    
      DO I=1,POINTS_VD                                                     VERTDF1B.441    
        DELTA_P=DELTA_AK(K)+DELTA_BK(K)*PSTAR(I)                           VERTDF1B.442    
        U(I,K) = U(I,K) - FLUX_U(I,KL)/DELTA_P                             VERTDF1B.443    
        V(I,K) = V(I,K) - FLUX_V(I,KL)/DELTA_P                             VERTDF1B.444    
      END DO                                                               VERTDF1B.445    
                                                                           VERTDF1B.446    
      RETURN                                                               VERTDF1B.447    
      END                                                                  VERTDF1B.448    
*ENDIF                                                                     VERTDF1B.449