62 type(
dc_cal),
intent(in),
optional,
target:: cal
67 type(
dc_cal),
pointer:: calp =>null()
68 real(
dp):: start_year, start_day, start_sec, start_neg_offset_day
69 real(
dp):: end_year, end_day, end_sec, end_neg_offset_day
70 integer:: day_in_4years, day_in_400years
71 integer:: start_year_int, end_year_int
77 if (
present( cal ) )
then
87 if ( .not. calp % initialized )
then
92 if ( .not. start_date % initialized )
then
97 if ( .not. end_date % initialized )
then
102 start_neg_offset_day = 0
103 end_neg_offset_day = 0
105 start_year_int = start_date % year
106 end_year_int = end_date % year
111 select case( calp % cal_type )
118 do while ( start_year_int < 1 )
119 start_neg_offset_day = start_neg_offset_day &
120 & + day_in_4years * 100
121 start_year_int = start_year_int &
128 if ( ( start_year_int - 1 ) > 4 )
then
129 start_day = int( ( start_year_int - 1 ) / 4 ) * day_in_4years
130 start_year = mod( start_year_int - 1, 4 ) + 1
133 start_year = start_year_int
136 start_day = start_day + ( start_year - 1 ) * sum( calp % day_in_month(:) )
137 do i = 1, start_date % month - 1
138 if ( int(start_year) == 4 .and. i == 2 )
then
139 start_day = start_day + 29
141 start_day = start_day + calp % day_in_month(i)
144 start_day = start_day + start_date % day
148 do while ( end_year_int < 1 )
149 end_neg_offset_day = end_neg_offset_day &
150 & + day_in_4years * 100
151 end_year_int = end_year_int &
158 if ( ( end_year_int - 1 ) > 4 )
then
159 end_day = int( ( end_year_int - 1 ) / 4 ) * day_in_4years
160 end_year = mod( end_year_int - 1, 4 ) + 1
163 end_year = end_year_int
166 end_day = end_day + ( end_year - 1 ) * sum( calp % day_in_month(:) )
167 do i = 1, end_date % month - 1
168 if ( int(end_year) == 4 .and. i == 2 )
then
169 end_day = end_day + 29
171 end_day = end_day + calp % day_in_month(i)
174 end_day = end_day + end_date % day
178 day_in_400years = 146097
182 do while ( start_year_int < 1 )
183 start_neg_offset_day = start_neg_offset_day &
185 start_year_int = start_year_int &
192 if ( ( start_year_int - 1 ) > 400 )
then
193 start_day = int( ( start_year_int - 1 ) / 400 ) * day_in_400years
194 start_year = mod( start_year_int - 1, 400 ) + 1
197 start_year = start_year_int
200 do j = 1, int( start_year - 1 )
201 do i = 1, calp % month_in_year
203 if ( mod( j, 400 ) == 0 )
then
204 start_day = start_day + 29
205 elseif ( mod( j, 100 ) == 0 )
then
206 start_day = start_day + 28
207 elseif ( mod( j, 4 ) == 0 )
then
208 start_day = start_day + 29
210 start_day = start_day + 28
213 start_day = start_day + calp % day_in_month(i)
218 do i = 1, start_date % month - 1
220 if ( mod( int(start_year), 400 ) == 0 )
then
221 start_day = start_day + 29
222 elseif ( mod( int(start_year), 100 ) == 0 )
then
223 start_day = start_day + 28
224 elseif ( mod( int(start_year), 4 ) == 0 )
then
225 start_day = start_day + 29
227 start_day = start_day + 28
230 start_day = start_day + calp % day_in_month(i)
234 start_day = start_day + start_date % day
238 do while ( end_year_int < 1 )
239 end_neg_offset_day = end_neg_offset_day &
241 end_year_int = end_year_int &
248 if ( ( end_year_int - 1 ) > 400 )
then
249 end_day = int( ( end_year_int - 1 ) / 400 ) * day_in_400years
250 end_year = mod( end_year_int - 1, 400 ) + 1
253 end_year = end_year_int
256 do j = 1, int( end_year - 1 )
257 do i = 1, calp % month_in_year
259 if ( mod( j, 400 ) == 0 )
then
260 end_day = end_day + 29
261 elseif ( mod( j, 100 ) == 0 )
then
262 end_day = end_day + 28
263 elseif ( mod( j, 4 ) == 0 )
then
264 end_day = end_day + 29
266 end_day = end_day + 28
269 end_day = end_day + calp % day_in_month(i)
274 do i = 1, end_date % month - 1
276 if ( mod( int(end_year), 400 ) == 0 )
then
277 end_day = end_day + 29
278 elseif ( mod( int(end_year), 100 ) == 0 )
then
279 end_day = end_day + 28
280 elseif ( mod( int(end_year), 4 ) == 0 )
then
281 end_day = end_day + 29
283 end_day = end_day + 28
286 end_day = end_day + calp % day_in_month(i)
290 end_day = end_day + end_date % day
296 start_day = ( start_year_int - 1 ) * sum( calp % day_in_month(:) )
297 do i = 1, start_date % month - 1
298 start_day = start_day + calp % day_in_month(i)
300 start_day = start_day + start_date % day
305 end_day = ( end_year_int - 1 ) * sum( calp % day_in_month(:) )
306 do i = 1, end_date % month - 1
307 end_day = end_day + calp % day_in_month(i)
309 end_day = end_day + end_date % day
315 start_sec = ( start_day - 1 - start_neg_offset_day ) &
316 & * calp % hour_in_day &
317 & * calp % min_in_hour &
318 & * calp % sec_in_min &
319 & + start_date % hour * calp % min_in_hour &
320 & * calp % sec_in_min &
321 & + start_date % min * calp % sec_in_min &
327 end_sec = ( end_day - 1 - end_neg_offset_day ) &
328 & * calp % hour_in_day &
329 & * calp % min_in_hour &
330 & * calp % sec_in_min &
331 & + end_date % hour * calp % min_in_hour &
332 & * calp % sec_in_min &
333 & + end_date % min * calp % sec_in_min &
339 sec = end_sec - start_sec