SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/temporal_dists.F90
Go to the documentation of this file.
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