*IF DEF,A12_1B,OR,DEF,A12_1C,OR,DEF,A12_1D,OR,DEF,A12_1E AAD2F404.266
C ******************************COPYRIGHT****************************** GTS2F400.5797
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.5798
C GTS2F400.5799
C Use, duplication or disclosure of this code is subject to the GTS2F400.5800
C restrictions as set forth in the contract. GTS2F400.5801
C GTS2F400.5802
C Meteorological Office GTS2F400.5803
C London Road GTS2F400.5804
C BRACKNELL GTS2F400.5805
C Berkshire UK GTS2F400.5806
C RG12 2SZ GTS2F400.5807
C GTS2F400.5808
C If no contract has been raised with this copy of the code, the use, GTS2F400.5809
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.5810
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.5811
C Modelling at the above address. GTS2F400.5812
C ******************************COPYRIGHT****************************** GTS2F400.5813
C GTS2F400.5814
CLL SUBROUTINE MASS_UWT ----------------------------------------- MASUWT1A.3
CLL MASUWT1A.4
CLL PURPOSE: CALCULATES RS AND REMOVES MASS WEIGHTING FROM THETAL, MASUWT1A.5
CLL QT U AND V FIELDS. MASUWT1A.6
CLL NOT SUITABLE FOR SINGLE COLUMN USE. MASUWT1A.7
CLL MASUWT1A.8
CLL WRITTEN BY M.H MAWSON. MASUWT1A.9
CLL MASUWT1A.10
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: MASUWT1A.11
CLL VERSION DATE MASUWT1A.12
CLL 3.1 24/02/93 Tidy code to remove QA Fortran messages. MM240293.45
CLL 3.4 22/06/94 Argument LLINTS added and passed to CALC_RS GSS1F304.847
CLL DEF NOWHBR replaced by LWHITBROM GSS1F304.848
CLL S.J.Swarbrick GSS1F304.849
! 3.5 28/03/95 MPP code: Take account of duff row APB0F305.53
! of U_FIELD data at bottom. APB0F305.54
! P.Burton APB0F305.55
! 4.1 02/04/96 Tidied up MPP code P.Burton APB0F401.1049
CLL MASUWT1A.13
CLL 4.4 14/07/97 RS output via arg list for use in FILTUV. AAD2F404.267
CLL A. Dickinson AAD2F404.268
CLL AAD2F404.269
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, MASUWT1A.14
CLL STANDARD B. VERSION 2, DATED 18/01/90 MASUWT1A.15
CLL MASUWT1A.16
CLL SYSTEM COMPONENTS COVERED: P12 (part) MASUWT1A.17
CLL MASUWT1A.18
CLL SYSTEM TASK: P1 MASUWT1A.19
CLL MASUWT1A.20
CLL DOCUMENTATION: NIL. MASUWT1A.21
CLLEND------------------------------------------------------------- MASUWT1A.22
MASUWT1A.23
C*L ARGUMENTS:--------------------------------------------------- MASUWT1A.24
SUBROUTINE MASS_UWT 1,3MASUWT1A.25
1 (RS_SQUARED_DELTAP,RS,THETAL,QT,U,V,PSTAR,AK, AAD2F404.270
2 BK,DELTA_AK,DELTA_BK,P_FIELD,U_FIELD,P_LEVELS, MASUWT1A.27
3 Q_LEVELS,ROW_LENGTH, APB0F401.1050
*CALL ARGFLDPT
APB0F401.1051
4 LLINTS,LWHITBROM) APB0F401.1052
MASUWT1A.29
IMPLICIT NONE MASUWT1A.30
LOGICAL LLINTS, LWHITBROM GSS1F304.851
MASUWT1A.31
INTEGER MASUWT1A.32
* P_FIELD !IN DIMENSION OF FIELDS ON PRESSURE GRID MASUWT1A.33
*, U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID MASUWT1A.34
*, P_LEVELS !IN NUMBER OF PRESSURE LEVELS. MASUWT1A.35
*, Q_LEVELS !IN NUMBER OF MOIST LEVELS. MASUWT1A.36
*, ROW_LENGTH !IN NUMBER OF POINTS ON A ROW. MASUWT1A.37
! All TYPFLDPT arguments are intent IN APB0F401.1053
*CALL TYPFLDPT
APB0F401.1054
MASUWT1A.38
REAL MASUWT1A.39
* QT(P_FIELD,Q_LEVELS) !INOUT. QT FIELD. MASUWT1A.40
*,THETAL(P_FIELD,P_LEVELS) !INOUT THETAL FIELD. MASUWT1A.41
*,U(U_FIELD,P_LEVELS) !INOUT U FIELD. MASUWT1A.42
*,V(U_FIELD,P_LEVELS) !INOUT U FIELD. MASUWT1A.43
MASUWT1A.44
REAL MASUWT1A.45
* RS_SQUARED_DELTAP(P_FIELD,P_LEVELS) !OUT HOLDS RS*RS*DELTA P MASUWT1A.46
*,RS(P_FIELD,P_LEVELS) !OUT HOLDS RS AAD2F404.271
MASUWT1A.47
REAL MASUWT1A.48
* PSTAR(P_FIELD) !IN SURFACE PRESSURE MASUWT1A.49
*,AK(P_LEVELS) !IN FIRST TERM IN HYBRID CO-ORDS MASUWT1A.50
*,BK(P_LEVELS) !IN SECOND TERM IN HYBRID CO-ORDS MASUWT1A.51
*,DELTA_AK(P_LEVELS) !IN LAYER THICKNESS TERM MASUWT1A.52
*,DELTA_BK(P_LEVELS) !IN LAYER THICKNESS TERM MASUWT1A.53
MASUWT1A.54
C*--------------------------------------------------------------------- MASUWT1A.55
MASUWT1A.56
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- MASUWT1A.57
C DEFINE LOCAL ARRAYS: 1 IS REQUIRED MASUWT1A.58
MASUWT1A.59
REAL MASUWT1A.60
* WORK1(P_FIELD) !GENERAL WORKSPACE MASUWT1A.61
C*--------------------------------------------------------------------- MASUWT1A.62
C DEFINE LOCAL VARIABLES MASUWT1A.63
MASUWT1A.64
C COUNT VARIABLES FOR DO LOOPS ETC. MASUWT1A.65
INTEGER MASUWT1A.66
* I,K,ROWS,POINTS APB0F401.1055
MASUWT1A.68
REAL MASUWT1A.69
* SCALAR MASUWT1A.70
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- MASUWT1A.71
MASUWT1A.72
EXTERNAL MASUWT1A.73
* P_TO_UV MASUWT1A.74
* ,CALC_RS GSS1F304.852
MASUWT1A.78
*CALL C_A
MASUWT1A.79
MASUWT1A.81
C*--------------------------------------------------------------------- MASUWT1A.82
CL MAXIMUM VECTOR LENGTH ASSUMED IS P_FIELD. MASUWT1A.83
CL--------------------------------------------------------------------- MASUWT1A.84
CL INTERNAL STRUCTURE. MASUWT1A.85
CL--------------------------------------------------------------------- MASUWT1A.86
CL MASUWT1A.87
POINTS=LAST_P_VALID_PT-FIRST_VALID_PT+1 APB0F401.1056
! Number of points to be processed by CALC_RS. For non-MPP runs this APB0F401.1057
! is simply P_FIELD, for MPP, it is all the points, minus any APB0F401.1058
! unused halo areas (ie. the halo above North pole row, and beneath APB0F401.1059
! South pole row) APB0F401.1060
APB0F401.1061
IF (LWHITBROM) THEN GSS1F304.853
CL GSS1F304.854
CL--------------------------------------------------------------------- MASUWT1A.89
CL SECTION 1. CALL CALC_RS TO CALCULATE RS. MASUWT1A.90
CL--------------------------------------------------------------------- MASUWT1A.91
MASUWT1A.92
CL CALL CALC_RS TO GET RS FOR LEVEL 1. MASUWT1A.93
C TS IS RETURNED IN WORK1, RS AT LEVEL K-1 IS INPUT IN MASUWT1A.95
C RS( ,2) AS AT K-1= 0 THE INPUT IS NOT USED BY CALC_RS. AAD2F404.272
MASUWT1A.97
K=1 MASUWT1A.98
CALL CALC_RS
(PSTAR(FIRST_VALID_PT),AK,BK,WORK1(FIRST_VALID_PT), APB0F401.1062
& RS(FIRST_VALID_PT,2), AAD2F404.273
* RS(FIRST_VALID_PT,K), AAD2F404.274
& POINTS,K,P_LEVELS,LLINTS) APB0F401.1065
MASUWT1A.101
CL LOOP FROM 2 TO P_LEVELS MASUWT1A.102
DO 100 K= 2,P_LEVELS MASUWT1A.103
MASUWT1A.104
CL CALL CALC_RS TO GET RS FOR LEVEL K. MASUWT1A.105
C TS IS RETURNED IN WORK1, RS AT LEVEL K-1 IS INPUT AS MASUWT1A.107
C RS(K-1). AAD2F404.275
MASUWT1A.109
CALL CALC_RS
(PSTAR(FIRST_VALID_PT),AK,BK,WORK1(FIRST_VALID_PT), APB0F401.1066
& RS(FIRST_VALID_PT,K-1), AAD2F404.276
& RS(FIRST_VALID_PT,K), AAD2F404.277
& POINTS,K,P_LEVELS,LLINTS) APB0F401.1069
100 CONTINUE MASUWT1A.113
MASUWT1A.114
CL END LOOP FROM 2 TO P_LEVELS. MASUWT1A.115
MASUWT1A.116
END IF ! LWHITBROM GSS1F304.859
CL MASUWT1A.118
CL--------------------------------------------------------------------- MASUWT1A.119
C IF (.NOT.LWHITBROM) THEN GSS1F304.860
CL SECTION 1 CALCULATE A*A*DELTA P AND REMOVE MASS-WEIGHTING MASUWT1A.121
C ELSE GSS1F304.861
CL SECTION 2 CALCULATE RS*RS*DELTA P AND REMOVE MASS-WEIGHTING MASUWT1A.123
C END IF GSS1F304.862
CL FROM THETAL AND QT. MASUWT1A.125
CL--------------------------------------------------------------------- MASUWT1A.126
MASUWT1A.127
CL LOOP OVER MOIST LEVELS, IE: Q_LEVELS. MASUWT1A.128
DO 200 K=1,Q_LEVELS MASUWT1A.129
CFPP$ SELECT(CONCUR) MASUWT1A.130
AAD2F404.278
! loop over all points, including valid halos APB0F401.1070
DO 210 I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.1071
MASUWT1A.132
IF (.NOT.LWHITBROM) THEN GSS1F304.863
GSS1F304.864
CL CALCULATE A*A*DELTAP MASUWT1A.134
RS(I,K) = A AAD2F404.279
RS_SQUARED_DELTAP(I,K) = A*A* MASUWT1A.135
* (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I)) GSS1F304.865
SCALAR = 1./RS_SQUARED_DELTAP(I,K) GSS1F304.866
GSS1F304.867
ELSE GSS1F304.868
GSS1F304.869
CL CALCULATE RS*RS*DELTAP MASUWT1A.137
RS_SQUARED_DELTAP(I,K) = RS(I,K) * AAD2F404.280
* RS(I,K) * AAD2F404.281
* (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I)) MASUWT1A.141
SCALAR = 1./RS_SQUARED_DELTAP(I,K) MASUWT1A.142
MASUWT1A.143
END IF GSS1F304.870
GSS1F304.871
CL REMOVE MASS-WEIGHTING FROM THETAL AND QT. MASUWT1A.144
THETAL(I,K) = THETAL(I,K)*SCALAR MASUWT1A.145
QT(I,K) = QT(I,K)*SCALAR MASUWT1A.146
210 CONTINUE MASUWT1A.147
CL END LOOP OVER MOIST LEVELS. MASUWT1A.148
200 CONTINUE MASUWT1A.149
MASUWT1A.150
CL LOOP OVER ANY REMAINING DRY LEVELS, IE: Q_LEVELS+1 TO P_LEVELS MASUWT1A.151
MASUWT1A.152
DO 220 K= Q_LEVELS+1, P_LEVELS MASUWT1A.153
CFPP$ SELECT(CONCUR) MASUWT1A.154
! loop over all points, including valid halos APB0F401.1072
DO 230 I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.1073
MASUWT1A.156
IF (.NOT.LWHITBROM) THEN GSS1F304.872
GSS1F304.873
CL CALCULATE A*A*DELTAP MASUWT1A.158
RS(I,K) = A AAD2F404.282
RS_SQUARED_DELTAP(I,K) = A*A* MASUWT1A.159
* (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I)) GSS1F304.874
GSS1F304.875
ELSE GSS1F304.876
GSS1F304.877
CL CALCULATE RS*RS*DELTAP MASUWT1A.161
RS_SQUARED_DELTAP(I,K) = RS(I,K) * AAD2F404.283
* RS(I,K) * AAD2F404.284
* (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I)) MASUWT1A.165
GSS1F304.878
END IF GSS1F304.879
MASUWT1A.166
CL REMOVE MASS-WEIGHTING FROM THETAL. MASUWT1A.167
THETAL(I,K) = THETAL(I,K)/RS_SQUARED_DELTAP(I,K) MASUWT1A.168
230 CONTINUE MASUWT1A.169
MASUWT1A.170
CL END LOOP OVER REMAINING DRY LEVELS. MASUWT1A.171
220 CONTINUE MASUWT1A.172
MASUWT1A.173
CL MASUWT1A.174
CL--------------------------------------------------------------------- MASUWT1A.175
C IF (.NOT.LWHITBROM) THEN GSS1F304.880
CL SECTION 2 INTERPOLATE A*A*DELTA P ONTO U GRID AND REMOVE MASUWT1A.177
C ELSE GSS1F304.881
CL SECTION 3 INTERPOLATE RS*RS*DELTA P ONTO U GRID AND REMOVE MASUWT1A.179
C END IF GSS1F304.882
CL MASS-WEIGHTING FROM U AND V. MASUWT1A.181
CL--------------------------------------------------------------------- MASUWT1A.182
MASUWT1A.183
C SET ROWS MASUWT1A.184
ROWS = P_FIELD/ROW_LENGTH MASUWT1A.185
MASUWT1A.186
CL LOOP OVER P_LEVELS MASUWT1A.187
DO 300 K=1,P_LEVELS MASUWT1A.188
MASUWT1A.189
C IF (.NOT.LWHITBROM) THEN GSS1F304.883
CL CALL P_TO_UV TO OBTAIN A*A*DELTA P ON U GRID. MASUWT1A.191
C ELSE GSS1F304.884
CL CALL P_TO_UV TO OBTAIN RS*RS*DELTA P ON U GRID. MASUWT1A.193
C END IF GSS1F304.885
MASUWT1A.195
CALL P_TO_UV
(RS_SQUARED_DELTAP(1,K),WORK1,P_FIELD,U_FIELD, MASUWT1A.196
* ROW_LENGTH,ROWS) MASUWT1A.197
MASUWT1A.198
! loop over "local" points - not including top and bottom halos APB0F401.1074
DO 310 I=FIRST_FLD_PT,LAST_U_FLD_PT APB0F401.1075
CL REMOVE MASS-WEIGHTING FROM U AND V. MASUWT1A.200
MASUWT1A.201
SCALAR = 1./WORK1(I) MASUWT1A.202
U(I,K) = U(I,K)*SCALAR MASUWT1A.203
V(I,K) = V(I,K)*SCALAR MASUWT1A.204
310 CONTINUE MASUWT1A.205
MASUWT1A.206
CL END LOOP OVER P_LEVELS. MASUWT1A.207
300 CONTINUE MASUWT1A.208
MASUWT1A.209
CL END OF ROUTINE MASS_UWT MASUWT1A.210
MASUWT1A.211
RETURN MASUWT1A.212
END MASUWT1A.213
*ENDIF MASUWT1A.214