33 INTEGER :: extra_info=imiss
34 TYPE(datetime) :: time=datetime_miss
37INTERFACE OPERATOR (==)
38 MODULE PROCEDURE ttr_mapper_eq
41INTERFACE OPERATOR (/=)
42 MODULE PROCEDURE ttr_mapper_ne
46 MODULE PROCEDURE ttr_mapper_gt
50 MODULE PROCEDURE ttr_mapper_lt
53INTERFACE OPERATOR (>=)
54 MODULE PROCEDURE ttr_mapper_ge
57INTERFACE OPERATOR (<=)
58 MODULE PROCEDURE ttr_mapper_le
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"
76TYPE,
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.
86ELEMENTAL FUNCTION ttr_mapper_eq(this, that)
RESULT(res)
87TYPE(ttr_mapper),
INTENT(IN) :: this, that
90res = this%time == that%time
92END FUNCTION ttr_mapper_eq
94ELEMENTAL FUNCTION ttr_mapper_ne(this, that)
RESULT(res)
95TYPE(ttr_mapper),
INTENT(IN) :: this, that
98res = this%time /= that%time
100END FUNCTION ttr_mapper_ne
102ELEMENTAL FUNCTION ttr_mapper_gt(this, that)
RESULT(res)
103TYPE(ttr_mapper),
INTENT(IN) :: this, that
106res = this%time > that%time
108END FUNCTION ttr_mapper_gt
110ELEMENTAL FUNCTION ttr_mapper_lt(this, that)
RESULT(res)
111TYPE(ttr_mapper),
INTENT(IN) :: this, that
114res = this%time < that%time
116END FUNCTION ttr_mapper_lt
118ELEMENTAL FUNCTION ttr_mapper_ge(this, that)
RESULT(res)
119TYPE(ttr_mapper),
INTENT(IN) :: this, that
122res = this%time >= that%time
124END FUNCTION ttr_mapper_ge
126ELEMENTAL FUNCTION ttr_mapper_le(this, that)
RESULT(res)
127TYPE(ttr_mapper),
INTENT(IN) :: this, that
130res = this%time <= that%time
132END FUNCTION ttr_mapper_le
134#include "arrayof_post.F90"
135#include "array_utilities_inc.F90"
139SUBROUTINE recompute_stat_proc_diff_common(itime, itimerange, stat_proc, step, &
140 otime, otimerange, map_tr, f, keep_tr, time_definition, full_steps, &
142TYPE(datetime),
INTENT(in) :: itime(:)
143TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
144INTEGER,
INTENT(in) :: stat_proc
145TYPE(timedelta),
INTENT(in) :: step
146TYPE(datetime),
POINTER :: otime(:)
147TYPE(vol7d_timerange),
POINTER :: otimerange(:)
148INTEGER,
ALLOCATABLE,
INTENT(out) :: map_tr(:,:,:,:,:), f(:), keep_tr(:,:,:)
150LOGICAL,
ALLOCATABLE :: mask_timerange(:)
151INTEGER,
INTENT(in) :: time_definition
152LOGICAL,
INTENT(in),
OPTIONAL :: full_steps
153TYPE(datetime),
INTENT(in),
OPTIONAL :: start
155INTEGER :: i, j, k, l, dirtyrep
157LOGICAL :: lfull_steps, useful
158TYPE(datetime) :: lstart, tmptime
159TYPE(vol7d_timerange) :: tmptimerange
160TYPE(arrayof_datetime) :: a_otime
161TYPE(arrayof_vol7d_timerange) :: a_otimerange
162TYPE(timedelta) :: start_delta
163TYPE(ttr_decoder),
ALLOCATABLE :: ttr_d(:,:)
166CALL getval(step, asec=steps)
168lstart = datetime_miss
169IF (
PRESENT(start)) lstart = start
170lfull_steps = optio_log(full_steps)
173ALLOCATE(mask_timerange(
SIZE(itimerange)))
174mask_timerange(:) = itimerange(:)%timerange == stat_proc &
175 .AND. itimerange(:)%p1 /= imiss .AND. itimerange(:)%p2 /= imiss &
176 .AND. itimerange(:)%p1 >= 0 &
177 .AND. itimerange(:)%p2 > 0
179IF (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)
187nitr = count(mask_timerange)
191 DO WHILE(.NOT.mask_timerange(j))
198ALLOCATE(map_tr(nitr,
SIZE(itime), nitr,
SIZE(itime), 2))
199map_tr(:,:,:,:,:) = imiss
202ALLOCATE(ttr_d(nitr,
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.
212ALLOCATE(keep_tr(nitr,
SIZE(itime), 2))
213CALL compute_keep_tr()
217 IF (dirtyrep == 2)
THEN
220 CALL sort(a_otime%array)
221 CALL sort(a_otimerange%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
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)
325CALL compute_keep_tr()
327otime => a_otime%array
328otimerange => a_otimerange%array
330CALL delete(a_otime, nodealloc=.true.)
331CALL delete(a_otimerange, nodealloc=.true.)
334CALL 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))))
339CALL l4f_log(l4f_debug, &
340 'recompute_stat_proc_diff, map_tr: '//
t2c((
SIZE(map_tr))/2)//
', '// &
341 t2c(count(
c_e(map_tr))/2))
342CALL l4f_log(l4f_debug, &
343 'recompute_stat_proc_diff, nitr: '//
t2c(nitr))
344CALL l4f_log(l4f_debug, &
345 'recompute_stat_proc_diff, good timeranges: '//
t2c(count(
c_e(keep_tr))/2))
346CALL l4f_log(l4f_debug, &
347 'recompute_stat_proc_diff, output times: '//
t2c(
SIZE(otime)))
348CALL l4f_log(l4f_debug, &
349 'recompute_stat_proc_diff, output timeranges: '//
t2c(
SIZE(otimerange)))
354SUBROUTINE compute_keep_tr()
355INTEGER :: start_deltas
357keep_tr(:,:,:) = imiss
359 itrloop:
DO k = 1, nitr
360 IF (itimerange(f(k))%p2 == steps)
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)))
405END SUBROUTINE compute_keep_tr
407END SUBROUTINE recompute_stat_proc_diff_common
411SUBROUTINE compute_stat_proc_metamorph_common(istat_proc, itimerange, ostat_proc, &
413INTEGER,
INTENT(in) :: istat_proc
414TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
415INTEGER,
INTENT(in) :: ostat_proc
416TYPE(vol7d_timerange),
POINTER :: otimerange(:)
417INTEGER,
POINTER :: map_tr(:)
420LOGICAL :: tr_mask(SIZE(itimerange))
422IF (
SIZE(itimerange) == 0)
THEN
423 ALLOCATE(otimerange(0), map_tr(0))
428tr_mask(:) = itimerange(:)%timerange == istat_proc .AND. itimerange(:)%p2 /= imiss &
429 .AND. itimerange(:)%p2 /= 0
430ALLOCATE(otimerange(count(tr_mask)), map_tr(count(tr_mask)))
432otimerange = pack(itimerange, mask=tr_mask)
433otimerange(:)%timerange = ostat_proc
434map_tr = pack((/(i,i=1,
SIZE(itimerange))/), mask=tr_mask)
436END SUBROUTINE compute_stat_proc_metamorph_common
440SUBROUTINE recompute_stat_proc_agg_common(itime, itimerange, stat_proc, tri, &
441 step, time_definition, otime, otimerange, map_ttr, dtratio, start, full_steps)
442TYPE(datetime),
INTENT(in) :: itime(:)
443TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
444INTEGER,
INTENT(in) :: stat_proc
445INTEGER,
INTENT(in) :: tri
446TYPE(timedelta),
INTENT(in) :: step
447INTEGER,
INTENT(in) :: time_definition
448TYPE(datetime),
POINTER :: otime(:)
449TYPE(vol7d_timerange),
POINTER :: otimerange(:)
450TYPE(arrayof_ttr_mapper),
POINTER :: map_ttr(:,:)
451INTEGER,
POINTER,
OPTIONAL :: dtratio(:)
452TYPE(datetime),
INTENT(in),
OPTIONAL :: start
453LOGICAL,
INTENT(in),
OPTIONAL :: full_steps
455INTEGER :: i, j, k, l, na, nf, n
456INTEGER :: steps, p1, maxp1, maxp2, minp1mp2, dstart, msteps
457INTEGER(kind=int_ll) :: stepms, mstepms
459TYPE(datetime) :: lstart, lend, pstart1, pstart2, pend1, pend2, reftime1, reftime2, tmptime
460TYPE(arrayof_datetime) :: a_otime
461TYPE(arrayof_vol7d_timerange) :: a_otimerange
462TYPE(arrayof_integer) :: a_dtratio
463LOGICAL,
ALLOCATABLE :: mask_timerange(:)
464TYPE(ttr_mapper) :: lmapper
465CHARACTER(len=8) :: env_var
466LOGICAL :: climat_behavior
471CALL getenv(
'LIBSIM_CLIMAT_BEHAVIOR', env_var)
472climat_behavior = len_trim(env_var) > 0 .AND. .NOT.
PRESENT(dtratio)
475CALL getval(timedelta_depop(step), asec=steps)
478ALLOCATE(mask_timerange(
SIZE(itimerange)))
479mask_timerange(:) = itimerange(:)%timerange == tri &
480 .AND. itimerange(:)%p1 /= imiss .AND. itimerange(:)%p1 >= 0
482IF (
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
493CALL l4f_log(l4f_debug, &
494 '(re)compute_stat_proc_agg, number of useful timeranges before choosing analysis/forecast: '// &
495 t2c(count(mask_timerange)))
500na = count(mask_timerange(:) .AND. itimerange(:)%p1 == 0)
501nf = count(mask_timerange(:) .AND. itimerange(:)%p1 > 0)
504CALL 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')
519CALL l4f_log(l4f_debug, &
520 '(re)compute_stat_proc_agg, number of useful timeranges: '// &
521 t2c(count(mask_timerange)))
524IF (
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))
531lstart = datetime_miss
532IF (
PRESENT(start)) lstart = start
533lend = itime(
SIZE(itime))
535maxp1 = maxval(itimerange(:)%p1, mask=mask_timerange)
536maxp2 = maxval(itimerange(:)%p2, mask=mask_timerange)
537minp1mp2 = minval(itimerange(:)%p1 - itimerange(:)%p2, mask=mask_timerange)
538IF (time_definition == 0)
THEN
539 lend = lend + timedelta_new(sec=maxp1)
545IF (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))
563CALL 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))
633otime => a_otime%array
634otimerange => a_otimerange%array
638CALL delete(a_otime, nodealloc=.true.)
639CALL delete(a_otimerange, nodealloc=.true.)
642CALL l4f_log(l4f_debug, &
643 'recompute_stat_proc_agg, output time and timerange: '//&
644 t2c(
SIZE(otime))//
', '//
t2c(
size(otimerange)))
647IF (
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.)
731END SUBROUTINE recompute_stat_proc_agg_common
734SUBROUTINE compute_stat_proc_agg_sw(vertime, pstart, pend, time_mask, &
736TYPE(
datetime),
INTENT(in) :: vertime(:)
739LOGICAL,
INTENT(in) :: time_mask(:)
740TYPE(
timedelta),
OPTIONAL,
INTENT(out) :: max_step
741DOUBLE PRECISION,
OPTIONAL,
INTENT(out) :: weights(:)
744TYPE(
datetime),
ALLOCATABLE :: lvertime(:)
746INTEGER(kind=int_ll) :: dt, tdt
749ALLOCATE(lvertime(nt))
750lvertime = pack(vertime, mask=time_mask)
752IF (
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
777IF (
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)
796END SUBROUTINE compute_stat_proc_agg_sw
800SUBROUTINE time_timerange_get_period(time, timerange, time_definition, &
801 pstart, pend, reftime)
803TYPE(vol7d_timerange),
INTENT(in) :: timerange
804INTEGER,
INTENT(in) :: time_definition
805TYPE(
datetime),
INTENT(out) :: reftime
812p1 = timedelta_new(sec=timerange%p1)
813p2 = timedelta_new(sec=timerange%p2)
815IF (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
824IF (time_definition == 0)
THEN
828ELSE IF (time_definition == 1 .OR. time_definition == 2)
THEN
833 pstart = datetime_miss
835 reftime = datetime_miss
838END SUBROUTINE time_timerange_get_period
843SUBROUTINE ttr_decoder_decode(time, timerange, time_definition, decoded)
845TYPE(vol7d_timerange),
INTENT(in) :: timerange
846INTEGER,
INTENT(in) :: time_definition
847TYPE(ttr_decoder),
INTENT(out) :: decoded
852p1 = timedelta_new(sec=timerange%p1)
853p2 = timedelta_new(sec=timerange%p2)
855IF (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
864IF (time_definition == 0)
THEN
865 decoded%reftime = time
866 decoded%pend = time + p1
867 decoded%pstart = decoded%pend - p2
868ELSE 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
878END SUBROUTINE ttr_decoder_decode
884SUBROUTINE time_timerange_get_period_pop(time, timerange, step, time_definition, &
885 pstart, pend, reftime)
887TYPE(vol7d_timerange),
INTENT(in) :: timerange
889INTEGER,
INTENT(in) :: time_definition
890TYPE(
datetime),
INTENT(out) :: reftime
897p1 = timedelta_new(sec=timerange%p1)
899IF (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
908IF (time_definition == 0)
THEN
912ELSE IF (time_definition == 1 .OR. time_definition == 2)
THEN
917 pstart = datetime_miss
919 reftime = datetime_miss
922END SUBROUTINE time_timerange_get_period_pop
928SUBROUTINE ttr_decoder_decode_pop(time, timerange, step, time_definition, decoded)
930TYPE(vol7d_timerange),
INTENT(in) :: timerange
932INTEGER,
INTENT(in) :: time_definition
933TYPE(ttr_decoder),
INTENT(out) :: decoded
938p1 = timedelta_new(sec=timerange%p1)
940IF (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
949IF (time_definition == 0)
THEN
950 decoded%reftime = time
951 decoded%pend = time + p1
952 decoded%pstart = decoded%pend - step
953ELSE 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
963END SUBROUTINE ttr_decoder_decode_pop
968SUBROUTINE time_timerange_set_period(time, timerange, time_definition, &
969 stat_proc, pstart, pend, reftime)
971TYPE(vol7d_timerange),
INTENT(out) :: timerange
972INTEGER,
INTENT(in) :: time_definition
973INTEGER,
INTENT(in) :: stat_proc
979INTEGER(kind=int_ll) :: dmsec
982IF (time_definition == 0)
THEN
986ELSE IF (time_definition == 1 .OR. time_definition == 2)
THEN
994timerange%timerange = stat_proc
995IF (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
1005END SUBROUTINE time_timerange_set_period
Restituiscono il valore dell'oggetto nella forma desiderata.
Operatore di resto della divisione.
Functions that return a trimmed CHARACTER representation of the input variable.
Quick method to append an element to the array.
Destructor for finalizing an array object.
Index method with sorted array.
Method for inserting elements of the array at a desired position.
Method for packing the array object reducing at a minimum the memory occupation, without destroying i...
Method for removing elements of the array at a desired position.
Classi per la gestione delle coordinate temporali.
This module contains functions that are only for internal use of the library.
Classe per la gestione di un volume completo di dati osservati.
Derived type defining a dynamically extensible array of TYPE(datetime) elements.
Class for expressing an absolute time value.
Class for expressing a relative time interval.
Derived type defining a dynamically extensible array of TYPE(ttr_mapper) elements.