- Timestamp:
- 2017-03-09T13:52:43+01:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_prep.F90
- Property svn:keywords deleted
r5785 r7773 24 24 USE obs_inter_sup ! Interpolation support 25 25 USE obs_oper ! Observation operators 26 #if defined key_bdy 27 USE bdy_oce, ONLY : & ! Boundary information 28 idx_bdy, nb_bdy 29 #endif 26 30 USE lib_mpp, ONLY : & 27 31 & ctl_warn, ctl_stop … … 45 49 CONTAINS 46 50 47 SUBROUTINE obs_pre_surf( surfdata, surfdataqc, ld_nea )51 SUBROUTINE obs_pre_surf( surfdata, surfdataqc, ld_nea, ld_bound_reject ) 48 52 !!---------------------------------------------------------------------- 49 53 !! *** ROUTINE obs_pre_sla *** … … 72 76 !! * Arguments 73 77 TYPE(obs_surf), INTENT(INOUT) :: surfdata ! Full set of surface data 74 TYPE(obs_surf), INTENT(INOUT) :: surfdataqc ! Subset of surface data not failing screening 75 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 78 TYPE(obs_surf), INTENT(INOUT) :: surfdataqc ! Subset of surface data not failing screening 79 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 80 LOGICAL, INTENT(IN) :: ld_bound_reject ! Switch for rejecting obs near the boundary 76 81 !! * Local declarations 77 82 INTEGER :: iyea0 ! Initial date … … 87 92 INTEGER :: inlasobs ! - close to land 88 93 INTEGER :: igrdobs ! - fail the grid search 94 INTEGER :: ibdysobs ! - close to open boundary 89 95 ! Global counters for observations that 90 96 INTEGER :: iotdobsmpp ! - outside time domain … … 93 99 INTEGER :: inlasobsmpp ! - close to land 94 100 INTEGER :: igrdobsmpp ! - fail the grid search 101 INTEGER :: ibdysobsmpp ! - close to open boundary 95 102 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 96 103 & llvalid ! SLA data selection … … 118 125 ilansobs = 0 119 126 inlasobs = 0 127 ibdysobs = 0 120 128 121 129 ! ----------------------------------------------------------------------- … … 151 159 & tmask(:,:,1), surfdata%nqc, & 152 160 & iosdsobs, ilansobs, & 153 & inlasobs, ld_nea ) 161 & inlasobs, ld_nea, & 162 & ibdysobs, ld_bound_reject ) 154 163 155 164 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 156 165 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 157 166 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 167 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 158 168 159 169 ! ----------------------------------------------------------------------- … … 201 211 & inlasobsmpp 202 212 ENDIF 213 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data near open boundary (removed) = ', & 214 & ibdysobsmpp 203 215 WRITE(numout,*) ' '//surfdataqc%cvars(1)//' data accepted = ', & 204 216 & surfdataqc%nsurfmpp … … 236 248 & kpi, kpj, kpk, & 237 249 & zmask1, pglam1, pgphi1, zmask2, pglam2, pgphi2, & 238 & ld_nea, kdailyavtypes )250 & ld_nea, ld_bound_reject, kdailyavtypes ) 239 251 240 252 !!---------------------------------------------------------------------- … … 265 277 LOGICAL, INTENT(IN) :: ld_var2 266 278 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 279 LOGICAL, INTENT(IN) :: ld_bound_reject ! Switch for rejecting observations near the boundary 267 280 INTEGER, INTENT(IN) :: kpi, kpj, kpk ! Local domain sizes 268 281 INTEGER, DIMENSION(imaxavtypes), OPTIONAL :: & … … 292 305 INTEGER :: inlav1obs ! - close to land (variable 1) 293 306 INTEGER :: inlav2obs ! - close to land (variable 2) 307 INTEGER :: ibdyv1obs ! - boundary (variable 1) 308 INTEGER :: ibdyv2obs ! - boundary (variable 2) 294 309 INTEGER :: igrdobs ! - fail the grid search 295 310 INTEGER :: iuvchku ! - reject u if v rejected and vice versa … … 303 318 INTEGER :: inlav1obsmpp ! - close to land (variable 1) 304 319 INTEGER :: inlav2obsmpp ! - close to land (variable 2) 320 INTEGER :: ibdyv1obsmpp ! - boundary (variable 1) 321 INTEGER :: ibdyv2obsmpp ! - boundary (variable 2) 305 322 INTEGER :: igrdobsmpp ! - fail the grid search 306 323 INTEGER :: iuvchkumpp ! - reject var1 if var2 rejected and vice versa … … 328 345 ! Diagnotics counters for various failures. 329 346 330 iotdobs = 0331 igrdobs = 0347 iotdobs = 0 348 igrdobs = 0 332 349 iosdv1obs = 0 333 350 iosdv2obs = 0 … … 336 353 inlav1obs = 0 337 354 inlav2obs = 0 338 iuvchku = 0 339 iuvchkv = 0 355 ibdyv1obs = 0 356 ibdyv2obs = 0 357 iuvchku = 0 358 iuvchkv = 0 340 359 341 360 ! ----------------------------------------------------------------------- … … 395 414 & gdept_1d, zmask1, & 396 415 & profdata%nqc, profdata%var(1)%nvqc, & 397 & iosdv1obs, ilanv1obs, & 398 & inlav1obs, ld_nea ) 416 & iosdv1obs, ilanv1obs, & 417 & inlav1obs, ld_nea, & 418 & ibdyv1obs, ld_bound_reject ) 399 419 400 420 CALL obs_mpp_sum_integer( iosdv1obs, iosdv1obsmpp ) 401 421 CALL obs_mpp_sum_integer( ilanv1obs, ilanv1obsmpp ) 402 422 CALL obs_mpp_sum_integer( inlav1obs, inlav1obsmpp ) 423 CALL obs_mpp_sum_integer( ibdyv1obs, ibdyv1obsmpp ) 403 424 404 425 ! Variable 2 … … 414 435 & gdept_1d, zmask2, & 415 436 & profdata%nqc, profdata%var(2)%nvqc, & 416 & iosdv2obs, ilanv2obs, & 417 & inlav2obs, ld_nea ) 437 & iosdv2obs, ilanv2obs, & 438 & inlav2obs, ld_nea, & 439 & ibdyv2obs, ld_bound_reject ) 418 440 419 441 CALL obs_mpp_sum_integer( iosdv2obs, iosdv2obsmpp ) 420 442 CALL obs_mpp_sum_integer( ilanv2obs, ilanv2obsmpp ) 421 443 CALL obs_mpp_sum_integer( inlav2obs, inlav2obsmpp ) 444 CALL obs_mpp_sum_integer( ibdyv2obs, ibdyv2obsmpp ) 422 445 423 446 ! ----------------------------------------------------------------------- … … 489 512 & iuvchku 490 513 ENDIF 514 WRITE(numout,*) ' Remaining '//prodatqc%cvars(1)//' data near open boundary (removed) = ',& 515 & ibdyv1obsmpp 491 516 WRITE(numout,*) ' '//prodatqc%cvars(1)//' data accepted = ', & 492 517 & prodatqc%nvprotmpp(1) … … 506 531 & iuvchkv 507 532 ENDIF 533 WRITE(numout,*) ' Remaining '//prodatqc%cvars(2)//' data near open boundary (removed) = ',& 534 & ibdyv2obsmpp 508 535 WRITE(numout,*) ' '//prodatqc%cvars(2)//' data accepted = ', & 509 536 & prodatqc%nvprotmpp(2) … … 875 902 & plam, pphi, pmask, & 876 903 & kobsqc, kosdobs, klanobs, & 877 & knlaobs,ld_nea ) 904 & knlaobs,ld_nea, & 905 & kbdyobs,ld_bound_reject ) 878 906 !!---------------------------------------------------------------------- 879 907 !! *** ROUTINE obs_coo_spc_2d *** … … 908 936 INTEGER, DIMENSION(kobsno), INTENT(INOUT) :: & 909 937 & kobsqc ! Observation quality control 910 INTEGER, INTENT(INOUT) :: kosdobs ! Observations outside space domain 911 INTEGER, INTENT(INOUT) :: klanobs ! Observations within a model land cell 912 INTEGER, INTENT(INOUT) :: knlaobs ! Observations near land 913 LOGICAL, INTENT(IN) :: ld_nea ! Flag observations near land 938 INTEGER, INTENT(INOUT) :: kosdobs ! Observations outside space domain 939 INTEGER, INTENT(INOUT) :: klanobs ! Observations within a model land cell 940 INTEGER, INTENT(INOUT) :: knlaobs ! Observations near land 941 INTEGER, INTENT(INOUT) :: kbdyobs ! Observations near boundary 942 LOGICAL, INTENT(IN) :: ld_nea ! Flag observations near land 943 LOGICAL, INTENT(IN) :: ld_bound_reject ! Flag observations near open boundary 914 944 !! * Local declarations 915 945 REAL(KIND=wp), DIMENSION(2,2,kobsno) :: & 916 946 & zgmsk ! Grid mask 947 #if defined key_bdy 948 REAL(KIND=wp), DIMENSION(2,2,kobsno) :: & 949 & zbmsk ! Boundary mask 950 REAL(KIND=wp), DIMENSION(jpi,jpj) :: zbdymask 951 #endif 917 952 REAL(KIND=wp), DIMENSION(2,2,kobsno) :: & 918 953 & zglam, & ! Model longitude at grid points … … 956 991 957 992 END DO 993 994 #if defined key_bdy 995 ! Create a mask grid points in boundary rim 996 IF (ld_bound_reject) THEN 997 zbdymask(:,:) = 1.0_wp 998 DO ji = 1, nb_bdy 999 DO jj = 1, idx_bdy(ji)%nblen(1) 1000 zbdymask(idx_bdy(ji)%nbi(jj,1),idx_bdy(ji)%nbj(jj,1)) = 0.0_wp 1001 ENDDO 1002 ENDDO 1003 1004 CALL obs_int_comm_2d( 2, 2, kobsno, igrdi, igrdj, zbdymask, zbmsk ) 1005 ENDIF 1006 #endif 958 1007 959 1008 CALL obs_int_comm_2d( 2, 2, kobsno, kpi, kpj, igrdi, igrdj, pmask, zgmsk ) … … 1000 1049 END DO 1001 1050 END DO 1002 1003 ! For observations on the grid reject them if their are at 1004 ! a masked point 1005 1051 1006 1052 IF (lgridobs) THEN 1007 1053 IF (zgmsk(iig,ijg,jobs) == 0.0_wp ) THEN … … 1011 1057 ENDIF 1012 1058 ENDIF 1013 1059 1060 1014 1061 ! Flag if the observation falls is close to land 1015 1062 IF ( MINVAL( zgmsk(1:2,1:2,jobs) ) == 0.0_wp) THEN 1016 IF (ld_nea) kobsqc(jobs) = kobsqc(jobs) + 141017 1063 knlaobs = knlaobs + 1 1018 CYCLE 1019 ENDIF 1064 IF (ld_nea) THEN 1065 kobsqc(jobs) = kobsqc(jobs) + 14 1066 CYCLE 1067 ENDIF 1068 ENDIF 1069 1070 #if defined key_bdy 1071 ! Flag if the observation falls close to the boundary rim 1072 IF (ld_bound_reject) THEN 1073 IF ( MINVAL( zbmsk(1:2,1:2,jobs) ) == 0.0_wp ) THEN 1074 kobsqc(jobs) = kobsqc(jobs) + 15 1075 kbdyobs = kbdyobs + 1 1076 CYCLE 1077 ENDIF 1078 ! for observations on the grid... 1079 IF (lgridobs) THEN 1080 IF (zbmsk(iig,ijg,jobs) == 0.0_wp ) THEN 1081 kobsqc(jobs) = kobsqc(jobs) + 15 1082 kbdyobs = kbdyobs + 1 1083 CYCLE 1084 ENDIF 1085 ENDIF 1086 ENDIF 1087 #endif 1020 1088 1021 1089 END DO … … 1029 1097 & plam, pphi, pdep, pmask, & 1030 1098 & kpobsqc, kobsqc, kosdobs, & 1031 & klanobs, knlaobs, ld_nea ) 1099 & klanobs, knlaobs, ld_nea, & 1100 & kbdyobs, ld_bound_reject ) 1032 1101 !!---------------------------------------------------------------------- 1033 1102 !! *** ROUTINE obs_coo_spc_3d *** … … 1052 1121 !! * Modules used 1053 1122 USE dom_oce, ONLY : & ! Geographical information 1054 & gdepw_1d 1123 & gdepw_1d, & 1124 & gdepw_0, & 1125 #if defined key_vvl 1126 & gdepw_n, & 1127 & gdept_n, & 1128 #endif 1129 & ln_zco, & 1130 & ln_zps, & 1131 & lk_vvl 1055 1132 1056 1133 !! * Arguments … … 1086 1163 INTEGER, INTENT(INOUT) :: klanobs ! Observations within a model land cell 1087 1164 INTEGER, INTENT(INOUT) :: knlaobs ! Observations near land 1165 INTEGER, INTENT(INOUT) :: kbdyobs ! Observations near boundary 1088 1166 LOGICAL, INTENT(IN) :: ld_nea ! Flag observations near land 1167 LOGICAL, INTENT(IN) :: ld_bound_reject ! Flag observations near open boundary 1089 1168 !! * Local declarations 1090 1169 REAL(KIND=wp), DIMENSION(2,2,kpk,kprofno) :: & 1091 1170 & zgmsk ! Grid mask 1171 #if defined key_bdy 1172 REAL(KIND=wp), DIMENSION(2,2,kprofno) :: & 1173 & zbmsk ! Boundary mask 1174 REAL(KIND=wp), DIMENSION(jpi,jpj) :: zbdymask 1175 #endif 1176 REAL(KIND=wp), DIMENSION(2,2,kpk,kprofno) :: & 1177 & zgdepw 1092 1178 REAL(KIND=wp), DIMENSION(2,2,kprofno) :: & 1093 1179 & zglam, & ! Model longitude at grid points … … 1097 1183 & igrdj 1098 1184 LOGICAL :: lgridobs ! Is observation on a model grid point. 1185 LOGICAL :: ll_next_to_land ! Is a profile next to land 1099 1186 INTEGER :: iig, ijg ! i,j of observation on model grid point. 1100 1187 INTEGER :: jobs, jobsp, jk, ji, jj … … 1131 1218 1132 1219 END DO 1220 1221 #if defined key_bdy 1222 ! Create a mask grid points in boundary rim 1223 IF (ld_bound_reject) THEN 1224 zbdymask(:,:) = 1.0_wp 1225 DO ji = 1, nb_bdy 1226 DO jj = 1, idx_bdy(ji)%nblen(1) 1227 zbdymask(idx_bdy(ji)%nbi(jj,1),idx_bdy(ji)%nbj(jj,1)) = 0.0_wp 1228 ENDDO 1229 ENDDO 1230 ENDIF 1231 1232 CALL obs_int_comm_2d( 2, 2, kprofno, igrdi, igrdj, zbdymask, zbmsk ) 1233 #endif 1133 1234 1134 1235 CALL obs_int_comm_3d( 2, 2, kprofno, kpi, kpj, kpk, igrdi, igrdj, pmask, zgmsk ) … … 1159 1260 END DO 1160 1261 1262 ! Check if next to land 1263 IF ( ANY( zgmsk(1:2,1:2,1,jobs) == 0.0_wp ) ) THEN 1264 ll_next_to_land=.TRUE. 1265 ELSE 1266 ll_next_to_land=.FALSE. 1267 ENDIF 1268 1161 1269 ! Reject observations 1162 1270 … … 1175 1283 ENDIF 1176 1284 1177 ! Flag if the observation falls with a model land cell 1178 IF ( SUM( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) & 1179 & == 0.0_wp ) THEN 1180 kobsqc(jobsp) = kobsqc(jobsp) + 12 1181 klanobs = klanobs + 1 1182 CYCLE 1285 ! To check if an observations falls within land there are two cases: 1286 ! 1: z-coordibnates, where the check uses the mask 1287 ! 2: terrain following (eg s-coordinates), 1288 ! where we use the depth of the bottom cell to mask observations 1289 1290 IF( (.NOT. lk_vvl) .AND. ( ln_zps .OR. ln_zco ) ) THEN !(CASE 1) 1291 1292 ! Flag if the observation falls with a model land cell 1293 IF ( SUM( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) & 1294 & == 0.0_wp ) THEN 1295 kobsqc(jobsp) = kobsqc(jobsp) + 12 1296 klanobs = klanobs + 1 1297 CYCLE 1298 ENDIF 1299 1300 ! Flag if the observation is close to land 1301 IF ( MINVAL( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) == & 1302 & 0.0_wp) THEN 1303 knlaobs = knlaobs + 1 1304 IF (ld_nea) THEN 1305 kobsqc(jobsp) = kobsqc(jobsp) + 14 1306 ENDIF 1307 ENDIF 1308 1309 ELSE ! Case 2 1310 ! Flag if the observation is deeper than the bathymetry 1311 ! Or if it is within the mask 1312 IF ( ANY( zgdepw(1:2,1:2,kpk,jobs) < pobsdep(jobsp) ) & 1313 & .OR. & 1314 & ( SUM( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) & 1315 & == 0.0_wp) ) THEN 1316 kobsqc(jobsp) = kobsqc(jobsp) + 12 1317 klanobs = klanobs + 1 1318 CYCLE 1319 ENDIF 1320 1321 ! Flag if the observation is close to land 1322 IF ( ll_next_to_land ) THEN 1323 knlaobs = knlaobs + 1 1324 IF (ld_nea) THEN 1325 kobsqc(jobsp) = kobsqc(jobsp) + 14 1326 ENDIF 1327 ENDIF 1328 1183 1329 ENDIF 1184 1330 … … 1194 1340 ENDIF 1195 1341 1196 ! Flag if the observation falls is close to land1197 IF ( MINVAL( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) == &1198 & 0.0_wp) THEN1199 IF (ld_nea) kobsqc(jobsp) = kobsqc(jobsp) + 141200 knlaobs = knlaobs + 11201 ENDIF1202 1203 1342 ! Set observation depth equal to that of the first model depth 1204 1343 IF ( pobsdep(jobsp) <= pdep(1) ) THEN 1205 1344 pobsdep(jobsp) = pdep(1) 1206 1345 ENDIF 1346 1347 #if defined key_bdy 1348 ! Flag if the observation falls close to the boundary rim 1349 IF (ld_bound_reject) THEN 1350 IF ( MINVAL( zbmsk(1:2,1:2,jobs) ) == 0.0_wp ) THEN 1351 kobsqc(jobsp) = kobsqc(jobsp) + 15 1352 kbdyobs = kbdyobs + 1 1353 CYCLE 1354 ENDIF 1355 ! for observations on the grid... 1356 IF (lgridobs) THEN 1357 IF (zbmsk(iig,ijg,jobs) == 0.0_wp ) THEN 1358 kobsqc(jobsp) = kobsqc(jobsp) + 15 1359 kbdyobs = kbdyobs + 1 1360 CYCLE 1361 ENDIF 1362 ENDIF 1363 ENDIF 1364 #endif 1207 1365 1208 1366 END DO
Note: See TracChangeset
for help on using the changeset viewer.