*IF DEF,A15_1A                                                             VORTI51A.2      
C ******************************COPYRIGHT******************************    GTS2F400.11845  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.11846  
C                                                                          GTS2F400.11847  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.11848  
C restrictions as set forth in the contract.                               GTS2F400.11849  
C                                                                          GTS2F400.11850  
C                Meteorological Office                                     GTS2F400.11851  
C                London Road                                               GTS2F400.11852  
C                BRACKNELL                                                 GTS2F400.11853  
C                Berkshire UK                                              GTS2F400.11854  
C                RG12 2SZ                                                  GTS2F400.11855  
C                                                                          GTS2F400.11856  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.11857  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.11858  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.11859  
C Modelling at the above address.                                          GTS2F400.11860  
C ******************************COPYRIGHT******************************    GTS2F400.11861  
C                                                                          GTS2F400.11862  
CLL   SUBROUTINE VORTIC5 -----------------------------------------------   VORTI51A.3      
CLL                                                                        VORTI51A.4      
CLL   Purpose: To compute   1/(rs*cos(phi)) *                              VORTI51A.5      
CLL                         (D(v)/D(lambda)-D(u.cos(phi))/D(phi)).         VORTI51A.6      
CLL            This is a term that is calculated here to be used later     VORTI51A.7      
CLL            in the calculation of potential vorticity                   VORTI51A.8      
CLL            in subroutine CALC_PV_P.                                    VORTI51A.9      
CLL                                                                        VORTI51A.10     
CLL   Not suitable for single column use.                                  VORTI51A.11     
CLL                                                                        VORTI51A.12     
CLL   VERSION FOR CRAY Y-MP                                                VORTI51A.13     
CLL                                                                        VORTI51A.14     
CLL    Model            Modification history:                              VORTI51A.15     
CLL   Version   Date                                                       VORTI51A.16     
CLL     3.1    2/11/92  Written by Simon Anderson.                         VORTI51A.17     
CLL     3.1   18/01/93  New deck at the release of Version 3.1.            VORTI51A.18     
CLL     3.2   28/07/93  Change subroutine name to uppercase for            TS280793.36     
CLL                     portability.    Tracey Smith                       TS280793.37     
!LL     4.3   18/02/97  Added ARGFLDPT arguments and MPP code  P.Burton    GSM3F403.1094   
CLL                                                                        VORTI51A.19     
CLL   Programming standard: Unified model documentation paper no. 4,       VORTI51A.20     
CLL                         standard b. version 2, dated 18/01/90          VORTI51A.21     
CLL                                                                        VORTI51A.22     
CLL   Logical components covered: D415                                     VORTI51A.23     
CLL                                                                        VORTI51A.24     
CLL   Project task: D4                                                     VORTI51A.25     
CLL                                                                        VORTI51A.26     
CLL   Documentation: U.M.D.P No 13. Derivation and Calculation of          VORTI51A.27     
CLL                  Unified Model Potential Vorticity.                    VORTI51A.28     
CLL                  By Simon Anderson and Ian Roulstone.                  VORTI51A.29     
CLL                                                                        VORTI51A.30     
CLLEND------------------------------------------------------------------   VORTI51A.31     
                                                                           VORTI51A.32     
C*L ARGUMENTS:----------------------------------------------------------   VORTI51A.33     

      SUBROUTINE VORTIC5                                                    1,1TS280793.38     
     1                  (u_on_press,v_on_press,rs_on_press,                VORTI51A.35     
     2                   cos_u_latitude,sec_p_latitude,                    VORTI51A.36     
     3                   vorticity5,                                       VORTI51A.37     
     4                   p_field,u_field,row_length,                       VORTI51A.38     
*CALL ARGFLDPT                                                             GSM3F403.1095   
     5                   latitude_step_inverse,longitude_step_inverse)     VORTI51A.39     
                                                                           VORTI51A.40     
      implicit none                                                        VORTI51A.41     
                                                                           VORTI51A.42     
C Input variables ------------------------------------------------------   VORTI51A.43     
                                                                           VORTI51A.44     
      integer                                                              VORTI51A.45     
     & p_field                !IN  Number of points in pressure field.     VORTI51A.46     
     &,u_field                !IN  Number of points in velocity field.     VORTI51A.47     
     &,row_length             !IN  Number of points per row.               VORTI51A.48     
