Index: branches/UKMO/dev_r5518_obs_oper_update_bgc3d/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90
===================================================================
--- branches/UKMO/dev_r5518_obs_oper_update_bgc3d/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90	(revision 8684)
+++ branches/UKMO/dev_r5518_obs_oper_update_bgc3d/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90	(revision 8687)
@@ -95,5 +95,5 @@
       & profdataqc           !: Profile data after quality control
 
-   CHARACTER(len=6), PUBLIC, DIMENSION(:), ALLOCATABLE :: &
+   CHARACTER(len=25), PUBLIC, DIMENSION(:), ALLOCATABLE :: &
       & cobstypesprof, &     !: Profile obs types
       & cobstypessurf        !: Surface obs types
@@ -143,15 +143,22 @@
 
       CHARACTER(len=128), DIMENSION(jpmaxnfiles) :: &
-         & cn_profbfiles,    &   ! T/S profile input filenames
-         & cn_sstfbfiles,    &   ! Sea surface temperature input filenames
-         & cn_slafbfiles,    &   ! Sea level anomaly input filenames
-         & cn_sicfbfiles,    &   ! Seaice concentration input filenames
-         & cn_velfbfiles,    &   ! Velocity profile input filenames
-         & cn_sssfbfiles,    &   ! Sea surface salinity input filenames
-         & cn_logchlfbfiles, &   ! Log(Chl) input filenames
-         & cn_spmfbfiles,    &   ! Sediment input filenames
-         & cn_fco2fbfiles,   &   ! fco2 input filenames
-         & cn_pco2fbfiles,   &   ! pco2 input filenames
-         & cn_sstbiasfiles       ! SST bias input filenames
+         & cn_profbfiles,                 & ! T/S profile input filenames
+         & cn_sstfbfiles,                 & ! Sea surface temperature input filenames
+         & cn_slafbfiles,                 & ! Sea level anomaly input filenames
+         & cn_sicfbfiles,                 & ! Seaice concentration input filenames
+         & cn_velfbfiles,                 & ! Velocity profile input filenames
+         & cn_sssfbfiles,                 & ! Sea surface salinity input filenames
+         & cn_surf_logchl_totalfbfiles,   & ! Surface total              log10(chlorophyll) input filenames
+         & cn_surf_logchl_diatfbfiles,    & ! Surface diatom             log10(chlorophyll) input filenames
+         & cn_surf_logchl_nondiatfbfiles, & ! Surface non-diatom         log10(chlorophyll) input filenames
+         & cn_surf_logchl_dinofbfiles,    & ! Surface dinoflagellate     log10(chlorophyll) input filenames
+         & cn_surf_logchl_microfbfiles,   & ! Surface microphytoplankton log10(chlorophyll) input filenames
+         & cn_surf_logchl_nanofbfiles,    & ! Surface nanophytoplankton  log10(chlorophyll) input filenames
+         & cn_surf_logchl_picofbfiles,    & ! Surface picophytoplankton  log10(chlorophyll) input filenames
+         & cn_surf_chl_totalfbfiles,      & ! Surface total              chlorophyll        input filenames
+         & cn_surf_spmfbfiles,            & ! Surface suspended particulate matter input filenames
+         & cn_surf_fco2fbfiles,           & ! Surface fugacity         of carbon dioxide input filenames
+         & cn_surf_pco2fbfiles,           & ! Surface partial pressure of carbon dioxide input filenames
+         & cn_sstbiasfiles                  ! SST bias input filenames
 
       CHARACTER(LEN=128) :: &
@@ -159,21 +166,28 @@
 
 
-      LOGICAL :: ln_t3d          ! Logical switch for temperature profiles
-      LOGICAL :: ln_s3d          ! Logical switch for salinity profiles
-      LOGICAL :: ln_sla          ! Logical switch for sea level anomalies 
-      LOGICAL :: ln_sst          ! Logical switch for sea surface temperature
-      LOGICAL :: ln_sic          ! Logical switch for sea ice concentration
-      LOGICAL :: ln_sss          ! Logical switch for sea surface salinity obs
-      LOGICAL :: ln_vel3d        ! Logical switch for velocity (u,v) obs
-      LOGICAL :: ln_logchl       ! Logical switch for log(Chl) obs
-      LOGICAL :: ln_spm          ! Logical switch for sediment obs
-      LOGICAL :: ln_fco2         ! Logical switch for fco2 obs
-      LOGICAL :: ln_pco2         ! Logical switch for pco2 obs
-      LOGICAL :: ln_nea          ! Logical switch to remove obs near land
-      LOGICAL :: ln_altbias      ! Logical switch for altimeter bias
-      LOGICAL :: ln_sstbias      ! Logical switch for bias correction of SST
-      LOGICAL :: ln_ignmis       ! Logical switch for ignoring missing files
-      LOGICAL :: ln_s_at_t       ! Logical switch to compute model S at T obs
-      LOGICAL :: ln_bound_reject ! Logical switch for rejecting obs near the boundary
+      LOGICAL :: ln_t3d                 ! Logical switch for temperature profiles
+      LOGICAL :: ln_s3d                 ! Logical switch for salinity profiles
+      LOGICAL :: ln_sla                 ! Logical switch for sea level anomalies 
+      LOGICAL :: ln_sst                 ! Logical switch for sea surface temperature
+      LOGICAL :: ln_sic                 ! Logical switch for sea ice concentration
+      LOGICAL :: ln_sss                 ! Logical switch for sea surface salinity obs
+      LOGICAL :: ln_vel3d               ! Logical switch for velocity (u,v) obs
+      LOGICAL :: ln_surf_logchl_total   ! Logical switch for surface total              log10(chlorophyll) obs
+      LOGICAL :: ln_surf_logchl_diat    ! Logical switch for surface diatom             log10(chlorophyll) obs
+      LOGICAL :: ln_surf_logchl_nondiat ! Logical switch for surface non-diatom         log10(chlorophyll) obs
+      LOGICAL :: ln_surf_logchl_dino    ! Logical switch for surface dinoflagellate     log10(chlorophyll) obs
+      LOGICAL :: ln_surf_logchl_micro   ! Logical switch for surface microphytoplankton log10(chlorophyll) obs
+      LOGICAL :: ln_surf_logchl_nano    ! Logical switch for surface nanophytoplankton  log10(chlorophyll) obs
+      LOGICAL :: ln_surf_logchl_pico    ! Logical switch for surface picophytoplankton  log10(chlorophyll) obs
+      LOGICAL :: ln_surf_chl_total      ! Logical switch for surface total              chlorophyll        obs
+      LOGICAL :: ln_surf_spm            ! Logical switch for surface suspended particulate matter obs
+      LOGICAL :: ln_surf_fco2           ! Logical switch for surface fugacity         of carbon dioxide obs
+      LOGICAL :: ln_surf_pco2           ! Logical switch for surface partial pressure of carbon dioxide obs
+      LOGICAL :: ln_nea                 ! Logical switch to remove obs near land
+      LOGICAL :: ln_altbias             ! Logical switch for altimeter bias
+      LOGICAL :: ln_sstbias             ! Logical switch for bias correction of SST
+      LOGICAL :: ln_ignmis              ! Logical switch for ignoring missing files
+      LOGICAL :: ln_s_at_t              ! Logical switch to compute model S at T obs
+      LOGICAL :: ln_bound_reject        ! Logical switch for rejecting obs near the boundary
 
       REAL(dp) :: rn_dobsini     ! Obs window start date YYYYMMDD.HHMMSS
