48 INTEGER,
PARAMETER ::
itime = selected_int_kind(18)
60 INTEGER(itime) :: mjd = 0
61 INTEGER(itime) :: musod = 0
73 INTERFACE ASSIGNMENT(=)
107 INTERFACE OPERATOR(-)
119 INTERFACE OPERATOR(<=)
123 INTERFACE OPERATOR(>=)
127 INTERFACE OPERATOR(==)
131 INTERFACE OPERATOR(/=)
135 INTERFACE OPERATOR(>)
139 INTERFACE OPERATOR(<)
157 integer(itime),
parameter ::
spd = 86400
158 integer(itime),
parameter ::
mspd =
spd * 1000
167 TYPE(
time),
INTENT(IN) ::a
179 TYPE(
time),
INTENT(IN) ::a,b
180 real(dp) :: dpa,dpb,div,cnt
192 IF(
abs(div) .GT. 1e5_dp) cnt = log10(
abs(div))
194 IF(
abs(div) .GT. 1e16_dp)
THEN 208 ELSE IF(
abs(a) .LT.
abs(b))
THEN 212 ELSE IF(
abs(a) .EQ.
abs(b))
THEN 216 ELSE IF (a .GT. zt .and. b .GT. zt)
THEN 219 t = b * int((div-cnt),
itime)
220 DO WHILE (a .GE. t+b)
225 ELSE IF(a .LT. zt .and. b .LT. zt)
THEN 228 t = b * int((div-cnt),
itime)
233 ELSE IF (a .LT. zt .and. b .GT. zt)
THEN 236 t = b * int((div+cnt),
itime)
242 ELSE IF (a .GT. zt .and. b .LT. zt)
THEN 245 t = b * int((div+cnt),
itime)
263 real(dp),
INTENT(IN) ::
days 276 INTEGER,
INTENT(IN) ::
days 286 INTEGER(ITIME),
INTENT(IN) ::
days 295 real(spa),
INTENT(IN) ::
days 304 real(dp),
INTENT(IN) :: secs
308 temp =
mod(secs,dble(
spd))
317 INTEGER,
INTENT(IN) :: secs
328 INTEGER(ITIME),
INTENT(IN) :: secs
338 real(spa),
INTENT(IN) :: secs
347 TYPE(
time),
INTENT(IN) :: mjd,rjd
348 INTEGER,
INTENT(OUT) :: d, ms
352 msec = dble(mjd%MuSod) / 1000.0_dp
356 IF (
abs(mjd%MJD) .GT. huge(d))
THEN 361 d = mjd%MJD - rjd%MJD
365 FUNCTION ncitime(D,MS)
RESULT(MJD)
368 INTEGER,
INTENT(IN) :: d, ms
379 integer(itime) :: musec
380 integer(itime) :: idays
388 idays = (mjd%MuSOD - musec)/
muspd 390 mjd%mjd = mjd%mjd + idays
396 if (mjd%MuSOD .GT. 0 .AND. mjd%mjd .LT. 0)
then 398 mjd%MuSOD=mjd%MuSOD-
muspd 401 else if (mjd%MuSOD .LT. 0 .AND.mjd%mjd .GT. 0 )
then 402 mjd%MuSOD =
muspd + mjd%MuSOD
414 TYPE(
time) FUNCTION READ_TIME(timestr,status,TZONE)
416 include
'fjulian.inc' 417 character(Len=*) :: timestr
418 CHARACTER(LEN=*),
OPTIONAL,
INTENT(IN) :: tzone
425 if(timestr(1:1)==
"-")
then 426 statl = fjul_parsetime(timestr(2:),.false.,secs)
428 else if(timestr(1:1)==
"+")
then 429 statl = fjul_parsetime(timestr(2:),.false.,secs)
431 statl = fjul_parsetime(timestr,.false.,secs)
437 IF (
PRESENT(tzone))
THEN 443 FUNCTION time_zone(TZONE,status)
RESULT(DZONE)
445 CHARACTER(LEN=*),
INTENT(IN) :: tzone
446 integer,
intent(out) :: status
610 write(6,*)
"TIMEZONE 'WST' IS AMBIGIOUS! USING WESTERN STANDARD TIME: UTC + 8:00" 623 if(status==0)
write(6,*)
"Time_zone failed! :: "//trim(tzone)
629 character(Len=*),
intent(in):: timezone
646 include
'fjulian.inc' 647 character(Len=*) :: timestr
648 character(Len=*),
intent(in) :: frmt
649 integer,
intent(out) :: status
651 CHARACTER(LEN=*),
INTENT(IN) :: tzone
656 real(dp) :: secs, tai,rmjd
659 statl = fjul_parsedt(timestr, frmt, dutc, secs)
660 if (.NOT. statl)
then 662 pos = index(timestr,
'_')
665 timestr(pos:pos) =
' ' 666 statl = fjul_parsedt(timestr, frmt, dutc, secs)
668 if(.not. statl)
return 673 tai = fjul_taiofdutc(dutc)
674 mjd%mjd = anint(fjul_mjdoftai(tai, fjul_utc_type),
itime)
683 include
'fjulian.inc' 685 integer,
intent(IN) :: prec
686 TYPE(
time),
INTENT(IN) :: mjdin
687 CHARACTER(LEN=*),
INTENT(IN) :: tzone
693 integer :: dutc, status
694 real(dp) :: tmp1,tmp2
699 tmp1 = dble(mjd%MuSOD)
702 rmjd = mjd%mjd + tmp1/tmp2
706 tai = fjul_taiofmjd(rmjd, fjul_utc_type)
708 dutc = fjul_dutcoftai(tai,secs)
717 include
'fjulian.inc' 721 CHARACTER(LEN=15) toff
728 CALL date_and_time ( date=d,
time=t, zone=z)
731 toff = z(1:3)//
":"//z(4:5)
734 ts = d(1:4)//
"/"//d(5:6)//
"/"//d(7:8)// &
735 &
" "//t(1:2)//
":"//t(3:4)//
":"//t(5:8)
743 TYPE(
time),
INTENT(IN):: mjd
748 REAL(dp) function
days(mjd)
750 TYPE(
time),
INTENT(IN):: mjd
752 days = dble(mjd%mjd) + dble(mjd%MUSOD)/dble(
muspd)
759 TYPE(
time),
INTENT(IN) :: mjd
760 integer,
INTENT(IN) :: int
771 TYPE(
time),
INTENT(IN) :: mjd
772 integer(itime),
INTENT(IN) :: long
783 TYPE(
time),
INTENT(IN) :: mjd
784 integer,
INTENT(IN) :: int
795 TYPE(
time),
INTENT(IN) :: mjd
796 integer(itime),
INTENT(IN) :: long
806 TYPE(
time),
INTENT(IN) :: mjd
807 real(spa),
INTENT(in) :: flt
817 TYPE(
time),
INTENT(IN) :: mjd
818 real(dp),
INTENT(in) :: dbl
819 integer(itime) :: int
820 real(dp) :: remainder
823 if (
abs(dbl) .gt. 1.0_dp)
THEN 824 int = anint(dbl,
itime)
825 remainder = dbl - int
828 temp = real(mjd%MuSOD,dp) * real(dbl,dp)
831 temp = real(mjd%mjd,dp) * real(dbl,dp)
832 int = anint(temp,
itime)
842 TYPE(
time),
INTENT(IN) :: mjd
843 real(spa),
INTENT(in) :: flt
854 TYPE(
time),
INTENT(IN) :: mjd
855 real(dp),
INTENT(in) :: dbl
863 TYPE(
time),
INTENT(IN) :: mjd
864 integer,
INTENT(IN) :: int
875 TYPE(
time),
INTENT(IN) :: mjd
876 integer(itime),
INTENT(IN) :: long
887 TYPE(
time),
INTENT(IN) :: mjd
888 real(spa),
INTENT(IN) :: flt
899 TYPE(
time),
INTENT(IN) :: mjd
900 real(dp),
INTENT(IN) :: dbl
917 TYPE(
time),
INTENT(IN) :: time1, time2
918 integer(itime) :: musec
920 add_time%MuSOD = time1%MuSOD + time2%MuSOD
921 add_time%mjd = time1%mjd + time2%mjd
928 TYPE(
time),
INTENT(IN) :: time1(:), time2(:)
929 TYPE(
time),
DIMENSION(SIZE(TIME1)) :: tsum
933 tsum(i) = time1(i) + time2(i)
939 TYPE(
time),
INTENT(IN) :: time1(:), time2
940 TYPE(
time),
DIMENSION(SIZE(TIME1)) :: tsum
944 tsum(i) = time1(i) + time2
950 TYPE(
time),
INTENT(IN) :: time1, time2(:)
951 TYPE(
time),
DIMENSION(SIZE(TIME2)) :: tsum
955 tsum(i) = time1 + time2(i)
961 TYPE(
time),
INTENT(IN) :: time1(:,:), time2(:,:)
962 TYPE(
time),
DIMENSION(SIZE(TIME1,1),size(time1,2)) :: tsum
965 DO i = 1,
SIZE(time1,1)
966 DO j = 1,
SIZE(time1,2)
967 tsum(i,j) = time1(i,j) + time2(i,j)
974 TYPE(
time),
INTENT(IN) :: time1(:,:), time2
975 TYPE(
time),
DIMENSION(SIZE(TIME1,1),size(time1,2)) :: tsum
978 DO i = 1,
SIZE(time1,1)
979 DO j = 1,
SIZE(time1,2)
980 tsum(i,j) = time1(i,j) + time2
987 TYPE(
time),
INTENT(IN) :: time1, time2(:,:)
988 TYPE(
time),
DIMENSION(SIZE(TIME2,1),size(time2,2)) :: tsum
991 DO i = 1,
SIZE(time2,1)
992 DO j = 1,
SIZE(time2,2)
993 tsum(i,j) = time1 + time2(i,j)
1000 TYPE(
time),
INTENT(IN) :: time1, time2
1010 TYPE(
time),
INTENT(IN) :: time1(:), time2(:)
1011 TYPE(
time),
DIMENSION(SIZE(TIME1)) :: tdiff
1014 DO i = 1,
SIZE(time1)
1015 tdiff(i) = time1(i) - time2(i)
1021 TYPE(
time),
INTENT(IN) :: time1, time2(:)
1022 TYPE(
time),
DIMENSION(SIZE(TIME2)) :: tdiff
1025 DO i = 1,
SIZE(time2)
1026 tdiff(i) = time1 - time2(i)
1032 TYPE(
time),
INTENT(IN) :: time1(:), time2
1033 TYPE(
time),
DIMENSION(SIZE(TIME1)) :: tdiff
1036 DO i = 1,
SIZE(time1)
1037 tdiff(i) = time1(i) - time2
1043 TYPE(
time),
INTENT(IN) :: time1(:,:), time2(:,:)
1044 TYPE(
time),
DIMENSION(SIZE(TIME1,1),SIZE(TIME1,2)) :: tdiff
1047 DO i = 1,
SIZE(time1,1)
1048 DO j = 1,
SIZE(time1,2)
1049 tdiff(i,j) = time1(i,j) - time2(i,j)
1056 TYPE(
time),
INTENT(IN) :: time1(:,:), time2
1057 TYPE(
time),
DIMENSION(SIZE(TIME1,1),SIZE(TIME1,2)) :: tdiff
1060 DO i = 1,
SIZE(time1,1)
1061 DO j = 1,
SIZE(time1,2)
1062 tdiff(i,j) = time1(i,j) - time2
1069 TYPE(
time),
INTENT(IN) :: time1, time2(:,:)
1070 TYPE(
time),
DIMENSION(SIZE(TIME2,1),SIZE(TIME2,2)) :: tdiff
1073 DO i = 1,
SIZE(time2,1)
1074 DO j = 1,
SIZE(time2,2)
1075 tdiff(i,j) = time1 - time2(i,j)
1097 TYPE(
time),
INTENT(OUT) ::A
1098 TYPE(
time),
INTENT(IN) ::B
1106 LOGICAL FUNCTION le_time(time1,time2)
1108 TYPE(
time),
INTENT(IN) :: time1, time2
1111 dtime = time1 - time2
1112 if (dtime%MJD .lt. 0 .or. &
1113 & (dtime%MJD .EQ. 0 .and. dtime%MuSOD .LE. 0) )
le_time = .true.
1117 LOGICAL FUNCTION lt_time(time1,time2)
1119 TYPE(
time),
INTENT(IN) :: time1, time2
1122 dtime = time1 - time2
1123 if (dtime%MJD .lt. 0 .or. dtime%MuSOD .lt. 0)
lt_time = .true.
1127 LOGICAL FUNCTION eq_time(time1,time2)
1129 TYPE(
time),
INTENT(IN) :: time1, time2
1131 if (time1%MJD .EQ. time2%MJD .and. &
1132 & time1%MuSOD .EQ. time2%MuSOD )
eq_time = .true.
1136 LOGICAL FUNCTION ne_time(time1,time2)
1138 TYPE(
time),
INTENT(IN) :: time1, time2
1144 LOGICAL FUNCTION ge_time(time1,time2)
1146 TYPE(
time),
INTENT(IN) :: time1, time2
1149 dtime = time1 - time2
1150 if (dtime%MJD .gt. 0 .or. &
1151 & (dtime%MJD .EQ. 0 .and. dtime%MuSOD .GE. 0) )
ge_time = .true.
1155 LOGICAL FUNCTION gt_time(time1,time2)
1157 TYPE(
time),
INTENT(IN) :: time1, time2
1160 dtime = time1 - time2
1161 if (dtime%MJD .gt. 0 .or. dtime%MuSOD .gt. 0 )
gt_time = .true.
1167 CHARACTER(Len=*),
INTENT(IN) :: char
1168 INTEGER,
INTENT(IN) :: IPT
1169 TYPE(
time),
INTENT(IN) :: mjd
1170 real(DP) :: tmp, seconds
1171 integer :: hours, minutes
1172 Character(len=3) :: h, m
1173 Character(Len=10) :: s
1174 Character(len=8) :: d
1176 tmp = real(mjd%MuSOD,dp) / real(
million,dp)
1179 minutes = (tmp-hours*3600)/60
1180 seconds =
mod(tmp,60.0_dp)
1182 write(d,
'(i8.7)') mjd%mjd
1183 write(h,
'(i3.2)') hours
1184 write(m,
'(i3.2)') minutes
1185 write(s,
'(F10.6)') seconds
1192 write(ipt,*)
"!========"//trim(char)//
"==========" 1193 write(ipt,*)
"! Day # :", mjd%mjd
1194 write(ipt,*)
"! MicroSecond #:", mjd%MuSOD
1195 write(ipt,*)
"! (Human Time=d "//trim(d)//
"::h"//trim(h)//
":m"//trim(m)//
":s"//trim(s)//
")" 1196 write(ipt,*)
"!==========================" 1202 CHARACTER(Len=*),
INTENT(IN) :: char
1203 INTEGER,
INTENT(IN) :: IPT
1204 TYPE(
time),
INTENT(IN) :: mjd
1205 CHARACTER(LEN=*),
OPTIONAL,
INTENT(IN) :: TZONE
1206 CHARACTER(LEN=120) :: string_local, string_utc
1209 IF(
PRESENT(tzone))
THEN 1211 IF(tzone==
"none" .or. tzone ==
"NONE")
THEN 1217 string_local =
"! (Local Time="//trim(string_local)//
"); time zone: "//trim(tzone)
1222 write(ipt,*)
"!========"//trim(char)//
"==========" 1223 write(ipt,*)
"! Day # :", mjd%mjd
1224 write(ipt,*)
"! MicroSecond #:", mjd%MuSOD
1225 write(ipt,*)
"! (Date Time="//trim(string_utc)//
")" 1226 IF(
PRESENT(tzone))
write(ipt,*) string_local
1227 write(ipt,*)
"!==========================" 1235 include
'fjulian.inc' 1236 TYPE(
time),
INTENT(IN) ::TTime
1237 Integer,
INTENT(OUT) :: Pyear,Pmonth,Pmdays
1238 Integer :: Iyear,Imonth
1243 CHARACTER(LEN=15) toff
1244 CHARACTER(LEN=25) TS
1249 TYPE(
time) ::Time1, Time2
1250 CHARACTER(LEN=120) :: string_local, string_utc
1251 CHARACTER(LEN=10) :: string_tt
1258 string_tt=trim(string_local)
1259 d(1:4)=string_tt(1:4)
1260 d(5:6)=string_tt(6:7)
1261 d(7:8)=string_tt(9:10)
1269 read(d(1:4),
'(I4)') iyear
1270 read(d(5:6),
'(I2)') pmonth
1278 ts = d(1:4)//
"/"//d(5:6)//
"/"//d(7:8)// &
1279 &
" "//t(1:2)//
":"//t(3:4)//
":"//t(5:8)
1289 write(d(1:4),
'(I4.4)') iyear
1290 write(d(5:6),
'(I2.2)') imonth
1293 ts = d(1:4)//
"/"//d(5:6)//
"/"//d(7:8)// &
1294 &
" "//t(1:2)//
":"//t(3:4)//
":"//t(5:8)
1298 pmdays = time2%mjd -time1%mjd
1305 include
'fjulian.inc' 1306 Integer :: Iyear,Imonth
1307 Integer :: Pmonth,Pmdays
1312 CHARACTER(LEN=15) toff
1313 CHARACTER(LEN=25) TS
1318 TYPE(
time) ::Time1, Time2
1319 CHARACTER(LEN=120) :: string_local, string_utc
1320 CHARACTER(LEN=10) :: string_tt
1330 write(d(1:4),
'(I4.4)') iyear
1331 write(d(5:6),
'(I2.2)') pmonth
1337 ts = d(1:4)//
"/"//d(5:6)//
"/"//d(7:8)// &
1338 &
" "//t(1:2)//
":"//t(3:4)//
":"//t(5:8)
1345 write(d(1:4),
'(I4.4)') iyear
1346 write(d(5:6),
'(I2.2)') pmonth
1352 ts = d(1:4)//
"/"//d(5:6)//
"/"//d(7:8)// &
1353 &
" "//t(1:2)//
":"//t(3:4)//
":"//t(5:8)
type(time) function modulo_time(A, B)
type(time) function, dimension(size(time1, 1), size(time1, 2)) subtract_time_2a(time1, time2)
type(time) function, dimension(size(time2, 1), size(time2, 2)) add_time_a2(time1, time2)
type(time) function flt_x_time(flt, MJD)
type(time) function days2time_int(DAYS)
integer function time2ncitime(MJD, RJD, D, MS)
integer(itime), parameter spd
type(time) function, dimension(size(time1, 1), size(time1, 2)) subtract_time_2(time1, time2)
type(time) function, dimension(size(time1)) subtract_time_1(time1, time2)
type(time) function read_time(timestr, status, TZONE)
type(time) function get_now()
subroutine now_2_month_days(TTime, Pyear, Pmonth, Pmdays)
type(time) function days2time_flt(DAYS)
logical function lt_time(time1, time2)
type(time) function days2time_dbl(DAYS)
type(time) function, dimension(size(time1, 1), size(time1, 2)) add_time_2(time1, time2)
type(time) function seconds2time_dbl(SECS)
subroutine print_real_time(mjd, IPT, char, TZONE)
integer(itime), parameter muspd
logical function ne_time(time1, time2)
type(time) function seconds2time_lint(SECS)
real(dp) function days(MJD)
type(time) function add_time(time1, time2)
type(time) function read_datetime(timestr, frmt, TZONE, status)
type(time) recursive function time_x_dbl(MJD, dbl)
type(time) function seconds2time_flt(SECS)
type(time) function int_x_time(int, MJD)
logical function le_time(time1, time2)
type(time) function long_x_time(long, MJD)
type(time) function, dimension(size(time2)) add_time_a1(time1, time2)
type(time) function, dimension(size(time1)) subtract_time_a1(time1, time2)
type(time) function, dimension(size(time2, 1), size(time2, 2)) subtract_time_a2(time1, time2)
real(dp) function seconds(MJD)
type(time) function time_div_flt(MJD, flt)
integer(itime), parameter mspd
subroutine assign_time(A, B)
type(time) function, dimension(size(time1, 1), size(time1, 2)) add_time_2a(time1, time2)
type(time) function subtract_time(time1, time2)
type(time) function time_x_int(MJD, int)
type(time) function time_zone(TZONE, status)
type(time) function time_x_long(MJD, long)
type(time) function dbl_x_time(dbl, MJD)
logical function is_valid_timezone(timezone)
type(time) function time_div_int(MJD, int)
type(time) function time_x_flt(MJD, flt)
subroutine now_2_days_test
type(time) function days2time_lint(DAYS)
integer(itime), parameter million
type(time) function time_div_dbl(MJD, dbl)
type(time) function, dimension(size(time1)) add_time_1a(time1, time2)
type(time) function seconds2time_int(SECS)
logical function eq_time(time1, time2)
type(time) function ncitime(D, MS)
type(time) function, dimension(size(time2)) subtract_time_1a(time1, time2)
logical function ge_time(time1, time2)
type(time) function time_div_long(MJD, long)
type(time) function abs_time(A)
type(time) function, dimension(size(time1)) add_time_1(time1, time2)
subroutine print_time(mjd, IPT, char)
character(len=80) function write_datetime(mjdin, prec, TZONE)
logical function gt_time(time1, time2)