New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 15225 for NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_prep.F90 – NEMO

Ignore:
Timestamp:
2021-09-02T17:52:53+02:00 (3 years ago)
Author:
dford
Message:

Improve handling of velocities, including adding surface currents.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_prep.F90

    r15180 r15225  
    2222   USE obs_inter_sup      ! Interpolation support 
    2323   USE obs_oper           ! Observation operators 
     24   USE obs_field, ONLY : &  ! Velocity variable names 
     25      & cobsname_uvel, & 
     26      & cobsname_vvel 
    2427   USE lib_mpp, ONLY :   ctl_warn, ctl_stop 
    2528   USE bdy_oce, ONLY : &        ! Boundary information 
     
    150153      ! ----------------------------------------------------------------------- 
    151154 
    152       CALL obs_coo_grd( surfdata%nsurf,   surfdata%mi, surfdata%mj, & 
    153          &              surfdata%nqc,     igrdobs                         ) 
     155      DO jvar = 1, surfdata%nvar 
     156         CALL obs_coo_grd( surfdata%nsurf,      surfdata%mi(:,jvar),         & 
     157            &              surfdata%mj(:,jvar), surfdata%nqc,        igrdobs ) 
     158      END DO 
    154159 
    155160      CALL obs_mpp_sum_integer( igrdobs, igrdobsmpp ) 
     
    160165 
    161166      DO jvar = 1, surfdata%nvar 
    162          CALL obs_coo_spc_2d( surfdata%nsurf,                   & 
    163             &                 jpi,             jpj,             & 
    164             &                 surfdata%mi,     surfdata%mj,    &  
    165             &                 surfdata%rlam,   surfdata%rphi,   & 
    166             &                 pglam(:,:,jvar), pgphi(:,:,jvar), & 
    167             &                 zmask(:,:,jvar), surfdata%nqc,    & 
    168             &                 iosdsobs(jvar),  ilansobs(jvar),  & 
    169             &                 inlasobs(jvar),  ld_nea,          & 
    170             &                 ibdysobs(jvar),  ld_bound_reject, & 
     167         CALL obs_coo_spc_2d( surfdata%nsurf,                           & 
     168            &                 jpi,                 jpj,                 & 
     169            &                 surfdata%mi(:,jvar), surfdata%mj(:,jvar), &  
     170            &                 surfdata%rlam,       surfdata%rphi,       & 
     171            &                 pglam(:,:,jvar),     pgphi(:,:,jvar),    & 
     172            &                 zmask(:,:,jvar),     surfdata%nqc,        & 
     173            &                 iosdsobs(jvar),      ilansobs(jvar),      & 
     174            &                 inlasobs(jvar),      ld_nea,              & 
     175            &                 ibdysobs(jvar),      ld_bound_reject,    & 
    171176            &                 iqc_cutoff                     ) 
    172177         CALL obs_mpp_sum_integer( iosdsobs(jvar), iosdsobsmpp(jvar) ) 
     
    333338      INTEGER :: iuvchkumpp                            !  - reject UVEL if VVEL rejected 
    334339      INTEGER :: iuvchkvmpp                            !  - reject VVEL if UVEL rejected 
     340      INTEGER :: iuvar                                 !  - UVEL index 
     341      INTEGER :: ivvar                                 !  - VVEL index 
    335342      TYPE(obs_prof_valid) ::  llvalid      ! Profile selection  
    336343      TYPE(obs_prof_valid), DIMENSION(profdata%nvar) :: & 
     
    443450      ! ----------------------------------------------------------------------- 
    444451 
    445       IF ( TRIM(profdata%cvars(1)) == 'UVEL' ) THEN 
    446          CALL obs_uv_rej( profdata, iuvchku, iuvchkv, iqc_cutoff ) 
     452      iuvar = 0 
     453      ivvar = 0 
     454      DO jvar = 1,profdata%nvar 
     455         IF ( TRIM(profdata%cvars(jvar)) == cobsname_uvel ) THEN 
     456            iuvar = jvar 
     457         ELSEIF ( TRIM(profdata%cvars(jvar)) == cobsname_vvel ) THEN 
     458            ivvar = jvar 
     459         ENDIF 
     460      END DO 
     461      IF ( (iuvar > 0) .AND. (ivvar > 0) ) THEN 
     462         CALL obs_uv_rej( profdata, iuvchku, iuvchkv, iqc_cutoff, iuvar, ivvar ) 
    447463         CALL obs_mpp_sum_integer( iuvchku, iuvchkumpp ) 
    448464         CALL obs_mpp_sum_integer( iuvchkv, iuvchkvmpp ) 
     
    504520                  &            inlavobsmpp(jvar) 
    505521            ENDIF 
    506             IF ( TRIM(profdata%cvars(jvar)) == 'UVEL' ) THEN 
    507                WRITE(numout,*) ' U observation rejected since V rejected     = ', & 
    508                   &            iuvchku 
    509             ELSE IF ( TRIM(profdata%cvars(jvar)) == 'VVEL' ) THEN 
    510                WRITE(numout,*) ' V observation rejected since U rejected     = ', & 
    511                   &            iuvchkv 
     522            IF ( (iuvar > 0) .AND. (ivvar > 0) ) THEN 
     523               IF ( TRIM(profdata%cvars(jvar)) == cobsname_uvel ) THEN 
     524                  WRITE(numout,*) ' U observation rejected since V rejected     = ', & 
     525                     &            iuvchku 
     526               ELSE IF ( TRIM(profdata%cvars(jvar)) == cobsname_vvel ) THEN 
     527                  WRITE(numout,*) ' V observation rejected since U rejected     = ', & 
     528                     &            iuvchkv 
     529               ENDIF 
    512530            ENDIF 
    513531            WRITE(numout,*) ' Remaining '//prodatqc%cvars(jvar)//' data near open boundary (removed) = ',& 
     
    13741392 
    13751393 
    1376    SUBROUTINE obs_uv_rej( profdata, knumu, knumv, kqc_cutoff ) 
     1394   SUBROUTINE obs_uv_rej( profdata, knumu, knumv, kqc_cutoff, kuvar, kvvar ) 
    13771395      !!---------------------------------------------------------------------- 
    13781396      !!                    ***  ROUTINE obs_uv_rej *** 
     
    13911409      INTEGER, INTENT(INOUT) :: knumu             ! Number of u rejected 
    13921410      INTEGER, INTENT(INOUT) :: knumv             ! Number of v rejected 
    1393       INTEGER, INTENT(IN) :: kqc_cutoff           ! QC cutoff value 
     1411      INTEGER, INTENT(IN)    :: kqc_cutoff        ! QC cutoff value 
     1412      INTEGER, INTENT(IN)    :: kuvar             ! Index of u 
     1413      INTEGER, INTENT(IN)    :: kvvar             ! Index of v 
    13941414      ! 
    13951415      INTEGER :: jprof 
     
    14001420      DO jprof = 1, profdata%nprof      !==  Loop over profiles  ==! 
    14011421         ! 
    1402          IF ( ( profdata%npvsta(jprof,1) /= profdata%npvsta(jprof,2) ) .OR. & 
    1403             & ( profdata%npvend(jprof,1) /= profdata%npvend(jprof,2) ) ) THEN 
     1422         IF ( ( profdata%npvsta(jprof,kuvar) /= profdata%npvsta(jprof,kvvar) ) .OR. & 
     1423            & ( profdata%npvend(jprof,kuvar) /= profdata%npvend(jprof,kvvar) ) ) THEN 
    14041424            ! 
    14051425            CALL ctl_stop('U,V profiles inconsistent in obs_uv_rej') 
     
    14081428         ENDIF 
    14091429         ! 
    1410          DO jobs = profdata%npvsta(jprof,1), profdata%npvend(jprof,1) 
     1430         DO jobs = profdata%npvsta(jprof,kuvar), profdata%npvend(jprof,kuvar) 
    14111431            !   
    1412             IF ( ( profdata%var(1)%nvqc(jobs) >  kqc_cutoff ) .AND. & 
    1413                & ( profdata%var(2)%nvqc(jobs) <=  kqc_cutoff) ) THEN 
    1414                profdata%var(2)%nvqc(jobs) = IBSET(profdata%var(1)%nvqc(jobs),15) 
     1432            IF ( ( profdata%var(kuvar)%nvqc(jobs) >  kqc_cutoff ) .AND. & 
     1433               & ( profdata%var(kvvar)%nvqc(jobs) <=  kqc_cutoff) ) THEN 
     1434               profdata%var(kvvar)%nvqc(jobs) = IBSET(profdata%var(kuvar)%nvqc(jobs),15) 
    14151435               knumv = knumv + 1 
    14161436            ENDIF 
    1417             IF ( ( profdata%var(2)%nvqc(jobs) >  kqc_cutoff ) .AND. & 
    1418                & ( profdata%var(1)%nvqc(jobs) <=  kqc_cutoff) ) THEN 
    1419                profdata%var(1)%nvqc(jobs) = IBSET(profdata%var(1)%nvqc(jobs),15) 
     1437            IF ( ( profdata%var(kvvar)%nvqc(jobs) >  kqc_cutoff ) .AND. & 
     1438               & ( profdata%var(kuvar)%nvqc(jobs) <=  kqc_cutoff) ) THEN 
     1439               profdata%var(kuvar)%nvqc(jobs) = IBSET(profdata%var(kuvar)%nvqc(jobs),15) 
    14201440               knumu = knumu + 1 
    14211441            ENDIF 
Note: See TracChangeset for help on using the changeset viewer.