812
813
814
815
816 integer, intent(in) :: ng, tile
817 integer, intent(in) :: LBi, UBi, LBj, UBj
818
819
820
821 integer :: i, ic, iobs, status, vindex
822 integer :: saved_exit_flag
823
824 integer, dimension(2) :: start, total
825 integer, dimension(NobsVar(ng)) :: Ncount, is
826
827 integer, dimension(Ndatum(ng)) :: obs_type
828 integer, dimension(Ndatum(ng)) :: provenance
829 integer, dimension(Nsurvey(ng)) :: survey_Nobs
830
831 real(r8) :: cff1, cff2
832 real(r8), parameter :: IniVal = 0.0_r8
833
834 real(r8), dimension(NobsVar(ng)) :: CC, MB, MSE, SDE
835 real(r8), dimension(NobsVar(ng)) :: mod_min, mod_max
836 real(r8), dimension(NobsVar(ng)) :: mod_mean, mod_std
837 real(r8), dimension(NobsVar(ng)) :: obs_min, obs_max
838 real(r8), dimension(NobsVar(ng)) :: obs_mean, obs_std
839
840 real(r8), dimension(Ndatum(ng)) :: mod_value
841 real(r8), dimension(Ndatum(ng)) :: obs_depths
842 real(r8), dimension(Ndatum(ng)) :: obs_scale
843 real(dp), dimension(Ndatum(ng)) :: obs_time
844 real(r8), dimension(Ndatum(ng)) :: obs_value
845 real(r8), dimension(Ndatum(ng)) :: obs_Xgrid
846 real(r8), dimension(Ndatum(ng)) :: obs_Ygrid
847 real(r8), dimension(Ndatum(ng)) :: obs_work
848 real(dp), dimension(Nsurvey(ng)) :: survey
849
850 character (len=11), dimension(NobsVar(ng)) :: text, svar_name
851
852 character (len=30) :: F1, F2, F3, F4
853
854 character (len=*), parameter :: MyFile = &
855 & __FILE__//", stats_modobs_pio"
856
857 sourcefile=myfile
858
859
860
861
862
863
864
865
866 IF ((exit_flag.eq.1).or.(blowup.gt.0)) THEN
867 saved_exit_flag=exit_flag;
868 exit_flag=noerror
869 ELSE
870 saved_exit_flag=noerror;
871 END IF
872
873
874
875 CALL pio_netcdf_inq_var (ng, inlm, obs(ng)%name, &
876 & piofile = obs(ng)%pioFile)
877 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
878
879
880
881 CALL pio_netcdf_get_ivar (ng, inlm, obs(ng)%name, &
882 & vname(1,idnobs), survey_nobs, &
883 & piofile = obs(ng)%pioFile, &
884 & start = (/1/), &
885 & total = (/nsurvey(ng)/))
886 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
887
888 CALL pio_netcdf_put_ivar (ng, inlm, dav(ng)%name, &
889 & vname(1,idnobs), survey_nobs, &
890 & (/1/), (/nsurvey(ng)/), &
891 & piofile = dav(ng)%pioFile)
892 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
893
894
895
896 CALL pio_netcdf_get_time (ng, inlm, obs(ng)%name, &
897 & vname(1,idoday), &
898 & rclock%DateNumber, survey, &
899 & piofile = obs(ng)%pioFile, &
900 & start = (/1/), &
901 & total = (/nsurvey(ng)/))
902 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
903
904 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
905 & vname(1,idoday), survey, &
906 & (/1/), (/nsurvey(ng)/), &
907 & piofile = dav(ng)%pioFile)
908 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
909
910
911
912 CALL pio_netcdf_get_ivar (ng, inlm, obs(ng)%name, &
913 & vname(1,idotyp), obs_type, &
914 & piofile = obs(ng)%pioFile, &
915 & start = (/1/), &
916 & total = (/ndatum(ng)/))
917 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
918
919 CALL pio_netcdf_put_ivar (ng, inlm, dav(ng)%name, &
920 & vname(1,idotyp), obs_type, &
921 & (/1/), (/ndatum(ng)/), &
922 & piofile = dav(ng)%pioFile)
923 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
924
925
926
927 CALL pio_netcdf_get_ivar (ng, inlm, obs(ng)%name, &
928 & vname(1,idopro), provenance, &
929 & piofile = obs(ng)%pioFile, &
930 & start = (/1/), &
931 & total = (/ndatum(ng)/))
932 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
933
934 CALL pio_netcdf_put_ivar (ng, inlm, dav(ng)%name, &
935 & vname(1,idopro), provenance, &
936 & (/1/), (/ndatum(ng)/), &
937 & piofile = dav(ng)%pioFile)
938 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
939
940
941
942 CALL pio_netcdf_get_time (ng, inlm, obs(ng)%name, &
943 & vname(1,idobst), &
944 & rclock%DateNumber, obs_time, &
945 & piofile = obs(ng)%pioFile, &
946 & start = (/1/), &
947 & total = (/ndatum(ng)/))
948 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
949
950 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
951 & vname(1,idobst), obs_time, &
952 & (/1/), (/ndatum(ng)/), &
953 & piofile = dav(ng)%pioFile)
954 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
955
956
957
958 IF (find_string(var_name,n_var,vname(1,idolon),vindex)) THEN
959 CALL pio_netcdf_get_fvar (ng, inlm, obs(ng)%name, &
960 & vname(1,idolon), obs_work, &
961 & piofile = obs(ng)%pioFile, &
962 & start = (/1/), &
963 & total = (/ndatum(ng)/))
964 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
965
966 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
967 & vname(1,idolon), obs_work, &
968 & (/1/), (/ndatum(ng)/), &
969 & piofile = dav(ng)%pioFile)
970 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
971 END IF
972
973
974
975 IF (find_string(var_name,n_var,vname(1,idolon),vindex)) THEN
976 CALL pio_netcdf_get_fvar (ng, inlm, obs(ng)%name, &
977 & vname(1,idolat), obs_work, &
978 & piofile = obs(ng)%pioFile, &
979 & start = (/1/), &
980 & total = (/ndatum(ng)/))
981 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
982
983 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
984 & vname(1,idolat), obs_work, &
985 & (/1/), (/ndatum(ng)/), &
986 & piofile = dav(ng)%pioFile)
987 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
988 END IF
989
990
991
992 CALL pio_netcdf_get_fvar (ng, inlm, obs(ng)%name, &
993 & vname(1,idobsd), obs_depths, &
994 & piofile = obs(ng)%pioFile, &
995 & start = (/1/), &
996 & total = (/ndatum(ng)/))
997 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
998
999
1000
1001 CALL pio_netcdf_get_fvar (ng, inlm, obs(ng)%name, &
1002 & vname(1,idobsx), obs_xgrid, &
1003 & piofile = obs(ng)%pioFile, &
1004 & start = (/1/), &
1005 & total = (/ndatum(ng)/))
1006 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1007
1008 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1009 & vname(1,idobsx), obs_xgrid, &
1010 & (/1/), (/ndatum(ng)/), &
1011 & piofile = dav(ng)%pioFile)
1012 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1013
1014
1015
1016 CALL pio_netcdf_get_fvar (ng, inlm, obs(ng)%name, &
1017 & vname(1,idobsy), obs_ygrid, &
1018 & piofile = obs(ng)%pioFile, &
1019 & start = (/1/), &
1020 & total = (/ndatum(ng)/))
1021 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1022
1023 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1024 & vname(1,idobsy), obs_ygrid, &
1025 & (/1/), (/ndatum(ng)/), &
1026 & piofile = dav(ng)%pioFile)
1027 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1028
1029
1030
1031
1032 CALL pio_netcdf_get_fvar (ng, inlm, obs(ng)%name, &
1033 & vname(1,idoerr), obs_work, &
1034 & piofile = obs(ng)%pioFile, &
1035 & start = (/1/), &
1036 & total = (/ndatum(ng)/))
1037 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1038
1039 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1040 & vname(1,idoerr), obs_work, &
1041 & (/1/), (/ndatum(ng)/), &
1042 & piofile = dav(ng)%pioFile)
1043 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1044
1045
1046
1047 CALL pio_netcdf_get_fvar (ng, inlm, obs(ng)%name, &
1048 & vname(1,idoval), obs_value, &
1049 & piofile = obs(ng)%pioFile, &
1050 & start = (/1/), &
1051 & total = (/ndatum(ng)/))
1052 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1053
1054 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1055 & vname(1,idoval), obs_value, &
1056 & (/1/), (/ndatum(ng)/), &
1057 & piofile = dav(ng)%pioFile)
1058 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1059
1060
1061
1062 IF (haveobsmeta(ng)) THEN
1063 CALL pio_netcdf_get_fvar (ng, inlm, obs(ng)%name, &
1064 & vname(1,idomet), obs_work, &
1065 & piofile = obs(ng)%pioFile, &
1066 & start = (/1/), &
1067 & total = (/ndatum(ng)/))
1068 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1069
1070 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1071 & vname(1,idomet), obs_work, &
1072 & (/1/), (/ndatum(ng)/), &
1073 & piofile = dav(ng)%pioFile)
1074 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1075 END IF
1076
1077
1078
1079 CALL pio_netcdf_get_fvar (ng, inlm, dav(ng)%name, &
1080 & vname(1,idobss), obs_scale, &
1081 & piofile = dav(ng)%pioFile, &
1082 & start = (/1/), &
1083 & total = (/ndatum(ng)/))
1084 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1085
1086
1087
1088# if defined R4DVAR || defined R4DVAR_ANA_SENSITIVITY || \
1089 defined tl_r4dvar
1090 CALL pio_netcdf_get_fvar (ng, inlm, dav(ng)%name, &
1091 & vname(1,idtlmo), mod_value, &
1092 & piofile = dav(ng)%pioFile, &
1093 & start = (/1/), &
1094 & total = (/ndatum(ng)/))
1095# else
1096# ifdef VERIFICATION
1097 CALL pio_netcdf_get_fvar (ng, inlm, dav(ng)%name, &
1098 & vname(1,idnlmo), mod_value, &
1099 & piofile = dav(ng)%pioFile, &
1100 & start = (/1/), &
1101 & total = (/ndatum(ng)/))
1102# elif !defined I4DVAR_ANA_SENSITIVITY
1103 CALL pio_netcdf_get_fvar (ng, inlm, dav(ng)%name, &
1104 & vname(1,idnlmo), mod_value, &
1105 & piofile = dav(ng)%pioFile, &
1106 & start = (/1,max(1,outer)/), &
1107 & total = (/ndatum(ng),1/))
1108# endif
1109# endif
1110 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1111
1112
1113
1114
1115
1116
1117 obs_work(1:ndatum(ng))=inival
1118
1119 CALL obs_k2z (ng, 0, lm(ng)+1, 0, mm(ng)+1, &
1120 & lbi, ubi, lbj, ubj, 0, n(ng), &
1121 & rxmin(ng), rxmax(ng), &
1122 & rymin(ng), rymax(ng), &
1123 & ndatum(ng), &
1124 & obs_xgrid, obs_ygrid, obs_depths, obs_scale, &
1125 & grid(ng) % z0_w, &
1126 & obs_work)
1127
1128# ifdef DISTRIBUTE
1129
1130
1131
1132 CALL mp_collect (ng, inlm, ndatum(ng), inival, obs_work)
1133# endif
1134
1135
1136
1137 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, vname(1,idobsd), &
1138 & obs_work, (/1/), (/ndatum(ng)/), &
1139 & piofile = dav(ng)%pioFile)
1140 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1141
1142# if defined RBL4DVAR_ANA_SENSITIVITY || \
1143 defined rbl4dvar_fct_sensitivity || \
1144 defined r4dvar_ana_sensitivity
1145
1146
1147
1148
1149
1150
1151
1152
1153 CALL pio_netcdf_inq_var (ng, inlm, lcz(ng)%name)
1154 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1155
1156
1157
1158 IF (find_string(var_name,n_var,vname(1,idinno),vindex)) THEN
1159 CALL pio_netcdf_get_fvar (ng, inlm, lcz(ng)%name, &
1160 & vname(1,idinno), obs_work, &
1161 & start = (/1/), &
1162 & total = (/ndatum(ng)/))
1163 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1164
1165 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1166 & vname(1,idinno), obs_work, &
1167 & (/1/), (/ndatum(ng)/), &
1168 & piofile = dav(ng)%pioFile)
1169 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1170 END IF
1171
1172
1173
1174 IF (find_string(var_name,n_var,vname(1,idincr),vindex)) THEN
1175 CALL pio_netcdf_get_fvar (ng, inlm, lcz(ng)%name, &
1176 & vname(1,idincr), obs_work, &
1177 & start = (/1/), &
1178 & total = (/ndatum(ng)/))
1179 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1180
1181 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1182 & vname(1,idincr), obs_work, &
1183 & (/1/), (/ndatum(ng)/), &
1184 & piofile = dav(ng)%pioFile)
1185 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1186 END IF
1187
1188
1189
1190 IF (find_string(var_name,n_var,vname(1,idresi),vindex)) THEN
1191 CALL pio_netcdf_get_fvar (ng, inlm, lcz(ng)%name, &
1192 & vname(1,idresi), obs_work, &
1193 & start = (/1/), &
1194 & total = (/ndatum(ng)/))
1195 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1196
1197 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1198 & vname(1,idresi), obs_work, &
1199 & (/1/), (/ndatum(ng)/), &
1200 & piofile = dav(ng)%pioFile)
1201 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1202 END IF
1203
1204
1205
1206 IF (find_string(var_name,n_var,vname(1,idmomi),vindex)) THEN
1207 CALL pio_netcdf_get_fvar (ng, inlm, lcz(ng)%name, &
1208 & vname(1,idmomi), obs_work, &
1209 & start = (/1/), &
1210 & total = (/ndatum(ng)/))
1211 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1212
1213 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1214 & vname(1,idmomi), obs_work, &
1215 & (/1/), (/ndatum(ng)/), &
1216 & piofile = dav(ng)%pioFile)
1217 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1218 END IF
1219
1220
1221
1222 IF (find_string(var_name,n_var,vname(1,idmomf),vindex)) THEN
1223 CALL pio_netcdf_get_fvar (ng, inlm, lcz(ng)%name, &
1224 & vname(1,idmomf), obs_work, &
1225 & start = (/1/), &
1226 & total = (/ndatum(ng)/))
1227 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1228
1229 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1230 & vname(1,idmomf), obs_work, &
1231 & (/1/), (/ndatum(ng)/), &
1232 & piofile = dav(ng)%pioFile)
1233 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1234 END IF
1235
1236
1237
1238 IF (find_string(var_name,n_var,vname(1,idnlmp),vindex)) THEN
1239 CALL pio_netcdf_get_fvar (ng, inlm, lcz(ng)%name, &
1240 & vname(1,idnlmp), obs_work, &
1241 & start = (/1/), &
1242 & total = (/ndatum(ng)/))
1243 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1244
1245 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1246 & vname(1,idnlmp), obs_work, &
1247 & (/1/), (/ndatum(ng)/), &
1248 & piofile = dav(ng)%pioFile)
1249 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1250 END IF
1251
1252
1253
1254 IF (find_string(var_name,n_var,vname(1,idnlmf),vindex)) THEN
1255 CALL pio_netcdf_get_fvar (ng, inlm, lcz(ng)%name, &
1256 & vname(1,idnlmf), obs_work, &
1257 & start = (/1/), &
1258 & total = (/ndatum(ng)/))
1259 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1260
1261 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1262 & vname(1,idnlmf), obs_work, &
1263 & (/1/), (/ndatum(ng)/), &
1264 & piofile = dav(ng)%pioFile)
1265 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1266 END IF
1267
1268
1269
1270 IF (find_string(var_name,n_var,vname(1,idnlmu),vindex)) THEN
1271 DO i=1,nouter
1272 CALL pio_netcdf_get_fvar (ng, inlm, lcz(ng)%name, &
1273 & vname(1,idnlmu), obs_work, &
1274 & start = (/1,i/), &
1275 total = (/ndatum(ng),1/))
1276 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1277
1278 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1279 & vname(1,idnlmu), obs_work, &
1280 & (/1,i/), (/ndatum(ng),1/), &
1281 & piofile = dav(ng)%pioFile)
1282 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1283 END DO
1284 END IF
1285
1286
1287
1288 IF (find_string(var_name,n_var,vname(1,idnlmo),vindex)) THEN
1289 DO i=1,nouter
1290 CALL pio_netcdf_get_fvar (ng, inlm, lcz(ng)%name, &
1291 & vname(1,idnlmo), obs_work, &
1292 & start = (/1,i/), &
1293 total = (/ndatum(ng),1/))
1294 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1295
1296 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1297 & vname(1,idnlmo), obs_work, &
1298 & (/1,i/), (/ndatum(ng),1/), &
1299 & piofile = dav(ng)%pioFile)
1300 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1301 END DO
1302 END IF
1303# endif
1304
1305# if defined I4DVAR || defined RBL4DVAR || \
1306 defined r4dvar || defined sp4dvar || \
1307 defined split_i4dvar || defined split_rbl4dvar || \
1308 defined split_r4dvar || defined split_sp4dvar || \
1309 defined verification
1310
1311
1312
1313
1314
1315
1316
1317 IF (saved_exit_flag.eq.noerror) THEN
1318 DO i=1,nobsvar(ng)
1319 cc(i)=0.0_r8
1320 mb(i)=0.0_r8
1321 mse(i)=0.0_r8
1322 sde(i)=0.0_r8
1323 mod_min(i)=large
1324 mod_max(i)=-large
1325 mod_mean(i)=0.0_r8
1326 obs_min(i)=large
1327 obs_max(i)=-large
1328 obs_mean(i)=0.0_r8
1329 mod_std(i)=0.0_r8
1330 obs_std(i)=0.0_r8
1331 ncount(i)=0
1332 END DO
1333
1334
1335
1336 DO iobs=1,ndatum(ng)
1337 IF (obs_scale(iobs).eq.1.0_r8) THEN
1338 i=obstype2state(obs_type(iobs))
1339 ncount(i)=ncount(i)+1
1340 mod_min(i)=min(mod_min(i),mod_value(iobs))
1341 obs_min(i)=min(obs_min(i),obs_value(iobs))
1342 mod_max(i)=max(mod_max(i),mod_value(iobs))
1343 obs_max(i)=max(obs_max(i),obs_value(iobs))
1344 mod_mean(i)=mod_mean(i)+mod_value(iobs)
1345 obs_mean(i)=obs_mean(i)+obs_value(iobs)
1346 END IF
1347 END DO
1348 DO i=1,nobsvar(ng)
1349 IF (ncount(i).gt.0) THEN
1350 mod_mean(i)=mod_mean(i)/real(ncount(i),r8)
1351 obs_mean(i)=obs_mean(i)/real(ncount(i),r8)
1352 END IF
1353 END DO
1354
1355
1356
1357
1358 DO iobs=1,ndatum(ng)
1359 IF (obs_scale(iobs).eq.1.0_r8) THEN
1360 i=obstype2state(obs_type(iobs))
1361 cff1=mod_value(iobs)-mod_mean(i)
1362 cff2=obs_value(iobs)-obs_mean(i)
1363 mod_std(i)=mod_std(i)+cff1*cff1
1364 obs_std(i)=obs_std(i)+cff2*cff2
1365 cc(i)=cc(i)+cff1*cff2
1366 END IF
1367 END DO
1368 DO i=1,nobsvar(ng)
1369 IF (ncount(i).gt.1) THEN
1370 mod_std(i)=sqrt(mod_std(i)/real(ncount(i)-1,r8))
1371 obs_std(i)=sqrt(obs_std(i)/real(ncount(i)-1,r8))
1372 cc(i)=(cc(i)/real(ncount(i),r8))/(mod_std(i)*obs_std(i))
1373 END IF
1374 END DO
1375
1376
1377
1378
1379 DO i=1,nobsvar(ng)
1380 IF (ncount(i).gt.0) THEN
1381 mb(i)=mod_mean(i)-obs_mean(i)
1382 sde(i)=mod_std(i)-obs_std(i)
1383 mse(i)=mb(i)*mb(i)+ &
1384 & sde(i)*sde(i)+ &
1385 & 2.0_r8*mod_std(i)*obs_std(i)*(1.0_r8-cc(i))
1386 END IF
1387 END DO
1388
1389
1390
1391
1392 IF (master) THEN
1393 ic=0
1394 DO i=1,nobsvar(ng)
1395 svar_name(i)=' '
1396 text(i)=' '
1397 IF (ncount(i).gt.0) THEN
1398 ic=ic+1
1399 is(ic)=i
1400 svar_name(ic)=trim(obsname(i))
1401 text(ic)='-----------'
1402 END IF
1403 END DO
1404 WRITE(f1,10) max(1,ic)
1405 WRITE(f2,20) max(1,ic)
1406 WRITE(f3,30) max(1,ic)
1407 WRITE(f4,40) max(1,ic)
1408 WRITE(stdout,50)
1409 WRITE(stdout,f1) (svar_name(i),i=1,ic)
1410 WRITE(stdout,f2) (text(i),i=1,ic)
1411 WRITE(stdout,f3) 'Observation Min ',(obs_min(is(i)),i=1,ic)
1412 WRITE(stdout,f3) 'Observation Max ',(obs_max(is(i)),i=1,ic)
1413 WRITE(stdout,f3) 'Observation Mean ',(obs_mean(is(i)),i=1,ic)
1414 WRITE(stdout,f3) 'Observation STD ',(obs_std(is(i)),i=1,ic)
1415 WRITE(stdout,f3) 'Model Min ',(mod_min(is(i)),i=1,ic)
1416 WRITE(stdout,f3) 'Model Max ',(mod_max(is(i)),i=1,ic)
1417 WRITE(stdout,f3) 'Model Mean ',(mod_mean(is(i)),i=1,ic)
1418 WRITE(stdout,f3) 'Model STD ',(mod_std(is(i)),i=1,ic)
1419 WRITE(stdout,f3) 'Model Bias ',(mb(is(i)),i=1,ic)
1420 WRITE(stdout,f3) 'STD Error ',(sde(is(i)),i=1,ic)
1421 WRITE(stdout,f3) 'Cross-Correlation ',(cc(is(i)),i=1,ic)
1422 WRITE(stdout,f3) 'Mean Squared Error',(mse(is(i)),i=1,ic)
1423 WRITE(stdout,f4) 'Observation Count ',(ncount(is(i)),i=1,ic)
1424 END IF
1425
1426
1427
1428 CALL pio_netcdf_put_ivar (ng, inlm, dav(ng)%name, &
1429 & 'Nused_obs', ncount, &
1430 & (/1/), (/nobsvar(ng)/), &
1431 & piofile = dav(ng)%pioFile)
1432 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1433
1434 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1435 & 'obs_mean', obs_mean, &
1436 & (/1/), (/nobsvar(ng)/), &
1437 & piofile = dav(ng)%pioFile)
1438 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1439
1440 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1441 & 'obs_std', obs_std, &
1442 & (/1/), (/nobsvar(ng)/), &
1443 & piofile = dav(ng)%pioFile)
1444 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1445
1446 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1447 & 'model_mean', mod_mean, &
1448 & (/1/), (/nobsvar(ng)/), &
1449 & piofile = dav(ng)%pioFile)
1450 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1451
1452 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1453 & 'model_std', mod_std, &
1454 & (/1/), (/nobsvar(ng)/), &
1455 & piofile = dav(ng)%pioFile)
1456 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1457
1458 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1459 & 'model_bias', mb, &
1460 & (/1/), (/nobsvar(ng)/), &
1461 & piofile = dav(ng)%pioFile)
1462 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1463
1464 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1465 & 'SDE', sde, &
1466 & (/1/), (/nobsvar(ng)/), &
1467 & piofile = dav(ng)%pioFile)
1468 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1469
1470 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1471 & 'CC', cc, &
1472 & (/1/), (/nobsvar(ng)/), &
1473 & piofile = dav(ng)%pioFile)
1474 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1475
1476 CALL pio_netcdf_put_fvar (ng, inlm, dav(ng)%name, &
1477 & 'MSE', mse, &
1478 & (/1/), (/nobsvar(ng)/), &
1479 & piofile = dav(ng)%pioFile)
1480 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1481 END IF
1482# endif
1483
1484
1485
1486 CALL pio_netcdf_sync (ng, inlm, dav(ng)%name, dav(ng)%pioFile)
1487 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1488
1489
1490
1491 exit_flag=saved_exit_flag
1492
1493 10 FORMAT ('(t22,',i2,'(a11,1x))')
1494 20 FORMAT ('(t22,',i2,'(a11,1x),/)')
1495 30 FORMAT ('(a,3x,',i2,'(1p,e11.4,0p,1x))')
1496 40 FORMAT ('(a,3x,',i2,'(i11,1x))')
1497 50 FORMAT (/,' Model-Observations Comparison Statistics:',/)
1498
1499 RETURN