@@ -200,5 +214,9 @@
       NAMELIST/namobs/ln_diaobs, ln_t3d, ln_s3d, ln_sla,              &
          &            ln_sst, ln_sic, ln_sss, ln_vel3d,               &
-         &            ln_logchl, ln_spm, ln_fco2, ln_pco2,            &
+         &            ln_surf_logchl_total,   ln_surf_logchl_diat,    &
+         &            ln_surf_logchl_nondiat, ln_surf_logchl_dino,    &
+         &            ln_surf_logchl_micro,   ln_surf_logchl_nano,    &
+         &            ln_surf_logchl_pico,    ln_surf_chl_total,      &
+         &            ln_surf_spm, ln_surf_fco2, ln_surf_pco2,        &
          &            ln_altbias, ln_sstbias, ln_nea,                 &
          &            ln_grid_global, ln_grid_search_lookup,          &
@@ -210,6 +228,13 @@
          &            cn_sstfbfiles, cn_sicfbfiles,                   &
          &            cn_velfbfiles, cn_sssfbfiles,                   &
-         &            cn_logchlfbfiles, cn_spmfbfiles,                &
-         &            cn_fco2fbfiles, cn_pco2fbfiles,                 &
+         &            cn_surf_logchl_totalfbfiles,                    &
+         &            cn_surf_logchl_diatfbfiles,                     &
+         &            cn_surf_logchl_nondiatfbfiles,                  &
+         &            cn_surf_logchl_dinofbfiles,                     &
+         &            cn_surf_logchl_microfbfiles,                    &
+         &            cn_surf_logchl_nanofbfiles,                     &
+         &            cn_surf_logchl_picofbfiles,                     &
+         &            cn_surf_chl_totalfbfiles, cn_surf_spmfbfiles,   &
+         &            cn_surf_fco2fbfiles, cn_surf_pco2fbfiles,       &
          &            cn_sstbiasfiles, cn_altbiasfile,                &
          &            cn_gridsearchfile, rn_gridsearchres,            &
@@ -237,16 +262,23 @@
 
       ! Some namelist arrays need initialising
-      cn_profbfiles(:)    = ''
-      cn_slafbfiles(:)    = ''
-      cn_sstfbfiles(:)    = ''
-      cn_sicfbfiles(:)    = ''
-      cn_velfbfiles(:)    = ''
-      cn_sssfbfiles(:)    = ''
-      cn_logchlfbfiles(:) = ''
-      cn_spmfbfiles(:)    = ''
-      cn_fco2fbfiles(:)   = ''
-      cn_pco2fbfiles(:)   = ''
-      cn_sstbiasfiles(:)  = ''
-      nn_profdavtypes(:)  = -1
+      cn_profbfiles(:)                 = ''
+      cn_slafbfiles(:)                 = ''
+      cn_sstfbfiles(:)                 = ''
+      cn_sicfbfiles(:)                 = ''
+      cn_velfbfiles(:)                 = ''
+      cn_sssfbfiles(:)                 = ''
+      cn_surf_logchl_totalfbfiles(:)   = ''
+      cn_surf_logchl_diatfbfiles(:)    = ''
+      cn_surf_logchl_nondiatfbfiles(:) = ''
+      cn_surf_logchl_dinofbfiles(:)    = ''
+      cn_surf_logchl_microfbfiles(:)   = ''
+      cn_surf_logchl_nanofbfiles(:)    = ''
+      cn_surf_logchl_picofbfiles(:)    = ''
+      cn_surf_chl_totalfbfiles(:)      = ''
+      cn_surf_spmfbfiles(:)            = ''
+      cn_surf_fco2fbfiles(:)           = ''
+      cn_surf_pco2fbfiles(:)           = ''
+      cn_sstbiasfiles(:)               = ''
+      nn_profdavtypes(:)               = -1
 
       CALL ini_date( rn_dobsini )
