*IF DEF,A12_1B,OR,DEF,A12_1C,OR,DEF,A12_1E AAD2F404.250
C ******************************COPYRIGHT****************************** GTS2F400.11467
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.11468
C GTS2F400.11469
C Use, duplication or disclosure of this code is subject to the GTS2F400.11470
C restrictions as set forth in the contract. GTS2F400.11471
C GTS2F400.11472
C Meteorological Office GTS2F400.11473
C London Road GTS2F400.11474
C BRACKNELL GTS2F400.11475
C Berkshire UK GTS2F400.11476
C RG12 2SZ GTS2F400.11477
C GTS2F400.11478
C If no contract has been raised with this copy of the code, the use, GTS2F400.11479
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.11480
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.11481
C Modelling at the above address. GTS2F400.11482
C ******************************COPYRIGHT****************************** GTS2F400.11483
C GTS2F400.11484
CLL SUBROUTINE V_CORIOL ----------------------------------------- VCORIO1A.3
CLL VCORIO1A.4
CLL PURPOSE: CALCULATES APPROXIMATE VERTICAL VELOCITY AS IN VCORIO1A.5
CLL EQUATION (46) AT A MODEL LEVEL. VCORIO1A.6
CLL NOT SUITABLE FOR SINGLE COLUMN USE. VCORIO1A.7
CLL VERSION FOR CRAY Y-MP VCORIO1A.8
CLL VCORIO1A.9
CLL WRITTEN BY M.H MAWSON. VCORIO1A.10
CLL VCORIO1A.11
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: VCORIO1A.12
CLL VERSION DATE VCORIO1A.13
CLL 3.1 23/02/93 CORRECTION OF SIGN ERROR IN WK IR230293.1
CLL 3.1 02/02/93 CORRECTION OF SIGN ERROR IN DP_BY_DT IR020293.1
CLL 3.3 22/07/93 CORRECTIONS IN CALCULATION OF WP. SA220793.1
CLL 3.4 11/05/94 Argument LLINTS added and passed to CALC_TS GSS1F304.221
CLL S.J.Swarbrick GSS1F304.222
! 3.5 28/03/95 MPP code: Change updateable area P.Burton APB0F305.1117
! 4.1 25/04/96 Added TYPFLDPT arguments to dynamics routines APB0F401.1269
! which allows many of the differences between APB0F401.1270
! MPP and "normal" code to be at top level APB0F401.1271
! P.Burton APB0F401.1272
!LL 4.2 25/11/96 Corrections to allow LAM to run in MPP mode. ARB2F402.14
!LL RTHBarnes. ARB2F402.15
CLL VCORIO1A.14
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, VCORIO1A.15
CLL STANDARD B. VERSION 2, DATED 18/01/90 VCORIO1A.16
CLL VCORIO1A.17
CLL SYSTEM COMPONENTS COVERED: P124 VCORIO1A.18
CLL VCORIO1A.19
CLL SYSTEM TASK: P1 VCORIO1A.20
CLL VCORIO1A.21
CLL DOCUMENTATION: THE EQUATIONS USED ARE (44) TO (46) VCORIO1A.22
CLL IN UNIFIED MODEL DOCUMENTATION PAPER VCORIO1A.23
CLL NO. 10 M.J.P. CULLEN, T.DAVIES AND VCORIO1A.24
CLL M.H.MAWSON, VERSION 10, DATED 10/09/90. VCORIO1A.25
CLLEND------------------------------------------------------------- VCORIO1A.26
VCORIO1A.27
C*L ARGUMENTS:--------------------------------------------------- VCORIO1A.28
SUBROUTINE V_CORIOL 3,4VCORIO1A.29
1 (ETADOT_MINUS,ETADOT_PLUS,PSTAR,PSTAR_OLD, VCORIO1A.30
2 U,V,RS,SEC_U_LATITUDE,ADVECTION_TIMESTEP,AK, VCORIO1A.31
3 BK,DELTA_AK,DELTA_BK,DELTA_AKH_MINUS, VCORIO1A.32
4 DELTA_BKH_MINUS,DELTA_AKH_PLUS,DELTA_BKH_PLUS, VCORIO1A.33
5 ROW_LENGTH, APB0F401.1273
*CALL ARGFLDPT
APB0F401.1274
6 LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, VCORIO1A.35
7 WK,U_FIELD,OMEGA,LLINTS) GSS1F304.223
VCORIO1A.37
IMPLICIT NONE VCORIO1A.38
VCORIO1A.39
INTEGER VCORIO1A.40
* U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID VCORIO1A.41
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW VCORIO1A.42
APB0F401.1275
! All TYPFLDPT arguments are intent IN APB0F401.1276
*CALL TYPFLDPT
APB0F401.1277
APB0F401.1278
VCORIO1A.45
REAL VCORIO1A.46
* U(U_FIELD) !IN AVERAGED MASS-WEIGHTED U VELOCITY VCORIO1A.47
* ! FROM ADJUSTMENT STEP HELD AT P VCORIO1A.48
* ! POINTS WITH FIRST POINT OF FIELD VCORIO1A.49
* ! BEING FIRST P POINT ON SECOND ROW VCORIO1A.50
* ! OF P-GRID. VCORIO1A.51
*,V(U_FIELD) !IN AVERAGED MASS-WEIGHTED V VELOCITY VCORIO1A.52
* ! * COS(LAT) FROM ADJUSTMENT STEP VCORIO1A.53
* ! STORAGE AS FOR U_MEAN. VCORIO1A.54
*,ETADOT_PLUS(U_FIELD) !IN AVERAGED MASS-WEIGHTED VCORIO1A.55
* !VERTICAL VELOCITY FROM ADJUSTMENT STEP VCORIO1A.56
* ! AT LEVEL K+1/2. VCORIO1A.57
*,ETADOT_MINUS(U_FIELD) !IN AVERAGED MASS-WEIGHTED VCORIO1A.58
* !VERTICAL VELOCITY FROM ADJUSTMENT STEP VCORIO1A.59
* ! AT LEVEL K-1/2. VCORIO1A.60
VCORIO1A.61
REAL VCORIO1A.62
* PSTAR(U_FIELD) !IN PSTAR FIELD AT NEW TIME-LEVEL ON VCORIO1A.63
* ! U GRID. VCORIO1A.64
*,PSTAR_OLD(U_FIELD) !INPSTAR AT PREVIOUS TIME-LEVEL ON VCORIO1A.65
* ! U GRID. VCORIO1A.66
*,RS(U_FIELD) !IN RS FIELD ON U GRID. VCORIO1A.67
*,SEC_U_LATITUDE(U_FIELD) !IN 1/COS(LAT) AT U POINTS (2-D ARRAY) VCORIO1A.68
*,LONGITUDE_STEP_INVERSE !IN 1/LONGITUDE STEP VCORIO1A.69
*,LATITUDE_STEP_INVERSE !IN 1/LATITUDE STEP VCORIO1A.70
*,ADVECTION_TIMESTEP !IN VCORIO1A.71
VCORIO1A.72
REAL VCORIO1A.73
* WK(U_FIELD) !OUT WK AS IN EQUATION (46). VCORIO1A.74
*,OMEGA(U_FIELD) !OUT. HOLDS VERTICAL VELOCITY, OMEGA. VCORIO1A.75
VCORIO1A.76
VCORIO1A.77
REAL VCORIO1A.78
* AK !IN FIRST TERM IN HYBRID CO-ORDS. VCORIO1A.79
*,BK !IN SECOND TERM IN HYBRID CO-ORDS. VCORIO1A.80
*,DELTA_AK !IN LAYER THICKNESS VCORIO1A.81
*,DELTA_BK !IN LAYER THICKNESS VCORIO1A.82
*,DELTA_AKH_MINUS !IN LAYER THICKNESS AK(K) - AK(K-1) VCORIO1A.83
*,DELTA_BKH_MINUS !IN LAYER THICKNESS BK(K) - BK(K-1) VCORIO1A.84
*,DELTA_AKH_PLUS !IN LAYER THICKNESS AK(K+1) - AK(K) VCORIO1A.85
*,DELTA_BKH_PLUS !IN LAYER THICKNESS BK(K+1) - BK(K) VCORIO1A.86
C*--------------------------------------------------------------------- VCORIO1A.87
VCORIO1A.88
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- VCORIO1A.89
C DEFINE LOCAL ARRAYS: 5 ARE REQUIRED VCORIO1A.90
VCORIO1A.91
REAL VCORIO1A.92
* DP_BY_DT(U_FIELD) VCORIO1A.93
*,WP(U_FIELD) VCORIO1A.94
*,WORK1(U_FIELD) VCORIO1A.95
*,WORK2(U_FIELD) VCORIO1A.96
*,TS(U_FIELD) VCORIO1A.97
VCORIO1A.98
C*--------------------------------------------------------------------- VCORIO1A.99
C DEFINE LOCAL VARIABLES VCORIO1A.100
REAL VCORIO1A.101
* SCALAR VCORIO1A.102
VCORIO1A.103
C COUNT VARIABLES FOR DO LOOPS ETC. VCORIO1A.104
INTEGER VCORIO1A.105
* I,J,POINTS SA220793.2
VCORIO1A.107
C LOGICAL VARIABLES VCORIO1A.108
LOGICAL VCORIO1A.109
* CONSTANT_PRESSURE VCORIO1A.110
*,LLINTS ! Switch for linear TS calc in CALC_TS GSS1F304.224
VCORIO1A.111
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- VCORIO1A.112
EXTERNAL CALC_TS VCORIO1A.113
C*--------------------------------------------------------------------- VCORIO1A.114
CL CALL COMDECK TO OBTAIN CONSTANTS USED. VCORIO1A.115
VCORIO1A.116
*CALL C_VCORI
VCORIO1A.117
VCORIO1A.118
CL MAXIMUM VECTOR LENGTH ASSUMED IS END_U_UPDATE+ROW_LENGTH+1- VCORIO1A.119
CL START_U_UPDATE VCORIO1A.120
CL--------------------------------------------------------------------- VCORIO1A.121
CL INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS: VCORIO1A.122
CL--------------------------------------------------------------------- VCORIO1A.123
CL VCORIO1A.124
CL--------------------------------------------------------------------- VCORIO1A.125
CL SECTION 1. CALCULATE DP/DT VCORIO1A.126
CL--------------------------------------------------------------------- VCORIO1A.127
VCORIO1A.128
IF(BK.EQ.0.) THEN VCORIO1A.129
C A CONSTANT PRESSURE LEVEL SO DP/DT IS ZERO. VCORIO1A.130
CONSTANT_PRESSURE = .TRUE. VCORIO1A.131
! Loop over U field missing top and bottom rows and halos APB0F401.1279
DO 100 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO APB0F401.1280
DP_BY_DT(I) = 0. VCORIO1A.133
100 CONTINUE VCORIO1A.134
ELSE VCORIO1A.135
C CALCULATE DP/DT. VCORIO1A.136
CONSTANT_PRESSURE = .FALSE. VCORIO1A.137
SCALAR = BK/ADVECTION_TIMESTEP VCORIO1A.138
! Loop over U field missing top and bottom rows and halos APB0F401.1281
DO 110 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO APB0F401.1282
DP_BY_DT(I) = (DELTA_AK+DELTA_BK*PSTAR_OLD(I))*RS(I)*RS(I) VCORIO1A.140
* *(PSTAR(I)-PSTAR_OLD(I))*SCALAR VCORIO1A.141
110 CONTINUE VCORIO1A.142
END IF VCORIO1A.143
VCORIO1A.144
CL--------------------------------------------------------------------- VCORIO1A.145
CL SECTION 2. CALCULATE U.GRAD P VCORIO1A.146
CL--------------------------------------------------------------------- VCORIO1A.147
VCORIO1A.148
C---------------------------------------------------------------------- VCORIO1A.149
CL SECTION 2.1 CALCULATE U DP/D(LONGITUDE) VCORIO1A.150
C---------------------------------------------------------------------- VCORIO1A.151
VCORIO1A.152
C CALCULATE U DP/D(LONGITUDE) BETWEEN P POINTS VCORIO1A.153
! Loop over U field missing top and bottom rows and halos and APB0F401.1283
! last point APB0F401.1284
DO 210 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO-1 APB0F401.1285
WORK1(I) = .5*(U(I+1)+U(I+1-ROW_LENGTH))*(PSTAR(I+1)-PSTAR(I))* SA220793.4
* LONGITUDE_STEP_INVERSE*BK VCORIO1A.156
210 CONTINUE VCORIO1A.157
VCORIO1A.158
*IF DEF,GLOBAL VCORIO1A.159
*IF -DEF,MPP APB0F305.1122
C GLOBAL MODEL SO RECALCULATE VALUE AT END-POINT VCORIO1A.160
! Loop ove the last point of each row missing top and bottom rows APB0F401.1286
! and halos. APB0F401.1287
DO 212 I=START_POINT_NO_HALO+LAST_ROW_PT-1, APB0F401.1288
& END_U_POINT_NO_HALO,ROW_LENGTH APB0F401.1289
WORK1(I) = .5*(U(I+1-ROW_LENGTH)+U(I+1-2*ROW_LENGTH))* SA220793.5
* (PSTAR(I+1-ROW_LENGTH)-PSTAR(I))* SA220793.6
* LONGITUDE_STEP_INVERSE*BK SA220793.7
212 CONTINUE VCORIO1A.164
*ELSE APB0F305.1123
WORK1(END_U_POINT_NO_HALO) = 0.0 APB0F401.1290
! MPP Code : No need to do recalculations of end points because cyclic APB0F305.1125
! boundary conditions means that halos do this for us automatically APB0F305.1126
APB0F305.1127
*ENDIF APB0F305.1128
*ELSE SA220793.8
WORK1(END_U_POINT_NO_HALO) = 0.0 APB0F401.1291
*ENDIF VCORIO1A.165
VCORIO1A.166
C CALCULATE U DP/D(LONGITUDE) AT P POINTS VCORIO1A.167
VCORIO1A.168
! Loop over U field missing top and bottom rows and halos and APB0F401.1292
! first point APB0F401.1293
DO 214 I=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO APB0F401.1294
WP(I) = .5*(WORK1(I)+WORK1(I-1)) VCORIO1A.170
214 CONTINUE VCORIO1A.171
VCORIO1A.172
C---------------------------------------------------------------------- VCORIO1A.173
CL SECTION 2.2 CALCULATE V DP/D(LATITUDE) AND HENCE U.GRAD P VCORIO1A.174
C---------------------------------------------------------------------- VCORIO1A.175
VCORIO1A.176
C CALCULATE V DP/D(LATITUDE) BETWEEN P POINTS. VCORIO1A.177
VCORIO1A.178
! Loop over U field missing bottom row, last point and top and APB0F401.1295
! bottom halos APB0F401.1296
DO 220 I=START_POINT_NO_HALO-ROW_LENGTH,END_U_POINT_NO_HALO-1 APB0F401.1297
WORK2(I) = .5*(V(I)+V(I+1))*(PSTAR(I)-PSTAR(I+ROW_LENGTH)) SA220793.11
* *LATITUDE_STEP_INVERSE*BK VCORIO1A.181
220 CONTINUE VCORIO1A.182
VCORIO1A.183
VCORIO1A.185
*IF -DEF,MPP APB0F305.1129
! Last point of row above START_POINT row APB0F401.1298
I = START_POINT_NO_HALO-ROW_LENGTH+LAST_ROW_PT-1 APB0F401.1299
C GLOBAL MODEL SO RECALCULATE LAST POINT VALUES FOR V DP/D(LAT) SA220793.13
SA220793.14
WORK2(I) = .5*(V(I)+V(I+1-ROW_LENGTH))*(PSTAR(I)- SA220793.15
* PSTAR(I+ROW_LENGTH))*LATITUDE_STEP_INVERSE*BK VCORIO1A.190
VCORIO1A.191
! Loop over first point of each row, missing top and bottom rows and APB0F401.1300
! halos APB0F401.1301
DO 222 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO,ROW_LENGTH APB0F401.1302
VCORIO1A.193
! I is the first point of the row, J will be the last point on the row APB0F401.1303
J = I+LAST_ROW_PT-1 APB0F401.1304
SA220793.17
WORK2(J) = .5*(V(J)+V(I))*(PSTAR(J)-PSTAR(J+ROW_LENGTH))* SA220793.18
* LATITUDE_STEP_INVERSE*BK SA220793.19
VCORIO1A.196
C AND U DP/D(LONG) AT P POINTS. VCORIO1A.197
WP(I) = .5*(WORK1(I)+WORK1(I-1+ROW_LENGTH)) VCORIO1A.198
222 CONTINUE VCORIO1A.199
*ELSE APB0F305.1130
WORK2(END_U_POINT_NO_HALO)=WORK2(END_U_POINT_NO_HALO-1) APB0F401.1305
WP(START_POINT_NO_HALO)=WP(START_POINT_NO_HALO+1) APB0F401.1306
! MPP Code : No need to do recalculations of end points because cyclic APB0F305.1133
! boundary conditions means that halos do this for us automatically APB0F305.1134
APB0F305.1135
*ENDIF APB0F305.1136
VCORIO1A.200
VCORIO1A.202
C CALCULATE U.GRAD P VCORIO1A.203
VCORIO1A.204
*IF DEF,GLOBAL,OR,DEF,MPP ARB2F402.16
! Loop over field, missing top and bottom rows and halos APB0F401.1307
DO 224 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO APB0F401.1308
*ELSE VCORIO1A.207
! Loop over field, missing top and bottom rows and halos, and first APB0F401.1309
! and last points. APB0F401.1310
DO 224 I=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO-1 APB0F401.1311
*ENDIF VCORIO1A.209
WP(I)=(WP(I)+.5*(WORK2(I)+WORK2(I-ROW_LENGTH))) VCORIO1A.210
* *SEC_U_LATITUDE(I) VCORIO1A.211
224 CONTINUE VCORIO1A.212
VCORIO1A.213
CL--------------------------------------------------------------------- VCORIO1A.214
CL SECTION 3. CALL CALC_TS TO GET TS. VCORIO1A.215
CL--------------------------------------------------------------------- VCORIO1A.216
VCORIO1A.217
C STORE PRESSURE IN WORK. VCORIO1A.218
! Loop over field, missing top and bottom rows and halos APB0F401.1312
DO 300 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO APB0F401.1313
WORK2(I) = AK + BK*PSTAR(I) VCORIO1A.220
300 CONTINUE VCORIO1A.221
VCORIO1A.222
C CALCULATE NUMBER OF POINTS CALC_TS TO BE CALLED FOR. VCORIO1A.223
POINTS = END_U_POINT_NO_HALO-START_POINT_NO_HALO+1 APB0F401.1314
VCORIO1A.225
C TS IS RETURNED IN WORK. VCORIO1A.226
VCORIO1A.227
CALL CALC_TS
(WORK2(START_POINT_NO_HALO),TS(START_POINT_NO_HALO), APB0F401.1315
& POINTS,CONSTANT_PRESSURE,LLINTS) APB0F401.1316
VCORIO1A.230
CL--------------------------------------------------------------------- VCORIO1A.231
CL SECTION 4. CALCULATE WK AS IN EQUATION (43). VCORIO1A.232
CL--------------------------------------------------------------------- VCORIO1A.233
VCORIO1A.234
*IF DEF,GLOBAL,OR,DEF,MPP ARB2F402.17
! Loop over field, missing top and bottom rows and halos APB0F401.1317
DO 400 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO APB0F401.1318
*ELSE VCORIO1A.237
DO 400 I=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO-1 APB0F401.1319
*ENDIF VCORIO1A.239
OMEGA(I)= WP(I)+DP_BY_DT(I)+.5*(ETADOT_PLUS(I)* IR020293.2
* (DELTA_AKH_PLUS+DELTA_BKH_PLUS*PSTAR(I))+ETADOT_MINUS(I) VCORIO1A.241
* *(DELTA_AKH_MINUS+DELTA_BKH_MINUS*PSTAR(I))) VCORIO1A.242
WK(I) = -R*TS(I)*OMEGA(I)/(G*WORK2(I)) IR230293.2
400 CONTINUE VCORIO1A.244
VCORIO1A.245
*IF -DEF,GLOBAL VCORIO1A.246
VCORIO1A.247
CL LIMITED AREA MODEL SET VERTICAL VELOCITY ON BOUNDARY TO ZERO. VCORIO1A.248
VCORIO1A.249
*IF DEF,MPP APB0F401.1320
IF (at_left_of_LPG) THEN APB0F401.1321
*ENDIF APB0F401.1322
! Set first point of each row to zero APB0F401.1323
DO I=START_POINT_NO_HALO+FIRST_ROW_PT-1,END_U_POINT_NO_HALO, APB0F401.1324
& ROW_LENGTH APB0F401.1325
WK(I)=0.0 APB0F401.1326
OMEGA(I)=0.0 APB0F401.1327
*IF -DEF,GLOBAL ARB2F402.18
WK(I-1)=0.0 ARB2F402.19
OMEGA(I-1)=0.0 ARB2F402.20
*ENDIF ARB2F402.21
ENDDO APB0F401.1328
*IF DEF,MPP APB0F401.1329
ENDIF APB0F401.1330
APB0F401.1331
IF (at_right_of_LPG) THEN APB0F401.1332
*ENDIF APB0F401.1333
! Set last two points of each row to zero APB0F401.1334
DO I=START_POINT_NO_HALO+LAST_ROW_PT-2,END_U_POINT_NO_HALO, APB0F401.1335
& ROW_LENGTH APB0F401.1336
WK(I)=0.0 APB0F401.1337
WK(I+1)=0.0 APB0F401.1338
OMEGA(I)=0.0 APB0F401.1339
OMEGA(I+1)=0.0 APB0F401.1340
*IF -DEF,GLOBAL ARB2F402.22
WK(I+2)=0.0 ARB2F402.23
OMEGA(I+2)=0.0 ARB2F402.24
*ENDIF ARB2F402.25
ENDDO APB0F401.1341
*IF DEF,MPP APB0F401.1342
ENDIF APB0F401.1343
*ENDIF APB0F401.1344
VCORIO1A.258
*ENDIF VCORIO1A.259
VCORIO1A.260
CL END OF ROUTINE V_CORIOL VCORIO1A.261
VCORIO1A.262
RETURN VCORIO1A.263
END VCORIO1A.264
VCORIO1A.265
*ENDIF VCORIO1A.266