/[lmdze]/trunk/IOIPSL/Calendar/ju2ymds.f90
ViewVC logotype

Contents of /trunk/IOIPSL/Calendar/ju2ymds.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 328 - (show annotations)
Thu Jun 13 14:40:06 2019 UTC (4 years, 11 months ago) by guez
File size: 2495 byte(s)
Change all `.f` suffixes to `.f90`. (The opposite was done in revision
82.)  Because of change of philosopy in GNUmakefile: we already had a
rewritten rule for `.f`, so it does not make the makefile longer to
replace it by a rule for `.f90`. And it spares us options of
makedepf90 and of the compiler. Also we prepare the way for a simpler
`CMakeLists.txt`.

1 module ju2ymds_m
2
3 implicit none
4
5 contains
6
7 SUBROUTINE ju2ymds (julian, year, month, day, sec)
8
9 ! This subroutine computes from the julian day the year,
10 ! month, day and seconds
11
12 ! In 1968 in a letter to the editor of Communications of the ACM
13 ! (CACM, volume 11, number 10, October 1968, p.657) Henry F. Fliegel
14 ! and Thomas C. Van Flandern presented such an algorithm.
15
16 ! See also: http://www.magnet.ch/serendipity/hermetic/cal_stud/jdn.htm
17
18 ! In the case of the Gregorian calendar we have chosen to use
19 ! the Lilian day numbers. This is the day counter which starts
20 ! on the 15th October 1582. This is the day at which Pope
21 ! Gregory XIII introduced the Gregorian calendar.
22 ! Compared to the true Julian calendar, which starts some 7980
23 ! years ago, the Lilian days are smaler and are dealt with easily
24 ! on 32 bit machines. With the true Julian days you can only the
25 ! fraction of the day in the real part to a precision of a 1/4 of
26 ! a day with 32 bits.
27
28 use calendar, only: un_jour, lock_unan
29 use ioconf_calendar_m, only: mon_len, un_an
30
31 REAL, INTENT(IN):: julian
32 INTEGER, INTENT(OUT):: year, month, day
33 REAL, INTENT(OUT):: sec
34
35 ! Local:
36 INTEGER l, n, i, jd, j, d, m, y, ml
37 INTEGER add_day
38
39 !--------------------------------------------------------------------
40
41 jd = INT(julian)
42 sec = (julian - jd) * un_jour
43
44 lock_unan = .TRUE.
45
46 IF (sec > un_jour) THEN
47 add_day = INT(sec / un_jour)
48 sec = sec - add_day * un_jour
49 jd = jd+add_day
50 ENDIF
51
52 ! Gregorian
53 IF ( (un_an > 365.0).AND.(un_an < 366.0) ) THEN
54 jd = jd+2299160
55
56 l = jd+68569
57 n = (4*l)/146097
58 l = l-(146097*n+3)/4
59 i = (4000*(l+1))/1461001
60 l = l-(1461*i)/4+31
61 j = (80*l)/2447
62 d = l-(2447*j)/80
63 l = j/11
64 m = j+2-(12*l)
65 y = 100*(n-49)+i+l
66 ! No leap or All leap
67 ELSE IF (ABS(un_an-365.0) <= EPSILON(un_an) .OR. &
68 & ABS(un_an-366.0) <= EPSILON(un_an) ) THEN
69 y = jd/INT(un_an)
70 l = jd-y*INT(un_an)
71 m = 1
72 ml = 0
73 DO WHILE (ml+mon_len(m) <= l)
74 ml = ml+mon_len(m)
75 m = m+1
76 ENDDO
77 d = l-ml+1
78 ! others
79 ELSE
80 ml = INT(un_an)/12
81 y = jd/INT(un_an)
82 l = jd-y*INT(un_an)
83 m = (l/ml)+1
84 d = l-(m-1)*ml+1
85 ENDIF
86
87 day = d
88 month = m
89 year = y
90
91 END SUBROUTINE ju2ymds
92
93 end module ju2ymds_m

  ViewVC Help
Powered by ViewVC 1.1.21