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"
80ELEMENTAL FUNCTION ttr_mapper_eq(this, that)
RESULT(res)
81TYPE(ttr_mapper),
INTENT(IN) :: this, that
84res = this%time == that%time
86END FUNCTION ttr_mapper_eq
88ELEMENTAL FUNCTION ttr_mapper_ne(this, that)
RESULT(res)
89TYPE(ttr_mapper),
INTENT(IN) :: this, that
92res = this%time /= that%time
94END FUNCTION ttr_mapper_ne
96ELEMENTAL FUNCTION ttr_mapper_gt(this, that)
RESULT(res)
97TYPE(ttr_mapper),
INTENT(IN) :: this, that
100res = this%time > that%time
102END FUNCTION ttr_mapper_gt
104ELEMENTAL FUNCTION ttr_mapper_lt(this, that)
RESULT(res)
105TYPE(ttr_mapper),
INTENT(IN) :: this, that
108res = this%time < that%time
110END FUNCTION ttr_mapper_lt
112ELEMENTAL FUNCTION ttr_mapper_ge(this, that)
RESULT(res)
113TYPE(ttr_mapper),
INTENT(IN) :: this, that
116res = this%time >= that%time
118END FUNCTION ttr_mapper_ge
120ELEMENTAL FUNCTION ttr_mapper_le(this, that)
RESULT(res)
121TYPE(ttr_mapper),
INTENT(IN) :: this, that
124res = this%time <= that%time
126END FUNCTION ttr_mapper_le
128#include "arrayof_post.F90"
129#include "array_utilities_inc.F90"
133SUBROUTINE recompute_stat_proc_diff_common(itime, itimerange, stat_proc, step, &
134 otime, otimerange, map_tr, f, keep_tr, time_definition, full_steps, &
136TYPE(datetime),
INTENT(in) :: itime(:)
137TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
138INTEGER,
INTENT(in) :: stat_proc
139TYPE(timedelta),
INTENT(in) :: step
140TYPE(datetime),
POINTER :: otime(:)
141TYPE(vol7d_timerange),
POINTER :: otimerange(:)
142INTEGER,
ALLOCATABLE,
INTENT(out) :: map_tr(:,:,:,:,:), f(:), keep_tr(:,:,:)
144LOGICAL,
ALLOCATABLE :: mask_timerange(:)
145INTEGER,
INTENT(in) :: time_definition
146LOGICAL,
INTENT(in),
OPTIONAL :: full_steps
147TYPE(datetime),
INTENT(in),
OPTIONAL :: start
149INTEGER :: i, j, k, l, dirtyrep
151LOGICAL :: lfull_steps, useful
152TYPE(datetime) :: lstart, pstart1, pstart2, pend1, pend2, reftime1, reftime2, tmptime
153TYPE(vol7d_timerange) :: tmptimerange
154TYPE(arrayof_datetime) :: a_otime
155TYPE(arrayof_vol7d_timerange) :: a_otimerange
158CALL getval(step, asec=steps)
160lstart = datetime_miss
161IF (
PRESENT(start)) lstart = start
162lfull_steps = optio_log(full_steps)
165ALLOCATE(mask_timerange(
SIZE(itimerange)))
166mask_timerange(:) = itimerange(:)%timerange == stat_proc &
167 .AND. itimerange(:)%p1 /= imiss .AND. itimerange(:)%p2 /= imiss &
168 .AND. itimerange(:)%p1 >= 0 &
169 .AND. itimerange(:)%p2 > 0
171IF (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)
179nitr = count(mask_timerange)
183 DO WHILE(.NOT.mask_timerange(j))
191ALLOCATE(keep_tr(nitr,
SIZE(itime), 2))
192CALL compute_keep_tr()
194ALLOCATE(map_tr(nitr,
SIZE(itime), nitr,
SIZE(itime), 2))
195map_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)
280CALL compute_keep_tr()
282otime => a_otime%array
283otimerange => a_otimerange%array
285CALL delete(a_otime, nodealloc=.true.)
286CALL delete(a_otimerange, nodealloc=.true.)
289CALL 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))))
294CALL l4f_log(l4f_debug, &
295 'recompute_stat_proc_diff, map_tr: '//
t2c((
SIZE(map_tr))/2)//
', '// &
296 t2c(count(
c_e(map_tr))/2))
297CALL l4f_log(l4f_debug, &
298 'recompute_stat_proc_diff, nitr: '//
t2c(nitr))
299CALL l4f_log(l4f_debug, &
300 'recompute_stat_proc_diff, good timeranges: '//
t2c(count(
c_e(keep_tr))/2))
301CALL l4f_log(l4f_debug, &
302 'recompute_stat_proc_diff, output times: '//
t2c(
SIZE(otime)))
303CALL l4f_log(l4f_debug, &
304 'recompute_stat_proc_diff, output timeranges: '//
t2c(
SIZE(otimerange)))
309SUBROUTINE compute_keep_tr()
311keep_tr(:,:,:) = imiss
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)))
349END SUBROUTINE compute_keep_tr
351END SUBROUTINE recompute_stat_proc_diff_common
355SUBROUTINE compute_stat_proc_metamorph_common(istat_proc, itimerange, ostat_proc, &
357INTEGER,
INTENT(in) :: istat_proc
358TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
359INTEGER,
INTENT(in) :: ostat_proc
360TYPE(vol7d_timerange),
POINTER :: otimerange(:)
361INTEGER,
POINTER :: map_tr(:)
364LOGICAL :: tr_mask(SIZE(itimerange))
366IF (
SIZE(itimerange) == 0)
THEN
367 ALLOCATE(otimerange(0), map_tr(0))
372tr_mask(:) = itimerange(:)%timerange == istat_proc .AND. itimerange(:)%p2 /= imiss &
373 .AND. itimerange(:)%p2 /= 0
374ALLOCATE(otimerange(count(tr_mask)), map_tr(count(tr_mask)))
376otimerange = pack(itimerange, mask=tr_mask)
377otimerange(:)%timerange = ostat_proc
378map_tr = pack((/(i,i=1,
SIZE(itimerange))/), mask=tr_mask)
380END SUBROUTINE compute_stat_proc_metamorph_common
384SUBROUTINE recompute_stat_proc_agg_common(itime, itimerange, stat_proc, tri, &
385 step, time_definition, otime, otimerange, map_ttr, dtratio, start, full_steps)
386TYPE(datetime),
INTENT(in) :: itime(:)
387TYPE(vol7d_timerange),
INTENT(in) :: itimerange(:)
388INTEGER,
INTENT(in) :: stat_proc
389INTEGER,
INTENT(in) :: tri
390TYPE(timedelta),
INTENT(in) :: step
391INTEGER,
INTENT(in) :: time_definition
392TYPE(datetime),
POINTER :: otime(:)
393TYPE(vol7d_timerange),
POINTER :: otimerange(:)
394TYPE(arrayof_ttr_mapper),
POINTER :: map_ttr(:,:)
395INTEGER,
POINTER,
OPTIONAL :: dtratio(:)
396TYPE(datetime),
INTENT(in),
OPTIONAL :: start
397LOGICAL,
INTENT(in),
OPTIONAL :: full_steps
399INTEGER :: i, j, k, l, na, nf, n
400INTEGER :: steps, p1, maxp1, maxp2, minp1mp2, dstart, msteps
401INTEGER(kind=int_ll) :: stepms, mstepms
403TYPE(datetime) :: lstart, lend, pstart1, pstart2, pend1, pend2, reftime1, reftime2, tmptime
404TYPE(arrayof_datetime) :: a_otime
405TYPE(arrayof_vol7d_timerange) :: a_otimerange
406TYPE(arrayof_integer) :: a_dtratio
407LOGICAL,
ALLOCATABLE :: mask_timerange(:)
408TYPE(ttr_mapper) :: lmapper
409CHARACTER(len=8) :: env_var
410LOGICAL :: climat_behavior
415CALL getenv(
'LIBSIM_CLIMAT_BEHAVIOR', env_var)
416climat_behavior = len_trim(env_var) > 0 .AND. .NOT.
PRESENT(dtratio)
419CALL getval(timedelta_depop(step), asec=steps)
422ALLOCATE(mask_timerange(
SIZE(itimerange)))
423mask_timerange(:) = itimerange(:)%timerange == tri &
424 .AND. itimerange(:)%p1 /= imiss .AND. itimerange(:)%p1 >= 0
426IF (
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
437CALL l4f_log(l4f_debug, &
438 '(re)compute_stat_proc_agg, number of useful timeranges before choosing analysis/forecast: '// &
439 t2c(count(mask_timerange)))
444na = count(mask_timerange(:) .AND. itimerange(:)%p1 == 0)
445nf = count(mask_timerange(:) .AND. itimerange(:)%p1 > 0)
448CALL 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')
463CALL l4f_log(l4f_debug, &
464 '(re)compute_stat_proc_agg, number of useful timeranges: '// &
465 t2c(count(mask_timerange)))
468IF (
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))
475lstart = datetime_miss
476IF (
PRESENT(start)) lstart = start
477lend = itime(
SIZE(itime))
479maxp1 = maxval(itimerange(:)%p1, mask=mask_timerange)
480maxp2 = maxval(itimerange(:)%p2, mask=mask_timerange)
481minp1mp2 = minval(itimerange(:)%p1 - itimerange(:)%p2, mask=mask_timerange)
482IF (time_definition == 0)
THEN
483 lend = lend + timedelta_new(sec=maxp1)
489IF (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))
507CALL 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))
577otime => a_otime%array
578otimerange => a_otimerange%array
582CALL delete(a_otime, nodealloc=.true.)
583CALL delete(a_otimerange, nodealloc=.true.)
586CALL l4f_log(l4f_debug, &
587 'recompute_stat_proc_agg, output time and timerange: '//&
588 t2c(
SIZE(otime))//
', '//
t2c(
size(otimerange)))
591IF (
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.)
675END SUBROUTINE recompute_stat_proc_agg_common
678SUBROUTINE compute_stat_proc_agg_sw(vertime, pstart, pend, time_mask, &
680TYPE(
datetime),
INTENT(in) :: vertime(:)
683LOGICAL,
INTENT(in) :: time_mask(:)
684TYPE(
timedelta),
OPTIONAL,
INTENT(out) :: max_step
685DOUBLE PRECISION,
OPTIONAL,
INTENT(out) :: weights(:)
688TYPE(
datetime),
ALLOCATABLE :: lvertime(:)
690INTEGER(kind=int_ll) :: dt, tdt
693ALLOCATE(lvertime(nt))
694lvertime = pack(vertime, mask=time_mask)
696IF (
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
721IF (
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)
740END SUBROUTINE compute_stat_proc_agg_sw
744SUBROUTINE time_timerange_get_period(time, timerange, time_definition, &
745 pstart, pend, reftime)
747TYPE(vol7d_timerange),
INTENT(in) :: timerange
748INTEGER,
INTENT(in) :: time_definition
749TYPE(
datetime),
INTENT(out) :: reftime
756p1 = timedelta_new(sec=timerange%p1)
757p2 = timedelta_new(sec=timerange%p2)
759IF (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
768IF (time_definition == 0)
THEN
772ELSE IF (time_definition == 1)
THEN
777 pstart = datetime_miss
779 reftime = datetime_miss
782END SUBROUTINE time_timerange_get_period
788SUBROUTINE time_timerange_get_period_pop(time, timerange, step, time_definition, &
789 pstart, pend, reftime)
791TYPE(vol7d_timerange),
INTENT(in) :: timerange
793INTEGER,
INTENT(in) :: time_definition
794TYPE(
datetime),
INTENT(out) :: reftime
801p1 = timedelta_new(sec=timerange%p1)
803IF (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
812IF (time_definition == 0)
THEN
816ELSE IF (time_definition == 1)
THEN
821 pstart = datetime_miss
823 reftime = datetime_miss
826END SUBROUTINE time_timerange_get_period_pop
831SUBROUTINE time_timerange_set_period(time, timerange, time_definition, &
832 pstart, pend, reftime)
834TYPE(vol7d_timerange),
INTENT(inout) :: timerange
835INTEGER,
INTENT(in) :: time_definition
841INTEGER(kind=int_ll) :: dmsec
844IF (time_definition == 0)
THEN
848ELSE IF (time_definition == 1)
THEN
856IF (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)
866END 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.