97 |
C and its format: ( yymmdd , hhmmss , leap year, weekday ) |
C and its format: ( yymmdd , hhmmss , leap year, weekday ) |
98 |
C (1/2) (1 - 7) |
C (1/2) (1 - 7) |
99 |
C The Gregorian calendar starts on Friday, 15 Oct. 1582. |
C The Gregorian calendar starts on Friday, 15 Oct. 1582. |
100 |
refdate(1) = 15821015 |
refDate(1) = 15821015 |
101 |
refdate(2) = 0 |
refDate(2) = 0 |
102 |
refdate(3) = 1 |
refDate(3) = 1 |
103 |
refdate(4) = 1 |
refDate(4) = 1 |
104 |
|
|
105 |
C Number of months per year and other useful numbers. |
C Number of months per year and other useful numbers. |
106 |
nmonthyear = 12 |
nDaysNoLeap = 365 |
107 |
ndaysnoleap = 365 |
nDaysLeap = 366 |
108 |
ndaysleap = 366 |
nMaxDayMonth = 31 |
109 |
nmaxdaymonth = 31 |
hoursPerDay = 24 |
110 |
hoursperday = 24 |
minutesPerHour = 60 |
111 |
minutesperday = 1440 |
minutesPerDay = minutesPerHour*hoursPerDay |
112 |
minutesperhour = 60 |
secondsPerMinute = 60 |
113 |
secondsperday = 86400 |
secondsPerHour = secondsPerMinute*minutesPerHour |
114 |
secondsperhour = 3600 |
secondsPerDay = secondsPerMinute*minutesPerDay |
|
secondsperminute = 60 |
|
115 |
|
|
116 |
C Number of days per month. |
C Number of days per month. |
117 |
C The "magic" number 2773 derives from the sequence: 101010110101 |
C The "magic" number 2773 derives from the sequence: 101010110101 |
120 |
C executed in reverse order. Accidentially, the latter |
C executed in reverse order. Accidentially, the latter |
121 |
C is a prime number. |
C is a prime number. |
122 |
k=2773 |
k=2773 |
123 |
do i=1,nmonthyear |
do i=1,nMonthYear |
124 |
j = mod(k,2) |
j = mod(k,2) |
125 |
k = (k-j)/2 |
k = (k-j)/2 |
126 |
ndaymonth(i,1) = 30+j |
nDayMonth(i,1) = 30+j |
127 |
ndaymonth(i,2) = 30+j |
nDayMonth(i,2) = 30+j |
128 |
enddo |
enddo |
129 |
ndaymonth(2,1) = 28 |
nDayMonth(2,1) = 28 |
130 |
ndaymonth(2,2) = 29 |
nDayMonth(2,2) = 29 |
131 |
|
|
132 |
C Week days. |
C Week days. |
133 |
dayofweek(1) = 'FRI' |
dayOfWeek(1) = 'FRI' |
134 |
dayofweek(2) = 'SAT' |
dayOfWeek(2) = 'SAT' |
135 |
dayofweek(3) = 'SUN' |
dayOfWeek(3) = 'SUN' |
136 |
dayofweek(4) = 'MON' |
dayOfWeek(4) = 'MON' |
137 |
dayofweek(5) = 'TUE' |
dayOfWeek(5) = 'TUE' |
138 |
dayofweek(6) = 'WED' |
dayOfWeek(6) = 'WED' |
139 |
dayofweek(7) = 'THU' |
dayOfWeek(7) = 'THU' |
140 |
|
|
141 |
else if ( TheCalendar .eq. 'model') then |
else if ( TheCalendar .eq. 'model') then |
142 |
usingModelCalendar = .TRUE. |
usingModelCalendar = .TRUE. |
143 |
C Assume a model calendar having 12 months with thirty days each. |
C Assume a model calendar having 12 months with thirty days each. |
144 |
C Reference date is the first day of year 0 at 0am, and model day 1. |
C Reference date is the first day of year 0 at 0am, and model day 1. |
145 |
refdate(1) = 00000101 |
refDate(1) = 00000101 |
146 |
refdate(2) = 0 |
refDate(2) = 0 |
147 |
refdate(3) = 1 |
refDate(3) = 1 |
148 |
refdate(4) = 1 |
refDate(4) = 1 |
149 |
|
|
150 |
C Some useful numbers. |
C Some useful numbers. |
151 |
nmonthyear = 12 |
nDaysNoLeap = 360 |
152 |
ndaysnoleap = 360 |
nDaysLeap = 360 |
153 |
ndaysleap = 360 |
nMaxDayMonth = 30 |
154 |
nmaxdaymonth = 30 |
hoursPerDay = 24 |
155 |
hoursperday = 24 |
minutesPerHour = 60 |
156 |
minutesperday = 1440 |
minutesPerDay = minutesPerHour*hoursPerDay |
157 |
minutesperhour = 60 |
secondsPerMinute = 60 |
158 |
secondsperday = 86400 |
secondsPerHour = secondsPerMinute*minutesPerHour |
159 |
secondsperhour = 3600 |
secondsPerDay = secondsPerMinute*minutesPerDay |
160 |
secondsperminute = 60 |
do i=1,nMonthYear |
161 |
do i=1,nmonthyear |
nDayMonth(i,1) = 30 |
162 |
ndaymonth(i,1) = 30 |
nDayMonth(i,2) = 30 |
|
ndaymonth(i,2) = 30 |
|
163 |
enddo |
enddo |
164 |
|
|
165 |
C Week days (Model Day 1 - 7). |
C Week days (Model Day 1 - 7). |
166 |
dayofweek(1) = 'MD1' |
dayOfWeek(1) = 'MD1' |
167 |
dayofweek(2) = 'MD2' |
dayOfWeek(2) = 'MD2' |
168 |
dayofweek(3) = 'MD3' |
dayOfWeek(3) = 'MD3' |
169 |
dayofweek(4) = 'MD4' |
dayOfWeek(4) = 'MD4' |
170 |
dayofweek(5) = 'MD5' |
dayOfWeek(5) = 'MD5' |
171 |
dayofweek(6) = 'MD6' |
dayOfWeek(6) = 'MD6' |
172 |
dayofweek(7) = 'MD7' |
dayOfWeek(7) = 'MD7' |
173 |
|
|
174 |
c else if ( TheCalendar .eq. 'julian') then |
c else if ( TheCalendar .eq. 'julian') then |
175 |
c usingJulianCalendar = .TRUE. |
c usingJulianCalendar = .TRUE. |
187 |
cal_setStatus = 1 |
cal_setStatus = 1 |
188 |
|
|
189 |
C Map the numerical model parameters. --> common blocks in CALENDAR.h |
C Map the numerical model parameters. --> common blocks in CALENDAR.h |
190 |
modelstart = modstart |
modelStart = modstart |
191 |
modelend = modend |
modelEnd = modend |
192 |
modelstep = modstep |
modelStep = modstep |
193 |
modeliter0 = moditerini |
modelIter0 = moditerini |
194 |
modeliterend = moditerend |
modelIterEnd = moditerend |
195 |
modelintsteps = modintsteps |
modelIntSteps = modintsteps |
196 |
|
|
197 |
C Do first consistency checks |
C Do first consistency checks |
198 |
C o Time step. |
C o Time step. |
199 |
if ( modelstep .le. 0. ) then |
if ( modelStep .le. 0. ) then |
200 |
ierr = 102 |
ierr = 102 |
201 |
call cal_PrintError( ierr, myThid ) |
call cal_PrintError( ierr, myThid ) |
202 |
stop ' stopped in cal_Set.' |
stop ' stopped in cal_Set.' |
203 |
endif |
endif |
204 |
if ( modelstep .lt. 1. ) then |
if ( modelStep .lt. 1. ) then |
205 |
ierr = 103 |
ierr = 103 |
206 |
call cal_PrintError( ierr, myThid ) |
call cal_PrintError( ierr, myThid ) |
207 |
stop ' stopped in cal_Set.' |
stop ' stopped in cal_Set.' |
208 |
endif |
endif |
209 |
if ( abs(modelstep - nint(modelstep)) .gt. 0.000001 ) then |
if ( abs(modelStep - nint(modelStep)) .gt. 0.000001 ) then |
210 |
ierr = 104 |
ierr = 104 |
211 |
call cal_PrintError( ierr, myThid ) |
call cal_PrintError( ierr, myThid ) |
212 |
stop ' stopped in cal_Set.' |
stop ' stopped in cal_Set.' |
213 |
else |
else |
214 |
modelstep = float(nint(modelstep)) |
modelStep = float(nint(modelStep)) |
215 |
endif |
endif |
216 |
|
|
217 |
C- Record completion of calendar settings: stage 2 = numerical model parms |
C- Record completion of calendar settings: stage 2 = numerical model parms |
223 |
|
|
224 |
C From here on, the final calendar settings are determined by the |
C From here on, the final calendar settings are determined by the |
225 |
C following variables: |
C following variables: |
226 |
C modelstart, modelstep*modelintsteps & modelBaseDate |
C modelStart, modelStep*modelIntSteps & modelBaseDate |
227 |
|
|
228 |
runtimesecs = modelintsteps*modelstep |
runtimesecs = modelIntSteps*modelStep |
229 |
|
|
230 |
C Determine the startdate of the integration. |
C Determine the startdate of the integration. |
231 |
c iterinisecs = float(modeliter0)*modelstep |
c iterinisecs = float(modelIter0)*modelStep |
232 |
C-jmc: above does not work if baseTime <> 0 ; fix it below: |
C-jmc: above does not work if baseTime <> 0 ; fix it below: |
233 |
iterinisecs = modelstart |
iterinisecs = modelStart |
234 |
call cal_TimeInterval( iterinisecs, 'secs', iterinitime, myThid ) |
call cal_TimeInterval( iterinisecs, 'secs', iterinitime, myThid ) |
235 |
call cal_AddTime( modelBaseDate, iterinitime, modelstartdate, |
call cal_AddTime( modelBaseDate, iterinitime, modelStartDate, |
236 |
& myThid ) |
& myThid ) |
237 |
|
|
238 |
call cal_TimeInterval( runtimesecs, 'secs', timediff, myThid ) |
call cal_TimeInterval( runtimesecs, 'secs', timediff, myThid ) |
239 |
call cal_AddTime( modelstartdate, timediff, modelenddate, |
call cal_AddTime( modelStartDate, timediff, modelEndDate, |
240 |
& myThid ) |
& myThid ) |
241 |
|
|
242 |
C- Record completion of calendar settings: stage 3 = fully set-up. |
C- Record completion of calendar settings: stage 3 = fully set-up. |