SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE TEMPORAL_DISTS(KYEARF, KMONTHF, KDAYF, PSECF, & 00003 KYEARI, KMONTHI, KDAYI, PSECI, & 00004 PDIST ) 00005 ! ############################################################# 00006 ! 00007 !!**** *TEMPORAL_DISTS* - finds the number of secunds between 2 dates 00008 !! 00009 !! PURPOSE 00010 !! ------- 00011 !! 00012 !! WARNING 00013 !! 00014 !! -----> Only correct for dates between 19900301 and 21000228 <----- 00015 !! 00016 !! The correct test should be: 00017 !! IF( ((MOD(KYEAR,4)==0).AND.(MOD(KYEAR,100)/=0)) .OR. (MOD(KYEAR,400)==0))THEN 00018 !! 00019 !!** METHOD 00020 !! ------ 00021 !! 00022 !! A comparison term by term of the elements of the 2 dates is performed. 00023 !! and the temporal distance between the 2 dates is then deduced. 00024 !! 00025 !! EXTERNAL 00026 !! -------- 00027 !! 00028 !! IMPLICIT ARGUMENTS 00029 !! ------------------ 00030 !! 00031 !! REFERENCE 00032 !! --------- 00033 !! 00034 !! Book 2 00035 !! 00036 !! AUTHOR 00037 !! ------ 00038 !! 00039 ! J.Stein Meteo-France 00040 !! 00041 !! MODIFICATIONS 00042 !! ------------- 00043 !! Original 02/01/96 00044 !! PP. 06/08: Add case where differents years and same month 00045 !! for more-than-1year simulations 00046 !------------------------------------------------------------------------------- 00047 ! 00048 !* 0. DECLARATIONS 00049 ! ------------ 00050 ! 00051 USE MODD_SURF_PAR 00052 ! 00053 ! 00054 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00055 USE PARKIND1 ,ONLY : JPRB 00056 ! 00057 IMPLICIT NONE 00058 ! 00059 !* 0.1 Declaration of arguments 00060 ! ------------------------ 00061 INTEGER, INTENT(IN) :: KYEARF ! year of Final date 00062 INTEGER, INTENT(IN) :: KMONTHF ! month of Final date 00063 INTEGER, INTENT(IN) :: KDAYF ! day of Final date 00064 REAL, INTENT(IN) :: PSECF ! number of seconds since date at 00 UTC 00065 ! of Final date 00066 INTEGER, INTENT(IN) :: KYEARI ! year of Initial date 00067 INTEGER, INTENT(IN) :: KMONTHI ! month of Initial date 00068 INTEGER, INTENT(IN) :: KDAYI ! day of Initial date 00069 REAL, INTENT(IN) :: PSECI ! number of seconds since date at 00 UTC 00070 ! of Initial date 00071 REAL, INTENT(OUT):: PDIST ! temporal distance in secunds between the final 00072 ! and initial date 00073 ! 00074 !* 0.2 Declaration of local variables 00075 ! ------------------------------ 00076 ! 00077 INTEGER :: IDAYS ! number of days between the two dates 00078 INTEGER :: JMONTH,JYEAR ! loop index on months or years 00079 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00080 ! 00081 !------------------------------------------------------------------------------- 00082 ! 00083 !* 1. SAME YEARS AND SAME MONTHS 00084 ! -------------------------- 00085 ! 00086 IF (LHOOK) CALL DR_HOOK('TEMPORAL_DISTS',0,ZHOOK_HANDLE) 00087 IF ( (KYEARF==KYEARI) .AND. (KMONTHF==KMONTHI) ) THEN 00088 PDIST = ( KDAYF-KDAYI) * 86400. + PSECF - PSECI 00089 ! check chronological order 00090 IF (PDIST < 0.) PDIST=XUNDEF 00091 END IF 00092 ! 00093 !------------------------------------------------------------------------------- 00094 ! 00095 !* 2. SAME YEARS AND DIFFERENT MONTHS 00096 ! ------------------------------- 00097 ! 00098 IF ( (KYEARF==KYEARI) .AND. (KMONTHF/=KMONTHI) ) THEN 00099 ! check chronological order 00100 IF ( KMONTHF < KMONTHI ) THEN 00101 PDIST=XUNDEF 00102 IF (LHOOK) CALL DR_HOOK('TEMPORAL_DISTS',1,ZHOOK_HANDLE) 00103 RETURN 00104 END IF 00105 ! 00106 ! cumulate the number of days for the months in between KMONTHF-1 and 00107 ! KMONTHI 00108 IDAYS = 0 00109 DO JMONTH = KMONTHI, KMONTHF-1 00110 SELECT CASE (JMONTH) 00111 CASE(4,6,9,11) 00112 IDAYS=IDAYS+30 00113 CASE(1,3,5,7:8,10,12) 00114 IDAYS=IDAYS+31 00115 CASE(2) 00116 IF (MOD(KYEARI,4)==0) THEN 00117 IDAYS=IDAYS+29 00118 ELSE 00119 IDAYS=IDAYS+28 00120 ENDIF 00121 END SELECT 00122 END DO 00123 ! 00124 ! compute the temporal distance 00125 PDIST = ( IDAYS + KDAYF - KDAYI) * 86400. + PSECF - PSECI 00126 ! 00127 END IF 00128 ! 00129 !------------------------------------------------------------------------------- 00130 ! 00131 !* 3. DIFFERENT YEARS AND DIFFERENT MONTHS 00132 ! ------------------------------------ 00133 ! 00134 IF ( (KYEARF/=KYEARI) .AND. (KMONTHF/=KMONTHI) ) THEN 00135 ! check chronological order 00136 IF ( KYEARF < KYEARI ) THEN 00137 PDIST=XUNDEF 00138 IF (LHOOK) CALL DR_HOOK('TEMPORAL_DISTS',1,ZHOOK_HANDLE) 00139 RETURN 00140 END IF 00141 ! 00142 ! cumulate the number of days for the months in between KMONTHI and 00143 ! December 00144 IDAYS = 0 00145 DO JMONTH = KMONTHI, 12 00146 SELECT CASE (JMONTH) 00147 CASE(4,6,9,11) 00148 IDAYS=IDAYS+30 00149 CASE(1,3,5,7:8,10,12) 00150 IDAYS=IDAYS+31 00151 CASE(2) 00152 IF (MOD(KYEARI,4)==0) THEN 00153 IDAYS=IDAYS+29 00154 ELSE 00155 IDAYS=IDAYS+28 00156 ENDIF 00157 END SELECT 00158 END DO 00159 DO JMONTH = 1,KMONTHF-1 00160 SELECT CASE (JMONTH) 00161 CASE(4,6,9,11) 00162 IDAYS=IDAYS+30 00163 CASE(1,3,5,7:8,10,12) 00164 IDAYS=IDAYS+31 00165 CASE(2) 00166 IF (MOD(KYEARF,4)==0) THEN 00167 IDAYS=IDAYS+29 00168 ELSE 00169 IDAYS=IDAYS+28 00170 ENDIF 00171 END SELECT 00172 END DO 00173 ! add the number of days corresponding to full years between the two dates 00174 DO JYEAR=KYEARI+1, KYEARF-1 00175 IF (MOD(JYEAR,4)==0) THEN 00176 IDAYS=IDAYS+366 00177 ELSE 00178 IDAYS=IDAYS+365 00179 END IF 00180 END DO 00181 ! 00182 ! compute the temporal distance 00183 PDIST = ( IDAYS + KDAYF - KDAYI) * 86400. + PSECF - PSECI 00184 ! 00185 END IF 00186 ! 00187 ! 00188 !! 4. SUPPLEMENTARY CASE FOR DIFFERENT YEARS AND SAME MONTH 00189 ! ------------------------------------------------------------ 00190 IF ( (KYEARF/=KYEARI) .AND. (KMONTHF==KMONTHI) ) THEN 00191 ! check chronological order 00192 IF ( KYEARF < KYEARI ) THEN 00193 PDIST=XUNDEF 00194 IF (LHOOK) CALL DR_HOOK('TEMPORAL_DISTS',1,ZHOOK_HANDLE) 00195 RETURN 00196 END IF 00197 ! 00198 ! cumulate the number of days for the months in between KMONTHI and 00199 ! December => IDAYS = 0 here 00200 IDAYS = 0 00201 ! add the number of days corresponding to full years between the two dates 00202 DO JYEAR=KYEARI+1, KYEARF-1 00203 IF (MOD(JYEAR,4)==0) THEN 00204 IDAYS=IDAYS+366 00205 ELSE 00206 IDAYS=IDAYS+365 00207 END IF 00208 END DO 00209 ! 00210 ! compute the temporal distance 00211 PDIST = ( IDAYS + KDAYF - KDAYI) * 86400. + PSECF - PSECI 00212 ! 00213 END IF 00214 IF (LHOOK) CALL DR_HOOK('TEMPORAL_DISTS',1,ZHOOK_HANDLE) 00215 !------------------------------------------------------------------------------- 00216 ! 00217 END SUBROUTINE TEMPORAL_DISTS