*IF DEF,C93_1A,OR,DEF,C93_2A                                               GNF0F402.14     
C ******************************COPYRIGHT******************************    GTS2F400.3799   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.3800   
C                                                                          GTS2F400.3801   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.3802   
C restrictions as set forth in the contract.                               GTS2F400.3803   
C                                                                          GTS2F400.3804   
C                Meteorological Office                                     GTS2F400.3805   
C                London Road                                               GTS2F400.3806   
C                BRACKNELL                                                 GTS2F400.3807   
C                Berkshire UK                                              GTS2F400.3808   
C                RG12 2SZ                                                  GTS2F400.3809   
C                                                                          GTS2F400.3810   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.3811   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.3812   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.3813   
C Modelling at the above address.                                          GTS2F400.3814   
C ******************************COPYRIGHT******************************    GTS2F400.3815   
C                                                                          GTS2F400.3816   
CLL  SUBROUTINE H_GRAD--------------------------------------------------   HGRAD1A.3      
CLL                                                                        HGRAD1A.4      
CLL  PURPOSE:   Calculates the linear horizontal gradients of a field      HGRAD1A.5      
CLL  Tested under compiler CFT77                                           HGRAD1A.6      
CLL  Tested under OS version 5.1                                           HGRAD1A.7      
CLL                                                                        HGRAD1A.8      
CLL  Author J.T.Heming                                                     HGRAD1A.9      
CLL                                                                        HGRAD1A.10     
CLL  Code version 1.0         Date 22/02/91                                HGRAD1A.11     
CLL                                                                        HGRAD1A.12     
CLL  Model            Modification history from model version 3.0:         HGRAD1A.13     
CLL version  date                                                          HGRAD1A.14     
CLL vn4.2  07/11/96:Allow this routine to be used in C93_2A (Farnon)       GNF0F402.13     
CLL                                                                        HGRAD1A.15     
CLL vn4.2  18/03/97:MPP Changes - now hard-wired for U_Fields              GSM3F403.400    
CLL                 S.D. Mullerworth                                       GSM3F403.401    
!LL vn4.5  17/04/98 Make sure corner points initialised (FIRST_FLD_PT      GSM1F405.585    
!LL                 etc.) so routine is it into line with loop             GSM1F405.586    
!LL                 ranges in CAT S.D.Mullerworth                          GSM1F405.587    
CLL  Logical components covered                                            HGRAD1A.16     
CLL  Project TASK:                                                         HGRAD1A.17     
CLL                                                                        HGRAD1A.18     
CLL  Programming standard: U M DOC  Paper NO. 4,                           HGRAD1A.19     
CLL                                                                        HGRAD1A.20     
CLL  External documentation                                                HGRAD1A.21     
CLL                                                                        HGRAD1A.22     
CLLEND------------------------------------------------------------------   HGRAD1A.23     
C                                                                          HGRAD1A.24     
C*L  ARGUMENTS:---------------------------------------------------------   HGRAD1A.25     

      SUBROUTINE H_GRAD(                                                    2HGRAD1A.26     
*CALL ARGFLDPT                                                             GSM3F403.402    
C data and constants in                                                    HGRAD1A.27     
     & N,POINTS,SEC_LATITUDE,ROW_LENGTH,EW_SPACE,NS_SPACE,                 HGRAD1A.28     
C data out                                                                 HGRAD1A.29     
     & DN_DX,DN_DY)                                                        HGRAD1A.30     
C*                                                                         HGRAD1A.31     
C*L                                                                        HGRAD1A.32     
C-----------------------------------------------------------------------   HGRAD1A.33     
      IMPLICIT NONE                                                        HGRAD1A.34     
C-----------------------------------------------------------------------   HGRAD1A.35     
      INTEGER                                                              HGRAD1A.36     
     * POINTS        ! IN  NO OF POINTS ON REQUIRED GRID                   HGRAD1A.37     
     *,ROW_LENGTH    ! IN  NO OF COLUMNS                                   HGRAD1A.38     
