*IF DEF,A12_1B,OR,DEF,A12_1C,OR,DEF,A12_1D,OR,DEF,A12_1E                   AAD2F404.251    
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.14878  
C                                                                          GTS2F400.14879  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.14880  
C restrictions as set forth in the contract.                               GTS2F400.14881  
C                                                                          GTS2F400.14882  
C                Meteorological Office                                     GTS2F400.14883  
C                London Road                                               GTS2F400.14884  
C                BRACKNELL                                                 GTS2F400.14885  
C                Berkshire UK                                              GTS2F400.14886  
C                RG12 2SZ                                                  GTS2F400.14887  
C                                                                          GTS2F400.14888  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.14889  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.14890  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.14891  
C Modelling at the above address.                                          GTS2F400.14892  
C ******************************COPYRIGHT******************************    GTS2F400.14893  
C                                                                          GTS2F400.14894  
CLL   SUBROUTINE MASS_UWT_UV  -----------------------------------------    MASUVW1A.3      
CLL                                                                        MASUVW1A.4      
CLL   PURPOSE:   CALCULATES RS AND REMOVES MASS WEIGHTING FROM U AND V     MASUVW1A.5      
CLL                                                                        MASUVW1A.6      
CLL   NOT SUITABLE FOR SINGLE COLUMN USE.                                  MASUVW1A.7      
CLL                                                                        MASUVW1A.8      
CLL  MODEL            MODIFICATION HISTORY:                                MASUVW1A.9      
CLL VERSION  DATE                                                          MASUVW1A.10     
CLL  4.0  02/02/95  Original code: T.Davies                                MASUVW1A.11     
!     4.1    02/04/96 Added MPP code  P.Burton                             APB0F401.1077   
CLL                                                                        MASUVW1A.12     
CLL   4.4    14/07/97 RS output via arg list for use in FILTUV.            AAD2F404.252    
CLL                   A. Dickinson                                         AAD2F404.253    
CLL                                                                        AAD2F404.254    
CLL   PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4,       MASUVW1A.13     
CLL                       STANDARD B. VERSION 2, DATED 18/01/90            MASUVW1A.14     
CLL                                                                        MASUVW1A.15     
CLL   SYSTEM COMPONENTS COVERED: P12 (part)                                MASUVW1A.16     
CLL                                                                        MASUVW1A.17     
CLL   SYSTEM TASK: P1                                                      MASUVW1A.18     
CLL                                                                        MASUVW1A.19     
CLL   DOCUMENTATION:        NIL.                                           MASUVW1A.20     
CLLEND-------------------------------------------------------------        MASUVW1A.21     
                                                                           MASUVW1A.22     
C*L   ARGUMENTS:---------------------------------------------------        MASUVW1A.23     

      SUBROUTINE MASS_UWT_UV                                                1,3MASUVW1A.24     
     1                   (RS_SQUARED_DELTAP,RS,U,V,PSTAR,AK,               AAD2F404.255    
     2                    BK,DELTA_AK,DELTA_BK,P_FIELD,U_FIELD,P_LEVELS,   MASUVW1A.26     
     3                    ROW_LENGTH,                                      APB0F401.1078   
*CALL ARGFLDPT                                                             APB0F401.1079   
     4                    LLINTS,LWHITBROM)                                APB0F401.1080   
                                                                           MASUVW1A.28     
      IMPLICIT NONE                                                        MASUVW1A.29     
      LOGICAL  LLINTS, LWHITBROM                                           MASUVW1A.30     
                                                                           MASUVW1A.31     
      INTEGER                                                              MASUVW1A.32     
     *  P_FIELD            !IN DIMENSION OF FIELDS ON PRESSURE GRID        MASUVW1A.33     
     *, U_FIELD            !IN DIMENSION OF FIELDS ON VELOCITY GRID        MASUVW1A.34     
     *, P_LEVELS           !IN NUMBER OF PRESSURE LEVELS.                  MASUVW1A.35     
     *, ROW_LENGTH         !IN NUMBER OF POINTS ON A ROW.                  MASUVW1A.36     
                                                                           APB0F401.1081   