@@ -286,8 +318,15 @@
          WRITE(numout,*) '             Logical switch for velocity observations               ln_vel3d = ', ln_vel3d
          WRITE(numout,*) '             Logical switch for SSS observations                      ln_sss = ', ln_sss
-         WRITE(numout,*) '             Logical switch for log(Chl) observations              ln_logchl = ', ln_logchl
-         WRITE(numout,*) '             Logical switch for SPM observations                      ln_spm = ', ln_spm
-         WRITE(numout,*) '             Logical switch for FCO2 observations                    ln_fco2 = ', ln_fco2
-         WRITE(numout,*) '             Logical switch for PCO2 observations                    ln_pco2 = ', ln_pco2
+         WRITE(numout,*) '             Logical switch for surf_logchl_total obs   ln_surf_logchl_total = ', ln_surf_logchl_total
+         WRITE(numout,*) '             Logical switch for surf_logchl_diat obs     ln_surf_logchl_diat = ', ln_surf_logchl_diat
+         WRITE(numout,*) '             Logical switch for surf_logchl_nondiat   ln_surf_logchl_nondiat = ', ln_surf_logchl_nondiat
+         WRITE(numout,*) '             Logical switch for surf_logchl_dino obs     ln_surf_logchl_dino = ', ln_surf_logchl_dino
+         WRITE(numout,*) '             Logical switch for surf_logchl_micro obs   ln_surf_logchl_micro = ', ln_surf_logchl_micro
+         WRITE(numout,*) '             Logical switch for surf_logchl_nano obs     ln_surf_logchl_nano = ', ln_surf_logchl_nano
+         WRITE(numout,*) '             Logical switch for surf_logchl_pico obs     ln_surf_logchl_pico = ', ln_surf_logchl_pico
+         WRITE(numout,*) '             Logical switch for surf_chl_total obs         ln_surf_chl_total = ', ln_surf_chl_total
+         WRITE(numout,*) '             Logical switch for surface SPM observations         ln_surf_spm = ', ln_surf_spm
+         WRITE(numout,*) '             Logical switch for surface fCO2 observations       ln_surf_fco2 = ', ln_surf_fco2
+         WRITE(numout,*) '             Logical switch for surface pCO2 observations       ln_surf_pco2 = ', ln_surf_pco2
          WRITE(numout,*) '             Global distribution of observations              ln_grid_global = ', ln_grid_global
          WRITE(numout,*) '             Logical switch for obs grid search lookup ln_grid_search_lookup = ', ln_grid_search_lookup
@@ -315,6 +354,10 @@
 
       nproftypes = COUNT( (/ln_t3d .OR. ln_s3d, ln_vel3d /) )
-      nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_sss, &
-         &                  ln_logchl, ln_spm, ln_fco2, ln_pco2 /) )
+      nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_sss,              &
+         &                  ln_surf_logchl_total, ln_surf_logchl_diat,   &
+         &                  ln_surf_logchl_nondiat, ln_surf_logchl_dino, &
+         &                  ln_surf_logchl_micro, ln_surf_logchl_nano,   &
+         &                  ln_surf_logchl_pico, ln_surf_chl_total,      &
+         &                  ln_surf_spm, ln_surf_fco2, ln_surf_pco2 /) )
 
       IF ( nproftypes == 0 .AND. nsurftypes == 0 ) THEN
@@ -363,7 +406,7 @@
          IF (ln_sla) THEN
             jtype = jtype + 1
-            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'sla   ', &
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'sla', &
                &                   cn_slafbfiles, ifilessurf, cobstypessurf, clsurffiles )
