/[MITgcm]/MITgcm/pkg/cal/cal_daysformonth.F
ViewVC logotype

Contents of /MITgcm/pkg/cal/cal_daysformonth.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.3 - (show annotations) (download)
Thu Apr 19 19:43:31 2012 UTC (12 years, 1 month ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, checkpoint64, checkpoint65, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint65o, checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, HEAD
Changes since 1.2: +13 -1 lines
Merge ECCO-CLIVAR code

1 C $Header: /u/gcmpack/MITgcm/pkg/cal/cal_daysformonth.F,v 1.2 2003/10/09 04:19:19 edhill Exp $
2 C $Name: $
3
4 #include "CAL_OPTIONS.h"
5
6 subroutine cal_DaysForMonth(
7 I imonth,
8 O firstday,
9 O lastday,
10 O ndays,
11 I mythid
12 & )
13
14 c ==================================================================
15 c SUBROUTINE cal_DaysForMonth
16 c ==================================================================
17 c
18 c o Given the current month of the integration this routine returns
19 c first, the last and the number of calendar days that will have
20 c to be performed.
21 c
22 c This routine also checks consistency of variables quite
23 c extensively.
24 c
25 c started: Christian Eckert eckert@mit.edu 06-Apr-2000
26 c
27 c changed:
28 c
29 c ==================================================================
30 c SUBROUTINE cal_DaysForMonth
31 c ==================================================================
32
33 implicit none
34
35 c == global variables ==
36
37 #include "cal.h"
38
39 c == routine arguments ==
40
41 integer imonth
42 integer firstday
43 integer lastday
44 integer ndays
45 integer mythid
46
47 c == local variables ==
48
49 integer i
50 integer ierr
51 integer nummonths
52 integer numdays
53 integer firstyear
54 integer firstmonth
55 integer firstd
56 integer lyfirst
57 integer lastyear
58 integer lastmonth
59 integer lastd
60 integer lastsecs
61 integer lylast
62 integer currentyear
63 integer currentmonth
64 integer lycurrent
65
66 c == external ==
67
68 integer cal_IntMonths
69 external cal_IntMonths
70 integer cal_IsLeap
71 external cal_IsLeap
72
73 c == end of interface ==
74
75 lyfirst = cal_IsLeap( firstyear, mythid )
76 lylast = cal_IsLeap( lastyear, mythid )
77
78 nummonths = cal_Intmonths( mythid )
79
80 firstyear = modelstartdate(1)/10000
81 firstmonth = mod(modelstartdate(1)/100,100)
82 firstd = mod(modelstartdate(1),100)
83 lastyear = modelenddate(1)/10000
84 lastmonth = mod(modelenddate(1)/100,100)
85 lastd = mod(modelenddate(1),100)
86 lastsecs = modelenddate(2)/10000*secondsperhour +
87 & mod(modelenddate(2)/100,100)*secondsperminute +
88 & mod(modelenddate(2),100)
89
90 if ( nummonths .eq. 1 ) then
91 if ( imonth .eq. 1 ) then
92 c-- Get the number of days in the first month.
93 if ( firstmonth .eq. lastmonth ) then
94 if (lastsecs .eq. 0) then
95 c-- Not really another day.
96 lastday = lastd - 1
97 else
98 lastday = lastd
99 endif
100 firstday = 1
101 else if ( mod(firstmonth+1,nmonthyear) .eq. lastmonth ) then
102 c-- This can only happen if we end at midnight of the first
103 c-- day of the next month.
104 if ( ( modelenddate(2) .eq. 0 ) .and.
105 & ( mod(modelenddate(1),100) .eq. 1 ) ) then
106 firstday = firstd
107 lastday = ndaymonth(firstmonth,lyfirst)
108 else
109 c-- We do not end at midnight of the first day of
110 c-- the next month.
111 ierr = 2704
112 call cal_PrintError( ierr, mythid )
113 stop ' stopped in cal_DaysForMonth.'
114 endif
115 else
116 c-- The first and the last month are inconsistent with imonth.
117 ierr = 2703
118 call cal_PrintError( ierr, mythid )
119 stop ' stopped in cal_DaysForMonth.'
120 endif
121 else
122 c-- The variables nummonths and imonth are inconsistent;
123 c-- ( imonth .gt. nummonths ).
124 ierr = 2702
125 call cal_PrintError( ierr, mythid )
126 stop ' stopped in cal_DaysForMonth.'
127 endif
128
129 else if ( nummonths .gt. 1 ) then
130 c-- More than one month of integration.
131 if ( imonth .eq. 1 ) then
132 firstday = 1
133 lastday = ndaymonth(firstmonth,lyfirst) - firstd + 1
134 else if ( ( imonth .gt. 1 ) .and.
135 & ( imonth .lt. nummonths ) ) then
136 c-- Somewhere between first and last month.
137 currentmonth = firstmonth
138 currentyear = firstyear
139 numdays = ndaymonth(firstmonth,lyfirst) - firstd + 1
140 do i = 2,imonth-1
141 c-- Accumulate days of the intermediate months.
142 currentmonth = mod(currentmonth+1,nmonthyear)
143 if ( currentmonth .eq. 0 ) then
144 currentmonth = 12
145 endif
146 if ( currentmonth .eq. 1 ) then
147 currentyear = currentyear + 1
148 endif
149 lycurrent = cal_IsLeap( currentyear, mythid )
150 numdays = numdays + ndaymonth(currentmonth,lycurrent)
151 enddo
152 currentmonth = mod(currentmonth+1,nmonthyear)
153 if ( currentmonth .eq. 0 ) then
154 currentmonth = 12
155 endif
156 if ( currentmonth .eq. 1 ) then
157 currentyear = currentyear + 1
158 endif
159 lycurrent = cal_IsLeap( currentyear, mythid )
160 firstday = numdays + 1
161 lastday = numdays + ndaymonth(currentmonth,lycurrent)
162 else if ( imonth .eq. nummonths ) then
163 c-- The last month of the integration.
164 currentmonth = firstmonth
165 currentyear = firstyear
166 numdays = ndaymonth(firstmonth,lyfirst) - firstd + 1
167 do i = 2,nummonths-1
168 c-- Accumulate days of the intermediate months.
169 currentmonth = mod(currentmonth+1,nmonthyear)
170 if ( currentmonth .eq. 0 ) then
171 currentmonth = 12
172 endif
173 if ( currentmonth .eq. 1 ) then
174 currentyear = currentyear + 1
175 endif
176 lycurrent = cal_IsLeap( currentyear, mythid )
177 numdays = numdays + ndaymonth(currentmonth,lycurrent)
178 enddo
179 c-- Prepare for the last month of integration.
180 currentmonth = mod(currentmonth+1,nmonthyear)
181 if ( currentmonth .eq. 0 ) then
182 currentmonth = 12
183 endif
184 if ( currentmonth .eq. 1 ) then
185 currentyear = currentyear + 1
186 endif
187 lycurrent = cal_IsLeap( currentyear, mythid )
188 if ( ( modelenddate(2) .eq. 0 ) .and.
189 & ( mod(modelenddate(1),100) .eq. 1 ) ) then
190 c-- This can only happen if we end at midnight of the first
191 c-- day of the next month.
192 lastday = numdays + ndaymonth(currentmonth,lycurrent)
193 else
194 c-- We do not stop at midnight of the first day of the
195 c-- next month.
196 if (lastsecs .eq. 0) then
197 c-- But we might stop at midnight of a day.
198 lastday = numdays + lastd - 1
199 else
200 lastday = numdays + lastd
201 endif
202 endif
203 firstday = numdays + 1
204 else
205 c-- The variables imonth and nummonths are inconsistent.
206 ierr = 2705
207 call cal_PrintError( ierr, mythid )
208 stop ' stopped in cal_DaysForMonth.'
209 endif
210 else
211 c-- The number of months to integrate is wrong; check cal_IntMonths.
212 ierr = 2701
213 call cal_PrintError( ierr, mythid )
214 stop ' stopped in cal_DaysForMonth.'
215 endif
216
217 c-- The number of days to integrate in the given month.
218 ndays = lastday - firstday + 1
219
220 return
221 end
222

  ViewVC Help
Powered by ViewVC 1.1.22