*IF DEF,A15_1A VORTI31A.2
C ******************************COPYRIGHT****************************** GTS2F400.11809
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.11810
C GTS2F400.11811
C Use, duplication or disclosure of this code is subject to the GTS2F400.11812
C restrictions as set forth in the contract. GTS2F400.11813
C GTS2F400.11814
C Meteorological Office GTS2F400.11815
C London Road GTS2F400.11816
C BRACKNELL GTS2F400.11817
C Berkshire UK GTS2F400.11818
C RG12 2SZ GTS2F400.11819
C GTS2F400.11820
C If no contract has been raised with this copy of the code, the use, GTS2F400.11821
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.11822
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.11823
C Modelling at the above address. GTS2F400.11824
C ******************************COPYRIGHT****************************** GTS2F400.11825
C GTS2F400.11826
CLL SUBROUTINE VORTIC3 ----------------------------------------------- VORTI31A.3
CLL VORTI31A.4
CLL Purpose: To compute 1/(rs*rs*cos(phi)) * VORTI31A.5
CLL D(rs.v)/D(p) * D(theta)/D(lambda) VORTI31A.6
CLL - 1/(rs*rs) * VORTI31A.7
CLL D(rs.u)/D(p) * D(theta)/D(phi). VORTI31A.8
CLL This is a term that is calculated here to be used later VORTI31A.9
CLL in the calculation of potential vorticity VORTI31A.10
CLL in subroutine CALC_PV_P. VORTI31A.11
CLL VORTI31A.12
CLL Not suitable for single column use. VORTI31A.13
CLL VORTI31A.14
CLL VERSION FOR CRAY Y-MP VORTI31A.15
CLL VORTI31A.16
CLL Model Modification history: VORTI31A.17
CLL Version Date VORTI31A.18
CLL 3.1 2/11/92 Written by Simon Anderson. VORTI31A.19
CLL 3.1 18/01/93 New deck at the release of Version 3.1. VORTI31A.20
CLL 3.2 28/07/93 Change subroutine name to uppercase for TS280793.30
CLL portability. Tracey Smith TS280793.31
!LL 4.3 18/02/97 Added ARGFLDPT arguments and MPP code P.Burton GSM3F403.1014
CLL VORTI31A.21
CLL Programming standard: Unified model documentation paper no. 4, VORTI31A.22
CLL standard b. version 2, dated 18/01/90 VORTI31A.23
CLL VORTI31A.24
CLL Logical components covered: D415 VORTI31A.25
CLL VORTI31A.26
CLL Project task: D4 VORTI31A.27
CLL VORTI31A.28
CLL Documentation: U.M.D.P No 13. Derivation and Calculation of VORTI31A.29
CLL Unified Model Potential Vorticity. VORTI31A.30
CLL By Simon Anderson and Ian Roulstone. VORTI31A.31
CLL VORTI31A.32
CLLEND------------------------------------------------------------------ VORTI31A.33
VORTI31A.34
C*L ARGUMENTS:---------------------------------------------------------- VORTI31A.35
SUBROUTINE VORTIC3 1,1TS280793.32
1 (rs_on_press,theta_on_press,drsu_dp,drsv_dp, VORTI31A.37
2 sec_p_latitude, VORTI31A.38
3 vorticity3,dtheta_dlatitude, VORTI31A.39
4 p_field,row_length, VORTI31A.40
*CALL ARGFLDPT
GSM3F403.1015
5 latitude_step_inverse,longitude_step_inverse) VORTI31A.41
VORTI31A.42
implicit none VORTI31A.43
VORTI31A.44
C Input variables ------------------------------------------------------ VORTI31A.45
VORTI31A.46
integer VORTI31A.47
& p_field !IN Number of points in pressure field. VORTI31A.48
&,row_length !IN Number of points per row. VORTI31A.49
*CALL TYPFLDPT
GSM3F403.1016
VORTI31A.50
real VORTI31A.51
& rs_on_press(p_field) !IN Pseudo radius at p-points. VORTI31A.52
&,theta_on_press(p_field)!IN Theta field at p-points. VORTI31A.53
&,drsu_dp(p_field) !IN D(rs.u)/D(p) at p-points. VORTI31A.54
&,drsv_dp(p_field) !IN D(rs.v)/D(p) at p-points. VORTI31A.55
&,sec_p_latitude(p_field)!IN 1/cos(lat) at p-points. VORTI31A.56
&,latitude_step_inverse !IN 1/latitude increment. VORTI31A.57
&,longitude_step_inverse !IN 1/longitude increment. VORTI31A.58
VORTI31A.59
C Output variables ----------------------------------------------------- VORTI31A.60
VORTI31A.61
real VORTI31A.62
& vorticity3(p_field) !OUT Term used in potential vorticity eqn. VORTI31A.63
&,dtheta_dlatitude(p_field) !OUT D(Theta)/D(phi) field. VORTI31A.64
VORTI31A.65
C*---------------------------------------------------------------------- VORTI31A.66
C*L Workspace usage:- 1 local array required. VORTI31A.67
VORTI31A.68
real VORTI31A.69
& dtheta_dlongitude(p_field) VORTI31A.70
VORTI31A.71
C*---------------------------------------------------------------------- VORTI31A.72
C*L External subroutine calls: None. VORTI31A.73
VORTI31A.74
C*---------------------------------------------------------------------- VORTI31A.75
C*L Define local variables: VORTI31A.76
VORTI31A.77
integer VORTI31A.78
& i,j ! Loop counts. VORTI31A.79
VORTI31A.80
real VORTI31A.81
& scalar ! Local scalar. VORTI31A.82
VORTI31A.83
VORTI31A.87
VORTI31A.88
CL---------------------------------------------------------------------- VORTI31A.89
CL Calculate 'vorticity3'. VORTI31A.90
CL---------------------------------------------------------------------- VORTI31A.91
VORTI31A.92
C Calculate d(theta)/d(lambda). VORTI31A.93
*IF -DEF,GLOBAL VORTI31A.94
CMIC$ PARALLEL SHARED(ROW_LENGTH,P_FIELD,VORTICITY3,RS_ON_PRESS, VORTI31A.95
CMIC$1 SEC_P_LATITUDE,DRSV_DP,DRSU_DP,DTHETA_DLATITUDE, VORTI31A.96
CMIC$2 LATITUDE_STEP_INVERSE,THETA_ON_PRESS,LONGITUDE_STEP_INVERSE, VORTI31A.97
CMIC$3 DTHETA_DLONGITUDE) PRIVATE(J,I) VORTI31A.98
CMIC$ DO PARALLEL VECTOR VORTI31A.99
CDIR$ IVDEP VORTI31A.100
! Fujitsu vectorization directive GRB0F405.565
!OCL NOVREC GRB0F405.566
*ENDIF VORTI31A.101
do 110 i=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO-1 GSM3F403.1017
dtheta_dlongitude(i) = (longitude_step_inverse * .5) * GSM3F403.1018
& (theta_on_press(i+1)- VORTI31A.104
& theta_on_press(i-1)) VORTI31A.105
110 continue VORTI31A.106
VORTI31A.107
C Calculate d(theta)/d(phi). VORTI31A.108
*IF -DEF,GLOBAL VORTI31A.109
CMIC$ DO PARALLEL VECTOR VORTI31A.110
CDIR$ IVDEP VORTI31A.111
! Fujitsu vectorization directive GRB0F405.567
!OCL NOVREC GRB0F405.568
*ENDIF VORTI31A.112
do 120 i=START_POINT_NO_HALO,END_P_POINT_NO_HALO GSM3F403.1019
dtheta_dlatitude(i) = (latitude_step_inverse * .5) * GSM3F403.1020
& (theta_on_press(i-row_length)- VORTI31A.115
& theta_on_press(i+row_length)) VORTI31A.116
120 continue VORTI31A.117
VORTI31A.118
*IF DEF,GLOBAL VORTI31A.119
*IF -DEF,MPP GSM3F403.1021
C Recalculate first and last point on each slice for d(theta)/d(lambda). VORTI31A.120
VORTI31A.121
do 130 i=row_length+1,p_field-row_length,row_length VORTI31A.122
dtheta_dlongitude(i) = (longitude_step_inverse * .5) * GSM3F403.1022
& (theta_on_press(i+1)- VORTI31A.124
& theta_on_press(i+row_length-1)) VORTI31A.125
j=i+row_length-1 VORTI31A.126
dtheta_dlongitude(j) = (longitude_step_inverse * .5) * GSM3F403.1023
& (theta_on_press(j-row_length+1)- VORTI31A.128
& theta_on_press(j-1)) VORTI31A.129
130 continue VORTI31A.130
*ELSE GSM3F403.1024
i=START_POINT_NO_HALO GSM3F403.1025
dtheta_dlongitude(i)=dtheta_dlongitude(i+1) GSM3F403.1026
GSM3F403.1027
i=END_P_POINT_NO_HALO GSM3F403.1028
dtheta_dlongitude(i)=dtheta_dlongitude(i-1) GSM3F403.1029
*ENDIF GSM3F403.1030
VORTI31A.131
C Calculate vorticity3. VORTI31A.132
VORTI31A.133
do 140 j=START_POINT_NO_HALO,END_P_POINT_NO_HALO GSM3F403.1031
vorticity3(j) = (1./(rs_on_press(j)*rs_on_press(j)))* GSM3F403.1032
& ((sec_p_latitude(j)* GSM3F403.1033
& drsv_dp(j))*dtheta_dlongitude(j)) GSM3F403.1034
& - (1./(rs_on_press(j)*rs_on_press(j)))* GSM3F403.1035
& (drsu_dp(j)*dtheta_dlatitude(j)) GSM3F403.1036
140 continue VORTI31A.140
VORTI31A.141
*ELSE VORTI31A.142
VORTI31A.144
C Calculate vorticity3. VORTI31A.145
VORTI31A.146
CMIC$ DO PARALLEL VECTOR VORTI31A.147
CDIR$ IVDEP VORTI31A.148
! Fujitsu vectorization directive GRB0F405.569
!OCL NOVREC GRB0F405.570
do 130 j=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO-1 GSM3F403.1037
vorticity3(j) = (1./(rs_on_press(j)*rs_on_press(j)))* GSM3F403.1038
& ((sec_p_latitude(j)* GSM3F403.1039
& drsv_dp(j))*dtheta_dlongitude(j)) GSM3F403.1040
& - (1./(rs_on_press(j)*rs_on_press(j)))* GSM3F403.1041
& (drsu_dp(j)*dtheta_dlatitude(j)) GSM3F403.1042
130 continue VORTI31A.155
VORTI31A.156
C Zero vorticity3 on boundaries. VORTI31A.157
*IF DEF,MPP GSM3F403.1043
if (at_top_of_LPG) then GSM3F403.1044
*ENDIF GSM3F403.1045
! Northern boundary GSM3F403.1046
do j=TOP_ROW_START,TOP_ROW_START+row_length-1 GSM3F403.1047
vorticity3(j) = 0.0 GSM3F403.1048
enddo GSM3F403.1049
*IF DEF,MPP GSM3F403.1050
endif GSM3F403.1051
GSM3F403.1052
if (at_base_of_LPG) then GSM3F403.1053
*ENDIF GSM3F403.1054
! Southern boundary GSM3F403.1055
do j=P_BOT_ROW_START,P_BOT_ROW_START+row_length-1 GSM3F403.1056
vorticity3(j) = 0.0 GSM3F403.1057
enddo GSM3F403.1058
*IF DEF,MPP GSM3F403.1059
endif GSM3F403.1060
GSM3F403.1061
if (at_left_of_LPG) then GSM3F403.1062
*ENDIF GSM3F403.1063
! Western boundary GSM3F403.1064
do j=TOP_ROW_START+FIRST_ROW_PT-1+row_length, GSM3F403.1065
& END_P_POINT_NO_HALO, GSM3F403.1066
& row_length GSM3F403.1067
vorticity3(j) = 0.0 GSM3F403.1068
enddo GSM3F403.1069
*IF DEF,MPP GSM3F403.1070
endif GSM3F403.1071
GSM3F403.1072
if (at_right_of_LPG) then GSM3F403.1073
*ENDIF GSM3F403.1074
! Eastern boundary GSM3F403.1075
do j=TOP_ROW_START+LAST_ROW_PT-1+row_length, GSM3F403.1076
& END_P_POINT_NO_HALO, GSM3F403.1077
& row_length GSM3F403.1078
vorticity3(j)=0.0 GSM3F403.1079
enddo GSM3F403.1080
*IF DEF,MPP GSM3F403.1081
endif GSM3F403.1082
*ENDIF GSM3F403.1083
VORTI31A.171
*ENDIF VORTI31A.172
VORTI31A.173
*IF DEF,GLOBAL VORTI31A.174
C Zero vorticity3 at the poles. TD141293.12
do i=1,row_length TD141293.13
*IF DEF,MPP GSM3F403.1084
if (at_top_of_LPG) vorticity3(TOP_ROW_START+i)=0.0 GSM3F403.1085
if (at_base_of_LPG)vorticity3(P_BOT_ROW_START+i)=0.0 GSM3F403.1086
*ELSE GSM3F403.1087
vorticity3(i)=0.0 TD141293.14
vorticity3(p_field-row_length+i)=0.0 TD141293.15
*ENDIF GSM3F403.1088
end do TD141293.16
VORTI31A.193
*ENDIF GSM3F403.1089
*IF DEF,MPP GSM3F403.1090
! Set rest of array to sensible values GSM3F403.1091
CALL SWAPBOUNDS
(vorticity3,ROW_LENGTH,tot_P_ROWS, GSM3F403.1092
& EW_Halo,NS_Halo,1) GSM3F403.1093
*ENDIF VORTI31A.194
VORTI31A.195
CL End of routine vortic3 VORTI31A.196
VORTI31A.197
return VORTI31A.198
end VORTI31A.199
VORTI31A.200
*ENDIF VORTI31A.201