Changeset 5682 for branches/2015/dev_r5072_UKMO2_OBS_simplification/NEMOGCM/NEMO/OPA_SRC/OBS/obs_prep.F90
- Timestamp:
- 2015-08-12T17:46:45+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_r5072_UKMO2_OBS_simplification/NEMOGCM/NEMO/OPA_SRC/OBS/obs_prep.F90
r5659 r5682 71 71 & nproc 72 72 !! * Arguments 73 TYPE(obs_surf), INTENT(INOUT) :: surfdata ! Full set of SLAdata74 TYPE(obs_surf), INTENT(INOUT) :: surfdataqc ! Subset of SLAdata not failing screening73 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 75 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 76 76 !! * Local declarations … … 99 99 INTEGER :: inrc ! Time index variable 100 100 101 IF(lwp) WRITE(numout,*)'obs_pre_sla : Preparing the SLA observations...' 102 101 IF(lwp) WRITE(numout,*)'obs_pre_surf : Preparing the surface observations...' 102 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 103 103 104 ! Initial date initialization (year, month, day, hour, minute) 104 105 iyea0 = ndate0 / 10000 … … 185 186 IF(lwp) THEN 186 187 WRITE(numout,*) 187 WRITE(numout,*) 'obs_pre_surf :' 188 WRITE(numout,*) '~~~~~~~~~~~' 189 WRITE(numout,*) 190 WRITE(numout,*) ' Surface data outside time domain = ', & 188 WRITE(numout,*) ' '//surfdataqc%cvars(1)//' data outside time domain = ', & 191 189 & iotdobsmpp 192 WRITE(numout,*) ' Remaining surfacedata that failed grid search = ', &190 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data that failed grid search = ', & 193 191 & igrdobsmpp 194 WRITE(numout,*) ' Remaining surfacedata outside space domain = ', &192 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data outside space domain = ', & 195 193 & iosdsobsmpp 196 WRITE(numout,*) ' Remaining surfacedata at land points = ', &194 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data at land points = ', & 197 195 & ilansobsmpp 198 196 IF (ld_nea) THEN 199 WRITE(numout,*) ' Remaining surfacedata near land points (removed) = ', &197 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data near land points (removed) = ', & 200 198 & inlasobsmpp 201 199 ELSE 202 WRITE(numout,*) ' Remaining surfacedata near land points (kept) = ', &200 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data near land points (kept) = ', & 203 201 & inlasobsmpp 204 202 ENDIF 205 WRITE(numout,*) ' surfacedata accepted = ', &203 WRITE(numout,*) ' '//surfdataqc%cvars(1)//' data accepted = ', & 206 204 & surfdataqc%nsurfmpp 207 205 … … 209 207 WRITE(numout,*) ' Number of observations per time step :' 210 208 WRITE(numout,*) 211 WRITE(numout,1997) 212 WRITE(numout,1998) 209 WRITE(numout,'(10X,A,10X,A)')'Time step',surfdataqc%cvars(1) 210 WRITE(numout,'(10X,A,5X,A)')'---------','-----------------' 211 CALL FLUSH(numout) 213 212 ENDIF 214 213 … … 225 224 inrc = jstp - nit000 + 2 226 225 WRITE(numout,1999) jstp, surfdataqc%nsstpmpp(inrc) 226 CALL FLUSH(numout) 227 227 END DO 228 228 ENDIF 229 229 230 1997 FORMAT(10X,'Time step',5X,'Sea level anomaly')231 1998 FORMAT(10X,'---------',5X,'-----------------')232 230 1999 FORMAT(10X,I9,5X,I17) 233 231 … … 235 233 236 234 237 SUBROUTINE obs_pre_prof( profdata, prodatqc, ld_vel3d, ld_nea, ld_dailyav ) 238 !!---------------------------------------------------------------------- 235 SUBROUTINE obs_pre_prof( profdata, prodatqc, ld_var1, ld_var2, & 236 & zmask1, pglam1, pgphi1, zmask2, pglam2, pgphi2, & 237 & ld_nea, kdailyavtypes ) 238 239 !!---------------------------------------------------------------------- 239 240 !! *** ROUTINE obs_pre_prof *** 240 241 !! … … 246 247 !! ! 2007-06 (K. Mogensen) original : T and S profile data 247 248 !! ! 2008-09 (M. Valdivieso) : TAO velocity data 248 !! ! 2009-01 (K. Mogensen) : New feedback strictu er249 !! ! 2009-01 (K. Mogensen) : New feedback stricture 249 250 !! ! 2015-02 (M. Martin) : Combined profile routine. 250 251 !! … … 254 255 USE par_oce ! Ocean parameters 255 256 USE dom_oce, ONLY : & ! Geographical information 256 & glamt, glamu, glamv, &257 & gphit, gphiu, gphiv, &258 257 & gdept_1d, & 259 & tmask, umask, vmask, &260 258 & nproc 259 261 260 !! * Arguments 262 261 TYPE(obs_prof), INTENT(INOUT) :: profdata ! Full set of profile data 263 262 TYPE(obs_prof), INTENT(INOUT) :: prodatqc ! Subset of profile data not failing screening 264 LOGICAL, INTENT(IN) :: ld_vel3d ! Switch for zonal and meridional velocity components 265 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 266 LOGICAL, INTENT(IN) :: ld_dailyav ! Switch for daily average data 263 LOGICAL, INTENT(IN) :: ld_var1 ! Observed variables switches 264 LOGICAL, INTENT(IN) :: ld_var2 265 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 266 INTEGER, DIMENSION(imaxavtypes), OPTIONAL :: & 267 & kdailyavtypes ! Types for daily averages 268 REAL(wp), INTENT(IN), DIMENSION(jpi,jpj,jpk) :: & 269 & zmask1, & 270 & zmask2 271 REAL(wp), INTENT(IN), DIMENSION(jpi,jpj) :: & 272 & pglam1, & 273 & pglam2, & 274 & pgphi1, & 275 & pgphi2 276 267 277 !! * Local declarations 268 278 INTEGER :: iyea0 ! Initial date … … 272 282 INTEGER :: imin0 273 283 INTEGER :: icycle ! Current assimilation cycle 274 ! Counters for observations that 284 ! Counters for observations that are 275 285 INTEGER :: iotdobs ! - outside time domain 276 INTEGER :: iosd uobs ! - outside space domain (zonal velocity component)277 INTEGER :: iosdv obs ! - outside space domain (meridional velocity component)278 INTEGER :: ilan uobs ! - within a model land cell (zonal velocity component)279 INTEGER :: ilanv obs ! - within a model land cell (meridional velocity component)280 INTEGER :: inla uobs ! - close to land (zonal velocity component)281 INTEGER :: inlav obs ! - close to land (meridional velocity component)286 INTEGER :: iosdv1obs ! - outside space domain (variable 1) 287 INTEGER :: iosdv2obs ! - outside space domain (variable 2) 288 INTEGER :: ilanv1obs ! - within a model land cell (variable 1) 289 INTEGER :: ilanv2obs ! - within a model land cell (variable 2) 290 INTEGER :: inlav1obs ! - close to land (variable 1) 291 INTEGER :: inlav2obs ! - close to land (variable 2) 282 292 INTEGER :: igrdobs ! - fail the grid search 283 293 INTEGER :: iuvchku ! - reject u if v rejected and vice versa 284 294 INTEGER :: iuvchkv ! 285 ! Global counters for observations that 295 ! Global counters for observations that are 286 296 INTEGER :: iotdobsmpp ! - outside time domain 287 INTEGER :: iosd uobsmpp ! - outside space domain (zonal velocity component)288 INTEGER :: iosdv obsmpp ! - outside space domain (meridional velocity component)289 INTEGER :: ilan uobsmpp ! - within a model land cell (zonal velocity component)290 INTEGER :: ilanv obsmpp ! - within a model land cell (meridional velocity component)291 INTEGER :: inla uobsmpp ! - close to land (zonal velocity component)292 INTEGER :: inlav obsmpp ! - close to land (meridional velocity component)297 INTEGER :: iosdv1obsmpp ! - outside space domain (variable 1) 298 INTEGER :: iosdv2obsmpp ! - outside space domain (variable 2) 299 INTEGER :: ilanv1obsmpp ! - within a model land cell (variable 1) 300 INTEGER :: ilanv2obsmpp ! - within a model land cell (variable 2) 301 INTEGER :: inlav1obsmpp ! - close to land (variable 1) 302 INTEGER :: inlav2obsmpp ! - close to land (variable 2) 293 303 INTEGER :: igrdobsmpp ! - fail the grid search 294 INTEGER :: iuvchkumpp ! - reject u if vrejected and vice versa304 INTEGER :: iuvchkumpp ! - reject var1 if var2 rejected and vice versa 295 305 INTEGER :: iuvchkvmpp ! 296 306 TYPE(obs_prof_valid) :: llvalid ! Profile selection 297 307 TYPE(obs_prof_valid), DIMENSION(profdata%nvar) :: & 298 & llvvalid ! U,Vselection308 & llvvalid ! var1,var2 selection 299 309 INTEGER :: jvar ! Variable loop variable 300 310 INTEGER :: jobs ! Obs. loop variable … … 302 312 INTEGER :: inrc ! Time index variable 303 313 304 IF(lwp) WRITE(numout,*)'obs_pre_prof: Preparing the profile data' 314 IF(lwp) WRITE(numout,*)'obs_pre_prof: Preparing the profile data...' 315 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 305 316 306 317 ! Initial date initialization (year, month, day, hour, minute) … … 317 328 iotdobs = 0 318 329 igrdobs = 0 319 iosd uobs = 0320 iosdv obs = 0321 ilan uobs = 0322 ilanv obs = 0323 inla uobs = 0324 inlav obs = 0330 iosdv1obs = 0 331 iosdv2obs = 0 332 ilanv1obs = 0 333 ilanv2obs = 0 334 inlav1obs = 0 335 inlav2obs = 0 325 336 iuvchku = 0 326 337 iuvchkv = 0 … … 330 341 ! ----------------------------------------------------------------------- 331 342 332 CALL obs_coo_tim_prof( icycle, & 333 & iyea0, imon0, iday0, ihou0, imin0, & 334 & profdata%nprof, profdata%nyea, profdata%nmon, & 335 & profdata%nday, profdata%nhou, profdata%nmin, & 336 & profdata%ntyp, profdata%nqc, profdata%mstp, & 337 & iotdobs, ld_dailyav = ld_dailyav ) 338 343 IF ( PRESENT(kdailyavtypes) ) THEN 344 CALL obs_coo_tim_prof( icycle, & 345 & iyea0, imon0, iday0, ihou0, imin0, & 346 & profdata%nprof, profdata%nyea, profdata%nmon, & 347 & profdata%nday, profdata%nhou, profdata%nmin, & 348 & profdata%ntyp, profdata%nqc, profdata%mstp, & 349 & iotdobs, kdailyavtypes = kdailyavtypes ) 350 ELSE 351 CALL obs_coo_tim_prof( icycle, & 352 & iyea0, imon0, iday0, ihou0, imin0, & 353 & profdata%nprof, profdata%nyea, profdata%nmon, & 354 & profdata%nday, profdata%nhou, profdata%nmin, & 355 & profdata%ntyp, profdata%nqc, profdata%mstp, & 356 & iotdobs ) 357 ENDIF 358 339 359 CALL obs_mpp_sum_integer( iotdobs, iotdobsmpp ) 340 360 … … 343 363 ! ----------------------------------------------------------------------- 344 364 345 CALL obs_coo_grd( profdata%nprof, profdata%mi(:,1), profdata%mj(:,1), & 346 & profdata%nqc, igrdobs ) 347 CALL obs_coo_grd( profdata%nprof, profdata%mi(:,2), profdata%mj(:,2), & 348 & profdata%nqc, igrdobs ) 365 CALL obs_coo_grd( profdata%nprof, profdata%mi, profdata%mj, & 366 & profdata%nqc, igrdobs ) 349 367 350 368 CALL obs_mpp_sum_integer( igrdobs, igrdobsmpp ) … … 361 379 ! ----------------------------------------------------------------------- 362 380 363 ! Zonal Velocity Component 364 381 ! Variable 1 365 382 CALL obs_coo_spc_3d( profdata%nprof, profdata%nvprot(1), & 366 383 & profdata%npvsta(:,1), profdata%npvend(:,1), & 367 384 & jpi, jpj, & 368 385 & jpk, & 369 & profdata%mi, profdata%mj, & 386 & profdata%mi, profdata%mj, & 370 387 & profdata%var(1)%mvk, & 371 388 & profdata%rlam, profdata%rphi, & 372 389 & profdata%var(1)%vdep, & 373 & glamu, gphiu,&374 & gdept_1d, umask,&390 & pglam1, pgphi1, & 391 & gdept_1d, zmask1, & 375 392 & profdata%nqc, profdata%var(1)%nvqc, & 376 & iosduobs, ilanuobs, & 377 & inlauobs, ld_nea ) 378 379 CALL obs_mpp_sum_integer( iosduobs, iosduobsmpp ) 380 CALL obs_mpp_sum_integer( ilanuobs, ilanuobsmpp ) 381 CALL obs_mpp_sum_integer( inlauobs, inlauobsmpp ) 382 383 ! Meridional Velocity Component 384 393 & iosdv1obs, ilanv1obs, & 394 & inlav1obs, ld_nea ) 395 396 CALL obs_mpp_sum_integer( iosdv1obs, iosdv1obsmpp ) 397 CALL obs_mpp_sum_integer( ilanv1obs, ilanv1obsmpp ) 398 CALL obs_mpp_sum_integer( inlav1obs, inlav1obsmpp ) 399 400 ! Variable 2 385 401 CALL obs_coo_spc_3d( profdata%nprof, profdata%nvprot(2), & 386 402 & profdata%npvsta(:,2), profdata%npvend(:,2), & … … 391 407 & profdata%rlam, profdata%rphi, & 392 408 & profdata%var(2)%vdep, & 393 & glamv, gphiv,&394 & gdept_1d, vmask,&409 & pglam2, pgphi2, & 410 & gdept_1d, zmask2, & 395 411 & profdata%nqc, profdata%var(2)%nvqc, & 396 & iosdv obs, ilanvobs,&397 & inlav obs, ld_nea )398 399 CALL obs_mpp_sum_integer( iosdv obs, iosdvobsmpp )400 CALL obs_mpp_sum_integer( ilanv obs, ilanvobsmpp )401 CALL obs_mpp_sum_integer( inlav obs, inlavobsmpp )412 & iosdv2obs, ilanv2obs, & 413 & inlav2obs, ld_nea ) 414 415 CALL obs_mpp_sum_integer( iosdv2obs, iosdv2obsmpp ) 416 CALL obs_mpp_sum_integer( ilanv2obs, ilanv2obsmpp ) 417 CALL obs_mpp_sum_integer( inlav2obs, inlav2obsmpp ) 402 418 403 419 ! ----------------------------------------------------------------------- … … 405 421 ! ----------------------------------------------------------------------- 406 422 407 CALL obs_uv_rej( profdata, iuvchku, iuvchkv ) 408 CALL obs_mpp_sum_integer( iuvchku, iuvchkumpp ) 409 CALL obs_mpp_sum_integer( iuvchkv, iuvchkvmpp ) 423 IF ( TRIM(profdata%cvars(1)) == 'UVEL' ) THEN 424 CALL obs_uv_rej( profdata, iuvchku, iuvchkv ) 425 CALL obs_mpp_sum_integer( iuvchku, iuvchkumpp ) 426 CALL obs_mpp_sum_integer( iuvchkv, iuvchkvmpp ) 427 ENDIF 410 428 411 429 ! ----------------------------------------------------------------------- … … 446 464 447 465 IF(lwp) THEN 466 448 467 WRITE(numout,*) 449 WRITE(numout,*) 'obs_pre_vel :' 450 WRITE(numout,*) '~~~~~~~~~~~' 451 WRITE(numout,*) 452 WRITE(numout,*) ' Profiles outside time domain = ', & 468 WRITE(numout,*) ' Profiles outside time domain = ', & 453 469 & iotdobsmpp 454 WRITE(numout,*) ' Remaining profiles that failed grid search = ', &470 WRITE(numout,*) ' Remaining profiles that failed grid search = ', & 455 471 & igrdobsmpp 456 WRITE(numout,*) ' Remaining Udata outside space domain = ', &457 & iosd uobsmpp458 WRITE(numout,*) ' Remaining Udata at land points = ', &459 & ilan uobsmpp472 WRITE(numout,*) ' Remaining '//prodatqc%cvars(1)//' data outside space domain = ', & 473 & iosdv1obsmpp 474 WRITE(numout,*) ' Remaining '//prodatqc%cvars(1)//' data at land points = ', & 475 & ilanv1obsmpp 460 476 IF (ld_nea) THEN 461 WRITE(numout,*) ' Remaining Udata near land points (removed) = ',&462 & inla uobsmpp477 WRITE(numout,*) ' Remaining '//prodatqc%cvars(1)//' data near land points (removed) = ',& 478 & inlav1obsmpp 463 479 ELSE 464 WRITE(numout,*) ' Remaining U data near land points (kept) = ',& 465 & inlauobsmpp 466 ENDIF 467 WRITE(numout,*) ' U observation rejected since V rejected = ', & 468 & iuvchku 469 WRITE(numout,*) ' U data accepted = ', & 480 WRITE(numout,*) ' Remaining '//prodatqc%cvars(1)//' data near land points (kept) = ',& 481 & inlav1obsmpp 482 ENDIF 483 IF ( TRIM(profdata%cvars(1)) == 'UVEL' ) THEN 484 WRITE(numout,*) ' U observation rejected since V rejected = ', & 485 & iuvchku 486 ENDIF 487 WRITE(numout,*) ' '//prodatqc%cvars(1)//' data accepted = ', & 470 488 & prodatqc%nvprotmpp(1) 471 WRITE(numout,*) ' Remaining Vdata outside space domain = ', &472 & iosdv obsmpp473 WRITE(numout,*) ' Remaining Vdata at land points = ', &474 & ilanv obsmpp489 WRITE(numout,*) ' Remaining '//prodatqc%cvars(2)//' data outside space domain = ', & 490 & iosdv2obsmpp 491 WRITE(numout,*) ' Remaining '//prodatqc%cvars(2)//' data at land points = ', & 492 & ilanv2obsmpp 475 493 IF (ld_nea) THEN 476 WRITE(numout,*) ' Remaining Vdata near land points (removed) = ',&477 & inlav obsmpp494 WRITE(numout,*) ' Remaining '//prodatqc%cvars(2)//' data near land points (removed) = ',& 495 & inlav2obsmpp 478 496 ELSE 479 WRITE(numout,*) ' Remaining V data near land points (kept) = ',& 480 & inlavobsmpp 481 ENDIF 482 WRITE(numout,*) ' V observation rejected since U rejected = ', & 483 & iuvchkv 484 WRITE(numout,*) ' V data accepted = ', & 497 WRITE(numout,*) ' Remaining '//prodatqc%cvars(2)//' data near land points (kept) = ',& 498 & inlav2obsmpp 499 ENDIF 500 IF ( TRIM(profdata%cvars(1)) == 'UVEL' ) THEN 501 WRITE(numout,*) ' V observation rejected since U rejected = ', & 502 & iuvchkv 503 ENDIF 504 WRITE(numout,*) ' '//prodatqc%cvars(2)//' data accepted = ', & 485 505 & prodatqc%nvprotmpp(2) 486 506 … … 488 508 WRITE(numout,*) ' Number of observations per time step :' 489 509 WRITE(numout,*) 490 WRITE(numout,997) 510 WRITE(numout,'(10X,A,5X,A,5X,A,A)')'Time step','Profiles', & 511 & ' '//prodatqc%cvars(1)//' ', & 512 & ' '//prodatqc%cvars(2)//' ' 491 513 WRITE(numout,998) 492 514 ENDIF … … 522 544 ENDIF 523 545 524 997 FORMAT(10X,'Time step',5X,'Profiles',5X,'Zonal Comp.',5X,'Meridional Comp.')525 546 998 FORMAT(10X,'---------',5X,'--------',5X,'-----------',5X,'----------------') 526 547 999 FORMAT(10X,I9,5X,I8,5X,I11,5X,I8) … … 728 749 & kobsno, & 729 750 & kobsyea, kobsmon, kobsday, kobshou, kobsmin, & 730 & ktyp, kobsqc, kobsstp, kotdobs, kdailyavtypes, & 731 & ld_dailyav ) 751 & ktyp, kobsqc, kobsstp, kotdobs, kdailyavtypes ) 732 752 !!---------------------------------------------------------------------- 733 753 !! *** ROUTINE obs_coo_tim *** … … 773 793 INTEGER, DIMENSION(imaxavtypes), OPTIONAL :: & 774 794 & kdailyavtypes ! Types for daily averages 775 LOGICAL, OPTIONAL :: ld_dailyav ! All types are daily averages776 795 !! * Local declarations 777 796 INTEGER :: jobs … … 807 826 ENDIF 808 827 809 !------------------------------------------------------------------------810 ! If ld_dailyav is set then all data assumed to be daily averaged811 !------------------------------------------------------------------------812 813 IF ( PRESENT( ld_dailyav) ) THEN814 IF (ld_dailyav) THEN815 DO jobs = 1, kobsno816 817 IF ( kobsqc(jobs) <= 10 ) THEN818 819 IF ( kobsstp(jobs) == (nit000 - 1) ) THEN820 kobsqc(jobs) = kobsqc(jobs) + 14821 kotdobs = kotdobs + 1822 CYCLE823 ENDIF824 825 ENDIF826 END DO827 ENDIF828 ENDIF829 828 830 829 END SUBROUTINE obs_coo_tim_prof
Note: See TracChangeset
for help on using the changeset viewer.