4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
SUBROUTINE ymds2ju (year, month, day, sec, julian) |
SUBROUTINE ymds2ju(year, month, day, sec, julian) |
8 |
|
|
9 |
! Converts year, month, day and seconds into a julian day |
! Converts year, month, day and seconds into a julian day |
10 |
|
|
30 |
|
|
31 |
INTEGER, INTENT(IN):: year, month, day |
INTEGER, INTENT(IN):: year, month, day |
32 |
REAL, INTENT(IN):: sec |
REAL, INTENT(IN):: sec |
33 |
REAL, INTENT(OUT):: julian |
double precision, INTENT(OUT):: julian |
34 |
|
|
35 |
! Local: |
! Local: |
36 |
|
INTEGER jd, ml |
|
INTEGER:: julian_day |
|
|
REAL:: julian_sec |
|
|
INTEGER:: jd, m, y, d, ml |
|
37 |
|
|
38 |
!-------------------------------------------------------------------- |
!-------------------------------------------------------------------- |
39 |
|
|
40 |
lock_unan = .TRUE. |
lock_unan = .TRUE. |
41 |
|
|
|
m = month |
|
|
y = year |
|
|
d = day |
|
|
|
|
42 |
! We deduce the calendar from the length of the year as it |
! We deduce the calendar from the length of the year as it |
43 |
! is faster than an INDEX on the calendar variable. |
! is faster than an INDEX on the calendar variable. |
44 |
|
|
45 |
! Gregorian |
! Gregorian |
46 |
IF ( (un_an > 365.0).AND.(un_an < 366.0) ) THEN |
IF ( (un_an > 365.0).AND.(un_an < 366.0) ) THEN |
47 |
jd = (1461*(y+4800+INT(( m-14 )/12)))/4 & |
jd = (1461*(year+4800+INT(( month-14 )/12)))/4 & |
48 |
& +(367*(m-2-12*(INT(( m-14 )/12))))/12 & |
+(367*(month-2-12*(INT(( month-14 )/12))))/12 & |
49 |
& -(3*((y+4900+INT((m-14)/12))/100))/4 & |
-(3*((year+4900+INT((month-14)/12))/100))/4 & |
50 |
& +d-32075 |
+day-32075 |
51 |
jd = jd-2299160 |
jd = jd-2299160 |
52 |
! No leap or All leap |
! No leap or All leap |
53 |
ELSE IF (ABS(un_an-365.0) <= EPSILON(un_an) .OR. & |
ELSE IF (ABS(un_an-365.0) <= EPSILON(un_an) .OR. & |
54 |
& ABS(un_an-366.0) <= EPSILON(un_an)) THEN |
ABS(un_an-366.0) <= EPSILON(un_an)) THEN |
55 |
ml = SUM(mon_len(1:m-1)) |
ml = SUM(mon_len(1:month-1)) |
56 |
jd = y*INT(un_an)+ml+(d-1) |
jd = year*INT(un_an)+ml+(day-1) |
57 |
! Calendar with regular month |
! Calendar with regular month |
58 |
ELSE |
ELSE |
59 |
ml = INT(un_an)/12 |
ml = INT(un_an)/12 |
60 |
jd = y*INT(un_an)+(m-1)*ml+(d-1) |
jd = year*INT(un_an)+(month-1)*ml+(day-1) |
61 |
ENDIF |
ENDIF |
62 |
|
|
63 |
julian_day = jd |
julian = dble(jd) + sec / un_jour |
|
julian_sec = sec |
|
|
|
|
|
julian = julian_day + julian_sec / un_jour |
|
64 |
|
|
65 |
END SUBROUTINE ymds2ju |
END SUBROUTINE ymds2ju |
66 |
|
|