*IF DEF,A13_1C                                                             COFUV1C.2      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    COFUV1C.3      
C                                                                          COFUV1C.4      
C Use, duplication or disclosure of this code is subject to the            COFUV1C.5      
C restrictions as set forth in the contract.                               COFUV1C.6      
C                                                                          COFUV1C.7      
C                Meteorological Office                                     COFUV1C.8      
C                London Road                                               COFUV1C.9      
C                BRACKNELL                                                 COFUV1C.10     
C                Berkshire UK                                              COFUV1C.11     
C                RG12 2SZ                                                  COFUV1C.12     
C                                                                          COFUV1C.13     
C If no contract has been raised with this copy of the code, the use,      COFUV1C.14     
C duplication or disclosure of it is strictly prohibited.  Permission      COFUV1C.15     
C to do so must first be obtained in writing from the Head of Numerical    COFUV1C.16     
C Modelling at the above address.                                          COFUV1C.17     
C ******************************COPYRIGHT******************************    COFUV1C.18     
C                                                                          COFUV1C.19     
CLL   SUBROUTINE COEFF_UV -----------------------------------------        COFUV1C.20     
CLL                                                                        COFUV1C.21     
CLL   PURPOSE:  CALCULATES EFFECTIVE DIFFUSIVE COEFFICIENTS FOR U AND V    COFUV1C.22     
CLL             IN NS AND EW DIRECTIONS                                    COFUV1C.23     
CLL              IF STEEP SLOPE THEN EFFECTIVE DIFFUSION IS ZERO.          COFUV1C.24     
CLL                                                                        COFUV1C.25     
CLL              NOTE PRESSURE ARRAY NEEDS TO BE GLOBAL (SHARED)           COFUV1C.26     
CLL              FOR MULTI-TASKING AT 3.4 UPWARDS.                         COFUV1C.27     
CLL   NOT SUITABLE FOR SINGLE COLUMN USE.                                  COFUV1C.28     
CLL   WAS VERSION FOR CRAY Y-MP                                            COFUV1C.29     
CLL                                                                        COFUV1C.30     
CLL  MODEL            MODIFICATION HISTORY                                 COFUV1C.31     
CLL VERSION  DATE                                                          COFUV1C.32     
!LL   4.4   11/08/97  New version optimised for T3E.                       COFUV1C.33     
!LL                   Not bit-reproducible with COFUV1A.                   COFUV1C.34     
CLL   4.4    25/07/97 Calling sequence changed from once per level         COFUV1C.35     
CLL                   to once per dynamics sweep, in                       COFUV1C.36     
CLL                   order to improve MPP scalability.                    COFUV1C.37     
CLL                   A. Dickinson                                         COFUV1C.38     
CLL                                                                        COFUV1C.39     
CLL                                                                        COFUV1C.40     
CLL   PROGRAMMING STANDARD:                                                COFUV1C.41     
CLL                                                                        COFUV1C.42     
CLL   SYSTEM COMPONENTS COVERED: P132                                      COFUV1C.43     
CLL                                                                        COFUV1C.44     
CLL   SYSTEM TASK: P1                                                      COFUV1C.45     
CLL                                                                        COFUV1C.46     
CLL   DOCUMENTATION:       THE EQUATION USED IS (47)                       COFUV1C.47     
CLL                        IN UNIFIED MODEL DOCUMENTATION PAPER            COFUV1C.48     
CLL                        NO. 10 M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON    COFUV1C.49     
CLL                        VERSION 16 DATED 09/01/91.                      COFUV1C.50     
CLLEND-------------------------------------------------------------        COFUV1C.51     
                                                                           COFUV1C.52     
