*IF DEF,C84_1A,OR,DEF,FLDOP,OR,DEF,FLDMOD                                  UIE3F404.17     
C ******************************COPYRIGHT******************************    GTS2F400.3403   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.3404   
C                                                                          GTS2F400.3405   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.3406   
C restrictions as set forth in the contract.                               GTS2F400.3407   
C                                                                          GTS2F400.3408   
C                Meteorological Office                                     GTS2F400.3409   
C                London Road                                               GTS2F400.3410   
C                BRACKNELL                                                 GTS2F400.3411   
C                Berkshire UK                                              GTS2F400.3412   
C                RG12 2SZ                                                  GTS2F400.3413   
C                                                                          GTS2F400.3414   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.3415   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.3416   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.3417   
C Modelling at the above address.                                          GTS2F400.3418   
C ******************************COPYRIGHT******************************    GTS2F400.3419   
C                                                                          GTS2F400.3420   
!  Routine: GRIB_TIME_INT ------------------------------------------       GRBTIM1A.3      
!                                                                          GRBTIM1A.4      
! Description :Given 2 dates and times find the time interval              GRBTIM1A.5      
!              between them and the appropriate time unit to use for       GRBTIM1A.6      
!              encoding grib.                                              GRBTIM1A.7      
!                                                                          GRBTIM1A.8      
!    Author:   R A Stratton    Reviewer : D Goddard                        GRBTIM1A.9      
!                                                                          GRBTIM1A.10     
! History:                                                                 GRBTIM1A.11     
! Version   Date     Comment                                               GRBTIM1A.12     
! -------   ----     -------                                               GRBTIM1A.13     
!  3.4    12/10/94   Original code. R A Stratton                           GRBTIM1A.14     
!                                                                          GRBTIM1A.15     
! Code Description:                                                        GRBTIM1A.16     
!   Language: FORTRAN 77 + common extensions.                              GRBTIM1A.17     
!   This code is written to UMDP3 v6 programming standards.                GRBTIM1A.18     
!                                                                          GRBTIM1A.19     
! System component covered: ?                                              GRBTIM1A.20     
! System Task: ?                                                           GRBTIM1A.21     
!                                                                          GRBTIM1A.22     
! --------------------------------------------------------------------     GRBTIM1A.23     
!                                                                          GRBTIM1A.24     

      SUBROUTINE GRIB_TIME_INT (I_YR1,I_MON1,I_DAY1,I_HR1,I_MIN1,           1GRBTIM1A.25     
     &                     I_YR2,I_MON2,I_DAY2,I_HR2,I_MIN2,               GRBTIM1A.26     
     &                     CAL360,TIME_INTERVAL,T_UNITS)                   GRBTIM1A.27     
!                                                                          GRBTIM1A.28     
      IMPLICIT NONE                                                        GRBTIM1A.29     
                                                                           GRBTIM1A.30     
      INTEGER                                                              GRBTIM1A.31     
     &     I_YR1,                 ! IN  - model time (years)               GRBTIM1A.32     
     &     I_MON1,                ! IN  - model time (months)              GRBTIM1A.33     
     &     I_DAY1,                ! IN  - model time (days)     T1         GRBTIM1A.34     
     &     I_HR1,                 ! IN  - model time (hours)               GRBTIM1A.35     
     &     I_MIN1,                ! IN  - model time (minutes)             GRBTIM1A.36     
     &     I_YR2,                 ! IN  - model time (years)               GRBTIM1A.37     
     &     I_MON2,                ! IN  - model time (months)              GRBTIM1A.38     
     &     I_DAY2,                ! IN  - model time (days)     T2         GRBTIM1A.39     
     &     I_HR2,                 ! IN  - model time (hours)               GRBTIM1A.40     
     &     I_MIN2,                ! IN  - model time (minutes)             GRBTIM1A.41     
     &     TIME_INTERVAL,         ! OUT - dt =t2-t1                        GRBTIM1A.42     
     &     T_UNITS                ! OUT - 1 hours,2 days,3 months          GRBTIM1A.43     
!                                         4 years                          GRBTIM1A.44     
      LOGICAL CAL360              ! IN - true if 360 day year              GRBTIM1A.45     
                                                                           GRBTIM1A.46     
!*------------------------------------------------------------------       GRBTIM1A.47     
!                                                                          GRBTIM1A.48     
!  Common blocks                                                           GRBTIM1A.49     
!                                                                          GRBTIM1A.50     
*CALL CDAYDATA                                                             GRBTIM1A.51     
!                                                                          GRBTIM1A.52     
!  Local variables                                                         GRBTIM1A.53     
!                                                                          GRBTIM1A.54     
      INTEGER                                                              GRBTIM1A.55     
     &   YEAR1,YEAR2       ! years                                         GRBTIM1A.56     
     &,  DAY1,DAY2         ! number of days since calendar zero            GRBTIM1A.57     
     &,  MINS_PER_MONTH    ! number of minutes in a month                  GRBTIM1A.58     
     &,  MINS_PER_YEAR     ! number of minutes in a year                   GRBTIM1A.59     
     &,  MINS_PER_DECADE   ! number of minutes in a decade                 GRBTIM1A.60     
     &,  MINS_PER_CENTURY  ! number of minutes in a century                GRBTIM1A.61     
     &,  TIME_INTMIN                                                       GRBTIM1A.62     
                                                                           GRBTIM1A.63     