*CALL TYPFLDPT                                                             GSM3F403.1096   
                                                                           VORTI51A.49     
      real                                                                 VORTI51A.50     
     & u_on_press(u_field)    !IN  Mass weighted u velocity.               VORTI51A.51     
     &,v_on_press(u_field)    !IN  Mass weighted v velocity*               VORTI51A.52     
     &                        !                      cos(latitude).        VORTI51A.53     
     &,rs_on_press(p_field)   !IN  Pseudo radius at p-points.              VORTI51A.54     
     &,cos_u_latitude(u_field)!IN  Cos(lat) at uv-points.                  VORTI51A.55     
     &,sec_p_latitude(p_field)!IN  1/cos(lat) at p-points.                 VORTI51A.56     
     &,latitude_step_inverse  !IN  1/latitude increment.                   VORTI51A.57     
     &,longitude_step_inverse !IN  1/longitude increment.                  VORTI51A.58     
                                                                           VORTI51A.59     
C Output variables -----------------------------------------------------   VORTI51A.60     
                                                                           VORTI51A.61     
      real                                                                 VORTI51A.62     
     & vorticity5(p_field)    !OUT Term used in potential vorticity eqn.   VORTI51A.63     
                                                                           VORTI51A.64     
C*----------------------------------------------------------------------   VORTI51A.65     
C*L Workspace usage:- 3 local arrays required.                             VORTI51A.66     
                                                                           VORTI51A.67     
      real                                                                 VORTI51A.68     
     & dv_dlongitude(p_field)                                              VORTI51A.69     
     &,dcosphiu_dlatitude(p_field)                                         VORTI51A.70     
     &,dcosphiu_dlatitude2(u_field)                                        VORTI51A.71     
                                                                           VORTI51A.72     
C*----------------------------------------------------------------------   VORTI51A.73     
C*L External subroutine calls:   None.                                     VORTI51A.74     
                                                                           VORTI51A.75     
C*---------------------------------------------------------------------    VORTI51A.76     
C*L Define local variables:                                                VORTI51A.77     
      integer                                                              VORTI51A.78     
     & i,j                    ! Loop counts.                               VORTI51A.79     
*IF DEF,MPP,AND,DEF,GLOBAL                                                 GSM3F403.1097   
     &,  info    ! GC return code                                          GSM3F403.1098   
                                                                           VORTI51A.80     
      REAL                                                                 GSM3F403.1099   
     &  pole_sum(row_length)  ! array containing polar vals to sum         GSM3F403.1100   
*ENDIF                                                                     GSM3F403.1101   
                                                                           GSM3F403.1102   
      real                                                                 VORTI51A.81     
     & scalar                 ! Local scalar.                              VORTI51A.82     
                                                                           VORTI51A.83     
*IF DEF,GLOBAL                                                             VORTI51A.84     
      real sum_n,sum_s                                                     VORTI51A.85     
*ENDIF                                                                     VORTI51A.86     
                                                                           VORTI51A.87     
                                                                           VORTI51A.88     
CL---------------------------------------------------------------------    VORTI51A.89     
CL    Calculate 'vorticity5'.                                              VORTI51A.90     
CL---------------------------------------------------------------------    VORTI51A.91     
                                                                           VORTI51A.92     
C Calculate d(v)/d(lambda).                                                VORTI51A.93     
*IF -DEF,GLOBAL                                                            VORTI51A.94     
CMIC$ PARALLEL SHARED(ROW_LENGTH,P_FIELD,VORTICITY5,RS_ON_PRESS,           VORTI51A.95     
CMIC$1   SEC_P_LATITUDE,DCOSPHIU_DLATITUDE,U_FIELD,COS_U_LATITUDE,         VORTI51A.96     
CMIC$2   LATITUDE_STEP_INVERSE,U_ON_PRESS,LONGITUDE_STEP_INVERSE,          VORTI51A.97     
CMIC$3   V_ON_PRESS,DV_DLONGITUDE) PRIVATE(J,I)                            VORTI51A.98     
CMIC$ DO PARALLEL VECTOR                                                   VORTI51A.99     
CDIR$ IVDEP                                                                VORTI51A.100    
! Fujitsu vectorization directive                                          GRB0F405.571    
!OCL NOVREC                                                                GRB0F405.572    
*ENDIF                                                                     VORTI51A.101    
        do 110 i=TOP_ROW_START+1,LAST_U_FLD_PT                             GSM3F403.1103   
          dv_dlongitude(i) = longitude_step_inverse*                       VORTI51A.103    
     &                       (v_on_press(i) - v_on_press(i-1))             VORTI51A.104    
 110    continue                                                           VORTI51A.105    
                                                                           VORTI51A.106    
