*IF DEF,RECON                                                              ROTATE1.2      
C ******************************COPYRIGHT******************************    ROTATE1.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    ROTATE1.4      
C                                                                          ROTATE1.5      
C Use, duplication or disclosure of this code is subject to the            ROTATE1.6      
C restrictions as set forth in the contract.                               ROTATE1.7      
C                                                                          ROTATE1.8      
C                Meteorological Office                                     ROTATE1.9      
C                London Road                                               ROTATE1.10     
C                BRACKNELL                                                 ROTATE1.11     
C                Berkshire UK                                              ROTATE1.12     
C                RG12 2SZ                                                  ROTATE1.13     
C                                                                          ROTATE1.14     
C If no contract has been raised with this copy of the code, the use,      ROTATE1.15     
C duplication or disclosure of it is strictly prohibited.  Permission      ROTATE1.16     
C to do so must first be obtained in writing from the Head of Numerical    ROTATE1.17     
C Modelling at the above address.                                          ROTATE1.18     
C ******************************COPYRIGHT******************************    ROTATE1.19     
C                                                                          ROTATE1.20     
CLL  SUBROUTINE ROTATE------------------------------------------------     ROTATE1.21     
CLL                                                                        ROTATE1.22     
CLL  Purpose:Read in  U & V fields from unit NFT, rotate winds to          ROTATE1.23     
CLL          standard grid (MODE=0) or equatorial lat-lon grid (MODE=1)    ROTATE1.24     
CLL          then write back U & V fields to unit NFT.                     ROTATE1.25     
CLL                                                                        ROTATE1.26     
CLL AD, MC      <- programmer of some or all of previous code or changes   ROTATE1.27     
CLL                                                                        ROTATE1.28     
CLL  Model            Modification history from model version 3.0:         ROTATE1.29     
CLL version  Date                                                          ROTATE1.30     
CLL                                                                        ROTATE1.31     
CLL   3.2  20/05/93   Wind staggering for C-grid added supporting          ROTATE1.32     
CLL                   interpolations B->C; B->B; C->C; C->B.               ROTATE1.33     
CLL                   Author: A.Dickinson      Reviewer: T.Davies          ROTATE1.34     
CLL   3.3  08/12/93   Extra argument for READFLDS and WRITFLDS.            ROTATE1.35     
CLL                   Author: D. Robinson      Reviewer: M. Bell           ROTATE1.36     
CLL   4.1  25/04/96   u,v dimensioned separately to take account of the    ROTATE1.37     
CLL                   one extra u row than v rows that exists on a C gri   ROTATE1.38     
CLL                   Author: I. Edmond        Reviewer: D. Goddard        ROTATE1.39     
CLL   4.4   25/04/96  Calculating u,v  on a rotated grid from a            UIE2F404.356    
CLL   standard lat-lon grid and vise versa using equations 5.13 and        UIE2F404.357    
CLL   5.14 UMDPS1 assumes that u and v are on the same grid point. On      UIE2F404.358    
CLL   the C grid, a horizontal interpolation of u onto the position of     UIE2F404.359    
CLL   the v points is required when calculating the v on the new grid      UIE2F404.360    
CLL   and v onto the position of the u points when calculating the u on    UIE2F404.361    
CLL   the new grid. VAR                                                    UIE2F404.362    
CLL                   Author: I. Edmond                                    UIE2F404.363    
CLL                                                                        ROTATE1.40     
CLL  Documentation: None                                                   ROTATE1.41     
CLL                                                                        ROTATE1.42     
CLL  -----------------------------------------------------------------     ROTATE1.43     
C*L  Arguments:-------------------------------------------------------     ROTATE1.44     

      SUBROUTINE ROTATE(                                                    2,44ROTATE1.45     
*CALL ARGPPX                                                               ROTATE1.46     
     *                  PP_ITEMC,PP_NUM,PP_POS,N_TYPES,LOOKUP,             ROTATE1.47     
     *                  FIXHD,U_FIELD,COEFFA,COEFFB,NFT,MODE,              ROTATE1.48     
     *                  C_GRID_OUT,C_GRID_IN,N_FIELDS,                     ROTATE1.49     
     *                  U_ROWS_IN,U_ROWS_OUT,REALHD,                       UIE2F404.364    
     *                  ROW_LENGTH_OUT,ROW_LENGTH_IN,POSU,POSV)            ROTATE1.50     
                                                                           ROTATE1.51     
      IMPLICIT NONE                                                        ROTATE1.52     
                                                                           ROTATE1.53     
      INTEGER                                                              ROTATE1.54     
     * U_FIELD            !IN Number of u points                           ROTATE1.55     
     *,V_FIELD            !IN Number of v points                           ROTATE1.56     
     *,N_TYPES            !IN Number of different STASH item codes         ROTATE1.57     
     *,N_FIELDS           !IN Number of u/v fields                         ROTATE1.58     
     *,U_ROWS_IN          !IN Row length of input grid                     UIE2F404.365    
     &,POINTS_PHI_SRCE                                                     UIE2F404.366    
     *,ROW_LENGTH_IN      !IN Row length of input grid                     ROTATE1.59     
     *,U_ROWS_OUT         !IN Row length of input grid                     UIE2F404.367    
     *,ROW_LENGTH_OUT     !IN Row length of output grid                    ROTATE1.60     
     *,MODE               !IN =0 eq -> latlon; =1 latlon -> eq             ROTATE1.61     
     *,PP_ITEMC(N_TYPES)  !IN Item codes                                   ROTATE1.62     
     *,PP_NUM(N_TYPES)    !IN No of fields                                 ROTATE1.63     
     *,PP_POS(N_TYPES)    !IN Position                                     ROTATE1.64     
     *,LOOKUP(*)          !IN Lookup tables                                ROTATE1.65     
     *,FIXHD(*)           !IN Fixed length header                          ROTATE1.66     
     *,NFT                !IN Unit number                                  ROTATE1.67     
                                                                           ROTATE1.68     
      REAL                                                                 ROTATE1.69     
     * COEFFA(U_FIELD,2)    !IN Coeff of rotation. 1=upt;2=vpt             ROTATE1.70     
     *,COEFFB(U_FIELD,2)    !IN Coeff of rotation. 1=upt;2=vpt             ROTATE1.71     
     *,REALHD(*)                                                           UIE2F404.368    
                                                                           ROTATE1.72     
