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"
80 ELEMENTAL FUNCTION ttr_mapper_eq(this, that) RESULT(res)
81 TYPE(ttr_mapper
),
INTENT(IN) :: this, that
84 res = this%time == that%time
86 END FUNCTION ttr_mapper_eq
88 ELEMENTAL FUNCTION ttr_mapper_ne(this, that) RESULT(res)
89 TYPE(ttr_mapper
),
INTENT(IN) :: this, that
92 res = this%time /= that%time
94 END FUNCTION ttr_mapper_ne
96 ELEMENTAL FUNCTION ttr_mapper_gt(this, that) RESULT(res)
97 TYPE(ttr_mapper
),
INTENT(IN) :: this, that
100 res = this%time > that%time
102 END FUNCTION ttr_mapper_gt
104 ELEMENTAL FUNCTION ttr_mapper_lt(this, that) RESULT(res)
105 TYPE(ttr_mapper
),
INTENT(IN) :: this, that
108 res = this%time < that%time
110 END FUNCTION ttr_mapper_lt
112 ELEMENTAL FUNCTION ttr_mapper_ge(this, that) RESULT(res)
113 TYPE(ttr_mapper
),
INTENT(IN) :: this, that
116 res = this%time >= that%time
118 END FUNCTION ttr_mapper_ge
120 ELEMENTAL FUNCTION ttr_mapper_le(this, that) RESULT(res)
121 TYPE(ttr_mapper
),
INTENT(IN) :: this, that
124 res = this%time <= that%time
126 END FUNCTION ttr_mapper_le
128 #include "arrayof_post.F90"
129 #include "array_utilities_inc.F90"
133 SUBROUTINE recompute_stat_proc_diff_common(itime, itimerange, stat_proc, step, &
134 otime, otimerange, map_tr, f, keep_tr, time_definition, full_steps, &
136 TYPE(datetime
),
INTENT(in) :: itime(:)
137 TYPE(vol7d_timerange
),
INTENT(in) :: itimerange(:)
138 INTEGER,
INTENT(in) :: stat_proc
140 TYPE(datetime
),
POINTER :: otime(:)
141 TYPE(vol7d_timerange
),
POINTER :: otimerange(:)
142 INTEGER,
ALLOCATABLE,
INTENT(out) :: map_tr(:,:,:,:,:), f(:), keep_tr(:,:,:)
144 LOGICAL,
ALLOCATABLE :: mask_timerange(:)
145 INTEGER,
INTENT(in) :: time_definition
146 LOGICAL,
INTENT(in),
OPTIONAL :: full_steps
147 TYPE(datetime
),
INTENT(in),
OPTIONAL :: start
149 INTEGER :: i, j, k, l, dirtyrep
150 INTEGER :: steps, deltas
151 LOGICAL :: lfull_steps, useful
152 TYPE(datetime
) :: pstart1, pstart2, pend1, pend2, reftime1, reftime2, tmptime
153 TYPE(vol7d_timerange
) :: tmptimerange
155 TYPE(arrayof_vol7d_timerange
) :: a_otimerange
158 CALL
getval(step, asec=steps)
161 IF (present(start))
THEN
162 IF (
SIZE(itime) > 0 .AND.
c_e(start))
THEN
163 CALL
getval(start-itime(1), asec=deltas)
167 lfull_steps = optio_log(full_steps)
170 ALLOCATE(mask_timerange(
SIZE(itimerange)))
171 mask_timerange(:) = itimerange(:)%timerange == stat_proc &
172 .AND. itimerange(:)%p1 /= imiss .AND. itimerange(:)%p2 /= imiss &
173 .AND. itimerange(:)%p1 >= 0 &
174 .AND. itimerange(:)%p2 > 0
176 IF (lfull_steps .AND. steps /= 0)
THEN
177 mask_timerange(:) = mask_timerange(:) .AND. &
178 (itimerange(:)%p1 == 0 .OR. &
179 mod(itimerange(:)%p1, steps) == 0 .OR. &
180 mod(itimerange(:)%p1 - itimerange(:)%p2, steps) == 0)
184 nitr = count(mask_timerange)
188 DO WHILE(.NOT.mask_timerange(j))
196 ALLOCATE(keep_tr(nitr,
SIZE(itime), 2))
197 CALL compute_keep_tr()
199 ALLOCATE(map_tr(nitr,
SIZE(itime), nitr,
SIZE(itime), 2))
200 map_tr(:,:,:,:,:) = imiss
204 IF (dirtyrep == 2)
THEN
207 CALL
sort(a_otime%array)
210 DO l = 1,
SIZE(itime)
212 CALL time_timerange_get_period(itime(l), itimerange(f(k)), &
213 time_definition, pstart2, pend2, reftime2)
215 DO j = 1,
SIZE(itime)
218 CALL time_timerange_get_period(itime(j), itimerange(f(i)), &
219 time_definition, pstart1, pend1, reftime1)
220 tmptimerange = vol7d_timerange_new(timerange=stat_proc)
222 IF (reftime2 == pend2 .AND. reftime1 == pend1)
THEN
223 IF (pstart2 == pstart1 .AND. pend2 > pend1)
THEN
224 CALL time_timerange_set_period(tmptime, tmptimerange, &
225 time_definition, pend1, pend2, reftime2)
226 IF (lfull_steps)
THEN
227 IF (
mod(reftime2, step) == timedelta_0)
THEN
234 ELSE IF (pstart2 < pstart1 .AND. pend2 == pend1)
THEN
235 CALL time_timerange_set_period(tmptime, tmptimerange, &
236 time_definition, pstart2, pstart1, pstart1)
237 IF (lfull_steps)
THEN
238 IF (
mod(pstart1, step) == timedelta_0)
THEN
246 ELSE IF (reftime2 == reftime1)
THEN
247 IF (pstart2 == pstart1 .AND. pend2 > pend1)
THEN
248 CALL time_timerange_set_period(tmptime, tmptimerange, &
249 time_definition, pend1, pend2, reftime2)
250 IF (lfull_steps)
THEN
251 IF (
mod(pend2-reftime2, step) == timedelta_0)
THEN
258 ELSE IF (pstart2 < pstart1 .AND. pend2 == pend1)
THEN
259 CALL time_timerange_set_period(tmptime, tmptimerange, &
260 time_definition, pstart2, pstart1, reftime2)
261 IF (lfull_steps)
THEN
262 IF (
mod(pstart1-reftime2, step) == timedelta_0)
THEN
271 useful = useful .AND. tmptime /= datetime_miss .AND. &
272 tmptimerange /= vol7d_timerange_miss .AND. tmptimerange%p2 == steps
275 map_tr(i,j,k,l,1) = append_unique(a_otime, tmptime)
276 map_tr(i,j,k,l,2) = append_unique(a_otimerange, tmptimerange)
285 CALL compute_keep_tr()
287 otime => a_otime%array
288 otimerange => a_otimerange%array
291 CALL
delete(a_otimerange, nodealloc=.true.)
294 CALL l4f_log(l4f_debug, &
295 'recompute_stat_proc_diff, map_tr: '//
t2c((
SIZE(map_tr,1)))//
', '// &
296 t2c((
SIZE(map_tr,2)))//
', '// &
297 t2c((
SIZE(map_tr,3)))//
', '// &
298 t2c((
SIZE(map_tr,4))))
299 CALL l4f_log(l4f_debug, &
300 'recompute_stat_proc_diff, map_tr: '//
t2c((
SIZE(map_tr))/2)//
', '// &
301 t2c(count(
c_e(map_tr))/2))
302 CALL l4f_log(l4f_debug, &
303 'recompute_stat_proc_diff, nitr: '//
t2c(nitr))
304 CALL l4f_log(l4f_debug, &
305 'recompute_stat_proc_diff, good timeranges: '//
t2c(count(
c_e(keep_tr))/2))
306 CALL l4f_log(l4f_debug, &
307 'recompute_stat_proc_diff, output times: '//
t2c(
SIZE(otime)))
308 CALL l4f_log(l4f_debug, &
309 'recompute_stat_proc_diff, output timeranges: '//
t2c(
SIZE(otimerange)))
314 SUBROUTINE compute_keep_tr()
316 keep_tr(:,:,:) = imiss
317 DO l = 1,
SIZE(itime)
319 IF (itimerange(f(k))%p2 == steps)
THEN
320 CALL time_timerange_get_period(itime(l), itimerange(f(k)), &
321 time_definition, pstart2, pend2, reftime2)
323 IF (reftime2 == pend2)
THEN
324 IF (lfull_steps)
THEN
325 IF (
mod(reftime2, step) == timedelta_0)
THEN
332 IF (lfull_steps)
THEN
333 IF (
mod(itimerange(f(k))%p1, steps) == 0)
THEN
343 keep_tr(k,l,1) = append_unique(a_otime, itime(l))
344 keep_tr(k,l,2) = append_unique(a_otimerange, itimerange(f(k)))
350 END SUBROUTINE compute_keep_tr
352 END SUBROUTINE recompute_stat_proc_diff_common
356 SUBROUTINE compute_stat_proc_metamorph_common(istat_proc, itimerange, ostat_proc, &
358 INTEGER,
INTENT(in) :: istat_proc
359 TYPE(vol7d_timerange
),
INTENT(in) :: itimerange(:)
360 INTEGER,
INTENT(in) :: ostat_proc
361 TYPE(vol7d_timerange
),
POINTER :: otimerange(:)
362 INTEGER,
POINTER :: map_tr(:)
365 LOGICAL :: tr_mask(size(itimerange))
367 IF (
SIZE(itimerange) == 0)
THEN
368 ALLOCATE(otimerange(0), map_tr(0))
373 tr_mask(:) = itimerange(:)%timerange == istat_proc .AND. itimerange(:)%p2 /= imiss &
374 .AND. itimerange(:)%p2 /= 0
375 ALLOCATE(otimerange(count(tr_mask)), map_tr(count(tr_mask)))
377 otimerange = pack(itimerange, mask=tr_mask)
378 otimerange(:)%timerange = ostat_proc
379 map_tr = pack((/(i,i=1,
SIZE(itimerange))/), mask=tr_mask)
381 END SUBROUTINE compute_stat_proc_metamorph_common
385 SUBROUTINE recompute_stat_proc_agg_common(itime, itimerange, stat_proc, tri, &
386 step, time_definition, otime, otimerange, map_ttr, dtratio, start, full_steps)
387 TYPE(datetime
),
INTENT(in) :: itime(:)
388 TYPE(vol7d_timerange
),
INTENT(in) :: itimerange(:)
389 INTEGER,
INTENT(in) :: stat_proc
390 INTEGER,
INTENT(in) :: tri
392 INTEGER,
INTENT(in) :: time_definition
393 TYPE(datetime
),
POINTER :: otime(:)
394 TYPE(vol7d_timerange
),
POINTER :: otimerange(:)
396 INTEGER,
POINTER,
OPTIONAL :: dtratio(:)
397 TYPE(datetime
),
INTENT(in),
OPTIONAL :: start
398 LOGICAL,
INTENT(in),
OPTIONAL :: full_steps
400 INTEGER :: i, j, k, l, na, nf, n
401 INTEGER :: steps, p1, maxp1, maxp2, minp1mp2, dstart, msteps
402 INTEGER(kind=int_ll) :: stepms, mstepms
404 TYPE(datetime
) :: lstart, lend, pstart1, pstart2, pend1, pend2, reftime1, reftime2, tmptime
406 TYPE(arrayof_vol7d_timerange
) :: a_otimerange
407 TYPE(arrayof_integer
) :: a_dtratio
408 LOGICAL,
ALLOCATABLE :: mask_timerange(:)
409 TYPE(ttr_mapper
) :: lmapper
410 CHARACTER(len=8) :: env_var
411 LOGICAL :: climat_behavior
416 CALL getenv(
'LIBSIM_CLIMAT_BEHAVIOR', env_var)
417 climat_behavior = len_trim(env_var) > 0 .AND. .NOT.present(dtratio)
420 CALL
getval(timedelta_depop(step), asec=steps)
423 ALLOCATE(mask_timerange(
SIZE(itimerange)))
424 mask_timerange(:) = itimerange(:)%timerange == tri &
425 .AND. itimerange(:)%p1 /= imiss .AND. itimerange(:)%p1 >= 0
427 IF (present(dtratio))
THEN
428 WHERE(itimerange(:)%p2 > 0 .AND. itimerange(:)%p2 /= imiss)
429 mask_timerange(:) = mask_timerange(:) .AND.
mod(steps, itimerange(:)%p2) == 0
431 mask_timerange(:) = .false.
434 mask_timerange(:) = mask_timerange(:) .AND. itimerange(:)%p2 == 0
438 CALL l4f_log(l4f_debug, &
439 '(re)compute_stat_proc_agg, number of useful timeranges before choosing analysis/forecast: '// &
440 t2c(count(mask_timerange)))
445 na = count(mask_timerange(:) .AND. itimerange(:)%p1 == 0)
446 nf = count(mask_timerange(:) .AND. itimerange(:)%p1 > 0)
449 CALL l4f_log(l4f_debug, &
450 'recompute_stat_proc_agg, na: '//
t2c(na)//
', nf: '//
t2c(nf))
455 CALL l4f_log(l4f_info, &
456 'recompute_stat_proc_agg, processing in forecast mode')
458 mask_timerange(:) = mask_timerange(:) .AND. itimerange(:)%p1 == 0
459 CALL l4f_log(l4f_info, &
460 'recompute_stat_proc_agg, processing in analysis mode')
464 CALL l4f_log(l4f_debug, &
465 '(re)compute_stat_proc_agg, number of useful timeranges: '// &
466 t2c(count(mask_timerange)))
469 IF (
SIZE(itime) == 0 .OR. count(mask_timerange) == 0)
THEN
470 ALLOCATE(otime(0), otimerange(0), map_ttr(0,0))
471 IF (present(dtratio))
ALLOCATE(dtratio(0))
476 lstart = datetime_miss
477 IF (present(start)) lstart = start
478 lend = itime(
SIZE(itime))
480 maxp1 = maxval(itimerange(:)%p1, mask=mask_timerange)
481 maxp2 = maxval(itimerange(:)%p2, mask=mask_timerange)
482 minp1mp2 = minval(itimerange(:)%p1 - itimerange(:)%p2, mask=mask_timerange)
483 IF (time_definition == 0)
THEN
484 lend = lend + timedelta_new(sec=maxp1)
490 IF (lstart == datetime_miss)
THEN
493 IF (time_definition == 0)
THEN
494 lstart = lstart + timedelta_new(sec=minp1mp2)
497 lstart = lstart - timedelta_new(sec=maxp2)
499 IF (optio_log(full_steps) .AND. .NOT.lforecast)
THEN
500 lstart = lstart - (
mod(lstart, step))
505 CALL l4f_log(l4f_debug, &
506 'recompute_stat_proc_agg, processing period: '//
t2c(lstart)//
' - '//
t2c(lend))
512 IF (time_definition == 0)
THEN
513 CALL
insert(a_otime, itime)
518 CALL
getval(lstart-itime(1), asec=dstart)
521 IF (dstart < 0) dstart =
mod(dstart, steps)
522 DO p1 = steps + dstart, maxp1, steps
523 CALL insert_unique(a_otimerange, vol7d_timerange_new(stat_proc, p1, steps))
535 mstepms = steps*1000_int_ll
536 DO i = 2,
SIZE(itime)
537 CALL
getval(itime(i)-itime(i-1), amsec=stepms)
538 IF (stepms > 0_int_ll .AND. stepms < mstepms)
THEN
539 msteps = stepms/1000_int_ll
540 IF (
mod(steps, msteps) == 0) mstepms = stepms
543 msteps = mstepms/1000_int_ll
545 tmptime = lstart + step
546 DO WHILE(tmptime < lend)
547 CALL insert_unique(a_otime, tmptime)
548 tmptime = tmptime + step
557 DO p1 = msteps, maxp1, msteps
558 CALL insert_unique(a_otimerange, vol7d_timerange_new(stat_proc, p1, steps))
564 tmptime = lstart + step
565 DO WHILE(tmptime < lend)
566 CALL insert_unique(a_otime, tmptime)
567 tmptime = tmptime + step
569 CALL insert_unique(a_otimerange, vol7d_timerange_new(stat_proc, 0, steps))
575 otime => a_otime%array
576 otimerange => a_otimerange%array
578 CALL
sort(otimerange)
580 CALL
delete(a_otime, nodealloc=.true.)
581 CALL
delete(a_otimerange, nodealloc=.true.)
584 CALL l4f_log(l4f_debug, &
585 'recompute_stat_proc_agg, output time and timerange: '//&
586 t2c(
SIZE(otime))//
', '//
t2c(
size(otimerange)))
589 IF (present(dtratio))
THEN
591 DO k = 1,
SIZE(itimerange)
592 IF (itimerange(k)%p2 /= 0) &
593 CALL insert_unique(a_dtratio, steps/itimerange(k)%p2)
596 dtratio => a_dtratio%array
602 CALL l4f_log(l4f_debug, &
603 'recompute_stat_proc_agg, found '//
t2c(
size(dtratio))// &
604 ' possible aggregation ratios, from '// &
605 t2c(dtratio(1))//
' to '//
t2c(dtratio(
SIZE(dtratio))))
608 ALLOCATE(map_ttr(
SIZE(otime),
SIZE(otimerange)))
609 do_itimerange1:
DO l = 1,
SIZE(itimerange)
610 IF (.NOT.mask_timerange(l)) cycle do_itimerange1
611 do_itime1:
DO k = 1,
SIZE(itime)
612 CALL time_timerange_get_period(itime(k), itimerange(l), &
613 time_definition, pstart1, pend1, reftime1)
614 do_otimerange1:
DO j = 1,
SIZE(otimerange)
615 do_otime1:
DO i = 1,
SIZE(otime)
616 CALL time_timerange_get_period_pop(otime(i), otimerange(j), step, &
617 time_definition, pstart2, pend2, reftime2)
619 IF (reftime1 /= reftime2) cycle do_otime1
622 IF (pstart1 >= pstart2 .AND. pend1 <= pend2 .AND. &
623 mod(pstart1-pstart2, pend1-pstart1) == timedelta_0)
THEN
626 lmapper%extra_info = steps/itimerange(l)%p2
627 n =
append(map_ttr(i,j), lmapper)
637 ALLOCATE(map_ttr(
SIZE(otime),
SIZE(otimerange)))
638 do_itimerange2:
DO l = 1,
SIZE(itimerange)
639 IF (.NOT.mask_timerange(l)) cycle do_itimerange2
640 do_itime2:
DO k = 1,
SIZE(itime)
641 CALL time_timerange_get_period(itime(k), itimerange(l), &
642 time_definition, pstart1, pend1, reftime1)
643 do_otimerange2:
DO j = 1,
SIZE(otimerange)
644 do_otime2:
DO i = 1,
SIZE(otime)
645 CALL time_timerange_get_period_pop(otime(i), otimerange(j), step, &
646 time_definition, pstart2, pend2, reftime2)
648 IF (reftime1 /= reftime2) cycle do_otime2
651 IF (climat_behavior .AND. pstart1 == pstart2) cycle do_otime2
652 IF (pstart1 >= pstart2 .AND. pend1 <= pend2)
THEN
655 IF (pstart1 == pstart2)
THEN
656 lmapper%extra_info = 1
657 ELSE IF (pend1 == pend2)
THEN
658 lmapper%extra_info = 2
660 lmapper%extra_info = imiss
662 lmapper%time = pstart1
663 n = insert_sorted(map_ttr(i,j), lmapper, .true., .true.)
673 END SUBROUTINE recompute_stat_proc_agg_common
676 SUBROUTINE compute_stat_proc_agg_sw(vertime, pstart, pend, time_mask, &
678 TYPE(datetime
),
INTENT(in) :: vertime(:)
679 TYPE(datetime
),
INTENT(in) :: pstart
680 TYPE(datetime
),
INTENT(in) :: pend
681 LOGICAL,
INTENT(in) :: time_mask(:)
682 TYPE(timedelta),
OPTIONAL,
INTENT(out) :: max_step
683 DOUBLE PRECISION,
OPTIONAL,
INTENT(out) :: weights(:)
686 TYPE(datetime
),
ALLOCATABLE :: lvertime(:)
687 TYPE(datetime
) :: half, nexthalf
688 INTEGER(kind=int_ll) :: dt, tdt
690 nt = count(time_mask)
691 ALLOCATE(lvertime(nt))
692 lvertime = pack(vertime, mask=time_mask)
694 IF (present(max_step))
THEN
705 max_step = pend - pstart
707 half = lvertime(1) + (lvertime(2) - lvertime(1))/2
708 max_step = half - pstart
710 nexthalf = lvertime(i) + (lvertime(i+1) - lvertime(i))/2
711 IF (nexthalf - half > max_step) max_step = nexthalf - half
714 IF (pend - half > max_step) max_step = pend - half
719 IF (present(weights))
THEN
723 CALL
getval(pend - pstart, amsec=tdt)
724 half = lvertime(1) + (lvertime(2) - lvertime(1))/2
725 CALL
getval(half - pstart, amsec=dt)
726 weights(1) = dble(dt)/dble(tdt)
728 nexthalf = lvertime(i) + (lvertime(i+1) - lvertime(i))/2
729 CALL
getval(nexthalf - half, amsec=dt)
730 weights(i) = dble(dt)/dble(tdt)
733 CALL
getval(pend - half, amsec=dt)
734 weights(nt) = dble(dt)/dble(tdt)
738 END SUBROUTINE compute_stat_proc_agg_sw
742 SUBROUTINE time_timerange_get_period(time, timerange, time_definition, &
743 pstart, pend, reftime)
744 TYPE(datetime
),
INTENT(in) :: time
745 TYPE(vol7d_timerange
),
INTENT(in) :: timerange
746 INTEGER,
INTENT(in) :: time_definition
747 TYPE(datetime
),
INTENT(out) :: reftime
748 TYPE(datetime
),
INTENT(out) :: pstart
749 TYPE(datetime
),
INTENT(out) :: pend
754 p1 = timedelta_new(sec=timerange%p1)
755 p2 = timedelta_new(sec=timerange%p2)
757 IF (time == datetime_miss .OR. .NOT.
c_e(timerange%p1) .OR. .NOT.
c_e(timerange%p2) .OR. &
759 timerange%p1 < 0 .OR. timerange%p2 < 0)
THEN
760 pstart = datetime_miss
762 reftime = datetime_miss
766 IF (time_definition == 0)
THEN
770 ELSE IF (time_definition == 1)
THEN
775 pstart = datetime_miss
777 reftime = datetime_miss
780 END SUBROUTINE time_timerange_get_period
786 SUBROUTINE time_timerange_get_period_pop(time, timerange, step, time_definition, &
787 pstart, pend, reftime)
788 TYPE(datetime
),
INTENT(in) :: time
789 TYPE(vol7d_timerange
),
INTENT(in) :: timerange
791 INTEGER,
INTENT(in) :: time_definition
792 TYPE(datetime
),
INTENT(out) :: reftime
793 TYPE(datetime
),
INTENT(out) :: pstart
794 TYPE(datetime
),
INTENT(out) :: pend
799 p1 = timedelta_new(sec=timerange%p1)
801 IF (time == datetime_miss .OR. .NOT.
c_e(timerange%p1) .OR. .NOT.
c_e(timerange%p2) .OR. &
803 timerange%p1 < 0 .OR. timerange%p2 < 0)
THEN
804 pstart = datetime_miss
806 reftime = datetime_miss
810 IF (time_definition == 0)
THEN
814 ELSE IF (time_definition == 1)
THEN
819 pstart = datetime_miss
821 reftime = datetime_miss
824 END SUBROUTINE time_timerange_get_period_pop
829 SUBROUTINE time_timerange_set_period(time, timerange, time_definition, &
830 pstart, pend, reftime)
831 TYPE(datetime
),
INTENT(out) :: time
832 TYPE(vol7d_timerange
),
INTENT(inout) :: timerange
833 INTEGER,
INTENT(in) :: time_definition
834 TYPE(datetime
),
INTENT(in) :: reftime
835 TYPE(datetime
),
INTENT(in) :: pstart
836 TYPE(datetime
),
INTENT(in) :: pend
839 INTEGER(kind=int_ll) :: dmsec
842 IF (time_definition == 0)
THEN
846 ELSE IF (time_definition == 1)
THEN
854 IF (time /= datetime_miss)
THEN
855 CALL
getval(p1, amsec=dmsec)
856 timerange%p1 = int(dmsec/1000_int_ll)
857 CALL
getval(p2, amsec=dmsec)
858 timerange%p2 = int(dmsec/1000_int_ll)
864 END SUBROUTINE time_timerange_set_period
Classi per la gestione delle coordinate temporali.
Functions that return a trimmed CHARACTER representation of the input variable.
Quick method to append an element to the array.
Classe per la gestione di un volume completo di dati osservati.
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.
Derived type defining a dynamically extensible array of TYPE(datetime) elements.
Class for expressing a relative time interval.
This module contains functions that are only for internal use of the library.
Destructor for finalizing an array object.
Method for inserting elements of the array at a desired position.
Derived type defining a dynamically extensible array of TYPE(ttr_mapper) elements.