18 use mo_kind,
only : i4, dp
65 function majority_statistics(nClass, L1_upper_rowId_cell, L1_lower_rowId_cell, L1_left_colonId_cell, &
66 L1_right_colonId_cell, L0_fineScale_2D_data)
70 integer(i4),
intent(in) :: nclass
73 integer(i4),
dimension(:),
intent(in) :: l1_upper_rowid_cell
76 integer(i4),
dimension(:),
intent(in) :: l1_lower_rowid_cell
79 integer(i4),
dimension(:),
intent(in) :: l1_left_colonid_cell
82 integer(i4),
dimension(:),
intent(in) :: l1_right_colonid_cell
85 integer(i4),
dimension(:, :),
intent(in) :: l0_finescale_2d_data
89 integer(i4) :: l1_ncells
91 integer(i4) :: iu, id, jl, jr
95 integer(i4) :: max_val
103 iu = l1_upper_rowid_cell(kk)
104 id = l1_lower_rowid_cell(kk)
105 jl = l1_left_colonid_cell(kk)
106 jr = l1_right_colonid_cell(kk)
110 nc = count(l0_finescale_2d_data(iu : id, jl : jr) == ll)
111 if(nc > max_val)
then
153 L0rightBound_inLx, nTCells0_inLx)
result(frac_cover_Lx)
160 integer(i4),
dimension(:),
intent(in) :: datain0
163 integer(i4),
intent(in) :: classid
166 logical,
dimension(:, :),
intent(in) :: mask0
169 integer(i4),
dimension(:),
intent(in) :: l0upbound_inlx
172 integer(i4),
dimension(:),
intent(in) :: l0downbound_inlx
175 integer(i4),
dimension(:),
intent(in) :: l0leftbound_inlx
178 integer(i4),
dimension(:),
intent(in) :: l0rightbound_inlx
181 integer(i4),
dimension(:),
intent(in) :: ntcells0_inlx
183 real(dp),
dimension(size(L0upBound_inLx, 1)) :: frac_cover_lx
185 integer(i4) :: kk, iu, id, jl, jr, nt
187 integer(i4) :: nrows0, ncols0
189 integer(i4),
dimension(:, :),
allocatable :: dummy_matrix
191 integer(i4),
dimension(:, :),
allocatable :: nodata_val
193 integer(i4) :: ncells1
197 ncells1 =
size(l0upbound_inlx, 1)
200 nrows0 =
size(mask0, 1)
201 ncols0 =
size(mask0, 2)
204 allocate(dummy_matrix(nrows0, ncols0))
205 allocate(nodata_val(nrows0, ncols0))
207 dummy_matrix(:, :) = unpack(datain0(:), mask0(:, :), nodata_val(:, :))
210 frac_cover_lx(:) = 0.0_dp
214 iu = l0upbound_inlx(kk)
215 id = l0downbound_inlx(kk)
216 jl = l0leftbound_inlx(kk)
217 jr = l0rightbound_inlx(kk)
218 nt = ntcells0_inlx(kk)
220 frac_cover_lx(kk) = real(count(dummy_matrix(iu : id, jl : jr) == classid), dp) / real(nt, dp)
225 deallocate(dummy_matrix, nodata_val)
267 L1_right_colonId_cell, L0_cellId, mask0, nodata_value, L0_fineScale_data)
271 integer(i4),
dimension(:),
intent(in) :: nl0_cells_in_l1_cell
274 integer(i4),
dimension(:),
intent(in) :: l1_upper_rowid_cell
277 integer(i4),
dimension(:),
intent(in) :: l1_lower_rowid_cell
280 integer(i4),
dimension(:),
intent(in) :: l1_left_colonid_cell
283 integer(i4),
dimension(:),
intent(in) :: l1_right_colonid_cell
286 integer(i4),
dimension(:),
intent(in) :: l0_cellid
289 logical,
dimension(:, :),
intent(in) :: mask0
292 real(dp),
intent(in) :: nodata_value
295 real(dp),
dimension(:),
intent(in) :: l0_finescale_data
299 integer(i4) :: l1_ncells
301 integer(i4) :: iu, id, jl, jr
305 integer(i4),
dimension(size(mask0, 1), size(mask0, 2)) :: nodata_2d
307 integer(i4),
dimension(size(mask0, 1), size(mask0, 2)) :: l0_cellid_2d
309 real(dp),
dimension(size(mask0, 1), size(mask0, 2)) :: l0_finescale_2d_data
314 nodata_2d = int(nodata_value, i4)
315 l0_cellid_2d = unpack(l0_cellid, mask0, nodata_2d)
316 l0_finescale_2d_data = unpack(l0_finescale_data, mask0, nodata_value)
321 iu = l1_upper_rowid_cell(kk)
322 id = l1_lower_rowid_cell(kk)
323 jl = l1_left_colonid_cell(kk)
324 jr = l1_right_colonid_cell(kk)
326 int(nodata_value, i4)) / real(nl0_cells_in_l1_cell(kk), dp)
369 function upscale_harmonic_mean(nL0_cells_in_L1_cell, L1_upper_rowId_cell, L1_lower_rowId_cell, L1_left_colonId_cell, &
370 L1_right_colonId_cell, L0_cellId, mask0, nodata_value, L0_fineScale_data)
374 integer(i4),
dimension(:),
intent(in) :: nl0_cells_in_l1_cell
377 integer(i4),
dimension(:),
intent(in) :: l1_upper_rowid_cell
380 integer(i4),
dimension(:),
intent(in) :: l1_lower_rowid_cell
383 integer(i4),
dimension(:),
intent(in) :: l1_left_colonid_cell
386 integer(i4),
dimension(:),
intent(in) :: l1_right_colonid_cell
389 integer(i4),
dimension(:),
intent(in) :: l0_cellid
392 logical,
dimension(:, :),
intent(in) :: mask0
395 real(dp),
intent(in) :: nodata_value
398 real(dp),
dimension(:),
intent(in) :: l0_finescale_data
402 integer(i4) :: l1_ncells
404 integer(i4) :: iu, id, jl, jr
408 integer(i4),
dimension(size(mask0, 1), size(mask0, 2)) :: nodata_2d
410 integer(i4),
dimension(size(mask0, 1), size(mask0, 2)) :: l0_cellid_2d
412 real(dp),
dimension(size(mask0, 1), size(mask0, 2)) :: l0_finescale_2d_data
417 nodata_2d = int(nodata_value, i4)
418 l0_cellid_2d = unpack(l0_cellid, mask0, nodata_2d)
419 l0_finescale_2d_data = unpack(l0_finescale_data, mask0, nodata_value)
424 iu = l1_upper_rowid_cell(kk)
425 id = l1_lower_rowid_cell(kk)
426 jl = l1_left_colonid_cell(kk)
427 jr = l1_right_colonid_cell(kk)
429 / sum(1.0_dp / l0_finescale_2d_data(iu : id, jl : jr), l0_cellid_2d(iu : id, jl : jr) /= int(nodata_value, i4))
470 mask0, nodata_value, L0_fineScale_data)
472 use mo_utils,
only : ne
477 integer(i4),
dimension(:),
intent(in) :: l1_upper_rowid_cell
480 integer(i4),
dimension(:),
intent(in) :: l1_lower_rowid_cell
483 integer(i4),
dimension(:),
intent(in) :: l1_left_colonid_cell
486 integer(i4),
dimension(:),
intent(in) :: l1_right_colonid_cell
489 logical,
dimension(:, :),
intent(in) :: mask0
492 real(dp),
intent(in) :: nodata_value
495 real(dp),
dimension(:),
intent(in) :: l0_finescale_data
499 integer(i4) :: iu, id, jl, jr
503 integer(i4) :: ncells_l0_in_l1
505 real(dp),
dimension(size(mask0, 1), size(mask0, 2)) :: l0_finescale_2d_data
507 real(dp),
dimension(size(mask0, 1), size(mask0, 2)) :: nodata_2d
509 real(dp),
dimension(:),
allocatable :: dummy_v
514 nodata_2d = nodata_value
515 l0_finescale_2d_data = unpack(l0_finescale_data, mask0, nodata_2d)
518 iu = l1_upper_rowid_cell(kk)
519 id = l1_lower_rowid_cell(kk)
520 jl = l1_left_colonid_cell(kk)
521 jr = l1_right_colonid_cell(kk)
522 ncells_l0_in_l1 = count(ne(l0_finescale_2d_data(iu : id, jl : jr), nodata_value))
523 allocate(dummy_v(ncells_l0_in_l1))
524 dummy_v(:) = pack(l0_finescale_2d_data(iu : id, jl : jr), mask = (ne(l0_finescale_2d_data(iu : id, jl : jr), nodata_value)))
576 function upscale_p_norm(nL0_cells_in_L1_cell, L1_upper_rowId_cell, L1_lower_rowId_cell, L1_left_colonId_cell, &
577 L1_right_colonId_cell, L0_cellId, mask0, nodata_value, p_norm, L0_fineScale_data)
579 use mo_utils,
only : ne
584 integer(i4),
dimension(:),
intent(in) :: nl0_cells_in_l1_cell
587 integer(i4),
dimension(:),
intent(in) :: l1_upper_rowid_cell
590 integer(i4),
dimension(:),
intent(in) :: l1_lower_rowid_cell
593 integer(i4),
dimension(:),
intent(in) :: l1_left_colonid_cell
596 integer(i4),
dimension(:),
intent(in) :: l1_right_colonid_cell
599 integer(i4),
dimension(:),
intent(in) :: l0_cellid
602 logical,
dimension(:, :),
intent(in) :: mask0
605 real(dp),
intent(in) :: nodata_value
608 real(dp),
intent(in) :: p_norm
611 real(dp),
dimension(:),
intent(in) :: l0_finescale_data
613 real(dp),
dimension(size(nL0_cells_in_L1_cell, 1)) ::
upscale_p_norm
615 integer(i4) :: l1_ncells
617 integer(i4) :: iu, id, jl, jr
621 integer(i4),
dimension(size(mask0, 1), size(mask0, 2)) :: nodata_2d
623 integer(i4),
dimension(size(mask0, 1), size(mask0, 2)) :: l0_cellid_2d
625 real(dp),
dimension(size(mask0, 1), size(mask0, 2)) :: l0_finescale_2d_data
630 nodata_2d = int(nodata_value, i4)
631 l0_cellid_2d = unpack(l0_cellid, mask0, nodata_2d)
632 l0_finescale_2d_data = unpack(l0_finescale_data, mask0, nodata_value)
636 if (ne(p_norm, 0.0_dp))
then
639 iu = l1_upper_rowid_cell(kk)
640 id = l1_lower_rowid_cell(kk)
641 jl = l1_left_colonid_cell(kk)
642 jr = l1_right_colonid_cell(kk)
643 upscale_p_norm(kk) = product(l0_finescale_2d_data(iu : id, jl : jr) ** p_norm, l0_cellid_2d(iu : id, jl : jr) /= &
644 int(nodata_value, i4)) ** (1.0_dp / real(nl0_cells_in_l1_cell(kk), dp))
649 iu = l1_upper_rowid_cell(kk)
650 id = l1_lower_rowid_cell(kk)
651 jl = l1_left_colonid_cell(kk)
652 jr = l1_right_colonid_cell(kk)
653 upscale_p_norm(kk) = sum(l0_finescale_2d_data(iu : id, jl : jr) ** p_norm, l0_cellid_2d(iu : id, jl : jr) /= &
654 int(nodata_value, i4)) / real(nl0_cells_in_l1_cell(kk), dp) ** (1.0_dp / p_norm)
Provides constants commonly used by mHM, mRM and MPR.
integer(i4), parameter, public nodata_i4
Module containing upscaling operators.
integer(i4) function, dimension(size(l1_upper_rowid_cell, 1)), public majority_statistics(nclass, l1_upper_rowid_cell, l1_lower_rowid_cell, l1_left_colonid_cell, l1_right_colonid_cell, l0_finescale_2d_data)
majority statistics
real(dp) function, dimension(size(nl0_cells_in_l1_cell, 1)) upscale_p_norm(nl0_cells_in_l1_cell, l1_upper_rowid_cell, l1_lower_rowid_cell, l1_left_colonid_cell, l1_right_colonid_cell, l0_cellid, mask0, nodata_value, p_norm, l0_finescale_data)
aritmetic mean
real(dp) function, dimension(size(nl0_cells_in_l1_cell, 1)), public upscale_arithmetic_mean(nl0_cells_in_l1_cell, l1_upper_rowid_cell, l1_lower_rowid_cell, l1_left_colonid_cell, l1_right_colonid_cell, l0_cellid, mask0, nodata_value, l0_finescale_data)
aritmetic mean
real(dp) function, dimension(size(nl0_cells_in_l1_cell, 1)), public upscale_harmonic_mean(nl0_cells_in_l1_cell, l1_upper_rowid_cell, l1_lower_rowid_cell, l1_left_colonid_cell, l1_right_colonid_cell, l0_cellid, mask0, nodata_value, l0_finescale_data)
harmonic mean
real(dp) function, dimension(size(l1_upper_rowid_cell, 1)), public upscale_geometric_mean(l1_upper_rowid_cell, l1_lower_rowid_cell, l1_left_colonid_cell, l1_right_colonid_cell, mask0, nodata_value, l0_finescale_data)
geometric mean
real(dp) function, dimension(size(l0upbound_inlx, 1)), public l0_fractionalcover_in_lx(datain0, classid, mask0, l0upbound_inlx, l0downbound_inlx, l0leftbound_inlx, l0rightbound_inlx, ntcells0_inlx)
fractional coverage of a given class of L0 fields in Lx field (Lx = L1 or L11)