C Local arrays:--------------------------------------------------------    ROTATE1.73     
      REAL                                                                 ROTATE1.74     
     * U(U_FIELD*N_FIELDS)     !   u comp of wind before rotation          ROTATE1.75     
     *,V(U_FIELD*N_FIELDS)     !   v comp of wind before rotation          ROTATE1.76     
     *,U_ROT(U_FIELD*N_FIELDS) !   u comp of wind after rotation           ROTATE1.77     
     *,V_ROT(U_FIELD*N_FIELDS) !   v comp of wind after rotation           ROTATE1.78     
     *,U_TMP(U_FIELD*N_FIELDS) ! Used to prevent overwriting of U_ROT      ROTATE1.79     
     *,U_TMP2(U_FIELD)                                                     UIE2F404.369    
     *,V_TMP(U_FIELD) ! Used to prevent overwriting of U_ROT               UIE2F404.370    
     *                      ! on second calls to W_EQTOLL & W_LLTOEQ       ROTATE1.80     
                                                                           ROTATE1.81     
!   Array  arguments with intent(Out):                                     UIE2F404.371    
                                                                           UIE2F404.372    
      INTEGER      INDEX_B_L(U_FIELD)                                      UIE2F404.373    
      INTEGER      INDEX_B_R(U_FIELD)                                      UIE2F404.374    
      REAL         WEIGHT_T_R(U_FIELD) ! Weights for bilinear              UIE2F404.375    
      REAL         WEIGHT_B_R(U_FIELD) !\horizontal interpolatn            UIE2F404.376    
      REAL         WEIGHT_T_L(U_FIELD) !/ 1=P-pts; 2=U-pts;                UIE2F404.377    
      REAL         WEIGHT_B_L(U_FIELD) ! 3=V-pts;4=zonal mea               UIE2F404.378    
      REAL         D_LAMBDA_IN(2)                                          UIE2F404.379    
      REAL         D_LAMBDA_OUT(2)                                         UIE2F404.380    
      REAL         D_PHI_IN(2)                                             UIE2F404.381    
      REAL         D_PHI_OUT(2)                                            UIE2F404.382    
      REAL         LAMBDA_IN_U(U_FIELD)                                    UIE2F404.383    
      REAL         LAMBDA_IN_V(U_FIELD)                                    UIE2F404.384    
      REAL         PHI_IN_U(U_FIELD)                                       UIE2F404.385    
      REAL         PHI_IN_V(U_FIELD)                                       UIE2F404.386    
      REAL         LAMBDA_OUT_U(U_FIELD)                                   UIE2F404.387    
      REAL         LAMBDA_OUT_V(U_FIELD)                                   UIE2F404.388    
      REAL         PHI_OUT_U(U_FIELD)                                      UIE2F404.389    
      REAL         PHI_OUT_V(U_FIELD)                                      UIE2F404.390    
! Dynamic arrays for horizontal interpolation                              UIE2F404.391    
      INTEGER      AW_INDEX_TARG_LHS(ROW_LENGTH_OUT+1)                     UIE2F404.392    
                                    !Index of source box overlapping       UIE2F404.393    
                                    !lhs of target grid-box                UIE2F404.394    
      INTEGER      AW_INDEX_TARG_TOP(U_ROWS_OUT+1)                         UIE2F404.395    
                                    !Index of source box overlapping       UIE2F404.396    
                                    !top of target grid-box                UIE2F404.397    
      REAL         AW_AREA_BOX                                             UIE2F404.398    
                                    !area of grid box in sq units of       UIE2F404.399    
      REAL         AW_COLAT_T(U_ROWS_OUT+1)                                UIE2F404.400    
                                    !Colatitude of top of target grd-box   UIE2F404.401    
                                    ! (in units of DELTA_LAT_SRCE)         UIE2F404.402    
      REAL         AW_LONG_L(ROW_LENGTH_OUT+1)                             UIE2F404.403    
                                    !Left longitude of target grid-box     UIE2F404.404    
                                    ! (in units of DELTA_LONG_SRCE)        UIE2F404.405    
      REAL         DELTA_LAT_SOURCE !\                                     UIE2F404.406    
      REAL         DELTA_LAT_TARGET ! \Grid spacing                        UIE2F404.407    
      REAL         DELTA_LON_SOURCE ! /                                    UIE2F404.408    
      REAL         DELTA_LON_TARGET                                        UIE2F404.409    
      REAL         NPOLE_LAT_SOURCE !\                                     UIE2F404.410    
      REAL         NPOLE_LAT_TARGET ! \North pole coordinatest             UIE2F404.411    
      REAL         NPOLE_LON_SOURCE ! /                                    UIE2F404.412    
      REAL         NPOLE_LON_TARGET !/                                     UIE2F404.413    
      REAL         START_LAT_SOURCE !\                                     UIE2F404.414    
      REAL         START_LAT_TARGET ! \Coordinates of first data point     UIE2F404.415    
      REAL         START_LON_SOURCE ! /                                    UIE2F404.416    
      REAL         START_LON_TARGET !/                                     UIE2F404.417    
      LOGICAL      ROT_IN           !T= Source grid has rotated coords     UIE2F404.418    
      LOGICAL      ROT_OUT                                                 UIE2F404.419    
                                                                           UIE2F404.420    
                                                                           UIE2F404.421    
                                                                           UIE2F404.422    