C-----------------------------------------------------------------------   HGRAD1A.39     
      REAL                                                                 HGRAD1A.40     
     * N(POINTS)           ! IN  INPUT FIELD ON REQUIRED GRID              HGRAD1A.41     
     *,DN_DX(POINTS)       ! OUT HORIZONTAL GRADIENT IN THE X-DIRECTION    HGRAD1A.42     
     *,DN_DY(POINTS)       ! OUT HORIZONTAL GRADIENT IN THE Y-DIRECTION    HGRAD1A.43     
     *,SEC_LATITUDE(POINTS) ! IN  1/COS(LAT) ON REQUIRED GRID              HGRAD1A.44     
     *,EW_SPACE             ! IN  LONGITUDE GRID SPACING                   HGRAD1A.45     
     *,NS_SPACE             ! IN  LATITUDE GRID SPACING                    HGRAD1A.46     
     *                      !     BOTH THE ABOVE IN DEGREES                HGRAD1A.47     
C*                                                                         HGRAD1A.48     
C*L                                                                        HGRAD1A.49     
C-----------------------------------------------------------------------   HGRAD1A.50     
C Local Variables                                                          HGRAD1A.51     
C-----------------------------------------------------------------------   HGRAD1A.52     
      INTEGER                                                              HGRAD1A.53     
     * I,J                 !  LOOP COUNTERS                                HGRAD1A.54     