! All TYPFLDPT arguments are intent IN                                     APB0F401.1082   
*CALL TYPFLDPT                                                             APB0F401.1083   
                                                                           APB0F401.1084   
                                                                           MASUVW1A.37     
      REAL                                                                 MASUVW1A.38     
     * U(U_FIELD,P_LEVELS)            !INOUT U FIELD.                      MASUVW1A.39     
     *,V(U_FIELD,P_LEVELS)            !INOUT U FIELD.                      MASUVW1A.40     
                                                                           MASUVW1A.41     
      REAL                                                                 MASUVW1A.42     
     * RS_SQUARED_DELTAP(P_FIELD,P_LEVELS) !OUT HOLDS RS*RS*DELTA P        MASUVW1A.43     
     *,RS(P_FIELD,P_LEVELS)                !OUT HOLDS RS                   AAD2F404.256    
                                                                           MASUVW1A.44     
      REAL                                                                 MASUVW1A.45     
     * PSTAR(P_FIELD)                 !IN SURFACE PRESSURE                 MASUVW1A.46     
     *,AK(P_LEVELS)                   !IN FIRST TERM IN HYBRID CO-ORDS     MASUVW1A.47     
     *,BK(P_LEVELS)                   !IN SECOND TERM IN HYBRID CO-ORDS    MASUVW1A.48     
     *,DELTA_AK(P_LEVELS)             !IN LAYER THICKNESS TERM             MASUVW1A.49     
     *,DELTA_BK(P_LEVELS)             !IN LAYER THICKNESS TERM             MASUVW1A.50     
                                                                           MASUVW1A.51     
C*---------------------------------------------------------------------    MASUVW1A.52     
                                                                           MASUVW1A.53     
C*L   DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE-----------------    MASUVW1A.54     
C DEFINE LOCAL ARRAYS: 1 IS REQUIRED                                       MASUVW1A.55     
                                                                           MASUVW1A.56     
      REAL                                                                 MASUVW1A.57     
     *  WORK1(P_FIELD)  !GENERAL WORKSPACE                                 MASUVW1A.58     
C*---------------------------------------------------------------------    MASUVW1A.59     
C DEFINE LOCAL VARIABLES                                                   MASUVW1A.60     
                                                                           MASUVW1A.61     
C COUNT VARIABLES FOR DO LOOPS ETC.                                        MASUVW1A.62     
      INTEGER                                                              MASUVW1A.63     
     *  I,K,ROWS,POINTS                                                    APB0F401.1085   
                                                                           MASUVW1A.65     
C*L   EXTERNAL SUBROUTINE CALLS:---------------------------------------    MASUVW1A.66     
                                                                           MASUVW1A.67     
      EXTERNAL                                                             MASUVW1A.68     
     * P_TO_UV                                                             MASUVW1A.69     
     * ,CALC_RS                                                            MASUVW1A.70     
                                                                           MASUVW1A.71     
*CALL C_A                                                                  MASUVW1A.72     
                                                                           MASUVW1A.73     
C*---------------------------------------------------------------------    MASUVW1A.74     
CL    MAXIMUM VECTOR LENGTH ASSUMED IS P_FIELD.                            MASUVW1A.75     
CL---------------------------------------------------------------------    MASUVW1A.76     
CL    INTERNAL STRUCTURE.                                                  MASUVW1A.77     
CL---------------------------------------------------------------------    MASUVW1A.78     
CL                                                                         MASUVW1A.79     
      POINTS=LAST_P_VALID_PT-FIRST_VALID_PT+1                              APB0F401.1086   
! Number of points to be processed by CALC_RS. For non-MPP runs this       APB0F401.1087   
! is simply P_FIELD, for MPP, it is all the points, minus any              APB0F401.1088   
! unused halo areas (ie. the halo above North pole row, and beneath        APB0F401.1089   
! South pole row)                                                          APB0F401.1090   
      IF (LWHITBROM) THEN                                                  MASUVW1A.80     