C*L External subroutines called:---------------------------------------    ROTATE1.82     
      EXTERNAL LOCATE,READFLDS,W_EQTOLL, W_LLTOEQ,WRITFLDS,ABORT_IO        ROTATE1.83     
C*---------------------------------------------------------------------    ROTATE1.84     
! Comdecks:------------------------------------------------------------    ROTATE1.85     
*CALL CSUBMODL                                                             ROTATE1.86     
*CALL CPPXREF                                                              ROTATE1.87     
*CALL PPXLOOK                                                              ROTATE1.88     
*CALL CPHINT                                                               UIE2F404.423    
C Local variables:-----------------------------------------------------    ROTATE1.89     
      INTEGER                                                              ROTATE1.90     
     * POSU               !   Position of u field on file                  ROTATE1.91     
     *,POSV               !   Position of v field on file                  ROTATE1.92     
     &,POSLU              !   Position (level) in u field.                 ROTATE1.93     
     &,POSLV              !   Position (level) in v field.                 ROTATE1.94     
     *,I,J,K,IJ           !   Do loop index                                UIE2F404.424    
     *,ICODE              !   Return code; successful=0; error > 0         ROTATE1.96     
                                                                           ROTATE1.97     
      CHARACTER*100                                                        ROTATE1.98     
     * CMESSAGE           !   Error message if ICODE > 0                   ROTATE1.99     
                                                                           ROTATE1.100    
      LOGICAL                                                              ROTATE1.101    
     * C_GRID_IN                                                           ROTATE1.102    
     *,C_GRID_OUT                                                          ROTATE1.103    
C----------------------------------------------------------------------    ROTATE1.104    
                                                                           ROTATE1.105    
CL 1. Calculate dimensions of v field                                      ROTATE1.106    
      IF(C_GRID_OUT.AND.(MODE.EQ.1)) THEN                                  ROTATE1.107    
        V_FIELD = U_FIELD -ROW_LENGTH_OUT                                  ROTATE1.108    
      ELSE IF(C_GRID_IN.AND.(MODE.EQ.0)) THEN                              ROTATE1.109    
        V_FIELD = U_FIELD -ROW_LENGTH_IN                                   ROTATE1.110    
      ELSE                                                                 ROTATE1.111    
        V_FIELD = U_FIELD                                                  ROTATE1.112    
      ENDIF                                                                ROTATE1.113    
                                                                           ROTATE1.114    
CL 2. Loop over number of levels processing each level in turn             ROTATE1.115    
                                                                           ROTATE1.116    
                                                                           ROTATE1.117    
*IF DEF,TIMER                                                              ROTATE1.118    
      CALL TIMER('READFLDS',3)                                             ROTATE1.119    
*ENDIF                                                                     ROTATE1.120    
                                                                           ROTATE1.121    
      CALL READFLDS(NFT,N_FIELDS,PP_POS(POSU),                             ROTATE1.122    
     &          LOOKUP,64,U,U_FIELD,FIXHD,                                 ROTATE1.123    
*CALL ARGPPX                                                               ROTATE1.124    
     &          ICODE,CMESSAGE)                                            ROTATE1.125    
      IF(ICODE.NE.0)CALL ABORT_IO('CONTROL',CMESSAGE,ICODE,NFT)            ROTATE1.126    
      CALL READFLDS(NFT,N_FIELDS,PP_POS(POSV),                             ROTATE1.127    
     &          LOOKUP,64,V,U_FIELD,FIXHD,                                 ROTATE1.128    
*CALL ARGPPX                                                               ROTATE1.129    
     &          ICODE,CMESSAGE)                                            ROTATE1.130    
      IF(ICODE.NE.0)CALL ABORT_IO('CONTROL',CMESSAGE,ICODE,NFT)            ROTATE1.131    
                                                                           ROTATE1.132    
*IF DEF,TIMER                                                              ROTATE1.133    
      CALL TIMER('READFLDS',4)                                             ROTATE1.134    
*ENDIF                                                                     ROTATE1.135    
                                                                           ROTATE1.136    
      DO K=1,N_FIELDS                                                      UIE2F404.425    
                                                                           ROTATE1.138    
      POSLU =(K-1)*U_FIELD                                                 UIE2F404.426    
      POSLV =(K-1)*V_FIELD                                                 UIE2F404.427    
                                                                           ROTATE1.141    
      IF(MODE.EQ.0)THEN                                                    ROTATE1.142    
                                                                           UIE2F404.428    
      IF (C_GRID_IN) THEN                                                  UIE2F404.429    
                                                                           UIE2F404.430    
!  Initialise local constants                                              UIE2F404.431    
                                                                           UIE2F404.432    
!  Coordinates of top left hand  p-point on grid                           UIE2F404.433    
         START_LAT_SOURCE=REALHD(ISLAT)                                    UIE2F404.434    
         START_LON_SOURCE=REALHD(ISLON)                                    UIE2F404.435    
                                                                           UIE2F404.436    
!  Coordinates of north pole on grid                                       UIE2F404.437    
         NPOLE_LAT_SOURCE=REALHD(IPLAT)                                    UIE2F404.438    
         NPOLE_LON_SOURCE=REALHD(IPLON)                                    UIE2F404.439    
                                                                           UIE2F404.440    
!  Grid spacing                                                            UIE2F404.441    
         DELTA_LAT_SOURCE=REALHD(IDLAT)                                    UIE2F404.442    
         DELTA_LON_SOURCE=REALHD(IDLON)                                    UIE2F404.443    
                                                                           UIE2F404.444    
!  Logical to indicate input grid is rotated                               UIE2F404.445    
         ROT_IN=NPOLE_LAT_SOURCE.NE.90..OR.NPOLE_LON_SOURCE.NE.0.          UIE2F404.446    
                                                                           UIE2F404.447    
