|
|
◆ volgrid6d_recompute_stat_proc_diff()
| subroutine volgrid6d_class_compute::volgrid6d_recompute_stat_proc_diff |
( |
type(volgrid6d), intent(inout) |
this, |
|
|
type(volgrid6d), intent(out) |
that, |
|
|
integer, intent(in) |
stat_proc, |
|
|
type(timedelta), intent(in) |
step, |
|
|
logical, intent(in), optional |
full_steps, |
|
|
type(datetime), intent(in), optional |
start, |
|
|
logical, intent(in), optional |
clone |
|
) |
| |
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 difference of different intervals. Data with both analysis/observation or forecast timerange are processed.
The output that volgrid6d object contains elements from the original volume this satisfying the conditions
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
- 4 difference
Input volume may have any value of thistime_definition, and that value will be conserved in the output volume.
- Parametri
-
| [in,out] | this | volume providing data to be recomputed, it is not modified by the method, apart from performing a volgrid6d_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] | full_steps | if provided and .TRUE., process only data having processing interval (p2) equal to a multiple of step |
| [in] | start | if provided, together with full_steps, processes data on intervals starting at start +- an integer amount of step intervals |
| [in] | clone | if provided and .TRUE. , clone the gaid's from this to that |
Definizione alla linea 779 del file volgrid6d_class_compute.F90.
780 lclone = optio_log(clone) .OR. .NOT. ASSOCIATED(this%voldati) 782 IF (.NOT.((stat_proc_input == 0 .AND. stat_proc == 1) .OR. & 783 (stat_proc_input == 1 .AND. stat_proc == 0))) THEN 785 CALL l4f_category_log(this%category, l4f_warn, & 786 'compute_stat_proc_metamorph, can only be applied to average->accumulated timerange and viceversa') 789 CALL volgrid6d_alloc_vol(that) 794 CALL init(that, griddim=this%griddim, time_definition=this%time_definition) 795 CALL volgrid6d_alloc(that, dim=this%griddim%dim, ntime= SIZE(this%time), & 796 nlevel= SIZE(this%level), nvar= SIZE(this%var), ini=.false.) 797 that%time = this%time 798 that%level = this%level 801 CALL compute_stat_proc_metamorph_common(stat_proc_input, this%timerange, stat_proc, & 802 that%timerange, map_tr) 805 CALL volgrid6d_alloc_vol(that, decode= ASSOCIATED(this%voldati)) 807 IF (stat_proc == 0) THEN 808 int_ratio = 1./ REAL(that%timerange(:)%p2) 810 int_ratio = REAL(that%timerange(:)%p2) 813 DO i6 = 1, SIZE(this%var) 814 DO j = 1, SIZE(map_tr) 815 DO i4 = 1, SIZE(that%time) 816 DO i3 = 1, SIZE(this%level) 819 CALL copy(this%gaid(i3,i4,map_tr(j),i6), that%gaid(i3,i4,j,i6)) 821 that%gaid(i3,i4,map_tr(j),i6) = this%gaid(i3,i4,j,i6) 823 CALL volgrid_get_vol_2d(this, i3, i4, map_tr(j), i6, voldatiin) 824 CALL volgrid_get_vol_2d(that, i3, i4, j, i6, voldatiout) 825 WHERE (c_e(voldatiin)) 826 voldatiout = voldatiin*int_ratio(j) 830 CALL volgrid_set_vol_2d(that, i3, i4, j, i6, voldatiout) 837 END SUBROUTINE volgrid6d_compute_stat_proc_metamorph 853 SUBROUTINE volgrid6d_compute_vert_coord_var(this, level, volgrid_lev) 854 TYPE(volgrid6d), INTENT(in) :: this 855 TYPE(vol7d_level), INTENT(in) :: level 856 TYPE(volgrid6d), INTENT(out) :: volgrid_lev 858 INTEGER :: nlev, i, ii, iii, iiii 859 TYPE(grid_id) :: out_gaid 860 LOGICAL, ALLOCATABLE :: levmask(:) 861 TYPE(volgrid6d_var) :: lev_var 863 CALL init(volgrid_lev) 864 IF (.NOT. ASSOCIATED(this%gaid)) THEN 865 CALL l4f_log(l4f_error, 'volgrid6d_compute_vert_coord_var: input volume not allocated') 869 IF (c_e(level%level2) .AND. level%level1 /= level%level2) THEN 870 CALL l4f_log(l4f_error, 'volgrid6d_compute_vert_coord_var: requested (mixed) layer type not valid') 875 ALLOCATE(levmask( SIZE(this%level))) 876 levmask = this%level%level1 == level%level1 .AND. & 877 this%level%level2 == level%level2 .AND. c_e(this%level%l1) 878 IF (c_e(level%level2)) levmask = levmask .AND. c_e(this%level%l2) 879 nlev = count(levmask) 881 CALL l4f_log(l4f_error, 'volgrid6d_compute_vert_coord_var: requested level type not available') 885 out_gaid = grid_id_new() 886 gaidloop: DO i=1 , SIZE(this%gaid,1) 887 DO ii=1 , SIZE(this%gaid,2) 888 DO iii=1 , SIZE(this%gaid,3) 889 DO iiii=1 , SIZE(this%gaid,4) 890 IF (c_e(this%gaid(i,ii,iii,iiii))) THEN 891 CALL copy(this%gaid(i,ii,iii,iiii), out_gaid) 900 lev_var = convert(vol7d_var_new(btable=vol7d_level_to_var(level)), & 901 grid_id_template=out_gaid) 902 IF (.NOT.c_e(lev_var)) THEN 903 CALL l4f_log(l4f_error, 'volgrid6d_compute_vert_coord_var: no variable corresponds to requested level type') 908 CALL init(volgrid_lev, griddim=this%griddim, & 909 time_definition=this%time_definition) 910 CALL volgrid6d_alloc(volgrid_lev, ntime= SIZE(this%time), nlevel=nlev, & 911 ntimerange= SIZE(this%timerange), nvar=1) 913 volgrid_lev%time = this%time 914 volgrid_lev%level = pack(this%level, mask=levmask) 915 volgrid_lev%timerange = this%timerange 916 volgrid_lev%var(1) = lev_var 918 CALL volgrid6d_alloc_vol(volgrid_lev, decode=.true.) 921 IF (c_e(level%level2)) THEN 922 volgrid_lev%voldati(:,:,i,:,:,:) = REAL(volgrid_lev%level(i)%l1 + & 923 volgrid_lev%level(i)%l2)* & 924 vol7d_level_to_var_factor(volgrid_lev%level(i))/2. 926 volgrid_lev%voldati(:,:,i,:,:,:) = REAL(volgrid_lev%level(i)%l1)* & 927 vol7d_level_to_var_factor(volgrid_lev%level(i))
|