33 INTEGER :: extra_info=imiss
34 TYPE(datetime) :: time=datetime_miss
37 INTERFACE OPERATOR (==)
38 MODULE PROCEDURE ttr_mapper_eq
41 INTERFACE OPERATOR (/=)
42 MODULE PROCEDURE ttr_mapper_ne
45 INTERFACE OPERATOR (>)
46 MODULE PROCEDURE ttr_mapper_gt
49 INTERFACE OPERATOR (<)
50 MODULE PROCEDURE ttr_mapper_lt
53 INTERFACE OPERATOR (>=)
54 MODULE PROCEDURE ttr_mapper_ge
57 INTERFACE OPERATOR (<=)
58 MODULE PROCEDURE ttr_mapper_le
61 #undef VOL7D_POLY_TYPE 62 #undef VOL7D_POLY_TYPES 64 #define VOL7D_POLY_TYPE TYPE(ttr_mapper) 65 #define VOL7D_POLY_TYPES _ttr_mapper 67 #include "array_utilities_pre.F90" 69 #define ARRAYOF_ORIGTYPE TYPE(ttr_mapper) 70 #define ARRAYOF_TYPE arrayof_ttr_mapper 71 #define ARRAYOF_ORIGEQ 1 72 #define ARRAYOF_ORIGGT 1 73 #include "arrayof_pre.F90" 76 TYPE,
PRIVATE :: ttr_decoder
77 TYPE(datetime) :: pstart=datetime_miss
78 TYPE(datetime) :: pend=datetime_miss
79 TYPE(datetime) :: reftime=datetime_miss
80 LOGICAL :: isana=.false.
86 ELEMENTAL FUNCTION ttr_mapper_eq(this, that)
RESULT(res)
87 TYPE(ttr_mapper),
INTENT(IN) :: this, that
90 res = this%time == that%time
92 END FUNCTION ttr_mapper_eq
94 ELEMENTAL FUNCTION ttr_mapper_ne(this, that)
RESULT(res)
95 TYPE(ttr_mapper),
INTENT(IN) :: this, that
98 res = this%time /= that%time
100 END FUNCTION ttr_mapper_ne
102 ELEMENTAL FUNCTION ttr_mapper_gt(this, that)
RESULT(res)
103 TYPE(ttr_mapper),
INTENT(IN) :: this, that
106 res = this%time > that%time
108 END FUNCTION ttr_mapper_gt
110 ELEMENTAL FUNCTION ttr_mapper_lt(this, that)
RESULT(res)
111 TYPE(ttr_mapper),
INTENT(IN) :: this, that
114 res = this%time < that%time
116 END FUNCTION ttr_mapper_lt
118 ELEMENTAL FUNCTION ttr_mapper_ge(this, that)
RESULT(res)
119 TYPE(ttr_mapper),
INTENT(IN) :: this, that
122 res = this%time >= that%time
124 END FUNCTION ttr_mapper_ge
126 ELEMENTAL FUNCTION ttr_mapper_le(this, that)
RESULT(res)
127 TYPE(ttr_mapper),
INTENT(IN) :: this, that
130 res = this%time <= that%time
132 END FUNCTION ttr_mapper_le
134 #include "arrayof_post.F90" 135 #include "array_utilities_inc.F90" 139 SUBROUTINE recompute_stat_proc_diff_common(itime, itimerange, stat_proc, step, &
140 otime, otimerange, map_tr, f, keep_tr, time_definition, full_steps, &
142 TYPE(datetime),
INTENT(in) :: itime(:)
143 TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
144 INTEGER,
INTENT(in) :: stat_proc
145 TYPE(timedelta),
INTENT(in) :: step
146 TYPE(datetime),
POINTER :: otime(:)
147 TYPE(vol7d_timerange),
POINTER :: otimerange(:)
148 INTEGER,
ALLOCATABLE,
INTENT(out) :: map_tr(:,:,:,:,:), f(:), keep_tr(:,:,:)
150 LOGICAL,
ALLOCATABLE :: mask_timerange(:)
151 INTEGER,
INTENT(in) :: time_definition
152 LOGICAL,
INTENT(in),
OPTIONAL :: full_steps
153 TYPE(datetime),
INTENT(in),
OPTIONAL :: start
155 INTEGER :: i, j, k, l, dirtyrep
157 LOGICAL :: lfull_steps, useful
158 TYPE(datetime) :: lstart, tmptime
159 TYPE(vol7d_timerange) :: tmptimerange
160 TYPE(arrayof_datetime) :: a_otime
161 TYPE(arrayof_vol7d_timerange) :: a_otimerange
162 TYPE(timedelta) :: start_delta
163 TYPE(ttr_decoder),
ALLOCATABLE :: ttr_d(:,:)
166 CALL getval(step, asec=steps)
168 lstart = datetime_miss
169 IF (
PRESENT(start)) lstart = start
170 lfull_steps = optio_log(full_steps)
173 ALLOCATE(mask_timerange(
SIZE(itimerange)))
174 mask_timerange(:) = itimerange(:)%timerange == stat_proc &
175 .AND. itimerange(:)%p1 /= imiss .AND. itimerange(:)%p2 /= imiss &
176 .AND. itimerange(:)%p1 >= 0 &
177 .AND. itimerange(:)%p2 > 0
179 IF (lfull_steps .AND. steps /= 0)
THEN 180 mask_timerange(:) = mask_timerange(:) .AND. &
181 (itimerange(:)%p1 == 0 .OR. &
182 mod(itimerange(:)%p1, steps) == 0 .OR. &
183 mod(itimerange(:)%p1 - itimerange(:)%p2, steps) == 0)
187 nitr = count(mask_timerange)
191 DO WHILE(.NOT.mask_timerange(j))
198 ALLOCATE(map_tr(nitr,
SIZE(itime), nitr,
SIZE(itime), 2))
199 map_tr(:,:,:,:,:) = imiss
202 ALLOCATE(ttr_d(nitr,
SIZE(itime)))
203 DO l = 1,
SIZE(itime)
205 CALL ttr_decoder_decode(itime(l), itimerange(f(k)), &
206 time_definition, ttr_d(k,l))
207 IF (ttr_d(k,l)%reftime == ttr_d(k,l)%pend) ttr_d(k,l)%isana = .true.
212 ALLOCATE(keep_tr(nitr,
SIZE(itime), 2))
213 CALL compute_keep_tr()
217 IF (dirtyrep == 2)
THEN 220 CALL sort(a_otime%array)
223 DO l = 1,
SIZE(itime)
228 DO j = 1,
SIZE(itime)
236 IF (ttr_d(k,l)%isana .AND. ttr_d(i,j)%isana)
THEN 237 IF (ttr_d(k,l)%pstart == ttr_d(i,j)%pstart .AND. ttr_d(k,l)%pend > ttr_d(i,j)%pend)
THEN 238 CALL time_timerange_set_period(tmptime, tmptimerange, &
239 time_definition, stat_proc, ttr_d(i,j)%pend, ttr_d(k,l)%pend, ttr_d(k,l)%reftime)
240 IF (lfull_steps)
THEN 241 IF (
mod(ttr_d(k,l)%reftime, step) == timedelta_0)
THEN 248 IF (
c_e(lstart))
THEN 249 IF (lstart > ttr_d(i,j)%pend) useful = .false.
252 ELSE IF (ttr_d(k,l)%pstart < ttr_d(i,j)%pstart .AND. ttr_d(k,l)%pend == ttr_d(i,j)%pend)
THEN 253 CALL time_timerange_set_period(tmptime, tmptimerange, &
254 time_definition, stat_proc, ttr_d(k,l)%pstart, ttr_d(i,j)%pstart, ttr_d(i,j)%pstart)
255 IF (lfull_steps)
THEN 256 IF (
mod(ttr_d(i,j)%pstart, step) == timedelta_0)
THEN 263 IF (
c_e(lstart))
THEN 264 IF (lstart > ttr_d(k,l)%pstart) useful = .false.
268 ELSE IF (ttr_d(k,l)%reftime == ttr_d(i,j)%reftime)
THEN 269 IF (lfull_steps)
THEN 270 IF (
c_e(lstart))
THEN 273 start_delta = lstart-ttr_d(k,l)%reftime
275 start_delta = timedelta_0
279 IF (ttr_d(k,l)%pstart == ttr_d(i,j)%pstart .AND. ttr_d(k,l)%pend > ttr_d(i,j)%pend)
THEN 280 CALL time_timerange_set_period(tmptime, tmptimerange, &
281 time_definition, stat_proc, ttr_d(i,j)%pend, ttr_d(k,l)%pend, ttr_d(k,l)%reftime)
282 IF (lfull_steps)
THEN 283 IF (
mod(ttr_d(k,l)%pend-ttr_d(k,l)%reftime-start_delta, step) == timedelta_0)
THEN 290 IF (
c_e(lstart))
THEN 291 IF (lstart > ttr_d(i,j)%pend) useful = .false.
294 ELSE IF (ttr_d(k,l)%pstart < ttr_d(i,j)%pstart .AND. ttr_d(k,l)%pend == ttr_d(i,j)%pend)
THEN 295 CALL time_timerange_set_period(tmptime, tmptimerange, &
296 time_definition, stat_proc, ttr_d(k,l)%pstart, ttr_d(i,j)%pstart, ttr_d(k,l)%reftime)
297 IF (lfull_steps)
THEN 298 IF (
mod(ttr_d(i,j)%pstart-ttr_d(k,l)%reftime-start_delta, step) == timedelta_0)
THEN 305 IF (
c_e(lstart))
THEN 306 IF (lstart > ttr_d(k,l)%pstart) useful = .false.
311 useful = useful .AND. tmptime /= datetime_miss .AND. &
312 tmptimerange /= vol7d_timerange_miss .AND. tmptimerange%p2 == steps
315 map_tr(i,j,k,l,1) = append_unique(a_otime, tmptime)
316 map_tr(i,j,k,l,2) = append_unique(a_otimerange, tmptimerange)
325 CALL compute_keep_tr()
327 otime => a_otime%array
328 otimerange => a_otimerange%array
330 CALL delete(a_otime, nodealloc=.true.)
331 CALL delete(a_otimerange, nodealloc=.true.)
334 CALL l4f_log(l4f_debug, &
335 'recompute_stat_proc_diff, map_tr: '//
t2c((
SIZE(map_tr,1)))//
', '// &
336 t2c((
SIZE(map_tr,2)))//
', '// &
337 t2c((
SIZE(map_tr,3)))//
', '// &
338 t2c((
SIZE(map_tr,4))))
339 CALL l4f_log(l4f_debug, &
340 'recompute_stat_proc_diff, map_tr: '//
t2c((
SIZE(map_tr))/2)//
', '// &
341 t2c(count(
c_e(map_tr))/2))
342 CALL l4f_log(l4f_debug, &
343 'recompute_stat_proc_diff, nitr: '//
t2c(nitr))
344 CALL l4f_log(l4f_debug, &
345 'recompute_stat_proc_diff, good timeranges: '//
t2c(count(
c_e(keep_tr))/2))
346 CALL l4f_log(l4f_debug, &
347 'recompute_stat_proc_diff, output times: '//
t2c(
SIZE(otime)))
348 CALL l4f_log(l4f_debug, &
349 'recompute_stat_proc_diff, output timeranges: '//
t2c(
SIZE(otimerange)))
354 SUBROUTINE compute_keep_tr()
355 INTEGER :: start_deltas
357 keep_tr(:,:,:) = imiss
358 DO l = 1,
SIZE(itime)
359 itrloop:
DO k = 1, nitr
360 IF (itimerange(f(k))%p2 == steps)
THEN 365 IF (
c_e(lstart))
THEN 366 IF (lstart > ttr_d(k,l)%pstart) cycle itrloop
368 IF (ttr_d(k,l)%reftime == ttr_d(k,l)%pend)
THEN 369 IF (
c_e(lstart))
THEN 370 IF (
mod(ttr_d(k,l)%reftime-lstart, step) == timedelta_0)
THEN 373 ELSE IF (lfull_steps)
THEN 374 IF (
mod(ttr_d(k,l)%reftime, step) == timedelta_0)
THEN 381 IF (lfull_steps)
THEN 383 IF (
c_e(lstart))
THEN 384 start_deltas = timedelta_getamsec(lstart-ttr_d(k,l)%reftime)/1000_int_ll
388 IF (
mod(itimerange(f(k))%p1 - start_deltas, steps) == 0)
THEN 398 keep_tr(k,l,1) = append_unique(a_otime, itime(l))
399 keep_tr(k,l,2) = append_unique(a_otimerange, itimerange(f(k)))
405 END SUBROUTINE compute_keep_tr
407 END SUBROUTINE recompute_stat_proc_diff_common
411 SUBROUTINE compute_stat_proc_metamorph_common(istat_proc, itimerange, ostat_proc, &
413 INTEGER,
INTENT(in) :: istat_proc
414 TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
415 INTEGER,
INTENT(in) :: ostat_proc
416 TYPE(vol7d_timerange),
POINTER :: otimerange(:)
417 INTEGER,
POINTER :: map_tr(:)
420 LOGICAL :: tr_mask(SIZE(itimerange))
422 IF (
SIZE(itimerange) == 0)
THEN 423 ALLOCATE(otimerange(0), map_tr(0))
428 tr_mask(:) = itimerange(:)%timerange == istat_proc .AND. itimerange(:)%p2 /= imiss &
429 .AND. itimerange(:)%p2 /= 0
430 ALLOCATE(otimerange(count(tr_mask)), map_tr(count(tr_mask)))
432 otimerange = pack(itimerange, mask=tr_mask)
433 otimerange(:)%timerange = ostat_proc
434 map_tr = pack((/(i,i=1,
SIZE(itimerange))/), mask=tr_mask)
436 END SUBROUTINE compute_stat_proc_metamorph_common
440 SUBROUTINE recompute_stat_proc_agg_common(itime, itimerange, stat_proc, tri, &
441 step, time_definition, otime, otimerange, map_ttr, dtratio, start, full_steps)
442 TYPE(datetime),
INTENT(in) :: itime(:)
443 TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
444 INTEGER,
INTENT(in) :: stat_proc
445 INTEGER,
INTENT(in) :: tri
446 TYPE(timedelta),
INTENT(in) :: step
447 INTEGER,
INTENT(in) :: time_definition
448 TYPE(datetime),
POINTER :: otime(:)
449 TYPE(vol7d_timerange),
POINTER :: otimerange(:)
450 TYPE(arrayof_ttr_mapper),
POINTER :: map_ttr(:,:)
451 INTEGER,
POINTER,
OPTIONAL :: dtratio(:)
452 TYPE(datetime),
INTENT(in),
OPTIONAL :: start
453 LOGICAL,
INTENT(in),
OPTIONAL :: full_steps
455 INTEGER :: i, j, k, l, na, nf, n
456 INTEGER :: steps, p1, maxp1, maxp2, minp1mp2, dstart, msteps
457 INTEGER(kind=int_ll) :: stepms, mstepms
459 TYPE(datetime) :: lstart, lend, pstart1, pstart2, pend1, pend2, reftime1, reftime2, tmptime
460 TYPE(arrayof_datetime) :: a_otime
461 TYPE(arrayof_vol7d_timerange) :: a_otimerange
462 TYPE(arrayof_integer) :: a_dtratio
463 LOGICAL,
ALLOCATABLE :: mask_timerange(:)
464 TYPE(ttr_mapper) :: lmapper
465 CHARACTER(len=8) :: env_var
466 LOGICAL :: climat_behavior
471 CALL getenv(
'LIBSIM_CLIMAT_BEHAVIOR', env_var)
472 climat_behavior = len_trim(env_var) > 0 .AND. .NOT.
PRESENT(dtratio)
475 CALL getval(timedelta_depop(step), asec=steps)
478 ALLOCATE(mask_timerange(
SIZE(itimerange)))
479 mask_timerange(:) = itimerange(:)%timerange == tri &
480 .AND. itimerange(:)%p1 /= imiss .AND. itimerange(:)%p1 >= 0
482 IF (
PRESENT(dtratio))
THEN 483 WHERE(itimerange(:)%p2 > 0 .AND. itimerange(:)%p2 /= imiss)
484 mask_timerange(:) = mask_timerange(:) .AND.
mod(steps, itimerange(:)%p2) == 0
486 mask_timerange(:) = .false.
489 mask_timerange(:) = mask_timerange(:) .AND. itimerange(:)%p2 == 0
493 CALL l4f_log(l4f_debug, &
494 '(re)compute_stat_proc_agg, number of useful timeranges before choosing analysis/forecast: '// &
495 t2c(count(mask_timerange)))
500 na = count(mask_timerange(:) .AND. itimerange(:)%p1 == 0)
501 nf = count(mask_timerange(:) .AND. itimerange(:)%p1 > 0)
504 CALL l4f_log(l4f_debug, &
505 'recompute_stat_proc_agg, na: '//
t2c(na)//
', nf: '//
t2c(nf))
510 CALL l4f_log(l4f_info, &
511 'recompute_stat_proc_agg, processing in forecast mode')
513 mask_timerange(:) = mask_timerange(:) .AND. itimerange(:)%p1 == 0
514 CALL l4f_log(l4f_info, &
515 'recompute_stat_proc_agg, processing in analysis mode')
519 CALL l4f_log(l4f_debug, &
520 '(re)compute_stat_proc_agg, number of useful timeranges: '// &
521 t2c(count(mask_timerange)))
524 IF (
SIZE(itime) == 0 .OR. count(mask_timerange) == 0)
THEN 525 ALLOCATE(otime(0), otimerange(0), map_ttr(0,0))
526 IF (
PRESENT(dtratio))
ALLOCATE(dtratio(0))
531 lstart = datetime_miss
532 IF (
PRESENT(start)) lstart = start
533 lend = itime(
SIZE(itime))
535 maxp1 = maxval(itimerange(:)%p1, mask=mask_timerange)
536 maxp2 = maxval(itimerange(:)%p2, mask=mask_timerange)
537 minp1mp2 = minval(itimerange(:)%p1 - itimerange(:)%p2, mask=mask_timerange)
538 IF (time_definition == 0)
THEN 539 lend = lend + timedelta_new(sec=maxp1)
545 IF (lstart == datetime_miss)
THEN 548 IF (time_definition == 0)
THEN 549 lstart = lstart + timedelta_new(sec=minp1mp2)
552 lstart = lstart - timedelta_new(sec=maxp2)
557 IF (optio_log(full_steps) .AND. .NOT.lforecast)
THEN 558 lstart = lstart - (
mod(lstart, step))
563 CALL l4f_log(l4f_debug, &
564 'recompute_stat_proc_agg, processing period: '//
t2c(lstart)//
' - '//
t2c(lend))
570 IF (time_definition == 0)
THEN 571 CALL insert(a_otime, itime)
576 CALL getval(lstart-itime(1), asec=dstart)
579 IF (dstart < 0) dstart =
mod(dstart, steps)
580 DO p1 = steps + dstart, maxp1, steps
581 CALL insert_unique(a_otimerange, vol7d_timerange_new(stat_proc, p1, steps))
593 mstepms = steps*1000_int_ll
594 DO i = 2,
SIZE(itime)
595 CALL getval(itime(i)-itime(i-1), amsec=stepms)
596 IF (stepms > 0_int_ll .AND. stepms < mstepms)
THEN 597 msteps = stepms/1000_int_ll
598 IF (
mod(steps, msteps) == 0) mstepms = stepms
601 msteps = mstepms/1000_int_ll
603 tmptime = lstart + step
604 DO WHILE(tmptime < lend)
605 CALL insert_unique(a_otime, tmptime)
606 tmptime = tmptime + step
615 DO p1 = msteps, maxp1, msteps
616 CALL insert_unique(a_otimerange, vol7d_timerange_new(stat_proc, p1, steps))
622 tmptime = lstart + step
623 DO WHILE(tmptime < lend)
624 CALL insert_unique(a_otime, tmptime)
625 tmptime = tmptime + step
627 CALL insert_unique(a_otimerange, vol7d_timerange_new(stat_proc, 0, steps))
633 otime => a_otime%array
634 otimerange => a_otimerange%array
636 CALL sort(otimerange)
638 CALL delete(a_otime, nodealloc=.true.)
639 CALL delete(a_otimerange, nodealloc=.true.)
642 CALL l4f_log(l4f_debug, &
643 'recompute_stat_proc_agg, output time and timerange: '//&
644 t2c(
SIZE(otime))//
', '//
t2c(
size(otimerange)))
647 IF (
PRESENT(dtratio))
THEN 649 DO k = 1,
SIZE(itimerange)
650 IF (itimerange(k)%p2 /= 0) &
651 CALL insert_unique(a_dtratio, steps/itimerange(k)%p2)
654 dtratio => a_dtratio%array
657 CALL delete(a_dtratio, nodealloc=.true.)
660 CALL l4f_log(l4f_debug, &
661 'recompute_stat_proc_agg, found '//
t2c(
size(dtratio))// &
662 ' possible aggregation ratios, from '// &
663 t2c(dtratio(1))//
' to '//
t2c(dtratio(
SIZE(dtratio))))
666 ALLOCATE(map_ttr(
SIZE(otime),
SIZE(otimerange)))
667 do_itimerange1:
DO l = 1,
SIZE(itimerange)
668 IF (.NOT.mask_timerange(l)) cycle do_itimerange1
669 do_itime1:
DO k = 1,
SIZE(itime)
670 CALL time_timerange_get_period(itime(k), itimerange(l), &
671 time_definition, pstart1, pend1, reftime1)
672 do_otimerange1:
DO j = 1,
SIZE(otimerange)
673 do_otime1:
DO i = 1,
SIZE(otime)
674 CALL time_timerange_get_period_pop(otime(i), otimerange(j), step, &
675 time_definition, pstart2, pend2, reftime2)
677 IF (reftime1 /= reftime2) cycle do_otime1
680 IF (pstart1 >= pstart2 .AND. pend1 <= pend2 .AND. &
681 mod(pstart1-pstart2, pend1-pstart1) == timedelta_0)
THEN 684 lmapper%extra_info = steps/itimerange(l)%p2
685 n =
append(map_ttr(i,j), lmapper)
695 ALLOCATE(map_ttr(
SIZE(otime),
SIZE(otimerange)))
696 do_itimerange2:
DO l = 1,
SIZE(itimerange)
697 IF (.NOT.mask_timerange(l)) cycle do_itimerange2
698 do_itime2:
DO k = 1,
SIZE(itime)
699 CALL time_timerange_get_period(itime(k), itimerange(l), &
700 time_definition, pstart1, pend1, reftime1)
701 do_otimerange2:
DO j = 1,
SIZE(otimerange)
702 do_otime2:
DO i = 1,
SIZE(otime)
703 CALL time_timerange_get_period_pop(otime(i), otimerange(j), step, &
704 time_definition, pstart2, pend2, reftime2)
706 IF (reftime1 /= reftime2) cycle do_otime2
709 IF (climat_behavior .AND. pstart1 == pstart2) cycle do_otime2
710 IF (pstart1 >= pstart2 .AND. pend1 <= pend2)
THEN 713 IF (pstart1 == pstart2)
THEN 714 lmapper%extra_info = 1
715 ELSE IF (pend1 == pend2)
THEN 716 lmapper%extra_info = 2
718 lmapper%extra_info = imiss
720 lmapper%time = pstart1
721 n = insert_sorted(map_ttr(i,j), lmapper, .true., .true.)
731 END SUBROUTINE recompute_stat_proc_agg_common
734 SUBROUTINE compute_stat_proc_agg_sw(vertime, pstart, pend, time_mask, &
736 TYPE(
datetime),
INTENT(in) :: vertime(:)
739 LOGICAL,
INTENT(in) :: time_mask(:)
740 TYPE(
timedelta),
OPTIONAL,
INTENT(out) :: max_step
741 DOUBLE PRECISION,
OPTIONAL,
INTENT(out) :: weights(:)
744 TYPE(
datetime),
ALLOCATABLE :: lvertime(:)
746 INTEGER(kind=int_ll) :: dt, tdt
748 nt = count(time_mask)
749 ALLOCATE(lvertime(nt))
750 lvertime = pack(vertime, mask=time_mask)
752 IF (
PRESENT(max_step))
THEN 763 max_step = pend - pstart
765 half = lvertime(1) + (lvertime(2) - lvertime(1))/2
766 max_step = half - pstart
768 nexthalf = lvertime(i) + (lvertime(i+1) - lvertime(i))/2
769 IF (nexthalf - half > max_step) max_step = nexthalf - half
772 IF (pend - half > max_step) max_step = pend - half
777 IF (
PRESENT(weights))
THEN 781 CALL getval(pend - pstart, amsec=tdt)
782 half = lvertime(1) + (lvertime(2) - lvertime(1))/2
783 CALL getval(half - pstart, amsec=dt)
784 weights(1) = dble(dt)/dble(tdt)
786 nexthalf = lvertime(i) + (lvertime(i+1) - lvertime(i))/2
787 CALL getval(nexthalf - half, amsec=dt)
788 weights(i) = dble(dt)/dble(tdt)
791 CALL getval(pend - half, amsec=dt)
792 weights(nt) = dble(dt)/dble(tdt)
796 END SUBROUTINE compute_stat_proc_agg_sw
800 SUBROUTINE time_timerange_get_period(time, timerange, time_definition, &
801 pstart, pend, reftime)
803 TYPE(vol7d_timerange),
INTENT(in) :: timerange
804 INTEGER,
INTENT(in) :: time_definition
805 TYPE(
datetime),
INTENT(out) :: reftime
806 TYPE(
datetime),
INTENT(out) :: pstart
812 p1 = timedelta_new(sec=timerange%p1)
813 p2 = timedelta_new(sec=timerange%p2)
815 IF (time == datetime_miss .OR. .NOT.
c_e(timerange%p1) .OR. .NOT.
c_e(timerange%p2) .OR. &
817 timerange%p1 < 0 .OR. timerange%p2 < 0)
THEN 818 pstart = datetime_miss
820 reftime = datetime_miss
824 IF (time_definition == 0)
THEN 828 ELSE IF (time_definition == 1 .OR. time_definition == 2)
THEN 833 pstart = datetime_miss
835 reftime = datetime_miss
838 END SUBROUTINE time_timerange_get_period
843 SUBROUTINE ttr_decoder_decode(time, timerange, time_definition, decoded)
845 TYPE(vol7d_timerange),
INTENT(in) :: timerange
846 INTEGER,
INTENT(in) :: time_definition
847 TYPE(ttr_decoder),
INTENT(out) :: decoded
852 p1 = timedelta_new(sec=timerange%p1)
853 p2 = timedelta_new(sec=timerange%p2)
855 IF (time == datetime_miss .OR. .NOT.
c_e(timerange%p1) .OR. .NOT.
c_e(timerange%p2) .OR. &
857 timerange%p1 < 0 .OR. timerange%p2 < 0)
THEN 858 decoded%pstart = datetime_miss
859 decoded%pend = datetime_miss
860 decoded%reftime = datetime_miss
864 IF (time_definition == 0)
THEN 865 decoded%reftime = time
866 decoded%pend = time + p1
867 decoded%pstart = decoded%pend - p2
868 ELSE IF (time_definition == 1 .OR. time_definition == 2)
THEN 870 decoded%pstart = time - p2
871 decoded%reftime = time - p1
873 decoded%pstart = datetime_miss
874 decoded%pend = datetime_miss
875 decoded%reftime = datetime_miss
878 END SUBROUTINE ttr_decoder_decode
884 SUBROUTINE time_timerange_get_period_pop(time, timerange, step, time_definition, &
885 pstart, pend, reftime)
887 TYPE(vol7d_timerange),
INTENT(in) :: timerange
889 INTEGER,
INTENT(in) :: time_definition
890 TYPE(
datetime),
INTENT(out) :: reftime
891 TYPE(
datetime),
INTENT(out) :: pstart
897 p1 = timedelta_new(sec=timerange%p1)
899 IF (time == datetime_miss .OR. .NOT.
c_e(timerange%p1) .OR. .NOT.
c_e(timerange%p2) .OR. &
901 timerange%p1 < 0 .OR. timerange%p2 < 0)
THEN 902 pstart = datetime_miss
904 reftime = datetime_miss
908 IF (time_definition == 0)
THEN 912 ELSE IF (time_definition == 1 .OR. time_definition == 2)
THEN 917 pstart = datetime_miss
919 reftime = datetime_miss
922 END SUBROUTINE time_timerange_get_period_pop
928 SUBROUTINE ttr_decoder_decode_pop(time, timerange, step, time_definition, decoded)
930 TYPE(vol7d_timerange),
INTENT(in) :: timerange
932 INTEGER,
INTENT(in) :: time_definition
933 TYPE(ttr_decoder),
INTENT(out) :: decoded
938 p1 = timedelta_new(sec=timerange%p1)
940 IF (time == datetime_miss .OR. .NOT.
c_e(timerange%p1) .OR. .NOT.
c_e(timerange%p2) .OR. &
942 timerange%p1 < 0 .OR. timerange%p2 < 0)
THEN 943 decoded%pstart = datetime_miss
944 decoded%pend = datetime_miss
945 decoded%reftime = datetime_miss
949 IF (time_definition == 0)
THEN 950 decoded%reftime = time
951 decoded%pend = time + p1
952 decoded%pstart = decoded%pend - step
953 ELSE IF (time_definition == 1 .OR. time_definition == 2)
THEN 955 decoded%pstart = time - step
956 decoded%reftime = time - p1
958 decoded%pstart = datetime_miss
959 decoded%pend = datetime_miss
960 decoded%reftime = datetime_miss
963 END SUBROUTINE ttr_decoder_decode_pop
968 SUBROUTINE time_timerange_set_period(time, timerange, time_definition, &
969 stat_proc, pstart, pend, reftime)
971 TYPE(vol7d_timerange),
INTENT(out) :: timerange
972 INTEGER,
INTENT(in) :: time_definition
973 INTEGER,
INTENT(in) :: stat_proc
976 TYPE(
datetime),
INTENT(in) :: reftime
979 INTEGER(kind=int_ll) :: dmsec
982 IF (time_definition == 0)
THEN 986 ELSE IF (time_definition == 1 .OR. time_definition == 2)
THEN 994 timerange%timerange = stat_proc
995 IF (time /= datetime_miss)
THEN 996 CALL getval(p1, amsec=dmsec)
997 timerange%p1 = int(dmsec/1000_int_ll)
998 CALL getval(p2, amsec=dmsec)
999 timerange%p2 = int(dmsec/1000_int_ll)
1001 timerange%p1 = imiss
1002 timerange%p2 = imiss
1005 END SUBROUTINE time_timerange_set_period
Functions that return a trimmed CHARACTER representation of the input variable.
Class for expressing an absolute time value.
This module contains functions that are only for internal use of the library.
Classi per la gestione delle coordinate temporali.
Quick method to append an element to the array.
Method for packing the array object reducing at a minimum the memory occupation, without destroying i...
Restituiscono il valore dell'oggetto nella forma desiderata.
Operatore di resto della divisione.
Classe per la gestione di un volume completo di dati osservati.
Class for expressing a relative time interval.
Destructor for finalizing an array object.
Method for inserting elements of the array at a desired position.