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 13393 for branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90 – NEMO

Ignore:
Timestamp:
2020-08-13T16:44:28+02:00 (4 years ago)
Author:
mattmartin
Message:

Include surface velocity observation operator. See ticket https://code.metoffice.gov.uk/trac/utils/ticket/376.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90

    r12610 r13393  
    5151   LOGICAL :: ln_sstnight          !: Logical switch for night mean SST obs 
    5252   LOGICAL :: ln_default_fp_indegs !: T=> Default obs footprint size specified in degrees, F=> in metres 
    53    LOGICAL :: ln_sla_fp_indegs     !: T=>     SLA obs footprint size specified in degrees, F=> in metres 
    54    LOGICAL :: ln_sst_fp_indegs     !: T=>     SST obs footprint size specified in degrees, F=> in metres 
    55    LOGICAL :: ln_sss_fp_indegs     !: T=>     SSS obs footprint size specified in degrees, F=> in metres 
     53   LOGICAL :: ln_sla_fp_indegs     !: T=> SLA obs footprint size specified in degrees, F=> in metres 
     54   LOGICAL :: ln_sst_fp_indegs     !: T=> SST obs footprint size specified in degrees, F=> in metres 
     55   LOGICAL :: ln_sss_fp_indegs     !: T=> SSS obs footprint size specified in degrees, F=> in metres 
     56   LOGICAL :: ln_ssv_fp_indegs     !: T=> SSV obs footprint size specified in degrees, F=> in metres    
    5657   LOGICAL :: ln_sic_fp_indegs     !: T=> SIC obs footprint size specified in degrees, F=> in metres 
    5758   LOGICAL :: ln_sit_fp_indegs     !: T=> SIT obs footprint size specified in degrees, F=> in metres 
     
    6768   REAL(wp) :: rn_sss_avglamscl     !: E/W diameter of SSS observation footprint 
    6869   REAL(wp) :: rn_sss_avgphiscl     !: N/S diameter of SSS observation footprint 
     70   REAL(wp) :: rn_ssv_avglamscl     !: E/W diameter of SSV observation footprint 
     71   REAL(wp) :: rn_ssv_avgphiscl     !: N/S diameter of SSV observation footprint 
    6972   REAL(wp) :: rn_sic_avglamscl     !: E/W diameter of SIC observation footprint 
    7073   REAL(wp) :: rn_sic_avgphiscl     !: N/S diameter of SIC observation footprint 
     
    8083   INTEGER :: nn_2dint_sst     !: SST horizontal interpolation method (-1 = default) 
    8184   INTEGER :: nn_2dint_sss     !: SSS horizontal interpolation method (-1 = default) 
     85   INTEGER :: nn_2dint_ssv     !: SSV horizontal interpolation method (-1 = default)    
    8286   INTEGER :: nn_2dint_sic     !: SIC horizontal interpolation method (-1 = default) 
    8387   INTEGER :: nn_2dint_sit     !: SIT horizontal interpolation method (-1 = default) 
     
    169173         & cn_velfbfiles,      & ! Velocity profile input filenames 
    170174         & cn_sssfbfiles,      & ! Sea surface salinity input filenames 
     175         & cn_ssvfbfiles,      & ! Sea surface velocity input filenames          
    171176         & cn_slchltotfbfiles, & ! Surface total              log10(chlorophyll) input filenames 
    172177         & cn_slchldiafbfiles, & ! Surface diatom             log10(chlorophyll) input filenames 
     
    207212      LOGICAL :: ln_sit          ! Logical switch for sea ice thickness 
    208213      LOGICAL :: ln_sss          ! Logical switch for sea surface salinity obs 
     214      LOGICAL :: ln_ssv          ! Logical switch for sea surface velocity obs       
    209215      LOGICAL :: ln_vel3d        ! Logical switch for velocity (u,v) obs 
    210216      LOGICAL :: ln_slchltot     ! Logical switch for surface total              log10(chlorophyll) obs 
     
    261267      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: & 
    262268         & zmask                 ! Model land/sea mask associated with variables 
     269      REAL(wp), POINTER, DIMENSION(:,:,:) :: & 
     270         & zmask_surf            ! Surface model land/sea mask associated with variables 
    263271 
    264272 
    265273      NAMELIST/namobs/ln_diaobs, ln_t3d, ln_s3d, ln_sla,              & 
    266          &            ln_sst, ln_sic, ln_sit, ln_sss, ln_vel3d,               & 
     274         &            ln_sst, ln_sic, ln_sit, ln_sss,                 & 
     275         &            ln_ssv, ln_vel3d,                               & 
    267276         &            ln_slchltot, ln_slchldia, ln_slchlnon,          & 
    268277         &            ln_slchldin, ln_slchlmic, ln_slchlnan,          & 
     
    280289         &            ln_time_mean_sla_bkg, ln_default_fp_indegs,     & 
    281290         &            ln_sla_fp_indegs, ln_sst_fp_indegs,             & 
    282          &            ln_sss_fp_indegs, ln_sic_fp_indegs,             & 
    283          &            ln_sit_fp_indegs,                               & 
     291         &            ln_sss_fp_indegs, ln_ssv_fp_indegs,             & 
     292         &            ln_sic_fp_indegs, ln_sit_fp_indegs,             & 
    284293         &            cn_profbfiles, cn_slafbfiles,                   & 
    285294         &            cn_sstfbfiles, cn_sicfbfiles,                   & 
    286          &            cn_sitfbfiles,                                  & 
     295         &            cn_sitfbfiles, cn_ssvfbfiles,                   & 
    287296         &            cn_velfbfiles, cn_sssfbfiles,                   & 
    288297         &            cn_slchltotfbfiles, cn_slchldiafbfiles,         & 
     
    305314         &            rn_sst_avglamscl, rn_sst_avgphiscl,             & 
    306315         &            rn_sss_avglamscl, rn_sss_avgphiscl,             & 
     316         &            rn_ssv_avglamscl, rn_ssv_avgphiscl,             &          
    307317         &            rn_sic_avglamscl, rn_sic_avgphiscl,             & 
    308318         &            rn_sit_avglamscl, rn_sit_avgphiscl,             & 
    309319         &            nn_1dint, nn_2dint_default,                     & 
    310320         &            nn_2dint_sla, nn_2dint_sst,                     & 
    311          &            nn_2dint_sss, nn_2dint_sic, nn_2dint_sit,       & 
     321         &            nn_2dint_sss, nn_2dint_ssv,                     & 
     322         &            nn_2dint_sic, nn_2dint_sit,                     & 
    312323         &            nn_msshc, rn_mdtcorr, rn_mdtcutoff,             & 
    313324         &            nn_profdavtypes 
     
    325336      cn_velfbfiles(:)      = '' 
    326337      cn_sssfbfiles(:)      = '' 
     338      cn_ssvfbfiles(:)      = ''       
    327339      cn_slchltotfbfiles(:) = '' 
    328340      cn_slchldiafbfiles(:) = '' 
     
    389401         WRITE(numout,*) '             Logical switch for velocity observations               ln_vel3d = ', ln_vel3d 
    390402         WRITE(numout,*) '             Logical switch for SSS observations                      ln_sss = ', ln_sss 
     403         WRITE(numout,*) '             Logical switch for SSV observations                      ln_ssv = ', ln_ssv          
    391404         WRITE(numout,*) '             Logical switch for surface total logchl obs         ln_slchltot = ', ln_slchltot 
    392405         WRITE(numout,*) '             Logical switch for surface diatom logchl obs        ln_slchldia = ', ln_slchldia 
     
    424437         WRITE(numout,*) '             Type of horizontal interpolation method for SST    nn_2dint_sst = ', nn_2dint_sst 
    425438         WRITE(numout,*) '             Type of horizontal interpolation method for SSS    nn_2dint_sss = ', nn_2dint_sss 
     439         WRITE(numout,*) '             Type of horizontal interpolation method for SSV    nn_2dint_ssv = ', nn_2dint_ssv          
    426440         WRITE(numout,*) '             Type of horizontal interpolation method for SIC    nn_2dint_sic = ', nn_2dint_sic 
    427441         WRITE(numout,*) '             Type of horizontal interpolation method for SIT    nn_2dint_sit = ', nn_2dint_sit 
     
    462476         &                  ln_pchltot,  ln_pno3,     ln_psi4,     ln_ppo4,     & 
    463477         &                  ln_pdic,     ln_palk,     ln_pph,      ln_po2 /) ) 
    464       nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_sit, ln_sss,             & 
     478      nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_sit, ln_sss, ln_ssv,     & 
    465479         &                  ln_slchltot, ln_slchldia, ln_slchlnon, ln_slchldin, & 
    466480         &                  ln_slchlmic, ln_slchlnan, ln_slchlpic, ln_schltot,  & 
     
    591605            cobstypessurf(jtype) = 'sss' 
    592606            clsurffiles(jtype,:) = cn_sssfbfiles 
     607         ENDIF 
     608         IF (ln_ssv) THEN 
     609            jtype = jtype + 1 
     610            cobstypessurf(jtype) = 'ssv' 
     611            clsurffiles(jtype,:) = cn_ssvfbfiles 
    593612         ENDIF 
    594613         IF (ln_slchltot) THEN 
     
    721740               ztype_avgphiscl = rn_sss_avgphiscl 
    722741               ltype_fp_indegs = ln_sss_fp_indegs 
     742               ltype_night     = .FALSE. 
     743            ELSE IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 
     744               IF ( nn_2dint_ssv == -1 ) THEN 
     745                  n2dint_type  = nn_2dint_default 
     746               ELSE 
     747                  n2dint_type  = nn_2dint_ssv 
     748               ENDIF 
     749               ztype_avglamscl = rn_ssv_avglamscl 
     750               ztype_avgphiscl = rn_ssv_avgphiscl 
     751               ltype_fp_indegs = ln_ssv_fp_indegs 
    723752               ltype_night     = .FALSE. 
    724753            ELSE 
     
    903932               nvarssurf(jtype) = 1 
    904933               nextrsurf(jtype) = 2 
     934            ELSE IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 
     935               nvarssurf(jtype) = 2 
     936               nextrsurf(jtype) = 0 
    905937            ELSE 
    906938               nvarssurf(jtype) = 1 
     
    909941             
    910942            ALLOCATE( clvars( nvarssurf(jtype) ) ) 
    911  
     943            CALL wrk_alloc( jpi, jpj, nvarssurf(jtype), zglam ) 
     944            CALL wrk_alloc( jpi, jpj, nvarssurf(jtype), zgphi ) 
     945            CALL wrk_alloc( jpi, jpj, nvarssurf(jtype), zmask_surf ) 
     946 
     947            IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 
     948               zglam(:,:,1) = glamu(:,:) 
     949               zglam(:,:,2) = glamv(:,:) 
     950               zgphi(:,:,1) = gphiu(:,:) 
     951               zgphi(:,:,2) = gphiv(:,:) 
     952               zmask_surf(:,:,1) = umask(:,:,1) 
     953               zmask_surf(:,:,2) = vmask(:,:,1) 
     954            ELSE             
     955               DO jvar = 1, nvarssurf(jtype) 
     956                  zglam(:,:,jvar) = glamt(:,:) 
     957                  zgphi(:,:,jvar) = gphit(:,:) 
     958                  zmask_surf(:,:,jvar) = tmask(:,:,1)                                        
     959               END DO 
     960            ENDIF 
     961             
    912962            IF ( TRIM(cobstypessurf(jtype)) == 'sla' ) THEN 
    913963               clvars(1) = 'SLA' 
     
    921971            ELSE IF ( TRIM(cobstypessurf(jtype)) == 'sss' ) THEN 
    922972               clvars(1) = 'SSS' 
     973            ELSE IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 
     974               clvars(1) = 'UVEL' 
     975               clvars(2) = 'VVEL'            
    923976            ELSE IF ( TRIM(cobstypessurf(jtype)) == 'slchltot' ) THEN 
    924977               clvars(1) = 'SLCHLTOT' 
     
    9601013               &               llnightav(jtype), ltype_clim, ln_time_mean_sla_bkg, clvars ) 
    9611014 
    962             CALL obs_pre_surf( surfdata(jtype), surfdataqc(jtype), ln_nea, ln_bound_reject, ln_seaicetypes ) 
     1015            CALL obs_pre_surf( surfdata(jtype), surfdataqc(jtype), & 
     1016               &               jpi, jpj, &             
     1017               &               zmask_surf, zglam, zgphi, & 
     1018               &               ln_nea, ln_bound_reject, ln_seaicetypes ) 
    9631019 
    9641020            IF ( TRIM(cobstypessurf(jtype)) == 'sla' ) THEN 
     
    9901046             
    9911047            DEALLOCATE( clvars ) 
     1048            CALL wrk_dealloc( jpi, jpj, nvarssurf(jtype), zglam ) 
     1049            CALL wrk_dealloc( jpi, jpj, nvarssurf(jtype), zgphi ) 
     1050            CALL wrk_dealloc( jpi, jpj, nvarssurf(jtype), zmask_surf ) 
    9921051 
    9931052         END DO 
     
    10941153      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: & 
    10951154         & zprofmask               ! Mask associated with zprofvar 
    1096       REAL(wp), POINTER, DIMENSION(:,:) :: & 
     1155      REAL(wp), POINTER, DIMENSION(:,:,:) :: & 
    10971156         & zsurfvar, &             ! Model values equivalent to surface ob. 
    10981157         & zsurfclim, &            ! Climatology values for variables in a surface ob. 
    10991158         & zsurfmask               ! Mask associated with surface variable 
    11001159      REAL(wp), POINTER, DIMENSION(:,:,:) :: & 
    1101          & zglam,    &             ! Model longitudes for prof variables 
    1102          & zgphi                   ! Model latitudes for prof variables 
     1160         & zglam,    &             ! Model longitudes 
     1161         & zgphi                   ! Model latitudes 
    11031162      LOGICAL :: llog10            ! Perform log10 transform of variable 
    11041163#if defined key_fabm 
     
    13461405 
    13471406      IF ( nsurftypes > 0 ) THEN 
    1348  
    1349          !Allocate local work arrays 
    1350          CALL wrk_alloc( jpi, jpj, zsurfvar ) 
    1351          CALL wrk_alloc( jpi, jpj, zsurfclim )          
    1352          CALL wrk_alloc( jpi, jpj, zsurfmask ) 
     1407          
    13531408#if defined key_fabm 
    13541409         CALL wrk_alloc( jpi, jpj, jpk, fabm_3d ) 
     
    13571412         DO jtype = 1, nsurftypes 
    13581413 
     1414            !Allocate local work arrays 
     1415            CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfvar  ) 
     1416            CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfclim )          
     1417            CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfmask ) 
     1418            CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zglam     ) 
     1419            CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zgphi     ) 
     1420 
    13591421            !Defaults which might be changed 
    1360             zsurfmask(:,:) = tmask(:,:,1) 
    1361             zsurfclim(:,:) = 0._wp           
     1422            DO jvar = 1, surfdataqc(jtype)%nvar             
     1423               zsurfmask(:,:,jvar) = tmask(:,:,1) 
     1424               zsurfclim(:,:,jvar) = 0._wp 
     1425               zglam(:,:,jvar) = glamt(:,:) 
     1426               zgphi(:,:,jvar) = gphit(:,:)    
     1427            END DO              
    13621428            llog10 = .FALSE. 
    13631429 
    13641430            SELECT CASE ( TRIM(cobstypessurf(jtype)) ) 
    13651431            CASE('sst') 
    1366                zsurfvar(:,:) = tsn(:,:,1,jp_tem) 
    1367                IF ( ln_output_clim ) zsurfclim(:,:) = tclim(:,:,1) 
     1432               zsurfvar(:,:,1) = tsn(:,:,1,jp_tem) 
     1433               IF ( ln_output_clim ) zsurfclim(:,:,1) = tclim(:,:,1) 
    13681434            CASE('sla') 
    1369                zsurfvar(:,:) = sshn(:,:) 
     1435               zsurfvar(:,:,1) = sshn(:,:) 
    13701436            CASE('sss') 
    1371                zsurfvar(:,:) = tsn(:,:,1,jp_sal) 
    1372                IF ( ln_output_clim ) zsurfclim(:,:) = sclim(:,:,1)               
     1437               zsurfvar(:,:,1) = tsn(:,:,1,jp_sal) 
     1438               IF ( ln_output_clim ) zsurfclim(:,:,1) = sclim(:,:,1)               
     1439            CASE('ssv') 
     1440               zsurfvar(:,:,1) = un(:,:,1) 
     1441               zsurfvar(:,:,2) = vn(:,:,1) 
     1442               zsurfmask(:,:,1) = umask(:,:,1) 
     1443               zsurfmask(:,:,2) = vmask(:,:,1)    
     1444               zglam(:,:,1) = glamu(:,:) 
     1445               zglam(:,:,2) = glamv(:,:)                
     1446               zgphi(:,:,1) = gphiu(:,:) 
     1447               zgphi(:,:,2) = gphiv(:,:)                   
    13731448            CASE('sic') 
    13741449               IF ( kstp == 0 ) THEN 
     
    13811456               ELSE 
    13821457#if defined key_cice 
    1383                   zsurfvar(:,:) = fr_i(:,:) 
     1458                  zsurfvar(:,:,1) = fr_i(:,:) 
    13841459#elif defined key_lim2 || defined key_lim3 
    1385                   zsurfvar(:,:) = 1._wp - frld(:,:) 
     1460                  zsurfvar(:,:,1) = 1._wp - frld(:,:) 
    13861461#else 
    13871462               CALL ctl_stop( ' Trying to run sea-ice concentration observation operator', & 
     
    14001475               ELSE        
    14011476#if defined key_cice 
    1402                   zsurfvar(:,:) = thick_i(:,:) 
     1477                  zsurfvar(:,:,1) = thick_i(:,:) 
    14031478#elif defined key_lim2 || defined key_lim3 
    14041479                  CALL ctl_stop( ' No sea-ice thickness observation operator defined for LIM model' ) 
     
    14121487#if defined key_hadocc 
    14131488               ! Surface chlorophyll from HadOCC 
    1414                zsurfvar(:,:) = HADOCC_CHL(:,:,1) 
     1489               zsurfvar(:,:,1) = HADOCC_CHL(:,:,1) 
    14151490#elif defined key_medusa 
    14161491               ! Add non-diatom and diatom surface chlorophyll from MEDUSA 
    1417                zsurfvar(:,:) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd) 
     1492               zsurfvar(:,:,1) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd) 
    14181493#elif defined key_fabm 
    14191494               ! Add all surface chlorophyll groups from ERSEM 
    1420                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
     1495               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
    14211496                  &            trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
    14221497#else 
     
    14321507#elif defined key_medusa 
    14331508               ! Diatom surface chlorophyll from MEDUSA 
    1434                zsurfvar(:,:) = trn(:,:,1,jpchd) 
     1509               zsurfvar(:,:,1) = trn(:,:,1,jpchd) 
    14351510#elif defined key_fabm 
    14361511               ! Diatom surface chlorophyll from ERSEM 
    1437                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) 
     1512               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) 
    14381513#else 
    14391514               CALL ctl_stop( ' Trying to run slchldia observation operator', & 
     
    14481523#elif defined key_medusa 
    14491524               ! Non-diatom surface chlorophyll from MEDUSA 
    1450                zsurfvar(:,:) = trn(:,:,1,jpchn) 
     1525               zsurfvar(:,:,1) = trn(:,:,1,jpchn) 
    14511526#elif defined key_fabm 
    14521527               ! Add all non-diatom surface chlorophyll groups from ERSEM 
    1453                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
     1528               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
    14541529                  &            trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
    14551530#else 
     
    14681543#elif defined key_fabm 
    14691544               ! Dinoflagellate surface chlorophyll from ERSEM 
    1470                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
     1545               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
    14711546#else 
    14721547               CALL ctl_stop( ' Trying to run slchldin observation operator', & 
     
    14841559#elif defined key_fabm 
    14851560               ! Add diatom and dinoflagellate surface chlorophyll from ERSEM 
    1486                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
     1561               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
    14871562#else 
    14881563               CALL ctl_stop( ' Trying to run slchlmic observation operator', & 
     
    15001575#elif defined key_fabm 
    15011576               ! Nanophytoplankton surface chlorophyll from ERSEM 
    1502                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) 
     1577               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) 
    15031578#else 
    15041579               CALL ctl_stop( ' Trying to run slchlnan observation operator', & 
     
    15161591#elif defined key_fabm 
    15171592               ! Picophytoplankton surface chlorophyll from ERSEM 
    1518                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) 
     1593               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) 
    15191594#else 
    15201595               CALL ctl_stop( ' Trying to run slchlpic observation operator', & 
     
    15261601#if defined key_hadocc 
    15271602               ! Surface chlorophyll from HadOCC 
    1528                zsurfvar(:,:) = HADOCC_CHL(:,:,1) 
     1603               zsurfvar(:,:,1) = HADOCC_CHL(:,:,1) 
    15291604#elif defined key_medusa 
    15301605               ! Add non-diatom and diatom surface chlorophyll from MEDUSA 
    1531                zsurfvar(:,:) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd) 
     1606               zsurfvar(:,:,1) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd) 
    15321607#elif defined key_fabm 
    15331608               ! Add all surface chlorophyll groups from ERSEM 
    1534                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
    1535                   &            trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
     1609               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
     1610                  &              trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
    15361611#else 
    15371612               CALL ctl_stop( ' Trying to run schltot observation operator', & 
     
    15421617#if defined key_hadocc 
    15431618               ! Surface phytoplankton nitrogen from HadOCC multiplied by C:N ratio 
    1544                zsurfvar(:,:) = trn(:,:,1,jp_had_phy) * c2n_p 
     1619               zsurfvar(:,:,1) = trn(:,:,1,jp_had_phy) * c2n_p 
    15451620#elif defined key_medusa 
    15461621               ! Add non-diatom and diatom surface phytoplankton nitrogen from MEDUSA 
    15471622               ! multiplied by C:N ratio for each 
    1548                zsurfvar(:,:) = (trn(:,:,1,jpphn) * xthetapn) + (trn(:,:,1,jpphd) * xthetapd) 
     1623               zsurfvar(:,:,1) = (trn(:,:,1,jpphn) * xthetapn) + (trn(:,:,1,jpphd) * xthetapd) 
    15491624#elif defined key_fabm 
    15501625               ! Add all surface phytoplankton carbon groups from ERSEM 
    1551                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + & 
     1626               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + & 
    15521627                  &            trn(:,:,1,jp_fabm_m1+jp_fabm_p3c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p4c) 
    15531628#else 
     
    15631638#elif defined key_medusa 
    15641639               ! Diatom surface phytoplankton nitrogen from MEDUSA multiplied by C:N ratio 
    1565                zsurfvar(:,:) = trn(:,:,1,jpphd) * xthetapd 
     1640               zsurfvar(:,:,1) = trn(:,:,1,jpphd) * xthetapd 
    15661641#elif defined key_fabm 
    15671642               ! Diatom surface phytoplankton carbon from ERSEM 
    1568                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) 
     1643               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) 
    15691644#else 
    15701645               CALL ctl_stop( ' Trying to run slphydia observation operator', & 
     
    15791654#elif defined key_medusa 
    15801655               ! Non-diatom surface phytoplankton nitrogen from MEDUSA multiplied by C:N ratio 
    1581                zsurfvar(:,:) = trn(:,:,1,jpphn) * xthetapn 
     1656               zsurfvar(:,:,1) = trn(:,:,1,jpphn) * xthetapn 
    15821657#elif defined key_fabm 
    15831658               ! Add all non-diatom surface phytoplankton carbon groups from ERSEM 
    1584                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + & 
    1585                   &            trn(:,:,1,jp_fabm_m1+jp_fabm_p3c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p4c) 
     1659               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + & 
     1660                  &              trn(:,:,1,jp_fabm_m1+jp_fabm_p3c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p4c) 
    15861661#else 
    15871662               CALL ctl_stop( ' Trying to run slphynon observation operator', & 
     
    15921667            CASE('sspm') 
    15931668#if defined key_spm 
    1594                zsurfvar(:,:) = 0.0 
     1669               zsurfvar(:,:,1) = 0.0 
    15951670               DO jn = 1, jp_spm 
    1596                   zsurfvar(:,:) = zsurfvar(:,:) + trn(:,:,1,jn)   ! sum SPM sizes 
     1671                  zsurfvar(:,:,1) = zsurfvar(:,:,1) + trn(:,:,1,jn)   ! sum SPM sizes 
    15971672               END DO 
    15981673#else 
     
    16111686               ! light_xEPS diagnostic variable 
    16121687               fabm_3d(:,:,:) = fabm_get_interior_diagnostic_data(model, jp_fabm_xeps) 
    1613                zsurfvar(:,:) = fabm_3d(:,:,1) 
     1688               zsurfvar(:,:,1) = fabm_3d(:,:,1) 
    16141689#else 
    16151690               CALL ctl_stop( ' Trying to run skd490 observation operator', & 
     
    16191694            CASE('sfco2') 
    16201695#if defined key_hadocc 
    1621                zsurfvar(:,:) = HADOCC_FCO2(:,:)    ! fCO2 from HadOCC 
     1696               zsurfvar(:,:,1) = HADOCC_FCO2(:,:)    ! fCO2 from HadOCC 
    16221697               IF ( ( MINVAL( HADOCC_FCO2 ) == HADOCC_FILL_FLT ) .AND. & 
    16231698                  & ( MAXVAL( HADOCC_FCO2 ) == HADOCC_FILL_FLT ) ) THEN 
    16241699                  zsurfvar(:,:) = obfillflt 
    1625                   zsurfmask(:,:) = 0 
     1700                  zsurfmask(:,:,1) = 0 
    16261701                  CALL ctl_warn( ' HadOCC fCO2 values masked out for observation operator', & 
    16271702                     &           ' as HADOCC_FCO2(:,:) == HADOCC_FILL_FLT' ) 
    16281703               ENDIF 
    16291704#elif defined key_medusa && defined key_roam 
    1630                zsurfvar(:,:) = f2_fco2w(:,:) 
     1705               zsurfvar(:,:,1) = f2_fco2w(:,:) 
    16311706#elif defined key_fabm 
    16321707               ! First, get pCO2 from FABM 
    16331708               fabm_3d(:,:,:) = fabm_get_interior_diagnostic_data(model, jp_fabm_o3pc) 
    1634                zsurfvar(:,:) = fabm_3d(:,:,1) 
     1709               zsurfvar(:,:,1) = fabm_3d(:,:,1) 
    16351710               ! Now, convert pCO2 to fCO2, based on SST in K. This follows the standard methodology of: 
    16361711               ! Pierrot et al. (2009), Recommendations for autonomous underway pCO2 measuring systems 
     
    16461721               ! because xCO2 in atm is ~0, and so this term will only affect the result to the 3rd decimal 
    16471722               ! place for typical values, and xCO2 would need to be approximated from pCO2 anyway. 
    1648                zsurfvar(:,:) = zsurfvar(:,:) * EXP((-1636.75                                                          + & 
    1649                   &            12.0408      * (tsn(:,:,1,jp_tem)+rt0)                                                 - & 
    1650                   &            0.0327957    * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)                         + & 
    1651                   &            0.0000316528 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + & 
    1652                   &            2.0 * (57.7 - 0.118 * (tsn(:,:,1,jp_tem)+rt0)))                                        / & 
    1653                   &            (82.0578 * (tsn(:,:,1,jp_tem)+rt0))) 
     1723               zsurfvar(:,:,1) = zsurfvar(:,:,1) * EXP((-1636.75                                                          + & 
     1724                  &              12.0408      * (tsn(:,:,1,jp_tem)+rt0)                                                 - & 
     1725                  &              0.0327957    * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)                         + & 
     1726                  &              0.0000316528 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + & 
     1727                  &              2.0 * (57.7 - 0.118 * (tsn(:,:,1,jp_tem)+rt0)))                                        / & 
     1728                  &              (82.0578 * (tsn(:,:,1,jp_tem)+rt0))) 
    16541729#else 
    16551730               CALL ctl_stop( ' Trying to run sfco2 observation operator', & 
     
    16591734            CASE('spco2') 
    16601735#if defined key_hadocc 
    1661                zsurfvar(:,:) = HADOCC_PCO2(:,:)    ! pCO2 from HadOCC 
     1736               zsurfvar(:,:,1) = HADOCC_PCO2(:,:)    ! pCO2 from HadOCC 
    16621737               IF ( ( MINVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ) .AND. & 
    16631738                  & ( MAXVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ) ) THEN 
    1664                   zsurfvar(:,:) = obfillflt 
    1665                   zsurfmask(:,:) = 0 
     1739                  zsurfvar(:,:,1) = obfillflt 
     1740                  zsurfmask(:,:,1) = 0 
    16661741                  CALL ctl_warn( ' HadOCC pCO2 values masked out for observation operator', & 
    16671742                     &           ' as HADOCC_PCO2(:,:) == HADOCC_FILL_FLT' ) 
    16681743               ENDIF 
    16691744#elif defined key_medusa && defined key_roam 
    1670                zsurfvar(:,:) = f2_pco2w(:,:) 
     1745               zsurfvar(:,:,1) = f2_pco2w(:,:) 
    16711746#elif defined key_fabm 
    16721747               fabm_3d(:,:,:) = fabm_get_interior_diagnostic_data(model, jp_fabm_o3pc) 
    1673                zsurfvar(:,:) = fabm_3d(:,:,1) 
     1748               zsurfvar(:,:,1) = fabm_3d(:,:,1) 
    16741749#else 
    16751750               CALL ctl_stop( ' Trying to run spco2 observation operator', & 
     
    16861761               ! Take the log10 where we can, otherwise exclude 
    16871762               tiny = 1.0e-20 
    1688                WHERE(zsurfvar(:,:) > tiny .AND. zsurfvar(:,:) /= obfillflt ) 
    1689                   zsurfvar(:,:)  = LOG10(zsurfvar(:,:)) 
     1763               WHERE(zsurfvar(:,:,1) > tiny .AND. zsurfvar(:,:,1) /= obfillflt ) 
     1764                  zsurfvar(:,:,1)  = LOG10(zsurfvar(:,:,1)) 
    16901765               ELSEWHERE 
    1691                   zsurfvar(:,:)  = obfillflt 
    1692                   zsurfmask(:,:) = 0 
     1766                  zsurfvar(:,:,1)  = obfillflt 
     1767                  zsurfmask(:,:,1) = 0 
    16931768               END WHERE 
    16941769            ENDIF 
    16951770 
    1696             IF ( TRIM(cobstypessurf(jtype)) == 'sla' .AND.                 & 
    1697                   &  ln_time_mean_sla_bkg ) THEN 
    1698                !Number of time-steps in meaning period 
    1699                imeanstp = NINT( ( MeanPeriodHours * 60. * 60. ) / rdt ) 
    1700                CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj,       & 
    1701                   &               nit000, idaystp, zsurfvar,               & 
    1702                   &               zsurfclim, zsurfmask,                    & 
    1703                   &               n2dintsurf(jtype), llnightav(jtype),     & 
    1704                   &               ravglamscl(jtype), ravgphiscl(jtype),    & 
    1705                   &               lfpindegs(jtype), kmeanstp = imeanstp ) 
    1706  
    1707  
    1708             ELSE 
    1709                CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj,       & 
    1710                   &               nit000, idaystp, zsurfvar,               & 
    1711                   &               zsurfclim, zsurfmask,                    & 
    1712                   &               n2dintsurf(jtype), llnightav(jtype),     & 
    1713                   &               ravglamscl(jtype), ravgphiscl(jtype),    & 
    1714                   &               lfpindegs(jtype) ) 
    1715             ENDIF 
    1716  
     1771            DO jvar = 1, surfdataqc(jtype)%nvar 
     1772 
     1773               IF ( TRIM(cobstypessurf(jtype)) == 'sla' .AND.                 & 
     1774                     &  ln_time_mean_sla_bkg ) THEN 
     1775                  !Number of time-steps in meaning period 
     1776                  imeanstp = NINT( ( MeanPeriodHours * 60. * 60. ) / rdt ) 
     1777                  CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj,       & 
     1778                     &               nit000, idaystp, jvar,                   & 
     1779                     &               zsurfvar(:,:,jvar),                      & 
     1780                     &               zsurfclim(:,:,jvar),                     & 
     1781                     &               zsurfmask(:,:,jvar),                     & 
     1782                     &               zglam(:,:,jvar), zgphi(:,:,jvar),        &                      
     1783                     &               n2dintsurf(jtype), llnightav(jtype),     & 
     1784                     &               ravglamscl(jtype), ravgphiscl(jtype),    & 
     1785                     &               lfpindegs(jtype), kmeanstp = imeanstp ) 
     1786 
     1787               ELSE 
     1788                  CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj,       & 
     1789                     &               nit000, idaystp, jvar,                   & 
     1790                     &               zsurfvar(:,:,jvar),                      & 
     1791                     &               zsurfclim(:,:,jvar),                     & 
     1792                     &               zsurfmask(:,:,jvar),                     & 
     1793                     &               zglam(:,:,jvar), zgphi(:,:,jvar),        &                                           
     1794                     &               n2dintsurf(jtype), llnightav(jtype),     & 
     1795                     &               ravglamscl(jtype), ravgphiscl(jtype),    & 
     1796                     &               lfpindegs(jtype) ) 
     1797               ENDIF 
     1798 
     1799            END DO 
     1800             
    17171801            ! Change label of data from FBD ("freeboard") to SIT ("Sea Ice 
    17181802            ! Thickness") 
    17191803            IF ( TRIM(surfdataqc(jtype)%cvars(1)) == 'FBD' ) THEN 
    1720                  surfdata(jtype)%cvars(1) = 'SIT' 
     1804                 surfdataqc(jtype)%cvars(1) = 'SIT' 
    17211805            ENDIF 
    17221806 
     1807            CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfvar  ) 
     1808            CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfclim )                   
     1809            CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfmask ) 
     1810            CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zglam     ) 
     1811            CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zgphi     )          
     1812 
    17231813         END DO 
    1724  
    1725          CALL wrk_dealloc( jpi, jpj, zsurfvar ) 
    1726          CALL wrk_dealloc( jpi, jpj, zsurfmask ) 
    17271814#if defined key_fabm 
    17281815         CALL wrk_dealloc( jpi, jpj, jpk, fabm_3d ) 
     
    17801867                  & ) 
    17811868 
    1782                CALL obs_rotvel( profdataqc(jtype), nn_2dint_default, zu, zv ) 
     1869               CALL obs_rotvel_pro( profdataqc(jtype), nn_2dint_default, zu, zv ) 
    17831870 
    17841871               DO jo = 1, profdataqc(jtype)%nprof 
     
    18131900 
    18141901         DO jtype = 1, nsurftypes 
     1902 
     1903            IF ( TRIM(cobstypessurf(jtype)) == 'vel' ) THEN 
     1904 
     1905               ! For velocity data, rotate the model velocities to N/S, E/W 
     1906               ! using the compressed data structure. 
     1907               ALLOCATE( & 
     1908                  & zu(surfdataqc(jtype)%nsurf), & 
     1909                  & zv(surfdataqc(jtype)%nsurf)  & 
     1910                  & ) 
     1911 
     1912               CALL obs_rotvel_surf( surfdataqc(jtype), nn_2dint_default, zu, zv ) 
     1913 
     1914               DO jo = 1, surfdataqc(jtype)%nsurf 
     1915                  surfdataqc(jtype)%rmod(jo,1) = zu(jo) 
     1916                  surfdataqc(jtype)%rmod(jo,2) = zv(jo) 
     1917               END DO 
     1918 
     1919               DEALLOCATE( zu ) 
     1920               DEALLOCATE( zv ) 
     1921 
     1922            END IF 
     1923 
    18151924 
    18161925            CALL obs_surf_decompress( surfdataqc(jtype), & 
Note: See TracChangeset for help on using the changeset viewer.