69 MODULE PROCEDURE bias_sp_1d, bias_dp_1d, bias_sp_2d, bias_dp_2d, bias_sp_3d, bias_dp_3d
126 MODULE PROCEDURE kge_dp_1d, kge_dp_2d, kge_dp_3d, kge_sp_1d, kge_sp_2d, kge_sp_3d
185 MODULE PROCEDURE kgenocorr_dp_1d, kgenocorr_dp_2d, kgenocorr_dp_3d, kgenocorr_sp_1d, kgenocorr_sp_2d, kgenocorr_sp_3d
230 MODULE PROCEDURE lnnse_sp_1d, lnnse_dp_1d, lnnse_dp_2d, lnnse_sp_2d, lnnse_sp_3d, lnnse_dp_3d
270 MODULE PROCEDURE mae_sp_1d, mae_dp_1d, mae_sp_2d, mae_dp_2d, mae_sp_3d, mae_dp_3d
309 MODULE PROCEDURE mse_sp_1d, mse_dp_1d, mse_sp_2d, mse_dp_2d, mse_sp_3d, mse_dp_3d
355 MODULE PROCEDURE nse_sp_1d, nse_dp_1d, nse_dp_2d, nse_sp_2d, nse_sp_3d, nse_dp_3d
395 MODULE PROCEDURE sae_sp_1d, sae_dp_1d, sae_sp_2d, sae_dp_2d, sae_sp_3d, sae_dp_3d
434 MODULE PROCEDURE sse_sp_1d, sse_dp_1d, sse_sp_2d, sse_dp_2d, sse_sp_3d, sse_dp_3d
473 MODULE PROCEDURE rmse_sp_1d, rmse_dp_1d, rmse_sp_2d, rmse_dp_2d, rmse_sp_3d, rmse_dp_3d
522 MODULE PROCEDURE wnse_sp_1d, wnse_dp_1d, wnse_dp_2d, wnse_sp_2d, wnse_sp_3d, wnse_dp_3d
535 FUNCTION bias_sp_1d(x, y, mask)
541 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
542 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
543 REAL(sp) :: BIAS_sp_1d
546 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
547 LOGICAL,
DIMENSION(size(x)) :: maske
549 if (
present(mask))
then
550 shapemask = shape(mask)
555 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
556 stop
'BIAS_sp_1d: shapes of inputs(x,y) or mask are not matching'
558 if (
present(mask))
then
566 if (n .LE. 1_i4) stop
'BIAS_sp_1d: number of arguments must be at least 2'
570 END FUNCTION bias_sp_1d
572 FUNCTION bias_dp_1d(x, y, mask)
578 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
579 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
580 REAL(dp) :: BIAS_dp_1d
583 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
584 LOGICAL,
DIMENSION(size(x)) :: maske
586 if (
present(mask))
then
587 shapemask = shape(mask)
592 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
593 stop
'BIAS_dp_1d: shapes of inputs(x,y) or mask are not matching'
595 if (
present(mask))
then
602 if (n .LE. 1_i4) stop
'BIAS_dp_1d: number of arguments must be at least 2'
606 END FUNCTION bias_dp_1d
608 FUNCTION bias_sp_2d(x, y, mask)
614 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: x, y
615 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
616 REAL(sp) :: BIAS_sp_2d
620 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
621 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
623 if (
present(mask))
then
624 shapemask = shape(mask)
629 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
630 stop
'BIAS_sp_2d: shapes of inputs(x,y) or mask are not matching'
632 if (
present(mask))
then
637 n =
size(x, dim = 1) *
size(x, dim = 2)
640 if (n .LE. 1_i4) stop
'BIAS_sp_2d: number of arguments must be at least 2'
642 bias_sp_2d =
average(reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
643 mask = reshape(maske, (/
size(y, dim = 1) *
size(y, dim = 2)/))) - &
644 average(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
645 mask = reshape(maske, (/
size(x, dim = 1) *
size(x, dim = 2)/)))
647 END FUNCTION bias_sp_2d
649 FUNCTION bias_dp_2d(x, y, mask)
655 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: x, y
656 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
657 REAL(dp) :: BIAS_dp_2d
660 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
661 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
663 if (
present(mask))
then
664 shapemask = shape(mask)
669 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
670 stop
'BIAS_dp_2d: shapes of inputs(x,y) or mask are not matching'
672 if (
present(mask))
then
677 n =
size(x, dim = 1) *
size(x, dim = 2)
680 if (n .LE. 1_i4) stop
'BIAS_dp_2d: number of arguments must be at least 2'
682 bias_dp_2d =
average(reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
683 mask = reshape(maske, (/
size(y, dim = 1) *
size(y, dim = 2)/))) - &
684 average(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
685 mask = reshape(maske, (/
size(x, dim = 1) *
size(x, dim = 2)/)))
687 END FUNCTION bias_dp_2d
689 FUNCTION bias_sp_3d(x, y, mask)
695 REAL(sp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
696 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
697 REAL(sp) :: BIAS_sp_3d
700 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
701 LOGICAL,
DIMENSION(size(x, dim = 1), &
size(x, dim = 2), size(x, dim = 3)) :: maske
703 if (
present(mask))
then
704 shapemask = shape(mask)
709 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
710 stop
'BIAS_sp_3d: shapes of inputs(x,y) or mask are not matching'
712 if (
present(mask))
then
717 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
721 if (n .LE. 1_i4) stop
'BIAS_sp_3d: number of arguments must be at least 2'
723 bias_sp_3d =
average(reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
724 mask = reshape(maske, (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/))) - &
725 average(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
726 mask = reshape(maske, (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
728 END FUNCTION bias_sp_3d
730 FUNCTION bias_dp_3d(x, y, mask)
736 REAL(dp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
737 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
738 REAL(dp) :: BIAS_dp_3d
741 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
742 LOGICAL,
DIMENSION(size(x, dim = 1), &
size(x, dim = 2), size(x, dim = 3)) :: maske
744 if (
present(mask))
then
745 shapemask = shape(mask)
750 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
751 stop
'BIAS_dp_3d: shapes of inputs(x,y) or mask are not matching'
753 if (
present(mask))
then
758 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
762 if (n .LE. 1_i4) stop
'BIAS_dp_3d: number of arguments must be at least 2'
764 bias_dp_3d =
average(reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
765 mask = reshape(maske, (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/))) - &
766 average(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
767 mask = reshape(maske, (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
769 END FUNCTION bias_dp_3d
773 FUNCTION kge_sp_1d(x, y, mask)
779 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
780 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
781 REAL(sp) :: KGE_sp_1d
785 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
786 LOGICAL,
DIMENSION(size(x)) :: maske
788 REAL(sp) :: mu_Obs, mu_Sim
789 REAL(sp) :: sigma_Obs, sigma_Sim
790 REAL(sp) :: pearson_coor
792 if (
present(mask))
then
793 shapemask = shape(mask)
797 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
798 stop
'KGE_sp_1d: shapes of inputs(x,y) or mask are not matching'
800 if (
present(mask))
then
807 if (n .LE. 1_i4) stop
'KGE_sp_1d: sample size must be at least 2'
810 mu_obs =
average(x, mask = maske)
811 mu_sim =
average(y, mask = maske)
813 sigma_obs =
stddev(x, mask = maske)
814 sigma_sim =
stddev(y, mask = maske)
816 pearson_coor =
correlation(x, y, mask = maske) * real(n, sp) / real(n - 1, sp)
818 kge_sp_1d = 1.0 - sqrt(&
819 (1.0_sp - (mu_sim / mu_obs))**2 + &
820 (1.0_sp - (sigma_sim / sigma_obs))**2 + &
821 (1.0_sp - pearson_coor)**2 &
824 END FUNCTION kge_sp_1d
826 FUNCTION kge_sp_2d(x, y, mask)
832 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: x, y
833 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
834 REAL(sp) :: KGE_sp_2d
838 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
839 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
840 REAL(sp) :: mu_Obs, mu_Sim
841 REAL(sp) :: sigma_Obs, sigma_Sim
842 REAL(sp) :: pearson_coor
844 if (
present(mask))
then
845 shapemask = shape(mask)
849 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
850 stop
'KGE_sp_2d: shapes of inputs(x,y) or mask are not matching'
852 if (
present(mask))
then
859 if (n .LE. 1_i4) stop
'KGE_sp_2d: sample size must be at least 2'
863 reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
864 mask = reshape(maske(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)))
866 reshape(y(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
867 mask = reshape(maske(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)))
870 reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
871 mask = reshape(maske(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)))
873 reshape(y(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
874 mask = reshape(maske(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)))
877 reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
878 reshape(y(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
879 mask = reshape(maske(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/))) * &
880 real(n, sp) /
real(n - 1, sp)
882 kge_sp_2d = 1.0 - sqrt(&
883 (1.0_sp - (mu_sim / mu_obs))**2 + &
884 (1.0_sp - (sigma_sim / sigma_obs))**2 + &
885 (1.0_sp - pearson_coor)**2 &
888 END FUNCTION kge_sp_2d
890 FUNCTION kge_sp_3d(x, y, mask)
896 REAL(sp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
897 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
898 REAL(sp) :: KGE_sp_3d
902 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
903 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske
904 REAL(sp) :: mu_Obs, mu_Sim
905 REAL(sp) :: sigma_Obs, sigma_Sim
906 REAL(sp) :: pearson_coor
908 if (
present(mask))
then
909 shapemask = shape(mask)
913 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
914 stop
'KGE_sp_3d: shapes of inputs(x,y) or mask are not matching'
916 if (
present(mask))
then
923 if (n .LE. 1_i4) stop
'KGE_sp_3d: sample size must be at least 2'
927 reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
928 mask = reshape(maske(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
930 reshape(y(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
931 mask = reshape(maske(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)))
934 reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
935 mask = reshape(maske(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
937 reshape(y(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
938 mask = reshape(maske(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)))
941 reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
942 reshape(y(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
943 mask = reshape(maske(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/))) * &
944 real(n, sp) /
real(n - 1, sp)
946 kge_sp_3d = 1.0 - sqrt(&
947 (1.0_sp - (mu_sim / mu_obs))**2 + &
948 (1.0_sp - (sigma_sim / sigma_obs))**2 + &
949 (1.0_sp - pearson_coor)**2 &
952 END FUNCTION kge_sp_3d
954 FUNCTION kge_dp_1d(x, y, mask)
960 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
961 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
962 REAL(dp) :: KGE_dp_1d
966 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
967 LOGICAL,
DIMENSION(size(x)) :: maske
969 REAL(dp) :: mu_Obs, mu_Sim
970 REAL(dp) :: sigma_Obs, sigma_Sim
971 REAL(dp) :: pearson_coor
973 if (
present(mask))
then
974 shapemask = shape(mask)
978 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
979 stop
'KGE_dp_1d: shapes of inputs(x,y) or mask are not matching'
981 if (
present(mask))
then
988 if (n .LE. 1_i4) stop
'KGE_dp_1d: sample size must be at least 2'
991 mu_obs =
average(x, mask = maske)
992 mu_sim =
average(y, mask = maske)
994 sigma_obs =
stddev(x, mask = maske)
995 sigma_sim =
stddev(y, mask = maske)
997 pearson_coor =
correlation(x, y, mask = maske) * real(n, dp) / real(n - 1, dp)
999 kge_dp_1d = 1.0 - sqrt(&
1000 (1.0_dp - (mu_sim / mu_obs))**2 + &
1001 (1.0_dp - (sigma_sim / sigma_obs))**2 + &
1002 (1.0_dp - pearson_coor)**2 &
1005 END FUNCTION kge_dp_1d
1007 FUNCTION kge_dp_2d(x, y, mask)
1013 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: x, y
1014 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
1015 REAL(dp) :: KGE_dp_2d
1019 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1020 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
1021 REAL(dp) :: mu_Obs, mu_Sim
1022 REAL(dp) :: sigma_Obs, sigma_Sim
1023 REAL(dp) :: pearson_coor
1025 if (
present(mask))
then
1026 shapemask = shape(mask)
1028 shapemask = shape(x)
1030 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1031 stop
'KGE_dp_2d: shapes of inputs(x,y) or mask are not matching'
1033 if (
present(mask))
then
1040 if (n .LE. 1_i4) stop
'KGE_dp_2d: sample size must be at least 2'
1044 reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
1045 mask = reshape(maske(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)))
1047 reshape(y(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
1048 mask = reshape(maske(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)))
1051 reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
1052 mask = reshape(maske(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)))
1054 reshape(y(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
1055 mask = reshape(maske(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)))
1058 reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
1059 reshape(y(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
1060 mask = reshape(maske(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/))) * &
1061 real(n, dp) /
real(n - 1, dp)
1063 kge_dp_2d = 1.0 - sqrt(&
1064 (1.0_dp - (mu_sim / mu_obs))**2 + &
1065 (1.0_dp - (sigma_sim / sigma_obs))**2 + &
1066 (1.0_dp - pearson_coor)**2 &
1069 END FUNCTION kge_dp_2d
1071 FUNCTION kge_dp_3d(x, y, mask)
1077 REAL(dp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
1078 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
1079 REAL(dp) :: KGE_dp_3d
1083 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1084 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske
1085 REAL(dp) :: mu_Obs, mu_Sim
1086 REAL(dp) :: sigma_Obs, sigma_Sim
1087 REAL(dp) :: pearson_coor
1089 if (
present(mask))
then
1090 shapemask = shape(mask)
1092 shapemask = shape(x)
1094 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1095 stop
'KGE_dp_3d: shapes of inputs(x,y) or mask are not matching'
1097 if (
present(mask))
then
1104 if (n .LE. 1_i4) stop
'KGE_dp_3d: sample size must be at least 2'
1108 reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
1109 mask = reshape(maske(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
1111 reshape(y(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
1112 mask = reshape(maske(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)))
1115 reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
1116 mask = reshape(maske(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
1118 reshape(y(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
1119 mask = reshape(maske(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)))
1122 reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
1123 reshape(y(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
1124 mask = reshape(maske(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/))) * &
1125 real(n, dp) /
real(n - 1, dp)
1127 kge_dp_3d = 1.0 - sqrt(&
1128 (1.0_dp - (mu_sim / mu_obs))**2 + &
1129 (1.0_dp - (sigma_sim / sigma_obs))**2 + &
1130 (1.0_dp - pearson_coor)**2 &
1133 END FUNCTION kge_dp_3d
1137 FUNCTION kgenocorr_sp_1d(x, y, mask)
1143 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
1144 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1145 REAL(sp) :: KGEnocorr_sp_1d
1149 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1150 LOGICAL,
DIMENSION(size(x)) :: maske
1152 REAL(sp) :: mu_Obs, mu_Sim
1153 REAL(sp) :: sigma_Obs, sigma_Sim
1155 if (
present(mask))
then
1156 shapemask = shape(mask)
1158 shapemask = shape(x)
1160 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1161 stop
'KGEnocorr_sp_1d: shapes of inputs(x,y) or mask are not matching'
1163 if (
present(mask))
then
1170 if (n .LE. 1_i4) stop
'KGEnocorr_sp_1d: sample size must be at least 2'
1173 mu_obs =
average(x, mask = maske)
1174 mu_sim =
average(y, mask = maske)
1176 sigma_obs =
stddev(x, mask = maske)
1177 sigma_sim =
stddev(y, mask = maske)
1180 kgenocorr_sp_1d = 1.0 - sqrt(&
1181 (1.0_sp - (mu_sim / mu_obs))**2 + &
1182 (1.0_sp - (sigma_sim / sigma_obs))**2 &
1185 END FUNCTION kgenocorr_sp_1d
1187 FUNCTION kgenocorr_sp_2d(x, y, mask)
1193 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: x, y
1194 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
1195 REAL(sp) :: KGEnocorr_sp_2d
1199 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1200 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
1201 REAL(sp) :: mu_Obs, mu_Sim
1202 REAL(sp) :: sigma_Obs, sigma_Sim
1204 if (
present(mask))
then
1205 shapemask = shape(mask)
1207 shapemask = shape(x)
1209 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1210 stop
'KGEnocorr_sp_2d: shapes of inputs(x,y) or mask are not matching'
1212 if (
present(mask))
then
1219 if (n .LE. 1_i4) stop
'KGEnocorr_sp_2d: sample size must be at least 2'
1223 reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
1224 mask = reshape(maske(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)))
1226 reshape(y(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
1227 mask = reshape(maske(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)))
1230 reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
1231 mask = reshape(maske(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)))
1233 reshape(y(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
1234 mask = reshape(maske(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)))
1236 kgenocorr_sp_2d = 1.0 - sqrt(&
1237 (1.0_sp - (mu_sim / mu_obs))**2 + &
1238 (1.0_sp - (sigma_sim / sigma_obs))**2 &
1241 END FUNCTION kgenocorr_sp_2d
1243 FUNCTION kgenocorr_sp_3d(x, y, mask)
1249 REAL(sp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
1250 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
1251 REAL(sp) :: KGEnocorr_sp_3d
1255 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1256 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske
1257 REAL(sp) :: mu_Obs, mu_Sim
1258 REAL(sp) :: sigma_Obs, sigma_Sim
1260 if (
present(mask))
then
1261 shapemask = shape(mask)
1263 shapemask = shape(x)
1265 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1266 stop
'KGEnocorr_sp_3d: shapes of inputs(x,y) or mask are not matching'
1268 if (
present(mask))
then
1275 if (n .LE. 1_i4) stop
'KGEnocorr_sp_3d: sample size must be at least 2'
1279 reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
1280 mask = reshape(maske(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
1282 reshape(y(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
1283 mask = reshape(maske(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)))
1286 reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
1287 mask = reshape(maske(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
1289 reshape(y(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
1290 mask = reshape(maske(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)))
1293 kgenocorr_sp_3d = 1.0 - sqrt(&
1294 (1.0_sp - (mu_sim / mu_obs))**2 + &
1295 (1.0_sp - (sigma_sim / sigma_obs))**2 &
1298 END FUNCTION kgenocorr_sp_3d
1300 FUNCTION kgenocorr_dp_1d(x, y, mask)
1306 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
1307 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1308 REAL(dp) :: KGEnocorr_dp_1d
1312 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1313 LOGICAL,
DIMENSION(size(x)) :: maske
1315 REAL(dp) :: mu_Obs, mu_Sim
1316 REAL(dp) :: sigma_Obs, sigma_Sim
1318 if (
present(mask))
then
1319 shapemask = shape(mask)
1321 shapemask = shape(x)
1323 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1324 stop
'KGEnocorr_dp_1d: shapes of inputs(x,y) or mask are not matching'
1326 if (
present(mask))
then
1333 if (n .LE. 1_i4) stop
'KGEnocorr_dp_1d: sample size must be at least 2'
1336 mu_obs =
average(x, mask = maske)
1337 mu_sim =
average(y, mask = maske)
1339 sigma_obs =
stddev(x, mask = maske)
1340 sigma_sim =
stddev(y, mask = maske)
1343 kgenocorr_dp_1d = 1.0 - sqrt(&
1344 (1.0_dp - (mu_sim / mu_obs))**2 + &
1345 (1.0_dp - (sigma_sim / sigma_obs))**2 &
1348 END FUNCTION kgenocorr_dp_1d
1350 FUNCTION kgenocorr_dp_2d(x, y, mask)
1356 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: x, y
1357 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
1358 REAL(dp) :: KGEnocorr_dp_2d
1362 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1363 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
1364 REAL(dp) :: mu_Obs, mu_Sim
1365 REAL(dp) :: sigma_Obs, sigma_Sim
1367 if (
present(mask))
then
1368 shapemask = shape(mask)
1370 shapemask = shape(x)
1372 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1373 stop
'KGEnocorr_dp_2d: shapes of inputs(x,y) or mask are not matching'
1375 if (
present(mask))
then
1382 if (n .LE. 1_i4) stop
'KGEnocorr_dp_2d: sample size must be at least 2'
1386 reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
1387 mask = reshape(maske(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)))
1389 reshape(y(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
1390 mask = reshape(maske(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)))
1393 reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
1394 mask = reshape(maske(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)))
1396 reshape(y(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
1397 mask = reshape(maske(:, :), (/
size(y, dim = 1) *
size(y, dim = 2)/)))
1399 kgenocorr_dp_2d = 1.0 - sqrt(&
1400 (1.0_dp - (mu_sim / mu_obs))**2 + &
1401 (1.0_dp - (sigma_sim / sigma_obs))**2 &
1404 END FUNCTION kgenocorr_dp_2d
1406 FUNCTION kgenocorr_dp_3d(x, y, mask)
1412 REAL(dp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
1413 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
1414 REAL(dp) :: KGEnocorr_dp_3d
1418 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1419 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske
1420 REAL(dp) :: mu_Obs, mu_Sim
1421 REAL(dp) :: sigma_Obs, sigma_Sim
1423 if (
present(mask))
then
1424 shapemask = shape(mask)
1426 shapemask = shape(x)
1428 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1429 stop
'KGEnocorr_dp_3d: shapes of inputs(x,y) or mask are not matching'
1431 if (
present(mask))
then
1438 if (n .LE. 1_i4) stop
'KGEnocorr_dp_3d: sample size must be at least 2'
1442 reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
1443 mask = reshape(maske(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
1445 reshape(y(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
1446 mask = reshape(maske(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)))
1449 reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
1450 mask = reshape(maske(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
1452 reshape(y(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)), &
1453 mask = reshape(maske(:, :, :), (/
size(y, dim = 1) *
size(y, dim = 2) *
size(y, dim = 3)/)))
1456 kgenocorr_dp_3d = 1.0 - sqrt(&
1457 (1.0_dp - (mu_sim / mu_obs))**2 + &
1458 (1.0_dp - (sigma_sim / sigma_obs))**2 &
1461 END FUNCTION kgenocorr_dp_3d
1466 FUNCTION lnnse_sp_1d(x, y, mask)
1472 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
1473 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: mask
1474 REAL(sp) :: LNNSE_sp_1d
1477 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1479 REAL(sp),
DIMENSION(size(x)) :: logx, logy, v1, v2
1480 LOGICAL,
DIMENSION(size(x)) :: maske
1482 if (
present(mask))
then
1483 shapemask = shape(mask)
1485 shapemask = shape(x)
1487 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1488 stop
'LNNSE_sp_1d: shapes of inputs(x,y) or mask are not matching'
1490 if (
present(mask))
then
1497 where (x .lt. tiny(1.0_sp) .or. y .lt. tiny(1.0_sp))
1501 if (n .LE. 1_i4) stop
'LNNSE_sp_1d: number of arguments must be at least 2'
1512 xmean =
average(logx, mask = maske)
1515 v1 = merge(logy - logx, 0.0_sp, maske)
1516 v2 = merge(logx - xmean, 0.0_sp, maske)
1517 lnnse_sp_1d = 1.0_sp - dot_product(v1, v1) / dot_product(v2, v2)
1519 END FUNCTION lnnse_sp_1d
1523 FUNCTION lnnse_dp_1d(x, y, mask)
1529 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
1530 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(INOUT) :: mask
1531 REAL(dp) :: LNNSE_dp_1d
1534 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1536 REAL(dp),
DIMENSION(size(x)) :: logx, logy, v1, v2
1537 LOGICAL,
DIMENSION(size(x)) :: maske
1539 if (
present(mask))
then
1540 shapemask = shape(mask)
1542 shapemask = shape(x)
1544 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1545 stop
'LNNSE_dp_1d: shapes of inputs(x,y) or mask are not matching'
1547 if (
present(mask))
then
1554 where (x .lt. tiny(1.0_dp) .or. y .lt. tiny(1.0_dp))
1558 if (n .LE. 1_i4) stop
'LNNSE_dp_1d: number of arguments must be at least 2'
1569 xmean =
average(logx, mask = maske)
1572 v1 = merge(logy - logx, 0.0_dp, maske)
1573 v2 = merge(logx - xmean, 0.0_dp, maske)
1574 lnnse_dp_1d = 1.0_dp - sum(v1 * v1, mask = maske) / sum(v2 * v2, mask = maske)
1576 END FUNCTION lnnse_dp_1d
1580 FUNCTION lnnse_sp_2d(x, y, mask)
1586 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: x, y
1587 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(INOUT) :: mask
1588 REAL(sp) :: LNNSE_sp_2d
1591 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1593 REAL(sp),
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: logx, logy, v1, v2
1594 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
1596 if (
present(mask))
then
1597 shapemask = shape(mask)
1599 shapemask = shape(x)
1601 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1602 stop
'LNNSE_sp_2d: shapes of inputs(x,y) or mask are not matching'
1604 if (
present(mask))
then
1611 where (x .lt. tiny(1.0_sp) .or. y .lt. tiny(1.0_sp))
1615 if (n .LE. 1_i4) stop
'LNNSE_sp_2d: number of arguments must be at least 2'
1626 xmean =
average(pack(logx, maske))
1629 v1 = merge(logy - logx, 0.0_sp, maske)
1630 v2 = merge(logx - xmean, 0.0_sp, maske)
1631 lnnse_sp_2d = 1.0_sp - sum(v1 * v1, mask = maske) / sum(v2 * v2, mask = maske)
1633 END FUNCTION lnnse_sp_2d
1637 FUNCTION lnnse_dp_2d(x, y, mask)
1643 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: x, y
1644 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(INOUT) :: mask
1645 REAL(dp) :: LNNSE_dp_2d
1648 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1650 REAL(dp),
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: logx, logy, v1, v2
1651 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
1653 if (
present(mask))
then
1654 shapemask = shape(mask)
1656 shapemask = shape(x)
1658 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1659 stop
'LNNSE_dp_2d: shapes of inputs(x,y) or mask are not matching'
1661 if (
present(mask))
then
1668 where (x .lt. tiny(1.0_dp) .or. y .lt. tiny(1.0_dp))
1672 if (n .LE. 1_i4) stop
'LNNSE_dp_2d: number of arguments must be at least 2'
1683 xmean =
average(pack(logx, maske))
1686 v1 = merge(logy - logx, 0.0_dp, maske)
1687 v2 = merge(logx - xmean, 0.0_dp, maske)
1688 lnnse_dp_2d = 1.0_dp - sum(v1 * v1, mask = maske) / sum(v2 * v2, mask = maske)
1690 END FUNCTION lnnse_dp_2d
1694 FUNCTION lnnse_sp_3d(x, y, mask)
1700 REAL(sp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
1701 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(INOUT) :: mask
1702 REAL(sp) :: LNNSE_sp_3d
1705 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1707 REAL(sp),
DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: logx, logy, v1, v2
1708 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske
1710 if (
present(mask))
then
1711 shapemask = shape(mask)
1713 shapemask = shape(x)
1715 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1716 stop
'LNNSE_sp_3d: shapes of inputs(x,y) or mask are not matching'
1718 if (
present(mask))
then
1725 where (x .lt. tiny(1.0_sp) .or. y .lt. tiny(1.0_sp))
1729 if (n .LE. 1_i4) stop
'LNNSE_sp_3d: number of arguments must be at least 2'
1740 xmean =
average(pack(logx, maske))
1743 v1 = merge(logy - logx, 0.0_sp, maske)
1744 v2 = merge(logx - xmean, 0.0_sp, maske)
1745 lnnse_sp_3d = 1.0_sp - sum(v1 * v1, mask = maske) / sum(v2 * v2, mask = maske)
1747 END FUNCTION lnnse_sp_3d
1751 FUNCTION lnnse_dp_3d(x, y, mask)
1757 REAL(dp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
1758 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(INOUT) :: mask
1759 REAL(dp) :: LNNSE_dp_3d
1762 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1764 REAL(dp),
DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: logx, logy, v1, v2
1765 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske
1767 if (
present(mask))
then
1768 shapemask = shape(mask)
1770 shapemask = shape(x)
1772 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1773 stop
'LNNSE_dp_3d: shapes of inputs(x,y) or mask are not matching'
1775 if (
present(mask))
then
1782 where (x .lt. tiny(1.0_dp) .or. y .lt. tiny(1.0_dp))
1786 if (n .LE. 1_i4) stop
'LNNSE_dp_3d: number of arguments must be at least 2'
1797 xmean =
average(pack(logx, maske))
1800 v1 = merge(logy - logx, 0.0_dp, maske)
1801 v2 = merge(logx - xmean, 0.0_dp, maske)
1802 lnnse_dp_3d = 1.0_dp - sum(v1 * v1, mask = maske) / sum(v2 * v2, mask = maske)
1804 END FUNCTION lnnse_dp_3d
1808 FUNCTION mae_sp_1d(x, y, mask)
1812 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
1813 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1814 REAL(sp) :: MAE_sp_1d
1817 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1818 LOGICAL,
DIMENSION(size(x, dim = 1)) :: maske
1820 if (
present(mask))
then
1821 shapemask = shape(mask)
1823 shapemask = shape(x)
1825 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1826 stop
'MAE_sp_1d: shapes of inputs(x,y) or mask are not matching'
1828 if (
present(mask))
then
1833 n =
size(x, dim = 1)
1835 if (n .LE. 1_i4) stop
'MAE_sp_1d: number of arguments must be at least 2'
1837 mae_sp_1d = sae_sp_1d(x, y, mask = maske) / real(n, sp)
1839 END FUNCTION mae_sp_1d
1841 FUNCTION mae_dp_1d(x, y, mask)
1845 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
1846 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
1847 REAL(dp) :: MAE_dp_1d
1850 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1851 LOGICAL,
DIMENSION(size(x, dim = 1)) :: maske
1853 if (
present(mask))
then
1854 shapemask = shape(mask)
1856 shapemask = shape(x)
1858 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1859 stop
'MAE_dp_1d: shapes of inputs(x,y) or mask are not matching'
1861 if (
present(mask))
then
1866 n =
size(x, dim = 1)
1868 if (n .LE. 1_i4) stop
'MAE_dp_1d: number of arguments must be at least 2'
1870 mae_dp_1d = sae_dp_1d(x, y, mask = maske) / real(n, dp)
1872 END FUNCTION mae_dp_1d
1874 FUNCTION mae_sp_2d(x, y, mask)
1878 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: x, y
1879 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
1880 REAL(sp) :: MAE_sp_2d
1883 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1884 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
1886 if (
present(mask))
then
1887 shapemask = shape(mask)
1889 shapemask = shape(x)
1891 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1892 stop
'MAE_sp_2d: shapes of inputs(x,y) or mask are not matching'
1894 if (
present(mask))
then
1899 n =
size(x, dim = 1) *
size(x, dim = 2)
1901 if (n .LE. 1_i4) stop
'MAE_sp_2d: number of arguments must be at least 2'
1903 mae_sp_2d = sae_sp_2d(x, y, mask = maske) / real(n, sp)
1905 END FUNCTION mae_sp_2d
1907 FUNCTION mae_dp_2d(x, y, mask)
1911 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: x, y
1912 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
1913 REAL(dp) :: MAE_dp_2d
1916 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1917 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
1919 if (
present(mask))
then
1920 shapemask = shape(mask)
1922 shapemask = shape(x)
1924 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1925 stop
'MAE_dp_2d: shapes of inputs(x,y) or mask are not matching'
1927 if (
present(mask))
then
1932 n =
size(x, dim = 1) *
size(x, dim = 2)
1934 if (n .LE. 1_i4) stop
'MAE_dp_2d: number of arguments must be at least 2'
1936 mae_dp_2d = sae_dp_2d(x, y, mask = maske) / real(n, dp)
1938 END FUNCTION mae_dp_2d
1940 FUNCTION mae_sp_3d(x, y, mask)
1944 REAL(sp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
1945 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
1946 REAL(sp) :: MAE_sp_3d
1949 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1950 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), &
size(x, dim = 3)) :: maske
1952 if (
present(mask))
then
1953 shapemask = shape(mask)
1955 shapemask = shape(x)
1957 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1958 stop
'MAE_sp_3d: shapes of inputs(x,y) or mask are not matching'
1960 if (
present(mask))
then
1965 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
1967 if (n .LE. 1_i4) stop
'MAE_sp_3d: number of arguments must be at least 2'
1969 mae_sp_3d = sae_sp_3d(x, y, mask = maske) / real(n, sp)
1971 END FUNCTION mae_sp_3d
1973 FUNCTION mae_dp_3d(x, y, mask)
1977 REAL(dp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
1978 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
1979 REAL(dp) :: MAE_dp_3d
1982 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
1983 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), &
size(x, dim = 3)) :: maske
1985 if (
present(mask))
then
1986 shapemask = shape(mask)
1988 shapemask = shape(x)
1990 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
1991 stop
'MAE_dp_3d: shapes of inputs(x,y) or mask are not matching'
1993 if (
present(mask))
then
1998 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
2000 if (n .LE. 1_i4) stop
'MAE_dp_3d: number of arguments must be at least 2'
2002 mae_dp_3d = sae_dp_3d(x, y, mask = maske) / real(n, dp)
2004 END FUNCTION mae_dp_3d
2008 FUNCTION mse_sp_1d(x, y, mask)
2012 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
2013 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
2014 REAL(sp) :: MSE_sp_1d
2017 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2018 LOGICAL,
DIMENSION(size(x, dim = 1)) :: maske
2020 if (
present(mask))
then
2021 shapemask = shape(mask)
2023 shapemask = shape(x)
2025 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2026 stop
'MSE_sp_1d: shapes of inputs(x,y) or mask are not matching'
2028 if (
present(mask))
then
2033 n =
size(x, dim = 1)
2035 if (n .LE. 1_i4) stop
'MSE_sp_1d: number of arguments must be at least 2'
2037 mse_sp_1d = sse_sp_1d(x, y, mask = maske) / real(n, sp)
2039 END FUNCTION mse_sp_1d
2041 FUNCTION mse_dp_1d(x, y, mask)
2045 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
2046 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
2047 REAL(dp) :: MSE_dp_1d
2050 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2051 LOGICAL,
DIMENSION(size(x, dim = 1)) :: maske
2053 if (
present(mask))
then
2054 shapemask = shape(mask)
2056 shapemask = shape(x)
2058 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2059 stop
'MSE_dp_1d: shapes of inputs(x,y) or mask are not matching'
2061 if (
present(mask))
then
2066 n =
size(x, dim = 1)
2068 if (n .LE. 1_i4) stop
'MSE_dp_1d: number of arguments must be at least 2'
2070 mse_dp_1d = sse_dp_1d(x, y, mask = maske) / real(n, dp)
2072 END FUNCTION mse_dp_1d
2074 FUNCTION mse_sp_2d(x, y, mask)
2078 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: x, y
2079 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
2080 REAL(sp) :: MSE_sp_2d
2083 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2084 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
2086 if (
present(mask))
then
2087 shapemask = shape(mask)
2089 shapemask = shape(x)
2091 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2092 stop
'MSE_sp_2d: shapes of inputs(x,y) or mask are not matching'
2094 if (
present(mask))
then
2099 n =
size(x, dim = 1) *
size(x, dim = 2)
2101 if (n .LE. 1_i4) stop
'MSE_sp_2d: number of arguments must be at least 2'
2103 mse_sp_2d = sse_sp_2d(x, y, mask = maske) / real(n, sp)
2105 END FUNCTION mse_sp_2d
2107 FUNCTION mse_dp_2d(x, y, mask)
2111 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: x, y
2112 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
2113 REAL(dp) :: MSE_dp_2d
2116 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2117 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
2119 if (
present(mask))
then
2120 shapemask = shape(mask)
2122 shapemask = shape(x)
2124 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2125 stop
'MSE_dp_2d: shapes of inputs(x,y) or mask are not matching'
2127 if (
present(mask))
then
2132 n =
size(x, dim = 1) *
size(x, dim = 2)
2134 if (n .LE. 1_i4) stop
'MSE_dp_2d: number of arguments must be at least 2'
2136 mse_dp_2d = sse_dp_2d(x, y, mask = maske) / real(n, dp)
2138 END FUNCTION mse_dp_2d
2140 FUNCTION mse_sp_3d(x, y, mask)
2144 REAL(sp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
2145 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
2146 REAL(sp) :: MSE_sp_3d
2149 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2150 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), &
size(x, dim = 3)) :: maske
2152 if (
present(mask))
then
2153 shapemask = shape(mask)
2155 shapemask = shape(x)
2157 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2158 stop
'MSE_sp_3d: shapes of inputs(x,y) or mask are not matching'
2160 if (
present(mask))
then
2165 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
2167 if (n .LE. 1_i4) stop
'MSE_sp_3d: number of arguments must be at least 2'
2169 mse_sp_3d = sse_sp_3d(x, y, mask = maske) / real(n, sp)
2171 END FUNCTION mse_sp_3d
2173 FUNCTION mse_dp_3d(x, y, mask)
2177 REAL(dp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
2178 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
2179 REAL(dp) :: MSE_dp_3d
2182 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2183 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), &
size(x, dim = 3)) :: maske
2185 if (
present(mask))
then
2186 shapemask = shape(mask)
2188 shapemask = shape(x)
2190 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2191 stop
'MSE_dp_3d: shapes of inputs(x,y) or mask are not matching'
2193 if (
present(mask))
then
2198 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
2200 if (n .LE. 1_i4) stop
'MSE_dp_3d: number of arguments must be at least 2'
2202 mse_dp_3d = sse_dp_3d(x, y, mask = maske) / real(n, dp)
2204 END FUNCTION mse_dp_3d
2208 FUNCTION nse_sp_1d(x, y, mask)
2214 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
2215 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
2216 REAL(sp) :: NSE_sp_1d
2219 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2221 REAL(sp),
DIMENSION(size(x)) :: v1, v2
2222 LOGICAL,
DIMENSION(size(x)) :: maske
2224 if (
present(mask))
then
2225 shapemask = shape(mask)
2227 shapemask = shape(x)
2229 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2230 stop
'NSE_sp_1d: shapes of inputs(x,y) or mask are not matching'
2232 if (
present(mask))
then
2239 if (n .LE. 1_i4) stop
'NSE_sp_1d: number of arguments must be at least 2'
2241 xmean =
average(x, mask = maske)
2243 v1 = merge(y - x, 0.0_sp, maske)
2244 v2 = merge(x - xmean, 0.0_sp, maske)
2246 nse_sp_1d = 1.0_sp - dot_product(v1, v1) / dot_product(v2, v2)
2248 END FUNCTION nse_sp_1d
2250 FUNCTION nse_dp_1d(x, y, mask)
2256 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
2257 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
2258 REAL(dp) :: NSE_dp_1d
2261 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2263 REAL(dp),
DIMENSION(size(x)) :: v1, v2
2264 LOGICAL,
DIMENSION(size(x)) :: maske
2266 if (
present(mask))
then
2267 shapemask = shape(mask)
2269 shapemask = shape(x)
2271 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2272 stop
'NSE_dp_1d: shapes of inputs(x,y) or mask are not matching'
2274 if (
present(mask))
then
2281 if (n .LE. 1_i4) stop
'NSE_dp_1d: number of arguments must be at least 2'
2283 xmean =
average(x, mask = maske)
2285 v1 = merge(y - x, 0.0_dp, maske)
2286 v2 = merge(x - xmean, 0.0_dp, maske)
2288 nse_dp_1d = 1.0_dp - dot_product(v1, v1) / dot_product(v2, v2)
2290 END FUNCTION nse_dp_1d
2292 FUNCTION nse_sp_2d(x, y, mask)
2298 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: x, y
2299 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
2300 REAL(sp) :: NSE_sp_2d
2303 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2305 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
2307 if (
present(mask))
then
2308 shapemask = shape(mask)
2310 shapemask = shape(x)
2312 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2313 stop
'NSE_sp_2d: shapes of inputs(x,y) or mask are not matching'
2315 if (
present(mask))
then
2320 n =
size(x, dim = 1) *
size(x, dim = 2)
2323 if (n .LE. 1_i4) stop
'NSE_sp_2d: number of arguments must be at least 2'
2325 xmean =
average(reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
2326 mask = reshape(maske(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)))
2328 nse_sp_2d = 1.0_sp - sum((y - x) * (y - x), mask = maske) / sum((x - xmean) * (x - xmean), mask = maske)
2330 END FUNCTION nse_sp_2d
2332 FUNCTION nse_dp_2d(x, y, mask)
2338 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: x, y
2339 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
2340 REAL(dp) :: NSE_dp_2d
2343 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2345 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
2347 if (
present(mask))
then
2348 shapemask = shape(mask)
2350 shapemask = shape(x)
2352 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2353 stop
'NSE_dp_2d: shapes of inputs(x,y) or mask are not matching'
2355 if (
present(mask))
then
2360 n =
size(x, dim = 1) *
size(x, dim = 2)
2363 if (n .LE. 1_i4) stop
'NSE_dp_2d: number of arguments must be at least 2'
2365 xmean =
average(reshape(x(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
2366 mask = reshape(maske(:, :), (/
size(x, dim = 1) *
size(x, dim = 2)/)))
2368 nse_dp_2d = 1.0_dp - sum((y - x) * (y - x), mask = maske) / sum((x - xmean) * (x - xmean), mask = maske)
2370 END FUNCTION nse_dp_2d
2372 FUNCTION nse_sp_3d(x, y, mask)
2378 REAL(sp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
2379 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
2380 REAL(sp) :: NSE_sp_3d
2383 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2385 LOGICAL,
DIMENSION(size(x, dim = 1), &
size(x, dim = 2), size(x, dim = 3)) :: maske
2387 if (
present(mask))
then
2388 shapemask = shape(mask)
2390 shapemask = shape(x)
2392 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2393 stop
'NSE_sp_3d: shapes of inputs(x,y) or mask are not matching'
2395 if (
present(mask))
then
2400 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
2403 if (n .LE. 1_i4) stop
'NSE_sp_3d: number of arguments must be at least 2'
2405 xmean =
average(reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
2406 mask = reshape(maske(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
2408 nse_sp_3d = 1.0_sp - sum((y - x) * (y - x), mask = maske) / sum((x - xmean) * (x - xmean), mask = maske)
2410 END FUNCTION nse_sp_3d
2412 FUNCTION nse_dp_3d(x, y, mask)
2418 REAL(dp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
2419 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
2420 REAL(dp) :: NSE_dp_3d
2423 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2425 LOGICAL,
DIMENSION(size(x, dim = 1), &
size(x, dim = 2), size(x, dim = 3)) :: maske
2427 if (
present(mask))
then
2428 shapemask = shape(mask)
2430 shapemask = shape(x)
2432 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2433 stop
'NSE_dp_3d: shapes of inputs(x,y) or mask are not matching'
2435 if (
present(mask))
then
2440 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
2443 if (n .LE. 1_i4) stop
'NSE_dp_3d: number of arguments must be at least 2'
2445 xmean =
average(reshape(x(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
2446 mask = reshape(maske(:, :, :), (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)))
2448 nse_dp_3d = 1.0_dp - sum((y - x) * (y - x), mask = maske) / sum((x - xmean) * (x - xmean), mask = maske)
2450 END FUNCTION nse_dp_3d
2455 FUNCTION sae_sp_1d(x, y, mask)
2459 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
2460 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
2461 REAL(sp) :: SAE_sp_1d
2464 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2465 LOGICAL,
DIMENSION(size(x)) :: maske
2467 if (
present(mask))
then
2468 shapemask = shape(mask)
2470 shapemask = shape(x)
2473 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2474 stop
'SAE_sp_1d: shapes of inputs(x,y) or mask are not matching'
2476 if (
present(mask))
then
2483 if (n .LE. 1_i4) stop
'SAE_sp_1d: number of arguments must be at least 2'
2485 sae_sp_1d = sum(abs(y - x), mask = maske)
2487 END FUNCTION sae_sp_1d
2489 FUNCTION sae_dp_1d(x, y, mask)
2493 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
2494 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
2495 REAL(dp) :: SAE_dp_1d
2498 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2499 LOGICAL,
DIMENSION(size(x)) :: maske
2501 if (
present(mask))
then
2502 shapemask = shape(mask)
2504 shapemask = shape(x)
2507 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2508 stop
'SAE_dp_1d: shapes of inputs(x,y) or mask are not matching'
2510 if (
present(mask))
then
2517 if (n .LE. 1_i4) stop
'SAE_dp_1d: number of arguments must be at least 2'
2519 sae_dp_1d = sum(abs(y - x), mask = maske)
2521 END FUNCTION sae_dp_1d
2523 FUNCTION sae_sp_2d(x, y, mask)
2527 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: x, y
2528 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
2529 REAL(sp) :: SAE_sp_2d
2532 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2533 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
2535 if (
present(mask))
then
2536 shapemask = shape(mask)
2538 shapemask = shape(x)
2541 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2542 stop
'SAE_sp_2d: shapes of inputs(x,y) or mask are not matching'
2544 if (
present(mask))
then
2549 n =
size(x, dim = 1) *
size(x, dim = 2)
2551 if (n .LE. 1_i4) stop
'SAE_sp_2d: number of arguments must be at least 2'
2553 sae_sp_2d = sae_sp_1d(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
2554 reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
2555 mask = reshape(maske, (/
size(maske, dim = 1) *
size(maske, dim = 2)/)))
2557 END FUNCTION sae_sp_2d
2559 FUNCTION sae_dp_2d(x, y, mask)
2563 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: x, y
2564 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
2565 REAL(dp) :: SAE_dp_2d
2568 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2569 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
2571 if (
present(mask))
then
2572 shapemask = shape(mask)
2574 shapemask = shape(x)
2577 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2578 stop
'SAE_dp_2d: shapes of inputs(x,y) or mask are not matching'
2580 if (
present(mask))
then
2585 n =
size(x, dim = 1) *
size(x, dim = 2)
2587 if (n .LE. 1_i4) stop
'SAE_dp_2d: number of arguments must be at least 2'
2589 sae_dp_2d = sae_dp_1d(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
2590 reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
2591 mask = reshape(maske, (/
size(maske, dim = 1) *
size(maske, dim = 2)/)))
2593 END FUNCTION sae_dp_2d
2595 FUNCTION sae_sp_3d(x, y, mask)
2599 REAL(sp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
2600 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
2601 REAL(sp) :: SAE_sp_3d
2604 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2605 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), &
size(x, dim = 3)) :: maske
2607 if (
present(mask))
then
2608 shapemask = shape(mask)
2610 shapemask = shape(x)
2613 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2614 stop
'SAE_sp_3d: shapes of inputs(x,y) or mask are not matching'
2616 if (
present(mask))
then
2621 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
2623 if (n .LE. 1_i4) stop
'SAE_sp_3d: number of arguments must be at least 2'
2625 sae_sp_3d = sae_sp_1d(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
2626 reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2) *
size(x, dim = 3)/)), &
2627 mask = reshape(maske, (/
size(maske, dim = 1) *
size(maske, dim = 2) &
2628 *
size(maske, dim = 3)/)))
2630 END FUNCTION sae_sp_3d
2632 FUNCTION sae_dp_3d(x, y, mask)
2636 REAL(dp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
2637 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
2638 REAL(dp) :: SAE_dp_3d
2641 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2642 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), &
size(x, dim = 3)) :: maske
2644 if (
present(mask))
then
2645 shapemask = shape(mask)
2647 shapemask = shape(x)
2650 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2651 stop
'SAE_dp_3d: shapes of inputs(x,y) or mask are not matching'
2653 if (
present(mask))
then
2658 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
2660 if (n .LE. 1_i4) stop
'SAE_dp_3d: number of arguments must be at least 2'
2662 sae_dp_3d = sae_dp_1d(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
2663 reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2) *
size(x, dim = 3)/)), &
2664 mask = reshape(maske, (/
size(maske, dim = 1) *
size(maske, dim = 2) &
2665 *
size(maske, dim = 3)/)))
2667 END FUNCTION sae_dp_3d
2671 FUNCTION sse_sp_1d(x, y, mask)
2675 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
2676 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
2677 REAL(sp) :: SSE_sp_1d
2680 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2681 LOGICAL,
DIMENSION(size(x)) :: maske
2683 if (
present(mask))
then
2684 shapemask = shape(mask)
2686 shapemask = shape(x)
2689 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2690 stop
'SSE_sp_1d: shapes of inputs(x,y) or mask are not matching'
2692 if (
present(mask))
then
2699 if (n .LE. 1_i4) stop
'SSE_sp_1d: number of arguments must be at least 2'
2701 sse_sp_1d = sum((y - x)**2_i4, mask = maske)
2703 END FUNCTION sse_sp_1d
2705 FUNCTION sse_dp_1d(x, y, mask)
2709 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
2710 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
2711 REAL(dp) :: SSE_dp_1d
2714 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2715 LOGICAL,
DIMENSION(size(x)) :: maske
2717 if (
present(mask))
then
2718 shapemask = shape(mask)
2720 shapemask = shape(x)
2722 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2723 stop
'SSE_dp_1d: shapes of inputs(x,y) or mask are not matching'
2725 if (
present(mask))
then
2732 if (n .LE. 1_i4) stop
'SSE_dp_1d: number of arguments must be at least 2'
2734 sse_dp_1d = sum((y - x)**2_i4, mask = maske)
2736 END FUNCTION sse_dp_1d
2738 FUNCTION sse_sp_2d(x, y, mask)
2742 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: x, y
2743 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
2744 REAL(sp) :: SSE_sp_2d
2747 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2748 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
2750 if (
present(mask))
then
2751 shapemask = shape(mask)
2753 shapemask = shape(x)
2755 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2756 stop
'SSE_sp_2d: shapes of inputs(x,y) or mask are not matching'
2758 if (
present(mask))
then
2765 if (n .LE. 1_i4) stop
'SSE_sp_2d: number of arguments must be at least 2'
2767 sse_sp_2d = sse_sp_1d(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
2768 reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
2769 mask = reshape(maske, (/
size(maske, dim = 1) *
size(maske, dim = 2)/)))
2771 END FUNCTION sse_sp_2d
2773 FUNCTION sse_dp_2d(x, y, mask)
2777 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: x, y
2778 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
2779 REAL(dp) :: SSE_dp_2d
2782 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2783 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
2785 if (
present(mask))
then
2786 shapemask = shape(mask)
2788 shapemask = shape(x)
2790 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2791 stop
'SSE_dp_2d: shapes of inputs(x,y) or mask are not matching'
2793 if (
present(mask))
then
2800 if (n .LE. 1_i4) stop
'SSE_dp_2d: number of arguments must be at least 2'
2802 sse_dp_2d = sse_dp_1d(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2)/)), &
2803 reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2)/)), &
2804 mask = reshape(maske, (/
size(maske, dim = 1) *
size(maske, dim = 2)/)))
2806 END FUNCTION sse_dp_2d
2808 FUNCTION sse_sp_3d(x, y, mask)
2812 REAL(sp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
2813 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
2814 REAL(sp) :: SSE_sp_3d
2817 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2818 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), &
size(x, dim = 3)) :: maske
2820 if (
present(mask))
then
2821 shapemask = shape(mask)
2823 shapemask = shape(x)
2825 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2826 stop
'SSE_sp_3d: shapes of inputs(x,y) or mask are not matching'
2828 if (
present(mask))
then
2835 if (n .LE. 1_i4) stop
'SSE_sp_3d: number of arguments must be at least 2'
2837 sse_sp_3d = sse_sp_1d(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
2838 reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2) *
size(x, dim = 3)/)), &
2839 mask = reshape(maske, (/
size(maske, dim = 1) *
size(maske, dim = 2) &
2840 *
size(maske, dim = 3)/)))
2842 END FUNCTION sse_sp_3d
2844 FUNCTION sse_dp_3d(x, y, mask)
2848 REAL(dp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
2849 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
2850 REAL(dp) :: SSE_dp_3d
2853 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2854 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), &
size(x, dim = 3)) :: maske
2856 if (
present(mask))
then
2857 shapemask = shape(mask)
2859 shapemask = shape(x)
2861 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2862 stop
'SSE_dp_3d: shapes of inputs(x,y) or mask are not matching'
2864 if (
present(mask))
then
2871 if (n .LE. 1_i4) stop
'SSE_dp_3d: number of arguments must be at least 2'
2873 sse_dp_3d = sse_dp_1d(reshape(x, (/
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)/)), &
2874 reshape(y, (/
size(y, dim = 1) *
size(y, dim = 2) *
size(x, dim = 3)/)), &
2875 mask = reshape(maske, (/
size(maske, dim = 1) *
size(maske, dim = 2) &
2876 *
size(maske, dim = 3)/)))
2878 END FUNCTION sse_dp_3d
2882 FUNCTION rmse_sp_1d(x, y, mask)
2886 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
2887 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
2888 REAL(sp) :: RMSE_sp_1d
2891 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2892 LOGICAL,
DIMENSION(size(x, dim = 1)) :: maske
2894 if (
present(mask))
then
2895 shapemask = shape(mask)
2897 shapemask = shape(x)
2899 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2900 stop
'RMSE_sp_1d: shapes of inputs(x,y) or mask are not matching'
2902 if (
present(mask))
then
2907 n =
size(x, dim = 1)
2909 if (n .LE. 1_i4) stop
'RMSE_sp_1d: number of arguments must be at least 2'
2911 rmse_sp_1d = sqrt(mse_sp_1d(x, y, mask = maske))
2913 END FUNCTION rmse_sp_1d
2915 FUNCTION rmse_dp_1d(x, y, mask)
2919 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
2920 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
2921 REAL(dp) :: RMSE_dp_1d
2924 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2925 LOGICAL,
DIMENSION(size(x, dim = 1)) :: maske
2927 if (
present(mask))
then
2928 shapemask = shape(mask)
2930 shapemask = shape(x)
2932 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2933 stop
'RMSE_dp_1d: shapes of inputs(x,y) or mask are not matching'
2935 if (
present(mask))
then
2940 n =
size(x, dim = 1)
2942 if (n .LE. 1_i4) stop
'RMSE_dp_1d: number of arguments must be at least 2'
2944 rmse_dp_1d = sqrt(mse_dp_1d(x, y, mask = maske))
2946 END FUNCTION rmse_dp_1d
2948 FUNCTION rmse_sp_2d(x, y, mask)
2952 REAL(sp),
DIMENSION(:, :),
INTENT(IN) :: x, y
2953 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
2954 REAL(sp) :: RMSE_sp_2d
2957 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2958 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
2960 if (
present(mask))
then
2961 shapemask = shape(mask)
2963 shapemask = shape(x)
2965 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2966 stop
'RMSE_sp_2d: shapes of inputs(x,y) or mask are not matching'
2968 if (
present(mask))
then
2973 n =
size(x, dim = 1) *
size(x, dim = 2)
2975 if (n .LE. 1_i4) stop
'RMSE_sp_2d: number of arguments must be at least 2'
2977 rmse_sp_2d = sqrt(mse_sp_2d(x, y, mask = maske))
2979 END FUNCTION rmse_sp_2d
2981 FUNCTION rmse_dp_2d(x, y, mask)
2985 REAL(dp),
DIMENSION(:, :),
INTENT(IN) :: x, y
2986 LOGICAL,
DIMENSION(:, :),
OPTIONAL,
INTENT(IN) :: mask
2987 REAL(dp) :: RMSE_dp_2d
2990 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
2991 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske
2993 if (
present(mask))
then
2994 shapemask = shape(mask)
2996 shapemask = shape(x)
2998 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
2999 stop
'RMSE_dp_2d: shapes of inputs(x,y) or mask are not matching'
3001 if (
present(mask))
then
3006 n =
size(x, dim = 1) *
size(x, dim = 2)
3008 if (n .LE. 1_i4) stop
'RMSE_dp_2d: number of arguments must be at least 2'
3010 rmse_dp_2d = sqrt(mse_dp_2d(x, y, mask = maske))
3012 END FUNCTION rmse_dp_2d
3014 FUNCTION rmse_sp_3d(x, y, mask)
3018 REAL(sp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
3019 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
3020 REAL(sp) :: RMSE_sp_3d
3023 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
3024 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), &
size(x, dim = 3)) :: maske
3026 if (
present(mask))
then
3027 shapemask = shape(mask)
3029 shapemask = shape(x)
3031 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
3032 stop
'RMSE_sp_3d: shapes of inputs(x,y) or mask are not matching'
3034 if (
present(mask))
then
3039 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
3041 if (n .LE. 1_i4) stop
'RMSE_sp_3d: number of arguments must be at least 2'
3043 rmse_sp_3d = sqrt(mse_sp_3d(x, y, mask = maske))
3045 END FUNCTION rmse_sp_3d
3047 FUNCTION rmse_dp_3d(x, y, mask)
3051 REAL(dp),
DIMENSION(:, :, :),
INTENT(IN) :: x, y
3052 LOGICAL,
DIMENSION(:, :, :),
OPTIONAL,
INTENT(IN) :: mask
3053 REAL(dp) :: RMSE_dp_3d
3056 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
3057 LOGICAL,
DIMENSION(size(x, dim = 1), size(x, dim = 2), &
size(x, dim = 3)) :: maske
3059 if (
present(mask))
then
3060 shapemask = shape(mask)
3062 shapemask = shape(x)
3064 if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) &
3065 stop
'RMSE_dp_3d: shapes of inputs(x,y) or mask are not matching'
3067 if (
present(mask))
then
3072 n =
size(x, dim = 1) *
size(x, dim = 2) *
size(x, dim = 3)
3074 if (n .LE. 1_i4) stop
'RMSE_dp_3d: number of arguments must be at least 2'
3076 rmse_dp_3d = sqrt(mse_dp_3d(x, y, mask = maske))
3078 END FUNCTION rmse_dp_3d
3082 FUNCTION wnse_sp_1d(x, y, mask)
3088 REAL(sp),
DIMENSION(:),
INTENT(IN) :: x, y
3089 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
3090 REAL(sp) :: wNSE_sp_1d
3093 INTEGER(i4),
DIMENSION(size(shape(x))) :: shapemask
3095 REAL(sp),
DIMENSION(size(x)) :: v1, v2, ww
3096 LOGICAL,
DIMENSION(size(x)) :: maske
3098 if (
present(mask))
then
3099 shapemask = shape(mask)
3101 shapemask = shape(x)
3103 if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) &
3104 stop
'wNSE_sp_1d: shapes of inputs(x,y) or mask are not matching'
3106 if (
present(mask))
then
3113 if (n .LE. 1_i4) stop
'wNSE_sp_1d: number of arguments must be at least 2'
3115 xmean =
average(x, mask=maske)
3117 v1 = merge(y - x , 0.0_sp, maske)
3118 v2 = merge(x - xmean, 0.0_sp, maske)
3119 ww = merge(x , 0.0_sp, maske)
3121 wnse_sp_1d = 1.0_sp - dot_product(ww * v1,v1) / dot_product(ww * v2,v2)
3123 END FUNCTION wnse_sp_1d
3125 FUNCTION wnse_dp_1d(x, y, mask)
3131 REAL(dp),
DIMENSION(:),
INTENT(IN) :: x, y
3132 LOGICAL,
DIMENSION(:),
OPTIONAL,
INTENT(IN) :: mask
3133 REAL(dp) :: wNSE_dp_1d
3136 INTEGER(i4),
DIMENSION(size(shape(x)) ) :: shapemask
3138 REAL(dp),
DIMENSION(size(x)) :: v1, v2, ww
3139 LOGICAL,
DIMENSION(size(x)) :: maske
3141 if (
present(mask))
then
3142 shapemask = shape(mask)
3144 shapemask = shape(x)
3146 if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) &
3147 stop
'wNSE_dp_1d: shapes of inputs(x,y) or mask are not matching'
3149 if (
present(mask))
then
3156 if (n .LE. 1_i4) stop
'wNSE_dp_1d: number of arguments must be at least 2'
3158 xmean =
average(x, mask=maske)
3160 v1 = merge(y - x , 0.0_dp, maske)
3161 v2 = merge(x - xmean, 0.0_dp, maske)
3162 ww = merge(x , 0.0_dp, maske)
3164 wnse_dp_1d = 1.0_dp - dot_product(ww * v1,v1) / dot_product(ww * v2,v2)
3166 END FUNCTION wnse_dp_1d
3168 FUNCTION wnse_sp_2d(x, y, mask)
3174 REAL(sp),
DIMENSION(:,:),
INTENT(IN) :: x, y
3175 LOGICAL,
DIMENSION(:,:),
OPTIONAL,
INTENT(IN) :: mask
3176 REAL(sp) :: wNSE_sp_2d
3179 INTEGER(i4),
DIMENSION(size(shape(x)) ) :: shapemask
3181 LOGICAL,
DIMENSION(size(x, dim=1), size(x, dim=2)):: maske
3183 if (
present(mask))
then
3184 shapemask = shape(mask)
3186 shapemask = shape(x)
3188 if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) &
3189 stop
'wNSE_sp_2d: shapes of inputs(x,y) or mask are not matching'
3191 if (
present(mask))
then
3196 n =
size(x, dim=1) *
size(x, dim=2)
3199 if (n .LE. 1_i4) stop
'wNSE_sp_2d: number of arguments must be at least 2'
3201 xmean =
average(reshape(x(:,:), (/
size(x, dim=1)*
size(x, dim=2)/)), &
3202 mask=reshape(maske(:,:), (/
size(x, dim=1)*
size(x, dim=2)/)))
3204 wnse_sp_2d = 1.0_sp - sum(x * (y-x)*(y-x), mask=maske) / sum(x * (x-xmean)*(x-xmean), mask=maske)
3206 END FUNCTION wnse_sp_2d
3208 FUNCTION wnse_dp_2d(x, y, mask)
3214 REAL(dp),
DIMENSION(:,:),
INTENT(IN) :: x, y
3215 LOGICAL,
DIMENSION(:,:),
OPTIONAL,
INTENT(IN) :: mask
3216 REAL(dp) :: wNSE_dp_2d
3219 INTEGER(i4),
DIMENSION(size(shape(x)) ) :: shapemask
3221 LOGICAL,
DIMENSION(size(x, dim=1), size(x, dim=2)):: maske
3223 if (
present(mask))
then
3224 shapemask = shape(mask)
3226 shapemask = shape(x)
3228 if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) &
3229 stop
'wNSE_dp_2d: shapes of inputs(x,y) or mask are not matching'
3231 if (
present(mask))
then
3236 n =
size(x, dim=1) *
size(x, dim=2)
3239 if (n .LE. 1_i4) stop
'wNSE_dp_2d: number of arguments must be at least 2'
3241 xmean =
average(reshape(x(:,:), (/
size(x, dim=1)*
size(x, dim=2)/)), &
3242 mask=reshape(maske(:,:), (/
size(x, dim=1)*
size(x, dim=2)/)))
3244 wnse_dp_2d = 1.0_dp - sum(x * (y-x)*(y-x), mask=maske) / sum(x * (x-xmean)*(x-xmean), mask=maske)
3246 END FUNCTION wnse_dp_2d
3248 FUNCTION wnse_sp_3d(x, y, mask)
3254 REAL(sp),
DIMENSION(:,:,:),
INTENT(IN) :: x, y
3255 LOGICAL,
DIMENSION(:,:,:),
OPTIONAL,
INTENT(IN) :: mask
3256 REAL(sp) :: wNSE_sp_3d
3259 INTEGER(i4),
DIMENSION(size(shape(x)) ) :: shapemask
3261 LOGICAL,
DIMENSION(size(x, dim=1), &
size(x, dim=2), size(x, dim=3)) :: maske
3263 if (
present(mask))
then
3264 shapemask = shape(mask)
3266 shapemask = shape(x)
3268 if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) &
3269 stop
'wNSE_sp_3d: shapes of inputs(x,y) or mask are not matching'
3271 if (
present(mask))
then
3276 n =
size(x, dim=1) *
size(x, dim=2) *
size(x, dim=3)
3279 if (n .LE. 1_i4) stop
'wNSE_sp_3d: number of arguments must be at least 2'
3281 xmean =
average(reshape(x(:,:,:), (/
size(x, dim=1)*
size(x, dim=2)*
size(x, dim=3)/)), &
3282 mask=reshape(maske(:,:,:), (/
size(x, dim=1)*
size(x, dim=2)*
size(x, dim=3)/)))
3284 wnse_sp_3d = 1.0_sp - sum(x * (y-x)*(y-x), mask=maske) / sum(x * (x-xmean)*(x-xmean), mask=maske)
3286 END FUNCTION wnse_sp_3d
3288 FUNCTION wnse_dp_3d(x, y, mask)
3294 REAL(dp),
DIMENSION(:,:,:),
INTENT(IN) :: x, y
3295 LOGICAL,
DIMENSION(:,:,:),
OPTIONAL,
INTENT(IN) :: mask
3296 REAL(dp) :: wNSE_dp_3d
3299 INTEGER(i4),
DIMENSION(size(shape(x)) ) :: shapemask
3301 LOGICAL,
DIMENSION(size(x, dim=1), &
size(x, dim=2), size(x, dim=3)) :: maske
3303 if (
present(mask))
then
3304 shapemask = shape(mask)
3306 shapemask = shape(x)
3308 if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) &
3309 stop
'wNSE_dp_3d: shapes of inputs(x,y) or mask are not matching'
3311 if (
present(mask))
then
3316 n =
size(x, dim=1) *
size(x, dim=2) *
size(x, dim=3)
3319 if (n .LE. 1_i4) stop
'wNSE_dp_3d: number of arguments must be at least 2'
3321 xmean =
average(reshape(x(:,:,:), (/
size(x, dim=1)*
size(x, dim=2)*
size(x, dim=3)/)), &
3322 mask=reshape(maske(:,:,:), (/
size(x, dim=1)*
size(x, dim=2)*
size(x, dim=3)/)))
3324 wnse_dp_3d = 1.0_dp - sum(x * (y-x)*(y-x), mask=maske) / sum(x * (x-xmean)*(x-xmean), mask=maske)
3326 END FUNCTION wnse_dp_3d
Kling-Gupta-Efficiency measure.
Kling-Gupta-Efficiency measure without correlation.
Logarithmic Nash Sutcliffe Efficiency.
Nash Sutcliffe Efficiency.
weighted Nash Sutcliffe Efficiency.
Correlation between two vectors.
Standard deviation of a vector.
Calculation of error measures.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter i4
4 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.