35 REAL,
DIMENSION(:),
INTENT(IN) :: PTIME
36 CHARACTER(*),
INTENT(IN) :: HUNITS
37 type(
date_time),
DIMENSION(:),
INTENT(OUT) :: pdatetime
39 INTEGER,
DIMENSION(SIZE(PTIME)) :: ITIMEHOURS
40 REAL,
DIMENSION(SIZE(PTIME)) :: ZREST
41 INTEGER :: IYEARUNITS,IMONTHUNITS,IDAYUNITS,IHOURUNITS
43 CHARACTER(LEN=14) :: YHEADER
44 CHARACTER(LEN=100) :: YFMT
45 CHARACTER :: YC1,YC2,YC3
49 INTEGER,
DIMENSION(4),
PARAMETER :: ITV_DATEREF = (/1900,1,1,0/)
50 INTEGER,
DIMENSION(4),
PARAMETER :: ITV_DATEREFBIS = (/1850,1,1,0/)
52 INTEGER,
DIMENSION(4) :: ITV_DATETEMPO
53 INTEGER :: ICARACUNITS,ICARACHOUR,ICARACDAY,ICARACMONTH,ICARACYEAR
58 REAL(KIND=JPRB) :: ZHOOK_HANDLE
60 IF (
lhook)
CALL dr_hook(
'MODE_DATES_NETCDF:NETCDF2DATE',0,zhook_handle)
62 SELECT CASE (hunits(1:4))
65 itimehours = int(ptime*24.)
66 zrest = ptime*24.-itimehours
69 itimehours = int(ptime)
70 zrest = ptime-itimehours
73 itimehours = int(ptime/60.)
74 zrest = (ptime/60.)-itimehours
77 itimehours = int(ptime/3600.)
78 zrest = (ptime/3600.)-itimehours
80 print*,
"ERROR date_netcdf.F90 : Can't read time units :" 82 stop
"Error units time" 85 SELECT CASE (hunits(1:4))
105 CASE (
"days",
"hour",
"minu",
"seco")
107 boucles_hours:
DO icarachour=1,2
111 WRITE(yfmt,fmt=
'("(A",I2,",",2("I",I1,",A1,"),"I",I1,",X,I",I1,",A1)")')&
112 icaracunits,icaracyear,icaracmonth,icaracday,icarachour
113 READ(hunits,fmt=yfmt,iostat=ierror)yheader,iyearunits,&
114 yc1,imonthunits,yc2,idayunits,ihourunits,yc3
116 gheader=(trim(yheader)==
'hours since') .OR. (trim(yheader)==
'minutes since') .OR. &
117 (trim(yheader)==
'seconds since') .OR. (trim(yheader)==
'days since')
118 IF (gheader.AND.(yc1==
'-').AND.(yc2==
'-').AND.(yc3==
':'))
THEN 129 stop
"Error units time" 136 print*,
"ERROR date_netcdf.F90 : Can't read time units :" 138 stop
"Error units time" 141 DO jtime=1,
SIZE(ptime)
143 pdatetime(jtime)%TDATE%YEAR = iyearunits
144 pdatetime(jtime)%TDATE%MONTH = imonthunits
145 pdatetime(jtime)%TDATE%DAY = idayunits
146 pdatetime(jtime)%TIME = ihourunits+zrest(jtime)
147 CALL addhours(pdatetime(jtime),itimehours(jtime))
150 IF (
lhook)
CALL dr_hook(
'MODE_DATES_NETCDF:NETCDF2DATE',1,zhook_handle)
157 INTEGER,
INTENT(IN) :: PYEAR
158 REAL(KIND=JPRB) :: ZHOOK_HANDLE
160 IF (
lhook)
CALL dr_hook(
'MODE_DATES_NETCDF:LEAPYEAR',0,zhook_handle)
163 leapyear = (((mod(pyear,4)==0).AND.(mod(pyear,100)/=0)).OR.(mod(pyear,400)==0))
168 IF (
lhook)
CALL dr_hook(
'MODE_DATES_NETCDF:LEAPYEAR',1,zhook_handle)
174 SUBROUTINE addhours (TPTIME,KNHOURS)
177 INTEGER,
INTENT(IN)::KNHOURS
178 INTEGER,
DIMENSION(12)::INBDM
179 INTEGER::IREMAININGDAYS
180 REAL(KIND=JPRB) :: ZHOOK_HANDLE
182 IF (
lhook)
CALL dr_hook(
'MODE_DATES_NETCDF:ADDHOURS',0,zhook_handle)
186 inbdm=(/31,28,31,30,31,30,31,31,30,21,30,31/)
188 IF (
leapyear(tptime%TDATE%YEAR))
THEN 189 inbdm=(/31,29,31,30,31,30,31,31,30,31,30,31/)
191 inbdm=(/31,28,31,30,31,30,31,31,30,31,30,31/)
197 IF ((int(tptime%TIME)+knhours)<=23)
THEN 198 tptime%TIME=tptime%TIME+knhours
200 iremainingdays=(int(tptime%TIME)+knhours)/24
201 tptime%TIME=mod(int(tptime%TIME)+knhours,24)+tptime%TIME-int(tptime%TIME)
204 IF ((tptime%TDATE%DAY+iremainingdays)<=inbdm(tptime%TDATE%MONTH))
THEN 205 tptime%TDATE%DAY=tptime%TDATE%DAY+iremainingdays
208 iremainingdays=iremainingdays-(inbdm(tptime%TDATE%MONTH)-tptime%TDATE%DAY+1)
209 IF (tptime%TDATE%MONTH<12)
THEN 210 tptime%TDATE%MONTH=tptime%TDATE%MONTH+1
214 tptime%TDATE%YEAR=tptime%TDATE%YEAR+1
218 IF (
leapyear(tptime%TDATE%YEAR)) inbdm(2)=29
219 IF (
leapyear(tptime%TDATE%YEAR-1)) inbdm(2)=28
228 IF ((int(tptime%TIME)+knhours)>=0)
THEN 229 tptime%TIME=tptime%TIME+knhours
231 iremainingdays=(int(tptime%TIME)-knhours)/24+1
232 tptime%TIME=mod(int(tptime%TIME)-knhours,24)+tptime%TIME-int(tptime%TIME)
235 IF ((tptime%TDATE%DAY-iremainingdays)>=1)
THEN 236 tptime%TDATE%DAY=tptime%TDATE%DAY-iremainingdays
239 iremainingdays=iremainingdays-tptime%TDATE%DAY
240 IF (tptime%TDATE%MONTH>=1)
THEN 241 tptime%TDATE%MONTH=tptime%TDATE%MONTH-1
242 tptime%TDATE%DAY=inbdm(tptime%TDATE%MONTH)
245 tptime%TDATE%YEAR=tptime%TDATE%YEAR-1
246 tptime%TDATE%MONTH=12
247 tptime%TDATE%DAY=inbdm(tptime%TDATE%MONTH)
249 IF (
leapyear(tptime%TDATE%YEAR)) inbdm(2)=29
250 IF (
leapyear(tptime%TDATE%YEAR+1)) inbdm(2)=28
260 IF (
lhook)
CALL dr_hook(
'MODE_DATES_NETCDF:ADDHOURS',1,zhook_handle)
subroutine netcdf2date(PTIME, HUNITS, PDATETIME)
integer, parameter jp_gregoire
logical function leapyear(PYEAR)
subroutine addhours(TPTIME, KNHOURS)