C Calculate d(cosphiu)/d(phi).                                             VORTI51A.107    
*IF -DEF,GLOBAL                                                            VORTI51A.108    
CMIC$ DO PARALLEL VECTOR                                                   VORTI51A.109    
CDIR$ IVDEP                                                                VORTI51A.110    
! Fujitsu vectorization directive                                          GRB0F405.573    
!OCL NOVREC                                                                GRB0F405.574    
*ENDIF                                                                     VORTI51A.111    
        do 120 i=START_POINT_NO_HALO,LAST_U_FLD_PT                         GSM3F403.1104   
          dcosphiu_dlatitude(i) = latitude_step_inverse*                   VORTI51A.113    
     &                            (cos_u_latitude(i-row_length)*           VORTI51A.114    
     &                             u_on_press(i-row_length) -              VORTI51A.115    
     &                             cos_u_latitude(i)*                      VORTI51A.116    
     &                             u_on_press(i))                          VORTI51A.117    
 120    continue                                                           VORTI51A.118    
                                                                           VORTI51A.119    
*IF DEF,GLOBAL                                                             VORTI51A.120    
C Calculate average of dcosphiu_dlatitude at p-points.                     VORTI51A.121    
        do 130 i=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO                 GSM3F403.1105   
          dcosphiu_dlatitude2(i) = dcosphiu_dlatitude(i) +                 VORTI51A.123    
     &                             dcosphiu_dlatitude(i-1)                 VORTI51A.124    
 130    continue                                                           VORTI51A.125    
                                                                           VORTI51A.126    
C Now do first point on each slice for                                     VORTI51A.127    
C dv_dlongitude and dcosphiu_dlatitude2.                                   VORTI51A.128    
*IF -DEF,MPP                                                               GSM3F403.1106   
        i=FIRST_FLD_PT                                                     GSM3F403.1107   
        dv_dlongitude(i) = longitude_step_inverse *                        VORTI51A.130    
     &                     (v_on_press(i) - v_on_press(i+row_length-1))    VORTI51A.131    
        do 140 i=FIRST_FLD_PT+row_length,LAST_U_FLD_PT,row_length          GSM3F403.1108   
          dv_dlongitude(i) = longitude_step_inverse *                      VORTI51A.133    
     &                     (v_on_press(i) - v_on_press(i+row_length-1))    VORTI51A.134    
          dcosphiu_dlatitude2(i) = dcosphiu_dlatitude(i)+                  VORTI51A.135    
     &                             dcosphiu_dlatitude(i+row_length-1)      VORTI51A.136    
 140    continue                                                           VORTI51A.137    
*ELSE                                                                      GSM3F403.1109   
! Put a sensible number in the first element (halo)                        GSM3F403.1110   
        i=TOP_ROW_START                                                    GSM3F403.1111   
        dv_dlongitude(i) = dv_dlongitude(i+1)                              GSM3F403.1112   
        i=START_POINT_NO_HALO                                              GSM3F403.1113   
        dcosphiu_dlatitude2(i) = dcosphiu_dlatitude2(i+1)                  GSM3F403.1114   
*ENDIF                                                                     GSM3F403.1115   
                                                                           VORTI51A.138    
C Calculate vorticity5.                                                    VORTI51A.139    
                                                                           VORTI51A.140    
        do 150 j=START_POINT_NO_HALO,END_P_POINT_NO_HALO                   GSM3F403.1116   
          vorticity5(j)=sec_p_latitude(j)/rs_on_press(j)*                  VORTI51A.142    
     &                  .5*(dv_dlongitude(j)+                              VORTI51A.143    
     &                      dv_dlongitude(j-row_length)-                   VORTI51A.144    
     &                      dcosphiu_dlatitude2(j))                        VORTI51A.145    
 150    continue                                                           VORTI51A.146    
                                                                           VORTI51A.147    
*ELSE                                                                      VORTI51A.148    
        dv_dlongitude(FIRST_FLD_PT) = 0.                                   GSM3F403.1117   
                                                                           VORTI51A.150    
C Calculate vorticity5.                                                    VORTI51A.151    
                                                                           VORTI51A.152    
