Changeset 6980
- Timestamp:
- 2016-10-03T18:31:01+02:00 (8 years ago)
- Location:
- branches/UKMO/dev_CO6_obs_bound_reject/NEMOGCM/NEMO/OPA_SRC/OBS
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_CO6_obs_bound_reject/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90
r6331 r6980 87 87 LOGICAL, PUBLIC :: ln_ignmis !: Logical switch for ignoring missing files 88 88 LOGICAL, PUBLIC :: ln_s_at_t !: Logical switch to compute model S at T observations 89 LOGICAL, PUBLIC :: ln_bound_reject !: Logical switch to reject observations near open boundaries 89 90 90 91 REAL(KIND=dp), PUBLIC :: dobsini !: Observation window start date YYYYMMDD.HHMMSS … … 163 164 & ln_sla, ln_sladt, ln_slafb, & 164 165 & ln_ssh, ln_sst, ln_sstfb, ln_sss, ln_nea, & 166 & ln_bound_reject, & 165 167 & enactfiles, coriofiles, profbfiles, & 166 168 & slafilesact, slafilespas, slafbfiles, & … … 232 234 ln_velfb_av(:) = .FALSE. 233 235 ln_ignmis = .FALSE. 236 ln_bound_reject = .TRUE. 234 237 235 238 CALL ini_date( dobsini ) … … 450 453 WRITE(numout,*) ' Type of horizontal interpolation method n2dint = ', n2dint 451 454 WRITE(numout,*) ' Rejection of observations near land swithch ln_nea = ', ln_nea 455 WRITE(numout,*) ' Rejection of obs near open bdys ln_bound_reject = ', ln_bound_reject 452 456 WRITE(numout,*) ' MSSH correction scheme nmsshc = ', nmsshc 453 457 WRITE(numout,*) ' MDT correction mdtcorr = ', mdtcorr -
branches/UKMO/dev_CO6_obs_bound_reject/NEMOGCM/NEMO/OPA_SRC/OBS/obs_prep.F90
r6331 r6980 27 27 USE obs_inter_sup ! Interpolation support 28 28 USE obs_oper ! Observation operators 29 #if defined key_bdy 30 USE bdy_oce, ONLY : & ! Boundary information 31 idx_bdy, nb_bdy 32 #endif 29 33 USE lib_mpp, ONLY : & 30 34 & ctl_warn, ctl_stop … … 41 45 & obs_pre_seaice, & ! First level check and screening of sea ice data 42 46 & obs_pre_vel, & ! First level check and screening of velocity profiles 43 & calc_month_len ! Calculate the number of days in the months of a year 44 47 & calc_month_len ! Calculate the number of days in the months of a year 48 45 49 !!---------------------------------------------------------------------- 46 50 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 75 79 & glamt, & 76 80 & gphit, & 77 & gdept_1d,& 81 & gdept_0, & 82 #if defined key_vvl 83 & gdepw_1, & 84 & gdept_1, & 85 #else 86 & gdepw, & 87 & gdept, & 88 #endif 78 89 & tmask, & 90 & ln_zco, & 91 & ln_zps, & 79 92 & nproc 80 93 !! * Arguments … … 99 112 INTEGER :: ilantobs ! - within a model land cell (temperature) 100 113 INTEGER :: ilansobs ! - within a model land cell (salinity) 114 INTEGER :: ibdytobs ! - boundary (temperature) 115 INTEGER :: ibdysobs ! - boundary (salinity) 101 116 INTEGER :: inlatobs ! - close to land (temperature) 102 117 INTEGER :: inlasobs ! - close to land (salinity) … … 110 125 INTEGER :: inlatobsmpp ! - close to land (temperature) 111 126 INTEGER :: inlasobsmpp ! - close to land (salinity) 127 INTEGER :: ibdytobsmpp ! - boundary (temperature) 128 INTEGER :: ibdysobsmpp ! - boundary (salinity) 112 129 INTEGER :: igrdobsmpp ! - fail the grid search 113 130 TYPE(obs_prof_valid) :: llvalid ! Profile selection … … 140 157 inlatobs = 0 141 158 inlasobs = 0 159 ibdytobs = 0 160 ibdysobs = 0 142 161 143 162 ! ----------------------------------------------------------------------- … … 196 215 & profdata%nqc, profdata%var(1)%nvqc, & 197 216 & iosdtobs, ilantobs, & 198 & inlatobs, ld_nea ) 217 & inlatobs, ld_nea & 218 & ibdytobs, ld_bound_reject ) 199 219 200 220 CALL obs_mpp_sum_integer( iosdtobs, iosdtobsmpp ) 201 221 CALL obs_mpp_sum_integer( ilantobs, ilantobsmpp ) 202 222 CALL obs_mpp_sum_integer( inlatobs, inlatobsmpp ) 223 CALL obs_mpp_sum_integer( ibdytobs, ibdytobsmpp ) 203 224 204 225 ! Salinity … … 216 237 & profdata%nqc, profdata%var(2)%nvqc, & 217 238 & iosdsobs, ilansobs, & 218 & inlasobs, ld_nea ) 239 & inlasobs, ld_nea & 240 & ibdysobs, ld_bound_reject ) 219 241 220 242 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 221 243 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 222 244 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 245 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 223 246 224 247 ! ----------------------------------------------------------------------- … … 278 301 & inlatobsmpp 279 302 ENDIF 303 WRITE(numout,*) ' Remaining T data near open boundary (removed) = ',& 304 & ibdytobsmpp 280 305 WRITE(numout,*) ' T data accepted = ', & 281 306 & prodatqc%nvprotmpp(1) … … 291 316 & inlasobsmpp 292 317 ENDIF 318 WRITE(numout,*) ' Remaining S data near open boundary (removed) = ',& 319 & ibdysobsmpp 293 320 WRITE(numout,*) ' S data accepted = ', & 294 321 & prodatqc%nvprotmpp(2) … … 379 406 INTEGER :: inlasobs ! - close to land 380 407 INTEGER :: igrdobs ! - fail the grid search 408 INTEGER :: ibdysobs ! - close to open boundary 381 409 ! Global counters for observations that 382 410 INTEGER :: iotdobsmpp ! - outside time domain … … 385 413 INTEGER :: inlasobsmpp ! - close to land 386 414 INTEGER :: igrdobsmpp ! - fail the grid search 415 INTEGER :: ibdysobsmpp ! - close to open boundary 387 416 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 388 417 & llvalid ! SLA data selection … … 390 419 INTEGER :: jstp ! Time loop variable 391 420 INTEGER :: inrc ! Time index variable 421 INTEGER :: irec ! Record index 392 422 393 423 IF(lwp) WRITE(numout,*)'obs_pre_sla : Preparing the SLA observations...' … … 409 439 ilansobs = 0 410 440 inlasobs = 0 441 ibdysobs = 0 411 442 412 443 ! ----------------------------------------------------------------------- … … 442 473 & tmask(:,:,1), sladata%nqc, & 443 474 & iosdsobs, ilansobs, & 444 & inlasobs, ld_nea ) 475 & inlasobs, ld_nea & 476 & ibdysobs, ln_bound_reject ) 445 477 446 478 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 447 479 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 448 480 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 481 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 449 482 450 483 ! ----------------------------------------------------------------------- … … 495 528 & inlasobsmpp 496 529 ENDIF 530 WRITE(numout,*) ' Remaining SLA data near open boundary (removed) = ', & 531 & ibdysobsmpp 497 532 WRITE(numout,*) ' SLA data accepted = ', & 498 533 & sladatqc%nsurfmpp … … 520 555 ENDIF 521 556 557 !--------------------------------------------------------- 558 ! Record handling 559 !--------------------------------------------------------- 560 ! First count the number of records 561 sladatqc%nrec = 0 562 DO jstp = nit000 - 1, nitend 563 inrc = jstp - nit000 + 2 564 IF ( sladatqc%nsstpmpp(inrc) > 0 ) THEN 565 sladatqc%nrec = sladatqc%nrec + 1 566 ENDIF 567 END DO 568 ! Allocate record data 569 ALLOCATE( & 570 & sladatqc%mrecstp(sladatqc%nrec) & 571 & ) 572 ! Finally save the time step corresponding to record rank 573 irec = 0 574 DO jstp = nit000 - 1, nitend 575 inrc = jstp - nit000 + 2 576 IF ( sladatqc%nsstpmpp(inrc) > 0 ) THEN 577 irec = irec + 1 578 sladatqc%mrecstp(irec) = inrc 579 ENDIF 580 IF ( lwp ) THEN 581 WRITE(numout,1999) inrc, sladatqc%nsstpmpp(inrc) 582 ENDIF 583 END DO 584 585 ! Print record information 586 IF( lwp ) THEN 587 WRITE(numout,*) 588 WRITE(numout,2000) 589 WRITE(numout,2001) 590 DO irec = 1, sladatqc%nrec 591 WRITE(numout,1999) irec, sladatqc%mrecstp(irec) 592 END DO 593 ENDIF 594 595 522 596 1997 FORMAT(10X,'Time step',5X,'Sea level anomaly') 523 597 1998 FORMAT(10X,'---------',5X,'-----------------') 524 598 1999 FORMAT(10X,I9,5X,I17) 599 2000 FORMAT(15X,'Record',10X,'Time step') 600 2001 FORMAT(15X,'------',10X,'---------') 525 601 526 602 END SUBROUTINE obs_pre_sla … … 567 643 INTEGER :: inlasobs ! - close to land 568 644 INTEGER :: igrdobs ! - fail the grid search 645 INTEGER :: ibdysobs ! - close to open boundary 569 646 ! Global counters for observations that 570 647 INTEGER :: iotdobsmpp ! - outside time domain … … 573 650 INTEGER :: inlasobsmpp ! - close to land 574 651 INTEGER :: igrdobsmpp ! - fail the grid search 652 INTEGER :: ibdysobsmpp ! - close to open boundary 575 653 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 576 654 & llvalid ! SST data selection … … 578 656 INTEGER :: jstp ! Time loop variable 579 657 INTEGER :: inrc ! Time index variable 658 INTEGER :: irec ! Record index 580 659 581 660 IF(lwp) WRITE(numout,*)'obs_pre_sst : Preparing the SST observations...' … … 597 676 ilansobs = 0 598 677 inlasobs = 0 678 ibdysobs = 0 599 679 600 680 ! ----------------------------------------------------------------------- … … 627 707 & tmask(:,:,1), sstdata%nqc, & 628 708 & iosdsobs, ilansobs, & 629 & inlasobs, ld_nea ) 709 & inlasobs, ld_nea & 710 & ibdysobs, ln_bound_reject ) 630 711 631 712 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 632 713 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 633 714 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 715 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 634 716 635 717 ! ----------------------------------------------------------------------- … … 680 762 & inlasobsmpp 681 763 ENDIF 764 WRITE(numout,*) ' Remaining SST data near open boundary (removed) = ', & 765 & ibdysobsmp 682 766 WRITE(numout,*) ' SST data accepted = ', & 683 767 & sstdatqc%nsurfmpp … … 705 789 ENDIF 706 790 791 !--------------------------------------------------------- 792 ! Record handling 793 !--------------------------------------------------------- 794 ! First count the number of records 795 sstdatqc%nrec = 0 796 DO jstp = nit000 - 1, nitend 797 inrc = jstp - nit000 + 2 798 IF ( sstdatqc%nsstpmpp(inrc) > 0 ) THEN 799 sstdatqc%nrec = sstdatqc%nrec + 1 800 ENDIF 801 END DO 802 ! Allocate record data 803 ALLOCATE( & 804 & sstdatqc%mrecstp(sstdatqc%nrec) & 805 & ) 806 ! Finally save the time step corresponding to record rank 807 irec = 0 808 DO jstp = nit000 - 1, nitend 809 inrc = jstp - nit000 + 2 810 IF ( sstdatqc%nsstpmpp(inrc) > 0 ) THEN 811 irec = irec + 1 812 sstdatqc%mrecstp(irec) = inrc 813 ENDIF 814 IF ( lwp ) THEN 815 WRITE(numout,1999) jstp, sstdatqc%nsstpmpp(inrc) 816 ENDIF 817 END DO 818 819 ! Print record information 820 IF( lwp ) THEN 821 WRITE(numout,*) 822 WRITE(numout,2000) 823 WRITE(numout,2001) 824 DO irec = 1, sstdatqc%nrec 825 WRITE(numout,1999) irec, sstdatqc%mrecstp(irec) - 1 826 END DO 827 ENDIF 828 707 829 1997 FORMAT(10X,'Time step',5X,'Sea surface temperature') 708 830 1998 FORMAT(10X,'---------',5X,'-----------------') 709 831 1999 FORMAT(10X,I9,5X,I17) 832 2000 FORMAT(15X,'Record',10X,'Time step') 833 2001 FORMAT(15X,'------',10X,'---------') 710 834 711 835 END SUBROUTINE obs_pre_sst … … 752 876 INTEGER :: inlasobs ! - close to land 753 877 INTEGER :: igrdobs ! - fail the grid search 878 INTEGER :: ibdysobs ! - close to open boundary 754 879 ! Global counters for observations that 755 880 INTEGER :: iotdobsmpp ! - outside time domain … … 758 883 INTEGER :: inlasobsmpp ! - close to land 759 884 INTEGER :: igrdobsmpp ! - fail the grid search 885 INTEGER :: ibdysobsmpp ! - close to open boundary 760 886 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 761 887 & llvalid ! data selection … … 763 889 INTEGER :: jstp ! Time loop variable 764 890 INTEGER :: inrc ! Time index variable 891 INTEGER :: irec ! Record index 765 892 766 893 IF (lwp) WRITE(numout,*)'obs_pre_seaice : Preparing the sea ice observations...' … … 782 909 ilansobs = 0 783 910 inlasobs = 0 911 ibdysobs = 0 784 912 785 913 ! ----------------------------------------------------------------------- … … 812 940 & tmask(:,:,1), seaicedata%nqc, & 813 941 & iosdsobs, ilansobs, & 814 & inlasobs, ld_nea ) 942 & inlasobs, ld_nea & 943 & ibdysobs, ln_bound_reject ) 815 944 816 945 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 817 946 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 818 947 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 948 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 819 949 820 950 ! ----------------------------------------------------------------------- … … 865 995 & inlasobsmpp 866 996 ENDIF 997 WRITE(numout,*) ' Remaining sea ice data near open boundary (removed) = ', & 998 & ibdysobsmpp 867 999 WRITE(numout,*) ' Sea ice data accepted = ', & 868 1000 & seaicedatqc%nsurfmpp … … 890 1022 ENDIF 891 1023 1024 !--------------------------------------------------------- 1025 ! Record handling 1026 !--------------------------------------------------------- 1027 ! First count the number of records 1028 seaicedatqc%nrec = 0 1029 DO jstp = nit000 - 1, nitend 1030 inrc = jstp - nit000 + 2 1031 IF ( seaicedatqc%nsstpmpp(inrc) > 0 ) THEN 1032 seaicedatqc%nrec = seaicedatqc%nrec + 1 1033 ENDIF 1034 END DO 1035 ! Allocate record data 1036 ALLOCATE( & 1037 & seaicedatqc%mrecstp(seaicedatqc%nrec) & 1038 & ) 1039 ! Finally save the time step corresponding to record rank 1040 irec = 0 1041 DO jstp = nit000 - 1, nitend 1042 inrc = jstp - nit000 + 2 1043 IF ( seaicedatqc%nsstpmpp(inrc) > 0 ) THEN 1044 irec = irec + 1 1045 seaicedatqc%mrecstp(irec) = inrc 1046 ENDIF 1047 IF ( lwp ) THEN 1048 WRITE(numout,1999) inrc, seaicedatqc%nsstpmpp(inrc) 1049 ENDIF 1050 END DO 1051 1052 ! Print record information 1053 IF( lwp ) THEN 1054 WRITE(numout,*) 1055 WRITE(numout,2000) 1056 WRITE(numout,2001) 1057 DO irec = 1, seaicedatqc%nrec 1058 WRITE(numout,1999) irec, seaicedatqc%mrecstp(irec) 1059 END DO 1060 ENDIF 1061 892 1062 1997 FORMAT(10X,'Time step',5X,'Sea ice data ') 893 1063 1998 FORMAT(10X,'---------',5X,'-----------------') 894 1064 1999 FORMAT(10X,I9,5X,I17) 1065 2000 FORMAT(15X,'Record',10X,'Time step') 1066 2001 FORMAT(15X,'------',10X,'---------') 895 1067 896 1068 END SUBROUTINE obs_pre_seaice … … 941 1113 INTEGER :: inlavobs ! - close to land (meridional velocity component) 942 1114 INTEGER :: igrdobs ! - fail the grid search 1115 INTEGER :: ibdyuobs ! - close to open boundary 1116 INTEGER :: ibdyvobs ! - close to open boundary 943 1117 INTEGER :: iuvchku ! - reject u if v rejected and vice versa 944 1118 INTEGER :: iuvchkv ! … … 952 1126 INTEGER :: inlavobsmpp ! - close to land (meridional velocity component) 953 1127 INTEGER :: igrdobsmpp ! - fail the grid search 1128 INTEGER :: ibdyuobsmpp ! - close to open boundary 1129 INTEGER :: ibdyvobsmpp ! - close to open boundary 954 1130 INTEGER :: iuvchkumpp ! - reject u if v rejected and vice versa 955 1131 INTEGER :: iuvchkvmpp ! … … 983 1159 inlauobs = 0 984 1160 inlavobs = 0 1161 ibdyuobs = 0 1162 ibdyvobs = 0 985 1163 iuvchku = 0 986 1164 iuvchkv = 0 … … 1035 1213 & profdata%nqc, profdata%var(1)%nvqc, & 1036 1214 & iosduobs, ilanuobs, & 1037 & inlauobs, ld_nea ) 1215 & inlauobs, ld_nea & 1216 & ibdyuobs, ln_bound_reject ) 1038 1217 1039 1218 CALL obs_mpp_sum_integer( iosduobs, iosduobsmpp ) 1040 1219 CALL obs_mpp_sum_integer( ilanuobs, ilanuobsmpp ) 1041 1220 CALL obs_mpp_sum_integer( inlauobs, inlauobsmpp ) 1221 CALL obs_mpp_sum_integer( ibdyuobs, ibdyuobsmpp ) 1042 1222 1043 1223 ! Meridional Velocity Component … … 1055 1235 & profdata%nqc, profdata%var(2)%nvqc, & 1056 1236 & iosdvobs, ilanvobs, & 1057 & inlavobs, ld_nea ) 1237 & inlavobs, ld_nea & 1238 & ibdyvobs, ln_bound_reject ) 1058 1239 1059 1240 CALL obs_mpp_sum_integer( iosdvobs, iosdvobsmpp ) 1060 1241 CALL obs_mpp_sum_integer( ilanvobs, ilanvobsmpp ) 1061 1242 CALL obs_mpp_sum_integer( inlavobs, inlavobsmpp ) 1243 CALL obs_mpp_sum_integer( ibdyvobs, ibdyvobsmpp ) 1062 1244 1063 1245 ! ----------------------------------------------------------------------- … … 1125 1307 & inlauobsmpp 1126 1308 ENDIF 1309 WRITE(numout,*) ' Remaining U data near open boundary (removed) = ', & 1310 & ibdyuobsmpp 1127 1311 WRITE(numout,*) ' U observation rejected since V rejected = ', & 1128 1312 & iuvchku … … 1140 1324 & inlavobsmpp 1141 1325 ENDIF 1326 WRITE(numout,*) ' Remaining V data near open boundary (removed) = ', & 1327 & ibdyvobsmpp 1142 1328 WRITE(numout,*) ' V observation rejected since U rejected = ', & 1143 1329 & iuvchkv … … 1532 1718 & plam, pphi, pmask, & 1533 1719 & kobsqc, kosdobs, klanobs, & 1534 & knlaobs,ld_nea ) 1720 & knlaobs,ld_nea & 1721 & kbdyobs,ld_bound_reject ) 1535 1722 !!---------------------------------------------------------------------- 1536 1723 !! *** ROUTINE obs_coo_spc_2d *** … … 1568 1755 INTEGER, INTENT(INOUT) :: klanobs ! Observations within a model land cell 1569 1756 INTEGER, INTENT(INOUT) :: knlaobs ! Observations near land 1757 INTEGER, INTENT(INOUT) :: kbdyobs ! Observations near boundary 1570 1758 LOGICAL, INTENT(IN) :: ld_nea ! Flag observations near land 1759 LOGICAL, INTENT(IN) :: ld_bound_reject ! Flag observations near open boundary 1571 1760 !! * Local declarations 1572 1761 REAL(KIND=wp), DIMENSION(2,2,kobsno) :: & 1573 1762 & zgmsk ! Grid mask 1763 #if defined key_bdy 1764 REAL(KIND=wp), DIMENSION(2,2,kobsno) :: & 1765 & zbmsk ! Boundary mask 1766 REAL(KIND=wp), DIMENSION(jpi,jpj) :: zbdymask 1767 #endif 1574 1768 REAL(KIND=wp), DIMENSION(2,2,kobsno) :: & 1575 1769 & zglam, & ! Model longitude at grid points … … 1613 1807 1614 1808 END DO 1809 1810 #if defined key_bdy 1811 ! Create a mask grid points in boundary rim 1812 IF (ld_bound_reject) THEN 1813 zbdymask(:,:) = 1.0_wp 1814 DO ji = 1, nb_bdy 1815 DO jj = 1, idx_bdy(ji)%nblen(1) 1816 zbdymask(idx_bdy(ji)%nbi(jj,1),idx_bdy(ji)%nbj(jj,1)) = 0.0_wp 1817 ENDDO 1818 ENDDO 1819 1820 CALL obs_int_comm_2d( 2, 2, kobsno, igrdi, igrdj, zbdymask, zbmsk ) 1821 ENDIF 1822 #endif 1615 1823 1616 1824 CALL obs_int_comm_2d( 2, 2, kobsno, igrdi, igrdj, pmask, zgmsk ) … … 1671 1879 ! Flag if the observation falls is close to land 1672 1880 IF ( MINVAL( zgmsk(1:2,1:2,jobs) ) == 0.0_wp) THEN 1673 IF (ld_nea) kobsqc(jobs) = kobsqc(jobs) + 141674 1881 knlaobs = knlaobs + 1 1675 CYCLE 1676 ENDIF 1882 IF (ld_nea) THEN 1883 kobsqc(jobs) = kobsqc(jobs) + 14 1884 CYCLE 1885 ENDIF 1886 ENDIF 1887 1888 #if defined key_bdy 1889 ! Flag if the observation falls close to the boundary rim 1890 IF (ld_bound_reject) THEN 1891 IF ( MINVAL( zbmsk(1:2,1:2,jobs) ) == 0.0_wp ) THEN 1892 kobsqc(jobs) = kobsqc(jobs) + 15 1893 kbdyobs = kbdyobs + 1 1894 CYCLE 1895 ENDIF 1896 ! for observations on the grid... 1897 IF (lgridobs) THEN 1898 IF (zbmsk(iig,ijg,jobs) == 0.0_wp ) THEN 1899 kobsqc(jobs) = kobsqc(jobs) + 15 1900 kbdyobs = kbdyobs + 1 1901 CYCLE 1902 ENDIF 1903 ENDIF 1904 ENDIF 1905 #endif 1677 1906 1678 1907 END DO … … 1686 1915 & plam, pphi, pdep, pmask, & 1687 1916 & kpobsqc, kobsqc, kosdobs, & 1688 & klanobs, knlaobs, ld_nea ) 1917 & klanobs, knlaobs, ld_nea & 1918 & kbdyobs, ld_bound_reject ) 1689 1919 !!---------------------------------------------------------------------- 1690 1920 !! *** ROUTINE obs_coo_spc_3d *** … … 1709 1939 !! * Modules used 1710 1940 USE dom_oce, ONLY : & ! Geographical information 1711 & gdepw_1d 1941 & ln_zco, & 1942 & ln_zps, & 1943 & gdepw_0, & 1944 #if defined key_vvl 1945 & gdepw_1, & 1946 & gdept_1 1947 #else 1948 & gdepw, & 1949 & gdept 1950 #endif 1712 1951 1713 1952 !! * Arguments … … 1743 1982 INTEGER, INTENT(INOUT) :: klanobs ! Observations within a model land cell 1744 1983 INTEGER, INTENT(INOUT) :: knlaobs ! Observations near land 1984 INTEGER, INTENT(INOUT) :: kbdyobs ! Observations near boundary 1745 1985 LOGICAL, INTENT(IN) :: ld_nea ! Flag observations near land 1986 LOGICAL, INTENT(IN) :: ld_bound_reject ! Flag observations near open boundary 1746 1987 !! * Local declarations 1747 1988 REAL(KIND=wp), DIMENSION(2,2,kpk,kprofno) :: & 1748 1989 & zgmsk ! Grid mask 1990 #if defined key_bdy 1991 REAL(KIND=wp), DIMENSION(2,2,kprofno) :: & 1992 & zbmsk ! Boundary mask 1993 REAL(KIND=wp), DIMENSION(jpi,jpj) :: zbdymask 1994 #endif 1749 1995 REAL(KIND=wp), DIMENSION(2,2,kprofno) :: & 1750 1996 & zglam, & ! Model longitude at grid points … … 1754 2000 & igrdj 1755 2001 LOGICAL :: lgridobs ! Is observation on a model grid point. 2002 LOGICAL :: ll_next_to_land ! Is a profile next to land 1756 2003 INTEGER :: iig, ijg ! i,j of observation on model grid point. 1757 2004 INTEGER :: jobs, jobsp, jk, ji, jj … … 1788 2035 1789 2036 END DO 2037 2038 #if defined key_bdy 2039 ! Create a mask grid points in boundary rim 2040 IF (ld_bound_reject) THEN 2041 zbdymask(:,:) = 1.0_wp 2042 DO ji = 1, nb_bdy 2043 DO jj = 1, idx_bdy(ji)%nblen(1) 2044 zbdymask(idx_bdy(ji)%nbi(jj,1),idx_bdy(ji)%nbj(jj,1)) = 0.0_wp 2045 ENDDO 2046 ENDDO 2047 ENDIF 2048 2049 CALL obs_int_comm_2d( 2, 2, kprofno, igrdi, igrdj, zbdymask, zbmsk ) 2050 #endif 1790 2051 1791 2052 CALL obs_int_comm_3d( 2, 2, kprofno, kpk, igrdi, igrdj, pmask, zgmsk ) … … 1815 2076 END DO 1816 2077 END DO 2078 2079 ! Check if next to land 2080 IF ( ANY( zgmsk(1:2,1:2,1,jobs) == 0.0_wp ) ) THEN 2081 ll_next_to_land=.TRUE. 2082 ELSE 2083 ll_next_to_land=.FALSE. 2084 ENDIF 1817 2085 1818 2086 ! Reject observations … … 1832 2100 ENDIF 1833 2101 1834 ! Flag if the observation falls with a model land cell 1835 IF ( SUM( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) & 1836 & == 0.0_wp ) THEN 1837 kobsqc(jobsp) = kobsqc(jobsp) + 12 1838 klanobs = klanobs + 1 1839 CYCLE 2102 ! To check if an observations falls within land there are two cases: 2103 ! 1: z-coordibnates, where the check uses the mask 2104 ! 2: terrain following (eg s-coordinates), 2105 ! where we use the depth of the bottom cell to mask observations 2106 2107 IF( ln_zps .OR. ln_zco ) THEN !(CASE 1) 2108 2109 ! Flag if the observation falls with a model land cell 2110 IF ( SUM( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) & 2111 & == 0.0_wp ) THEN 2112 kobsqc(jobsp) = kobsqc(jobsp) + 12 2113 klanobs = klanobs + 1 2114 CYCLE 2115 ENDIF 2116 2117 ! Flag if the observation is close to land 2118 IF ( MINVAL( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) == & 2119 & 0.0_wp) THEN 2120 knlaobs = knlaobs + 1 2121 IF (ld_nea) THEN 2122 kobsqc(jobsp) = kobsqc(jobsp) + 14 2123 ENDIF 2124 ENDIF 2125 2126 ELSE ! Case 2 2127 ! Flag if the observation is deeper than the bathymetry 2128 ! Or if it is within the mask 2129 IF ( ALL( fsdepw(iig-1:iig+1,ijg-1:ijg+1,kpk) < pobsdep(jobsp) ) & 2130 & .OR. & 2131 & ( SUM( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) & 2132 & == 0.0_wp) ) THEN 2133 kobsqc(jobsp) = kobsqc(jobsp) + 12 2134 klanobs = klanobs + 1 2135 CYCLE 2136 ENDIF 2137 2138 ! Flag if the observation is close to land 2139 IF ( ll_next_to_land ) THEN 2140 knlaobs = knlaobs + 1 2141 IF (ld_nea) THEN 2142 kobsqc(jobsp) = kobsqc(jobsp) + 14 2143 ENDIF 2144 ENDIF 2145 1840 2146 ENDIF 1841 2147 … … 1851 2157 ENDIF 1852 2158 1853 ! Flag if the observation falls is close to land1854 IF ( MINVAL( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) == &1855 & 0.0_wp) THEN1856 IF (ld_nea) kobsqc(jobsp) = kobsqc(jobsp) + 141857 knlaobs = knlaobs + 11858 ENDIF1859 1860 2159 ! Set observation depth equal to that of the first model depth 1861 2160 IF ( pobsdep(jobsp) <= pdep(1) ) THEN 1862 2161 pobsdep(jobsp) = pdep(1) 1863 2162 ENDIF 2163 2164 #if defined key_bdy 2165 ! Flag if the observation falls close to the boundary rim 2166 IF (ld_bound_reject) THEN 2167 IF ( MINVAL( zbmsk(1:2,1:2,jobs) ) == 0.0_wp ) THEN 2168 kobsqc(jobsp) = kobsqc(jobsp) + 15 2169 kbdyobs = kbdyobs + 1 2170 CYCLE 2171 ENDIF 2172 ! for observations on the grid... 2173 IF (lgridobs) THEN 2174 IF (zbmsk(iig,ijg,jobs) == 0.0_wp ) THEN 2175 kobsqc(jobsp) = kobsqc(jobsp) + 15 2176 kbdyobs = kbdyobs + 1 2177 CYCLE 2178 ENDIF 2179 ENDIF 2180 ENDIF 2181 #endif 1864 2182 1865 2183 END DO
Note: See TracChangeset
for help on using the changeset viewer.