|
◆ vol7d_recompute_stat_proc_agg()
subroutine vol7d_class_compute::vol7d_recompute_stat_proc_agg |
( |
type(vol7d), intent(inout) |
this, |
|
|
type(vol7d), intent(out) |
that, |
|
|
integer, intent(in) |
stat_proc, |
|
|
type(timedelta), intent(in) |
step, |
|
|
type(datetime), intent(in), optional |
start, |
|
|
logical, intent(in), optional |
full_steps, |
|
|
real, intent(in), optional |
frac_valid, |
|
|
type(vol7d), intent(inout), optional |
other, |
|
|
integer, intent(in), optional |
stat_proc_input |
|
) |
| |
Specialized method for statistically processing a set of data already processed with the same statistical processing, on a different time interval.
This method performs statistical processing by aggregation of shorter intervals. Only floating point single or double precision data are processed.
The output that vol7d object contains elements from the original volume this satisfying the conditions
- real single or double precision variables
- timerange (vol7d_timerange_class::vol7d_timerange::timerange) of type stat_proc (or stat_proc_input if provided)
- any p1 (analysis/observation or forecast)
- p2 > 0 (processing interval non null, non instantaneous data) and equal to a multiplier of step
Output data will have timerange of type stat_proc and p2 = step. The supported statistical processing methods (parameter stat_proc) are:
- 0 average
- 1 accumulation
- 2 maximum
- 3 minimum
- 4 difference
- 6 standard deviation
- 200 vectorial mean
The start of processing period can be computed automatically from the input intervals as the first possible interval modulo step, or, for a better control, it can be specified explicitly by the optional argument start. Notice that start indicates the beginning of the processing interval, so in the final volume, the first datum may have time equal to start + step, e.g. in the case when time is the verification time, which is typical for observed datasets.
The purpose of the optional argument stat_proc_input is to allow processing with a certain statistical processing operator a dataset already processed with a different operator, by specifying the latter as stat_proc_input; this is useful, for example, if one wants to compute the monthly average of daily maximum temperatures; however this has to be used with care since the resulting data volume will not carry all the information about the processing which has been done, in the previous case, for example, the temperatures will simply look like monthly average temperatures.
- Parametri
-
[in,out] | this | volume providing data to be recomputed, it is not modified by the method, apart from performing a vol7d_alloc_vol on it |
[out] | that | output volume which will contain the recomputed data |
[in] | stat_proc | type of statistical processing to be recomputed (from grib2 table), only data having timerange of this type will be recomputed and will appear in the output volume |
[in] | step | length of the step over which the statistical processing is performed |
[in] | start | start of statistical processing interval |
[in] | full_steps | if .TRUE. and start is not provided, apply processing only on intervals starting at a forecast time or a reference time modulo step |
[in] | frac_valid | minimum fraction of valid data required for considering acceptable a recomputed value, default=1. |
[in,out] | other | optional volume that, on exit, is going to contain the data that did not contribute to the statistical processing |
[in] | stat_proc_input | to be used with care, type of statistical processing of data that has to be processed (from grib2 table), only data having timerange of this type will be recomputed, the actual statistical processing performed and which will appear in the output volume, is however determined by stat_proc argument |
Definizione alla linea 446 del file vol7d_class_compute.F90.
446 .OR. this%timerange(:)%p2 == 0)) 448 END SUBROUTINE makeother 450 END SUBROUTINE vol7d_recompute_stat_proc_agg 484 SUBROUTINE vol7d_compute_stat_proc_agg(this, that, stat_proc, & 485 step, start, full_steps, max_step, weighted, other) 486 TYPE(vol7d), INTENT(inout) :: this 487 TYPE(vol7d), INTENT(out) :: that 488 INTEGER, INTENT(in) :: stat_proc 489 TYPE(timedelta), INTENT(in) :: step 490 TYPE(datetime), INTENT(in), OPTIONAL :: start 491 LOGICAL, INTENT(in), OPTIONAL :: full_steps 492 TYPE(timedelta), INTENT(in), OPTIONAL :: max_step 493 LOGICAL, INTENT(in), OPTIONAL :: weighted 494 TYPE(vol7d), INTENT(inout), OPTIONAL :: other 497 TYPE(vol7d) :: v7dtmp 499 INTEGER :: i, j, n, ninp, ndtr, i1, i3, i5, i6, vartype, maxsize 500 TYPE(timedelta) :: lmax_step, act_max_step 501 TYPE(datetime) :: pstart, pend, reftime 502 TYPE(arrayof_ttr_mapper), POINTER :: map_ttr(:,:) 503 REAL, ALLOCATABLE :: tmpvolr(:) 504 DOUBLE PRECISION, ALLOCATABLE :: tmpvold(:), weights(:) 505 LOGICAL, ALLOCATABLE :: lin_mask(:) 507 CHARACTER(len=8) :: env_var 509 IF ( PRESENT(max_step)) THEN 512 lmax_step = timedelta_max 514 lweighted = optio_log(weighted) 518 CALL getenv( 'LIBSIM_CLIMAT_BEHAVIOR', env_var) 519 lweighted = lweighted .AND. len_trim(env_var) == 0 521 lweighted = lweighted .AND. stat_proc == 0 524 CALL vol7d_alloc_vol(this) 528 CALL vol7d_smart_sort(this, lsort_time=.true.) 529 CALL vol7d_reform(this, miss=.false., sort=.false., unique=.true.) 531 CALL vol7d_copy(this, v7dtmp, ltime=(/.false./), ltimerange=(/.false./)) 534 CALL init(that, time_definition=this%time_definition) 536 CALL recompute_stat_proc_agg_common(this%time, this%timerange, stat_proc, tri, & 537 step, this%time_definition, that%time, that%timerange, map_ttr, start=start, & 538 full_steps=full_steps) 540 CALL vol7d_merge(that, v7dtmp) 542 maxsize = maxval(map_ttr(:,:)%arraysize) 543 ALLOCATE(tmpvolr(maxsize), tmpvold(maxsize), lin_mask(maxsize), weights(maxsize)) 544 do_otimerange: DO j = 1, SIZE(that%timerange) 545 do_otime: DO i = 1, SIZE(that%time) 546 ninp = map_ttr(i,j)%arraysize 547 IF (ninp <= 0) cycle do_otime 549 CALL time_timerange_get_period(that%time(i), that%timerange(j), & 550 that%time_definition, pstart, pend, reftime) 552 IF ( ASSOCIATED(this%voldatir)) THEN 553 DO i1 = 1, SIZE(this%ana) 554 DO i3 = 1, SIZE(this%level) 555 DO i6 = 1, SIZE(this%network) 556 DO i5 = 1, SIZE(this%dativar%r) 558 IF (stat_proc == 4) THEN 560 IF (map_ttr(i,j)%array(1)%extra_info == 1 .AND. & 561 map_ttr(i,j)%array(ninp)%extra_info == 2) THEN 562 IF (c_e(this%voldatir(i1,map_ttr(i,j)%array(1)%it,i3, & 563 map_ttr(i,j)%array(1)%itr,i5,i6)) .AND. & 564 c_e(this%voldatir(i1,map_ttr(i,j)%array(ninp)%it,i3, & 565 map_ttr(i,j)%array(ninp)%itr,i5,i6))) THEN 566 that%voldatir(i1,i,i3,j,i5,i6) = & 567 this%voldatir(i1,map_ttr(i,j)%array(ninp)%it,i3, & 568 map_ttr(i,j)%array(ninp)%itr,i5,i6) - & 569 this%voldatir(i1,map_ttr(i,j)%array(1)%it,i3, & 570 map_ttr(i,j)%array(1)%itr,i5,i6) 577 vartype = vol7d_vartype(this%dativar%r(i5)) 581 IF (c_e(this%voldatir(i1,map_ttr(i,j)%array(n)%it,i3, & 582 map_ttr(i,j)%array(n)%itr,i5,i6))) THEN 584 tmpvolr(ndtr) = this%voldatir(i1,map_ttr(i,j)%array(n)%it,i3, & 585 map_ttr(i,j)%array(n)%itr,i5,i6) 591 CALL compute_stat_proc_agg_sw(map_ttr(i,j)%array(1:ninp)%time, & 592 pstart, pend, lin_mask(1:ninp), act_max_step, weights) 594 CALL compute_stat_proc_agg_sw(map_ttr(i,j)%array(1:ninp)%time, & 595 pstart, pend, lin_mask(1:ninp), act_max_step) 597 IF (act_max_step > lmax_step) cycle 599 SELECT CASE(stat_proc) 602 that%voldatir(i1,i,i3,j,i5,i6) = & 603 sum( REAL(weights(1:ndtr))*tmpvolr(1:ndtr)) 605 that%voldatir(i1,i,i3,j,i5,i6) = & 606 sum(tmpvolr(1:ndtr))/ndtr 609 that%voldatir(i1,i,i3,j,i5,i6) = & 610 maxval(tmpvolr(1:ndtr)) 612 that%voldatir(i1,i,i3,j,i5,i6) = & 613 minval(tmpvolr(1:ndtr)) 615 that%voldatir(i1,i,i3,j,i5,i6) = & 616 stat_stddev(tmpvolr(1:ndtr)) 619 IF (vartype == var_dir360) THEN 622 WHERE (tmpvolr(1:ndtr) == 0.0) 623 tmpvolr(1:ndtr) = rmiss 624 ELSE WHERE (tmpvolr(1:ndtr) < 22.5 .AND. tmpvolr(1:ndtr) > 0.0) 625 tmpvolr(1:ndtr) = tmpvolr(1:ndtr) + 360. 627 that%voldatir(i1,i,i3,j,i5,i6) = & 628 stat_mode_histogram(tmpvolr(1:ndtr), & 638 IF ( ASSOCIATED(this%voldatid)) THEN 639 DO i1 = 1, SIZE(this%ana) 640 DO i3 = 1, SIZE(this%level) 641 DO i6 = 1, SIZE(this%network) 642 DO i5 = 1, SIZE(this%dativar%d) 644 IF (stat_proc == 4) THEN 646 IF (map_ttr(i,j)%array(1)%extra_info == 1 .AND. & 647 map_ttr(i,j)%array(ninp)%extra_info == 2) THEN
|