-            CALL obs_setinterpopts( nsurftypes, jtype, 'sla   ',      &
+            CALL obs_setinterpopts( nsurftypes, jtype, 'sla',         &
                &                  nn_2dint, nn_2dint_sla,             &
                &                  rn_sla_avglamscl, rn_sla_avgphiscl, &
@@ -374,7 +417,7 @@
          IF (ln_sst) THEN
             jtype = jtype + 1
-            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'sst   ', &
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'sst', &
                &                   cn_sstfbfiles, ifilessurf, cobstypessurf, clsurffiles )
-            CALL obs_setinterpopts( nsurftypes, jtype, 'sst   ',      &
+            CALL obs_setinterpopts( nsurftypes, jtype, 'sst',         &
                &                  nn_2dint, nn_2dint_sst,             &
                &                  rn_sst_avglamscl, rn_sst_avgphiscl, &
@@ -386,7 +429,7 @@
          IF (ln_sic) THEN
             jtype = jtype + 1
-            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'sic   ', &
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'sic', &
                &                   cn_sicfbfiles, ifilessurf, cobstypessurf, clsurffiles )
-            CALL obs_setinterpopts( nsurftypes, jtype, 'sic   ',      &
+            CALL obs_setinterpopts( nsurftypes, jtype, 'sic',         &
                &                  nn_2dint, nn_2dint_sic,             &
                &                  rn_sic_avglamscl, rn_sic_avgphiscl, &
@@ -398,7 +441,7 @@
          IF (ln_sss) THEN
             jtype = jtype + 1
-            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'sss   ', &
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'sss', &
                &                   cn_sssfbfiles, ifilessurf, cobstypessurf, clsurffiles )
-            CALL obs_setinterpopts( nsurftypes, jtype, 'sss   ',      &
+            CALL obs_setinterpopts( nsurftypes, jtype, 'sss',         &
                &                  nn_2dint, nn_2dint_sss,             &
                &                  rn_sss_avglamscl, rn_sss_avgphiscl, &
@@ -408,9 +451,89 @@
          ENDIF
 
-         IF (ln_logchl) THEN
-            jtype = jtype + 1
-            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'logchl', &
+         IF (ln_surf_logchl_total) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_logchl_total', &
                &                   cn_logchlfbfiles, ifilessurf, cobstypessurf, clsurffiles )
-            CALL obs_setinterpopts( nsurftypes, jtype, 'logchl',         &
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_logchl_total',   &
+               &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE.,    &
+               &                    n2dintsurf, ravglamscl, ravgphiscl,       &
+               &                    lfpindegs, llnightav )
+         ENDIF
+
+         IF (ln_surf_logchl_diat) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_logchl_diat', &
+               &                   cn_logchlfbfiles, ifilessurf, cobstypessurf, clsurffiles )
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_logchl_diat',    &
+               &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE.,    &
+               &                    n2dintsurf, ravglamscl, ravgphiscl,       &
+               &                    lfpindegs, llnightav )
+         ENDIF
+
+         IF (ln_surf_logchl_nondiat) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_logchl_nondiat', &
+               &                   cn_logchlfbfiles, ifilessurf, cobstypessurf, clsurffiles )
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_logchl_nondiat', &
+               &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE.,    &
+               &                    n2dintsurf, ravglamscl, ravgphiscl,       &
+               &                    lfpindegs, llnightav )
+         ENDIF
+
+         IF (ln_surf_logchl_dino) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_logchl_dino', &
+               &                   cn_logchlfbfiles, ifilessurf, cobstypessurf, clsurffiles )
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_logchl_dino',    &
+               &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE.,    &
+               &                    n2dintsurf, ravglamscl, ravgphiscl,       &
+               &                    lfpindegs, llnightav )
+         ENDIF
+
+         IF (ln_surf_logchl_micro) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_logchl_micro', &
+               &                   cn_logchlfbfiles, ifilessurf, cobstypessurf, clsurffiles )
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_logchl_micro',   &
+               &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE.,    &
+               &                    n2dintsurf, ravglamscl, ravgphiscl,       &
+               &                    lfpindegs, llnightav )
+         ENDIF
+
+         IF (ln_surf_logchl_nano) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_logchl_nano', &
+               &                   cn_logchlfbfiles, ifilessurf, cobstypessurf, clsurffiles )
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_logchl_nano',    &
+               &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE.,    &
+               &                    n2dintsurf, ravglamscl, ravgphiscl,       &
+               &                    lfpindegs, llnightav )
+         ENDIF
+
+         IF (ln_surf_logchl_pico) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_logchl_pico', &
+               &                   cn_logchlfbfiles, ifilessurf, cobstypessurf, clsurffiles )
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_logchl_pico',    &
+               &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE.,    &
+               &                    n2dintsurf, ravglamscl, ravgphiscl,       &
+               &                    lfpindegs, llnightav )
+         ENDIF
+
+         IF (ln_surf_chl_total) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_chl_total', &
+               &                   cn_logchlfbfiles, ifilessurf, cobstypessurf, clsurffiles )
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_chl_total',      &
+               &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE.,    &
+               &                    n2dintsurf, ravglamscl, ravgphiscl,       &
+               &                    lfpindegs, llnightav )
+         ENDIF
+
+         IF (ln_surf_spm) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_spm', &
+               &                   cn_spmfbfiles, ifilessurf, cobstypessurf, clsurffiles )
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_spm',         &
                &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE., &
                &                    n2dintsurf, ravglamscl, ravgphiscl,    &
@@ -418,9 +541,9 @@
          ENDIF
 
-         IF (ln_spm) THEN
-            jtype = jtype + 1
-            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'spm   ', &
-               &                   cn_spmfbfiles, ifilessurf, cobstypessurf, clsurffiles )
-            CALL obs_setinterpopts( nsurftypes, jtype, 'spm   ',         &
+         IF (ln_surf_fco2) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_fco2', &
+               &                   cn_fco2fbfiles, ifilessurf, cobstypessurf, clsurffiles )
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_fco2',        &
                &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE., &
                &                    n2dintsurf, ravglamscl, ravgphiscl,    &
@@ -428,19 +551,9 @@
          ENDIF
 
-         IF (ln_fco2) THEN
-            jtype = jtype + 1
-            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'fco2  ', &
-               &                   cn_fco2fbfiles, ifilessurf, cobstypessurf, clsurffiles )
-            CALL obs_setinterpopts( nsurftypes, jtype, 'fco2  ',         &
-               &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE., &
-               &                    n2dintsurf, ravglamscl, ravgphiscl,    &
-               &                    lfpindegs, llnightav )
-         ENDIF
-
-         IF (ln_pco2) THEN
-            jtype = jtype + 1
-            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'pco2  ', &
+         IF (ln_surf_pco2) THEN
+            jtype = jtype + 1
+            CALL obs_settypefiles( nsurftypes, jpmaxnfiles, jtype, 'surf_pco2', &
                &                   cn_pco2fbfiles, ifilessurf, cobstypessurf, clsurffiles )