!  Weights and indices for UV points on C grid:                            UIE2F404.448    
                                                                           UIE2F404.449    
         D_LAMBDA_IN(1)=0.5                                                UIE2F404.450    
         D_PHI_IN(1)=0.0                                                   UIE2F404.451    
         D_LAMBDA_IN(2)=0.0                                                UIE2F404.452    
         D_PHI_IN(2)=0.5                                                   UIE2F404.453    
                                                                           UIE2F404.454    
!  Lat and lon of target grid u,v points.                                  UIE2F404.455    
                                                                           UIE2F404.456    
        IJ=0                                                               UIE2F404.457    
        DO J=1,U_ROWS_IN                                                   UIE2F404.458    
          DO I=1,ROW_LENGTH_IN                                             UIE2F404.459    
            IJ=IJ+1                                                        UIE2F404.460    
            LAMBDA_IN_U(IJ)=START_LON_SOURCE+DELTA_LON_SOURCE              UIE2F404.461    
     &                   *(I-1+D_LAMBDA_IN(1))                             UIE2F404.462    
            LAMBDA_IN_V(IJ)=START_LON_SOURCE+DELTA_LON_SOURCE              UIE2F404.463    
     &                  *(I-1+D_LAMBDA_IN(2))                              UIE2F404.464    
          END DO                                                           UIE2F404.465    
        END DO                                                             UIE2F404.466    
        IJ=0                                                               UIE2F404.467    
        DO I=1,ROW_LENGTH_IN                                               UIE2F404.468    
          DO J=1,U_ROWS_IN                                                 UIE2F404.469    
            IJ=IJ+1                                                        UIE2F404.470    
            PHI_IN_V(IJ)=START_LAT_SOURCE-DELTA_LAT_SOURCE                 UIE2F404.471    
     &               *(J-1+D_PHI_IN(2))                                    UIE2F404.472    
          END DO                                                           UIE2F404.473    
        END DO                                                             UIE2F404.474    
        IJ=0                                                               UIE2F404.475    
        DO J=1,U_ROWS_IN                                                   UIE2F404.476    
          DO I=1,ROW_LENGTH_IN                                             UIE2F404.477    
            IJ=IJ+1                                                        UIE2F404.478    
            PHI_IN_U(IJ)=START_LAT_SOURCE-DELTA_LAT_SOURCE                 UIE2F404.479    
     &                *(J-1+D_PHI_IN(1))                                   UIE2F404.480    
          END DO                                                           UIE2F404.481    
        END DO                                                             UIE2F404.482    
        POINTS_PHI_SRCE=U_ROWS_IN                                          UIE2F404.483    
                                                                           UIE2F404.484    
!  Scale longitude of LAM input grid to make it monotonically increasing   UIE2F404.485    
          IF(ROT_IN)THEN                                                   UIE2F404.486    
            DO J=1,U_FIELD                                                 UIE2F404.487    
              IF(LAMBDA_IN_U(J).GT.180.)THEN                               UIE2F404.488    
                LAMBDA_IN_U(J)=LAMBDA_IN_U(J)-360.                         UIE2F404.489    
              ELSE                                                         UIE2F404.490    
                LAMBDA_IN_U(J)=LAMBDA_IN_U(J)                              UIE2F404.491    
              ENDIF                                                        UIE2F404.492    
                                                                           UIE2F404.493    
              IF(LAMBDA_IN_V(J).GT.180.)THEN                               UIE2F404.494    
                LAMBDA_IN_V(J)=LAMBDA_IN_V(J)-360.                         UIE2F404.495    
              ELSE                                                         UIE2F404.496    
                LAMBDA_IN_V(J)=LAMBDA_IN_V(J)                              UIE2F404.497    
              ENDIF                                                        UIE2F404.498    
                                                                           UIE2F404.499    
            END DO                                                         UIE2F404.500    
          END IF                                                           UIE2F404.501    
                                                                           UIE2F404.502    
!  Indices and weights for horizontal interpolation                        UIE2F404.503    
                                                                           UIE2F404.504    
*IF DEF,TIMER                                                              UIE2F404.505    
      CALL TIMER('HINTCO1  ',3)                                            UIE2F404.506    
*ENDIF                                                                     UIE2F404.507    
         CALL H_INT_CO(INDEX_B_L,INDEX_B_R                                 UIE2F404.508    
     &,               WEIGHT_T_R,WEIGHT_B_R                                UIE2F404.509    
     &,               WEIGHT_T_L,WEIGHT_B_L                                UIE2F404.510    
     &,               LAMBDA_IN_V,PHI_IN_V,LAMBDA_IN_U,PHI_IN_U            UIE2F404.511    
     &,               ROW_LENGTH_IN,POINTS_PHI_SRCE-1,U_FIELD,.FALSE.)     UIE2F404.512    
*IF DEF,TIMER                                                              UIE2F404.513    
      CALL TIMER('HINTCO1  ',4)                                            UIE2F404.514    
*ENDIF                                                                     UIE2F404.515    
                                                                           UIE2F404.516    
!  Interpolate C grid v points onto the positions of u points              UIE2F404.517    
!  to be consistent with equations 5.19 and 5.20.                          UIE2F404.518    
                                                                           UIE2F404.519    
*IF DEF,TIMER                                                              UIE2F404.520    
      CALL TIMER('HINTCTL',3)                                              UIE2F404.521    
*ENDIF                                                                     UIE2F404.522    
         CALL H_INT_CTL(1,U_FIELD,ROW_LENGTH_IN,ROW_LENGTH_IN              UIE2F404.523    
     &,              U_ROWS_IN-1,U_ROWS_IN,AW_AREA_BOX                     UIE2F404.524    
     &,              .FALSE.,.FALSE.                                       UIE2F404.525    
     &,              AW_INDEX_TARG_LHS,AW_INDEX_TARG_TOP                   UIE2F404.526    
     &,              INDEX_B_L,INDEX_B_R                                   UIE2F404.527    
     &,              AW_COLAT_T,AW_LONG_L                                  UIE2F404.528    
     &,              V(POSLV+1)                                            UIE2F404.529    
     &,              WEIGHT_T_R,WEIGHT_B_R                                 UIE2F404.530    
     &,              WEIGHT_T_L,WEIGHT_B_L                                 UIE2F404.531    
     &,              V_TMP(1))                                             UIE2F404.532    