CL                                                                         MASUVW1A.81     
CL---------------------------------------------------------------------    MASUVW1A.82     
CL    SECTION 1.     CALL CALC_RS TO CALCULATE RS.                         MASUVW1A.83     
CL---------------------------------------------------------------------    MASUVW1A.84     
                                                                           MASUVW1A.85     
CL    CALL CALC_RS TO GET RS FOR LEVEL 1.                                  MASUVW1A.86     
C TS IS RETURNED IN WORK1, RS AT LEVEL K-1 IS INPUT IN                     MASUVW1A.88     
C RS( ,2) AS AT K-1= 0 THE INPUT IS NOT USED BY CALC_RS.                   AAD2F404.257    
                                                                           MASUVW1A.90     
      K=1                                                                  MASUVW1A.91     
      CALL CALC_RS(PSTAR(FIRST_VALID_PT),AK,BK,WORK1(FIRST_VALID_PT),      APB0F401.1091   
     &             RS(FIRST_VALID_PT,2),                                   AAD2F404.258    
     *             RS(FIRST_VALID_PT,K),                                   AAD2F404.259    
     &             POINTS,K,P_LEVELS,LLINTS)                               APB0F401.1094   
                                                                           MASUVW1A.95     
CL LOOP FROM 2 TO P_LEVELS                                                 MASUVW1A.96     
      DO K= 2,P_LEVELS                                                     MASUVW1A.97     
                                                                           MASUVW1A.98     
CL    CALL CALC_RS TO GET RS FOR LEVEL K.                                  MASUVW1A.99     
C TS IS RETURNED IN WORK1, RS AT LEVEL K-1 IS INPUT AS                     MASUVW1A.101    
C RS(K-1).                                                                 AAD2F404.260    
                                                                           MASUVW1A.103    
        CALL CALC_RS(PSTAR(FIRST_VALID_PT),AK,BK,WORK1(FIRST_VALID_PT),    APB0F401.1095   
     &               RS(FIRST_VALID_PT,K-1),                               AAD2F404.261    
     &               RS(FIRST_VALID_PT,K),                                 AAD2F404.262    
     &               POINTS,K,P_LEVELS,LLINTS)                             APB0F401.1098   
       END DO                                                              MASUVW1A.108    
                                                                           MASUVW1A.109    
CL END LOOP FROM 2 TO P_LEVELS.                                            MASUVW1A.110    
                                                                           MASUVW1A.111    
      END IF      !     LWHITBROM                                          MASUVW1A.112    
CL                                                                         MASUVW1A.113    
CL---------------------------------------------------------------------    MASUVW1A.114    
C  IF (.NOT.LWHITBROM) THEN                                                MASUVW1A.115    
CL    SECTION 1      CALCULATE A*A*DELTA P AND REMOVE MASS-WEIGHTING       MASUVW1A.116    
C  ELSE                                                                    MASUVW1A.117    
CL    SECTION 2      CALCULATE RS*RS*DELTA P AND REMOVE MASS-WEIGHTING     MASUVW1A.118    
C  END IF                                                                  MASUVW1A.119    
CL                   FROM THETAL AND QT.                                   MASUVW1A.120    
CL---------------------------------------------------------------------    MASUVW1A.121    
                                                                           MASUVW1A.122    
CL LOOP OVER  LEVELS                                                       MASUVW1A.123    
      DO  K=1,P_LEVELS                                                     MASUVW1A.124    
CFPP$ SELECT(CONCUR)                                                       MASUVW1A.125    
! loop over all points, including valid halos                              APB0F401.1099   
        DO I=FIRST_VALID_PT,LAST_P_VALID_PT                                APB0F401.1100   
                                                                           MASUVW1A.127    
      IF (.NOT.LWHITBROM) THEN                                             MASUVW1A.128    
                                                                           MASUVW1A.129    