C*L   ARGUMENTS:---------------------------------------------------        COFUV1C.53     

      SUBROUTINE COEFF_UV                                                   2,2COFUV1C.54     
     1                 (DIFFUSION_EW,DIFFUSION_NS,                         COFUV1C.55     
     2                 PRESSURE,PRESSURE_TEST,AK,BK,                       COFUV1C.56     
     3                 COS_P_LATITUDE,START_U_UPDATE,                      COFUV1C.57     
     4                 END_U_UPDATE,ROW_LENGTH,                            COFUV1C.58     
*CALL ARGFLDPT                                                             COFUV1C.59     
     &                 LATITUDE_STEP_INVERSE,                              COFUV1C.60     
     5                 LONGITUDE_STEP_INVERSE,P_FIELD,U_FIELD,P_LEVELS,    COFUV1C.61     
     6                 KD,DELTA_AK,DELTA_BK,PSTAR,COS_FUNCTION_P)          COFUV1C.62     
                                                                           COFUV1C.63     
      IMPLICIT NONE                                                        COFUV1C.64     
                                                                           COFUV1C.65     
      INTEGER                                                              COFUV1C.66     
     *  U_FIELD            !IN DIMENSION OF FIELDS ON VELOCITY GRID        COFUV1C.67     
     *, P_FIELD            !IN DIMENSION OF FIELDS ON PRESSURE GRID        COFUV1C.68     
     *, P_LEVELS           !IN NUMBER OF MODEL LEVELS                      COFUV1C.69     
     *, ROW_LENGTH         !IN NUMBER OF POINTS PER ROW                    COFUV1C.70     
     *, START_U_UPDATE     !IN FIRST POINT TO BE UPDATED.                  COFUV1C.71     
     *, END_U_UPDATE       !IN LAST POINT TO BE UPDATED.                   COFUV1C.72     
                                                                           COFUV1C.73     
! All TYPFLDPT arguments are intent IN                                     COFUV1C.74     
*CALL TYPFLDPT                                                             COFUV1C.75     
                                                                           COFUV1C.76     
      REAL                                                                 COFUV1C.77     
     * PRESSURE(P_FIELD,P_LEVELS)      !IN.3-D PRESSURE FIELD U POINTS     COFUV1C.78     
     *          ! LEVEL_P=1 SURFACE THEN LEVEL_P=K IS LEVEL K-1            COFUV1C.79     
     *,DIFFUSION_EW(P_FIELD,P_LEVELS)                                      COFUV1C.80     
            !OUT EFFECTIVE EW DIFFUSION COEFF                              COFUV1C.81     
     *,DIFFUSION_NS(P_FIELD,P_LEVELS)                                      COFUV1C.82     
           !OUT EFFECTIVE NS DIFFUSION COEFF                               COFUV1C.83     
                                                                           COFUV1C.84     
                                                                           COFUV1C.85     
      REAL                                                                 COFUV1C.86     
     * AK(P_LEVELS)                    !IN LAYER AK'S                      COFUV1C.87     
     *,BK(P_LEVELS)                    !IN LAYER BK'S                      COFUV1C.88     
     *,DELTA_AK(P_LEVELS)              !IN LAYER DELTA_AK'S                COFUV1C.89     
     *,DELTA_BK(P_LEVELS)              !IN LAYER DELTA_BK'S                COFUV1C.90     
     *,KD(P_LEVELS)                    !IN DIFFUSION COEFF SEE EQ. (45)    COFUV1C.91     
     *,PSTAR(P_FIELD)                  !IN PSTAR                           COFUV1C.92     
     *,COS_P_LATITUDE(P_FIELD)         !IN COS(LAT) AT P POINTS            COFUV1C.93     
     *,COS_FUNCTION_P(P_FIELD)         !IN                                 COFUV1C.94     
     *,LATITUDE_STEP_INVERSE           !IN 1/(DELTA LAMDA)                 COFUV1C.95     
     *,LONGITUDE_STEP_INVERSE          !IN 1/(DELTA PHI)                   COFUV1C.96     
     *, PRESSURE_TEST      !IN PRESSURE ALTITUDE LIMIT FOR SLOPE TEST      COFUV1C.97     
                                                                           COFUV1C.98     
                                                                           COFUV1C.99     