*IF DEF,TIMER                                                              UIE2F404.533    
      CALL TIMER('HINTCTL',4)                                              UIE2F404.534    
*ENDIF                                                                     UIE2F404.535    
                                                                           UIE2F404.536    
      ELSE                                                                 UIE2F404.537    
                                                                           UIE2F404.538    
! u,v data on B grid points have the same location.                        UIE2F404.539    
        DO J=1,V_FIELD                                                     UIE2F404.540    
         V_TMP(J) = V(POSLV+J)                                             UIE2F404.541    
        END DO                                                             UIE2F404.542    
                                                                           UIE2F404.543    
      ENDIF                                                                UIE2F404.544    
                                                                           UIE2F404.545    
*IF DEF,TIMER                                                              ROTATE1.143    
      CALL TIMER('W_EQTOLL',3)                                             ROTATE1.144    
*ENDIF                                                                     ROTATE1.145    
      CALL W_EQTOLL(COEFFA,COEFFB,U(POSLU+1),V_TMP(1),                     UIE2F404.546    
     &             U_ROT(POSLU+1),V_ROT(POSLV+1),U_FIELD,V_FIELD)          ROTATE1.148    
*IF DEF,TIMER                                                              UIE2F404.547    
      CALL TIMER('W_EQTOLL',4)                                             UIE2F404.548    
*ENDIF                                                                     UIE2F404.549    
                                                                           UIE2F404.550    
      IF (C_GRID_IN) THEN                                                  UIE2F404.551    
                                                                           UIE2F404.552    
!  Recalculate Latitude of target grid u,v points for input to             UIE2F404.553    
!  routine H_INT_CO .                                                      UIE2F404.554    
        IJ=0                                                               UIE2F404.555    
        DO J=1,U_ROWS_IN                                                   UIE2F404.556    
          DO I=1,ROW_LENGTH_IN                                             UIE2F404.557    
            IJ=IJ+1                                                        UIE2F404.558    
            PHI_IN_V(IJ)=START_LAT_SOURCE-DELTA_LAT_SOURCE                 UIE2F404.559    
     &               *(J-1+D_PHI_IN(2))                                    UIE2F404.560    
          END DO                                                           UIE2F404.561    
        END DO                                                             UIE2F404.562    
        IJ=0                                                               UIE2F404.563    
        DO I=1,ROW_LENGTH_IN                                               UIE2F404.564    
          DO J=1,U_ROWS_IN                                                 UIE2F404.565    
            IJ=IJ+1                                                        UIE2F404.566    
            PHI_IN_U(IJ)=START_LAT_SOURCE-DELTA_LAT_SOURCE                 UIE2F404.567    
     &                *(J-1+D_PHI_IN(1))                                   UIE2F404.568    
          END DO                                                           UIE2F404.569    
        END DO                                                             UIE2F404.570    
                                                                           UIE2F404.571    
!  Indices and weights for horizontal interpolation                        UIE2F404.572    
*IF DEF,TIMER                                                              UIE2F404.573    
      CALL TIMER('HINTCO1  ',3)                                            UIE2F404.574    
*ENDIF                                                                     UIE2F404.575    
         CALL H_INT_CO(INDEX_B_L,INDEX_B_R                                 UIE2F404.576    
     &,               WEIGHT_T_R,WEIGHT_B_R                                UIE2F404.577    
     &,               WEIGHT_T_L,WEIGHT_B_L                                UIE2F404.578    
     &,               LAMBDA_IN_U,PHI_IN_U,LAMBDA_IN_V,PHI_IN_V            UIE2F404.579    
     &,               ROW_LENGTH_IN,POINTS_PHI_SRCE,V_FIELD,.FALSE.)       UIE2F404.580    
*IF DEF,TIMER                                                              UIE2F404.581    
      CALL TIMER('HINTCO1  ',4)                                            UIE2F404.582    
*ENDIF                                                                     UIE2F404.583    
                                                                           UIE2F404.584    
      ! Interpolate C grid u points onto the positions of v points         UIE2F404.585    
      ! to be consistent with equations 5.19 and 5.20.                     UIE2F404.586    
*IF DEF,TIMER                                                              UIE2F404.587    
      CALL TIMER('HINTCTL',3)                                              UIE2F404.588    
*ENDIF                                                                     UIE2F404.589    
      CALL H_INT_CTL(1,V_FIELD,ROW_LENGTH_IN,ROW_LENGTH_IN                 UIE2F404.590    
     &,              U_ROWS_IN,U_ROWS_IN-1,AW_AREA_BOX                     UIE2F404.591    
     &,              .FALSE.,.FALSE.                                       UIE2F404.592    
     &,              AW_INDEX_TARG_LHS,AW_INDEX_TARG_TOP                   UIE2F404.593    
     &,              INDEX_B_L,INDEX_B_R                                   UIE2F404.594    
     &,              AW_COLAT_T,AW_LONG_L                                  UIE2F404.595    
     &,              U(POSLU+1)                                            UIE2F404.596    
     &,              WEIGHT_T_R,WEIGHT_B_R                                 UIE2F404.597    
     &,              WEIGHT_T_L,WEIGHT_B_L                                 UIE2F404.598    
     &,              U_TMP2(1))                                            UIE2F404.599    
*IF DEF,TIMER                                                              UIE2F404.600    
      CALL TIMER('HINTCTL',4)                                              UIE2F404.601    