C-----------------------------------------------------------------------   HGRAD1A.55     
      REAL                                                                 HGRAD1A.56     
     * LONG_SI_OVER_TWO_A         ! LONGITUDE STEP INVERSE (IN RADIANS)    HGRAD1A.57     
     *                            ! DIVIDED BY (2*EARTH'S RADIUS(A))       HGRAD1A.58     
     *,LAT_SI_OVER_TWO_A          ! LATITUDE STEP INVERSE (IN RADIANS)     HGRAD1A.59     
     *                            ! DIVIDED BY (2*EARTH'S RADIUS(A))       HGRAD1A.60     
C-----------------------------------------------------------------------   HGRAD1A.61     
C Constants required : A=radius of Earth,                                  HGRAD1A.62     
C                      RECIP_PI_OVER_180=180/Pi                            HGRAD1A.63     
C-----------------------------------------------------------------------   HGRAD1A.64     
*CALL C_A                                                                  HGRAD1A.65     
*CALL C_PI                                                                 HGRAD1A.66     
*CALL TYPFLDPT                                                             GSM3F403.403    
C*----------------------------------------------------------------------   HGRAD1A.67     
C                                                                          HGRAD1A.68     
C     *N1  -  *N2    *N3     La  = Latitude                                HGRAD1A.69     
C          ^                 Lo  = Longitude                               HGRAD1A.70     
C         dLa                dLa = Latitude interval in radians            HGRAD1A.71     
C          ^                 dLo = Longitude interval in radians           HGRAD1A.72     
C     *N4  -  *N5    *N6     A   = Radius of Earth in metres               HGRAD1A.73     
C                            N1-9= Variable at model grid-points           HGRAD1A.74     
C     ^--dLo--^                                                            HGRAD1A.75     
C                                                                          HGRAD1A.76     
C     *N7     *N8    *N9                                                   HGRAD1A.77     
C                                                                          HGRAD1A.78     
C  dN        N3-N1           dN      N1-N7                                 HGRAD1A.79     
C  -- = ---------------      -- = -----------                              HGRAD1A.80     
C  dX   Cos(La)*2*dLo*A      dY     2*dLa*A                                HGRAD1A.81     
C                                                                          HGRAD1A.82     
C                                                                          HGRAD1A.83     
C-----------------------------------------------------------------------   HGRAD1A.84     
CL 1. Calculate 1/(2*dLo*A) and 1/(2*dLa*A)                                HGRAD1A.85     
C-----------------------------------------------------------------------   HGRAD1A.86     
      LONG_SI_OVER_TWO_A = 0.5*RECIP_PI_OVER_180/EW_SPACE/A                HGRAD1A.87     
      LAT_SI_OVER_TWO_A  = 0.5*RECIP_PI_OVER_180/NS_SPACE/A                HGRAD1A.88     
C=======================================================================   HGRAD1A.89     
C                                                                          HGRAD1A.90     
C=======================================================================   HGRAD1A.91     
CL 2.Calculate dN/dX and dN/dY for all points except first and last rows   HGRAD1A.92     
C-----------------------------------------------------------------------   HGRAD1A.93     
*IF DEF,MPP                                                                GSM3F403.404    
      DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO                         GSM1F405.588    
*ELSE                                                                      GSM3F403.406    
      DO I=ROW_LENGTH+1,POINTS-ROW_LENGTH                                  HGRAD1A.94     
*ENDIF                                                                     GSM3F403.407    
C                                                                          HGRAD1A.95     
        DN_DX(I)=(N(I+1)-N(I-1))*SEC_LATITUDE(I)*LONG_SI_OVER_TWO_A        HGRAD1A.96     
C                                                                          HGRAD1A.97     
        DN_DY(I)=(N(I-ROW_LENGTH)-N(I+ROW_LENGTH))*LONG_SI_OVER_TWO_A      HGRAD1A.98     
C                                                                          HGRAD1A.99     
      ENDDO                                                                HGRAD1A.100    
C-----------------------------------------------------------------------   HGRAD1A.101    
CL 3. Calculate dN/dX and dN/dY for first row                              HGRAD1A.102    
CL    dN/dY calculated by one-sided differences (extrapolation)            HGRAD1A.103    
C-----------------------------------------------------------------------   HGRAD1A.104    
*IF -DEF,MPP                                                               GSM3F403.408    
      DN_DY(1)=2.0*DN_DY(1+ROW_LENGTH)-DN_DY(1+2*ROW_LENGTH)               HGRAD1A.105    
*ENDIF                                                                     GSM3F403.409    
C                                                                          HGRAD1A.106    
*IF DEF,MPP                                                                GSM3F403.410    
      IF (at_top_of_LPG) THEN                                              GSM3F403.411    
      DO I=FIRST_FLD_PT+1,START_POINT_NO_HALO-1                            GSM1F405.589    
*ELSE                                                                      GSM3F403.413    
      DO I=2,ROW_LENGTH                                                    HGRAD1A.107    
*ENDIF                                                                     GSM3F403.414    
C                                                                          HGRAD1A.108    
        DN_DX(I)=(N(I+1)-N(I-1))*SEC_LATITUDE(I)*LONG_SI_OVER_TWO_A        HGRAD1A.109    
C                                                                          HGRAD1A.110    
        DN_DY(I)=2.0*DN_DY(I+ROW_LENGTH)-DN_DY(I+2*ROW_LENGTH)             HGRAD1A.111    
C                                                                          HGRAD1A.112    
      ENDDO                                                                HGRAD1A.113    
*IF DEF,MPP                                                                GSM3F403.415    
! Initialise first point on row                                            GSM1F405.590    
      DN_DX(FIRST_FLD_PT)=DN_DX(FIRST_FLD_PT+1)                            GSM1F405.591    
      DN_DY(FIRST_FLD_PT)=DN_DY(FIRST_FLD_PT+1)                            GSM1F405.592    
      END IF                                                               GSM3F403.416    
*ENDIF                                                                     GSM3F403.417    
C-----------------------------------------------------------------------   HGRAD1A.114    
CL 4. Calculate dN/dX and dN/dY for last row                               HGRAD1A.115    
CL    dN/dY calculated by one-sided differences (extrapolation)            HGRAD1A.116    
C-----------------------------------------------------------------------   HGRAD1A.117    
*IF -DEF,MPP                                                               GSM3F403.418    
      DN_DY(POINTS)=2.0*DN_DY(POINTS-ROW_LENGTH)-                          HGRAD1A.118    
     &  DN_DY(POINTS-2*ROW_LENGTH)                                         HGRAD1A.119    
*ENDIF                                                                     GSM3F403.419    
C                                                                          HGRAD1A.120    
*IF DEF,MPP                                                                GSM3F403.420    
      IF (at_base_of_LPG) THEN                                             GSM3F403.421    
      DO I=U_BOT_ROW_START,LAST_U_FLD_PT-1                                 GSM1F405.593    
*ELSE                                                                      GSM3F403.423    
      DO I=POINTS-ROW_LENGTH+1,POINTS-1                                    HGRAD1A.121    
*ENDIF                                                                     GSM3F403.424    
C                                                                          HGRAD1A.122    
        DN_DX(I)=(N(I+1)-N(I-1))*SEC_LATITUDE(I)*LONG_SI_OVER_TWO_A        HGRAD1A.123    
C                                                                          HGRAD1A.124    
        DN_DY(I)=2.0*DN_DY(I-ROW_LENGTH)-DN_DY(I-2*ROW_LENGTH)             HGRAD1A.125    
C                                                                          HGRAD1A.126    
      ENDDO                                                                HGRAD1A.127    
*IF DEF,MPP                                                                GSM3F403.425    
! Initialise last point on row                                             GSM1F405.594    
      DN_DX(LAST_U_FLD_PT)=DN_DX(LAST_U_FLD_PT-1)                          GSM1F405.595    
      DN_DY(LAST_U_FLD_PT)=DN_DY(LAST_U_FLD_PT-1)                          GSM1F405.596    
      ENDIF                                                                GSM3F403.426    
*ENDIF                                                                     GSM3F403.427    
*IF -DEF,MPP                                                               GSM3F403.428    
*IF DEF,GLOBAL                                                             HGRAD1A.128    
C-----------------------------------------------------------------------   HGRAD1A.129    
CL    GLOBAL only                                                          HGRAD1A.130    
CL 5. Recalculate dN/dX for first and last points in each row              HGRAD1A.131    
C-----------------------------------------------------------------------   HGRAD1A.132    
      DO I=1,POINTS-ROW_LENGTH+1,ROW_LENGTH                                HGRAD1A.133    
C                                                                          HGRAD1A.134    
        DN_DX(I)=(N(I+1)-N(I-1+ROW_LENGTH))*SEC_LATITUDE(I)                HGRAD1A.135    
     &  *LONG_SI_OVER_TWO_A                                                HGRAD1A.136    
C                                                                          HGRAD1A.137    
      ENDDO                                                                HGRAD1A.138    
C-----------------------------------------------------------------------   HGRAD1A.139    
      DO I=ROW_LENGTH,POINTS,ROW_LENGTH                                    HGRAD1A.140    
C                                                                          HGRAD1A.141    
        DN_DX(I)=(N(I+1-ROW_LENGTH)-N(I-1))*SEC_LATITUDE(I)                HGRAD1A.142    
     &  *LONG_SI_OVER_TWO_A                                                HGRAD1A.143    
C                                                                          HGRAD1A.144    
      ENDDO                                                                HGRAD1A.145    
*ELSE                                                                      HGRAD1A.146    
C-----------------------------------------------------------------------   HGRAD1A.147    
CL    LIMITED AREA only                                                    HGRAD1A.148    
CL 6. Recalculate dN/dX at the first and last points in each row           HGRAD1A.149    
CL    by one-sided differences (extrapolation of adjacent two points)      HGRAD1A.150    
C-----------------------------------------------------------------------   HGRAD1A.151    
      DO I=ROW_LENGTH,POINTS,ROW_LENGTH                                    HGRAD1A.152    
C                                                                          HGRAD1A.153    
        J=I-ROW_LENGTH+1                                                   HGRAD1A.154    
        DN_DX(I)=2.0*DN_DX(I-1)-DN_DX(I-2)                                 HGRAD1A.155    
        DN_DX(J)=2.0*DN_DX(J+1)-DN_DX(J+2)                                 HGRAD1A.156    
C                                                                          HGRAD1A.157    
      ENDDO                                                                HGRAD1A.158    
*ENDIF                                                                     GSM3F403.429    
*ENDIF                                                                     HGRAD1A.159    
C=======================================================================   HGRAD1A.160    
C     END OF SUBROUTINE H_GRAD                                             HGRAD1A.161    
C=======================================================================   HGRAD1A.162    
      RETURN                                                               HGRAD1A.163    
      END                                                                  HGRAD1A.164    
C=======================================================================   HGRAD1A.165    
*ENDIF                                                                     HGRAD1A.166