-            CALL obs_setinterpopts( nsurftypes, jtype, 'pco2  ',         &
+            CALL obs_setinterpopts( nsurftypes, jtype, 'surf_pco2',        &
                &                    nn_2dint, -1, 0., 0., .TRUE., .FALSE., &
                &                    n2dintsurf, ravglamscl, ravgphiscl,    &
@@ -793,15 +906,17 @@
                ENDIF
 
-            CASE('logchl')
+            CASE('surf_logchl_total')
 #if defined key_hadocc
-               zsurfvar(:,:) = HADOCC_CHL(:,:,1)    ! (not log) chlorophyll from HadOCC
+               ! Surface chlorophyll from HadOCC
+               zsurfvar(:,:) = HADOCC_CHL(:,:,1)
 #elif defined key_medusa && defined key_foam_medusa
                ! Add non-diatom and diatom surface chlorophyll from MEDUSA
                zsurfvar(:,:) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd)
 #elif defined key_fabm
-               chl_3d(:,:,:) = fabm_get_bulk_diagnostic_data(model, jp_fabmdia_chltot)
-               zsurfvar(:,:) = chl_3d(:,:,1)
+               ! Add all surface chlorophyll groups from ERSEM
+               zsurfvar(:,:) = trn(:,:,1,jp_fabm_chl1) + trn(:,:,1,jp_fabm_chl2) + &
+                  &            trn(:,:,1,jp_fabm_chl3) + trn(:,:,1,jp_fabm_chl4)
 #else
-               CALL ctl_stop( ' Trying to run logchl observation operator', &
+               CALL ctl_stop( ' Trying to run surf_logchl_total observation operator', &
                   &           ' but no biogeochemical model appears to have been defined' )
 #endif
@@ -815,5 +930,168 @@
                   zsurfmask(:,:) = 0
                END WHERE
-            CASE('spm')
+
+            CASE('surf_logchl_diat')
+#if defined key_hadocc
+               CALL ctl_stop( ' Trying to run surf_logchl_diat observation operator', &
+                  &           ' but HadOCC does not explicitly simulate diatoms' )
+#elif defined key_medusa && defined key_foam_medusa
+               ! Diatom surface chlorophyll from MEDUSA
+               zsurfvar(:,:) = trn(:,:,1,jpchd)
+#elif defined key_fabm
+               ! Diatom surface chlorophyll from ERSEM
+               zsurfvar(:,:) = trn(:,:,1,jp_fabm_chl1)
+#else
+               CALL ctl_stop( ' Trying to run surf_logchl_diat observation operator', &
+                  &           ' but no biogeochemical model appears to have been defined' )
+#endif
+               zsurfmask(:,:) = tmask(:,:,1)         ! create a special mask to exclude certain things
+               ! Take the log10 where we can, otherwise exclude
+               tiny = 1.0e-20
+               WHERE(zsurfvar(:,:) > tiny .AND. zsurfvar(:,:) /= obfillflt )
+                  zsurfvar(:,:)  = LOG10(zsurfvar(:,:))
+               ELSEWHERE
+                  zsurfvar(:,:)  = obfillflt
+                  zsurfmask(:,:) = 0
+               END WHERE
+
+            CASE('surf_logchl_nondiat')
+#if defined key_hadocc
+               CALL ctl_stop( ' Trying to run surf_logchl_nondiat observation operator', &
+                  &           ' but HadOCC does not explicitly simulate non-diatoms' )
+#elif defined key_medusa && defined key_foam_medusa
+               ! Non-diatom surface chlorophyll from MEDUSA
+               zsurfvar(:,:) = trn(:,:,1,jpchn)
+#elif defined key_fabm
+               ! Add all non-diatom surface chlorophyll groups from ERSEM
+               zsurfvar(:,:) = trn(:,:,1,jp_fabm_chl2) + &
+                  &            trn(:,:,1,jp_fabm_chl3) + trn(:,:,1,jp_fabm_chl4)
+#else
+               CALL ctl_stop( ' Trying to run surf_logchl_nondiat observation operator', &
+                  &           ' but no biogeochemical model appears to have been defined' )
+#endif
+               zsurfmask(:,:) = tmask(:,:,1)         ! create a special mask to exclude certain things
+               ! Take the log10 where we can, otherwise exclude
+               tiny = 1.0e-20
+               WHERE(zsurfvar(:,:) > tiny .AND. zsurfvar(:,:) /= obfillflt )
+                  zsurfvar(:,:)  = LOG10(zsurfvar(:,:))
+               ELSEWHERE
+                  zsurfvar(:,:)  = obfillflt
+                  zsurfmask(:,:) = 0
+               END WHERE
+
+            CASE('surf_logchl_dino')
+#if defined key_hadocc
+               CALL ctl_stop( ' Trying to run surf_logchl_dino observation operator', &
+                  &           ' but HadOCC does not explicitly simulate dinoflagellates' )
+#elif defined key_medusa && defined key_foam_medusa
+               CALL ctl_stop( ' Trying to run surf_logchl_dino observation operator', &
+                  &           ' but MEDUSA does not explicitly simulate dinoflagellates' )
+#elif defined key_fabm
+               ! Dinoflagellate surface chlorophyll from ERSEM
+               zsurfvar(:,:) = trn(:,:,1,jp_fabm_chl4)
+#else
+               CALL ctl_stop( ' Trying to run surf_logchl_dino observation operator', &
+                  &           ' but no biogeochemical model appears to have been defined' )
+#endif
+               zsurfmask(:,:) = tmask(:,:,1)         ! create a special mask to exclude certain things
+               ! Take the log10 where we can, otherwise exclude
+               tiny = 1.0e-20
+               WHERE(zsurfvar(:,:) > tiny .AND. zsurfvar(:,:) /= obfillflt )
+                  zsurfvar(:,:)  = LOG10(zsurfvar(:,:))
+               ELSEWHERE
+                  zsurfvar(:,:)  = obfillflt
+                  zsurfmask(:,:) = 0
+               END WHERE
+
+            CASE('surf_logchl_micro')
+#if defined key_hadocc
+               CALL ctl_stop( ' Trying to run surf_logchl_micro observation operator', &
+                  &           ' but HadOCC does not explicitly simulate microphytoplankton' )
+#elif defined key_medusa && defined key_foam_medusa
+               CALL ctl_stop( ' Trying to run surf_logchl_micro observation operator', &
+                  &           ' but MEDUSA does not explicitly simulate microphytoplankton' )
+#elif defined key_fabm
+               ! Add diatom and dinoflagellate surface chlorophyll from ERSEM
+               zsurfvar(:,:) = trn(:,:,1,jp_fabm_chl1) + trn(:,:,1,jp_fabm_chl4)
+#else
+               CALL ctl_stop( ' Trying to run surf_logchl_micro observation operator', &
+                  &           ' but no biogeochemical model appears to have been defined' )
+#endif
+               zsurfmask(:,:) = tmask(:,:,1)         ! create a special mask to exclude certain things
+               ! Take the log10 where we can, otherwise exclude
+               tiny = 1.0e-20
+               WHERE(zsurfvar(:,:) > tiny .AND. zsurfvar(:,:) /= obfillflt )
+                  zsurfvar(:,:)  = LOG10(zsurfvar(:,:))
+               ELSEWHERE
+                  zsurfvar(:,:)  = obfillflt
+                  zsurfmask(:,:) = 0
+               END WHERE
+
+            CASE('surf_logchl_nano')
+#if defined key_hadocc
+               CALL ctl_stop( ' Trying to run surf_logchl_nano observation operator', &
+                  &           ' but HadOCC does not explicitly simulate nanophytoplankton' )
+#elif defined key_medusa && defined key_foam_medusa
+               CALL ctl_stop( ' Trying to run surf_logchl_nano observation operator', &
+                  &           ' but MEDUSA does not explicitly simulate nanophytoplankton' )
+#elif defined key_fabm
+               ! Nanophytoplankton surface chlorophyll from ERSEM
+               zsurfvar(:,:) = trn(:,:,1,jp_fabm_chl2)
+#else
+               CALL ctl_stop( ' Trying to run surf_logchl_nano observation operator', &
+                  &           ' but no biogeochemical model appears to have been defined' )
+#endif
+               zsurfmask(:,:) = tmask(:,:,1)         ! create a special mask to exclude certain things
+               ! Take the log10 where we can, otherwise exclude
+               tiny = 1.0e-20
+               WHERE(zsurfvar(:,:) > tiny .AND. zsurfvar(:,:) /= obfillflt )
+                  zsurfvar(:,:)  = LOG10(zsurfvar(:,:))
+               ELSEWHERE
+                  zsurfvar(:,:)  = obfillflt
+                  zsurfmask(:,:) = 0
+               END WHERE
+
+            CASE('surf_logchl_pico')
+#if defined key_hadocc
+               CALL ctl_stop( ' Trying to run surf_logchl_pico observation operator', &
+                  &           ' but HadOCC does not explicitly simulate picophytoplankton' )
+#elif defined key_medusa && defined key_foam_medusa
+               CALL ctl_stop( ' Trying to run surf_logchl_pico observation operator', &
+                  &           ' but MEDUSA does not explicitly simulate picophytoplankton' )
+#elif defined key_fabm
+               ! Picophytoplankton surface chlorophyll from ERSEM
+               zsurfvar(:,:) = trn(:,:,1,jp_fabm_chl3)
+#else
+               CALL ctl_stop( ' Trying to run surf_logchl_pico observation operator', &
+                  &           ' but no biogeochemical model appears to have been defined' )
+#endif
+               zsurfmask(:,:) = tmask(:,:,1)         ! create a special mask to exclude certain things
+               ! Take the log10 where we can, otherwise exclude
+               tiny = 1.0e-20
+               WHERE(zsurfvar(:,:) > tiny .AND. zsurfvar(:,:) /= obfillflt )
+                  zsurfvar(:,:)  = LOG10(zsurfvar(:,:))
+               ELSEWHERE
+                  zsurfvar(:,:)  = obfillflt
+                  zsurfmask(:,:) = 0
+               END WHERE
+
+            CASE('surf_chl_total')
+#if defined key_hadocc
+               ! Surface chlorophyll from HadOCC
+               zsurfvar(:,:) = HADOCC_CHL(:,:,1)
+#elif defined key_medusa && defined key_foam_medusa
+               ! Add non-diatom and diatom surface chlorophyll from MEDUSA
+               zsurfvar(:,:) = trn(:,:,1,jpchn) + trn(:,:,1,jpchd)
+#elif defined key_fabm
+               ! Add all surface chlorophyll groups from ERSEM
+               zsurfvar(:,:) = trn(:,:,1,jp_fabm_chl1) + trn(:,:,1,jp_fabm_chl2) + &
+                  &            trn(:,:,1,jp_fabm_chl3) + trn(:,:,1,jp_fabm_chl4)
+#else
+               CALL ctl_stop( ' Trying to run surf_chl_total observation operator', &
+                  &           ' but no biogeochemical model appears to have been defined' )
+#endif
+               zsurfmask(:,:) = tmask(:,:,1)         ! create a special mask to exclude certain things
+
+            CASE('surf_spm')
 #if defined key_spm
                zsurfvar(:,:) = 0.0
@@ -825,5 +1103,6 @@
                   &           ' but no spm model appears to have been defined' )
 #endif
-            CASE('fco2')
+
+            CASE('surf_fco2')
 #if defined key_hadocc
                zsurfvar(:,:) = HADOCC_FCO2(:,:)    ! fCO2 from HadOCC
@@ -864,5 +1143,6 @@
                   &           ' but no biogeochemical model appears to have been defined' )
 #endif
