*IF DEF,A15_1A VORTI21A.2
C ******************************COPYRIGHT****************************** GTS2F400.11791
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.11792
C GTS2F400.11793
C Use, duplication or disclosure of this code is subject to the GTS2F400.11794
C restrictions as set forth in the contract. GTS2F400.11795
C GTS2F400.11796
C Meteorological Office GTS2F400.11797
C London Road GTS2F400.11798
C BRACKNELL GTS2F400.11799
C Berkshire UK GTS2F400.11800
C RG12 2SZ GTS2F400.11801
C GTS2F400.11802
C If no contract has been raised with this copy of the code, the use, GTS2F400.11803
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.11804
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.11805
C Modelling at the above address. GTS2F400.11806
C ******************************COPYRIGHT****************************** GTS2F400.11807
C GTS2F400.11808
CLL SUBROUTINE VORTIC2 ----------------------------------------------- VORTI21A.3
CLL VORTI21A.4
CLL Purpose: To compute 'vorticity2'. VORTI21A.5
CLL This is a term that is calculated here to be used later VORTI21A.6
CLL in the calculation of potential vorticity. VORTI21A.7
CLL Vorticity2 = 1/(rs*rs*cos(phi)) * VORTI21A.8
CLL (D(rs.v)/D(lambda)-D(rs.cos(phi).u)/D(phi)). VORTI21A.9
CLL VORTI21A.10
CLL Not suitable for single column use. VORTI21A.11
CLL Version for cray y-mp VORTI21A.12
CLL VORTI21A.13
CLL 7/10/92 Written by Simon Anderson VORTI21A.14
CLL VORTI21A.15
CLL Model Modification history from model version 3.0: VORTI21A.16
CLL version Date VORTI21A.17
CLL 3.1 14/01/93 Code inserted to get round FPP error in LAM mode. MM140193.1
CLL This code maybe removed when FPP is fixed. M. Mawson MM140193.2
CLL 3.2 28/07/93 Change subroutine name to uppercase for TS280793.27
CLL portability. Tracey Smith TS280793.28
!LL 4.3 18/02/97 Added ARGFLDPT arguments and MPP code P.Burton GSM3F403.1309
!LL 4.4 05/09/97 One point not initialised properly. S.D.Mullerworth GSM1F404.41
CLL VORTI21A.18
CLL Programming standard: Unified model documentation paper no. 4, VORTI21A.19
CLL standard b. version 2, dated 18/01/90 VORTI21A.20
CLL VORTI21A.21
CLL Logical components covered: D415 VORTI21A.22
CLL VORTI21A.23
CLL System task: D4 VORTI21A.24
CLL VORTI21A.25
CLL Documentation: U.M.D.P No 13. Derivation and Calculation of VORTI21A.26
CLL Unified Model Potential Vorticity. VORTI21A.27
CLL by Simon Anderson and Ian Roulstone. VORTI21A.28
CLL VORTI21A.29
CLLEND------------------------------------------------------------------ VORTI21A.30
VORTI21A.31
C*L ARGUMENTS:---------------------------------------------------------- VORTI21A.32
SUBROUTINE VORTIC2 1,1TS280793.29
1 (u_on_theta,v_on_theta,rs_on_theta, VORTI21A.34
2 rs_uv_on_theta,cos_u_latitude, VORTI21A.35
3 sec_p_latitude,vorticity2, VORTI21A.36
4 p_field,u_field,row_length, VORTI21A.37
*CALL ARGFLDPT
GSM3F403.1310
5 latitude_step_inverse,longitude_step_inverse) VORTI21A.38
VORTI21A.39
implicit none VORTI21A.40
VORTI21A.41
C Input variables ------------------------------------------------------ VORTI21A.42
VORTI21A.43
integer VORTI21A.44
& p_field !IN Number of points in pressure field. VORTI21A.45
&,u_field !IN Number of points in velocity field. VORTI21A.46
&,row_length !IN Number of points per row. VORTI21A.47
*CALL TYPFLDPT
GSM3F403.1311
VORTI21A.48
real VORTI21A.49
& u_on_theta(u_field) !IN Mass weighted u velocity. VORTI21A.50
&,v_on_theta(u_field) !IN Mass weighted v velocity* VORTI21A.51
& ! cos(latitude). VORTI21A.52
&,rs_on_theta(p_field) !IN Pseudo radius at p points. VORTI21A.53
&,rs_uv_on_theta(u_field)!IN Pseudo radius at u points. VORTI21A.54
&,cos_u_latitude(u_field)!IN Cos(lat) at u points. VORTI21A.55
&,sec_p_latitude(p_field)!IN 1/cos(lat) at p points. VORTI21A.56
&,latitude_step_inverse !IN 1/latitude increment. VORTI21A.57
&,longitude_step_inverse !IN 1/longitude increment. VORTI21A.58
VORTI21A.59
C Output variables ----------------------------------------------------- VORTI21A.60
VORTI21A.61
real VORTI21A.62
& vorticity2(p_field) !OUT Term used in potential vorticity eqn. VORTI21A.63
VORTI21A.64
C*---------------------------------------------------------------------- VORTI21A.65
C*L Workspace usage:- 3 local arrays required. VORTI21A.66
VORTI21A.67
real VORTI21A.68
& drsv_dlongitude(p_field) VORTI21A.69
&,drscosphiu_dlatitude(p_field) VORTI21A.70
&,drscosphiu_dlatitude2(u_field) VORTI21A.71
C*--------------------------------------------------------------------- VORTI21A.72
VORTI21A.73
C*L Define local variables: VORTI21A.74
integer VORTI21A.75
& i,j ! Loop counts. VORTI21A.76
*IF DEF,MPP,AND,DEF,GLOBAL GSM3F403.1312
&, info ! GCOM return code GSM3F403.1313
GSM3F403.1314
REAL GSM3F403.1315
& pole_sum(row_length) ! array for summing around pole GSM3F403.1316
*ENDIF GSM3F403.1317
VORTI21A.77
real VORTI21A.78
& scalar ! Local scalar. VORTI21A.79
VORTI21A.80
*IF DEF,GLOBAL VORTI21A.81
real sum_n,sum_s VORTI21A.82
*ENDIF VORTI21A.83
VORTI21A.84
VORTI21A.85
VORTI21A.86
CL--------------------------------------------------------------------- VORTI21A.87
CL Calculate 'vorticity2'. VORTI21A.88
CL--------------------------------------------------------------------- VORTI21A.89
VORTI21A.90
*IF -DEF,GLOBAL MM140193.3
CMIC$ PARALLEL SHARED(ROW_LENGTH,P_FIELD,VORTICITY2,SEC_P_LATITUDE, MM140193.4
CMIC$1 RS_ON_THETA,DRSCOSPHIU_DLATITUDE,U_FIELD, MM140193.5
CMIC$2 LATITUDE_STEP_INVERSE,RS_UV_ON_THETA,COS_U_LATITUDE, MM140193.6
CMIC$3 U_ON_THETA,LONGITUDE_STEP_INVERSE,V_ON_THETA,DRSV_DLONGITUDE) MM140193.7
CMIC$4 PRIVATE(J,I) MM140193.8
CMIC$ DO PARALLEL VECTOR MM140193.9
CDIR$ IVDEP MM140193.10
! Fujitsu vectorization directive GRB0F405.559
!OCL NOVREC GRB0F405.560
*ENDIF MM140193.11
C Calculate d(rsv)/d(lambda). VORTI21A.91
do 110 i=TOP_ROW_START+1,LAST_U_FLD_PT GSM3F403.1318
drsv_dlongitude(i) = longitude_step_inverse* VORTI21A.93
& (rs_uv_on_theta(i)*v_on_theta(i) - VORTI21A.94
& rs_uv_on_theta(i-1)*v_on_theta(i-1)) VORTI21A.95
110 continue VORTI21A.96
VORTI21A.97
C Calculate d(rscosphiu)/d(phi). VORTI21A.98
*IF -DEF,GLOBAL MM140193.12
CMIC$ DO PARALLEL VECTOR MM140193.13
CDIR$ IVDEP MM140193.14
! Fujitsu vectorization directive GRB0F405.561
!OCL NOVREC GRB0F405.562
*ENDIF MM140193.15
do 120 i=START_POINT_NO_HALO,LAST_U_FLD_PT GSM3F403.1319
drscosphiu_dlatitude(i) = latitude_step_inverse* VORTI21A.100
& (rs_uv_on_theta(i-row_length)* VORTI21A.101
& cos_u_latitude(i-row_length)* VORTI21A.102
& u_on_theta(i-row_length) - VORTI21A.103
& rs_uv_on_theta(i)* VORTI21A.104
& cos_u_latitude(i)* VORTI21A.105
& u_on_theta(i)) VORTI21A.106
120 continue VORTI21A.107
VORTI21A.108
*IF DEF,GLOBAL VORTI21A.109
C Calculate average of drscosphiu_dlatitude at p-points. VORTI21A.110
do 130 i=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO GSM3F403.1320
drscosphiu_dlatitude2(i) = drscosphiu_dlatitude(i) + VORTI21A.112
& drscosphiu_dlatitude(i-1) VORTI21A.113
130 continue VORTI21A.114
VORTI21A.115
C Now do first point on each slice for VORTI21A.116
C drsv_dlongitude and drscosphiu_dlatitude2. VORTI21A.117
*IF -DEF,MPP GSM3F403.1321
i=FIRST_FLD_PT GSM3F403.1322
drsv_dlongitude(i) = longitude_step_inverse * VORTI21A.119
& (rs_uv_on_theta(i)*v_on_theta(i) - VORTI21A.120
& rs_uv_on_theta(i+row_length-1)* VORTI21A.121
& v_on_theta(i+row_length-1)) VORTI21A.122
do 140 i=FIRST_FLD_PT+row_length,LAST_U_FLD_PT,row_length GSM3F403.1323
drsv_dlongitude(i) = longitude_step_inverse * VORTI21A.124
& (rs_uv_on_theta(i)*v_on_theta(i) - VORTI21A.125
& rs_uv_on_theta(i+row_length-1)* VORTI21A.126
& v_on_theta(i+row_length-1)) VORTI21A.127
drscosphiu_dlatitude2(i)=drscosphiu_dlatitude(i)+ VORTI21A.128
& drscosphiu_dlatitude(i-1+row_length) VORTI21A.129
140 continue VORTI21A.130
*ELSE GSM3F403.1324
i=TOP_ROW_START GSM1F404.42
! Put a sensible number in the first element (halo) GSM3F403.1326
drsv_dlongitude(i) = drsv_dlongitude(i+1) GSM3F403.1327
i=START_POINT_NO_HALO GSM1F404.43
drscosphiu_dlatitude2(i)=drscosphiu_dlatitude2(i+1) GSM3F403.1328
*ENDIF GSM3F403.1329
VORTI21A.131
C Calculate vorticity2. VORTI21A.132
VORTI21A.133
do 150 j=START_POINT_NO_HALO,END_P_POINT_NO_HALO GSM3F403.1330
vorticity2(j)=sec_p_latitude(j)/ VORTI21A.135
& (rs_on_theta(j)*rs_on_theta(j))* VORTI21A.136
& .5*(drsv_dlongitude(j)+ VORTI21A.137
& drsv_dlongitude(j-row_length)- VORTI21A.138
& drscosphiu_dlatitude2(j)) VORTI21A.139
150 continue VORTI21A.140
VORTI21A.141
*ELSE VORTI21A.142
drsv_dlongitude(FIRST_FLD_PT) = 0. GSM3F403.1331
VORTI21A.144
C Calculate vorticity2. VORTI21A.145
VORTI21A.146
CMIC$ DO PARALLEL VECTOR MM140193.16
CDIR$ IVDEP MM140193.17
! Fujitsu vectorization directive GRB0F405.563
!OCL NOVREC GRB0F405.564
do 130 j=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO-1 GSM3F403.1332
vorticity2(j)=sec_p_latitude(j)/ VORTI21A.148
& (rs_on_theta(j)*rs_on_theta(j))* VORTI21A.149
& .5*(drsv_dlongitude(j)+ VORTI21A.150
& drsv_dlongitude(j-row_length)- VORTI21A.151
& drscosphiu_dlatitude(j)- VORTI21A.152
& drscosphiu_dlatitude(j-1)) VORTI21A.153
130 continue VORTI21A.154
VORTI21A.155
C Zero vorticity2 on boundaries. VORTI21A.156
*IF DEF,MPP GSM3F403.1333
if (at_top_of_LPG) then GSM3F403.1334
*ENDIF GSM3F403.1335
! Northern boundary GSM3F403.1336
do j=TOP_ROW_START,TOP_ROW_START+row_length-1 GSM3F403.1337
vorticity2(j) = 0.0 GSM3F403.1338
enddo GSM3F403.1339
*IF DEF,MPP GSM3F403.1340
endif GSM3F403.1341
GSM3F403.1342
if (at_base_of_LPG) then GSM3F403.1343
*ENDIF GSM3F403.1344
! Southern boundary GSM3F403.1345
do j=P_BOT_ROW_START,P_BOT_ROW_START+row_length-1 GSM3F403.1346
vorticity2(j) = 0.0 GSM3F403.1347
enddo GSM3F403.1348
*IF DEF,MPP GSM3F403.1349
endif GSM3F403.1350
GSM3F403.1351
if (at_left_of_LPG) then GSM3F403.1352
*ENDIF GSM3F403.1353
! Western boundary GSM3F403.1354
do j=TOP_ROW_START+FIRST_ROW_PT-1+row_length, GSM3F403.1355
& END_P_POINT_NO_HALO, GSM3F403.1356
& row_length GSM3F403.1357
vorticity2(j) = 0.0 GSM3F403.1358
enddo GSM3F403.1359
*IF DEF,MPP GSM3F403.1360
endif GSM3F403.1361
GSM3F403.1362
if (at_right_of_LPG) then GSM3F403.1363
*ENDIF GSM3F403.1364
! Eastern boundary GSM3F403.1365
do j=TOP_ROW_START+LAST_ROW_PT-1+row_length, GSM3F403.1366
& END_P_POINT_NO_HALO, GSM3F403.1367
& row_length GSM3F403.1368
vorticity2(j)=0.0 GSM3F403.1369
enddo GSM3F403.1370
*IF DEF,MPP GSM3F403.1371
endif GSM3F403.1372
*ENDIF GSM3F403.1373
VORTI21A.165
CMIC$ END PARALLEL MM140193.22
*ENDIF VORTI21A.166
VORTI21A.167
*IF DEF,GLOBAL VORTI21A.168
C Calculate vorticity2 at poles by summing drscosphiu/d(lat) around VORTI21A.169
C Polar circle and averaging. VORTI21A.170
scalar = latitude_step_inverse/GLOBAL_ROW_LENGTH GSM3F403.1374
*IF DEF,MPP GSM3F403.1375
if (at_top_of_LPG) then GSM3F403.1376
*ENDIF GSM3F403.1377
sum_n=0.0 GSM3F403.1378
*IF -DEF,MPP GSM3F403.1379
do i=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 GSM3F403.1380
sum_n = sum_n - rs_uv_on_theta(i)*cos_u_latitude(i)* GSM3F403.1381
& u_on_theta(i)*scalar GSM3F403.1382
enddo GSM3F403.1383
*ELSE GSM3F403.1384
do i=1,ROW_LENGTH-2*EW_Halo GSM3F403.1385
j=TOP_ROW_START+FIRST_ROW_PT+i-2 GSM3F403.1386
pole_sum(i)=-rs_uv_on_theta(j)*cos_u_latitude(j)* GSM3F403.1387
& u_on_theta(j)*scalar GSM3F403.1388
enddo GSM3F403.1389
GSM3F403.1390
*IF DEF,REPROD GSM3F403.1391
CALL GCG_RVECSUMR(
GSM3F403.1392
*ELSE GSM3F403.1393
CALL GCG_RVECSUMF(
GSM3F403.1394
*ENDIF GSM3F403.1395
& ROW_LENGTH-2*EW_Halo,ROW_LENGTH-2*EW_Halo,1,1, GSM3F403.1396
& pole_sum, GSM3F403.1397
& GC_ROW_GROUP,info,sum_n) GSM3F403.1398
*ENDIF GSM3F403.1399
do i=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 GSM3F403.1400
vorticity2(i)=-sum_n*sec_p_latitude(i)/ GSM3F403.1401
& (rs_on_theta(i)*rs_on_theta(i)) GSM3F403.1402
enddo GSM3F403.1403
*IF DEF,MPP GSM3F403.1404
endif GSM3F403.1405
GSM3F403.1406
if (at_base_of_LPG) then GSM3F403.1407
*ENDIF GSM3F403.1408
sum_s=0.0 GSM3F403.1409
*IF -DEF,MPP GSM3F403.1410
do i=P_BOT_ROW_START-row_length,P_BOT_ROW_START-1 GSM3F403.1411
sum_s = sum_s + rs_uv_on_theta(i)*cos_u_latitude(i)* GSM3F403.1412
& u_on_theta(i)*scalar GSM3F403.1413
enddo GSM3F403.1414
*ELSE GSM3F403.1415
do i=1,ROW_LENGTH-2*EW_Halo GSM3F403.1416
j=P_BOT_ROW_START+FIRST_ROW_PT-row_length-2+i GSM3F403.1417
pole_sum(i)=rs_uv_on_theta(j)*cos_u_latitude(j)* GSM3F403.1418
& u_on_theta(j)*scalar GSM3F403.1419
enddo GSM3F403.1420
GSM3F403.1421
*IF DEF,REPROD GSM3F403.1422
CALL GCG_RVECSUMR(
GSM3F403.1423
*ELSE GSM3F403.1424
CALL GCG_RVECSUMF(
GSM3F403.1425
*ENDIF GSM3F403.1426
& ROW_LENGTH-2*EW_Halo,ROW_LENGTH-2*EW_Halo,1,1, GSM3F403.1427
& pole_sum, GSM3F403.1428
& GC_ROW_GROUP,info,sum_s) GSM3F403.1429
*ENDIF GSM3F403.1430
do i=P_BOT_ROW_START,P_BOT_ROW_START+row_length-1 GSM3F403.1431
vorticity2(i)=-sum_s*sec_p_latitude(i)/ GSM3F403.1432
& (rs_on_theta(i)*rs_on_theta(i)) GSM3F403.1433
enddo GSM3F403.1434
*IF DEF,MPP GSM3F403.1435
endif GSM3F403.1436
*ENDIF GSM3F403.1437
VORTI21A.191
*ENDIF VORTI21A.192
*IF DEF,MPP GSM3F403.1438
! Set rest of array to sensible values GSM3F403.1439
CALL SWAPBOUNDS
(vorticity2,ROW_LENGTH,tot_P_ROWS, GSM3F403.1440
& EW_Halo,NS_Halo,1) GSM3F403.1441
*ENDIF GSM3F403.1442
VORTI21A.193
CL End of routine vortic2 VORTI21A.194
VORTI21A.195
return VORTI21A.196
end VORTI21A.197
*ENDIF VORTI21A.198