C*L   DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE-----------------    COFUV1C.100    
! Define local arrays                                                      COFUV1C.101    
      LOGICAL MASK(P_FIELD) ! Indicates of EW_DIFFUSION to be set to       COFUV1C.102    
!                           ! zero at a point                              COFUV1C.103    
      REAL                                                                 COFUV1C.104    
     * DIFFUSION_COEFFICIENT(P_FIELD)  !IN HOLD ON P GRID. FIRST POINT     COFUV1C.105    
     *                                 ! OF ARRAY IS FIRST P POINT ON      COFUV1C.106    
     *                                 ! SECOND P ROW. EAST-WEST           COFUV1C.107    
     *                                 ! DIFFUSION COEFFICIENT.            COFUV1C.108    
     *,DIFFUSION_COEFFICIENT2(P_FIELD) !IN HOLD ON P GRID. FIRST POINT     COFUV1C.109    
     *                                 ! OF ARRAY IS FIRST P POINT ON      COFUV1C.110    
     *                                 ! SECOND P ROW. NORTH-SOUTH         COFUV1C.111    
     *                                 ! DIFFUSION COEFFICIENT.            COFUV1C.112    
                                                                           COFUV1C.113    
C DEFINE LOCAL VARIABLES                                                   COFUV1C.114    
                                                                           COFUV1C.115    
C LOCAL REALS.                                                             COFUV1C.116    
      REAL                                                                 COFUV1C.117    
     *  PRESSURE_LEVEL                                                     COFUV1C.118    
                                                                           COFUV1C.119    
C COUNT VARIABLES FOR DO LOOPS ETC.                                        COFUV1C.120    
      INTEGER                                                              COFUV1C.121    
     *  I,IJ,LEVEL,LEVEL_P                                                 COFUV1C.122    
C   LEVEL_P=LEVEL+1 IS FOR PRESSURE TEST                                   COFUV1C.123    
C*L   EXTERNAL SUBROUTINE CALLS: NONE---------------------------------     COFUV1C.124    
                                                                           COFUV1C.125    
C*---------------------------------------------------------------------    COFUV1C.126    
CL    MAXIMUM VECTOR LENGTH ASSUMED IS END_U_UPDATE-START_U_UPDATE+1+      COFUV1C.127    
CL                                   ROW_LENGTH                            COFUV1C.128    
CL---------------------------------------------------------------------    COFUV1C.129    
CL    INTERNAL STRUCTURE.                                                  COFUV1C.130    
CL---------------------------------------------------------------------    COFUV1C.131    
CL                                                                         COFUV1C.132    
                                                                           COFUV1C.133    
      DO LEVEL=1,P_LEVELS                                                  COFUV1C.134    
                                                                           COFUV1C.135    
C SET DIFFUSION COEFFICIENT                                                COFUV1C.136    
        DO  I=FIRST_VALID_PT,LAST_P_VALID_PT                               COFUV1C.137    
          DIFFUSION_COEFFICIENT2(I) = KD(LEVEL)*                           COFUV1C.138    
     1        (DELTA_AK(LEVEL)+DELTA_BK(LEVEL)*PSTAR(I))                   COFUV1C.139    
          DIFFUSION_COEFFICIENT(I) = COS_FUNCTION_P(I)*                    COFUV1C.140    
     2                         DIFFUSION_COEFFICIENT2(I)                   COFUV1C.141    
        END DO                                                             COFUV1C.142    
                                                                           COFUV1C.143    
                                                                           COFUV1C.144    
                                                                           COFUV1C.145    
CL---------------------------------------------------------------------    COFUV1C.146    
CL    SECTION 1.     CALCULATE FIRST TERM IN EQUATION (47)                 COFUV1C.147    
CL---------------------------------------------------------------------    COFUV1C.148    
                                                                           COFUV1C.149    
