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

Ignore:
Timestamp:
2020-12-12T12:31:26+01:00 (4 years ago)
Author:
dcarneir
Message:

Merging trunk into my branch to keep it updated

File:
1 edited

Legend:

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

    r12820 r14165  
    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 
     
    6869   REAL(wp) :: rn_sss_avglamscl     !: E/W diameter of SSS observation footprint 
    6970   REAL(wp) :: rn_sss_avgphiscl     !: N/S diameter of SSS observation footprint 
     71   REAL(wp) :: rn_ssv_avglamscl     !: E/W diameter of SSV observation footprint 
     72   REAL(wp) :: rn_ssv_avgphiscl     !: N/S diameter of SSV observation footprint 
    7073   REAL(wp) :: rn_sic_avglamscl     !: E/W diameter of SIC observation footprint 
    7174   REAL(wp) :: rn_sic_avgphiscl     !: N/S diameter of SIC observation footprint 
     
    8386   INTEGER :: nn_2dint_sst     !: SST horizontal interpolation method (-1 = default) 
    8487   INTEGER :: nn_2dint_sss     !: SSS horizontal interpolation method (-1 = default) 
     88   INTEGER :: nn_2dint_ssv     !: SSV horizontal interpolation method (-1 = default)    
    8589   INTEGER :: nn_2dint_sic     !: SIC horizontal interpolation method (-1 = default) 
    8690   INTEGER :: nn_2dint_sit     !: SIT horizontal interpolation method (-1 = default) 
     
    174178         & cn_velfbfiles,      & ! Velocity profile input filenames 
    175179         & cn_sssfbfiles,      & ! Sea surface salinity input filenames 
     180         & cn_ssvfbfiles,      & ! Sea surface velocity input filenames          
    176181         & cn_slchltotfbfiles, & ! Surface total              log10(chlorophyll) input filenames 
    177182         & cn_slchldiafbfiles, & ! Surface diatom             log10(chlorophyll) input filenames 
     
    213218      LOGICAL :: ln_fbd          ! Logical switch for sea ice freeboard 
    214219      LOGICAL :: ln_sss          ! Logical switch for sea surface salinity obs 
     220      LOGICAL :: ln_ssv          ! Logical switch for sea surface velocity obs       
    215221      LOGICAL :: ln_vel3d        ! Logical switch for velocity (u,v) obs 
    216222      LOGICAL :: ln_slchltot     ! Logical switch for surface total              log10(chlorophyll) obs 
     
    267273      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: & 
    268274         & zmask                 ! Model land/sea mask associated with variables 
     275      REAL(wp), POINTER, DIMENSION(:,:,:) :: & 
     276         & zmask_surf            ! Surface model land/sea mask associated with variables 
    269277 
    270278 
    271279      NAMELIST/namobs/ln_diaobs, ln_t3d, ln_s3d, ln_sla,              & 
    272280         &            ln_sst, ln_sic, ln_sit, ln_fbd,                 & 
    273          &            ln_sss, ln_vel3d,                               & 
     281         &            ln_sss, ln_ssv, ln_vel3d,                       & 
    274282         &            ln_slchltot, ln_slchldia, ln_slchlnon,          & 
    275283         &            ln_slchldin, ln_slchlmic, ln_slchlnan,          & 
     
    287295         &            ln_time_mean_sla_bkg, ln_default_fp_indegs,     & 
    288296         &            ln_sla_fp_indegs, ln_sst_fp_indegs,             & 
    289          &            ln_sss_fp_indegs, ln_sic_fp_indegs,             & 
    290          &            ln_sit_fp_indegs, ln_fbd_fp_indegs,             & 
     297         &            ln_sss_fp_indegs, ln_ssv_fp_indegs,             & 
     298         &            ln_sic_fp_indegs, ln_sit_fp_indegs,             & 
     299         &            ln_fbd_fp_indegs,                               & 
    291300         &            cn_profbfiles, cn_slafbfiles,                   & 
    292301         &            cn_sstfbfiles, cn_sicfbfiles,                   & 
    293302         &            cn_sitfbfiles, cn_fbdfbfiles,                   & 
    294          &            cn_velfbfiles, cn_sssfbfiles,                   & 
     303         &            cn_velfbfiles, cn_sssfbfiles, cn_ssvfbfiles,    & 
    295304         &            cn_slchltotfbfiles, cn_slchldiafbfiles,         & 
    296305         &            cn_slchlnonfbfiles, cn_slchldinfbfiles,         & 
     
    312321         &            rn_sst_avglamscl, rn_sst_avgphiscl,             & 
    313322         &            rn_sss_avglamscl, rn_sss_avgphiscl,             & 
     323         &            rn_ssv_avglamscl, rn_ssv_avgphiscl,             &          
    314324         &            rn_sic_avglamscl, rn_sic_avgphiscl,             & 
    315325         &            rn_sit_avglamscl, rn_sit_avgphiscl,             & 
     
    317327         &            nn_1dint, nn_2dint_default,                     & 
    318328         &            nn_2dint_sla, nn_2dint_sst,                     & 
    319          &            nn_2dint_sss, nn_2dint_sic,                     & 
    320          &            nn_2dint_sit, nn_2dint_fbd,                     & 
     329         &            nn_2dint_sss, nn_2dint_ssv,                     & 
     330         &            nn_2dint_sic, nn_2dint_sit,                     & 
     331         &            nn_2dint_fbd,                                   & 
    321332         &            nn_msshc, rn_mdtcorr, rn_mdtcutoff,             & 
    322333         &            nn_profdavtypes 
     
    335346      cn_velfbfiles(:)      = '' 
    336347      cn_sssfbfiles(:)      = '' 
     348      cn_ssvfbfiles(:)      = ''       
    337349      cn_slchltotfbfiles(:) = '' 
    338350      cn_slchldiafbfiles(:) = '' 
     
    400412         WRITE(numout,*) '             Logical switch for velocity observations               ln_vel3d = ', ln_vel3d 
    401413         WRITE(numout,*) '             Logical switch for SSS observations                      ln_sss = ', ln_sss 
     414         WRITE(numout,*) '             Logical switch for SSV observations                      ln_ssv = ', ln_ssv          
    402415         WRITE(numout,*) '             Logical switch for surface total logchl obs         ln_slchltot = ', ln_slchltot 
    403416         WRITE(numout,*) '             Logical switch for surface diatom logchl obs        ln_slchldia = ', ln_slchldia 
     
    435448         WRITE(numout,*) '             Type of horizontal interpolation method for SST    nn_2dint_sst = ', nn_2dint_sst 
    436449         WRITE(numout,*) '             Type of horizontal interpolation method for SSS    nn_2dint_sss = ', nn_2dint_sss 
     450         WRITE(numout,*) '             Type of horizontal interpolation method for SSV    nn_2dint_ssv = ', nn_2dint_ssv          
    437451         WRITE(numout,*) '             Type of horizontal interpolation method for SIC    nn_2dint_sic = ', nn_2dint_sic 
    438452         WRITE(numout,*) '             Type of horizontal interpolation method for SIT    nn_2dint_sit = ', nn_2dint_sit 
     
    477491         &                  ln_pchltot,  ln_pno3,     ln_psi4,     ln_ppo4,     & 
    478492         &                  ln_pdic,     ln_palk,     ln_pph,      ln_po2 /) ) 
    479       nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_sit, ln_fbd, ln_sss,     & 
     493      nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_sit, ln_fbd,             & 
     494         &                  ln_sss, ln_ssv,                                     & 
    480495         &                  ln_slchltot, ln_slchldia, ln_slchlnon, ln_slchldin, & 
    481496         &                  ln_slchlmic, ln_slchlnan, ln_slchlpic, ln_schltot,  & 
     
    611626            cobstypessurf(jtype) = 'sss' 
    612627            clsurffiles(jtype,:) = cn_sssfbfiles 
     628         ENDIF 
     629         IF (ln_ssv) THEN 
     630            jtype = jtype + 1 
     631            cobstypessurf(jtype) = 'ssv' 
     632            clsurffiles(jtype,:) = cn_ssvfbfiles 
    613633         ENDIF 
    614634         IF (ln_slchltot) THEN 
     
    751771               ztype_avgphiscl = rn_sss_avgphiscl 
    752772               ltype_fp_indegs = ln_sss_fp_indegs 
     773               ltype_night     = .FALSE. 
     774            ELSE IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 
     775               IF ( nn_2dint_ssv == -1 ) THEN 
     776                  n2dint_type  = nn_2dint_default 
     777               ELSE 
     778                  n2dint_type  = nn_2dint_ssv 
     779               ENDIF 
     780               ztype_avglamscl = rn_ssv_avglamscl 
     781               ztype_avgphiscl = rn_ssv_avgphiscl 
     782               ltype_fp_indegs = ln_ssv_fp_indegs 
    753783               ltype_night     = .FALSE. 
    754784            ELSE 
     
    934964               nvarssurf(jtype) = 1 
    935965               nextrsurf(jtype) = 2 
     966            ELSE IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 
     967               nvarssurf(jtype) = 2 
     968               nextrsurf(jtype) = 0 
    936969            ELSE 
    937970               nvarssurf(jtype) = 1 
     
    940973             
    941974            ALLOCATE( clvars( nvarssurf(jtype) ) ) 
    942  
     975            CALL wrk_alloc( jpi, jpj, nvarssurf(jtype), zglam ) 
     976            CALL wrk_alloc( jpi, jpj, nvarssurf(jtype), zgphi ) 
     977            CALL wrk_alloc( jpi, jpj, nvarssurf(jtype), zmask_surf ) 
     978 
     979            IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 
     980               zglam(:,:,1) = glamu(:,:) 
     981               zglam(:,:,2) = glamv(:,:) 
     982               zgphi(:,:,1) = gphiu(:,:) 
     983               zgphi(:,:,2) = gphiv(:,:) 
     984               zmask_surf(:,:,1) = umask(:,:,1) 
     985               zmask_surf(:,:,2) = vmask(:,:,1) 
     986            ELSE             
     987               DO jvar = 1, nvarssurf(jtype) 
     988                  zglam(:,:,jvar) = glamt(:,:) 
     989                  zgphi(:,:,jvar) = gphit(:,:) 
     990                  zmask_surf(:,:,jvar) = tmask(:,:,1)                                        
     991               END DO 
     992            ENDIF 
     993             
    943994            IF ( TRIM(cobstypessurf(jtype)) == 'sla' ) THEN 
    944995               clvars(1) = 'SLA' 
     
    9551006            ELSE IF ( TRIM(cobstypessurf(jtype)) == 'sss' ) THEN 
    9561007               clvars(1) = 'SSS' 
     1008            ELSE IF ( TRIM(cobstypessurf(jtype)) == 'ssv' ) THEN 
     1009               clvars(1) = 'UVEL' 
     1010               clvars(2) = 'VVEL'            
    9571011            ELSE IF ( TRIM(cobstypessurf(jtype)) == 'slchltot' ) THEN 
    9581012               clvars(1) = 'SLCHLTOT' 
     
    9941048               &               llnightav(jtype), ltype_clim, ln_time_mean_sla_bkg, clvars ) 
    9951049 
    996             CALL obs_pre_surf( surfdata(jtype), surfdataqc(jtype), ln_nea, ln_bound_reject, ln_seaicetypes ) 
     1050            CALL obs_pre_surf( surfdata(jtype), surfdataqc(jtype), & 
     1051               &               jpi, jpj, &             
     1052               &               zmask_surf, zglam, zgphi, & 
     1053               &               ln_nea, ln_bound_reject, ln_seaicetypes ) 
    9971054 
    9981055            IF ( TRIM(cobstypessurf(jtype)) == 'sla' ) THEN 
     
    10241081             
    10251082            DEALLOCATE( clvars ) 
     1083            CALL wrk_dealloc( jpi, jpj, nvarssurf(jtype), zglam ) 
     1084            CALL wrk_dealloc( jpi, jpj, nvarssurf(jtype), zgphi ) 
     1085            CALL wrk_dealloc( jpi, jpj, nvarssurf(jtype), zmask_surf ) 
    10261086 
    10271087         END DO 
     
    11041164#elif defined key_fabm 
    11051165      USE par_fabm                 ! FABM parameters 
    1106       USE fabm, ONLY: & 
    1107          & fabm_get_interior_diagnostic_data 
    11081166#endif 
    11091167#if defined key_spm 
     
    11281186      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: & 
    11291187         & zprofmask               ! Mask associated with zprofvar 
    1130       REAL(wp), POINTER, DIMENSION(:,:) :: & 
     1188      REAL(wp), POINTER, DIMENSION(:,:,:) :: & 
    11311189         & zsurfvar, &             ! Model values equivalent to surface ob. 
    11321190         & zsurfclim, &            ! Climatology values for variables in a surface ob. 
    11331191         & zsurfmask               ! Mask associated with surface variable 
    11341192      REAL(wp), POINTER, DIMENSION(:,:,:) :: & 
    1135          & zglam,    &             ! Model longitudes for prof variables 
    1136          & zgphi                   ! Model latitudes for prof variables 
     1193         & zglam,    &             ! Model longitudes 
     1194         & zgphi                   ! Model latitudes 
    11371195      LOGICAL :: llog10            ! Perform log10 transform of variable 
    11381196#if defined key_fabm 
     
    13161374#elif defined key_fabm 
    13171375               ! Alkalinity from ERSEM 
    1318                zprofvar(:,:,:,1) = fabm_get_interior_diagnostic_data(model, jp_fabm_o3ta) 
     1376               zprofvar(:,:,:,1) = model%get_interior_diagnostic_data(jp_fabm_o3ta) 
    13191377#else 
    13201378               CALL ctl_stop( ' Trying to run palk observation operator', & 
     
    13311389#elif defined key_fabm 
    13321390               ! pH from ERSEM 
    1333                zprofvar(:,:,:,1) = trn(:,:,:,jp_fabm_m1+jp_fabm_o3ph) 
     1391               zprofvar(:,:,:,1) = model%get_interior_diagnostic_data(jp_fabm_o3ph) 
    13341392#else 
    13351393               CALL ctl_stop( ' Trying to run pph observation operator', & 
     
    13801438 
    13811439      IF ( nsurftypes > 0 ) THEN 
    1382  
    1383          !Allocate local work arrays 
    1384          CALL wrk_alloc( jpi, jpj, zsurfvar ) 
    1385          CALL wrk_alloc( jpi, jpj, zsurfclim )          
    1386          CALL wrk_alloc( jpi, jpj, zsurfmask ) 
     1440          
    13871441#if defined key_fabm 
    13881442         CALL wrk_alloc( jpi, jpj, jpk, fabm_3d ) 
     
    13911445         DO jtype = 1, nsurftypes 
    13921446 
     1447            !Allocate local work arrays 
     1448            CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfvar  ) 
     1449            CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfclim )          
     1450            CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfmask ) 
     1451            CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zglam     ) 
     1452            CALL wrk_alloc( jpi, jpj, surfdataqc(jtype)%nvar, zgphi     ) 
     1453 
    13931454            !Defaults which might be changed 
    1394             zsurfmask(:,:) = tmask(:,:,1) 
    1395             zsurfclim(:,:) = 0._wp           
     1455            DO jvar = 1, surfdataqc(jtype)%nvar             
     1456               zsurfmask(:,:,jvar) = tmask(:,:,1) 
     1457               zsurfclim(:,:,jvar) = 0._wp 
     1458               zglam(:,:,jvar) = glamt(:,:) 
     1459               zgphi(:,:,jvar) = gphit(:,:)    
     1460            END DO              
    13961461            llog10 = .FALSE. 
    13971462 
    13981463            SELECT CASE ( TRIM(cobstypessurf(jtype)) ) 
    13991464            CASE('sst') 
    1400                zsurfvar(:,:) = tsn(:,:,1,jp_tem) 
    1401                IF ( ln_output_clim ) zsurfclim(:,:) = tclim(:,:,1) 
     1465               zsurfvar(:,:,1) = tsn(:,:,1,jp_tem) 
     1466               IF ( ln_output_clim ) zsurfclim(:,:,1) = tclim(:,:,1) 
    14021467            CASE('sla') 
    1403                zsurfvar(:,:) = sshn(:,:) 
     1468               zsurfvar(:,:,1) = sshn(:,:) 
    14041469            CASE('sss') 
    1405                zsurfvar(:,:) = tsn(:,:,1,jp_sal) 
    1406                IF ( ln_output_clim ) zsurfclim(:,:) = sclim(:,:,1)               
     1470               zsurfvar(:,:,1) = tsn(:,:,1,jp_sal) 
     1471               IF ( ln_output_clim ) zsurfclim(:,:,1) = sclim(:,:,1)               
     1472            CASE('ssv') 
     1473               zsurfvar(:,:,1) = un(:,:,1) 
     1474               zsurfvar(:,:,2) = vn(:,:,1) 
     1475               zsurfmask(:,:,1) = umask(:,:,1) 
     1476               zsurfmask(:,:,2) = vmask(:,:,1)    
     1477               zglam(:,:,1) = glamu(:,:) 
     1478               zglam(:,:,2) = glamv(:,:)                
     1479               zgphi(:,:,1) = gphiu(:,:) 
     1480               zgphi(:,:,2) = gphiv(:,:)                   
    14071481            CASE('sic') 
    14081482               IF ( kstp == 0 ) THEN 
     
    14151489               ELSE 
    14161490#if defined key_cice 
    1417                   zsurfvar(:,:) = fr_i(:,:) 
     1491                  zsurfvar(:,:,1) = fr_i(:,:) 
    14181492#elif defined key_lim2 || defined key_lim3 
    1419                   zsurfvar(:,:) = 1._wp - frld(:,:) 
     1493                  zsurfvar(:,:,1) = 1._wp - frld(:,:) 
    14201494#else 
    14211495               CALL ctl_stop( ' Trying to run sea-ice concentration observation operator', & 
     
    14341508               ELSE        
    14351509#if defined key_cice 
    1436                   zsurfvar(:,:) = thick_i(:,:) 
     1510                  zsurfvar(:,:,1) = thick_i(:,:) 
    14371511#elif defined key_lim2 || defined key_lim3 
    14381512                  CALL ctl_stop( ' No sea-ice thickness observation operator defined for LIM model' ) 
     
    14651539#if defined key_hadocc 
    14661540               ! Surface chlorophyll from HadOCC 
    1467                zsurfvar(:,:) = HADOCC_CHL(:,:,1) 
     1541               zsurfvar(:,:,1) = HADOCC_CHL(:,:,1) 
    14681542#elif defined key_medusa 
    14691543               ! Add non-diatom and diatom surface chlorophyll from MEDUSA 
    1470                zsurfvar(:,:) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd) 
     1544               zsurfvar(:,:,1) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd) 
    14711545#elif defined key_fabm 
    14721546               ! Add all surface chlorophyll groups from ERSEM 
    1473                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
     1547               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
    14741548                  &            trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
    14751549#else 
     
    14851559#elif defined key_medusa 
    14861560               ! Diatom surface chlorophyll from MEDUSA 
    1487                zsurfvar(:,:) = trn(:,:,1,jpchd) 
     1561               zsurfvar(:,:,1) = trn(:,:,1,jpchd) 
    14881562#elif defined key_fabm 
    14891563               ! Diatom surface chlorophyll from ERSEM 
    1490                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) 
     1564               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) 
    14911565#else 
    14921566               CALL ctl_stop( ' Trying to run slchldia observation operator', & 
     
    15011575#elif defined key_medusa 
    15021576               ! Non-diatom surface chlorophyll from MEDUSA 
    1503                zsurfvar(:,:) = trn(:,:,1,jpchn) 
     1577               zsurfvar(:,:,1) = trn(:,:,1,jpchn) 
    15041578#elif defined key_fabm 
    15051579               ! Add all non-diatom surface chlorophyll groups from ERSEM 
    1506                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
     1580               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
    15071581                  &            trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
    15081582#else 
     
    15211595#elif defined key_fabm 
    15221596               ! Dinoflagellate surface chlorophyll from ERSEM 
    1523                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
     1597               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
    15241598#else 
    15251599               CALL ctl_stop( ' Trying to run slchldin observation operator', & 
     
    15371611#elif defined key_fabm 
    15381612               ! Add diatom and dinoflagellate surface chlorophyll from ERSEM 
    1539                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
     1613               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
    15401614#else 
    15411615               CALL ctl_stop( ' Trying to run slchlmic observation operator', & 
     
    15531627#elif defined key_fabm 
    15541628               ! Nanophytoplankton surface chlorophyll from ERSEM 
    1555                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) 
     1629               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) 
    15561630#else 
    15571631               CALL ctl_stop( ' Trying to run slchlnan observation operator', & 
     
    15691643#elif defined key_fabm 
    15701644               ! Picophytoplankton surface chlorophyll from ERSEM 
    1571                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) 
     1645               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) 
    15721646#else 
    15731647               CALL ctl_stop( ' Trying to run slchlpic observation operator', & 
     
    15791653#if defined key_hadocc 
    15801654               ! Surface chlorophyll from HadOCC 
    1581                zsurfvar(:,:) = HADOCC_CHL(:,:,1) 
     1655               zsurfvar(:,:,1) = HADOCC_CHL(:,:,1) 
    15821656#elif defined key_medusa 
    15831657               ! Add non-diatom and diatom surface chlorophyll from MEDUSA 
    1584                zsurfvar(:,:) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd) 
     1658               zsurfvar(:,:,1) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd) 
    15851659#elif defined key_fabm 
    15861660               ! Add all surface chlorophyll groups from ERSEM 
    1587                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
    1588                   &            trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
     1661               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_chl1) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl2) + & 
     1662                  &              trn(:,:,1,jp_fabm_m1+jp_fabm_chl3) + trn(:,:,1,jp_fabm_m1+jp_fabm_chl4) 
    15891663#else 
    15901664               CALL ctl_stop( ' Trying to run schltot observation operator', & 
     
    15951669#if defined key_hadocc 
    15961670               ! Surface phytoplankton nitrogen from HadOCC multiplied by C:N ratio 
    1597                zsurfvar(:,:) = trn(:,:,1,jp_had_phy) * c2n_p 
     1671               zsurfvar(:,:,1) = trn(:,:,1,jp_had_phy) * c2n_p 
    15981672#elif defined key_medusa 
    15991673               ! Add non-diatom and diatom surface phytoplankton nitrogen from MEDUSA 
    16001674               ! multiplied by C:N ratio for each 
    1601                zsurfvar(:,:) = (trn(:,:,1,jpphn) * xthetapn) + (trn(:,:,1,jpphd) * xthetapd) 
     1675               zsurfvar(:,:,1) = (trn(:,:,1,jpphn) * xthetapn) + (trn(:,:,1,jpphd) * xthetapd) 
    16021676#elif defined key_fabm 
    16031677               ! Add all surface phytoplankton carbon groups from ERSEM 
    1604                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + & 
     1678               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + & 
    16051679                  &            trn(:,:,1,jp_fabm_m1+jp_fabm_p3c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p4c) 
    16061680#else 
     
    16161690#elif defined key_medusa 
    16171691               ! Diatom surface phytoplankton nitrogen from MEDUSA multiplied by C:N ratio 
    1618                zsurfvar(:,:) = trn(:,:,1,jpphd) * xthetapd 
     1692               zsurfvar(:,:,1) = trn(:,:,1,jpphd) * xthetapd 
    16191693#elif defined key_fabm 
    16201694               ! Diatom surface phytoplankton carbon from ERSEM 
    1621                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) 
     1695               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_p1c) 
    16221696#else 
    16231697               CALL ctl_stop( ' Trying to run slphydia observation operator', & 
     
    16321706#elif defined key_medusa 
    16331707               ! Non-diatom surface phytoplankton nitrogen from MEDUSA multiplied by C:N ratio 
    1634                zsurfvar(:,:) = trn(:,:,1,jpphn) * xthetapn 
     1708               zsurfvar(:,:,1) = trn(:,:,1,jpphn) * xthetapn 
    16351709#elif defined key_fabm 
    16361710               ! Add all non-diatom surface phytoplankton carbon groups from ERSEM 
    1637                zsurfvar(:,:) = trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + & 
    1638                   &            trn(:,:,1,jp_fabm_m1+jp_fabm_p3c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p4c) 
     1711               zsurfvar(:,:,1) = trn(:,:,1,jp_fabm_m1+jp_fabm_p2c) + & 
     1712                  &              trn(:,:,1,jp_fabm_m1+jp_fabm_p3c) + trn(:,:,1,jp_fabm_m1+jp_fabm_p4c) 
    16391713#else 
    16401714               CALL ctl_stop( ' Trying to run slphynon observation operator', & 
     
    16451719            CASE('sspm') 
    16461720#if defined key_spm 
    1647                zsurfvar(:,:) = 0.0 
     1721               zsurfvar(:,:,1) = 0.0 
    16481722               DO jn = 1, jp_spm 
    1649                   zsurfvar(:,:) = zsurfvar(:,:) + trn(:,:,1,jn)   ! sum SPM sizes 
     1723                  zsurfvar(:,:,1) = zsurfvar(:,:,1) + trn(:,:,1,jn)   ! sum SPM sizes 
    16501724               END DO 
    16511725#else 
     
    16621736                  &           ' but MEDUSA does not explicitly simulate Kd490' ) 
    16631737#elif defined key_fabm 
    1664                ! light_xEPS diagnostic variable 
    1665                fabm_3d(:,:,:) = fabm_get_interior_diagnostic_data(model, jp_fabm_xeps) 
    1666                zsurfvar(:,:) = fabm_3d(:,:,1) 
     1738               ! light_Kd_band3 diagnostic variable if using spectral optical model 
     1739               ! light_xEPS diagnostic variable if using standard ERSEM light model 
     1740               IF ( jp_fabm_kd490 /= -1 ) THEN 
     1741                  fabm_3d(:,:,:) = model%get_interior_diagnostic_data(jp_fabm_kd490) 
     1742               ELSEIF ( jp_fabm_xeps /= -1 ) THEN 
     1743                  fabm_3d(:,:,:) = model%get_interior_diagnostic_data(jp_fabm_xeps) 
     1744               ELSE 
     1745                  CALL ctl_stop( ' Trying to run skd490 observation operator', & 
     1746                     &           ' but cannot access Kd490 from ERSEM' ) 
     1747               ENDIF 
     1748               zsurfvar(:,:,1) = fabm_3d(:,:,1) 
    16671749#else 
    16681750               CALL ctl_stop( ' Trying to run skd490 observation operator', & 
     
    16721754            CASE('sfco2') 
    16731755#if defined key_hadocc 
    1674                zsurfvar(:,:) = HADOCC_FCO2(:,:)    ! fCO2 from HadOCC 
     1756               zsurfvar(:,:,1) = HADOCC_FCO2(:,:)    ! fCO2 from HadOCC 
    16751757               IF ( ( MINVAL( HADOCC_FCO2 ) == HADOCC_FILL_FLT ) .AND. & 
    16761758                  & ( MAXVAL( HADOCC_FCO2 ) == HADOCC_FILL_FLT ) ) THEN 
    16771759                  zsurfvar(:,:) = obfillflt 
    1678                   zsurfmask(:,:) = 0 
     1760                  zsurfmask(:,:,1) = 0 
    16791761                  CALL ctl_warn( ' HadOCC fCO2 values masked out for observation operator', & 
    16801762                     &           ' as HADOCC_FCO2(:,:) == HADOCC_FILL_FLT' ) 
    16811763               ENDIF 
    16821764#elif defined key_medusa && defined key_roam 
    1683                zsurfvar(:,:) = f2_fco2w(:,:) 
     1765               zsurfvar(:,:,1) = f2_fco2w(:,:) 
    16841766#elif defined key_fabm 
    16851767               ! First, get pCO2 from FABM 
    1686                fabm_3d(:,:,:) = fabm_get_interior_diagnostic_data(model, jp_fabm_o3pc) 
    1687                zsurfvar(:,:) = fabm_3d(:,:,1) 
     1768               fabm_3d(:,:,:) = model%get_interior_diagnostic_data(jp_fabm_o3pc) 
     1769               zsurfvar(:,:,1) = fabm_3d(:,:,1) 
    16881770               ! Now, convert pCO2 to fCO2, based on SST in K. This follows the standard methodology of: 
    16891771               ! Pierrot et al. (2009), Recommendations for autonomous underway pCO2 measuring systems 
     
    16991781               ! because xCO2 in atm is ~0, and so this term will only affect the result to the 3rd decimal 
    17001782               ! place for typical values, and xCO2 would need to be approximated from pCO2 anyway. 
    1701                zsurfvar(:,:) = zsurfvar(:,:) * EXP((-1636.75                                                          + & 
    1702                   &            12.0408      * (tsn(:,:,1,jp_tem)+rt0)                                                 - & 
    1703                   &            0.0327957    * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)                         + & 
    1704                   &            0.0000316528 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + & 
    1705                   &            2.0 * (57.7 - 0.118 * (tsn(:,:,1,jp_tem)+rt0)))                                        / & 
    1706                   &            (82.0578 * (tsn(:,:,1,jp_tem)+rt0))) 
     1783               zsurfvar(:,:,1) = zsurfvar(:,:,1) * EXP((-1636.75                                                          + & 
     1784                  &              12.0408      * (tsn(:,:,1,jp_tem)+rt0)                                                 - & 
     1785                  &              0.0327957    * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)                         + & 
     1786                  &              0.0000316528 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + & 
     1787                  &              2.0 * (57.7 - 0.118 * (tsn(:,:,1,jp_tem)+rt0)))                                        / & 
     1788                  &              (82.0578 * (tsn(:,:,1,jp_tem)+rt0))) 
    17071789#else 
    17081790               CALL ctl_stop( ' Trying to run sfco2 observation operator', & 
     
    17121794            CASE('spco2') 
    17131795#if defined key_hadocc 
    1714                zsurfvar(:,:) = HADOCC_PCO2(:,:)    ! pCO2 from HadOCC 
     1796               zsurfvar(:,:,1) = HADOCC_PCO2(:,:)    ! pCO2 from HadOCC 
    17151797               IF ( ( MINVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ) .AND. & 
    17161798                  & ( MAXVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ) ) THEN 
    1717                   zsurfvar(:,:) = obfillflt 
    1718                   zsurfmask(:,:) = 0 
     1799                  zsurfvar(:,:,1) = obfillflt 
     1800                  zsurfmask(:,:,1) = 0 
    17191801                  CALL ctl_warn( ' HadOCC pCO2 values masked out for observation operator', & 
    17201802                     &           ' as HADOCC_PCO2(:,:) == HADOCC_FILL_FLT' ) 
    17211803               ENDIF 
    17221804#elif defined key_medusa && defined key_roam 
    1723                zsurfvar(:,:) = f2_pco2w(:,:) 
    1724 #elif defined key_fabm 
    1725                fabm_3d(:,:,:) = fabm_get_interior_diagnostic_data(model, jp_fabm_o3pc) 
    1726                zsurfvar(:,:) = fabm_3d(:,:,1) 
     1805               zsurfvar(:,:,1) = f2_pco2w(:,:) 
     1806#elif defined key_fabm 
     1807               fabm_3d(:,:,:) = model%get_interior_diagnostic_data(jp_fabm_o3pc) 
     1808               zsurfvar(:,:,1) = fabm_3d(:,:,1) 
    17271809#else 
    17281810               CALL ctl_stop( ' Trying to run spco2 observation operator', & 
     
    17391821               ! Take the log10 where we can, otherwise exclude 
    17401822               tiny = 1.0e-20 
    1741                WHERE(zsurfvar(:,:) > tiny .AND. zsurfvar(:,:) /= obfillflt ) 
    1742                   zsurfvar(:,:)  = LOG10(zsurfvar(:,:)) 
     1823               WHERE(zsurfvar(:,:,1) > tiny .AND. zsurfvar(:,:,1) /= obfillflt ) 
     1824                  zsurfvar(:,:,1)  = LOG10(zsurfvar(:,:,1)) 
    17431825               ELSEWHERE 
    1744                   zsurfvar(:,:)  = obfillflt 
    1745                   zsurfmask(:,:) = 0 
     1826                  zsurfvar(:,:,1)  = obfillflt 
     1827                  zsurfmask(:,:,1) = 0 
    17461828               END WHERE 
    17471829            ENDIF 
    17481830 
    1749             IF ( TRIM(cobstypessurf(jtype)) == 'sla' .AND.                 & 
    1750                   &  ln_time_mean_sla_bkg ) THEN 
    1751                !Number of time-steps in meaning period 
    1752                imeanstp = NINT( ( MeanPeriodHours * 60. * 60. ) / rdt ) 
    1753                CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj,       & 
    1754                   &               nit000, idaystp, zsurfvar,               & 
    1755                   &               zsurfclim, zsurfmask,                    & 
    1756                   &               n2dintsurf(jtype), llnightav(jtype),     & 
    1757                   &               ravglamscl(jtype), ravgphiscl(jtype),    & 
    1758                   &               lfpindegs(jtype), kmeanstp = imeanstp ) 
    1759  
    1760  
    1761             ELSE 
    1762                CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj,       & 
    1763                   &               nit000, idaystp, zsurfvar,               & 
    1764                   &               zsurfclim, zsurfmask,                    & 
    1765                   &               n2dintsurf(jtype), llnightav(jtype),     & 
    1766                   &               ravglamscl(jtype), ravgphiscl(jtype),    & 
    1767                   &               lfpindegs(jtype) ) 
    1768             ENDIF 
     1831            DO jvar = 1, surfdataqc(jtype)%nvar 
     1832 
     1833               IF ( TRIM(cobstypessurf(jtype)) == 'sla' .AND.                 & 
     1834                     &  ln_time_mean_sla_bkg ) THEN 
     1835                  !Number of time-steps in meaning period 
     1836                  imeanstp = NINT( ( MeanPeriodHours * 60. * 60. ) / rdt ) 
     1837                  CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj,       & 
     1838                     &               nit000, idaystp, jvar,                   & 
     1839                     &               zsurfvar(:,:,jvar),                      & 
     1840                     &               zsurfclim(:,:,jvar),                     & 
     1841                     &               zsurfmask(:,:,jvar),                     & 
     1842                     &               zglam(:,:,jvar), zgphi(:,:,jvar),        &                      
     1843                     &               n2dintsurf(jtype), llnightav(jtype),     & 
     1844                     &               ravglamscl(jtype), ravgphiscl(jtype),    & 
     1845                     &               lfpindegs(jtype), kmeanstp = imeanstp ) 
     1846 
     1847               ELSE 
     1848                  CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj,       & 
     1849                     &               nit000, idaystp, jvar,                   & 
     1850                     &               zsurfvar(:,:,jvar),                      & 
     1851                     &               zsurfclim(:,:,jvar),                     & 
     1852                     &               zsurfmask(:,:,jvar),                     & 
     1853                     &               zglam(:,:,jvar), zgphi(:,:,jvar),        &                                           
     1854                     &               n2dintsurf(jtype), llnightav(jtype),     & 
     1855                     &               ravglamscl(jtype), ravgphiscl(jtype),    & 
     1856                     &               lfpindegs(jtype) ) 
     1857               ENDIF 
     1858 
     1859            END DO 
     1860 
     1861            CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfvar  ) 
     1862            CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfclim )                   
     1863            CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zsurfmask ) 
     1864            CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zglam     ) 
     1865            CALL wrk_dealloc( jpi, jpj, surfdataqc(jtype)%nvar, zgphi     )          
    17691866 
    17701867         END DO 
    1771  
    1772          CALL wrk_dealloc( jpi, jpj, zsurfvar ) 
    1773          CALL wrk_dealloc( jpi, jpj, zsurfmask ) 
    17741868#if defined key_fabm 
    17751869         CALL wrk_dealloc( jpi, jpj, jpk, fabm_3d ) 
     
    18271921                  & ) 
    18281922 
    1829                CALL obs_rotvel( profdataqc(jtype), nn_2dint_default, zu, zv ) 
     1923               CALL obs_rotvel_pro( profdataqc(jtype), nn_2dint_default, zu, zv ) 
    18301924 
    18311925               DO jo = 1, profdataqc(jtype)%nprof 
     
    18601954 
    18611955         DO jtype = 1, nsurftypes 
     1956 
     1957            IF ( TRIM(cobstypessurf(jtype)) == 'vel' ) THEN 
     1958 
     1959               ! For velocity data, rotate the model velocities to N/S, E/W 
     1960               ! using the compressed data structure. 
     1961               ALLOCATE( & 
     1962                  & zu(surfdataqc(jtype)%nsurf), & 
     1963                  & zv(surfdataqc(jtype)%nsurf)  & 
     1964                  & ) 
     1965 
     1966               CALL obs_rotvel_surf( surfdataqc(jtype), nn_2dint_default, zu, zv ) 
     1967 
     1968               DO jo = 1, surfdataqc(jtype)%nsurf 
     1969                  surfdataqc(jtype)%rmod(jo,1) = zu(jo) 
     1970                  surfdataqc(jtype)%rmod(jo,2) = zv(jo) 
     1971               END DO 
     1972 
     1973               DEALLOCATE( zu ) 
     1974               DEALLOCATE( zv ) 
     1975 
     1976            END IF 
     1977 
    18621978 
    18631979            CALL obs_surf_decompress( surfdataqc(jtype), & 
Note: See TracChangeset for help on using the changeset viewer.