-            CASE('pco2')
+
+            CASE('surf_pco2')
 #if defined key_hadocc
                zsurfvar(:,:) = HADOCC_PCO2(:,:)    ! pCO2 from HadOCC
@@ -1202,8 +1482,8 @@
        &                   ifiles      ! Out appended number of files for this type
 
-    CHARACTER(len=6), INTENT(IN) :: ctypein 
+    CHARACTER(len=25), INTENT(IN) :: ctypein 
     CHARACTER(len=128), DIMENSION(jpmaxnfiles), INTENT(IN) :: &
        &                   cfilestype  ! In list of files for this obs type
-    CHARACTER(len=6), DIMENSION(ntypes), INTENT(INOUT) :: &
+    CHARACTER(len=25), DIMENSION(ntypes), INTENT(INOUT) :: &
        &                   cobstypes   ! Out appended list of obs types
     CHARACTER(len=128), DIMENSION(ntypes, jpmaxnfiles), INTENT(INOUT) :: &
@@ -1251,5 +1531,5 @@
     LOGICAL, INTENT(IN)  :: lfp_indegs_type    !T=> footprint in degrees, F=> in metres
     LOGICAL, INTENT(IN)  :: lavnight_type      !T=> obs represent night time average
-    CHARACTER(len=6), INTENT(IN) :: ctypein 
+    CHARACTER(len=25), INTENT(IN) :: ctypein 
 
     INTEGER, DIMENSION(ntypes), INTENT(INOUT) :: &