!------------------------------------------------------------------        GRBTIM1A.64     
! 1. Add up days from time zero to specified time                          GRBTIM1A.65     
!                                                                          GRBTIM1A.66     
!                                                                          GRBTIM1A.67     
! 1.1 30-day month (360 day year) calendar                                 GRBTIM1A.68     
!                                                                          GRBTIM1A.69     
      IF (CAL360) THEN                                                     GRBTIM1A.70     
        DAY1 = 360*I_YR1+30*(I_MON1-1)+I_DAY1-1                            GRBTIM1A.71     
        DAY2 = 360*I_YR2+30*(I_MON2-1)+I_DAY2-1                            GRBTIM1A.72     
      ELSE                                                                 GRBTIM1A.73     
!                                                                          GRBTIM1A.74     
! 1.2 Gregorian calendar   - not tested available for completeness         GRBTIM1A.75     
!                            and possible future use.                      GRBTIM1A.76     
!                                                                          GRBTIM1A.77     
!     If leap year and after 28 February, adjust day number by one         GRBTIM1A.78     
        IF (MOD(I_YR1,4).EQ.0   .AND.                                      GRBTIM1A.79     
     &      (MOD(I_YR1,400).EQ.0 .OR. MOD(I_YR1,100).NE.0) .AND.           GRBTIM1A.80     
     &                                            I_MON1.GT.2) THEN        GRBTIM1A.81     
          DAY1 = I_DAY1+1                                                  GRBTIM1A.82     
        ELSE                                                               GRBTIM1A.83     
          DAY1 = I_DAY1                                                    GRBTIM1A.84     
        ENDIF                                                              GRBTIM1A.85     
        IF (MOD(I_YR2,4).EQ.0   .AND.                                      GRBTIM1A.86     
     &      (MOD(I_YR2,400).EQ.0 .OR. MOD(I_YR2,100).NE.0) .AND.           GRBTIM1A.87     
     &                                           I_MON2.GT.2) THEN         GRBTIM1A.88     
          DAY2 = I_DAY2+1                                                  GRBTIM1A.89     
        ELSE                                                               GRBTIM1A.90     
          DAY2 = I_DAY2                                                    GRBTIM1A.91     
        ENDIF                                                              GRBTIM1A.92     
!     Add on days in the preceding months in the year                      GRBTIM1A.93     
        DAY1 = DAY2 + DAYS_TO_MONTH(I_MON1) - 1                            GRBTIM1A.94     
        DAY2 = DAY1 + DAYS_TO_MONTH(I_MON2) - 1                            GRBTIM1A.95     
        YEAR1= I_YR1 - 1                                                   GRBTIM1A.96     
        YEAR2= I_YR2 - 1                                                   GRBTIM1A.97     
!     Add on days up to the specified year                                 GRBTIM1A.98     
        DAY1 =  DAY1+(YEAR1/400)*DAYS_PER_4C                               GRBTIM1A.99     
        DAY2 =  DAY2+(YEAR2/400)*DAYS_PER_4C                               GRBTIM1A.100    
        YEAR1 = YEAR1-(YEAR1/400)*400                                      GRBTIM1A.101    
        YEAR2 = YEAR2-(YEAR2/400)*400                                      GRBTIM1A.102    
        DAY1=  DAY1+(YEAR1/100)*DAYS_PER_C                                 GRBTIM1A.103    
        DAY2=  DAY2+(YEAR2/100)*DAYS_PER_C                                 GRBTIM1A.104    
        YEAR1 = YEAR1-(YEAR1/100)*100                                      GRBTIM1A.105    
        YEAR2 = YEAR2-(YEAR2/100)*100                                      GRBTIM1A.106    
        DAY1 =  DAY1+(YEAR1/4)*DAYS_PER_4Y                                 GRBTIM1A.107    
        DAY2 =  DAY2+(YEAR2/4)*DAYS_PER_4Y                                 GRBTIM1A.108    
        YEAR1 = YEAR1-(YEAR1/4)*4                                          GRBTIM1A.109    
        YEAR2 = YEAR2-(YEAR2/4)*4                                          GRBTIM1A.110    
        DAY1 =  DAY1+YEAR1*DAYS_PER_Y                                      GRBTIM1A.111    
        DAY2 =  DAY2+YEAR2*DAYS_PER_Y                                      GRBTIM1A.112    
      ENDIF                                                                GRBTIM1A.113    
