16 USE yomhook
,ONLY : lhook, dr_hook
17 USE parkind1
,ONLY : jprb
21 INTEGER,
PARAMETER::JP_GREGOIRE=1582
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)
162 IF (pyear>jp_gregoire)
THEN
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)
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)
185 IF (tptime%TDATE%YEAR==jp_gregoire)
THEN
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
221 IF (tptime%TDATE%YEAR==jp_gregoire) inbdm(10)=21
222 IF (tptime%TDATE%YEAR==jp_gregoire+1) inbdm(10)=31
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
252 IF (tptime%TDATE%YEAR==jp_gregoire) inbdm(10)=21
253 IF (tptime%TDATE%YEAR==jp_gregoire-1) inbdm(10)=31
260 IF (lhook) CALL dr_hook(
'MODE_DATES_NETCDF:ADDHOURS',1,zhook_handle)
subroutine addhours(TPTIME, KNHOURS)
LOGICAL function leapyear(PYEAR)
subroutine netcdf2date(PTIME, HUNITS, PDATETIME)