CL    CALCULATE A*A*DELTAP                                                 MASUVW1A.130    
                         RS(I,K) = A                                       AAD2F404.263    
          RS_SQUARED_DELTAP(I,K) = A*A*                                    MASUVW1A.131    
     *                             (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I))      MASUVW1A.132    
      ELSE                                                                 MASUVW1A.133    
                                                                           MASUVW1A.134    
CL    CALCULATE RS*RS*DELTAP                                               MASUVW1A.135    
          RS_SQUARED_DELTAP(I,K) = RS(I,K) *                               AAD2F404.264    
     *                             RS(I,K) *                               AAD2F404.265    
     *                             (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I))      MASUVW1A.138    
      END IF                                                               MASUVW1A.139    
                                                                           MASUVW1A.140    
      END DO                                                               MASUVW1A.141    
                                                                           MASUVW1A.142    
CL END LOOP OVERLEVELS.                                                    MASUVW1A.143    
      END DO                                                               MASUVW1A.144    
                                                                           MASUVW1A.145    
                                                                           MASUVW1A.146    
CL                                                                         MASUVW1A.147    
CL---------------------------------------------------------------------    MASUVW1A.148    
C IF (.NOT.LWHITBROM) THEN                                                 MASUVW1A.149    
CL    SECTION 2      INTERPOLATE A*A*DELTA P ONTO U GRID AND REMOVE        MASUVW1A.150    
C ELSE                                                                     MASUVW1A.151    
CL    SECTION 3      INTERPOLATE RS*RS*DELTA P ONTO U GRID AND REMOVE      MASUVW1A.152    
C END IF                                                                   MASUVW1A.153    
CL                   MASS-WEIGHTING FROM U AND V.                          MASUVW1A.154    
CL---------------------------------------------------------------------    MASUVW1A.155    
                                                                           MASUVW1A.156    
C SET ROWS                                                                 MASUVW1A.157    
      ROWS = P_FIELD/ROW_LENGTH                                            MASUVW1A.158    
                                                                           MASUVW1A.159    
CL LOOP OVER P_LEVELS                                                      MASUVW1A.160    
      DO  K=1,P_LEVELS                                                     MASUVW1A.161    
                                                                           MASUVW1A.162    
C IF (.NOT.LWHITBROM) THEN                                                 MASUVW1A.163    
CL    CALL P_TO_UV TO OBTAIN A*A*DELTA P ON U GRID.                        MASUVW1A.164    
C ELSE                                                                     MASUVW1A.165    
CL    CALL P_TO_UV TO OBTAIN RS*RS*DELTA P ON U GRID.                      MASUVW1A.166    
C END IF                                                                   MASUVW1A.167    
                                                                           MASUVW1A.168    
        CALL P_TO_UV(RS_SQUARED_DELTAP(1,K),WORK1,P_FIELD,U_FIELD,         MASUVW1A.169    
     *               ROW_LENGTH,ROWS)                                      MASUVW1A.170    
                                                                           MASUVW1A.171    
! loop over "local" points - not including top and bottom halos            APB0F401.1101   
        DO I=FIRST_FLD_PT,LAST_U_FLD_PT                                    APB0F401.1102   
CL    REMOVE MASS-WEIGHTING FROM U AND V.                                  MASUVW1A.173    
                                                                           MASUVW1A.174    
          U(I,K) = U(I,K)/WORK1(I)                                         MASUVW1A.175    
          V(I,K) = V(I,K)/WORK1(I)                                         MASUVW1A.176    
        END DO                                                             MASUVW1A.177    
                                                                           MASUVW1A.178    
CL END LOOP OVER P_LEVELS.                                                 MASUVW1A.179    
       END DO                                                              MASUVW1A.180    
                                                                           MASUVW1A.181    
CL    END OF ROUTINE MASS_UWT_UV                                           MASUVW1A.182    
                                                                           MASUVW1A.183    
      RETURN                                                               MASUVW1A.184    
      END                                                                  MASUVW1A.185    
*ENDIF                                                                     MASUVW1A.186