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 15187 for NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/diaobs.F90 – NEMO

Ignore:
Timestamp:
2021-08-13T11:34:58+02:00 (3 years ago)
Author:
dford
Message:

Update treatment of SLA and POTM additional/extra variables.

File:
1 edited

Legend:

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

    r15180 r15187  
    249249                  &               sobsgroups(jgroup)%cobstypes ) 
    250250                  ! 
     251               IF( sobsgroups(jgroup)%lsla ) THEN 
     252                  sobsgroups(jgroup)%ssurfdata%cextvars(sobsgroups(jgroup)%next_mdt) = 'MDT' 
     253                  sobsgroups(jgroup)%ssurfdata%cextlong(sobsgroups(jgroup)%next_mdt) = 'Mean dynamic topography' 
     254                  sobsgroups(jgroup)%ssurfdata%cextunit(sobsgroups(jgroup)%next_mdt) = 'Metres' 
     255                  sobsgroups(jgroup)%ssurfdata%caddvars(sobsgroups(jgroup)%nadd_ssh) = 'SSH' 
     256                  DO jvar = 1, sobsgroups(jgroup)%nobstypes 
     257                     sobsgroups(jgroup)%ssurfdata%caddlong(sobsgroups(jgroup)%nadd_ssh,jvar) = 'Model Sea surface height' 
     258                     sobsgroups(jgroup)%ssurfdata%caddunit(sobsgroups(jgroup)%nadd_ssh,jvar) = 'Metres' 
     259                  END DO 
     260               ENDIF 
    251261 
    252262               CALL obs_pre_surf( sobsgroups(jgroup)%ssurfdata,      & 
     
    261271               IF( sobsgroups(jgroup)%lsla ) THEN 
    262272                  CALL obs_rea_mdt( sobsgroups(jgroup)%ssurfdataqc, & 
    263                      &              sobsgroups(jgroup)%n2dint ) 
     273                     &              sobsgroups(jgroup)%n2dint,      & 
     274                     &              sobsgroups(jgroup)%next_mdt ) 
    264275                  IF( sobsgroups(jgroup)%laltbias ) THEN 
    265                      CALL obs_rea_altbias( sobsgroups(jgroup)%ssurfdataqc, & 
    266                         &                  sobsgroups(jgroup)%n2dint,      & 
    267                         &                  sobsgroups(jgroup)%caltbiasfile ) 
     276                     !CALL obs_rea_altbias( sobsgroups(jgroup)%ssurfdataqc, & 
     277                     !   &                  sobsgroups(jgroup)%n2dint,      & 
     278                     !   &                  sobsgroups(jgroup)%caltbiasfile ) 
     279                     CALL obs_app_bias( sobsgroups(jgroup)%ssurfdataqc,   & 
     280                        &               sobsgroups(jgroup)%next_mdt,      &  
     281                        &               sobsgroups(jgroup)%n2dint,        &  
     282                        &               1,                                & 
     283                        &               sobsgroups(jgroup)%caltbiasfile,  & 
     284                        &               'altbias',                        & 
     285                        &               ld_extvar=.TRUE. )  
    268286                  ENDIF 
    269287               ENDIF 
     
    423441                     &               sobsgroups(jgroup)%ravglamscl,        & 
    424442                     &               sobsgroups(jgroup)%ravgphiscl,        & 
    425                      &               sobsgroups(jgroup)%lfp_indegs ) 
     443                     &               sobsgroups(jgroup)%lfp_indegs,        & 
     444                     &               kssh=sobsgroups(jgroup)%nadd_ssh,     & 
     445                     &               kmdt=sobsgroups(jgroup)%next_mdt ) 
    426446 
    427447               END DO 
     
    463483      !! * Local declarations 
    464484      INTEGER :: jgroup                   ! Data set loop variable 
    465       INTEGER :: jo, jvar, jk, jadd, jext 
     485      INTEGER :: jo, jvar, jk, jadd, jext, jadd2, jext2 
    466486      REAL(wp), DIMENSION(:), ALLOCATABLE :: & 
    467487         & zu, & 
    468488         & zv 
     489      LOGICAL, DIMENSION(:), ALLOCATABLE :: ll_write 
    469490      TYPE(obswriinfo) :: sladd, slext 
    470491 
     
    513534                  &                      sobsgroups(jgroup)%sprofdata, .TRUE., numout ) 
    514535 
     536               ! Put additional and extra variable information into obswriinfo structure 
     537               ! used by obs_write. 
     538               ! add/ext variables generated by the OBS code (1...sobsgroups(jgroup)%naddvars) 
     539               ! may duplicate ones read in (%naddvars+1...sobsgroups(jgroup)%sprofdata%nadd) 
     540               ! Check for this, and if so only write out the version generated by the OBS code 
    515541               sladd%inum = sobsgroups(jgroup)%sprofdata%nadd 
     542               ALLOCATE( ll_write(sobsgroups(jgroup)%sprofdata%nadd) ) 
     543               ll_write(:) = .TRUE. 
     544               IF ( (sobsgroups(jgroup)%naddvars > 0) .AND. & 
     545                  & (sobsgroups(jgroup)%sprofdata%nadd > sobsgroups(jgroup)%naddvars) ) THEN 
     546                  DO jadd = sobsgroups(jgroup)%naddvars + 1, sobsgroups(jgroup)%sprofdata%nadd 
     547                     DO jadd2 = 1, sobsgroups(jgroup)%naddvars 
     548                        IF ( TRIM(sobsgroups(jgroup)%sprofdata%caddvars(jadd )) == & 
     549                           & TRIM(sobsgroups(jgroup)%sprofdata%caddvars(jadd2)) ) THEN 
     550                           sladd%inum = sladd%inum - 1 
     551                           ll_write(jadd) = .FALSE. 
     552                        ENDIF 
     553                     END DO 
     554                  END DO 
     555               ENDIF 
    516556               IF ( sladd%inum > 0 ) THEN 
    517557                  ALLOCATE( sladd%ipoint(sladd%inum),                                   & 
     
    519559                     &      sladd%cdlong(sladd%inum,sobsgroups(jgroup)%sprofdata%nvar), & 
    520560                     &      sladd%cdunit(sladd%inum,sobsgroups(jgroup)%sprofdata%nvar) ) 
    521                   DO jadd = 1, sladd%inum 
    522                      sladd%ipoint(jadd) = jadd 
    523                      sladd%cdname(jadd) = sobsgroups(jgroup)%sprofdata%caddvars(jadd) 
    524                      DO jvar = 1, sobsgroups(jgroup)%sprofdata%nvar 
    525                         sladd%cdlong(jadd,jvar) = sobsgroups(jgroup)%sprofdata%caddlong(jadd,jvar) 
    526                         sladd%cdunit(jadd,jvar) = sobsgroups(jgroup)%sprofdata%caddunit(jadd,jvar) 
     561                  jadd2 = 0 
     562                  DO jadd = 1, sobsgroups(jgroup)%sprofdata%nadd 
     563                     IF ( ll_write(jadd) ) THEN 
     564                        jadd2 = jadd2 + 1 
     565                        sladd%ipoint(jadd2) = jadd 
     566                        sladd%cdname(jadd2) = sobsgroups(jgroup)%sprofdata%caddvars(jadd) 
     567                        DO jvar = 1, sobsgroups(jgroup)%sprofdata%nvar 
     568                           sladd%cdlong(jadd2,jvar) = sobsgroups(jgroup)%sprofdata%caddlong(jadd,jvar) 
     569                           sladd%cdunit(jadd2,jvar) = sobsgroups(jgroup)%sprofdata%caddunit(jadd,jvar) 
     570                        END DO 
     571                     ENDIF 
     572                  END DO 
     573               ENDIF 
     574               DEALLOCATE( ll_write ) 
     575                
     576               slext%inum = sobsgroups(jgroup)%sprofdata%next 
     577               ALLOCATE( ll_write(sobsgroups(jgroup)%sprofdata%next) ) 
     578               ll_write(:) = .TRUE. 
     579               IF ( (sobsgroups(jgroup)%nextvars > 0) .AND. & 
     580                  & (sobsgroups(jgroup)%sprofdata%next > sobsgroups(jgroup)%nextvars) ) THEN 
     581                  DO jext = sobsgroups(jgroup)%nextvars + 1, sobsgroups(jgroup)%sprofdata%next 
     582                     DO jext2 = 1, sobsgroups(jgroup)%nextvars 
     583                        IF ( TRIM(sobsgroups(jgroup)%sprofdata%cextvars(jext )) == & 
     584                           & TRIM(sobsgroups(jgroup)%sprofdata%cextvars(jext2)) ) THEN 
     585                           slext%inum = slext%inum - 1 
     586                           ll_write(jext) = .FALSE. 
     587                        ENDIF 
    527588                     END DO 
    528589                  END DO 
    529590               ENDIF 
    530                slext%inum = sobsgroups(jgroup)%sprofdata%next 
    531591               IF ( slext%inum > 0 ) THEN 
    532592                  ALLOCATE( slext%ipoint(slext%inum),   & 
     
    534594                     &      slext%cdlong(slext%inum,1), & 
    535595                     &      slext%cdunit(slext%inum,1) ) 
    536                   DO jext = 1, slext%inum 
    537                      slext%ipoint(jext)   = jext 
    538                      slext%cdname(jext)   = sobsgroups(jgroup)%sprofdata%cextvars(jext) 
    539                      slext%cdlong(jext,1) = sobsgroups(jgroup)%sprofdata%cextlong(jext) 
    540                      slext%cdunit(jext,1) = sobsgroups(jgroup)%sprofdata%cextunit(jext) 
    541                   END DO 
    542                ENDIF 
     596                  jext2 = 0 
     597                  DO jext = 1, sobsgroups(jgroup)%sprofdata%next 
     598                     IF ( ll_write(jext) ) THEN 
     599                        jext2 = jext2 + 1 
     600                        slext%ipoint(jext2)   = jext 
     601                        slext%cdname(jext2)   = sobsgroups(jgroup)%sprofdata%cextvars(jext) 
     602                        slext%cdlong(jext2,1) = sobsgroups(jgroup)%sprofdata%cextlong(jext) 
     603                        slext%cdunit(jext2,1) = sobsgroups(jgroup)%sprofdata%cextunit(jext) 
     604                     ENDIF 
     605                  END DO 
     606               ENDIF 
     607               DEALLOCATE( ll_write ) 
    543608 
    544609               CALL obs_wri_prof( sobsgroups(jgroup)%sprofdata, sobsgroups(jgroup)%cgroupname, sladd, slext ) 
     
    556621                  &                      sobsgroups(jgroup)%ssurfdata, .TRUE., numout ) 
    557622 
     623               ! Put additional and extra variable information into obswriinfo structure 
     624               ! used by obs_write. 
     625               ! add/ext variables generated by the OBS code (1...sobsgroups(jgroup)%naddvars) 
     626               ! may duplicate ones read in (%naddvars+1...sobsgroups(jgroup)%ssurfdata%nadd) 
     627               ! Check for this, and if so only write out the version generated by the OBS code 
    558628               sladd%inum = sobsgroups(jgroup)%ssurfdata%nadd 
     629               ALLOCATE( ll_write(sobsgroups(jgroup)%ssurfdata%nadd) ) 
     630               ll_write(:) = .TRUE. 
     631               IF ( (sobsgroups(jgroup)%naddvars > 0) .AND. & 
     632                  & (sobsgroups(jgroup)%ssurfdata%nadd > sobsgroups(jgroup)%naddvars) ) THEN 
     633                  DO jadd = sobsgroups(jgroup)%naddvars + 1, sobsgroups(jgroup)%ssurfdata%nadd 
     634                     DO jadd2 = 1, sobsgroups(jgroup)%naddvars 
     635                        IF ( TRIM(sobsgroups(jgroup)%ssurfdata%caddvars(jadd )) == & 
     636                           & TRIM(sobsgroups(jgroup)%ssurfdata%caddvars(jadd2)) ) THEN 
     637                           sladd%inum = sladd%inum - 1 
     638                           ll_write(jadd) = .FALSE. 
     639                        ENDIF 
     640                     END DO 
     641                  END DO 
     642               ENDIF 
    559643               IF ( sladd%inum > 0 ) THEN 
    560644                  ALLOCATE( sladd%ipoint(sladd%inum),                                   & 
     
    562646                     &      sladd%cdlong(sladd%inum,sobsgroups(jgroup)%ssurfdata%nvar), & 
    563647                     &      sladd%cdunit(sladd%inum,sobsgroups(jgroup)%ssurfdata%nvar) ) 
    564                   DO jadd = 1, sladd%inum 
    565                      sladd%ipoint(jadd) = jadd 
    566                      sladd%cdname(jadd) = sobsgroups(jgroup)%ssurfdata%caddvars(jadd) 
    567                      DO jvar = 1, sobsgroups(jgroup)%ssurfdata%nvar 
    568                         sladd%cdlong(jadd,jvar) = sobsgroups(jgroup)%ssurfdata%caddlong(jadd,jvar) 
    569                         sladd%cdunit(jadd,jvar) = sobsgroups(jgroup)%ssurfdata%caddunit(jadd,jvar) 
     648                  jadd2 = 0 
     649                  DO jadd = 1, sobsgroups(jgroup)%ssurfdata%nadd 
     650                     IF ( ll_write(jadd) ) THEN 
     651                        jadd2 = jadd2 + 1 
     652                        sladd%ipoint(jadd2) = jadd 
     653                        sladd%cdname(jadd2) = sobsgroups(jgroup)%ssurfdata%caddvars(jadd) 
     654                        DO jvar = 1, sobsgroups(jgroup)%ssurfdata%nvar 
     655                           sladd%cdlong(jadd2,jvar) = sobsgroups(jgroup)%ssurfdata%caddlong(jadd,jvar) 
     656                           sladd%cdunit(jadd2,jvar) = sobsgroups(jgroup)%ssurfdata%caddunit(jadd,jvar) 
     657                        END DO 
     658                     ENDIF 
     659                  END DO 
     660               ENDIF 
     661               DEALLOCATE( ll_write ) 
     662                
     663               slext%inum = sobsgroups(jgroup)%ssurfdata%nextra 
     664               ALLOCATE( ll_write(sobsgroups(jgroup)%ssurfdata%nextra) ) 
     665               ll_write(:) = .TRUE. 
     666               IF ( (sobsgroups(jgroup)%nextvars > 0) .AND. & 
     667                  & (sobsgroups(jgroup)%ssurfdata%nextra > sobsgroups(jgroup)%nextvars) ) THEN 
     668                  DO jext = sobsgroups(jgroup)%nextvars + 1, sobsgroups(jgroup)%ssurfdata%nextra 
     669                     DO jext2 = 1, sobsgroups(jgroup)%nextvars 
     670                        IF ( TRIM(sobsgroups(jgroup)%ssurfdata%cextvars(jext )) == & 
     671                           & TRIM(sobsgroups(jgroup)%ssurfdata%cextvars(jext2)) ) THEN 
     672                           slext%inum = slext%inum - 1 
     673                           ll_write(jext) = .FALSE. 
     674                        ENDIF 
    570675                     END DO 
    571676                  END DO 
    572677               ENDIF 
    573                slext%inum = sobsgroups(jgroup)%ssurfdata%nextra 
    574678               IF ( slext%inum > 0 ) THEN 
    575679                  ALLOCATE( slext%ipoint(slext%inum),   & 
     
    577681                     &      slext%cdlong(slext%inum,1), & 
    578682                     &      slext%cdunit(slext%inum,1) ) 
    579                   DO jext = 1, slext%inum 
    580                      slext%ipoint(jext)   = jext 
    581                      slext%cdname(jext)   = sobsgroups(jgroup)%ssurfdata%cextvars(jext) 
    582                      slext%cdlong(jext,1) = sobsgroups(jgroup)%ssurfdata%cextlong(jext) 
    583                      slext%cdunit(jext,1) = sobsgroups(jgroup)%ssurfdata%cextunit(jext) 
    584                   END DO 
    585                ENDIF 
     683                  jext2 = 0 
     684                  DO jext = 1, sobsgroups(jgroup)%ssurfdata%nextra 
     685                     IF ( ll_write(jext) ) THEN 
     686                        jext2 = jext2 + 1 
     687                        slext%ipoint(jext2)   = jext 
     688                        slext%cdname(jext2)   = sobsgroups(jgroup)%ssurfdata%cextvars(jext) 
     689                        slext%cdlong(jext2,1) = sobsgroups(jgroup)%ssurfdata%cextlong(jext) 
     690                        slext%cdunit(jext2,1) = sobsgroups(jgroup)%ssurfdata%cextunit(jext) 
     691                     ENDIF 
     692                  END DO 
     693               ENDIF 
     694               DEALLOCATE( ll_write ) 
    586695 
    587696               CALL obs_wri_surf( sobsgroups(jgroup)%ssurfdata, sobsgroups(jgroup)%cgroupname, sladd, slext ) 
Note: See TracChangeset for help on using the changeset viewer.