C   LEVEL_P=LEVEL+1 IS FOR PRESSURE TEST                                   COFUV1C.150    
      LEVEL_P=LEVEL+1                                                      COFUV1C.151    
C----------------------------------------------------------------------    COFUV1C.152    
CL    TOP LEVEL LEVEL_P = P_LEVELS SINCE SLOPE TEST NEED NOT BE            COFUV1C.153    
CL     DONE FOR TOP MOST (PRESSURE) LEVELS                                 COFUV1C.154    
C----------------------------------------------------------------------    COFUV1C.155    
      IF(LEVEL_P.GT.P_LEVELS)LEVEL_P=P_LEVELS                              COFUV1C.156    
C----------------------------------------------------------------------    COFUV1C.157    
CL    SECTION 1.1    CALCULATE DELTALAMBDA TERMS                           COFUV1C.158    
C                  DELTAPHIKLAMBDA*1/(DELTALAMBDA)SQUARED                  COFUV1C.159    
C----------------------------------------------------------------------    COFUV1C.160    
                                                                           COFUV1C.161    
      DO I= START_U_UPDATE,END_U_UPDATE                                    COFUV1C.162    
       DIFFUSION_EW(I,LEVEL) = 0.5*(DIFFUSION_COEFFICIENT(I+ROW_LENGTH)    COFUV1C.163    
     &            + DIFFUSION_COEFFICIENT(I))*LONGITUDE_STEP_INVERSE       COFUV1C.164    
     &             *LONGITUDE_STEP_INVERSE                                 COFUV1C.165    
       END DO                                                              COFUV1C.166    
                                                                           COFUV1C.167    
                                                                           COFUV1C.168    
                                                                           COFUV1C.169    
C----------------------------------------------------------------------    COFUV1C.170    
CL    SECTION 1.2    SET EFFECTIVE DIFFUSION COEFFICIENT TO ZERO           COFUV1C.171    
C                    IF STEEP SLOPE BELOW PRESSURE ALTITUDE LIMIT          COFUV1C.172    
C                    APPLY GENERAL TEST AT FIRST POINT ONLY                COFUV1C.173    
C----------------------------------------------------------------------    COFUV1C.174    
                                                                           COFUV1C.175    
C      APPLY GENERAL TEST FOR REFERENCE SURFACE PRESSURE OF 1000HPA        COFUV1C.176    
       PRESSURE_LEVEL=AK(LEVEL)+100000.0*BK(LEVEL)                         COFUV1C.177    
       IF(PRESSURE_LEVEL.GT.PRESSURE_TEST)THEN                             COFUV1C.178    
                                                                           COFUV1C.179    
      DO I= START_U_UPDATE+1,END_U_UPDATE                                  COFUV1C.180    
        MASK(I)=((PRESSURE(I-1,LEVEL_P).GT.PRESSURE(I,LEVEL_P-1)).OR.      COFUV1C.181    
     &           (PRESSURE(I-1,LEVEL_P).LT.PRESSURE(I,LEVEL_P+1)))         COFUV1C.182    
      ENDDO                                                                COFUV1C.183    
                                                                           COFUV1C.184    
*IF -DEF,MPP                                                               COFUV1C.185    
! Recalculate end-points                                                   COFUV1C.186    
      DO I=START_U_UPDATE,END_U_UPDATE,ROW_LENGTH                          COFUV1C.187    
        IJ=I+ROW_LENGTH-1                                                  COFUV1C.188    
        MASK(I)=((PRESSURE(IJ,LEVEL_P).GT.PRESSURE(I,LEVEL_P-1)).OR.       COFUV1C.189    
     &           (PRESSURE(IJ,LEVEL_P).LT.PRESSURE(I,LEVEL_P+1)))          COFUV1C.190    
      ENDDO                                                                COFUV1C.191    
*ENDIF                                                                     COFUV1C.192    
                                                                           COFUV1C.193    
