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 13384 for branches/UKMO/dev_r5518_obs_oper_update_vel_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_surf.F90 – NEMO

Ignore:
Timestamp:
2020-08-06T10:50:07+02:00 (4 years ago)
Author:
mattmartin
Message:

First working version of surface velocity observation operator code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_obs_oper_update_vel_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_surf.F90

    r12610 r13384  
    8585      INTEGER :: jj 
    8686      INTEGER :: jk 
     87      INTEGER :: jvar 
    8788      INTEGER :: iflag 
    8889      INTEGER :: inobf 
     
    107108         & ityp, & 
    108109         & itypmpp 
    109       INTEGER, DIMENSION(:), ALLOCATABLE :: & 
     110      INTEGER, DIMENSION(:,:), ALLOCATABLE :: & 
    110111         & iobsi,    & 
    111112         & iobsj,    & 
    112          & iproc,    & 
     113         & iproc 
     114      INTEGER, DIMENSION(:), ALLOCATABLE :: &          
    113115         & iindx,    & 
    114116         & ifileidx, & 
     
    126128      TYPE(obfbdata), POINTER, DIMENSION(:) :: & 
    127129         & inpfiles 
    128  
     130      CHARACTER(LEN=256) :: cout1  ! Diagnostic output line 
     131       
    129132      ! Local initialization 
    130133      iobs  = 0 
     
    278281 
    279282            IF ( inpfiles(jj)%nobs > 0 ) THEN 
    280                inpfiles(jj)%iproc = -1 
    281                inpfiles(jj)%iobsi = -1 
    282                inpfiles(jj)%iobsj = -1 
     283               inpfiles(jj)%iproc(:,:) = -1 
     284               inpfiles(jj)%iobsi(:,:) = -1 
     285               inpfiles(jj)%iobsj(:,:) = -1 
    283286            ENDIF 
    284287 
     
    295298               END DO 
    296299            ENDIF    
    297  
     300             
    298301            inowin = 0 
    299302            DO ji = 1, inpfiles(jj)%nobs 
     
    305308            ALLOCATE( zlam(inowin)  ) 
    306309            ALLOCATE( zphi(inowin)  ) 
    307             ALLOCATE( iobsi(inowin) ) 
    308             ALLOCATE( iobsj(inowin) ) 
    309             ALLOCATE( iproc(inowin) ) 
     310            ALLOCATE( iobsi(inowin,kvars) ) 
     311            ALLOCATE( iobsj(inowin,kvars) ) 
     312            ALLOCATE( iproc(inowin,kvars) ) 
    310313            inowin = 0 
    311314            DO ji = 1, inpfiles(jj)%nobs 
     
    318321            END DO 
    319322 
    320             CALL obs_grid_search( inowin, zlam, zphi, iobsi, iobsj, iproc, 'T' ) 
     323            ! Assume anything other than velocity is on T grid 
     324            IF ( TRIM( inpfiles(jj)%cname(1) ) == 'UVEL' ) THEN 
     325               CALL obs_grid_search( inowin, zlam, zphi, iobsi(:,1), iobsj(:,1), & 
     326                  &                  iproc(:,1), 'U' ) 
     327               CALL obs_grid_search( inowin, zlam, zphi, iobsi(:,2), iobsj(:,2), & 
     328                  &                  iproc(:,2), 'V' ) 
     329            ELSE 
     330               CALL obs_grid_search( inowin, zlam, zphi, iobsi(:,1), iobsj(:,1), & 
     331                  &                  iproc(:,1), 'T' ) 
     332               IF ( kvars > 1 ) THEN 
     333                  DO jvar = 2, kvars 
     334                     iobsi(:,jvar) = iobsi(:,1) 
     335                     iobsj(:,jvar) = iobsj(:,1) 
     336                     iproc(:,jvar) = iproc(:,1) 
     337                  END DO 
     338               ENDIF 
     339            ENDIF 
    321340 
    322341            inowin = 0 
     
    325344                  & ( inpfiles(jj)%ptim(ji) <= djulend(jj) )       ) THEN 
    326345                  inowin = inowin + 1 
    327                   inpfiles(jj)%iproc(ji,1) = iproc(inowin) 
    328                   inpfiles(jj)%iobsi(ji,1) = iobsi(inowin) 
    329                   inpfiles(jj)%iobsj(ji,1) = iobsj(inowin) 
     346                  DO jvar = 1, kvars 
     347                     inpfiles(jj)%iproc(ji,jvar) = iproc(inowin,jvar) 
     348                     inpfiles(jj)%iobsi(ji,jvar) = iobsi(inowin,jvar) 
     349                     inpfiles(jj)%iobsj(ji,jvar) = iobsj(inowin,jvar) 
     350                  END DO 
    330351               ENDIF 
    331352            END DO 
     
    448469 
    449470               ! Coordinate search parameters 
    450                surfdata%mi  (iobs) = inpfiles(jj)%iobsi(ji,1) 
    451                surfdata%mj  (iobs) = inpfiles(jj)%iobsj(ji,1) 
    452  
     471               DO jvar = 1, kvars 
     472                  surfdata%mi(iobs,jvar) = inpfiles(jj)%iobsi(ji,jvar) 
     473                  surfdata%mj(iobs,jvar) = inpfiles(jj)%iobsj(ji,jvar) 
     474               END DO 
     475                
    453476               ! WMO number 
    454477               surfdata%cwmo(iobs) = inpfiles(jj)%cdwmo(ji) 
     
    480503 
    481504               ! Observed value 
    482                surfdata%robs(iobs,1) = inpfiles(jj)%pob(1,ji,1) 
     505               DO jvar = 1, kvars                
     506                  surfdata%robs(iobs,jvar) = inpfiles(jj)%pob(1,ji,jvar) 
     507               END DO 
    483508               IF ( TRIM(surfdata%cvars(1)) == 'FBD' ) THEN 
    484509                   surfdata%rext(iobs,1) = inpfiles(jj)%pob(1,ji,1) 
     
    488513               ! Model and MDT is set to fbrmdi unless read from file 
    489514               IF ( ldmod ) THEN 
    490                   surfdata%rmod(iobs,1) = inpfiles(jj)%padd(1,ji,1,1) 
     515                  DO jvar = 1, kvars                               
     516                     surfdata%rmod(iobs,jvar) = inpfiles(jj)%padd(1,ji,1,jvar) 
     517                  END DO 
    491518                  IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) THEN 
    492519                     surfdata%rext(iobs,1) = inpfiles(jj)%padd(1,ji,2,1) 
     
    494521                  ENDIF 
    495522                ELSE 
    496                   surfdata%rmod(iobs,1) = fbrmdi 
     523                  DO jvar = 1, kvars                 
     524                     surfdata%rmod(iobs,jvar) = fbrmdi 
     525                  END DO 
    497526                  IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) surfdata%rext(iobs,:) = fbrmdi 
    498527               ENDIF 
    499528                
    500529               ! Initialise climatology if set 
    501                IF ( surfdata%lclim ) surfdata%rclm(iobs,1) = fbrmdi 
     530               IF ( surfdata%lclim ) THEN 
     531                  DO jvar = 1, kvars 
     532                     surfdata%rclm(iobs,jvar) = fbrmdi 
     533                  END DO 
     534               ENDIF 
    502535                
    503536               ! STD (obs error standard deviation) read from file and passed through obs operator 
     
    521554      !----------------------------------------------------------------------- 
    522555      IF (lwp) THEN 
    523  
     556         DO jvar = 1, surfdata%nvar        
     557            IF ( jvar == 1 ) THEN 
     558               cout1=TRIM(surfdata%cvars(1))                   
     559            ELSE 
     560               WRITE(cout1,'(A,A1,A)') TRIM(cout1), '/', TRIM(surfdata%cvars(jvar))             
     561            ENDIF 
     562         END DO 
     563  
    524564         WRITE(numout,*) 
    525          WRITE(numout,'(1X,A)')TRIM( surfdata%cvars(1) )//' data' 
     565         WRITE(numout,'(1X,A)')TRIM( cout1 )//' data' 
    526566         WRITE(numout,'(1X,A)')'--------------' 
    527567         DO jj = 1,8 
     
    533573            & '---------------------------------------------------------------' 
    534574         WRITE(numout,'(1X,A,I8)') & 
    535             & 'Total data for variable '//TRIM( surfdata%cvars(1) )// & 
     575            & 'Total data for variable '//TRIM( cout1 )// & 
    536576            & '           = ', iobsmpp 
    537577         WRITE(numout,'(1X,A)') & 
Note: See TracChangeset for help on using the changeset viewer.