80 MODULE PROCEDURE absdev_sp, absdev_dp
120 MODULE PROCEDURE average_sp, average_dp
163 MODULE PROCEDURE central_moment_sp, central_moment_dp
201 MODULE PROCEDURE central_moment_var_sp, central_moment_var_dp
241 MODULE PROCEDURE correlation_sp, correlation_dp
281 MODULE PROCEDURE covariance_sp, covariance_dp
319 MODULE PROCEDURE kurtosis_sp, kurtosis_dp
355 MODULE PROCEDURE mean_sp, mean_dp
402 MODULE PROCEDURE mixed_central_moment_sp, mixed_central_moment_dp
445 MODULE PROCEDURE mixed_central_moment_var_sp, mixed_central_moment_var_dp
495 MODULE PROCEDURE moment_sp, moment_dp
529 MODULE PROCEDURE skewness_sp, skewness_dp
568 MODULE PROCEDURE stddev_sp, stddev_dp
605 MODULE PROCEDURE variance_sp, variance_dp
618 FUNCTION absdev_dp(dat, mask)
622 REAL(dp),
DIMENSION(:),
INTENT(IN) :: dat
623 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
624 REAL(dp) :: absdev_dp
629 LOGICAL,
DIMENSION(size(dat)) :: maske
631 if (
present(mask))
then
632 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error absdev_dp: size(mask) size(dat)'
634 n = real(count(maske), dp)
637 n = real(
size(dat), dp)
639 if (n .le. (1.0_dp + tiny(1.0_dp))) stop
'absdev_dp: n must be at least 2'
642 ave = sum(dat(:), mask = maske) / n
644 absdev_dp = sum(abs(dat(:) - ave), mask = maske) / n
646 END FUNCTION absdev_dp
649 FUNCTION absdev_sp(dat, mask)
653 REAL(sp),
DIMENSION(:),
INTENT(IN) :: dat
654 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
655 REAL(sp) :: absdev_sp
660 LOGICAL,
DIMENSION(size(dat)) :: maske
662 if (
present(mask))
then
663 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error absdev_sp: size(mask) size(dat)'
665 n = real(count(maske), sp)
668 n = real(
size(dat), sp)
670 if (n .le. (1.0_sp + tiny(1.0_sp))) stop
'absdev_sp: n must be at least 2'
673 ave = sum(dat(:), mask = maske) / n
675 absdev_sp = sum(abs(dat(:) - ave), mask = maske) / n
677 END FUNCTION absdev_sp
681 FUNCTION average_dp(dat, mask)
685 REAL(dp),
DIMENSION(:),
INTENT(IN) :: dat
686 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
687 REAL(dp) :: average_dp
690 LOGICAL,
DIMENSION(size(dat)) :: maske
692 if (
present(mask))
then
693 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error average_dp: size(mask) size(dat)'
695 n = real(count(maske), dp)
698 n = real(
size(dat), dp)
702 average_dp = sum(dat(:), mask = maske) / n
704 END FUNCTION average_dp
707 FUNCTION average_sp(dat, mask)
711 REAL(sp),
DIMENSION(:),
INTENT(IN) :: dat
712 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
713 REAL(sp) :: average_sp
716 LOGICAL,
DIMENSION(size(dat)) :: maske
718 if (
present(mask))
then
719 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error average_sp: size(mask) size(dat)'
721 n = real(count(maske), sp)
724 n = real(
size(dat), sp)
728 average_sp = sum(dat(:), mask = maske) / n
730 END FUNCTION average_sp
734 FUNCTION central_moment_dp(x, r, mask)
738 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x
739 INTEGER(i4),
INTENT(IN) :: r
740 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
741 REAL(dp) :: central_moment_dp
744 LOGICAL,
DIMENSION(size(x)) :: maske
747 central_moment_dp = 0.0_dp
751 central_moment_dp = 1.0_dp
755 if (
present(mask))
then
756 if (
size(mask) .ne.
size(x)) stop .ne.
'Error central_moment_dp: size(mask) size(x)'
758 n = real(count(maske), dp)
761 n = real(
size(x), dp)
763 if (n .le. (2.0_dp + tiny(2.0_dp))) stop
'central_moment_dp: n must be at least 3'
766 mx = sum(x, mask = maske) / n
768 central_moment_dp = sum((x - mx)**r, mask = maske) / n
770 END FUNCTION central_moment_dp
773 FUNCTION central_moment_sp(x, r, mask)
777 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x
778 INTEGER(i4),
INTENT(IN) :: r
779 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
780 REAL(sp) :: central_moment_sp
783 LOGICAL,
DIMENSION(size(x)) :: maske
786 central_moment_sp = 0.0_sp
790 central_moment_sp = 1.0_sp
794 if (
present(mask))
then
795 if (
size(mask) .ne.
size(x)) stop .ne.
'Error central_moment_sp: size(mask) size(x)'
797 n = real(count(maske), sp)
800 n = real(
size(x), sp)
802 if (n .le. (2.0_sp + tiny(2.0_sp))) stop
'central_moment_sp: n must be at least 3'
805 mx = sum(x, mask = maske) / n
807 central_moment_sp = sum((x - mx)**r, mask = maske) / n
809 END FUNCTION central_moment_sp
813 FUNCTION central_moment_var_dp(x, r, mask)
817 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x
818 INTEGER(i4),
INTENT(IN) :: r
819 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
820 REAL(dp) :: central_moment_var_dp
822 REAL(dp) :: n, rr, u2r, ur, urm1, urp1, u2
823 LOGICAL,
DIMENSION(size(x)) :: maske
826 central_moment_var_dp = 0.0_dp
830 if (
present(mask))
then
831 if (
size(mask) .ne.
size(x)) stop .ne.
'Error central_moment_var_dp: size(mask) size(x)'
833 n = real(count(maske), dp)
836 n = real(
size(x), dp)
838 if (n .le. (2.0_dp + tiny(2.0_dp))) stop
'central_moment_var_dp: n must be at least 3'
846 central_moment_var_dp = (u2r - ur * ur + rr * rr * urm1 * urm1 * u2 - 2.0_dp * rr * urp1 * urm1) / n
848 END FUNCTION central_moment_var_dp
851 FUNCTION central_moment_var_sp(x, r, mask)
855 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x
856 INTEGER(i4),
INTENT(IN) :: r
857 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
858 REAL(sp) :: central_moment_var_sp
860 REAL(sp) :: n, rr, u2r, ur, urm1, urp1, u2
861 LOGICAL,
DIMENSION(size(x)) :: maske
864 central_moment_var_sp = 0.0_sp
868 if (
present(mask))
then
869 if (
size(mask) .ne.
size(x)) stop .ne.
'Error central_moment_var_sp: size(mask) size(x)'
871 n = real(count(maske), sp)
874 n = real(
size(x), sp)
876 if (n .le. (2.0_sp + tiny(2.0_sp))) stop
'central_moment_var_sp: n must be at least 3'
884 central_moment_var_sp = (u2r - ur * ur + rr * rr * urm1 * urm1 * u2 - 2.0_sp * rr * urp1 * urm1) / n
886 END FUNCTION central_moment_var_sp
890 FUNCTION correlation_dp(x, y, mask)
894 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x
895 REAL(dp),
DIMENSION(:),
INTENT(IN) :: y
896 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
897 REAL(dp) :: correlation_dp
901 REAL(dp) :: sx, sy, covar
902 LOGICAL,
DIMENSION(size(x)) :: maske
904 if (
size(x) .ne.
size(y)) stop .ne.
'Error correlation_dp: size(x) size(y)'
905 if (
present(mask))
then
906 if (
size(mask) .ne.
size(x)) stop .ne.
'Error correlation_dp: size(mask) size(x)'
908 n = real(count(maske), dp)
911 n = real(
size(x), dp)
913 if (n .le. (1.0_dp + tiny(1.0_dp))) stop
'correlation_dp: n must be at least 2'
918 covar = sum((x - mx) * (y - my), mask = maske) / n
920 correlation_dp = covar / (sx * sy)
922 END FUNCTION correlation_dp
925 FUNCTION correlation_sp(x, y, mask)
929 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x
930 REAL(sp),
DIMENSION(:),
INTENT(IN) :: y
931 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
932 REAL(sp) :: correlation_sp
936 REAL(sp) :: sx, sy, covar
937 LOGICAL,
DIMENSION(size(x)) :: maske
939 if (
size(x) .ne.
size(y)) stop .ne.
'Error correlation_sp: size(x) size(y)'
940 if (
present(mask))
then
941 if (
size(mask) .ne.
size(x)) stop .ne.
'Error correlation_sp: size(mask) size(x)'
943 n = real(count(maske), sp)
946 n = real(
size(x), sp)
948 if (n .le. (1.0_sp + tiny(1.0_sp))) stop
'correlation_sp: n must be at least 2'
953 covar = sum((x - mx) * (y - my), mask = maske) / n
955 correlation_sp = covar / (sx * sy)
957 END FUNCTION correlation_sp
961 FUNCTION covariance_dp(x, y, mask)
965 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x
966 REAL(dp),
DIMENSION(:),
INTENT(IN) :: y
967 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
968 REAL(dp) :: covariance_dp
972 LOGICAL,
DIMENSION(size(x)) :: maske
974 if (
size(x) .ne.
size(y)) stop .ne.
'Error covariance_dp: size(x) size(y)'
975 if (
present(mask))
then
976 if (
size(mask) .ne.
size(x)) stop .ne.
'Error covariance_dp: size(mask) size(x)'
978 n = real(count(maske), dp)
981 n = real(
size(x), dp)
983 if (n .le. (1.0_dp + tiny(1.0_dp))) stop
'covariance_dp: n must be at least 2'
986 mx =
mean(x, mask = maske)
987 my =
mean(y, mask = maske)
988 covariance_dp = sum((x - mx) * (y - my), mask = maske) / n
990 END FUNCTION covariance_dp
993 FUNCTION covariance_sp(x, y, mask)
997 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x
998 REAL(sp),
DIMENSION(:),
INTENT(IN) :: y
999 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1000 REAL(sp) :: covariance_sp
1004 LOGICAL,
DIMENSION(size(x)) :: maske
1006 if (
size(x) .ne.
size(y)) stop .ne.
'Error covariance_sp: size(x) size(y)'
1007 if (
present(mask))
then
1008 if (
size(mask) .ne.
size(x)) stop .ne.
'Error covariance_sp: size(mask) size(x)'
1010 n = real(count(maske), sp)
1013 n = real(
size(x), sp)
1015 if (n .le. (1.0_sp + tiny(1.0_sp))) stop
'covariance_sp: n must be at least 2'
1018 mx =
mean(x, mask = maske)
1019 my =
mean(y, mask = maske)
1020 covariance_sp = sum((x - mx) * (y - my), mask = maske) / n
1022 END FUNCTION covariance_sp
1026 FUNCTION kurtosis_dp(dat, mask)
1030 REAL(dp),
DIMENSION(:),
INTENT(IN) :: dat
1031 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1032 REAL(dp) :: kurtosis_dp
1036 REAL(dp) :: ep, ave, var
1037 REAL(dp),
DIMENSION(size(dat)) :: p, s
1038 LOGICAL,
DIMENSION(size(dat)) :: maske
1040 if (
present(mask))
then
1041 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error kurtosis_dp: size(mask) size(dat)'
1043 n = real(count(maske), dp)
1046 n = real(
size(dat), dp)
1048 if (n .le. (1.0_dp + tiny(1.0_dp))) stop
'kurtosis_dp: n must be at least 2'
1051 ave = sum(dat(:), mask = maske) / n
1054 ep = sum(s(:), mask = maske)
1056 var = sum(p(:), mask = maske)
1057 var = (var - ep * ep / n) / (n - 1.0_dp)
1058 if (abs(var) .lt. tiny(0.0_dp)) stop
'kurtosis_dp: no kurtosis when zero variance'
1060 p(:) = p(:) * s(:) * s(:)
1061 kurtosis_dp = sum(p(:), mask = maske)
1062 kurtosis_dp = kurtosis_dp / (n * var * var) - 3.0_dp
1064 END FUNCTION kurtosis_dp
1067 FUNCTION kurtosis_sp(dat, mask)
1071 REAL(sp),
DIMENSION(:),
INTENT(IN) :: dat
1072 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1073 REAL(sp) :: kurtosis_sp
1077 REAL(sp) :: ep, ave, var
1078 REAL(sp),
DIMENSION(size(dat)) :: p, s
1079 LOGICAL,
DIMENSION(size(dat)) :: maske
1081 if (
present(mask))
then
1082 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error kurtosis_sp: size(mask) size(dat)'
1084 n = real(count(maske), sp)
1087 n = real(
size(dat), sp)
1089 if (n .le. (1.0_sp + tiny(1.0_sp))) stop
'kurtosis_sp: n must be at least 2'
1092 ave = sum(dat(:), mask = maske) / n
1095 ep = sum(s(:), mask = maske)
1097 var = sum(p(:), mask = maske)
1098 var = (var - ep * ep / n) / (n - 1.0_sp)
1099 if (abs(var) .lt. tiny(0.0_sp)) stop
'kurtosis_sp: no kurtosis when zero variance'
1101 p(:) = p(:) * s(:) * s(:)
1102 kurtosis_sp = sum(p(:), mask = maske)
1103 kurtosis_sp = kurtosis_sp / (n * var * var) - 3.0_sp
1105 END FUNCTION kurtosis_sp
1109 FUNCTION mean_dp(dat, mask)
1113 REAL(dp),
DIMENSION(:),
INTENT(IN) :: dat
1114 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1119 LOGICAL,
DIMENSION(size(dat)) :: maske
1121 if (
present(mask))
then
1122 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error mean_dp: size(mask) size(dat)'
1124 n = real(count(maske), dp)
1127 n = real(
size(dat), dp)
1131 mean_dp = sum(dat(:), mask = maske) / n
1133 END FUNCTION mean_dp
1140 REAL(
sp),
DIMENSION(:),
INTENT(IN) :: dat
1141 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1146 LOGICAL,
DIMENSION(size(dat)) :: maske
1148 if (
present(mask))
then
1149 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error mean_sp: size(mask) size(dat)'
1151 n = real(count(maske),
sp)
1154 n = real(
size(dat),
sp)
1158 mean_sp = sum(dat(:), mask = maske) / n
1164 FUNCTION mixed_central_moment_dp(x, y, r, s, mask)
1168 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: x
1169 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: y
1170 INTEGER(i4),
INTENT(IN) :: r
1171 INTEGER(i4),
INTENT(IN) :: s
1172 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1173 REAL(
dp) :: mixed_central_moment_dp
1175 REAL(
dp) :: n, mx, my
1176 REAL(
dp),
DIMENSION(size(x)) :: xx, yy
1177 LOGICAL,
DIMENSION(size(x)) :: maske
1179 if (r.lt.0 .or. s.lt.0)
then
1180 mixed_central_moment_dp = 0.0_dp
1184 if (
size(x) .ne.
size(y)) stop .ne.
'Error mixed_central_moment_dp: size(x) size(y)'
1185 if (
present(mask))
then
1186 if (
size(mask) .ne.
size(x)) stop .ne.
'Error mixed_central_moment_dp: size(mask) size(x)'
1188 n = real(count(maske),
dp)
1191 n = real(
size(x),
dp)
1193 if (n .le. (2.0_dp + tiny(2.0_dp))) stop
'mixed_central_moment_dp: n must be at least 3'
1196 mx = sum(x, mask = maske) / n
1197 my = sum(y, mask = maske) / n
1209 mixed_central_moment_dp = sum(xx * yy, mask = maske) / n
1211 END FUNCTION mixed_central_moment_dp
1214 FUNCTION mixed_central_moment_sp(x, y, r, s, mask)
1218 REAL(
sp),
DIMENSION(:),
INTENT(IN) :: x
1219 REAL(
sp),
DIMENSION(:),
INTENT(IN) :: y
1220 INTEGER(i4),
INTENT(IN) :: r
1221 INTEGER(i4),
INTENT(IN) :: s
1222 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1223 REAL(
sp) :: mixed_central_moment_sp
1225 REAL(
sp) :: n, mx, my
1226 REAL(
sp),
DIMENSION(size(x)) :: xx, yy
1227 LOGICAL,
DIMENSION(size(x)) :: maske
1229 if (r.lt.0 .or. s.lt.0)
then
1230 mixed_central_moment_sp = 0.0_sp
1234 if (
size(x) .ne.
size(y)) stop .ne.
'Error mixed_central_moment_sp: size(x) size(y)'
1235 if (
present(mask))
then
1236 if (
size(mask) .ne.
size(x)) stop .ne.
'Error mixed_central_moment_sp: size(mask) size(x)'
1238 n = real(count(maske),
sp)
1241 n = real(
size(x),
sp)
1243 if (n .le. (2.0_sp + tiny(2.0_sp))) stop
'mixed_central_moment_sp: n must be at least 3'
1246 mx = sum(x, mask = maske) / n
1247 my = sum(y, mask = maske) / n
1259 mixed_central_moment_sp = sum(xx * yy, mask = maske) / n
1261 END FUNCTION mixed_central_moment_sp
1265 FUNCTION mixed_central_moment_var_dp(x, y, r, s, mask)
1269 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: x
1270 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: y
1271 INTEGER(i4),
INTENT(IN) :: r
1272 INTEGER(i4),
INTENT(IN) :: s
1273 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1274 REAL(
dp) :: mixed_central_moment_var_dp
1276 REAL(
dp) :: u2r2s, urs, urm1s, u20, urp1s, ursm1, u02, ursp1, u11
1277 REAL(
dp) :: n, rr, ss
1278 LOGICAL,
DIMENSION(size(x)) :: maske
1280 if (
size(x) .ne.
size(y)) stop .ne.
'Error mixed_central_moment_var_dp: size(x) size(y)'
1281 if (
present(mask))
then
1282 if (
size(mask) .ne.
size(x)) stop .ne.
'Error mixed_central_moment_var_dp: size(mask) size(x)'
1284 n = real(count(maske),
dp)
1287 n = real(
size(x),
dp)
1289 if (n .le. (2.0_dp + tiny(2.0_dp))) stop
'mixed_central_moment_var_dp: n must be at least 3'
1303 mixed_central_moment_var_dp = (u2r2s - urs * urs &
1304 + rr * rr**u20 * urm1s * urm1s + ss * ss * u02 * ursm1 * ursm1 &
1305 + 2.0_dp * rr * ss * u11 * urm1s * ursm1 &
1306 - 2.0_dp * rr * urp1s * urm1s - 2.0_dp * ss * ursp1 * ursm1) / n
1308 END FUNCTION mixed_central_moment_var_dp
1311 FUNCTION mixed_central_moment_var_sp(x, y, r, s, mask)
1315 REAL(
sp),
DIMENSION(:),
INTENT(IN) :: x
1316 REAL(
sp),
DIMENSION(:),
INTENT(IN) :: y
1317 INTEGER(i4),
INTENT(IN) :: r
1318 INTEGER(i4),
INTENT(IN) :: s
1319 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1320 REAL(
sp) :: mixed_central_moment_var_sp
1322 REAL(
sp) :: u2r2s, urs, urm1s, u20, urp1s, ursm1, u02, ursp1, u11
1323 REAL(
sp) :: n, rr, ss
1324 LOGICAL,
DIMENSION(size(x)) :: maske
1326 if (
size(x) .ne.
size(y)) stop .ne.
'Error mixed_central_moment_var_sp: size(x) size(y)'
1327 if (
present(mask))
then
1328 if (
size(mask) .ne.
size(x)) stop .ne.
'Error mixed_central_moment_var_sp: size(mask) size(x)'
1330 n = real(count(maske),
sp)
1333 n = real(
size(x),
sp)
1335 if (n .le. (2.0_sp + tiny(2.0_sp))) stop
'mixed_central_moment_var_sp: n must be at least 3'
1349 mixed_central_moment_var_sp = (u2r2s - urs * urs &
1350 + rr * rr**u20 * urm1s * urm1s + ss * ss * u02 * ursm1 * ursm1 &
1351 + 2.0_sp * rr * ss * u11 * urm1s * ursm1 &
1352 - 2.0_sp * rr * urp1s * urm1s - 2.0_sp * ss * ursp1 * ursm1) / n
1354 END FUNCTION mixed_central_moment_var_sp
1358 SUBROUTINE moment_dp(dat, average, variance, skewness, kurtosis, mean, stddev, absdev, mask, sample)
1362 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: dat
1363 REAL(
dp),
OPTIONAL,
INTENT(OUT) ::
average
1367 REAL(
dp),
OPTIONAL,
INTENT(OUT) ::
mean
1368 REAL(
dp),
OPTIONAL,
INTENT(OUT) ::
stddev
1369 REAL(
dp),
OPTIONAL,
INTENT(OUT) ::
absdev
1370 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1371 LOGICAL,
OPTIONAL,
INTENT(IN) :: sample
1373 REAL(
dp) :: n, div_n
1375 REAL(
dp) :: ep, ave, var
1376 REAL(
dp),
DIMENSION(size(dat)) :: p, s
1377 LOGICAL,
DIMENSION(size(dat)) :: maske
1379 if (
present(mask))
then
1380 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error moment_dp: size(mask) size(dat)'
1382 n = real(count(maske),
sp)
1385 n = real(
size(dat),
sp)
1387 if (n .le. (1.0_sp + tiny(1.0_sp))) stop
'moment_dp: n must be at least 2'
1391 if (
present(sample))
then
1392 if (.not. sample) div_n = n
1399 ave = sum(dat(:), mask = maske) / n
1406 if (
present(
absdev))
absdev = sum(abs(s(:)), mask = maske) / n
1410 ep = sum(s(:), mask = maske)
1412 var = sum(p(:), mask = maske)
1413 var = (var - ep * ep / n) / div_n
1419 if (abs(var) .lt. tiny(0.0_dp)) stop
'moment_dp: no skewness or kurtosis when zero variance'
1432 END SUBROUTINE moment_dp
1435 SUBROUTINE moment_sp(dat, average, variance, skewness, kurtosis, mean, stddev, absdev, mask, sample)
1439 REAL(
sp),
DIMENSION(:),
INTENT(IN) :: dat
1440 REAL(
sp),
OPTIONAL,
INTENT(OUT) ::
average
1444 REAL(
sp),
OPTIONAL,
INTENT(OUT) ::
mean
1445 REAL(
sp),
OPTIONAL,
INTENT(OUT) ::
stddev
1446 REAL(
sp),
OPTIONAL,
INTENT(OUT) ::
absdev
1447 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1448 LOGICAL,
OPTIONAL,
INTENT(IN) :: sample
1450 REAL(
sp) :: n, div_n
1452 REAL(
sp) :: ep, ave, var
1453 REAL(
sp),
DIMENSION(size(dat)) :: p, s
1454 LOGICAL,
DIMENSION(size(dat)) :: maske
1456 if (
present(mask))
then
1457 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error moment_sp: size(mask) size(dat)'
1459 n = real(count(maske),
sp)
1462 n = real(
size(dat),
sp)
1464 if (n .le. (1.0_sp + tiny(1.0_sp))) stop
'moment_sp: n must be at least 2'
1468 if (
present(sample))
then
1469 if (.not. sample) div_n = n
1476 ave = sum(dat(:), mask = maske) / n
1483 if (
present(
absdev))
absdev = sum(abs(s(:)), mask = maske) / n
1487 ep = sum(s(:), mask = maske)
1489 var = sum(p(:), mask = maske)
1490 var = (var - ep * ep / n) / div_n
1496 if (abs(var) .lt. tiny(0.0_sp)) stop
'moment_sp: no skewness or kurtosis when zero variance'
1509 END SUBROUTINE moment_sp
1513 FUNCTION stddev_dp(dat, mask)
1517 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: dat
1518 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1519 REAL(
dp) :: stddev_dp
1523 REAL(
dp) :: ep, ave, var
1524 REAL(
dp),
DIMENSION(size(dat)) :: p, s
1525 LOGICAL,
DIMENSION(size(dat)) :: maske
1527 if (
present(mask))
then
1528 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error stddev_dp: size(mask) size(dat)'
1530 n = real(count(maske),
dp)
1533 n = real(
size(dat),
dp)
1535 if (n .le. (1.0_dp + tiny(1.0_dp))) stop
'stddev_dp: n must be at least 2'
1538 ave = sum(dat(:), mask = maske) / n
1541 ep = sum(s(:), mask = maske)
1543 var = sum(p(:), mask = maske)
1544 var = (var - ep * ep / n) / (n - 1.0_dp)
1545 stddev_dp = sqrt(var)
1547 END FUNCTION stddev_dp
1550 FUNCTION stddev_sp(dat, mask)
1554 REAL(
sp),
DIMENSION(:),
INTENT(IN) :: dat
1555 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1556 REAL(
sp) :: stddev_sp
1560 REAL(
sp) :: ep, ave, var
1561 REAL(
sp),
DIMENSION(size(dat)) :: p, s
1562 LOGICAL,
DIMENSION(size(dat)) :: maske
1564 if (
present(mask))
then
1565 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error stddev_sp: size(mask) size(dat)'
1567 n = real(count(maske),
sp)
1570 n = real(
size(dat),
sp)
1572 if (n .le. (1.0_sp + tiny(1.0_sp))) stop
'stddev_sp: n must be at least 2'
1575 ave = sum(dat(:), mask = maske) / n
1578 ep = sum(s(:), mask = maske)
1580 var = sum(p(:), mask = maske)
1581 var = (var - ep * ep / n) / (n - 1.0_sp)
1582 stddev_sp = sqrt(var)
1584 END FUNCTION stddev_sp
1588 FUNCTION skewness_dp(dat, mask)
1592 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: dat
1593 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1594 REAL(
dp) :: skewness_dp
1599 REAL(
dp),
DIMENSION(size(dat)) :: p, s
1600 LOGICAL,
DIMENSION(size(dat)) :: maske
1602 if (
present(mask))
then
1603 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error skewness_dp: size(mask) size(dat)'
1605 n = real(count(maske),
dp)
1608 n = real(
size(dat),
dp)
1610 if (n .le. (1.0_dp + tiny(1.0_dp))) stop
'skewness_dp: n must be at least 2'
1613 ave = sum(dat(:), mask = maske) / n
1616 ep = sum(s(:), mask = maske)
1618 var = sum(p(:), mask = maske)
1619 var = (var - ep * ep / n) / (n - 1.0_dp)
1622 if (abs(var) .lt. tiny(0.0_dp)) stop
'skewness_dp: no skewness when zero variance'
1624 skewness_dp = sum(p(:), mask = maske)
1627 END FUNCTION skewness_dp
1630 FUNCTION skewness_sp(dat, mask)
1634 REAL(
sp),
DIMENSION(:),
INTENT(IN) :: dat
1635 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1636 REAL(
sp) :: skewness_sp
1641 REAL(
sp),
DIMENSION(size(dat)) :: p, s
1642 LOGICAL,
DIMENSION(size(dat)) :: maske
1644 if (
present(mask))
then
1645 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error skewness_sp: size(mask) size(dat)'
1647 n = real(count(maske),
sp)
1650 n = real(
size(dat),
sp)
1652 if (n .le. (1.0_sp + tiny(1.0_sp))) stop
'skewness_sp: n must be at least 2'
1655 ave = sum(dat(:), mask = maske) / n
1658 ep = sum(s(:), mask = maske)
1660 var = sum(p(:), mask = maske)
1661 var = (var - ep * ep / n) / (n - 1.0_sp)
1664 if (abs(var) .lt. tiny(0.0_sp)) stop
'skewness_sp: no skewness when zero variance'
1666 skewness_sp = sum(p(:), mask = maske)
1669 END FUNCTION skewness_sp
1673 FUNCTION variance_dp(dat, mask)
1677 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: dat
1678 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1679 REAL(
dp) :: variance_dp
1683 REAL(
dp) :: ep, ave, var
1684 REAL(
dp),
DIMENSION(size(dat)) :: p, s
1685 LOGICAL,
DIMENSION(size(dat)) :: maske
1687 if (
present(mask))
then
1688 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error variance_dp: size(mask) size(dat)'
1690 n = real(count(maske),
dp)
1693 n = real(
size(dat),
dp)
1695 if (n .le. (1.0_dp + tiny(1.0_dp))) stop
'variance_dp: n must be at least 2'
1698 ave = sum(dat(:), mask = maske) / n
1701 ep = sum(s(:), mask = maske)
1703 var = sum(p(:), mask = maske)
1704 variance_dp = (var - ep * ep / n) / (n - 1.0_dp)
1706 END FUNCTION variance_dp
1709 FUNCTION variance_sp(dat, mask)
1713 REAL(
sp),
DIMENSION(:),
INTENT(IN) :: dat
1714 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1715 REAL(
sp) :: variance_sp
1719 REAL(
sp) :: ep, ave, var
1720 REAL(
sp),
DIMENSION(size(dat)) :: p, s
1721 LOGICAL,
DIMENSION(size(dat)) :: maske
1723 if (
present(mask))
then
1724 if (
size(mask) .ne.
size(dat)) stop .ne.
'Error variance_sp: size(mask) size(dat)'
1726 n = real(count(maske),
sp)
1729 n = real(
size(dat),
sp)
1731 if (n .le. (1.0_sp + tiny(1.0_sp))) stop
'variance_sp: n must be at least 2'
1734 ave = sum(dat(:), mask = maske) / n
1737 ep = sum(s(:), mask = maske)
1739 var = sum(p(:), mask = maske)
1740 variance_sp = (var - ep * ep / n) / (n - 1.0_sp)
1742 END FUNCTION variance_sp
Mean absolute deviation from mean.
R-central moment variance.
Correlation between two vectors.
Covariance between vectors.
Mixed central moment variance.
R-s mixed central moment between vectors.
First four moments, stddev and mean absolute devation.
Standard deviation of a vector.
Standard deviation of a vector.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter i4
4 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.
real(sp) function mean_sp(dat, mask)
Mean of a vector.