SURFEX v7.3
General documentation of Surfex
|
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