SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/add_forecast_to_date_surf.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE ADD_FORECAST_TO_DATE_SURF(KYEAR,KMONTH,KDAY,PSEC)
00003 !     #######################################################
00004 !
00005 !!****  *ADD_FORECAST_TO_DATE* - finds the current date and hour of a forecast
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !!
00010 !!                                WARNING
00011 !!
00012 !!      -----> Only correct for dates between 19900301 and 21000228   <-----
00013 !!
00014 !!  The correct test should be:
00015 !! IF( ((MOD(KYEAR,4)==0).AND.(MOD(KYEAR,100)/=0)) .OR. (MOD(KYEAR,400)==0))THEN
00016 !!
00017 !!**  METHOD
00018 !!    ------
00019 !!
00020 !!      A recursive method is used, adding one day ofter the other.
00021 !!
00022 !!    EXTERNAL
00023 !!    --------
00024 !!
00025 !!    IMPLICIT ARGUMENTS
00026 !!    ------------------
00027 !!
00028 !!    REFERENCE
00029 !!    ---------
00030 !!
00031 !!    Book 2
00032 !!
00033 !!    AUTHOR
00034 !!    ------
00035 !!      
00036 !     V.Masson  Meteo-France
00037 !!
00038 !!    MODIFICATIONS
00039 !!    -------------
00040 !!      Original    01/09/95
00041 !-------------------------------------------------------------------------------
00042 !
00043 !*       0.    DECLARATIONS
00044 !              ------------
00045 !
00046 !
00047 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00048 USE PARKIND1  ,ONLY : JPRB
00049 !
00050 IMPLICIT NONE
00051 !
00052 !*       0.1   Declaration of arguments
00053 !              ------------------------
00054 INTEGER, INTENT(INOUT) :: KYEAR  ! year of date
00055 INTEGER, INTENT(INOUT) :: KMONTH ! month of date
00056 INTEGER, INTENT(INOUT) :: KDAY   ! day of date
00057 REAL,    INTENT(INOUT) :: PSEC   ! number of seconds since date at 00 UTC
00058 !
00059 !*       0.2   Declaration of local variables
00060 !              ------------------------------
00061 !
00062 INTEGER :: IDAYS ! number of days in KMONTH
00063 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00064 !-------------------------------------------------------------------------------
00065 !
00066 !*       1.    Return condition: less than one day to add
00067 !              ------------------------------------------
00068 !
00069 IF (LHOOK) CALL DR_HOOK('ADD_FORECAST_TO_DATE_SURF',0,ZHOOK_HANDLE)
00070 DO 
00071   IF (86400.-PSEC > 1.E-6) EXIT
00072 !
00073 !-------------------------------------------------------------------------------
00074 !
00075 !*       2.    Adding one day
00076 !              --------------
00077 !
00078   PSEC=PSEC-86400.
00079 !
00080 !*       2.1   Number of days in a month
00081 !              -------------------------
00082 !
00083   SELECT CASE (KMONTH)
00084     CASE(4,6,9,11)
00085       IDAYS=30
00086     CASE(1,3,5,7:8,10,12)
00087       IDAYS=31
00088     CASE(2)
00089       IF( ((MOD(KYEAR,4)==0).AND.(MOD(KYEAR,100)/=0)) .OR. (MOD(KYEAR,400)==0))THEN
00090         IDAYS=29
00091       ELSE
00092         IDAYS=28
00093       ENDIF
00094   END SELECT
00095 !
00096 !*       2.2   Last day of the month
00097 !              ---------------------
00098 !
00099   IF (KDAY==IDAYS) THEN
00100     IF (KMONTH==12) THEN
00101       KDAY=1
00102       KMONTH=1
00103       KYEAR=KYEAR+1
00104     ELSE
00105       KDAY=1   
00106       KMONTH=KMONTH+1
00107     ENDIF
00108 ! 
00109 !*       2.3   Other days
00110 !              ----------
00111   ELSE
00112     KDAY=KDAY+1
00113   ENDIF
00114 !
00115 !-------------------------------------------------------------------------------
00116 !
00117 !*       3.    Recursive call
00118 !              --------------
00119 !
00120 ENDDO
00121 IF (LHOOK) CALL DR_HOOK('ADD_FORECAST_TO_DATE_SURF',1,ZHOOK_HANDLE)
00122 !
00123 !-------------------------------------------------------------------------------
00124 !
00125 END SUBROUTINE ADD_FORECAST_TO_DATE_SURF