CMIC$ DO PARALLEL VECTOR                                                   VORTI51A.153    
CDIR$ IVDEP                                                                VORTI51A.154    
! Fujitsu vectorization directive                                          GRB0F405.575    
!OCL NOVREC                                                                GRB0F405.576    
        do 130 j=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO-1               GSM3F403.1118   
          vorticity5(j)=sec_p_latitude(j)/rs_on_press(j)*                  VORTI51A.156    
     &                  .5*(dv_dlongitude(j)+                              VORTI51A.157    
     &                      dv_dlongitude(j-row_length)-                   VORTI51A.158    
     &                      dcosphiu_dlatitude(j)-                         VORTI51A.159    
     &                      dcosphiu_dlatitude(j-1))                       VORTI51A.160    
 130    continue                                                           VORTI51A.161    
                                                                           VORTI51A.162    
C Zero vorticity5 on boundaries.                                           VORTI51A.163    
*IF DEF,MPP                                                                GSM3F403.1119   
        if (at_top_of_LPG) then                                            GSM3F403.1120   
*ENDIF                                                                     GSM3F403.1121   
! Northern boundary                                                        GSM3F403.1122   
          do j=TOP_ROW_START,TOP_ROW_START+row_length-1                    GSM3F403.1123   
            vorticity5(j) = 0.0                                            GSM3F403.1124   
          enddo                                                            GSM3F403.1125   
*IF DEF,MPP                                                                GSM3F403.1126   
        endif                                                              GSM3F403.1127   
                                                                           VORTI51A.176    
        if (at_base_of_LPG) then                                           GSM3F403.1128   
*ENDIF                                                                     GSM3F403.1129   
! Southern boundary                                                        GSM3F403.1130   
          do j=P_BOT_ROW_START,P_BOT_ROW_START+row_length-1                GSM3F403.1131   
            vorticity5(j) = 0.0                                            GSM3F403.1132   
          enddo                                                            GSM3F403.1133   
*IF DEF,MPP                                                                GSM3F403.1134   
        endif                                                              GSM3F403.1135   
                                                                           GSM3F403.1136   
        if (at_left_of_LPG) then                                           GSM3F403.1137   
*ENDIF                                                                     GSM3F403.1138   
! Western boundary                                                         GSM3F403.1139   
          do j=TOP_ROW_START+FIRST_ROW_PT-1+row_length,                    GSM3F403.1140   
     &         END_P_POINT_NO_HALO,                                        GSM3F403.1141   
     &         row_length                                                  GSM3F403.1142   
            vorticity5(j) = 0.0                                            GSM3F403.1143   
          enddo                                                            GSM3F403.1144   
*IF DEF,MPP                                                                GSM3F403.1145   
        endif                                                              GSM3F403.1146   
                                                                           GSM3F403.1147   
        if (at_right_of_LPG) then                                          GSM3F403.1148   
*ENDIF                                                                     GSM3F403.1149   
! Eastern boundary                                                         GSM3F403.1150   
          do j=TOP_ROW_START+LAST_ROW_PT-1+row_length,                     GSM3F403.1151   
     &         END_P_POINT_NO_HALO,                                        GSM3F403.1152   
     &         row_length                                                  GSM3F403.1153   
            vorticity5(j)=0.0                                              GSM3F403.1154   
          enddo                                                            GSM3F403.1155   
*IF DEF,MPP                                                                GSM3F403.1156   
        endif                                                              GSM3F403.1157   
*ENDIF                                                                     GSM3F403.1158   
*ENDIF                                                                     VORTI51A.178    
                                                                           VORTI51A.179    
*IF DEF,GLOBAL                                                             VORTI51A.180    
C Calculate vorticity5 at poles by summing dcosphiu/dlatitude around       VORTI51A.181    
C Polar circle and averaging.                                              VORTI51A.182    
        scalar = latitude_step_inverse/GLOBAL_ROW_LENGTH                   GSM3F403.1159   
*IF DEF,MPP                                                                GSM3F403.1160   
        if (at_top_of_LPG) then                                            GSM3F403.1161   
*ENDIF                                                                     GSM3F403.1162   
          sum_n=0.0                                                        GSM3F403.1163   
*IF -DEF,MPP                                                               GSM3F403.1164   
          do i=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                    GSM3F403.1165   
            sum_n = sum_n - cos_u_latitude(i)*u_on_press(i)*scalar         GSM3F403.1166   
          enddo                                                            GSM3F403.1167   
