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 15799 for NEMO/branches/UKMO/NEMO_4.0.4_FOAM_package/src/OCE/OBS/obs_surf_def.F90 – NEMO

Ignore:
Timestamp:
2022-04-25T17:15:21+02:00 (2 years ago)
Author:
dford
Message:

More generic interface and structure for OBS code. See Met Office utils tickets 471 and 530.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/NEMO_4.0.4_FOAM_package/src/OCE/OBS/obs_surf_def.F90

    r14075 r15799  
    2323   USE obs_mpp, ONLY : &  ! MPP tools  
    2424      obs_mpp_sum_integer 
     25   USE obs_fbm            ! Obs feedback format 
    2526 
    2627   IMPLICIT NONE 
     
    4546      INTEGER :: nsurfmpp   !: Global number of surface data within window 
    4647      INTEGER :: nvar       !: Number of variables at observation points 
     48      INTEGER :: nadd       !: Number of additional fields at observation points 
    4749      INTEGER :: nextra     !: Number of extra fields at observation points 
    4850      INTEGER :: nstp       !: Number of time steps 
     
    5557 
    5658      INTEGER, POINTER, DIMENSION(:) :: & 
    57          & mi,   &        !: i-th grid coord. for interpolating to surface observation 
    58          & mj,   &        !: j-th grid coord. for interpolating to surface observation 
    5959         & mt,   &        !: time record number for gridded data 
    6060         & nsidx,&        !: Surface observation number 
     
    6969         & ntyp           !: Type of surface observation product 
    7070 
    71       CHARACTER(len=8), POINTER, DIMENSION(:) :: & 
    72          & cvars          !: Variable names 
    73  
    74       CHARACTER(LEN=8), POINTER, DIMENSION(:) :: & 
     71      INTEGER, POINTER, DIMENSION(:,:) :: & 
     72         & mi,   &        !: i-th grid coord. for interpolating to surface observation 
     73         & mj             !: j-th grid coord. for interpolating to surface observation 
     74 
     75      CHARACTER(len=ilenname), POINTER, DIMENSION(:) :: & 
     76         & cvars,    &    !: Variable names 
     77         & cextvars, &    !: Extra variable names 
     78         & caddvars       !: Additional variable names 
     79 
     80      CHARACTER(len=ilenlong), POINTER, DIMENSION(:) :: & 
     81         & clong,    &    !: Variable long names 
     82         & cextlong       !: Extra variable long names 
     83 
     84      CHARACTER(len=ilenlong), POINTER, DIMENSION(:,:) :: & 
     85         & caddlong       !: Additional variable long names 
     86 
     87      CHARACTER(len=ilenunit), POINTER, DIMENSION(:) :: & 
     88         & cunit,    &    !: Variable units 
     89         & cextunit       !: Extra variable units 
     90 
     91      CHARACTER(len=ilenunit), POINTER, DIMENSION(:,:) :: & 
     92         & caddunit       !: Additional variable units 
     93 
     94      CHARACTER(len=ilengrid), POINTER, DIMENSION(:) :: & 
     95         & cgrid          !: Variable grids 
     96 
     97      CHARACTER(LEN=ilenwmo), POINTER, DIMENSION(:) :: & 
    7598         & cwmo           !: WMO indentifier 
    7699          
     
    86109         & rext           !: Extra fields interpolated to observation points 
    87110 
    88       REAL(KIND=wp), POINTER, DIMENSION(:,:) :: & 
     111      REAL(KIND=wp), POINTER, DIMENSION(:,:,:) :: & 
     112         & radd           !: Additional fields interpolated to observation points 
     113 
     114      REAL(KIND=wp), POINTER, DIMENSION(:,:,:) :: & 
    89115         & vdmean         !: Time averaged of model field 
    90116 
     
    121147CONTAINS 
    122148    
    123    SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kextra, kstp, kpi, kpj ) 
     149   SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kadd, kextra, kstp, kpi, kpj ) 
    124150      !!---------------------------------------------------------------------- 
    125151      !!                     ***  ROUTINE obs_surf_alloc  *** 
     
    136162      INTEGER, INTENT(IN) :: ksurf   ! Number of surface observations 
    137163      INTEGER, INTENT(IN) :: kvar    ! Number of surface variables 
     164      INTEGER, INTENT(IN) :: kadd    ! Number of additional fields at observation points 
    138165      INTEGER, INTENT(IN) :: kextra  ! Number of extra fields at observation points 
    139166      INTEGER, INTENT(IN) :: kstp    ! Number of time steps 
     
    143170      !!* Local variables 
    144171      INTEGER :: ji 
    145       INTEGER :: jvar 
     172      INTEGER :: jvar, jadd, jext 
    146173 
    147174      ! Set bookkeeping variables 
     
    149176      surf%nsurf    = ksurf 
    150177      surf%nsurfmpp = 0 
     178      surf%nadd     = kadd 
    151179      surf%nextra   = kextra 
    152180      surf%nvar     = kvar 
     
    158186 
    159187      ALLOCATE( & 
    160          & surf%cvars(kvar)    & 
     188         & surf%cvars(kvar), & 
     189         & surf%clong(kvar), & 
     190         & surf%cunit(kvar), & 
     191         & surf%cgrid(kvar)  & 
    161192         & ) 
    162193 
    163194      DO jvar = 1, kvar 
    164195         surf%cvars(jvar) = "NotSet" 
     196         surf%clong(jvar) = "NotSet" 
     197         surf%cunit(jvar) = "NotSet" 
     198         surf%cgrid(jvar) = "" 
     199      END DO 
     200 
     201      ! Allocate additional/extra variable metadata 
     202 
     203      ALLOCATE( & 
     204         & surf%caddvars(kadd),      & 
     205         & surf%caddlong(kadd,kvar), & 
     206         & surf%caddunit(kadd,kvar), & 
     207         & surf%cextvars(kextra),    & 
     208         & surf%cextlong(kextra),    & 
     209         & surf%cextunit(kextra)     & 
     210         ) 
     211          
     212      DO jadd = 1, kadd 
     213         surf%caddvars(jadd) = "NotSet" 
     214         DO jvar = 1, kvar 
     215            surf%caddlong(jadd,jvar) = "NotSet" 
     216            surf%caddunit(jadd,jvar) = "NotSet" 
     217         END DO 
     218      END DO 
     219          
     220      DO jext = 1, kextra 
     221         surf%cextvars(jext) = "NotSet" 
     222         surf%cextlong(jext) = "NotSet" 
     223         surf%cextunit(jext) = "NotSet" 
    165224      END DO 
    166225       
     
    168227 
    169228      ALLOCATE( & 
    170          & surf%mi(ksurf),      & 
    171          & surf%mj(ksurf),      & 
    172229         & surf%mt(ksurf),      & 
    173230         & surf%nsidx(ksurf),   & 
     
    187244         & ) 
    188245 
     246      ALLOCATE( & 
     247         & surf%mi(ksurf,kvar), & 
     248         & surf%mj(ksurf,kvar)  & 
     249         & ) 
     250 
    189251      surf%mt(:) = -1 
    190252 
     
    205267      surf%rext(:,:) = 0.0_wp  
    206268 
     269      ! Allocate arrays of number of additional fields at observation points 
     270 
     271      ALLOCATE( &  
     272         & surf%radd(ksurf,kadd,kvar) & 
     273         & ) 
     274 
     275      surf%radd(:,:,:) = 0.0_wp  
     276 
    207277      ! Allocate arrays of number of time step size 
    208278 
     
    215285 
    216286      ALLOCATE( & 
    217          & surf%vdmean(kpi,kpj) & 
     287         & surf%vdmean(kpi,kpj,kvar) & 
    218288         & ) 
    219289 
     
    291361         & ) 
    292362 
     363      ! Deallocate arrays of number of additional fields at observation points 
     364 
     365      DEALLOCATE( &  
     366         & surf%radd & 
     367         & ) 
     368 
    293369      ! Deallocate arrays of size number of grid points size times 
    294370      ! number of variables 
     
    308384 
    309385      DEALLOCATE( & 
    310          & surf%cvars     & 
    311          & ) 
     386         & surf%cvars, & 
     387         & surf%clong, & 
     388         & surf%cunit, & 
     389         & surf%cgrid  & 
     390         & ) 
     391 
     392      ! Dellocate additional/extra variables metadata 
     393 
     394      DEALLOCATE( & 
     395         & surf%caddvars, & 
     396         & surf%caddlong, & 
     397         & surf%caddunit, & 
     398         & surf%cextvars, & 
     399         & surf%cextlong, & 
     400         & surf%cextunit  & 
     401         ) 
    312402 
    313403   END SUBROUTINE obs_surf_dealloc 
     
    343433      INTEGER :: ji 
    344434      INTEGER :: jk 
     435      INTEGER :: jadd 
    345436      LOGICAL, DIMENSION(:), ALLOCATABLE :: llvalid 
    346437 
     
    361452 
    362453      IF ( lallocate ) THEN 
    363          CALL obs_surf_alloc( newsurf,  insurf, surf%nvar, & 
     454         CALL obs_surf_alloc( newsurf,  insurf, surf%nvar, surf%nadd, & 
    364455            & surf%nextra, surf%nstp, surf%npi, surf%npj ) 
    365456      ENDIF 
     
    388479            insurf = insurf + 1 
    389480 
    390             newsurf%mi(insurf)    = surf%mi(ji) 
    391             newsurf%mj(insurf)    = surf%mj(ji) 
     481            newsurf%mi(insurf,:)  = surf%mi(ji,:) 
     482            newsurf%mj(insurf,:)  = surf%mj(ji,:) 
    392483            newsurf%mt(insurf)    = surf%mt(ji) 
    393484            newsurf%nsidx(insurf) = surf%nsidx(ji) 
     
    410501               newsurf%rmod(insurf,jk)  = surf%rmod(ji,jk) 
    411502                
     503               DO jadd = 1, surf%nadd 
     504                  newsurf%radd(insurf,jadd,jk) = surf%radd(ji,jadd,jk) 
     505               END DO 
     506                
    412507            END DO 
    413508 
     
    433528      ! Set book keeping variables which do not depend on number of obs. 
    434529 
    435       newsurf%nstp     = surf%nstp 
    436       newsurf%cvars(:) = surf%cvars(:) 
     530      newsurf%nstp          = surf%nstp 
     531      newsurf%cvars(:)      = surf%cvars(:) 
     532      newsurf%clong(:)      = surf%clong(:) 
     533      newsurf%cunit(:)      = surf%cunit(:) 
     534      newsurf%cgrid(:)      = surf%cgrid(:) 
     535      newsurf%caddvars(:)   = surf%caddvars(:) 
     536      newsurf%caddlong(:,:) = surf%caddlong(:,:) 
     537      newsurf%caddunit(:,:) = surf%caddunit(:,:) 
     538      newsurf%cextvars(:)   = surf%cextvars(:) 
     539      newsurf%cextlong(:)   = surf%cextlong(:) 
     540      newsurf%cextunit(:)   = surf%cextunit(:) 
    437541       
    438542      ! Set gridded stuff 
     
    470574      INTEGER :: jj 
    471575      INTEGER :: jk 
     576      INTEGER :: jadd 
    472577 
    473578      ! Copy data from surf to old surf 
     
    475580      DO ji = 1, surf%nsurf 
    476581 
    477          jj=surf%nsind(ji) 
    478  
    479          oldsurf%mi(jj)    = surf%mi(ji) 
    480          oldsurf%mj(jj)    = surf%mj(ji) 
     582         jj = surf%nsind(ji) 
     583 
     584         oldsurf%mi(jj,:)  = surf%mi(ji,:) 
     585         oldsurf%mj(jj,:)  = surf%mj(ji,:) 
    481586         oldsurf%mt(jj)    = surf%mt(ji) 
    482587         oldsurf%nsidx(jj) = surf%nsidx(ji) 
     
    500605         DO ji = 1, surf%nsurf 
    501606             
    502             jj=surf%nsind(ji) 
     607            jj = surf%nsind(ji) 
    503608 
    504609            oldsurf%robs(jj,jk)  = surf%robs(ji,jk) 
    505610            oldsurf%rmod(jj,jk)  = surf%rmod(ji,jk) 
     611                
     612            DO jadd = 1, surf%nadd 
     613               oldsurf%radd(jj,jadd,jk) = surf%radd(ji,jadd,jk) 
     614            END DO 
    506615 
    507616         END DO 
     
    513622         DO ji = 1, surf%nsurf 
    514623             
    515             jj=surf%nsind(ji) 
     624            jj = surf%nsind(ji) 
    516625 
    517626            oldsurf%rext(jj,jk)  = surf%rext(ji,jk) 
Note: See TracChangeset for help on using the changeset viewer.