*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.24SUBROUTINE 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