Index: branches/UKMO/dev_r5518_obs_oper_update_bgc3d/NEMOGCM/NEMO/OPA_SRC/OBS/obs_write.F90
===================================================================
--- branches/UKMO/dev_r5518_obs_oper_update_bgc3d/NEMOGCM/NEMO/OPA_SRC/OBS/obs_write.F90	(revision 8684)
+++ branches/UKMO/dev_r5518_obs_oper_update_bgc3d/NEMOGCM/NEMO/OPA_SRC/OBS/obs_write.F90	(revision 8687)
@@ -83,5 +83,5 @@
       TYPE(obfbdata) :: fbdata
       CHARACTER(LEN=40) :: clfname
-      CHARACTER(LEN=10) :: clfiletype
+      CHARACTER(LEN=27) :: clfiletype
       INTEGER :: ilevel
       INTEGER :: jvar
@@ -320,5 +320,5 @@
       TYPE(obfbdata) :: fbdata
       CHARACTER(LEN=40) :: clfname         ! netCDF filename
-      CHARACTER(LEN=10) :: clfiletype
+      CHARACTER(LEN=27) :: clfiletype
       CHARACTER(LEN=12), PARAMETER :: cpname = 'obs_wri_surf'
       INTEGER :: jo
@@ -441,12 +441,173 @@
          END DO
 
-      CASE('LOGCHL','LogChl','logchl')
-
-         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
-            &                 1 + iadd, iext, .TRUE. )
-
-         clfiletype = 'logchlfb'
-         fbdata%cname(1)      = surfdata%cvars(1)
-         fbdata%coblong(1)    = 'logchl concentration'
+      CASE('SURF_LOGCHL_TOTAL','LOGCHL','LogChl','logchl')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_logchl_totalfb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface total log10(chlorophyll)'
+         fbdata%cobunit(1)    = 'log10(mg/m3)'
+         DO je = 1, iext
+            fbdata%cextname(je) = pext%cdname(je)
+            fbdata%cextlong(je) = pext%cdlong(je,1)
+            fbdata%cextunit(je) = pext%cdunit(je,1)
+         END DO
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
+         fbdata%caddunit(1,1) = 'log10(mg/m3)'
+         fbdata%cgrid(1)      = 'T'
+         DO ja = 1, iadd
+            fbdata%caddname(1+ja) = padd%cdname(ja)
+            fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1)
+            fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1)
+         END DO
+
+      CASE('SURF_LOGCHL_DIAT')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_logchl_diatfb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface diatom log10(chlorophyll)'
+         fbdata%cobunit(1)    = 'log10(mg/m3)'
+         DO je = 1, iext
+            fbdata%cextname(je) = pext%cdname(je)
+            fbdata%cextlong(je) = pext%cdlong(je,1)
+            fbdata%cextunit(je) = pext%cdunit(je,1)
+         END DO
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
+         fbdata%caddunit(1,1) = 'log10(mg/m3)'
+         fbdata%cgrid(1)      = 'T'
+         DO ja = 1, iadd
+            fbdata%caddname(1+ja) = padd%cdname(ja)
+            fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1)
+            fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1)
+         END DO
+
+      CASE('SURF_LOGCHL_NONDIAT')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_logchl_nondiatfb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface non-diatom log10(chlorophyll)'
+         fbdata%cobunit(1)    = 'log10(mg/m3)'
+         DO je = 1, iext
+            fbdata%cextname(je) = pext%cdname(je)
+            fbdata%cextlong(je) = pext%cdlong(je,1)
+            fbdata%cextunit(je) = pext%cdunit(je,1)
+         END DO
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
+         fbdata%caddunit(1,1) = 'log10(mg/m3)'
+         fbdata%cgrid(1)      = 'T'
+         DO ja = 1, iadd
+            fbdata%caddname(1+ja) = padd%cdname(ja)
+            fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1)
+            fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1)
+         END DO
+
+      CASE('SURF_LOGCHL_DINO')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_logchl_dinofb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface dinoflagellate log10(chlorophyll)'
+         fbdata%cobunit(1)    = 'log10(mg/m3)'
+         DO je = 1, iext
+            fbdata%cextname(je) = pext%cdname(je)
+            fbdata%cextlong(je) = pext%cdlong(je,1)
+            fbdata%cextunit(je) = pext%cdunit(je,1)
+         END DO
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
+         fbdata%caddunit(1,1) = 'log10(mg/m3)'
+         fbdata%cgrid(1)      = 'T'
+         DO ja = 1, iadd
+            fbdata%caddname(1+ja) = padd%cdname(ja)
+            fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1)
+            fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1)
+         END DO
+
+      CASE('SURF_LOGCHL_MICRO')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_logchl_microfb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface microphytoplankton log10(chlorophyll)'
+         fbdata%cobunit(1)    = 'log10(mg/m3)'
+         DO je = 1, iext
+            fbdata%cextname(je) = pext%cdname(je)
+            fbdata%cextlong(je) = pext%cdlong(je,1)
+            fbdata%cextunit(je) = pext%cdunit(je,1)
+         END DO
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
+         fbdata%caddunit(1,1) = 'log10(mg/m3)'
+         fbdata%cgrid(1)      = 'T'
+         DO ja = 1, iadd
+            fbdata%caddname(1+ja) = padd%cdname(ja)
+            fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1)
+            fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1)
+         END DO
+
+      CASE('SURF_LOGCHL_NANO')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_logchl_nanofb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface nanophytoplankton log10(chlorophyll)'
+         fbdata%cobunit(1)    = 'log10(mg/m3)'
+         DO je = 1, iext
+            fbdata%cextname(je) = pext%cdname(je)
+            fbdata%cextlong(je) = pext%cdlong(je,1)
+            fbdata%cextunit(je) = pext%cdunit(je,1)
+         END DO
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
+         fbdata%caddunit(1,1) = 'log10(mg/m3)'
+         fbdata%cgrid(1)      = 'T'
+         DO ja = 1, iadd
+            fbdata%caddname(1+ja) = padd%cdname(ja)
+            fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1)
+            fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1)
+         END DO
+
+      CASE('SURF_LOGCHL_PICO')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_logchl_picofb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface picophytoplankton log10(chlorophyll)'
+         fbdata%cobunit(1)    = 'log10(mg/m3)'
+         DO je = 1, iext
+            fbdata%cextname(je) = pext%cdname(je)
+            fbdata%cextlong(je) = pext%cdlong(je,1)
+            fbdata%cextunit(je) = pext%cdunit(je,1)
+         END DO
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
+         fbdata%caddunit(1,1) = 'log10(mg/m3)'
+         fbdata%cgrid(1)      = 'T'
+         DO ja = 1, iadd
+            fbdata%caddname(1+ja) = padd%cdname(ja)
+            fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1)
+            fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1)
+         END DO
+
+      CASE('SURF_CHL_TOTAL')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_chl_totalfb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface total chlorophyll'
          fbdata%cobunit(1)    = 'mg/m3'
          DO je = 1, iext