*ELSE                                                                      GSM3F403.1168   
          do i=1,ROW_LENGTH-2*EW_Halo                                      GSM3F403.1169   
            j=TOP_ROW_START+FIRST_ROW_PT+i-2                               GSM3F403.1170   
            pole_sum(i)=-cos_u_latitude(j)*u_on_press(j)*scalar            GSM3F403.1171   
          enddo                                                            GSM3F403.1172   
                                                                           VORTI51A.191    
*IF DEF,REPROD                                                             GSM3F403.1173   
          CALL GCG_RVECSUMR(                                               GSM3F403.1174   
*ELSE                                                                      GSM3F403.1175   
          CALL GCG_RVECSUMF(                                               GSM3F403.1176   
*ENDIF                                                                     GSM3F403.1177   
     &      ROW_LENGTH-2*EW_Halo,ROW_LENGTH-2*EW_Halo,1,1,                 GSM3F403.1178   
     &      pole_sum,                                                      GSM3F403.1179   
     &      GC_ROW_GROUP,info,sum_n)                                       GSM3F403.1180   
*ENDIF                                                                     GSM3F403.1181   
          do i=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1                    GSM3F403.1182   
            vorticity5(i)=-sum_n*sec_p_latitude(i)/ rs_on_press(i)         GSM3F403.1183   
          enddo                                                            GSM3F403.1184   
*IF DEF,MPP                                                                GSM3F403.1185   
        endif                                                              GSM3F403.1186   
                                                                           VORTI51A.199    
        if (at_base_of_LPG) then                                           GSM3F403.1187   
*ENDIF                                                                     GSM3F403.1188   
          sum_s=0.0                                                        GSM3F403.1189   
*IF -DEF,MPP                                                               GSM3F403.1190   
          do i=P_BOT_ROW_START-row_length,P_BOT_ROW_START-1                GSM3F403.1191   
            sum_s = sum_s + cos_u_latitude(i)*u_on_press(i)*scalar         GSM3F403.1192   
          enddo                                                            GSM3F403.1193   
*ELSE                                                                      GSM3F403.1194   
          do i=1,ROW_LENGTH-2*EW_Halo                                      GSM3F403.1195   
            j=P_BOT_ROW_START+FIRST_ROW_PT-row_length-2+i                  GSM3F403.1196   
            pole_sum(i)=cos_u_latitude(j)*u_on_press(j)*scalar             GSM3F403.1197   
          enddo                                                            GSM3F403.1198   
                                                                           GSM3F403.1199   
*IF DEF,REPROD                                                             GSM3F403.1200   
          CALL GCG_RVECSUMR(                                               GSM3F403.1201   
*ELSE                                                                      GSM3F403.1202   
          CALL GCG_RVECSUMF(                                               GSM3F403.1203   
*ENDIF                                                                     GSM3F403.1204   
     &      ROW_LENGTH-2*EW_Halo,ROW_LENGTH-2*EW_Halo,1,1,                 GSM3F403.1205   
     &      pole_sum,                                                      GSM3F403.1206   
     &      GC_ROW_GROUP,info,sum_s)                                       GSM3F403.1207   
*ENDIF                                                                     GSM3F403.1208   
          do i=P_BOT_ROW_START,P_BOT_ROW_START+row_length-1                GSM3F403.1209   
            vorticity5(i)=-sum_s*sec_p_latitude(i)/ rs_on_press(i)         GSM3F403.1210   
          enddo                                                            GSM3F403.1211   
*IF DEF,MPP                                                                GSM3F403.1212   
        endif                                                              GSM3F403.1213   
*ENDIF                                                                     GSM3F403.1214   
*ENDIF                                                                     GSM3F403.1215   
*IF DEF,MPP                                                                GSM3F403.1216   
! Set rest of array to sensible values                                     GSM3F403.1217   
      CALL SWAPBOUNDS(vorticity5,ROW_LENGTH,tot_P_ROWS,                    GSM3F403.1218   
     &              EW_Halo,NS_Halo,1)                                     GSM3F403.1219   
*ENDIF                                                                     VORTI51A.200    
                                                                           VORTI51A.201    
CL    end of routine vortic5                                               VORTI51A.202    
                                                                           VORTI51A.203    
      return                                                               VORTI51A.204    
      end                                                                  VORTI51A.205    
                                                                           VORTI51A.206    
*ENDIF                                                                     VORTI51A.207