*ENDIF                                                                     UIE2F404.602    
                                                                           UIE2F404.603    
      ELSE                                                                 UIE2F404.604    
                                                                           UIE2F404.605    
! u,v data on B grid points have the same location.                        UIE2F404.606    
        DO J=1,U_FIELD                                                     UIE2F404.607    
         U_TMP2(J) = U(POSLU+J)                                            UIE2F404.608    
        END DO                                                             UIE2F404.609    
                                                                           UIE2F404.610    
      ENDIF                                                                UIE2F404.611    
                                                                           UIE2F404.612    
*IF DEF,TIMER                                                              UIE2F404.613    
      CALL TIMER('W_EQTOLL',3)                                             UIE2F404.614    
*ENDIF                                                                     UIE2F404.615    
      CALL W_EQTOLL(COEFFA(1,2),COEFFB(1,2),U_TMP2(1),V(POSLV+1),          UIE2F404.616    
     &              U_TMP(POSLU+1),V_ROT(POSLV+1),V_FIELD,V_FIELD)         UIE2F404.617    
                                                                           ROTATE1.151    
*IF DEF,TIMER                                                              ROTATE1.152    
      CALL TIMER('W_EQTOLL',4)                                             ROTATE1.153    
*ENDIF                                                                     ROTATE1.154    
       ENDIF                                                               ROTATE1.155    
                                                                           ROTATE1.156    
      IF(MODE.EQ.1)THEN                                                    ROTATE1.157    
                                                                           UIE2F404.618    
      IF (C_GRID_OUT) THEN                                                 UIE2F404.619    
                                                                           UIE2F404.620    
!  Initialise local constants                                              UIE2F404.621    
                                                                           UIE2F404.622    
!  Coordinates of top left hand  p-point on grid                           UIE2F404.623    
      START_LAT_TARGET=REALHD(ISLAT)                                       UIE2F404.624    
      START_LON_TARGET=REALHD(ISLON)                                       UIE2F404.625    
                                                                           UIE2F404.626    
!  Coordinates of north pole on grid                                       UIE2F404.627    
      NPOLE_LAT_TARGET=REALHD(IPLAT)                                       UIE2F404.628    
      NPOLE_LON_TARGET=REALHD(IPLON)                                       UIE2F404.629    
                                                                           UIE2F404.630    
!  Grid spacing                                                            UIE2F404.631    
      DELTA_LAT_TARGET=REALHD(IDLAT)                                       UIE2F404.632    
      DELTA_LON_TARGET=REALHD(IDLON)                                       UIE2F404.633    
                                                                           UIE2F404.634    
!  Logical to indicate output grid is rotated                              UIE2F404.635    
      ROT_OUT=NPOLE_LAT_TARGET.NE.90..OR.NPOLE_LON_TARGET.NE.0.            UIE2F404.636    
                                                                           UIE2F404.637    
!  Weights and indices for UV points on C grid:                            UIE2F404.638    
      D_LAMBDA_OUT(1)=0.5                                                  UIE2F404.639    
      D_PHI_OUT(1)=0.0                                                     UIE2F404.640    
      D_LAMBDA_OUT(2)=0.0                                                  UIE2F404.641    
      D_PHI_OUT(2)=0.5                                                     UIE2F404.642    
                                                                           UIE2F404.643    
!  Lat and lon of target grid u,v points.                                  UIE2F404.644    
        IJ=0                                                               UIE2F404.645    
        DO J=1,U_ROWS_OUT                                                  UIE2F404.646    
          DO I=1,ROW_LENGTH_OUT                                            UIE2F404.647    
            IJ=IJ+1                                                        UIE2F404.648    
            LAMBDA_OUT_U(IJ)=START_LON_TARGET+DELTA_LON_TARGET             UIE2F404.649    
     &                   *(I-1+D_LAMBDA_OUT(1))                            UIE2F404.650    
            LAMBDA_OUT_V(IJ)=START_LON_TARGET+DELTA_LON_TARGET             UIE2F404.651    
     &                  *(I-1+D_LAMBDA_OUT(2))                             UIE2F404.652    
          END DO                                                           UIE2F404.653    
        END DO                                                             UIE2F404.654    
        IJ=0                                                               UIE2F404.655    
        DO I=1,ROW_LENGTH_OUT                                              UIE2F404.656    
          DO J=1,U_ROWS_OUT                                                UIE2F404.657    
            IJ=IJ+1                                                        UIE2F404.658    
            PHI_OUT_V(IJ)=START_LAT_TARGET-DELTA_LAT_TARGET                UIE2F404.659    
     &               *(J-1+D_PHI_OUT(2))                                   UIE2F404.660    
          END DO                                                           UIE2F404.661    
        END DO                                                             UIE2F404.662    
        IJ=0                                                               UIE2F404.663    
        DO J=1,U_ROWS_OUT                                                  UIE2F404.664    
          DO I=1,ROW_LENGTH_OUT                                            UIE2F404.665    
            IJ=IJ+1                                                        UIE2F404.666    
            PHI_OUT_U(IJ)=START_LAT_TARGET-DELTA_LAT_TARGET                UIE2F404.667    
     &                *(J-1+D_PHI_OUT(1))                                  UIE2F404.668    
          END DO                                                           UIE2F404.669    
        END DO                                                             UIE2F404.670    
        POINTS_PHI_SRCE=U_ROWS_OUT                                         UIE2F404.671    
                                                                           UIE2F404.672    
