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_oper.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_oper.F90

    r12610 r13384  
    544544 
    545545   SUBROUTINE obs_surf_opt( surfdataqc, kt, kpi, kpj,            & 
    546       &                     kit000, kdaystp, psurf, pclim, psurfmask,   & 
     546      &                     kit000, kdaystp, kvar, & 
     547      &                     psurf, pclim, psurfmask, & 
     548      &                     plam, pphi, & 
    547549      &                     k2dint, ldnightav, plamscl, pphiscl, & 
    548550      &                     lindegrees, kmeanstp ) 
     
    579581      !!      ! 15-02 (M. Martin) Combined routine for surface types 
    580582      !!      ! 17-03 (M. Martin) Added horizontal averaging options 
     583      !!      ! 20-08 (M. Martin) Added surface velocity options       
    581584      !!----------------------------------------------------------------------- 
    582585 
     
    595598                                       !   (kit000-1 = restart time) 
    596599      INTEGER, INTENT(IN) :: kdaystp   ! Number of time steps per day 
     600      INTEGER, INTENT(IN) :: kvar      ! Number of variables in surfdataqc      
    597601      INTEGER, INTENT(IN) :: k2dint    ! Horizontal interpolation type (see header) 
    598602      INTEGER, INTENT(IN), OPTIONAL :: & 
     
    603607         & pclim,  &                   ! Climatological surface field          
    604608         & psurfmask                   ! Land-sea mask 
     609      REAL(KIND=wp), INTENT(IN), DIMENSION(kpi,kpj) :: & 
     610         & plam,   &                   ! Model longitudes for variable 
     611         & pphi                        ! Model latitudes for variable          
    605612      LOGICAL, INTENT(IN) :: ldnightav ! Logical for averaging night-time data 
    606613      REAL(KIND=wp), INTENT(IN) :: & 
     
    670677      CALL obs_max_fpsize( k2dint, plamscl, pphiscl, lindegrees, psurfmask, imaxifp, imaxjfp ) 
    671678 
    672  
    673679      IF ( l_timemean ) THEN 
    674680         ! Initialize time mean for first timestep 
     
    681687            DO jj = 1, jpj 
    682688               DO ji = 1, jpi 
    683                   surfdataqc%vdmean(ji,jj) = 0.0 
     689                  surfdataqc%vdmean(ji,jj,kvar) = 0.0 
    684690               END DO 
    685691            END DO 
     
    690696         DO jj = 1, jpj 
    691697            DO ji = 1, jpi 
    692                surfdataqc%vdmean(ji,jj) = surfdataqc%vdmean(ji,jj) & 
    693                   &                        + psurf(ji,jj) 
     698               surfdataqc%vdmean(ji,jj,kvar) = surfdataqc%vdmean(ji,jj,kvar) & 
     699                  &                            + psurf(ji,jj) 
    694700            END DO 
    695701         END DO 
     
    701707            DO jj = 1, jpj 
    702708               DO ji = 1, jpi 
    703                   surfdataqc%vdmean(ji,jj) = surfdataqc%vdmean(ji,jj) & 
    704                      &                       * zmeanstp 
     709                  surfdataqc%vdmean(ji,jj,kvar) = surfdataqc%vdmean(ji,jj,kvar) & 
     710                     &                            * zmeanstp 
    705711               END DO 
    706712            END DO 
     
    729735            DO jj = 1, jpj 
    730736               DO ji = 1, jpi 
    731                   surfdataqc%vdmean(ji,jj) = 0.0 
     737                  surfdataqc%vdmean(ji,jj,kvar) = 0.0 
    732738                  zmeanday(ji,jj) = 0.0 
    733739                  icount_night(ji,jj) = 0 
     
    743749            DO ji = 1, jpi 
    744750               ! Increment the temperature field for computing night mean and counter 
    745                surfdataqc%vdmean(ji,jj) = surfdataqc%vdmean(ji,jj)  & 
    746                       &                    + psurf(ji,jj) * REAL( imask_night(ji,jj) ) 
     751               surfdataqc%vdmean(ji,jj,kvar) = surfdataqc%vdmean(ji,jj,kvar)  & 
     752                      &                        + psurf(ji,jj) * REAL( imask_night(ji,jj) ) 
    747753               zmeanday(ji,jj)          = zmeanday(ji,jj) + psurf(ji,jj) 
    748754               icount_night(ji,jj)      = icount_night(ji,jj) + imask_night(ji,jj) 
     
    758764                  ! Test if "no night" point 
    759765                  IF ( icount_night(ji,jj) > 0 ) THEN 
    760                      surfdataqc%vdmean(ji,jj) = surfdataqc%vdmean(ji,jj) & 
    761                        &                        / REAL( icount_night(ji,jj) ) 
     766                     surfdataqc%vdmean(ji,jj,kvar) = surfdataqc%vdmean(ji,jj,kvar) & 
     767                       &                            / REAL( icount_night(ji,jj) ) 
    762768                  ELSE 
    763769                     !At locations where there is no night (e.g. poles), 
    764770                     ! calculate daily mean instead of night-time mean. 
    765                      surfdataqc%vdmean(ji,jj) = zmeanday(ji,jj) * zdaystp 
     771                     surfdataqc%vdmean(ji,jj,kvar) = zmeanday(ji,jj) * zdaystp 
    766772                  ENDIF 
    767773               END DO 
     
    772778 
    773779      ! Get the data for interpolation 
    774  
    775780      ALLOCATE( & 
    776          & zweig(imaxifp,imaxjfp,1),      & 
    777          & igrdi(imaxifp,imaxjfp,isurf), & 
    778          & igrdj(imaxifp,imaxjfp,isurf), & 
    779          & zglam(imaxifp,imaxjfp,isurf), & 
    780          & zgphi(imaxifp,imaxjfp,isurf), & 
    781          & zmask(imaxifp,imaxjfp,isurf), & 
    782          & zsurf(imaxifp,imaxjfp,isurf), & 
    783          & zsurftmp(imaxifp,imaxjfp,isurf),  & 
    784          & zglamf(imaxifp+1,imaxjfp+1,isurf), & 
    785          & zgphif(imaxifp+1,imaxjfp+1,isurf), & 
    786          & igrdip1(imaxifp+1,imaxjfp+1,isurf), & 
    787          & igrdjp1(imaxifp+1,imaxjfp+1,isurf) & 
     781         & zweig(imaxifp,imaxjfp,1),       & 
     782         & igrdi(imaxifp,imaxjfp,isurf),   & 
     783         & igrdj(imaxifp,imaxjfp,isurf),   & 
     784         & zglam(imaxifp,imaxjfp,isurf),   & 
     785         & zgphi(imaxifp,imaxjfp,isurf),   & 
     786         & zmask(imaxifp,imaxjfp,isurf),   & 
     787         & zsurf(imaxifp,imaxjfp,isurf),   & 
     788         & zsurftmp(imaxifp,imaxjfp,isurf) & 
    788789         & ) 
     790 
     791      IF ( k2dint > 4 ) THEN 
     792         ALLOCATE( & 
     793            & zglamf(imaxifp+1,imaxjfp+1,isurf),  & 
     794            & zgphif(imaxifp+1,imaxjfp+1,isurf),  & 
     795            & igrdip1(imaxifp+1,imaxjfp+1,isurf), & 
     796            & igrdjp1(imaxifp+1,imaxjfp+1,isurf)  & 
     797            & ) 
     798      ENDIF 
    789799 
    790800      IF ( surfdataqc%lclim ) ALLOCATE( zclim(imaxifp,imaxjfp,isurf) ) 
     
    793803         iobs = jobs - surfdataqc%nsurfup 
    794804         DO ji = 0, imaxifp 
    795             imodi = surfdataqc%mi(jobs) - int(imaxifp/2) + ji - 1 
     805            imodi = surfdataqc%mi(jobs,kvar) - int(imaxifp/2) + ji - 1 
    796806             
    797807            !Deal with wrap around in longitude 
     
    800810             
    801811            DO jj = 0, imaxjfp 
    802                imodj = surfdataqc%mj(jobs) - int(imaxjfp/2) + jj - 1 
     812               imodj = surfdataqc%mj(jobs,kvar) - int(imaxjfp/2) + jj - 1 
    803813               !If model values are out of the domain to the north/south then 
    804814               !set them to be the edge of the domain 
     
    806816               IF ( imodj > jpjglo ) imodj = jpjglo 
    807817 
    808                igrdip1(ji+1,jj+1,iobs) = imodi 
    809                igrdjp1(ji+1,jj+1,iobs) = imodj 
     818               IF ( k2dint > 4 ) THEN 
     819                  igrdip1(ji+1,jj+1,iobs) = imodi 
     820                  igrdjp1(ji+1,jj+1,iobs) = imodj 
     821               ENDIF 
    810822                
    811823               IF ( ji >= 1 .AND. jj >= 1 ) THEN 
     
    819831 
    820832      CALL obs_int_comm_2d( imaxifp, imaxjfp, isurf, kpi, kpj, & 
    821          &                  igrdi, igrdj, glamt, zglam ) 
     833         &                  igrdi, igrdj, plam, zglam ) 
    822834      CALL obs_int_comm_2d( imaxifp, imaxjfp, isurf, kpi, kpj, & 
    823          &                  igrdi, igrdj, gphit, zgphi ) 
     835         &                  igrdi, igrdj, pphi, zgphi ) 
    824836      CALL obs_int_comm_2d( imaxifp, imaxjfp, isurf, kpi, kpj, & 
    825837         &                  igrdi, igrdj, psurfmask, zmask ) 
     
    831843            IF (lwp) WRITE(numout,*)' Interpolating the time mean values on time step: ',kt 
    832844            CALL obs_int_comm_2d( imaxifp, imaxjfp, isurf, kpi, kpj, & 
    833                &                  igrdi, igrdj, surfdataqc%vdmean(:,:), zsurfm ) 
     845               &                  igrdi, igrdj, surfdataqc%vdmean(:,:,kvar), zsurfm ) 
    834846         ENDIF 
    835847      ELSE 
     
    858870 
    859871         CALL obs_int_comm_2d( imaxifp,imaxjfp, isurf, kpi, kpj, igrdi, igrdj, & 
    860             &               surfdataqc%vdmean(:,:), zsurfm ) 
     872            &                  surfdataqc%vdmean(:,:,kvar), zsurfm ) 
    861873 
    862874      ENDIF 
     
    937949               surfdataqc%rmod(jobs,1) = surfdataqc%rext(jobs,1) - surfdataqc%rext(jobs,2) 
    938950            ELSE 
    939                surfdataqc%rmod(jobs,1) = zext(1) 
     951               surfdataqc%rmod(jobs,kvar) = zext(1) 
    940952            ENDIF 
    941953 
     
    985997         & zmask, & 
    986998         & zsurf, & 
    987          & zsurftmp, & 
    988          & zglamf, & 
    989          & zgphif, & 
    990          & igrdip1,& 
    991          & igrdjp1 & 
     999         & zsurftmp & 
    9921000         & ) 
    9931001 
     1002      IF ( k2dint > 4 ) THEN 
     1003         DEALLOCATE( &      
     1004            & zglamf, & 
     1005            & zgphif, & 
     1006            & igrdip1,& 
     1007            & igrdjp1 & 
     1008            & ) 
     1009      ENDIF 
     1010             
    9941011      IF ( surfdataqc%lclim ) DEALLOCATE( zclim ) 
    9951012 
     
    10011018      ENDIF 
    10021019 
    1003       surfdataqc%nsurfup = surfdataqc%nsurfup + isurf 
     1020      IF ( kvar == surfdataqc%nvar ) THEN 
     1021         surfdataqc%nsurfup = surfdataqc%nsurfup + isurf 
     1022      ENDIF 
    10041023 
    10051024   END SUBROUTINE obs_surf_opt 
Note: See TracChangeset for help on using the changeset viewer.