183 integer,
intent(inout):: year
184 integer,
intent(inout):: month
185 integer,
intent(inout):: day
186 integer,
intent(inout):: hour
187 integer,
intent(inout):: min
188 real(
dp),
intent(inout):: sec
189 type(
dc_cal),
intent(in):: cal
191 integer:: day_in_month_jg
192 integer,
pointer:: day_in_month(:) =>null()
194 integer:: month_in_year
195 integer:: hour_in_day
196 integer:: min_in_hour
197 real(
dp):: sec_in_min
199 real(
dp):: wyear, wday, whour, wmin
200 real(
dp):: wdb, ychunk_e6, ychunk_e3, chunk_scale_e6, chunk_scale_e3
204 select case( cal % cal_type )
213 month_in_year = cal % month_in_year
214 hour_in_day = cal % hour_in_day
215 min_in_hour = cal % min_in_hour
216 sec_in_min = cal % sec_in_min
217 day_in_month => cal % day_in_month
219 select case( cal % cal_type )
221 chunk_scale_e6 = 4.0e+5
222 ychunk_e6 = 146100000.0_dp
223 chunk_scale_e3 = 4.0e+2
224 ychunk_e3 = 146100.0_dp
226 chunk_scale_e6 = 4.0e+5
227 ychunk_e6 = 146097000.0_dp
228 chunk_scale_e3 = 4.0e+2
229 ychunk_e3 = 146097.0_dp
231 chunk_scale_e6 = 1.0e+6
232 ychunk_e6 = chunk_scale_e6 * sum( day_in_month(:) )
233 chunk_scale_e3 = 1.0e+3
234 ychunk_e3 = chunk_scale_e3 * sum( day_in_month(:) )
237 wyear = real( year,
dp )
238 wday = real( day,
dp )
239 whour = real( hour,
dp )
240 wmin = real( min,
dp )
242 if ( .not. sec < sec_in_min )
then
243 wmin = wmin + aint( sec / sec_in_min )
244 sec = mod( sec, sec_in_min )
245 elseif ( sec < 0.0_dp )
then
246 wdb = ceiling( abs(sec) / sec_in_min )
248 sec = sec + wdb * sec_in_min
251 if ( .not. wmin < min_in_hour )
then
252 whour = whour + aint( wmin / min_in_hour )
253 wmin = mod( wmin, real( min_in_hour,
dp ) )
254 elseif ( wmin < 0 )
then
255 wdb = ceiling( abs(wmin) / real(min_in_hour) )
257 wmin = wmin + wdb * min_in_hour
260 if ( .not. whour < hour_in_day )
then
261 wday = wday + aint( whour / hour_in_day )
262 whour = mod( whour, real( hour_in_day,
dp ) )
263 elseif ( whour < 0 )
then
264 wdb = ceiling( abs(whour) / real(hour_in_day) )
266 whour = whour + wdb * hour_in_day
269 if ( wday < 1.0_dp )
then
270 select case( cal % cal_type )
272 do while ( wday < 1.0_dp )
273 if ( wday < - ychunk_e6 )
then
274 wyear = wyear + chunk_scale_e6 * ( aint( wday / ychunk_e6 ) - 1.0_dp )
275 wday = mod( wday, ychunk_e6 ) + ychunk_e6
277 if ( wday < 1.0_dp )
then
278 wyear = wyear + chunk_scale_e3 * ( aint( wday / ychunk_e3 ) - 1.0_dp )
279 wday = mod( wday, ychunk_e3 ) + ychunk_e3
283 do while ( wday < 1.0_dp )
284 if ( wday < - ychunk_e6 )
then
285 wyear = wyear + chunk_scale_e6 * ( aint( wday / ychunk_e6 ) - 1.0_dp )
286 wday = mod( wday, ychunk_e6 ) + ychunk_e6
288 if ( wday < 1.0_dp )
then
289 wyear = wyear + chunk_scale_e3 * ( aint( wday / ychunk_e3 ) - 1.0_dp )
290 wday = mod( wday, ychunk_e3 ) + ychunk_e3
294 do while ( wday < 1.0_dp )
295 if ( wday < - ychunk_e6 )
then
296 wyear = wyear + chunk_scale_e6 * ( aint( wday / ychunk_e6 ) - 1.0_dp )
297 wday = mod( wday, ychunk_e6 ) + ychunk_e6
299 if ( wday < 1.0_dp )
then
300 wyear = wyear + chunk_scale_e3 * ( aint( wday / ychunk_e3 ) - 1.0_dp )
301 wday = mod( wday, ychunk_e3 ) + ychunk_e3
307 select case( cal % cal_type )
309 if ( wday > ychunk_e6 )
then
310 wyear = wyear + chunk_scale_e6 * aint( wday / ychunk_e6 )
311 wday = mod( wday, ychunk_e6 )
313 if ( wday > ychunk_e3 )
then
314 wyear = wyear + chunk_scale_e3 * aint( wday / ychunk_e3 )
315 wday = mod( wday, ychunk_e3 )
318 if ( month == 2 )
then
319 if ( mod( nint(wyear), 4 ) == 0 )
then
325 day_in_month_jg = day_in_month(month)
327 if ( .not. wday > day_in_month_jg )
exit
328 wday = wday - day_in_month_jg
330 if ( month > month_in_year )
then
336 if ( wday > ychunk_e6 )
then
337 wyear = wyear + chunk_scale_e6 * aint( wday / ychunk_e6 )
338 wday = mod( wday, ychunk_e6 )
340 if ( wday > ychunk_e3 )
then
341 wyear = wyear + chunk_scale_e3 * aint( wday / ychunk_e3 )
342 wday = mod( wday, ychunk_e3 )
345 if ( month == 2 )
then
346 if ( mod( nint(wyear), 400 ) == 0 )
then
348 elseif ( mod( nint(wyear), 100 ) == 0 )
then
350 elseif ( mod( nint(wyear), 4 ) == 0 )
then
356 day_in_month_jg = day_in_month(month)
358 if ( .not. wday > day_in_month_jg )
exit
359 wday = wday - day_in_month_jg
361 if ( month > month_in_year )
then
367 if ( wday > ychunk_e6 )
then
368 wyear = wyear + chunk_scale_e6 * aint( wday / ychunk_e6 )
369 wday = mod( wday, ychunk_e6 )
371 if ( wday > ychunk_e3 )
then
372 wyear = wyear + chunk_scale_e3 * aint( wday / ychunk_e3 )
373 wday = mod( wday, ychunk_e3 )
375 do while ( wday > day_in_month(month) )
376 wday = wday - day_in_month(month)
378 if ( month > month_in_year )
then
426 integer,
intent(in):: year
427 integer,
intent(in):: month
428 integer,
intent(in):: day
429 real(
dp),
intent(out):: day_of_year
430 type(
dc_cal),
intent(in):: cal
437 select case( cal % cal_type )
446 day_of_year = real( day,
dp )
448 select case( cal % cal_type )
452 if ( mod( year, 4 ) == 0 )
then
453 day_of_year = day_of_year + 29
455 day_of_year = day_of_year + 28
458 day_of_year = day_of_year + cal % day_in_month(i)
464 if ( mod( year, 400 ) == 0 )
then
465 day_of_year = day_of_year + 29
466 elseif ( mod( year, 100 ) == 0 )
then
467 day_of_year = day_of_year + 28
468 elseif ( mod( year, 4 ) == 0 )
then
469 day_of_year = day_of_year + 29
471 day_of_year = day_of_year + 28
474 day_of_year = day_of_year + cal % day_in_month(i)
479 day_of_year = day_of_year + cal % day_in_month(i)