!  Scale longitude of LAM target grid to make it monotonically increasin   UIE2F404.673    
          IF(ROT_OUT)THEN                                                  UIE2F404.674    
            DO J=1,U_FIELD                                                 UIE2F404.675    
              IF(LAMBDA_OUT_U(J).GT.180.)THEN                              UIE2F404.676    
                LAMBDA_OUT_U(J)=LAMBDA_OUT_U(J)-360.                       UIE2F404.677    
              ELSE                                                         UIE2F404.678    
                LAMBDA_OUT_U(J)=LAMBDA_OUT_U(J)                            UIE2F404.679    
              ENDIF                                                        UIE2F404.680    
                                                                           UIE2F404.681    
              IF(LAMBDA_OUT_V(J).GT.180.)THEN                              UIE2F404.682    
                LAMBDA_OUT_V(J)=LAMBDA_OUT_V(J)-360.                       UIE2F404.683    
              ELSE                                                         UIE2F404.684    
                LAMBDA_OUT_V(J)=LAMBDA_OUT_V(J)                            UIE2F404.685    
              ENDIF                                                        UIE2F404.686    
                                                                           UIE2F404.687    
            END DO                                                         UIE2F404.688    
          END IF                                                           UIE2F404.689    
                                                                           UIE2F404.690    
                                                                           UIE2F404.691    
! Indices and weights for horizontal interpolation                         UIE2F404.692    
*IF DEF,TIMER                                                              UIE2F404.693    
      CALL TIMER('HINTCO1  ',3)                                            UIE2F404.694    
*ENDIF                                                                     UIE2F404.695    
         CALL H_INT_CO(INDEX_B_L,INDEX_B_R                                 UIE2F404.696    
     &,               WEIGHT_T_R,WEIGHT_B_R                                UIE2F404.697    
     &,               WEIGHT_T_L,WEIGHT_B_L                                UIE2F404.698    
     &,               LAMBDA_OUT_V,PHI_OUT_V,LAMBDA_OUT_U,PHI_OUT_U        UIE2F404.699    
     &,               ROW_LENGTH_OUT,POINTS_PHI_SRCE-1,U_FIELD,.FALSE.)    UIE2F404.700    
*IF DEF,TIMER                                                              UIE2F404.701    
      CALL TIMER('HINTCO1  ',4)                                            UIE2F404.702    
*ENDIF                                                                     UIE2F404.703    
                                                                           UIE2F404.704    
! Interpolate C grid v points onto the positions of u points               UIE2F404.705    
! to be consistent with equations 5.19 and 5.20.                           UIE2F404.706    
*IF DEF,TIMER                                                              UIE2F404.707    
      CALL TIMER('HINTCTL',3)                                              UIE2F404.708    
*ENDIF                                                                     UIE2F404.709    
      CALL H_INT_CTL(1,U_FIELD,ROW_LENGTH_OUT,ROW_LENGTH_OUT               UIE2F404.710    
     &,              U_ROWS_OUT-1,U_ROWS_OUT,AW_AREA_BOX                   UIE2F404.711    
     &,              .FALSE.,.FALSE.                                       UIE2F404.712    
     &,              AW_INDEX_TARG_LHS,AW_INDEX_TARG_TOP                   UIE2F404.713    
     &,              INDEX_B_L,INDEX_B_R                                   UIE2F404.714    
     &,              AW_COLAT_T,AW_LONG_L                                  UIE2F404.715    
     &,              V(POSLV+1)                                            UIE2F404.716    
     &,              WEIGHT_T_R,WEIGHT_B_R                                 UIE2F404.717    
     &,              WEIGHT_T_L,WEIGHT_B_L                                 UIE2F404.718    
     &,              V_TMP(1))                                             UIE2F404.719    
*IF DEF,TIMER                                                              UIE2F404.720    
      CALL TIMER('HINTCTL',4)                                              UIE2F404.721    
*ENDIF                                                                     UIE2F404.722    
                                                                           UIE2F404.723    
      ELSE                                                                 UIE2F404.724    
                                                                           UIE2F404.725    
! u,v data on B grid points have the same location.                        UIE2F404.726    
        DO J=1,V_FIELD                                                     UIE2F404.727    
         V_TMP(J) = V(POSLV+J)                                             UIE2F404.728    
        END DO                                                             UIE2F404.729    
                                                                           UIE2F404.730    
      ENDIF                                                                UIE2F404.731    
                                                                           UIE2F404.732    
*IF DEF,TIMER                                                              ROTATE1.158    
      CALL TIMER('W_LLTOEQ',3)                                             ROTATE1.159    
*ENDIF                                                                     ROTATE1.160    
      CALL W_LLTOEQ(COEFFA,COEFFB,U(POSLU+1),V_TMP(1),                     UIE2F404.733    
     &              U_ROT(POSLU+1),V_ROT(POSLV+1),U_FIELD,V_FIELD)         ROTATE1.163    
*IF DEF,TIMER                                                              UIE2F404.734    
      CALL TIMER('W_LLTOEQ',4)                                             UIE2F404.735    
*ENDIF                                                                     UIE2F404.736    
                                                                           UIE2F404.737    
!  Recalculate Latitude of target grid u,v points for input to             UIE2F404.738    
!  routine H_INT_CO .                                                      UIE2F404.739    
      IF (C_GRID_OUT) THEN                                                 UIE2F404.740    
        IJ=0                                                               UIE2F404.741    
        DO J=1,U_ROWS_OUT                                                  UIE2F404.742    
          DO I=1,ROW_LENGTH_OUT                                            UIE2F404.743    
            IJ=IJ+1                                                        UIE2F404.744    
            PHI_OUT_V(IJ)=START_LAT_TARGET-DELTA_LAT_TARGET                UIE2F404.745    
     &               *(J-1+D_PHI_OUT(2))                                   UIE2F404.746    
          END DO                                                           UIE2F404.747    
        END DO                                                             UIE2F404.748    
        IJ=0                                                               UIE2F404.749    
        DO I=1,ROW_LENGTH_OUT                                              UIE2F404.750    
          DO J=1,U_ROWS_OUT                                                UIE2F404.751    
            IJ=IJ+1                                                        UIE2F404.752    
            PHI_OUT_U(IJ)=START_LAT_TARGET-DELTA_LAT_TARGET                UIE2F404.753    
     &                *(J-1+D_PHI_OUT(1))                                  UIE2F404.754    
          END DO                                                           UIE2F404.755    
        END DO                                                             UIE2F404.756    
                                                                           UIE2F404.757    