! And zero appropriate points of EW_DIFFUSION                              COFUV1C.194    
      DO I= START_U_UPDATE,END_U_UPDATE                                    COFUV1C.195    
        IF (MASK(I)) DIFFUSION_EW(I,LEVEL)=0.0                             COFUV1C.196    
      ENDDO                                                                COFUV1C.197    
                                                                           COFUV1C.198    
       ENDIF                                                               COFUV1C.199    
                                                                           COFUV1C.200    
                                                                           COFUV1C.201    
CL---------------------------------------------------------------------    COFUV1C.202    
CL    SECTION 2.     CALCULATE SECOND TERM IN EQUATION (47)                COFUV1C.203    
CL---------------------------------------------------------------------    COFUV1C.204    
                                                                           COFUV1C.205    
C----------------------------------------------------------------------    COFUV1C.206    
CL    SECTION 2.1    CALCULATE DELTAPHI TERMS                              COFUV1C.207    
CL        CALCULATE DELTALAMBDAK*COSLAT/(DELTAPHI)SQUARED                  COFUV1C.208    
C----------------------------------------------------------------------    COFUV1C.209    
                                                                           COFUV1C.210    
! Loop over field missing Northern row                                     COFUV1C.211    
      DO I=START_POINT_NO_HALO,LAST_U_FLD_PT-1                             COFUV1C.212    
      DIFFUSION_NS(I,LEVEL)=0.5*(DIFFUSION_COEFFICIENT2(I)                 COFUV1C.213    
     &           *COS_P_LATITUDE(I)                                        COFUV1C.214    
     &           +DIFFUSION_COEFFICIENT2(I+1)*COS_P_LATITUDE(I+1))*        COFUV1C.215    
     &            LATITUDE_STEP_INVERSE*LATITUDE_STEP_INVERSE              COFUV1C.216    
      END DO                                                               COFUV1C.217    
                                                                           COFUV1C.218    
C  RECALCULATE END POINTS.                                                 COFUV1C.219    
                                                                           COFUV1C.220    
*IF -DEF,MPP                                                               COFUV1C.221    
      DO I=1+ROW_LENGTH,U_FIELD,ROW_LENGTH                                 COFUV1C.222    
        IJ = I+ROW_LENGTH-1                                                COFUV1C.223    
        DIFFUSION_NS(IJ,LEVEL)=0.5*                                        COFUV1C.224    
     &           (DIFFUSION_COEFFICIENT2(I)*COS_P_LATITUDE(I)              COFUV1C.225    
     &           +DIFFUSION_COEFFICIENT2(IJ)*COS_P_LATITUDE(IJ))*          COFUV1C.226    
     &            LATITUDE_STEP_INVERSE*LATITUDE_STEP_INVERSE              COFUV1C.227    
      END DO                                                               COFUV1C.228    
*ELSE                                                                      COFUV1C.229    
      DIFFUSION_NS(LAST_U_FLD_PT,LEVEL)                                    COFUV1C.230    
     &                  =DIFFUSION_NS(LAST_U_FLD_PT-1,LEVEL)               COFUV1C.231    
*ENDIF                                                                     COFUV1C.232    
                                                                           COFUV1C.233    
                                                                           COFUV1C.234    
*IF DEF,GLOBAL                                                             COFUV1C.235    
C CALCULATE POLAR TERMS USING ACROSS-POLE DIFFERENCE, REMEMBERING SIGN     COFUV1C.236    
C CHANGE ACROSS THE POLE                                                   COFUV1C.237    
C NB: EFFECTIVE COS_P_LATITUDE IS 1/4 THAT AT ADJACENT ROW                 COFUV1C.238    
                                                                           COFUV1C.239    
                                                                           COFUV1C.240    
*IF DEF,MPP                                                                COFUV1C.241    
      IF (at_top_of_LPG) THEN                                              COFUV1C.242    
