65 MODULE PROCEDURE median_sp, median_dp
110 MODULE PROCEDURE n_element_dp, n_element_sp
175 MODULE PROCEDURE percentile_0d_sp, percentile_0d_dp, percentile_1d_sp, percentile_1d_dp
210 MODULE PROCEDURE qmedian_sp, qmedian_dp
223 FUNCTION median_dp(arrin, mask)
227 REAL(dp),
DIMENSION(:),
INTENT(IN) :: arrin
228 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
229 REAL(dp) :: median_dp
232 REAL(dp),
DIMENSION(:),
ALLOCATABLE :: arr
235 if (
present(mask))
then
238 arr = pack(arrin, mask)
240 if (n < 2) stop
'median_dp: n < 2'
242 if (mod(n, 2) == 0)
then
243 median_dp =
n_element(arr, n / 2 + 1, previous = tmp)
244 median_dp = 0.5_dp * (median_dp + tmp)
252 if (n < 2) stop
'median_dp: n < 2'
254 if (mod(n, 2) == 0)
then
255 median_dp =
n_element(arrin, n / 2 + 1, previous = tmp)
256 median_dp = 0.5_dp * (median_dp + tmp)
258 median_dp =
n_element(arrin, (n + 1) / 2)
262 END FUNCTION median_dp
265 FUNCTION median_sp(arrin, mask)
269 REAL(sp),
DIMENSION(:),
INTENT(IN) :: arrin
270 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
271 REAL(sp) :: median_sp
274 REAL(sp),
DIMENSION(:),
ALLOCATABLE :: arr
277 if (
present(mask))
then
280 arr = pack(arrin, mask)
282 if (n < 2) stop
'median_sp: n < 2'
284 if (mod(n, 2) == 0)
then
285 median_sp =
n_element(arr, n / 2 + 1, previous = tmp)
286 median_sp = 0.5_sp * (median_sp + tmp)
294 if (n < 2) stop
'median_sp: n < 2'
296 if (mod(n, 2) == 0)
then
297 median_sp =
n_element(arrin, n / 2 + 1, previous = tmp)
298 median_sp = 0.5_sp * (median_sp + tmp)
300 median_sp =
n_element(arrin, (n + 1) / 2)
304 END FUNCTION median_sp
308 function n_element_dp(idat, n, mask, before, after, previous, next)
312 real(dp),
dimension(:),
intent(in) :: idat
313 integer(i4),
intent(in) :: n
314 logical,
dimension(:),
optional,
intent(in) :: mask
315 real(dp),
optional,
intent(out) :: before
316 real(dp),
optional,
intent(out) :: after
317 real(dp),
optional,
intent(out) :: previous
318 real(dp),
optional,
intent(out) :: next
319 real(dp) :: n_element_dp
321 real(dp),
dimension(:),
allocatable :: dat
324 integer(i4) :: l, r, i, j
326 if (
present(mask))
then
329 dat = pack(idat, mask)
336 if (n < 1) stop
'n_element_dp: n < 1'
337 if (n > nn) stop
'n_element_dp: n > size(pack(dat,mask))'
345 n_element_dp = dat(k)
349 do while(dat(i) < n_element_dp)
352 do while(n_element_dp < dat(j))
372 n_element_dp = dat(k)
374 if (
present(before)) before = maxval(dat(: k - 1))
375 if (
present(previous)) previous = maxval(dat(: k - 1))
376 if (
present(after)) after = minval(dat(k + 1 :))
377 if (
present(next)) next = minval(dat(k + 1 :))
381 end function n_element_dp
383 function n_element_sp(idat, n, mask, before, after, previous, next)
387 real(sp),
dimension(:),
intent(in) :: idat
388 integer(i4),
intent(in) :: n
389 logical,
dimension(:),
optional,
intent(in) :: mask
390 real(sp),
optional,
intent(out) :: before
391 real(sp),
optional,
intent(out) :: after
392 real(sp),
optional,
intent(out) :: previous
393 real(sp),
optional,
intent(out) :: next
394 real(sp) :: n_element_sp
396 real(sp),
dimension(:),
allocatable :: dat
399 integer(i4) :: l, r, i, j
401 if (
present(mask))
then
404 dat = pack(idat, mask)
411 if (n < 1) stop
'n_element_sp: n < 1'
412 if (n > nn) stop
'n_element_sp: n > size(pack(dat,mask))'
420 n_element_sp = dat(k)
424 do while(dat(i) < n_element_sp)
427 do while(n_element_sp < dat(j))
447 n_element_sp = dat(k)
449 if (
present(before)) before = maxval(dat(: k - 1))
450 if (
present(previous)) previous = maxval(dat(: k - 1))
451 if (
present(after)) after = minval(dat(k + 1 :))
452 if (
present(next)) next = minval(dat(k + 1 :))
456 end function n_element_sp
460 FUNCTION percentile_0d_dp(arrin, k, mask, mode_in)
464 REAL(dp),
DIMENSION(:),
INTENT(IN) :: arrin
465 REAL(dp),
INTENT(IN) :: k
466 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
467 INTEGER(i4),
OPTIONAL,
INTENT(IN) :: mode_in
468 REAL(dp) :: percentile_0d_dp
470 INTEGER(i4) :: n, nn1, nn2
472 REAL(dp) :: kk, ks1, ks2
473 REAL(dp),
DIMENSION(:),
ALLOCATABLE :: arr
475 if (
present(mask))
then
481 if (
present(mode_in))
then
488 if (n < 2) stop
'percentile_0d_dp: n < 2'
493 kk = k / 100._dp * real(n, dp)
494 nn1 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
499 kk = k / 100._dp * real(n, dp)
500 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
501 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
505 kk = 0.5_dp + k / 100._dp * real(n, dp)
506 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
511 kk = 0.5_dp + k / 100._dp * (real(n, dp))
512 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
513 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
517 kk = k / 100._dp * (real(n, dp) + 1._dp)
518 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
519 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
523 kk = 1.0_dp + k / 100._dp * (real(n, dp) - 1._dp)
524 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
525 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
529 kk = 1.0_dp / 3.0_dp + k / 100._dp * (real(n, dp) + 1.0_dp / 3.0_dp)
530 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
531 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
535 kk = 3.0_dp / 8.0_dp + k / 100._dp * (real(n, dp) + 1.0_dp / 4.0_dp)
536 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
537 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
541 stop
'percentile_0d_dp: mode > 8 not implemented'
545 if (
present(mask))
then
547 arr = pack(arrin, mask)
548 if (nn1 .eq. nn2)
then
553 ks2 =
n_element(arr, nn2, previous = ks1)
554 percentile_0d_dp = ks1 + (ks2 - ks1) * (kk - real(nn1, dp))
558 if (nn1 .eq. nn2)
then
563 ks2 =
n_element(arrin, nn2, previous = ks1)
564 percentile_0d_dp = ks1 + (ks2 - ks1) * (kk - real(nn1, dp))
568 END FUNCTION percentile_0d_dp
571 FUNCTION percentile_0d_sp(arrin, k, mask, mode_in)
575 REAL(sp),
DIMENSION(:),
INTENT(IN) :: arrin
576 REAL(sp),
INTENT(IN) :: k
577 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
578 INTEGER(i4),
OPTIONAL,
INTENT(IN) :: mode_in
579 REAL(sp) :: percentile_0d_sp
581 INTEGER(i4) :: n, nn1, nn2
583 REAL(sp) :: kk, ks1, ks2
584 REAL(sp),
DIMENSION(:),
ALLOCATABLE :: arr
586 if (
present(mask))
then
592 if (
present(mode_in))
then
599 if (n < 2) stop
'percentile_0d_sp: n < 2'
604 kk = k / 100._sp * real(n, sp)
605 nn1 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
610 kk = k / 100._sp * real(n, sp)
611 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
612 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
616 kk = 0.5_sp + k / 100._sp * real(n, sp)
617 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
622 kk = 0.5_sp + k / 100._sp * (real(n, sp))
623 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
624 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
628 kk = k / 100._sp * (real(n, sp) + 1._sp)
629 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
630 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
634 kk = 1.0_sp + k / 100._sp * (real(n, sp) - 1._sp)
635 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
636 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
640 kk = 1.0_sp / 3.0_sp + k / 100._sp * (real(n, sp) + 1.0_sp / 3.0_sp)
641 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
642 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
646 kk = 3.0_sp / 8.0_sp + k / 100._sp * (real(n, sp) + 1.0_sp / 4.0_sp)
647 nn1 = min(n, max(1_i4, floor(kk, kind =
i4)))
648 nn2 = min(n, max(1_i4, ceiling(kk, kind =
i4)))
652 stop
'percentile_0d_sp: mode > 8 not implemented'
656 if (
present(mask))
then
658 arr = pack(arrin, mask)
659 if (nn1 .eq. nn2)
then
664 ks2 =
n_element(arr, nn2, previous = ks1)
665 percentile_0d_sp = ks1 + (ks2 - ks1) * (kk - real(nn1, sp))
669 if (nn1 .eq. nn2)
then
674 ks2 =
n_element(arrin, nn2, previous = ks1)
675 percentile_0d_sp = ks1 + (ks2 - ks1) * (kk - real(nn1, sp))
679 END FUNCTION percentile_0d_sp
682 function percentile_1d_dp(arrin, k, mask, mode_in)
686 REAL(dp),
DIMENSION(:),
INTENT(IN) :: arrin
687 REAL(dp),
DIMENSION(:),
INTENT(IN) :: k
688 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
689 INTEGER(i4),
OPTIONAL,
INTENT(IN) :: mode_in
691 REAL(dp),
DIMENSION(size(k)) :: percentile_1d_dp
695 INTEGER(i4),
DIMENSION(size(k)) :: nn1, nn2
696 REAL(dp),
DIMENSION(size(k)) :: kk
698 REAL(dp),
DIMENSION(:),
ALLOCATABLE :: arr
700 if (
present(mask))
then
706 if (
present(mode_in))
then
715 if (n < 2) stop
'percentile_1d_dp: n < 2'
720 kk(:) = k(:) / 100._dp * real(n, dp)
721 nn1(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
726 kk(:) = k(:) / 100._dp * real(n, dp)
727 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
728 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
732 kk(:) = 0.5_dp + k(:) / 100._dp * real(n, dp)
733 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
738 kk(:) = 0.5_dp + k(:) / 100._dp * (real(n, dp))
739 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
740 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
744 kk(:) = k(:) / 100._dp * (real(n, dp) + 1._dp)
745 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
746 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
750 kk(:) = 1.0_dp + k(:) / 100._dp * (real(n, dp) - 1._dp)
751 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
752 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
756 kk(:) = 1.0_dp / 3.0_dp + k(:) / 100._dp * (real(n, dp) + 1.0_dp / 3.0_dp)
757 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
758 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
762 kk(:) = 3.0_dp / 8.0_dp + k(:) / 100._dp * (real(n, dp) + 1.0_dp / 4.0_dp)
763 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
764 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
768 stop
'percentile_1d_dp: mode > 8 not implemented'
772 if (
present(mask))
then
774 arr = pack(arrin, mask)
776 if (nn1(i) .eq. nn2(i))
then
778 percentile_1d_dp(i) =
n_element(arr, nn1(i))
781 ks2 =
n_element(arr, nn2(i), previous = ks1)
782 percentile_1d_dp(i) = ks1 + (ks2 - ks1) * (kk(i) - real(nn1(i), dp))
788 if (nn1(i) .eq. nn2(i))
then
790 percentile_1d_dp(i) =
n_element(arrin, nn1(i))
793 ks2 =
n_element(arrin, nn2(i), previous = ks1)
794 percentile_1d_dp(i) = ks1 + (ks2 - ks1) * (kk(i) - real(nn1(i), dp))
799 END function percentile_1d_dp
802 function percentile_1d_sp(arrin, k, mask, mode_in)
806 REAL(sp),
DIMENSION(:),
INTENT(IN) :: arrin
807 REAL(sp),
DIMENSION(:),
INTENT(IN) :: k
808 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
809 INTEGER(i4),
OPTIONAL,
INTENT(IN) :: mode_in
811 REAL(sp),
DIMENSION(size(k)) :: percentile_1d_sp
815 INTEGER(i4),
DIMENSION(size(k)) :: nn1, nn2
816 REAL(sp),
DIMENSION(size(k)) :: kk
818 REAL(sp),
DIMENSION(:),
ALLOCATABLE :: arr
820 if (
present(mask))
then
826 if (
present(mode_in))
then
835 if (n < 2) stop
'percentile_1d_sp: n < 2'
840 kk(:) = k(:) / 100._sp * real(n, sp)
841 nn1(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
846 kk(:) = k(:) / 100._sp * real(n, sp)
847 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
848 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
852 kk(:) = 0.5_sp + k(:) / 100._sp * real(n, sp)
853 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
858 kk(:) = 0.5_sp + k(:) / 100._sp * (real(n, sp))
859 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
860 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
864 kk(:) = k(:) / 100._sp * (real(n, sp) + 1._sp)
865 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
866 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
870 kk(:) = 1.0_sp + k(:) / 100._sp * (real(n, sp) - 1._sp)
871 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
872 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
876 kk(:) = 1.0_sp / 3.0_sp + k(:) / 100._sp * (real(n, sp) + 1.0_sp / 3.0_sp)
877 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
878 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
882 kk(:) = 3.0_sp / 8.0_sp + k(:) / 100._sp * (real(n, sp) + 1.0_sp / 4.0_sp)
883 nn1(:) = min(n, max(1_i4, floor(kk(:), kind =
i4)))
884 nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind =
i4)))
888 stop
'percentile_1d_sp: mode > 8 not implemented'
892 if (
present(mask))
then
894 arr = pack(arrin, mask)
896 if (nn1(i) .eq. nn2(i))
then
898 percentile_1d_sp(i) =
n_element(arr, nn1(i))
901 ks2 =
n_element(arr, nn2(i), previous = ks1)
902 percentile_1d_sp(i) = ks1 + (ks2 - ks1) * (kk(i) - real(nn1(i), sp))
908 if (nn1(i) .eq. nn2(i))
then
910 percentile_1d_sp(i) =
n_element(arrin, nn1(i))
913 ks2 =
n_element(arrin, nn2(i), previous = ks1)
914 percentile_1d_sp(i) = ks1 + (ks2 - ks1) * (kk(i) - real(nn1(i), sp))
919 END function percentile_1d_sp
923 function qmedian_dp(dat)
927 real(dp),
dimension(:),
intent(inout) :: dat
928 real(dp) :: qmedian_dp
932 integer(i4) :: l, r, i, j
943 do while(dat(i) < qmedian_dp)
946 do while(qmedian_dp < dat(j))
961 if (mod(n, 2) == 0)
then
962 qmedian_dp = 0.5_dp * (dat(k) + maxval(dat(: k - 1)))
967 end function qmedian_dp
970 function qmedian_sp(dat)
974 real(sp),
dimension(:),
intent(inout) :: dat
975 real(sp) :: qmedian_sp
979 integer(i4) :: l, r, i, j
990 do while(dat(i) < qmedian_sp)
993 do while(qmedian_sp < dat(j))
1008 if (mod(n, 2) == 0)
then
1009 qmedian_sp = 0.5_sp * (dat(k) + maxval(dat(: k - 1)))
1014 end function qmedian_sp
Nth smallest value in array.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter i4
4 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.