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
139 TYPE(timedelta),
INTENT(in) :: step
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
151 LOGICAL :: lfull_steps, useful
152 TYPE(datetime) :: lstart, pstart1, pstart2, pend1, pend2, reftime1, reftime2, tmptime
153 TYPE(vol7d_timerange) :: tmptimerange
154 TYPE(arrayof_datetime) :: a_otime
155 TYPE(arrayof_vol7d_timerange) :: a_otimerange
158 CALL getval(step, asec=steps)
160 lstart = datetime_miss
161 IF (
PRESENT(start)) lstart = start
162 lfull_steps = optio_log(full_steps)
165 ALLOCATE(mask_timerange(
SIZE(itimerange)))
166 mask_timerange(:) = itimerange(:)%timerange == stat_proc &
167 .AND. itimerange(:)%p1 /= imiss .AND. itimerange(:)%p2 /= imiss &
168 .AND. itimerange(:)%p1 >= 0 &
169 .AND. itimerange(:)%p2 > 0
171 IF (lfull_steps .AND. steps /= 0)
THEN 172 mask_timerange(:) = mask_timerange(:) .AND. &
173 (itimerange(:)%p1 == 0 .OR. &
174 mod(itimerange(:)%p1, steps) == 0 .OR. &
175 mod(itimerange(:)%p1 - itimerange(:)%p2, steps) == 0)
179 nitr = count(mask_timerange)
183 DO WHILE(.NOT.mask_timerange(j))
191 ALLOCATE(keep_tr(nitr,
SIZE(itime), 2))
192 CALL compute_keep_tr()
194 ALLOCATE(map_tr(nitr,
SIZE(itime), nitr,
SIZE(itime), 2))
195 map_tr(:,:,:,:,:) = imiss
199 IF (dirtyrep == 2)
THEN 202 CALL sort(a_otime%array)
203 CALL sort(a_otimerange%array)
205 DO l = 1,
SIZE(itime)
207 CALL time_timerange_get_period(itime(l), itimerange(f(k)), &
208 time_definition, pstart2, pend2, reftime2)
210 DO j = 1,
SIZE(itime)
213 CALL time_timerange_get_period(itime(j), itimerange(f(i)), &
214 time_definition, pstart1, pend1, reftime1)
215 tmptimerange = vol7d_timerange_new(timerange=stat_proc)
217 IF (reftime2 == pend2 .AND. reftime1 == pend1)
THEN 218 IF (pstart2 == pstart1 .AND. pend2 > pend1)
THEN 219 CALL time_timerange_set_period(tmptime, tmptimerange, &
220 time_definition, pend1, pend2, reftime2)
221 IF (lfull_steps)
THEN 222 IF (
mod(reftime2, step) == timedelta_0)
THEN 229 ELSE IF (pstart2 < pstart1 .AND. pend2 == pend1)
THEN 230 CALL time_timerange_set_period(tmptime, tmptimerange, &
231 time_definition, pstart2, pstart1, pstart1)
232 IF (lfull_steps)
THEN 233 IF (
mod(pstart1, step) == timedelta_0)
THEN 241 ELSE IF (reftime2 == reftime1)
THEN 242 IF (pstart2 == pstart1 .AND. pend2 > pend1)
THEN 243 CALL time_timerange_set_period(tmptime, tmptimerange, &
244 time_definition, pend1, pend2, reftime2)
245 IF (lfull_steps)
THEN 246 IF (
mod(pend2-reftime2, step) == timedelta_0)
THEN 253 ELSE IF (pstart2 < pstart1 .AND. pend2 == pend1)
THEN 254 CALL time_timerange_set_period(tmptime, tmptimerange, &
255 time_definition, pstart2, pstart1, reftime2)
256 IF (lfull_steps)
THEN 257 IF (
mod(pstart1-reftime2, step) == timedelta_0)
THEN 266 useful = useful .AND. tmptime /= datetime_miss .AND. &
267 tmptimerange /= vol7d_timerange_miss .AND. tmptimerange%p2 == steps
270 map_tr(i,j,k,l,1) = append_unique(a_otime, tmptime)
271 map_tr(i,j,k,l,2) = append_unique(a_otimerange, tmptimerange)
280 CALL compute_keep_tr()
282 otime => a_otime%array
283 otimerange => a_otimerange%array
285 CALL delete(a_otime, nodealloc=.true.)
286 CALL delete(a_otimerange, nodealloc=.true.)
289 CALL l4f_log(l4f_debug, &
290 'recompute_stat_proc_diff, map_tr: '//
t2c((
SIZE(map_tr,1)))//
', '// &
291 t2c((
SIZE(map_tr,2)))//
', '// &
292 t2c((
SIZE(map_tr,3)))//
', '// &
293 t2c((
SIZE(map_tr,4))))
294 CALL l4f_log(l4f_debug, &
295 'recompute_stat_proc_diff, map_tr: '//
t2c((
SIZE(map_tr))/2)//
', '// &
296 t2c(count(
c_e(map_tr))/2))
297 CALL l4f_log(l4f_debug, &
298 'recompute_stat_proc_diff, nitr: '//
t2c(nitr))
299 CALL l4f_log(l4f_debug, &
300 'recompute_stat_proc_diff, good timeranges: '//
t2c(count(
c_e(keep_tr))/2))
301 CALL l4f_log(l4f_debug, &
302 'recompute_stat_proc_diff, output times: '//
t2c(
SIZE(otime)))
303 CALL l4f_log(l4f_debug, &
304 'recompute_stat_proc_diff, output timeranges: '//
t2c(
SIZE(otimerange)))
309 SUBROUTINE compute_keep_tr()
311 keep_tr(:,:,:) = imiss
312 DO l = 1,
SIZE(itime)
314 IF (itimerange(f(k))%p2 == steps)
THEN 315 CALL time_timerange_get_period(itime(l), itimerange(f(k)), &
316 time_definition, pstart2, pend2, reftime2)
318 IF (reftime2 == pend2)
THEN 319 IF (
c_e(lstart))
THEN 320 IF (
mod(reftime2-lstart, step) == timedelta_0)
THEN 323 ELSE IF (lfull_steps)
THEN 324 IF (
mod(reftime2, step) == timedelta_0)
THEN 331 IF (lfull_steps)
THEN 332 IF (
mod(itimerange(f(k))%p1, steps) == 0)
THEN 342 keep_tr(k,l,1) = append_unique(a_otime, itime(l))
343 keep_tr(k,l,2) = append_unique(a_otimerange, itimerange(f(k)))
349 END SUBROUTINE compute_keep_tr
351 END SUBROUTINE recompute_stat_proc_diff_common
355 SUBROUTINE compute_stat_proc_metamorph_common(istat_proc, itimerange, ostat_proc, &
357 INTEGER,
INTENT(in) :: istat_proc
358 TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
359 INTEGER,
INTENT(in) :: ostat_proc
360 TYPE(vol7d_timerange),
POINTER :: otimerange(:)
361 INTEGER,
POINTER :: map_tr(:)
364 LOGICAL :: tr_mask(size(itimerange))
366 IF (
SIZE(itimerange) == 0)
THEN 367 ALLOCATE(otimerange(0), map_tr(0))
372 tr_mask(:) = itimerange(:)%timerange == istat_proc .AND. itimerange(:)%p2 /= imiss &
373 .AND. itimerange(:)%p2 /= 0
374 ALLOCATE(otimerange(count(tr_mask)), map_tr(count(tr_mask)))
376 otimerange = pack(itimerange, mask=tr_mask)
377 otimerange(:)%timerange = ostat_proc
378 map_tr = pack((/(i,i=1,
SIZE(itimerange))/), mask=tr_mask)
380 END SUBROUTINE compute_stat_proc_metamorph_common
384 SUBROUTINE recompute_stat_proc_agg_common(itime, itimerange, stat_proc, tri, &
385 step, time_definition, otime, otimerange, map_ttr, dtratio, start, full_steps)
386 TYPE(datetime),
INTENT(in) :: itime(:)
387 TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
388 INTEGER,
INTENT(in) :: stat_proc
389 INTEGER,
INTENT(in) :: tri
390 TYPE(timedelta),
INTENT(in) :: step
391 INTEGER,
INTENT(in) :: time_definition
392 TYPE(datetime),
POINTER :: otime(:)
393 TYPE(vol7d_timerange),
POINTER :: otimerange(:)
394 TYPE(arrayof_ttr_mapper),
POINTER :: map_ttr(:,:)
395 INTEGER,
POINTER,
OPTIONAL :: dtratio(:)
396 TYPE(datetime),
INTENT(in),
OPTIONAL :: start
397 LOGICAL,
INTENT(in),
OPTIONAL :: full_steps
399 INTEGER :: i, j, k, l, na, nf, n
400 INTEGER :: steps, p1, maxp1, maxp2, minp1mp2, dstart, msteps
401 INTEGER(kind=int_ll) :: stepms, mstepms
403 TYPE(datetime) :: lstart, lend, pstart1, pstart2, pend1, pend2, reftime1, reftime2, tmptime
404 TYPE(arrayof_datetime) :: a_otime
405 TYPE(arrayof_vol7d_timerange) :: a_otimerange
406 TYPE(arrayof_integer) :: a_dtratio
407 LOGICAL,
ALLOCATABLE :: mask_timerange(:)
408 TYPE(ttr_mapper) :: lmapper
409 CHARACTER(len=8) :: env_var
410 LOGICAL :: climat_behavior
415 CALL getenv(
'LIBSIM_CLIMAT_BEHAVIOR', env_var)
416 climat_behavior = len_trim(env_var) > 0 .AND. .NOT.
PRESENT(dtratio)
419 CALL getval(timedelta_depop(step), asec=steps)
422 ALLOCATE(mask_timerange(
SIZE(itimerange)))
423 mask_timerange(:) = itimerange(:)%timerange == tri &
424 .AND. itimerange(:)%p1 /= imiss .AND. itimerange(:)%p1 >= 0
426 IF (
PRESENT(dtratio))
THEN 427 WHERE(itimerange(:)%p2 > 0 .AND. itimerange(:)%p2 /= imiss)
428 mask_timerange(:) = mask_timerange(:) .AND.
mod(steps, itimerange(:)%p2) == 0
430 mask_timerange(:) = .false.
433 mask_timerange(:) = mask_timerange(:) .AND. itimerange(:)%p2 == 0
437 CALL l4f_log(l4f_debug, &
438 '(re)compute_stat_proc_agg, number of useful timeranges before choosing analysis/forecast: '// &
439 t2c(count(mask_timerange)))
444 na = count(mask_timerange(:) .AND. itimerange(:)%p1 == 0)
445 nf = count(mask_timerange(:) .AND. itimerange(:)%p1 > 0)
448 CALL l4f_log(l4f_debug, &
449 'recompute_stat_proc_agg, na: '//
t2c(na)//
', nf: '//
t2c(nf))
454 CALL l4f_log(l4f_info, &
455 'recompute_stat_proc_agg, processing in forecast mode')
457 mask_timerange(:) = mask_timerange(:) .AND. itimerange(:)%p1 == 0
458 CALL l4f_log(l4f_info, &
459 'recompute_stat_proc_agg, processing in analysis mode')
463 CALL l4f_log(l4f_debug, &
464 '(re)compute_stat_proc_agg, number of useful timeranges: '// &
465 t2c(count(mask_timerange)))
468 IF (
SIZE(itime) == 0 .OR. count(mask_timerange) == 0)
THEN 469 ALLOCATE(otime(0), otimerange(0), map_ttr(0,0))
470 IF (
PRESENT(dtratio))
ALLOCATE(dtratio(0))
475 lstart = datetime_miss
476 IF (
PRESENT(start)) lstart = start
477 lend = itime(
SIZE(itime))
479 maxp1 = maxval(itimerange(:)%p1, mask=mask_timerange)
480 maxp2 = maxval(itimerange(:)%p2, mask=mask_timerange)
481 minp1mp2 = minval(itimerange(:)%p1 - itimerange(:)%p2, mask=mask_timerange)
482 IF (time_definition == 0)
THEN 483 lend = lend + timedelta_new(sec=maxp1)
489 IF (lstart == datetime_miss)
THEN 492 IF (time_definition == 0)
THEN 493 lstart = lstart + timedelta_new(sec=minp1mp2)
496 lstart = lstart - timedelta_new(sec=maxp2)
501 IF (optio_log(full_steps) .AND. .NOT.lforecast)
THEN 502 lstart = lstart - (
mod(lstart, step))
507 CALL l4f_log(l4f_debug, &
508 'recompute_stat_proc_agg, processing period: '//
t2c(lstart)//
' - '//
t2c(lend))
514 IF (time_definition == 0)
THEN 515 CALL insert(a_otime, itime)
520 CALL getval(lstart-itime(1), asec=dstart)
523 IF (dstart < 0) dstart =
mod(dstart, steps)
524 DO p1 = steps + dstart, maxp1, steps
525 CALL insert_unique(a_otimerange, vol7d_timerange_new(stat_proc, p1, steps))
537 mstepms = steps*1000_int_ll
538 DO i = 2,
SIZE(itime)
539 CALL getval(itime(i)-itime(i-1), amsec=stepms)
540 IF (stepms > 0_int_ll .AND. stepms < mstepms)
THEN 541 msteps = stepms/1000_int_ll
542 IF (
mod(steps, msteps) == 0) mstepms = stepms
545 msteps = mstepms/1000_int_ll
547 tmptime = lstart + step
548 DO WHILE(tmptime < lend)
549 CALL insert_unique(a_otime, tmptime)
550 tmptime = tmptime + step
559 DO p1 = msteps, maxp1, msteps
560 CALL insert_unique(a_otimerange, vol7d_timerange_new(stat_proc, p1, steps))
566 tmptime = lstart + step
567 DO WHILE(tmptime < lend)
568 CALL insert_unique(a_otime, tmptime)
569 tmptime = tmptime + step
571 CALL insert_unique(a_otimerange, vol7d_timerange_new(stat_proc, 0, steps))
577 otime => a_otime%array
578 otimerange => a_otimerange%array
580 CALL sort(otimerange)
582 CALL delete(a_otime, nodealloc=.true.)
583 CALL delete(a_otimerange, nodealloc=.true.)
586 CALL l4f_log(l4f_debug, &
587 'recompute_stat_proc_agg, output time and timerange: '//&
588 t2c(
SIZE(otime))//
', '//
t2c(
size(otimerange)))
591 IF (
PRESENT(dtratio))
THEN 593 DO k = 1,
SIZE(itimerange)
594 IF (itimerange(k)%p2 /= 0) &
595 CALL insert_unique(a_dtratio, steps/itimerange(k)%p2)
598 dtratio => a_dtratio%array
601 CALL delete(a_dtratio, nodealloc=.true.)
604 CALL l4f_log(l4f_debug, &
605 'recompute_stat_proc_agg, found '//
t2c(
size(dtratio))// &
606 ' possible aggregation ratios, from '// &
607 t2c(dtratio(1))//
' to '//
t2c(dtratio(
SIZE(dtratio))))
610 ALLOCATE(map_ttr(
SIZE(otime),
SIZE(otimerange)))
611 do_itimerange1:
DO l = 1,
SIZE(itimerange)
612 IF (.NOT.mask_timerange(l)) cycle do_itimerange1
613 do_itime1:
DO k = 1,
SIZE(itime)
614 CALL time_timerange_get_period(itime(k), itimerange(l), &
615 time_definition, pstart1, pend1, reftime1)
616 do_otimerange1:
DO j = 1,
SIZE(otimerange)
617 do_otime1:
DO i = 1,
SIZE(otime)
618 CALL time_timerange_get_period_pop(otime(i), otimerange(j), step, &
619 time_definition, pstart2, pend2, reftime2)
621 IF (reftime1 /= reftime2) cycle do_otime1
624 IF (pstart1 >= pstart2 .AND. pend1 <= pend2 .AND. &
625 mod(pstart1-pstart2, pend1-pstart1) == timedelta_0)
THEN 628 lmapper%extra_info = steps/itimerange(l)%p2
629 n =
append(map_ttr(i,j), lmapper)
639 ALLOCATE(map_ttr(
SIZE(otime),
SIZE(otimerange)))
640 do_itimerange2:
DO l = 1,
SIZE(itimerange)
641 IF (.NOT.mask_timerange(l)) cycle do_itimerange2
642 do_itime2:
DO k = 1,
SIZE(itime)
643 CALL time_timerange_get_period(itime(k), itimerange(l), &
644 time_definition, pstart1, pend1, reftime1)
645 do_otimerange2:
DO j = 1,
SIZE(otimerange)
646 do_otime2:
DO i = 1,
SIZE(otime)
647 CALL time_timerange_get_period_pop(otime(i), otimerange(j), step, &
648 time_definition, pstart2, pend2, reftime2)
650 IF (reftime1 /= reftime2) cycle do_otime2
653 IF (climat_behavior .AND. pstart1 == pstart2) cycle do_otime2
654 IF (pstart1 >= pstart2 .AND. pend1 <= pend2)
THEN 657 IF (pstart1 == pstart2)
THEN 658 lmapper%extra_info = 1
659 ELSE IF (pend1 == pend2)
THEN 660 lmapper%extra_info = 2
662 lmapper%extra_info = imiss
664 lmapper%time = pstart1
665 n = insert_sorted(map_ttr(i,j), lmapper, .true., .true.)
675 END SUBROUTINE recompute_stat_proc_agg_common
678 SUBROUTINE compute_stat_proc_agg_sw(vertime, pstart, pend, time_mask, &
680 TYPE(
datetime),
INTENT(in) :: vertime(:)
683 LOGICAL,
INTENT(in) :: time_mask(:)
684 TYPE(
timedelta),
OPTIONAL,
INTENT(out) :: max_step
685 DOUBLE PRECISION,
OPTIONAL,
INTENT(out) :: weights(:)
688 TYPE(
datetime),
ALLOCATABLE :: lvertime(:)
690 INTEGER(kind=int_ll) :: dt, tdt
692 nt = count(time_mask)
693 ALLOCATE(lvertime(nt))
694 lvertime = pack(vertime, mask=time_mask)
696 IF (
PRESENT(max_step))
THEN 707 max_step = pend - pstart
709 half = lvertime(1) + (lvertime(2) - lvertime(1))/2
710 max_step = half - pstart
712 nexthalf = lvertime(i) + (lvertime(i+1) - lvertime(i))/2
713 IF (nexthalf - half > max_step) max_step = nexthalf - half
716 IF (pend - half > max_step) max_step = pend - half
721 IF (
PRESENT(weights))
THEN 725 CALL getval(pend - pstart, amsec=tdt)
726 half = lvertime(1) + (lvertime(2) - lvertime(1))/2
727 CALL getval(half - pstart, amsec=dt)
728 weights(1) = dble(dt)/dble(tdt)
730 nexthalf = lvertime(i) + (lvertime(i+1) - lvertime(i))/2
731 CALL getval(nexthalf - half, amsec=dt)
732 weights(i) = dble(dt)/dble(tdt)
735 CALL getval(pend - half, amsec=dt)
736 weights(nt) = dble(dt)/dble(tdt)
740 END SUBROUTINE compute_stat_proc_agg_sw
744 SUBROUTINE time_timerange_get_period(time, timerange, time_definition, &
745 pstart, pend, reftime)
747 TYPE(vol7d_timerange),
INTENT(in) :: timerange
748 INTEGER,
INTENT(in) :: time_definition
749 TYPE(
datetime),
INTENT(out) :: reftime
750 TYPE(
datetime),
INTENT(out) :: pstart
756 p1 = timedelta_new(sec=timerange%p1)
757 p2 = timedelta_new(sec=timerange%p2)
759 IF (time == datetime_miss .OR. .NOT.
c_e(timerange%p1) .OR. .NOT.
c_e(timerange%p2) .OR. &
761 timerange%p1 < 0 .OR. timerange%p2 < 0)
THEN 762 pstart = datetime_miss
764 reftime = datetime_miss
768 IF (time_definition == 0)
THEN 772 ELSE IF (time_definition == 1)
THEN 777 pstart = datetime_miss
779 reftime = datetime_miss
782 END SUBROUTINE time_timerange_get_period
788 SUBROUTINE time_timerange_get_period_pop(time, timerange, step, time_definition, &
789 pstart, pend, reftime)
791 TYPE(vol7d_timerange),
INTENT(in) :: timerange
793 INTEGER,
INTENT(in) :: time_definition
794 TYPE(
datetime),
INTENT(out) :: reftime
795 TYPE(
datetime),
INTENT(out) :: pstart
801 p1 = timedelta_new(sec=timerange%p1)
803 IF (time == datetime_miss .OR. .NOT.
c_e(timerange%p1) .OR. .NOT.
c_e(timerange%p2) .OR. &
805 timerange%p1 < 0 .OR. timerange%p2 < 0)
THEN 806 pstart = datetime_miss
808 reftime = datetime_miss
812 IF (time_definition == 0)
THEN 816 ELSE IF (time_definition == 1)
THEN 821 pstart = datetime_miss
823 reftime = datetime_miss
826 END SUBROUTINE time_timerange_get_period_pop
831 SUBROUTINE time_timerange_set_period(time, timerange, time_definition, &
832 pstart, pend, reftime)
834 TYPE(vol7d_timerange),
INTENT(inout) :: timerange
835 INTEGER,
INTENT(in) :: time_definition
836 TYPE(
datetime),
INTENT(in) :: reftime
841 INTEGER(kind=int_ll) :: dmsec
844 IF (time_definition == 0)
THEN 848 ELSE IF (time_definition == 1)
THEN 856 IF (time /= datetime_miss)
THEN 857 CALL getval(p1, amsec=dmsec)
858 timerange%p1 = int(dmsec/1000_int_ll)
859 CALL getval(p2, amsec=dmsec)
860 timerange%p2 = int(dmsec/1000_int_ll)
866 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.