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

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

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


Revision 1.3 - (show annotations) (download)
Tue Mar 16 00:11:46 2010 UTC (14 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62v, checkpoint62u, checkpoint62t, 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, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62w, checkpoint62z, checkpoint62y, checkpoint62x, checkpoint63g, checkpoint64, checkpoint65, checkpoint63, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63a, checkpoint63b, checkpoint63c, 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: +9 -9 lines
avoid unbalanced quote (single or double) in commented line

1 C $Header: /u/gcmpack/MITgcm/pkg/cal/cal_stepsforday.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_StepsForDay(
7 I iday,
8 O firststep,
9 O laststep,
10 O nsteps,
11 I mythid
12 & )
13
14 c ==================================================================
15 c SUBROUTINE cal_StepsForDay
16 c ==================================================================
17 c
18 c o Given the current day of the integration this routine returns
19 c first, the last and the number of model steps the will have to
20 c 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_StepsForDay
31 c ==================================================================
32
33 implicit none
34
35 c == global variables ==
36
37 #include "cal.h"
38
39 c == routine arguments ==
40
41 integer iday
42 integer firststep
43 integer laststep
44 integer nsteps
45 integer mythid
46
47 c == local variables ==
48
49 integer ierr
50 integer mdstep
51 integer numdays
52 integer numsteps
53 integer frac1
54 integer frac2
55 integer frac3
56 integer frac4
57 integer fullsteps
58 integer firstyear
59 integer firstmonth
60 integer firstday
61 integer lyfirst
62 integer startsecs
63 integer lastday
64 integer endsecs
65
66 c == external ==
67
68 external cal_IntDays
69 integer cal_IntDays
70 external cal_IsLeap
71 integer cal_IsLeap
72
73 c == end of interface ==
74
75 numdays = cal_IntDays( mythid )
76 lyfirst = cal_IsLeap( firstyear, mythid )
77
78 mdstep = int(modelstep)
79
80 firstyear = modelstartdate(1)/10000
81 firstmonth = mod(modelstartdate(1)/100,100)
82 firstday = mod(modelstartdate(1),100)
83 lastday = mod(modelenddate(1),100)
84
85 startsecs = (modelstartdate(2)/10000)*secondsperhour +
86 & mod(modelstartdate(2)/100,100)*secondsperminute +
87 & mod(modelstartdate(2),100)
88 endsecs = (modelenddate(2)/10000)*secondsperhour +
89 & mod(modelenddate(2)/100,100)*secondsperminute +
90 & mod(modelenddate(2),100)
91
92 if ( numdays .eq. 1 ) then
93 if ( iday .eq. firstday ) then
94 c-- Get the number of steps in the first day.
95 if ( firstday .eq. lastday ) then
96 firststep = 1
97 laststep = modelintsteps
98 else if ( mod(firstday+1,ndaymonth(firstmonth,lyfirst)) .eq.
99 & lastday ) then
100 c-- This can only happen if we end at midnight of the next day.
101 if ( modelenddate(2) .eq. 0 ) then
102 firststep = 1
103 laststep = modelintsteps
104 c-- Note: This holds only if modelenddate was determined
105 c-- such that it coincides with the model final time.
106 else
107 c-- We do not end at midnight of the first day of
108 c-- the next month.
109 ierr = 2604
110 call cal_PrintError( ierr, mythid )
111 stop ' stopped in cal_StepsForDay.'
112 endif
113 else
114 c-- The first and the last day are inconsistent with iday.
115 ierr = 2603
116 call cal_PrintError( ierr, mythid )
117 stop ' stopped in cal_StepsForDay.'
118 endif
119 else
120 c-- The variables numdays and iday are inconsistent;
121 c-- ( iday .gt. numdays ).
122 ierr = 2602
123 call cal_PrintError( ierr, mythid )
124 stop ' stopped in cal_StepsForDay.'
125 endif
126
127 else if ( numdays .gt. 1 ) then
128 c-- More than one day of integration.
129 if ( iday .eq. 1 ) then
130 firststep = 1
131 laststep = int((secondsperday - startsecs)/mdstep)
132 else if ( ( iday .gt. 1 ) .and.
133 & ( iday .lt. numdays) ) then
134 c-- Somewhere between first and last month.
135 c-- The first steps in iday.
136 fullsteps = int((secondsperday - startsecs)/mdstep)
137 numsteps = fullsteps
138 c-- What is left in the first day (frac1).
139 frac1 = (secondsperday - startsecs) - fullsteps*mdstep
140 fullsteps = int(secondsperday/modelstep)
141 c-- What is left in a complete day (frac2).
142 frac2 = secondsperday - fullsteps*mdstep
143 c-- What is left up to the current day (frac3).
144 frac3 = frac1 + frac2*(iday - 1)
145 numsteps = numsteps + (iday - 1)*fullsteps +
146 & frac3/mdstep
147 laststep = numsteps
148 firststep = laststep - secondsperday/mdstep + 1
149
150 else if ( iday .eq. numdays ) then
151 c-- The last day of integration.
152 c-- The first step in iday.
153 fullsteps = int((secondsperday - startsecs)/mdstep)
154 numsteps = fullsteps
155 c-- What is left in the first day (frac1).
156 frac1 = (secondsperday - startsecs) - fullsteps*mdstep
157 fullsteps = int(secondsperday/modelstep)
158 c-- What is left in a complete day (frac2).
159 frac2 = secondsperday - fullsteps*mdstep
160 c-- What is left up to the day before the last (frac3).
161 frac3 = frac1 + frac2*(iday - 2)
162 numsteps = numsteps + (iday - 2)*fullsteps
163 c-- The last step in iday.
164 if ( modelenddate(2) .eq. 0 ) then
165 c-- This can only happen if we end at midnight of the next day.
166 laststep = numsteps + fullsteps
167 firststep = numsteps + 1
168 c-- Note: There should be no fraction left
169 c-- ( mod(frac3,mdstep) = frac3/mdstep ) if modelenddate
170 c-- is based on an integral number of timesteps.
171 else
172 frac4 = frac3 + endsecs
173 numsteps = numsteps + frac4/mdstep
174 laststep = numsteps
175
176 c-- Note: There should be no fraction left
177 c-- ( mod(frac4,mdstep = frac4/mdstep ) if modelenddate
178 c-- is based on an integral number of timesteps.
179
180 firststep = laststep - endsecs/mdstep + 1
181 endif
182 else
183 c-- The variables iday and numdays are inconsistent.
184 ierr = 2605
185 call cal_PrintError( ierr, mythid )
186 stop ' stopped in cal_DaysForMonth.'
187 endif
188 else
189 c-- The number of days to integrate is wrong; check cal_IntDays.
190 ierr = 2601
191 call cal_PrintError( ierr, mythid )
192 stop ' stopped in cal_StepsForDay.'
193 endif
194
195 c-- The number of days to integrate in the given month.
196 nsteps = laststep - firststep + 1
197
198 return
199 end
200

  ViewVC Help
Powered by ViewVC 1.1.22