!--------------------------------------------------------------------      GRBTIM1A.114    
! 2. Convert days, hours and minutes to minutes since calendar zero,       GRBTIM1A.115    
!     and subtract times to get interval in minutes                        GRBTIM1A.116    
!                                                                          GRBTIM1A.117    
      MINS_PER_MONTH=30*1440                                               GRBTIM1A.118    
      IF (CAL360)THEN                                                      GRBTIM1A.119    
        MINS_PER_YEAR=360*MINS_PER_MONTH                                   GRBTIM1A.120    
        MINS_PER_DECADE=MINS_PER_YEAR*10                                   GRBTIM1A.121    
        MINS_PER_CENTURY=MINS_PER_YEAR*100                                 GRBTIM1A.122    
      ELSE                                                                 GRBTIM1A.123    
! Warning needs to be corrected if leap years                              GRBTIM1A.124    
! Note not used at present as PP2GRIB not set up for meaning               GRBTIM1A.125    
! with real calendar years                                                 GRBTIM1A.126    
!                                                                          GRBTIM1A.127    
        MINS_PER_YEAR=365*MINS_PER_MONTH ! problem if leap year            GRBTIM1A.128    
        MINS_PER_DECADE=MINS_PER_YEAR*10                                   GRBTIM1A.129    
        MINS_PER_CENTURY=MINS_PER_YEAR*100                                 GRBTIM1A.130    
      ENDIF                                                                GRBTIM1A.131    
      TIME_INTMIN=1440*(DAY2-DAY1)+60*(I_HR2-I_HR1)+I_MIN2-I_MIN1          GRBTIM1A.132    
                                                                           GRBTIM1A.133    
                                                                           GRBTIM1A.134    
      IF (MOD(TIME_INTMIN,60).NE.0) THEN  ! assumes multiple of mins       GRBTIM1A.135    
        T_UNITS=0                                                          GRBTIM1A.136    
        TIME_INTERVAL=TIME_INTMIN                                          GRBTIM1A.137    
      ELSE                                                                 GRBTIM1A.138    
       IF (MOD(TIME_INTMIN,1440).NE.0) THEN                                GRBTIM1A.139    
        T_UNITS=1             ! HOURS                                      GRBTIM1A.140    
        TIME_INTERVAL=TIME_INTMIN/60                                       GRBTIM1A.141    
       ELSE                                                                GRBTIM1A.142    
        IF (MOD(TIME_INTMIN,MINS_PER_MONTH).NE.0) THEN                     GRBTIM1A.143    
          T_UNITS=2             ! DAYs                                     GRBTIM1A.144    
          TIME_INTERVAL=TIME_INTMIN/1440                                   GRBTIM1A.145    
        ELSE                                                               GRBTIM1A.146    
          IF (MOD(TIME_INTMIN,MINS_PER_YEAR).NE.0) THEN                    GRBTIM1A.147    
           T_UNITS=3             ! months                                  GRBTIM1A.148    
           TIME_INTERVAL=TIME_INTMIN/MINS_PER_MONTH                        GRBTIM1A.149    
          ELSE                                                             GRBTIM1A.150    
            IF (MOD(TIME_INTMIN,MINS_PER_DECADE).NE.0) THEN                GRBTIM1A.151    
              T_UNITS=4             ! years                                GRBTIM1A.152    
              TIME_INTERVAL=TIME_INTMIN/MINS_PER_YEAR                      GRBTIM1A.153    
            ELSE                                                           GRBTIM1A.154    
              IF (MOD(TIME_INTMIN,MINS_PER_CENTURY).NE.0) THEN             GRBTIM1A.155    
                T_UNITS=5             ! decades                            GRBTIM1A.156    
                TIME_INTERVAL=TIME_INTMIN/MINS_PER_DECADE                  GRBTIM1A.157    
              ELSE                                                         GRBTIM1A.158    
                T_UNITS=7             ! century                            GRBTIM1A.159    
                TIME_INTERVAL=TIME_INTMIN/MINS_PER_CENTURY                 GRBTIM1A.160    
! Note could be extended to cope with normals ?                            GRBTIM1A.161    
!          T_UNITS=6       ! normal 30 years                               GRBTIM1A.162    
!                                                                          GRBTIM1A.163    
!  Note cannot cope with intervals greater than 255 * time unit            GRBTIM1A.164    
!  ie 25500 years                                                          GRBTIM1A.165    
!                                                                          GRBTIM1A.166    
              ENDIF                                                        GRBTIM1A.167    
            ENDIF                                                          GRBTIM1A.168    
          ENDIF                                                            GRBTIM1A.169    
        ENDIF                                                              GRBTIM1A.170    
       ENDIF                                                               GRBTIM1A.171    
      ENDIF                                                                GRBTIM1A.172    
                                                                           GRBTIM1A.173    
      RETURN                                                               GRBTIM1A.174    
!-----------------------------------------------------------------         GRBTIM1A.175    
      END                                                                  GRBTIM1A.176    
*ENDIF                                                                     GRBTIM1A.177