@@ -455,5 +616,5 @@
             fbdata%cextunit(je) = pext%cdunit(je,1)
          END DO
-         fbdata%caddlong(1,1) = 'Model interpolated LOGCHL'
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
          fbdata%caddunit(1,1) = 'mg/m3'
          fbdata%cgrid(1)      = 'T'
@@ -464,12 +625,12 @@
          END DO
 
-      CASE('SPM','Spm','spm')
-
-         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
-            &                 1 + iadd, iext, .TRUE. )
-
-         clfiletype = 'spmfb'
-         fbdata%cname(1)      = surfdata%cvars(1)
-         fbdata%coblong(1)    = 'spm'
+      CASE('SURF_SPM')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_spmfb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface suspended particulate matter'
          fbdata%cobunit(1)    = 'g/m3'
          DO je = 1, iext
@@ -478,5 +639,5 @@
             fbdata%cextunit(je) = pext%cdunit(je,1)
          END DO
-         fbdata%caddlong(1,1) = 'Model interpolated spm'
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
          fbdata%caddunit(1,1) = 'g/m3'
          fbdata%cgrid(1)      = 'T'
@@ -487,12 +648,12 @@
          END DO
 
-      CASE('FCO2','fCO2','fco2')
-
-         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
-            &                 1 + iadd, iext, .TRUE. )
-
-         clfiletype = 'fco2fb'
-         fbdata%cname(1)      = surfdata%cvars(1)
-         fbdata%coblong(1)    = 'fco2'
+      CASE('SURF_FCO2','FCO2','fCO2','fco2')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_fco2fb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface fugacity of carbon dioxide'
          fbdata%cobunit(1)    = 'uatm'
          DO je = 1, iext
@@ -501,5 +662,5 @@
             fbdata%cextunit(je) = pext%cdunit(je,1)
          END DO
-         fbdata%caddlong(1,1) = 'Model interpolated fco2'
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
          fbdata%caddunit(1,1) = 'uatm'
          fbdata%cgrid(1)      = 'T'
@@ -510,12 +671,12 @@
          END DO
 
-      CASE('PCO2','pCO2','pco2')
-
-         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
-            &                 1 + iadd, iext, .TRUE. )
-
-         clfiletype = 'pco2fb'
-         fbdata%cname(1)      = surfdata%cvars(1)
-         fbdata%coblong(1)    = 'pco2'
+      CASE('SURF_PCO2')
+
+         CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, &
+            &                 1 + iadd, iext, .TRUE. )
+
+         clfiletype = 'surf_pco2fb'
+         fbdata%cname(1)      = surfdata%cvars(1)
+         fbdata%coblong(1)    = 'Surface partial pressure of carbon dioxide'
          fbdata%cobunit(1)    = 'uatm'
          DO je = 1, iext
@@ -524,5 +685,5 @@
             fbdata%cextunit(je) = pext%cdunit(je,1)
          END DO
-         fbdata%caddlong(1,1) = 'Model interpolated pco2'
+         fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))
          fbdata%caddunit(1,1) = 'uatm'
          fbdata%cgrid(1)      = 'T'
