110 integer,
intent(inout):: year
111 integer,
intent(inout):: month
112 integer,
intent(inout):: day
113 integer,
intent(inout):: hour
114 integer,
intent(inout):: min
115 real(
dp),
intent(inout):: sec
116 type(
dc_cal),
intent(in):: cal
125 integer:: day_in_month_jg
126 integer,
pointer:: day_in_month(:) =>null()
131 integer:: month_in_year
133 integer:: hour_in_day
135 integer:: min_in_hour
137 real(
dp):: sec_in_min
143 real(
dp):: wyear, wday, whour, wmin
144 real(
dp):: wdb, ychunk_e6, ychunk_e3, chunk_scale_e6, chunk_scale_e3
154 select case( cal % cal_type )
166 month_in_year = cal % month_in_year
167 hour_in_day = cal % hour_in_day
168 min_in_hour = cal % min_in_hour
169 sec_in_min = cal % sec_in_min
170 day_in_month => cal % day_in_month
172 select case( cal % cal_type )
174 chunk_scale_e6 = 4.0e+5
175 ychunk_e6 = 146100000.0_dp
177 chunk_scale_e3 = 4.0e+2
178 ychunk_e3 = 146100.0_dp
180 chunk_scale_e6 = 4.0e+5
181 ychunk_e6 = 146097000.0_dp
183 chunk_scale_e3 = 4.0e+2
184 ychunk_e3 = 146097.0_dp
186 chunk_scale_e6 = 1.0e+6
187 ychunk_e6 = chunk_scale_e6 * sum( day_in_month(:) )
189 chunk_scale_e3 = 1.0e+3
190 ychunk_e3 = chunk_scale_e3 * sum( day_in_month(:) )
196 wyear = real( year,
dp )
197 wday = real( day,
dp )
198 whour = real( hour,
dp )
199 wmin = real( min,
dp )
205 if ( .not. sec < sec_in_min )
then
206 wmin = wmin + aint( sec / sec_in_min )
207 sec = mod( sec, sec_in_min )
208 elseif ( sec < 0.0_dp )
then
209 wdb = ceiling( abs(sec) / sec_in_min )
211 sec = sec + wdb * sec_in_min
217 if ( .not. wmin < min_in_hour )
then
218 whour = whour + aint( wmin / min_in_hour )
219 wmin = mod( wmin, real( min_in_hour,
dp ) )
220 elseif ( wmin < 0 )
then
221 wdb = ceiling( abs(wmin) / real(min_in_hour) )
223 wmin = wmin + wdb * min_in_hour
229 if ( .not. whour < hour_in_day )
then
230 wday = wday + aint( whour / hour_in_day )
231 whour = mod( whour, real( hour_in_day,
dp ) )
232 elseif ( whour < 0 )
then
233 wdb = ceiling( abs(whour) / real(hour_in_day) )
235 whour = whour + wdb * hour_in_day
241 if ( wday < 1.0_dp )
then
242 select case( cal % cal_type )
245 do while ( wday < 1.0_dp )
247 if ( wday < - ychunk_e6 )
then
248 wyear = wyear + chunk_scale_e6 * ( aint( wday / ychunk_e6 ) - 1.0_dp )
249 wday = mod( wday, ychunk_e6 ) + ychunk_e6
252 if ( wday < 1.0_dp )
then
253 wyear = wyear + chunk_scale_e3 * ( aint( wday / ychunk_e3 ) - 1.0_dp )
254 wday = mod( wday, ychunk_e3 ) + ychunk_e3
261 do while ( wday < 1.0_dp )
263 if ( wday < - ychunk_e6 )
then
264 wyear = wyear + chunk_scale_e6 * ( aint( wday / ychunk_e6 ) - 1.0_dp )
265 wday = mod( wday, ychunk_e6 ) + ychunk_e6
268 if ( wday < 1.0_dp )
then
269 wyear = wyear + chunk_scale_e3 * ( aint( wday / ychunk_e3 ) - 1.0_dp )
270 wday = mod( wday, ychunk_e3 ) + ychunk_e3
277 do while ( wday < 1.0_dp )
279 if ( wday < - ychunk_e6 )
then
280 wyear = wyear + chunk_scale_e6 * ( aint( wday / ychunk_e6 ) - 1.0_dp )
281 wday = mod( wday, ychunk_e6 ) + ychunk_e6
284 if ( wday < 1.0_dp )
then
285 wyear = wyear + chunk_scale_e3 * ( aint( wday / ychunk_e3 ) - 1.0_dp )
286 wday = mod( wday, ychunk_e3 ) + ychunk_e3
298 select case( cal % cal_type )
301 if ( wday > ychunk_e6 )
then
302 wyear = wyear + chunk_scale_e6 * aint( wday / ychunk_e6 )
303 wday = mod( wday, ychunk_e6 )
306 if ( wday > ychunk_e3 )
then
307 wyear = wyear + chunk_scale_e3 * aint( wday / ychunk_e3 )
308 wday = mod( wday, ychunk_e3 )
312 if ( month == 2 )
then
313 if ( mod( wyear, 4.0_dp ) == 0 )
then
319 day_in_month_jg = day_in_month(month)
322 if ( .not. wday > day_in_month_jg )
exit
324 wday = wday - day_in_month_jg
326 if ( month > month_in_year )
then
334 if ( wday > ychunk_e6 )
then
335 wyear = wyear + chunk_scale_e6 * aint( wday / ychunk_e6 )
336 wday = mod( wday, ychunk_e6 )
339 if ( wday > ychunk_e3 )
then
340 wyear = wyear + chunk_scale_e3 * aint( wday / ychunk_e3 )
341 wday = mod( wday, ychunk_e3 )
345 if ( month == 2 )
then
346 if ( mod( wyear, 400.0_dp ) == 0 )
then
348 elseif ( mod( wyear, 100.0_dp ) == 0 )
then
350 elseif ( mod( wyear, 4.0_dp ) == 0 )
then
356 day_in_month_jg = day_in_month(month)
359 if ( .not. wday > day_in_month_jg )
exit
361 wday = wday - day_in_month_jg
363 if ( month > month_in_year )
then
371 if ( wday > ychunk_e6 )
then
372 wyear = wyear + chunk_scale_e6 * aint( wday / ychunk_e6 )
373 wday = mod( wday, ychunk_e6 )
376 if ( wday > ychunk_e3 )
then
377 wyear = wyear + chunk_scale_e3 * aint( wday / ychunk_e3 )
378 wday = mod( wday, ychunk_e3 )
381 do while ( wday > day_in_month(month) )
382 wday = wday - day_in_month(month)
384 if ( month > month_in_year )
then
414 integer,
intent(in):: year
415 integer,
intent(in):: month
416 integer,
intent(in):: day
417 real(
dp),
intent(out):: day_of_year
418 type(
dc_cal),
intent(in):: cal
438 select case( cal % cal_type )
450 day_of_year = real( day,
dp )
455 select case( cal % cal_type )
460 if ( mod( year, 4 ) == 0 )
then
461 day_of_year = day_of_year + 29
463 day_of_year = day_of_year + 28
466 day_of_year = day_of_year + cal % day_in_month(i)
474 if ( mod( year, 400 ) == 0 )
then
475 day_of_year = day_of_year + 29
476 elseif ( mod( year, 100 ) == 0 )
then
477 day_of_year = day_of_year + 28
478 elseif ( mod( year, 4 ) == 0 )
then
479 day_of_year = day_of_year + 29
481 day_of_year = day_of_year + 28
484 day_of_year = day_of_year + cal % day_in_month(i)
492 day_of_year = day_of_year + cal % day_in_month(i)