source: CPL/oasis3/trunk/src/mod/oasis3/src/calend.f @ 1677

Last change on this file since 1677 was 1677, checked in by aclsce, 12 years ago

Imported oasis3 (tag ipslcm5a) from cvs server to svn server (igcmg project).

File size: 4.8 KB
Line 
1      SUBROUTINE calend (kdini, kmini, kyini, kinc, kcal,
2     $                   kdfin, kmfin, kyfin, klmo)
3C****
4C               *****************************
5C               * OASIS ROUTINE  -  LEVEL 1 *
6C               * -------------     ------- *
7C               *****************************
8C
9C**** *calend*  - Calendar routine
10C
11C     Purpose:
12C     -------
13C     Updates the calendar values. Date is of the form YYYYMMDD.
14C     Increases day by day the date, updates if necessary the month 
15C     and the year.
16C
17C**   Interface:
18C     ---------
19C       *CALL*  *calend (kdini, kmini, kyini, kinc, kcal
20C                        kdfin, kmfin, kyfin, klmo)*
21C
22C     Input:
23C     -----
24C                kdini,kmini,kyini : initial date (day,month,year)
25C                kinc              : number of days to increment
26C                kcal              : calendar type
27C
28C     Output:
29C     ------
30C                kdfin,kmfin,kyfin : final date
31C                klmo(12)          : length of the 12 months
32C
33C     Workspace:
34C     ---------
35C     None
36C
37C     Externals:
38C     ---------
39C     None
40C
41C     History:
42C     -------
43C       Version   Programmer     Date      Description
44C       -------   ----------     ----      ----------- 
45C       2.0       L. Terray      95/10/01  created
46C       2.3       S. Valcke      99/03/15  year is leap if divible by 4 but
47C                                          not by 100, leap if div. by 400
48C       2.3       S. Valcke      99/04/30  added: printing levels
49C
50C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51C
52C* ---------------------------- Include files ---------------------------
53C
54      USE mod_kinds_oasis
55      USE mod_unit
56      USE mod_printing
57C
58C* ---------------------------- Argument declarations -------------------
59C
60      INTEGER (kind=ip_intwp_p) klmo(12)
61C
62C* ---------------------------- Local declarations -------------------
63C
64      LOGICAL lleap
65C* ---------------------------- Poema verses ----------------------------
66C
67C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
68C
69C*    1. Length of the months
70C        --------------------
71C
72      IF (nlogprt .GE. 2) THEN
73          WRITE (UNIT = nulou,FMT = *) ' '
74          WRITE (UNIT = nulou,FMT = *) ' '
75          WRITE (UNIT = nulou,FMT = *) 
76     $    '           ROUTINE calend  -  Level 1'
77          WRITE (UNIT = nulou,FMT = *) 
78     $    '           **************     *******'
79          WRITE (UNIT = nulou,FMT = *) ' '
80          WRITE (UNIT = nulou,FMT = *) ' Updates calendar values'
81          WRITE (UNIT = nulou,FMT = *) ' '
82          WRITE (UNIT = nulou,FMT = *) ' '
83      ENDIF
84C
85C* Calculate month lengths for current year
86C
87      IF (kcal .eq. 0 .or. kcal .eq. 1) THEN
88
89        DO 110 jm = 1, 12
90          klmo(jm) = 31
91          IF (jm .eq. 4 .or. jm .eq. 6 .or.
92     $        jm .eq. 9 .or. jm .eq. 11) THEN
93              klmo(jm) = 30
94          ENDIF
95          IF (jm .eq. 2) THEN
96C
97C* Leap years
98C
99            lleap = .FALSE.
100            IF (kcal .eq. 1) THEN
101              IF (MOD(kyini,4) .eq. 0) lleap = .TRUE.
102              IF (MOD(kyini,100) .eq. 0) lleap = .FALSE.
103              IF (MOD(kyini,400) .eq. 0) lleap = .TRUE.
104            ENDIF
105            IF (lleap) THEN
106                klmo(jm) = 29
107              ELSE
108                klmo(jm) = 28
109            ENDIF
110          ENDIF
111 110    CONTINUE
112        kdfin = kdini
113        kmfin = kmini
114        kyfin = kyini
115C
116C
117C*    2. Loop on the days
118C        ----------------
119C
120        DO 210 jd = 1, kinc
121          kdfin = kdfin + 1
122          IF (kdfin .le. klmo(kmfin)) GOTO 210
123          kdfin = 1
124          kmfin = kmfin + 1
125          IF (kmfin .le. 12) GOTO 210
126          kmfin = 1
127          kyfin = kyfin + 1
128C
129C* Leap years
130C
131          lleap = .FALSE.
132          IF (kcal .eq. 1) THEN
133            IF (MOD(kyfin,4) .eq. 0) lleap = .TRUE.
134            IF (MOD(kyfin,100) .eq. 0) lleap = .FALSE.
135            IF (MOD(kyfin,400) .eq. 0) lleap = .TRUE.
136          ENDIF
137          IF (lleap) THEN
138              klmo(2) = 29
139            ELSE
140              klmo(2) = 28
141          ENDIF
142 210    CONTINUE
143      ELSE
144C
145C* Calculate month lengths for current year
146C
147        DO 310 jm = 1, 12
148          klmo(jm) = kcal
149 310    CONTINUE
150        kdfin = kdini
151        kmfin = kmini
152        kyfin = kyini
153C
154C*    2. Loop on the days
155C        ----------------
156        DO 410 jd = 1, kinc
157          kdfin = kdfin + 1
158          IF (kdfin .le. klmo(kmfin)) GOTO 410
159          kdfin = 1
160          kmfin = kmfin + 1
161          IF (kmfin .le. 12) GOTO 410
162          kmfin = 1
163          kyfin = kyfin + 1
164 410    CONTINUE
165      ENDIF
166C
167C
168C*    3. End of routine
169C        --------------
170C
171      IF (nlogprt .GE. 2) THEN
172          WRITE (UNIT = nulou,FMT = *) ' '
173          WRITE (UNIT = nulou,FMT = *) 
174     $    '          --------- End of routine calend ---------'
175          CALL FLUSH (nulou)
176      ENDIF
177      RETURN
178      END
Note: See TracBrowser for help on using the repository browser.