*ENDIF                                                                     COFUV1C.243    
! North Pole                                                               COFUV1C.244    
        DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                      COFUV1C.245    
          DIFFUSION_NS(I,LEVEL)=DIFFUSION_COEFFICIENT2(I)                  COFUV1C.246    
     &  *COS_P_LATITUDE(I)*LATITUDE_STEP_INVERSE*LATITUDE_STEP_INVERSE     COFUV1C.247    
        ENDDO                                                              COFUV1C.248    
*IF DEF,MPP                                                                COFUV1C.249    
      ENDIF                                                                COFUV1C.250    
                                                                           COFUV1C.251    
      IF (at_base_of_LPG) THEN                                             COFUV1C.252    
*ENDIF                                                                     COFUV1C.253    
! South Pole                                                               COFUV1C.254    
        DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1                  COFUV1C.255    
          DIFFUSION_NS(I,LEVEL)=DIFFUSION_COEFFICIENT2(I)                  COFUV1C.256    
     &  *COS_P_LATITUDE(I)*LATITUDE_STEP_INVERSE*LATITUDE_STEP_INVERSE     COFUV1C.257    
        ENDDO                                                              COFUV1C.258    
*IF DEF,MPP                                                                COFUV1C.259    
      ENDIF                                                                COFUV1C.260    
*ENDIF                                                                     COFUV1C.261    
*ENDIF                                                                     COFUV1C.262    
                                                                           COFUV1C.263    
                                                                           COFUV1C.264    
C----------------------------------------------------------------------    COFUV1C.265    
CL    SECTION 2.2    SET EFFECTIVE DIFFUSION COEFFICIENT TO ZERO           COFUV1C.266    
C                    IF STEEP SLOPE BELOW PRESSURE ALTITUDE LIMIT          COFUV1C.267    
C                    APPLY GENERAL TEST AT FIRST POINT ONLY                COFUV1C.268    
C----------------------------------------------------------------------    COFUV1C.269    
                                                                           COFUV1C.270    
C      APPLY GENERAL TEST FOR REFERENCE SURFACE PRESSURE OF 1000HPA        COFUV1C.271    
       IF(PRESSURE_LEVEL.GT.PRESSURE_TEST)THEN                             COFUV1C.272    
                                                                           COFUV1C.273    
! Loop over field, missing Northern row                                    COFUV1C.274    
      DO I=START_POINT_NO_HALO,LAST_U_FLD_PT                               COFUV1C.275    
      IF((PRESSURE(I,LEVEL_P).GT.PRESSURE(I-ROW_LENGTH,LEVEL_P-1)).OR.     COFUV1C.276    
     &   (PRESSURE(I,LEVEL_P).LT.                                          COFUV1C.277    
     &        PRESSURE(I-ROW_LENGTH,LEVEL_P+1)))THEN                       COFUV1C.278    
         DIFFUSION_NS(I,LEVEL)=0.0                                         COFUV1C.279    
       ENDIF                                                               COFUV1C.280    
                                                                           COFUV1C.281    
      END DO                                                               COFUV1C.282    
                                                                           COFUV1C.283    
      ENDIF                                                                COFUV1C.284    
      ENDDO                                                                COFUV1C.285    
                                                                           COFUV1C.286    
*IF DEF,MPP                                                                COFUV1C.287    
      CALL SWAPBOUNDS(DIFFUSION_EW,ROW_LENGTH,tot_P_ROWS,                  COFUV1C.288    
     &                   EW_Halo,NS_Halo,P_LEVELS)                         COFUV1C.289    
      CALL SWAPBOUNDS(DIFFUSION_NS,ROW_LENGTH,tot_P_ROWS,                  COFUV1C.290    
     &                   EW_Halo,NS_Halo,P_LEVELS)                         COFUV1C.291    
*ENDIF                                                                     COFUV1C.292    
                                                                           COFUV1C.293    
CL    END OF ROUTINE COEFF_UV                                              COFUV1C.294    
                                                                           COFUV1C.295    
      RETURN                                                               COFUV1C.296    
      END                                                                  COFUV1C.297    
*ENDIF                                                                     COFUV1C.298