23 SUBROUTINE read_date(PTIME,HUNITS,KYEAR,KMONTH,KDAY,PTIME_DATE)
27 REAL,
DIMENSION(:),
INTENT(IN) :: PTIME
28 CHARACTER(*),
INTENT(IN) :: HUNITS
30 INTEGER,
INTENT(OUT) :: KYEAR
31 INTEGER,
INTENT(OUT) :: KMONTH
32 INTEGER,
INTENT(OUT) :: KDAY
33 REAL,
INTENT(OUT) :: PTIME_DATE
37 INTEGER,
DIMENSION(SIZE(PTIME)) :: ITIMEHOURS
38 REAL,
DIMENSION(SIZE(PTIME)) :: ZREST
46 CHARACTER(LEN=14) :: YHEADER
47 CHARACTER(LEN=100) :: YFMT
48 CHARACTER :: YC1,YC2,YC3
52 INTEGER,
DIMENSION(4),
PARAMETER :: ITV_DATEREF = (/1900,1,1,0/)
53 INTEGER,
DIMENSION(4),
PARAMETER :: ITV_DATEREFBIS = (/1850,1,1,0/)
55 INTEGER,
DIMENSION(4) :: ITV_DATETEMPO
56 INTEGER :: ICARACUNITS,ICARACHOUR,ICARACDAY,ICARACMONTH,ICARACYEAR
60 REAL(KIND=JPRB) :: ZHOOK_HANDLE
64 IF (
lhook)
CALL dr_hook(
'MODE_TRIP_DATE_NETCDF:READ_DATE',0,zhook_handle)
66 SELECT CASE (hunits(1:4))
69 itimehours(:) = int(ptime(:)*24.)
70 zrest(:) = ptime(:)*24.-itimehours(:)
73 itimehours(:) = int(ptime(:))
74 zrest(:) = ptime(:)-itimehours(:)
77 itimehours(:) = int(ptime(:)/60.)
78 zrest(:) = (ptime(:)/60.)-itimehours(:)
81 itimehours(:) = int(ptime(:)/3600.)
82 zrest(:) = (ptime(:)/3600.)-itimehours(:)
84 print*,
"ERROR date_netcdf.F90 : Can't read time units :" 86 stop
"Error units time" 91 SELECT CASE (hunits(1:4))
92 CASE (
"days",
"hour",
"minu",
"seco")
93 boucles_hours:
DO icarachour=1,2
97 WRITE(yfmt,fmt=
'("(A",I2,",",2("I",I1,",A1,"),"I",I1,",X,I",I1,",A1)")')&
98 icaracunits,icaracyear,icaracmonth,icaracday,icarachour
99 READ(hunits,fmt=yfmt,iostat=ierror)yheader,iyear,&
100 yc1,imonth,yc2,iday,ihour,yc3
102 gheader=(
trim(yheader)==
'hours since') .OR. (
trim(yheader)==
'minutes since') .OR. &
103 (
trim(yheader)==
'seconds since') .OR. (
trim(yheader)==
'days since')
104 IF (gheader.AND.(yc1==
'-').AND.(yc2==
'-').AND.(yc3==
':'))
THEN 113 stop
"Error units time" 119 print*,
"ERROR date_netcdf.F90 : Can't read time units :" 121 stop
"Error units time" 126 ztime =
REAL(ihour)+ZREST(1)
130 CALL addtime(itimehours(1),iyear,imonth,iday,ztime)
139 IF (
lhook)
CALL dr_hook(
'MODE_TRIP_DATE_NETCDF:READ_DATE',1,zhook_handle)
145 SUBROUTINE addtime (KNHOURS,KYEAR,KMONTH,KDAY,PTIME)
149 INTEGER,
INTENT(IN) :: KNHOURS
151 INTEGER,
INTENT(OUT) :: KYEAR
152 INTEGER,
INTENT(OUT) :: KMONTH
153 INTEGER,
INTENT(OUT) :: KDAY
154 REAL,
INTENT(OUT) :: PTIME
158 INTEGER,
DIMENSION(12) :: INBDM
159 INTEGER :: IREMAININGDAYS
161 REAL(KIND=JPRB) :: ZHOOK_HANDLE
165 IF (
lhook)
CALL dr_hook(
'MODE_TRIP_DATE_NETCDF:ADDTIME',0,zhook_handle)
170 inbdm=(/31,28,31,30,31,30,31,31,30,21,30,31/)
173 inbdm=(/31,29,31,30,31,30,31,31,30,31,30,31/)
175 inbdm=(/31,28,31,30,31,30,31,31,30,31,30,31/)
181 IF ((int(ptime)+knhours)<=23)
THEN 184 iremainingdays=(int(ptime)+knhours)/24
185 ptime=mod(int(ptime)+knhours,24)+ptime-int(ptime)
188 IF ((kday+iremainingdays)<=inbdm(kmonth))
THEN 189 kday=kday+iremainingdays
192 iremainingdays=iremainingdays-(inbdm(kmonth)-kday+1)
212 IF ((int(ptime)+knhours)>=0)
THEN 215 iremainingdays=(int(ptime)-knhours)/24+1
216 ptime=mod(int(ptime)-knhours,24)+ptime-int(ptime)
219 IF ((kday-iremainingdays)>=1)
THEN 220 kday=kday-iremainingdays
223 iremainingdays=iremainingdays-kday
244 IF (
lhook)
CALL dr_hook(
'MODE_TRIP_DATE_NETCDF:ADDTIME',1,zhook_handle)
251 INTEGER,
INTENT(IN) :: PYEAR
252 REAL(KIND=JPRB) :: ZHOOK_HANDLE
254 IF (
lhook)
CALL dr_hook(
'MODE_TRIP_DATE_NETCDF:LEAPYEAR',0,zhook_handle)
257 leapyear = (((mod(pyear,4)==0).AND.(mod(pyear,100)/=0)).OR.(mod(pyear,400)==0))
262 IF (
lhook)
CALL dr_hook(
'MODE_TRIP_DATE_NETCDF:LEAPYEAR',1,zhook_handle)
static const char * trim(const char *name, int *n)
subroutine read_date(PTIME, HUNITS, KYEAR, KMONTH, KDAY, PTIME_DATE)
subroutine addtime(KNHOURS, KYEAR, KMONTH, KDAY, PTIME)
logical function leapyear(PYEAR)
integer, parameter iyear_gregoire