!  Indices and weights for horizontal interpolation                        UIE2F404.758    
*IF DEF,TIMER                                                              UIE2F404.759    
      CALL TIMER('HINTCO1  ',3)                                            UIE2F404.760    
*ENDIF                                                                     UIE2F404.761    
         CALL H_INT_CO(INDEX_B_L,INDEX_B_R                                 UIE2F404.762    
     &,               WEIGHT_T_R,WEIGHT_B_R                                UIE2F404.763    
     &,               WEIGHT_T_L,WEIGHT_B_L                                UIE2F404.764    
     &,               LAMBDA_OUT_U,PHI_OUT_U,LAMBDA_OUT_V,PHI_OUT_V        UIE2F404.765    
     &,               ROW_LENGTH_OUT,POINTS_PHI_SRCE,V_FIELD,.FALSE.)      UIE2F404.766    
*IF DEF,TIMER                                                              UIE2F404.767    
      CALL TIMER('HINTCO1  ',4)                                            UIE2F404.768    
*ENDIF                                                                     UIE2F404.769    
                                                                           UIE2F404.770    
!  Interpolate C grid u points onto the positions of v points              UIE2F404.771    
!  to be consistent with equations 5.19 and 5.20.                          UIE2F404.772    
*IF DEF,TIMER                                                              UIE2F404.773    
      CALL TIMER('HINTCTL',3)                                              UIE2F404.774    
*ENDIF                                                                     UIE2F404.775    
      CALL H_INT_CTL(1,V_FIELD,ROW_LENGTH_OUT,ROW_LENGTH_OUT               UIE2F404.776    
     &,              U_ROWS_OUT,U_ROWS_OUT-1,AW_AREA_BOX                   UIE2F404.777    
     &,              .FALSE.,.FALSE.                                       UIE2F404.778    
     &,              AW_INDEX_TARG_LHS,AW_INDEX_TARG_TOP                   UIE2F404.779    
     &,              INDEX_B_L,INDEX_B_R                                   UIE2F404.780    
     &,              AW_COLAT_T,AW_LONG_L                                  UIE2F404.781    
     &,              U(POSLU+1)                                            UIE2F404.782    
     &,              WEIGHT_T_R,WEIGHT_B_R                                 UIE2F404.783    
     &,              WEIGHT_T_L,WEIGHT_B_L                                 UIE2F404.784    
     &,              U_TMP2(1))                                            UIE2F404.785    
*IF DEF,TIMER                                                              UIE2F404.786    
      CALL TIMER('HINTCTL',4)                                              UIE2F404.787    
*ENDIF                                                                     UIE2F404.788    
      ELSE                                                                 UIE2F404.789    
                                                                           UIE2F404.790    
! u,v data on B grid points have the same location.                        UIE2F404.791    
        DO J=1,U_FIELD                                                     UIE2F404.792    
         U_TMP2(J) = U(POSLU+J)                                            UIE2F404.793    
        END DO                                                             UIE2F404.794    
                                                                           UIE2F404.795    
      ENDIF                                                                UIE2F404.796    
                                                                           UIE2F404.797    
*IF DEF,TIMER                                                              UIE2F404.798    
      CALL TIMER('W_LLTOEQ',3)                                             UIE2F404.799    
*ENDIF                                                                     UIE2F404.800    
      CALL W_LLTOEQ(COEFFA(1,2),COEFFB(1,2),U_TMP2(1),V(POSLV+1),          UIE2F404.801    
     &              U_TMP(POSLU+1),V_ROT(POSLV+1),V_FIELD,V_FIELD)         UIE2F404.802    
                                                                           ROTATE1.166    
*IF DEF,TIMER                                                              ROTATE1.167    
      CALL TIMER('W_LLTOEQ',4)                                             ROTATE1.168    
*ENDIF                                                                     ROTATE1.169    
       ENDIF                                                               ROTATE1.170    
                                                                           ROTATE1.171    
      ENDDO                                                                ROTATE1.172    
                                                                           ROTATE1.173    
*IF DEF,TIMER                                                              ROTATE1.174    
      CALL TIMER('WRITFLDS',3)                                             ROTATE1.175    
*ENDIF                                                                     ROTATE1.176    
                                                                           ROTATE1.177    
      CALL WRITFLDS(NFT,N_FIELDS,PP_POS(POSU),                             ROTATE1.178    
     &          LOOKUP,64,U_ROT,U_FIELD,FIXHD,                             ROTATE1.179    
*CALL ARGPPX                                                               ROTATE1.180    
     &          ICODE,CMESSAGE)                                            ROTATE1.181    
      IF(ICODE.NE.0)CALL ABORT_IO('CONTROL',CMESSAGE,ICODE,NFT)            ROTATE1.182    
      CALL WRITFLDS(NFT,N_FIELDS,PP_POS(POSV),                             ROTATE1.183    
     &          LOOKUP,64,V_ROT,U_FIELD,FIXHD,                             ROTATE1.184    
*CALL ARGPPX                                                               ROTATE1.185    
     &          ICODE,CMESSAGE)                                            ROTATE1.186    
      IF(ICODE.NE.0)CALL ABORT_IO('CONTROL',CMESSAGE,ICODE,NFT)            ROTATE1.187    
                                                                           ROTATE1.188    
*IF DEF,TIMER                                                              ROTATE1.189    
      CALL TIMER('WRITFLDS',4)                                             ROTATE1.190    
*ENDIF                                                                     ROTATE1.191    
                                                                           ROTATE1.192    
      RETURN                                                               ROTATE1.193    
      END                                                                  ROTATE1.194    
*ENDIF                                                                     ROTATE1.195