*IF DEF,A12_1D VCORIO1D.2
C ******************************COPYRIGHT****************************** VCORIO1D.3
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved. VCORIO1D.4
C VCORIO1D.5
C Use, duplication or disclosure of this code is subject to the VCORIO1D.6
C restrictions as set forth in the contract. VCORIO1D.7
C VCORIO1D.8
C Meteorological Office VCORIO1D.9
C London Road VCORIO1D.10
C BRACKNELL VCORIO1D.11
C Berkshire UK VCORIO1D.12
C RG12 2SZ VCORIO1D.13
C VCORIO1D.14
C If no contract has been raised with this copy of the code, the use, VCORIO1D.15
C duplication or disclosure of it is strictly prohibited. Permission VCORIO1D.16
C to do so must first be obtained in writing from the Head of Numerical VCORIO1D.17
C Modelling at the above address. VCORIO1D.18
C ******************************COPYRIGHT****************************** VCORIO1D.19
C VCORIO1D.20
CLL SUBROUTINE V_CORIOL ----------------------------------------- VCORIO1D.21
CLL VCORIO1D.22
CLL PURPOSE: CALCULATES APPROXIMATE VERTICAL VELOCITY AS IN VCORIO1D.23
CLL EQUATION (46) AT A MODEL LEVEL. VCORIO1D.24
CLL NOT SUITABLE FOR SINGLE COLUMN USE. VCORIO1D.25
CLL VERSION FOR CRAY Y-MP VCORIO1D.26
CLL VCORIO1D.27
CLL WRITTEN BY M.H MAWSON. VCORIO1D.28
CLL VCORIO1D.29
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 4.2: ATJ0F403.185
CLL VERSION DATE VCORIO1D.31
!LL 4.2 25/10/96 New deck for HADCM2-specific section A12_1D, VCORIO1D.32
!LL as VCORIO1A but with reintroduced errors in VCORIO1D.33
!LL calculation of WP, loops 210,212,220,222 and 224. VCORIO1D.34
!LL T.Johns VCORIO1D.35
!LL 4.3 10/04/97 Updated in line with MPP optimisations. T.Johns ATJ0F403.186
CLL VCORIO1D.36
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, VCORIO1D.37
CLL STANDARD B. VERSION 2, DATED 18/01/90 VCORIO1D.38
CLL VCORIO1D.39
CLL SYSTEM COMPONENTS COVERED: P124 VCORIO1D.40
CLL VCORIO1D.41
CLL SYSTEM TASK: P1 VCORIO1D.42
CLL VCORIO1D.43
CLL DOCUMENTATION: THE EQUATIONS USED ARE (44) TO (46) VCORIO1D.44
CLL IN UNIFIED MODEL DOCUMENTATION PAPER VCORIO1D.45
CLL NO. 10 M.J.P. CULLEN, T.DAVIES AND VCORIO1D.46
CLL M.H.MAWSON, VERSION 10, DATED 10/09/90. VCORIO1D.47
CLLEND------------------------------------------------------------- VCORIO1D.48
VCORIO1D.49
C*L ARGUMENTS:--------------------------------------------------- VCORIO1D.50
SUBROUTINE V_CORIOL 3,4VCORIO1D.51
1 (ETADOT_MINUS,ETADOT_PLUS,PSTAR,PSTAR_OLD, VCORIO1D.52
2 U,V,RS,SEC_U_LATITUDE,ADVECTION_TIMESTEP,AK, VCORIO1D.53
3 BK,DELTA_AK,DELTA_BK,DELTA_AKH_MINUS, VCORIO1D.54
4 DELTA_BKH_MINUS,DELTA_AKH_PLUS,DELTA_BKH_PLUS, VCORIO1D.55
5 ROW_LENGTH, VCORIO1D.56
*CALL ARGFLDPT
VCORIO1D.57
6 LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, VCORIO1D.58
7 WK,U_FIELD,OMEGA,LLINTS) VCORIO1D.59
VCORIO1D.60
IMPLICIT NONE VCORIO1D.61
VCORIO1D.62
INTEGER VCORIO1D.63
* U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID VCORIO1D.64
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW VCORIO1D.65
VCORIO1D.66
! All TYPFLDPT arguments are intent IN VCORIO1D.67
*CALL TYPFLDPT
VCORIO1D.68
VCORIO1D.69
VCORIO1D.70
REAL VCORIO1D.71
* U(U_FIELD) !IN AVERAGED MASS-WEIGHTED U VELOCITY VCORIO1D.72
* ! FROM ADJUSTMENT STEP HELD AT P VCORIO1D.73
* ! POINTS WITH FIRST POINT OF FIELD VCORIO1D.74
* ! BEING FIRST P POINT ON SECOND ROW VCORIO1D.75
* ! OF P-GRID. VCORIO1D.76
*,V(U_FIELD) !IN AVERAGED MASS-WEIGHTED V VELOCITY VCORIO1D.77
* ! * COS(LAT) FROM ADJUSTMENT STEP VCORIO1D.78
* ! STORAGE AS FOR U_MEAN. VCORIO1D.79
*,ETADOT_PLUS(U_FIELD) !IN AVERAGED MASS-WEIGHTED VCORIO1D.80
* !VERTICAL VELOCITY FROM ADJUSTMENT STEP VCORIO1D.81
* ! AT LEVEL K+1/2. VCORIO1D.82
*,ETADOT_MINUS(U_FIELD) !IN AVERAGED MASS-WEIGHTED VCORIO1D.83
* !VERTICAL VELOCITY FROM ADJUSTMENT STEP VCORIO1D.84
* ! AT LEVEL K-1/2. VCORIO1D.85
VCORIO1D.86
REAL VCORIO1D.87
* PSTAR(U_FIELD) !IN PSTAR FIELD AT NEW TIME-LEVEL ON VCORIO1D.88
* ! U GRID. VCORIO1D.89
*,PSTAR_OLD(U_FIELD) !INPSTAR AT PREVIOUS TIME-LEVEL ON VCORIO1D.90
* ! U GRID. VCORIO1D.91
*,RS(U_FIELD) !IN RS FIELD ON U GRID. VCORIO1D.92
*,SEC_U_LATITUDE(U_FIELD) !IN 1/COS(LAT) AT U POINTS (2-D ARRAY) VCORIO1D.93
*,LONGITUDE_STEP_INVERSE !IN 1/LONGITUDE STEP VCORIO1D.94
*,LATITUDE_STEP_INVERSE !IN 1/LATITUDE STEP VCORIO1D.95
*,ADVECTION_TIMESTEP !IN VCORIO1D.96
VCORIO1D.97
REAL VCORIO1D.98
* WK(U_FIELD) !OUT WK AS IN EQUATION (46). VCORIO1D.99
*,OMEGA(U_FIELD) !OUT. HOLDS VERTICAL VELOCITY, OMEGA. VCORIO1D.100
VCORIO1D.101
VCORIO1D.102
REAL VCORIO1D.103
* AK !IN FIRST TERM IN HYBRID CO-ORDS. VCORIO1D.104
*,BK !IN SECOND TERM IN HYBRID CO-ORDS. VCORIO1D.105
*,DELTA_AK !IN LAYER THICKNESS VCORIO1D.106
*,DELTA_BK !IN LAYER THICKNESS VCORIO1D.107
*,DELTA_AKH_MINUS !IN LAYER THICKNESS AK(K) - AK(K-1) VCORIO1D.108
*,DELTA_BKH_MINUS !IN LAYER THICKNESS BK(K) - BK(K-1) VCORIO1D.109
*,DELTA_AKH_PLUS !IN LAYER THICKNESS AK(K+1) - AK(K) VCORIO1D.110
*,DELTA_BKH_PLUS !IN LAYER THICKNESS BK(K+1) - BK(K) VCORIO1D.111
C*--------------------------------------------------------------------- VCORIO1D.112
VCORIO1D.113
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- VCORIO1D.114
C DEFINE LOCAL ARRAYS: 5 ARE REQUIRED VCORIO1D.115
VCORIO1D.116
REAL VCORIO1D.117
* DP_BY_DT(U_FIELD) VCORIO1D.118
*,WP(U_FIELD) VCORIO1D.119
*,WORK1(U_FIELD) VCORIO1D.120
*,WORK2(U_FIELD) VCORIO1D.121
*,TS(U_FIELD) VCORIO1D.122
VCORIO1D.123
C*--------------------------------------------------------------------- VCORIO1D.124
C DEFINE LOCAL VARIABLES VCORIO1D.125
REAL VCORIO1D.126
* SCALAR VCORIO1D.127
VCORIO1D.128
C COUNT VARIABLES FOR DO LOOPS ETC. VCORIO1D.129
INTEGER VCORIO1D.130
* I, POINTS VCORIO1D.131
VCORIO1D.132
C LOGICAL VARIABLES VCORIO1D.133
LOGICAL VCORIO1D.134
* CONSTANT_PRESSURE VCORIO1D.135
*,LLINTS ! Switch for linear TS calc in CALC_TS VCORIO1D.136
VCORIO1D.137
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- VCORIO1D.138
EXTERNAL CALC_TS VCORIO1D.139
C*--------------------------------------------------------------------- VCORIO1D.140
CL CALL COMDECK TO OBTAIN CONSTANTS USED. VCORIO1D.141
VCORIO1D.142
*CALL C_VCORI
VCORIO1D.143
VCORIO1D.144
CL MAXIMUM VECTOR LENGTH ASSUMED IS END_U_UPDATE+ROW_LENGTH+1- VCORIO1D.145
CL START_U_UPDATE VCORIO1D.146
CL--------------------------------------------------------------------- VCORIO1D.147
CL INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS: VCORIO1D.148
CL--------------------------------------------------------------------- VCORIO1D.149
CL VCORIO1D.150
CL--------------------------------------------------------------------- VCORIO1D.151
CL SECTION 1. CALCULATE DP/DT VCORIO1D.152
CL--------------------------------------------------------------------- VCORIO1D.153
*IF DEF,MPP ATJ0F403.187
!! First update halos of u and v fields since the indexing errors in ATJ0F403.188
!! later calculations are otherwise not using the correct data ATJ0F403.189
CALL SWAPBOUNDS
(u,local_row_length,tot_u_rows,ew_halo,ns_halo,1) ATJ0F403.190
CALL SWAPBOUNDS
(v,local_row_length,tot_u_rows,ew_halo,ns_halo,1) ATJ0F403.191
*ENDIF ATJ0F403.192
VCORIO1D.154
IF(BK.EQ.0.) THEN VCORIO1D.155
C A CONSTANT PRESSURE LEVEL SO DP/DT IS ZERO. VCORIO1D.156
CONSTANT_PRESSURE = .TRUE. VCORIO1D.157
! Loop over U field missing top and bottom rows and halos VCORIO1D.158
DO 100 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO VCORIO1D.159
DP_BY_DT(I) = 0. VCORIO1D.160
100 CONTINUE VCORIO1D.161
ELSE VCORIO1D.162
C CALCULATE DP/DT. VCORIO1D.163
CONSTANT_PRESSURE = .FALSE. VCORIO1D.164
SCALAR = BK/ADVECTION_TIMESTEP VCORIO1D.165
! Loop over U field missing top and bottom rows and halos VCORIO1D.166
DO 110 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO VCORIO1D.167
DP_BY_DT(I) = (DELTA_AK+DELTA_BK*PSTAR_OLD(I))*RS(I)*RS(I) VCORIO1D.168
* *(PSTAR(I)-PSTAR_OLD(I))*SCALAR VCORIO1D.169
110 CONTINUE VCORIO1D.170
END IF VCORIO1D.171
VCORIO1D.172
CL--------------------------------------------------------------------- VCORIO1D.173
CL SECTION 2. CALCULATE U.GRAD P VCORIO1D.174
CL--------------------------------------------------------------------- VCORIO1D.175
VCORIO1D.176
C---------------------------------------------------------------------- VCORIO1D.177
CL SECTION 2.1 CALCULATE U DP/D(LONGITUDE) VCORIO1D.178
C---------------------------------------------------------------------- VCORIO1D.179
VCORIO1D.180
C CALCULATE U DP/D(LONGITUDE) BETWEEN P POINTS VCORIO1D.181
! Loop over U field missing top and bottom rows and halos and VCORIO1D.182
! last point (includes HADCM2-specific error) VCORIO1D.183
DO 210 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO VCORIO1D.184
WORK1(I) = .5*(U(I)+U(I-ROW_LENGTH))*(PSTAR(I+1)-PSTAR(I))* VCORIO1D.185
* LONGITUDE_STEP_INVERSE*BK VCORIO1D.186
210 CONTINUE VCORIO1D.187
VCORIO1D.188
*IF DEF,GLOBAL VCORIO1D.189
*IF -DEF,MPP VCORIO1D.190
C GLOBAL MODEL SO RECALCULATE VALUE AT END-POINT VCORIO1D.191
! Loop ove the last point of each row missing top and bottom rows VCORIO1D.192
! and halos (includes HADCM2-specific error) VCORIO1D.193
DO 212 I=START_POINT_NO_HALO+LAST_ROW_PT-1, VCORIO1D.194
& END_U_POINT_NO_HALO,ROW_LENGTH VCORIO1D.195
WORK1(I) = .5*(U(I)+U(I-ROW_LENGTH))*(PSTAR(I+1-ROW_LENGTH)- VCORIO1D.196
* PSTAR(I))*LONGITUDE_STEP_INVERSE*BK VCORIO1D.197
212 CONTINUE VCORIO1D.198
*ELSE VCORIO1D.199
WORK1(END_U_POINT_NO_HALO) = 0.0 VCORIO1D.200
! MPP Code : No need to do recalculations of end points because cyclic VCORIO1D.201
! boundary conditions means that halos do this for us automatically VCORIO1D.202
VCORIO1D.203
*ENDIF VCORIO1D.204
*ELSE VCORIO1D.205
WORK1(END_U_POINT_NO_HALO) = 0.0 VCORIO1D.206
*ENDIF VCORIO1D.207
VCORIO1D.208
C CALCULATE U DP/D(LONGITUDE) AT P POINTS VCORIO1D.209
VCORIO1D.210
! Loop over U field missing top and bottom rows and halos and VCORIO1D.211
! first point VCORIO1D.212
DO 214 I=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO VCORIO1D.213
WP(I) = .5*(WORK1(I)+WORK1(I-1)) VCORIO1D.214
214 CONTINUE VCORIO1D.215
VCORIO1D.216
C---------------------------------------------------------------------- VCORIO1D.217
CL SECTION 2.2 CALCULATE V DP/D(LATITUDE) AND HENCE U.GRAD P VCORIO1D.218
C---------------------------------------------------------------------- VCORIO1D.219
VCORIO1D.220
C CALCULATE V DP/D(LATITUDE) BETWEEN P POINTS. VCORIO1D.221
VCORIO1D.222
! Loop over U field missing bottom row, last point and top and VCORIO1D.223
! bottom halos (includes HADCM2-specific error) VCORIO1D.224
DO 220 I=START_POINT_NO_HALO-ROW_LENGTH+1,END_U_POINT_NO_HALO VCORIO1D.225
WORK2(I) = .5*(V(I)+V(I-1))*(PSTAR(I)-PSTAR(I+ROW_LENGTH)) VCORIO1D.226
* *LATITUDE_STEP_INVERSE*BK VCORIO1D.227
220 CONTINUE VCORIO1D.228
VCORIO1D.229
VCORIO1D.231
*IF -DEF,MPP VCORIO1D.232
! Last point of row above START_POINT row VCORIO1D.233
! (includes HADCM2-specific error) VCORIO1D.234
I=START_POINT_NO_HALO-2*ROW_LENGTH+LAST_ROW_PT VCORIO1D.235
C GLOBAL MODEL SO RECALCULATE LAST POINT VALUES FOR V DP/D(LAT) ATJ0F403.193
VCORIO1D.237
WORK2(I) = .5*(V(I)+V(I-1+ROW_LENGTH))*(PSTAR(I)- VCORIO1D.238
* PSTAR(I+ROW_LENGTH))*LATITUDE_STEP_INVERSE*BK VCORIO1D.239
VCORIO1D.240
! Loop over first point of each row, missing top and bottom rows and VCORIO1D.241
! halos (includes HADCM2-specific error) VCORIO1D.242
DO 222 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO,ROW_LENGTH VCORIO1D.243
WORK2(I) = .5*(V(I)+V(I-1+ROW_LENGTH))*(PSTAR(I)- VCORIO1D.244
* PSTAR(I+ROW_LENGTH))*LATITUDE_STEP_INVERSE*BK VCORIO1D.245
VCORIO1D.246
C AND U DP/D(LONG) AT P POINTS. VCORIO1D.247
WP(I) = .5*(WORK1(I)+WORK1(I-1+ROW_LENGTH)) VCORIO1D.248
222 CONTINUE VCORIO1D.249
*ELSE VCORIO1D.250
WORK2(END_U_POINT_NO_HALO)=WORK2(END_U_POINT_NO_HALO-1) VCORIO1D.251
WP(START_POINT_NO_HALO)=WP(START_POINT_NO_HALO+1) VCORIO1D.252
! MPP Code : No need to do recalculations of end points because cyclic VCORIO1D.253
! boundary conditions means that halos do this for us automatically VCORIO1D.254
VCORIO1D.255
*ENDIF VCORIO1D.256
VCORIO1D.257
VCORIO1D.259
C CALCULATE U.GRAD P VCORIO1D.260
VCORIO1D.261
*IF DEF,GLOBAL,OR,DEF,MPP ATJ0F403.194
! Loop over field, missing top and bottom rows and halos VCORIO1D.263
DO 224 I=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO VCORIO1D.264
*ELSE VCORIO1D.265
! Loop over field, missing top and bottom rows and halos, and first VCORIO1D.266
! and last points. VCORIO1D.267
DO 224 I=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO-1 VCORIO1D.268
*ENDIF VCORIO1D.269
WP(I)=(WP(I)+.5*(WORK2(I)+WORK2(I-ROW_LENGTH))) VCORIO1D.270
* *SEC_U_LATITUDE(I) VCORIO1D.271
224 CONTINUE VCORIO1D.272
VCORIO1D.273
CL--------------------------------------------------------------------- VCORIO1D.274
CL SECTION 3. CALL CALC_TS TO GET TS. VCORIO1D.275
CL--------------------------------------------------------------------- VCORIO1D.276
VCORIO1D.277
C STORE PRESSURE IN WORK. VCORIO1D.278
! Loop over field, missing top and bottom rows and halos VCORIO1D.279
DO 300 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO VCORIO1D.280
WORK2(I) = AK + BK*PSTAR(I) VCORIO1D.281
300 CONTINUE VCORIO1D.282
VCORIO1D.283
C CALCULATE NUMBER OF POINTS CALC_TS TO BE CALLED FOR. VCORIO1D.284
POINTS = END_U_POINT_NO_HALO-START_POINT_NO_HALO+1 VCORIO1D.285
VCORIO1D.286
C TS IS RETURNED IN WORK. VCORIO1D.287
VCORIO1D.288
CALL CALC_TS
(WORK2(START_POINT_NO_HALO),TS(START_POINT_NO_HALO), VCORIO1D.289
& POINTS,CONSTANT_PRESSURE,LLINTS) VCORIO1D.290
VCORIO1D.291
CL--------------------------------------------------------------------- VCORIO1D.292
CL SECTION 4. CALCULATE WK AS IN EQUATION (43). VCORIO1D.293
CL--------------------------------------------------------------------- VCORIO1D.294
VCORIO1D.295
*IF DEF,GLOBAL,OR,DEF,MPP ATJ0F403.195
! Loop over field, missing top and bottom rows and halos VCORIO1D.297
DO 400 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO VCORIO1D.298
*ELSE VCORIO1D.299
DO 400 I=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO-1 VCORIO1D.300
*ENDIF VCORIO1D.301
OMEGA(I)= WP(I)+DP_BY_DT(I)+.5*(ETADOT_PLUS(I)* VCORIO1D.302
* (DELTA_AKH_PLUS+DELTA_BKH_PLUS*PSTAR(I))+ETADOT_MINUS(I) VCORIO1D.303
* *(DELTA_AKH_MINUS+DELTA_BKH_MINUS*PSTAR(I))) VCORIO1D.304
WK(I) = -R*TS(I)*OMEGA(I)/(G*WORK2(I)) VCORIO1D.305
400 CONTINUE VCORIO1D.306
VCORIO1D.307
*IF -DEF,GLOBAL VCORIO1D.308
VCORIO1D.309
CL LIMITED AREA MODEL SET VERTICAL VELOCITY ON BOUNDARY TO ZERO. VCORIO1D.310
VCORIO1D.311
*IF DEF,MPP VCORIO1D.312
IF (at_left_of_LPG) THEN VCORIO1D.313
*ENDIF VCORIO1D.314
! Set first point of each row to zero VCORIO1D.315
DO I=START_POINT_NO_HALO+FIRST_ROW_PT-1,END_U_POINT_NO_HALO, VCORIO1D.316
& ROW_LENGTH VCORIO1D.317
WK(I)=0.0 VCORIO1D.318
OMEGA(I)=0.0 VCORIO1D.319
*IF -DEF,GLOBAL ATJ0F403.196
WK(I-1)=0.0 ATJ0F403.197
OMEGA(I-1)=0.0 ATJ0F403.198
*ENDIF ATJ0F403.199
ENDDO VCORIO1D.320
*IF DEF,MPP VCORIO1D.321
ENDIF VCORIO1D.322
VCORIO1D.323
IF (at_right_of_LPG) THEN VCORIO1D.324
*ENDIF VCORIO1D.325
! Set last two points of each row to zero VCORIO1D.326
DO I=START_POINT_NO_HALO+LAST_ROW_PT-2,END_U_POINT_NO_HALO, VCORIO1D.327
& ROW_LENGTH VCORIO1D.328
WK(I)=0.0 VCORIO1D.329
WK(I+1)=0.0 VCORIO1D.330
OMEGA(I)=0.0 VCORIO1D.331
OMEGA(I+1)=0.0 VCORIO1D.332
*IF -DEF,GLOBAL ATJ0F403.200
WK(I+2)=0.0 ATJ0F403.201
OMEGA(I+2)=0.0 ATJ0F403.202
*ENDIF ATJ0F403.203
ENDDO VCORIO1D.333
*IF DEF,MPP VCORIO1D.334
ENDIF VCORIO1D.335
*ENDIF VCORIO1D.336
VCORIO1D.337
*ENDIF VCORIO1D.338
VCORIO1D.339
CL END OF ROUTINE V_CORIOL VCORIO1D.340
VCORIO1D.341
RETURN VCORIO1D.342
END VCORIO1D.343
VCORIO1D.344
*ENDIF VCORIO1D.345