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 15180 for NEMO/branches/UKMO/NEMO_4.0.4_generic_obs – NEMO

Ignore:
Timestamp:
2021-08-11T13:24:27+02:00 (3 years ago)
Author:
dford
Message:

Further generification, particularly surrounding additional and extra variables.

Location:
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs
Files:
11 edited
1 moved

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/cfgs/SHARED/namelist_ref

    r15144 r15180  
    12611261&namobs_dta    !  observation and model comparison - external data      (see: namobs) 
    12621262!----------------------------------------------------------------------- 
    1263    cn_groupname         = ''               ! Name of obs group (for stdout) 
    1264    ln_enabled           = .true.           ! Logical switch for group being processed not ignored 
    1265    ln_prof              = .false.          ! Logical switch for profile data 
    1266    ln_surf              = .false.          ! Logical switch for surface data 
    1267    cn_obsfiles          = ''               ! Observation file names 
    1268    cn_obstypes          = ''               ! Observation types to read from files 
    1269    ln_nea               = .false.          ! Logical switch for rejecting observations near land 
    1270    ln_bound_reject      = .false.          ! Logical switch for rejecting obs near the boundary 
    1271    ln_ignmis            = .true.           ! Logical switch for ignoring missing files 
    1272    nn_2dint             = 0                ! Type of horizontal interpolation method 
     1263   cn_groupname           = ''             ! Name of obs group (output file will be cn_groupname//'fb_????.nc') 
     1264   ln_enabled             = .true.         ! Logical switch for group being processed not ignored 
     1265   ln_prof                = .false.        ! Logical switch for profile data 
     1266   ln_surf                = .false.        ! Logical switch for surface data 
     1267   cn_obsfiles            = ''             ! Observation file names 
     1268   cn_obstypes            = ''             ! Observation types to read from files 
     1269   ln_nea                 = .false.        ! Logical switch for rejecting observations near land 
     1270   ln_bound_reject        = .false.        ! Logical switch for rejecting obs near the boundary 
     1271   ln_ignmis              = .true.         ! Logical switch for ignoring missing files 
     1272   nn_2dint               = 0              ! Type of horizontal interpolation method 
    12731273                                           ! Relevant if ln_prof = .true.: 
    1274    nn_1dint             = 0                !    Type of vertical interpolation method 
    1275    nn_profdavtypes      = -1               !    Profile data types representing a daily average 
     1274   nn_1dint               = 0              !    Type of vertical interpolation method 
     1275   nn_profdavtypes        = -1             !    Profile data types representing a daily average 
     1276   ln_all_at_all          = .false.        !    Logical switch for computing all model variables at all obs points 
    12761277                                           ! Relevant if ln_surf = .true.: 
    1277    ln_fp_indegs         = .true.           !    Logical: T=> averaging footprint is in degrees, F=> in metres 
    1278    rn_avglamscl         = 0.               !    E/W diameter of observation footprint (metres/degrees) 
    1279    rn_avgphiscl         = 0.               !    N/S diameter of observation footprint (metres/degrees) 
    1280    ln_night             = .false.          !    Logical switch for calculating night-time average for obs 
    1281                                            ! Relevant if 'SST' in cn_obstypes: 
    1282    ln_sstbias           = .false.          !    Logical switch for SST bias correction 
    1283    cn_sstbiasfiles      = ''               !    SST bias input file names 
     1278   ln_fp_indegs           = .true.         !    Logical: T=> averaging footprint is in degrees, F=> in metres 
     1279   rn_avglamscl           = 0.             !    E/W diameter of observation footprint (metres/degrees) 
     1280   rn_avgphiscl           = 0.             !    N/S diameter of observation footprint (metres/degrees) 
     1281   ln_night               = .false.        !    Logical switch for calculating night-time average for obs 
     1282   ln_obsbias             = .false.        !    Logical switch for bias correction 
     1283   cn_obsbiasfiles        = ''             !    Bias input file names 
     1284   cn_type_to_biascorrect = ''             !    Observation type to bias correct 
     1285   cn_obsbiasfile_varname = ''             !    Bias variable name in input file 
    12841286                                           ! Relevant if 'SLA' in cn_obstypes: 
    1285    ln_altbias           = .false.          !    Logical switch for altimeter bias correction 
    1286    cn_altbiasfile       = ''               !    Altimeter bias input file name 
    1287    nn_msshc             = 0                !    MSSH correction scheme 
    1288    rn_mdtcorr           = 1.61             !    MDT correction 
    1289    rn_mdtcutoff         = 65.0             !    MDT cutoff for computed correction 
    1290    ln_time_mean_sla_bkg = .false.          !    Logical switch for applying time mean of SLA background to remove tidal signal 
    1291                                            ! Relevant if 'POTM' and/or 'PSAL' in cn_obstypes: 
    1292    ln_s_at_t            = .false.          !    Logical switch for computing model S at T obs if not there 
    1293    ln_output_clim       = .false.          !    Logical switch for writing climatological values to fdbk files 
     1287   ln_altbias             = .false.        !    Logical switch for altimeter bias correction 
     1288   cn_altbiasfile         = ''             !    Altimeter bias input file name 
     1289   nn_msshc               = 0              !    MSSH correction scheme 
     1290   rn_mdtcorr             = 1.61           !    MDT correction 
     1291   rn_mdtcutoff           = 65.0           !    MDT cutoff for computed correction 
     1292!!! NOT YET IMPLEMENTED: 
     1293!!!   OUTPUT CLIMATOLOGY 
     1294!!!   TIME MEAN BACKGROUND 
    12941295/ 
    12951296!----------------------------------------------------------------------- 
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/diaobs.F90

    r15144 r15180  
    2828   USE par_kind       ! Precision variables 
    2929   USE in_out_manager ! I/O manager 
     30   USE timing         ! Timing 
    3031   USE par_oce        ! ocean parameter 
    3132   USE dom_oce        ! Ocean space and time domain variables 
     
    3435   USE obs_read_prof  ! Reading and allocation of profile obs 
    3536   USE obs_read_surf  ! Reading and allocation of surface obs 
    36    USE obs_sstbias    ! Bias correction routine for SST  
     37   USE obs_bias       ! Bias correction routine 
    3738   USE obs_readmdt    ! Reading and allocation of MDT for SLA. 
    3839   USE obs_prep       ! Preparation of obs. (grid search etc). 
     
    197198               llvar(:) = .TRUE. 
    198199               ! 
    199                CALL obs_rea_prof( sobsgroups(jgroup)%sprofdata, & 
    200                   &               sobsgroups(jgroup)%nobsfiles, & 
    201                   &               sobsgroups(jgroup)%cobsfiles, & 
    202                   &               sobsgroups(jgroup)%nobstypes, & 
    203                   &               sobsgroups(jgroup)%nextvars,  & 
    204                   &               nitend-nit000+2,              & 
    205                   &               rn_dobsini,                   & 
    206                   &               rn_dobsend,                   & 
    207                   &               llvar,                        & 
    208                   &               sobsgroups(jgroup)%lignmis,   & 
    209                   &               sobsgroups(jgroup)%ls_at_t,   & 
    210                   &               .FALSE.,                      & 
    211                   &               sobsgroups(jgroup)%cobstypes, & 
     200               CALL obs_rea_prof( sobsgroups(jgroup)%sprofdata,   & 
     201                  &               sobsgroups(jgroup)%nobsfiles,   & 
     202                  &               sobsgroups(jgroup)%cobsfiles,   & 
     203                  &               sobsgroups(jgroup)%nobstypes,   & 
     204                  &               sobsgroups(jgroup)%naddvars,    & 
     205                  &               sobsgroups(jgroup)%nextvars,    & 
     206                  &               nitend-nit000+2,                & 
     207                  &               rn_dobsini,                     & 
     208                  &               rn_dobsend,                     & 
     209                  &               llvar,                          & 
     210                  &               sobsgroups(jgroup)%lignmis,     & 
     211                  &               sobsgroups(jgroup)%lall_at_all, & 
     212                  &               .FALSE.,                        & 
     213                  &               sobsgroups(jgroup)%cobstypes,   & 
    212214                  &               kdailyavtypes = sobsgroups(jgroup)%nprofdavtypes ) 
    213215               ! 
     
    237239                  &               sobsgroups(jgroup)%cobsfiles, & 
    238240                  &               sobsgroups(jgroup)%nobstypes, & 
     241                  &               sobsgroups(jgroup)%naddvars,  & 
    239242                  &               sobsgroups(jgroup)%nextvars,  & 
    240243                  &               nitend-nit000+2,              & 
     
    246249                  &               sobsgroups(jgroup)%cobstypes ) 
    247250                  ! 
    248                CALL obs_pre_surf( sobsgroups(jgroup)%ssurfdata,   & 
    249                   &               sobsgroups(jgroup)%ssurfdataqc, & 
    250                   &               sobsgroups(jgroup)%lnea,        & 
     251 
     252               CALL obs_pre_surf( sobsgroups(jgroup)%ssurfdata,      & 
     253                  &               sobsgroups(jgroup)%ssurfdataqc,    & 
     254                  &               jpi, jpj,                          & 
     255                  &               sobsgroups(jgroup)%rmask(:,:,1,:), & 
     256                  &               sobsgroups(jgroup)%rglam,          & 
     257                  &               sobsgroups(jgroup)%rgphi,          & 
     258                  &               sobsgroups(jgroup)%lnea,           & 
    251259                  &               sobsgroups(jgroup)%lbound_reject ) 
    252260               ! 
     
    261269               ENDIF 
    262270               ! 
    263                IF( sobsgroups(jgroup)%lsst .AND. sobsgroups(jgroup)%lsstbias ) THEN 
    264                   CALL obs_app_sstbias( sobsgroups(jgroup)%ssurfdataqc,   & 
    265                      &                  sobsgroups(jgroup)%n2dint,        &  
    266                      &                  sobsgroups(jgroup)%nsstbiasfiles, & 
    267                      &                  sobsgroups(jgroup)%csstbiasfiles )  
     271               IF( sobsgroups(jgroup)%lobsbias ) THEN 
     272                  CALL obs_app_bias( sobsgroups(jgroup)%ssurfdataqc,   & 
     273                     &               sobsgroups(jgroup)%nbiasvar,      &  
     274                     &               sobsgroups(jgroup)%n2dint,        &  
     275                     &               sobsgroups(jgroup)%nobsbiasfiles, & 
     276                     &               sobsgroups(jgroup)%cobsbiasfiles, & 
     277                     &               sobsgroups(jgroup)%cbiasvarname )  
    268278               ENDIF 
    269279               ! 
     
    315325 
    316326      !----------------------------------------------------------------------- 
     327 
     328      IF( ln_timing )   CALL timing_start('dia_obs') 
    317329 
    318330      IF(lwp) THEN 
     
    405417                     &               kstp, jpi, jpj,                       & 
    406418                     &               nit000, idaystp,                      & 
    407                      &               zsurfvar,                             & 
     419                     &               jvar, zsurfvar,                       & 
    408420                     &               sobsgroups(jgroup)%rmask(:,:,1,jvar), & 
    409421                     &               sobsgroups(jgroup)%n2dint,            & 
     
    421433         ENDIF 
    422434      END DO 
     435 
     436      IF( ln_timing )   CALL timing_stop('dia_obs') 
    423437 
    424438   END SUBROUTINE dia_obs 
     
    449463      !! * Local declarations 
    450464      INTEGER :: jgroup                   ! Data set loop variable 
    451       INTEGER :: jo, jvar, jk 
     465      INTEGER :: jo, jvar, jk, jadd, jext 
    452466      REAL(wp), DIMENSION(:), ALLOCATABLE :: & 
    453467         & zu, & 
    454468         & zv 
     469      TYPE(obswriinfo) :: sladd, slext 
     470 
     471      IF( ln_timing )   CALL timing_start('dia_obs_wri') 
    455472 
    456473      !----------------------------------------------------------------------- 
     
    496513                  &                      sobsgroups(jgroup)%sprofdata, .TRUE., numout ) 
    497514 
    498                CALL obs_wri_prof( sobsgroups(jgroup)%sprofdata ) 
     515               sladd%inum = sobsgroups(jgroup)%sprofdata%nadd 
     516               IF ( sladd%inum > 0 ) THEN 
     517                  ALLOCATE( sladd%ipoint(sladd%inum),                                   & 
     518                     &      sladd%cdname(sladd%inum),                                   & 
     519                     &      sladd%cdlong(sladd%inum,sobsgroups(jgroup)%sprofdata%nvar), & 
     520                     &      sladd%cdunit(sladd%inum,sobsgroups(jgroup)%sprofdata%nvar) ) 
     521                  DO jadd = 1, sladd%inum 
     522                     sladd%ipoint(jadd) = jadd 
     523                     sladd%cdname(jadd) = sobsgroups(jgroup)%sprofdata%caddvars(jadd) 
     524                     DO jvar = 1, sobsgroups(jgroup)%sprofdata%nvar 
     525                        sladd%cdlong(jadd,jvar) = sobsgroups(jgroup)%sprofdata%caddlong(jadd,jvar) 
     526                        sladd%cdunit(jadd,jvar) = sobsgroups(jgroup)%sprofdata%caddunit(jadd,jvar) 
     527                     END DO 
     528                  END DO 
     529               ENDIF 
     530               slext%inum = sobsgroups(jgroup)%sprofdata%next 
     531               IF ( slext%inum > 0 ) THEN 
     532                  ALLOCATE( slext%ipoint(slext%inum),   & 
     533                     &      slext%cdname(slext%inum),   & 
     534                     &      slext%cdlong(slext%inum,1), & 
     535                     &      slext%cdunit(slext%inum,1) ) 
     536                  DO jext = 1, slext%inum 
     537                     slext%ipoint(jext)   = jext 
     538                     slext%cdname(jext)   = sobsgroups(jgroup)%sprofdata%cextvars(jext) 
     539                     slext%cdlong(jext,1) = sobsgroups(jgroup)%sprofdata%cextlong(jext) 
     540                     slext%cdunit(jext,1) = sobsgroups(jgroup)%sprofdata%cextunit(jext) 
     541                  END DO 
     542               ENDIF 
     543 
     544               CALL obs_wri_prof( sobsgroups(jgroup)%sprofdata, sobsgroups(jgroup)%cgroupname, sladd, slext ) 
     545 
     546               IF ( sladd%inum > 0 ) THEN 
     547                  DEALLOCATE( sladd%ipoint, sladd%cdname, sladd%cdlong, sladd%cdunit ) 
     548               ENDIF 
     549               IF ( slext%inum > 0 ) THEN 
     550                  DEALLOCATE( slext%ipoint, slext%cdname, slext%cdlong, slext%cdunit ) 
     551               ENDIF 
    499552 
    500553            ELSEIF (sobsgroups(jgroup)%lsurf) THEN 
     
    503556                  &                      sobsgroups(jgroup)%ssurfdata, .TRUE., numout ) 
    504557 
    505                CALL obs_wri_surf( sobsgroups(jgroup)%ssurfdata ) 
     558               sladd%inum = sobsgroups(jgroup)%ssurfdata%nadd 
     559               IF ( sladd%inum > 0 ) THEN 
     560                  ALLOCATE( sladd%ipoint(sladd%inum),                                   & 
     561                     &      sladd%cdname(sladd%inum),                                   & 
     562                     &      sladd%cdlong(sladd%inum,sobsgroups(jgroup)%ssurfdata%nvar), & 
     563                     &      sladd%cdunit(sladd%inum,sobsgroups(jgroup)%ssurfdata%nvar) ) 
     564                  DO jadd = 1, sladd%inum 
     565                     sladd%ipoint(jadd) = jadd 
     566                     sladd%cdname(jadd) = sobsgroups(jgroup)%ssurfdata%caddvars(jadd) 
     567                     DO jvar = 1, sobsgroups(jgroup)%ssurfdata%nvar 
     568                        sladd%cdlong(jadd,jvar) = sobsgroups(jgroup)%ssurfdata%caddlong(jadd,jvar) 
     569                        sladd%cdunit(jadd,jvar) = sobsgroups(jgroup)%ssurfdata%caddunit(jadd,jvar) 
     570                     END DO 
     571                  END DO 
     572               ENDIF 
     573               slext%inum = sobsgroups(jgroup)%ssurfdata%nextra 
     574               IF ( slext%inum > 0 ) THEN 
     575                  ALLOCATE( slext%ipoint(slext%inum),   & 
     576                     &      slext%cdname(slext%inum),   & 
     577                     &      slext%cdlong(slext%inum,1), & 
     578                     &      slext%cdunit(slext%inum,1) ) 
     579                  DO jext = 1, slext%inum 
     580                     slext%ipoint(jext)   = jext 
     581                     slext%cdname(jext)   = sobsgroups(jgroup)%ssurfdata%cextvars(jext) 
     582                     slext%cdlong(jext,1) = sobsgroups(jgroup)%ssurfdata%cextlong(jext) 
     583                     slext%cdunit(jext,1) = sobsgroups(jgroup)%ssurfdata%cextunit(jext) 
     584                  END DO 
     585               ENDIF 
     586 
     587               CALL obs_wri_surf( sobsgroups(jgroup)%ssurfdata, sobsgroups(jgroup)%cgroupname, sladd, slext ) 
     588 
     589               IF ( sladd%inum > 0 ) THEN 
     590                  DEALLOCATE( sladd%ipoint, sladd%cdname, sladd%cdlong, sladd%cdunit ) 
     591               ENDIF 
     592               IF ( slext%inum > 0 ) THEN 
     593                  DEALLOCATE( slext%ipoint, slext%cdname, slext%cdlong, slext%cdunit ) 
     594               ENDIF 
    506595 
    507596            ENDIF 
     
    510599 
    511600      END DO 
     601 
     602      IF( ln_timing )   CALL timing_stop('dia_obs_wri') 
    512603 
    513604   END SUBROUTINE dia_obs_wri 
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_bias.F90

    r15179 r15180  
    1 MODULE obs_sstbias 
     1MODULE obs_bias 
    22   !!====================================================================== 
    3    !!                       ***  MODULE obs_sstbias  *** 
    4    !! Observation diagnostics: Read the bias for SST data 
     3   !!                       ***  MODULE obs_bias  *** 
     4   !! Observation diagnostics: Read the bias for observation data 
    55   !!====================================================================== 
    66   !!---------------------------------------------------------------------- 
    7    !!   obs_app_sstbias : Driver for reading and applying the SST bias 
     7   !!   obs_app_bias : Driver for reading and applying the bias 
    88   !!---------------------------------------------------------------------- 
    99   !! * Modules used    
    1010   USE par_kind, ONLY : &       ! Precision variables 
    11       & wp, & 
    12       & dp, & 
    13       & sp 
     11      & wp 
    1412   USE par_oce, ONLY : &        ! Domain parameters 
    1513      & jpi, & 
    16       & jpj, & 
    17       & jpim1 
     14      & jpj 
    1815   USE in_out_manager, ONLY : & ! I/O manager 
    1916      & lwp,    & 
     
    2219   USE dom_oce, ONLY : &        ! Domain variables 
    2320      & tmask, & 
    24       & tmask_i, & 
    25       & e1t,   & 
    26       & e2t,   & 
    2721      & gphit, & 
    2822      & glamt 
    29    USE oce, ONLY : &           ! Model variables 
    30       & sshn 
    3123   USE obs_inter_h2d 
    3224   USE obs_utils               ! Various observation tools 
     
    3527   !! * Routine accessibility 
    3628   PRIVATE 
    37    PUBLIC obs_app_sstbias     ! Read the altimeter bias 
     29   PUBLIC obs_app_bias     ! Read the observation bias 
    3830CONTAINS 
    39    SUBROUTINE obs_app_sstbias( sstdata, k2dint, knumtypes, & 
    40                                cl_bias_files ) 
     31   SUBROUTINE obs_app_bias( obsdata, kvar, k2dint, knumtypes, & 
     32                            cl_bias_files, cd_biasname ) 
    4133      !!--------------------------------------------------------------------- 
    4234      !! 
    43       !!                   *** ROUTINE obs_app_sstbias *** 
    44       !! 
    45       !! ** Purpose : Read SST bias data from files and apply correction to 
    46       !!             observations 
     35      !!                   *** ROUTINE obs_app_bias *** 
     36      !! 
     37      !! ** Purpose : Read bias data from files and apply correction to 
     38      !!              observations 
    4739      !! 
    4840      !! ** Method  : 
     
    5446      !! History :  
    5547      !!      ! :  2014-08 (J. While) Bias correction code for SST obs, 
    56       !!      !                      based on obs_rea_altbias 
     48      !!      !                       based on obs_rea_altbias 
     49      !!      ! :  2021-07 (D. Ford)  Renamed obs_app_bias and made generic 
    5750      !!---------------------------------------------------------------------- 
    5851      !! * Modules used 
     
    6154      !! * Arguments 
    6255 
    63       TYPE(obs_surf), INTENT(INOUT) :: sstdata       ! SST data 
     56      TYPE(obs_surf), INTENT(INOUT) :: obsdata       ! Observation data 
     57      INTEGER, INTENT(IN) :: kvar    ! Index of obs type being bias corrected 
    6458      INTEGER, INTENT(IN) :: k2dint 
    6559      INTEGER, INTENT(IN) :: knumtypes !number of bias types to read in 
    6660      CHARACTER(LEN=128), DIMENSION(knumtypes), INTENT(IN) :: & 
    6761                          cl_bias_files !List of files to read 
     62      CHARACTER(LEN=128), INTENT(IN) :: cd_biasname  !Variable name in file 
    6863      !! * Local declarations 
    6964      INTEGER :: jobs         ! Obs loop variable 
    70       INTEGER :: jpisstbias   ! Number of grid point in latitude for the bias 
    71       INTEGER :: jpjsstbias   ! Number of grid point in longitude for the bias 
    7265      INTEGER :: iico         ! Grid point indices 
    7366      INTEGER :: ijco 
    7467      INTEGER :: jt 
    75       INTEGER :: i_nx_id      ! Index to read the NetCDF file 
    76       INTEGER :: i_ny_id      ! 
    77       INTEGER :: i_file_id    ! 
    78       INTEGER :: i_var_id 
    7968      INTEGER, DIMENSION(knumtypes) :: & 
    8069         & ibiastypes             ! Array of the bias types in each file 
    8170      REAL(wp), DIMENSION(jpi,jpj,knumtypes) :: &  
    82          & z_sstbias              ! Array to store the SST bias values 
     71         & z_obsbias              ! Array to store the bias values 
    8372      REAL(wp), DIMENSION(jpi,jpj) :: &  
    84          & z_sstbias_2d           ! Array to store the SST bias values    
     73         & z_obsbias_2d           ! Array to store the bias values    
    8574      REAL(wp), DIMENSION(1) :: & 
    8675         & zext, & 
     
    10594         & igrdi_tmp, & 
    10695         & igrdj_tmp    
    107       INTEGER :: numsstbias 
     96      INTEGER :: numobsbias 
    10897      INTEGER(KIND=NF90_INT) :: ifile_source 
    10998      
     
    113102      INTEGER :: inumtype 
    114103      IF(lwp)WRITE(numout,*)  
    115       IF(lwp)WRITE(numout,*) 'obs_rea_sstbias : ' 
     104      IF(lwp)WRITE(numout,*) 'obs_app_bias : ' 
    116105      IF(lwp)WRITE(numout,*) '----------------- ' 
    117       IF(lwp)WRITE(numout,*) 'Read SST bias ' 
     106      IF(lwp)WRITE(numout,*) 'Read observation bias for ', TRIM(obsdata%cvars(kvar)) 
    118107      ! Open and read the files 
    119       z_sstbias(:,:,:)=0.0_wp 
     108      z_obsbias(:,:,:)=0.0_wp 
    120109      DO jtype = 1, knumtypes 
    121110      
    122          numsstbias=0 
     111         numobsbias=0 
    123112         IF(lwp)WRITE(numout,*) 'Opening ',cl_bias_files(jtype) 
    124          CALL iom_open( cl_bias_files(jtype), numsstbias, ldstop=.FALSE. )        
    125          IF (numsstbias > 0) THEN 
     113         CALL iom_open( cl_bias_files(jtype), numobsbias, ldstop=.FALSE. )        
     114         IF (numobsbias > 0) THEN 
    126115      
    127116            !Read the bias type from the file 
     
    130119            !routines directly - should be upgraded in the future 
    131120            iret=NF90_OPEN(TRIM(cl_bias_files(jtype)), NF90_NOWRITE, incfile) 
    132             iret=NF90_GET_ATT( incfile, NF90_GLOBAL, "SST_source", & 
     121            iret=NF90_GET_ATT( incfile, NF90_GLOBAL, TRIM(obsdata%cvars(kvar))//"_source", & 
    133122                              ifile_source ) 
    134123            ibiastypes(jtype) = ifile_source                  
     
    136125            
    137126            IF ( iret /= 0  ) CALL ctl_stop( & 
    138                'obs_rea_sstbias : Cannot read bias type from file '// & 
     127               'obs_app_bias : Cannot read bias type from file '// & 
    139128               cl_bias_files(jtype) ) 
    140             ! Get the SST bias data 
    141             CALL iom_get( numsstbias, jpdom_data, 'tn', z_sstbias_2d(:,:), 1 ) 
    142             z_sstbias(:,:,jtype) = z_sstbias_2d(:,:)        
     129            ! Get the bias data 
     130            CALL iom_get( numobsbias, jpdom_data, TRIM(cd_biasname), z_obsbias_2d(:,:), 1 ) 
     131            z_obsbias(:,:,jtype) = z_obsbias_2d(:,:)        
    143132            ! Close the file 
    144             CALL iom_close(numsstbias)        
     133            CALL iom_close(numobsbias)        
    145134         ELSE 
    146             CALL ctl_stop('obs_read_sstbias: File '// &  
     135            CALL ctl_stop('obs_app_bias: File '// &  
    147136                           TRIM( cl_bias_files(jtype) )//' Not found') 
    148137         ENDIF 
     
    151140      ! Interpolate the bias already on the model grid at the observation point 
    152141      ALLOCATE( & 
    153          & igrdi(2,2,sstdata%nsurf), & 
    154          & igrdj(2,2,sstdata%nsurf), & 
    155          & zglam(2,2,sstdata%nsurf), & 
    156          & zgphi(2,2,sstdata%nsurf), & 
    157          & zmask(2,2,sstdata%nsurf)  ) 
     142         & igrdi(2,2,obsdata%nsurf), & 
     143         & igrdj(2,2,obsdata%nsurf), & 
     144         & zglam(2,2,obsdata%nsurf), & 
     145         & zgphi(2,2,obsdata%nsurf), & 
     146         & zmask(2,2,obsdata%nsurf)  ) 
    158147        
    159       DO jobs = 1, sstdata%nsurf  
    160          igrdi(1,1,jobs) = sstdata%mi(jobs)-1 
    161          igrdj(1,1,jobs) = sstdata%mj(jobs)-1 
    162          igrdi(1,2,jobs) = sstdata%mi(jobs)-1 
    163          igrdj(1,2,jobs) = sstdata%mj(jobs) 
    164          igrdi(2,1,jobs) = sstdata%mi(jobs) 
    165          igrdj(2,1,jobs) = sstdata%mj(jobs)-1 
    166          igrdi(2,2,jobs) = sstdata%mi(jobs) 
    167          igrdj(2,2,jobs) = sstdata%mj(jobs) 
     148      DO jobs = 1, obsdata%nsurf  
     149         igrdi(1,1,jobs) = obsdata%mi(jobs)-1 
     150         igrdj(1,1,jobs) = obsdata%mj(jobs)-1 
     151         igrdi(1,2,jobs) = obsdata%mi(jobs)-1 
     152         igrdj(1,2,jobs) = obsdata%mj(jobs) 
     153         igrdi(2,1,jobs) = obsdata%mi(jobs) 
     154         igrdj(2,1,jobs) = obsdata%mj(jobs)-1 
     155         igrdi(2,2,jobs) = obsdata%mi(jobs) 
     156         igrdj(2,2,jobs) = obsdata%mj(jobs) 
    168157      END DO 
    169       CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, jpi, jpj, & 
     158      CALL obs_int_comm_2d( 2, 2, obsdata%nsurf, jpi, jpj, & 
    170159         &                  igrdi, igrdj, glamt, zglam ) 
    171       CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, jpi, jpj, & 
     160      CALL obs_int_comm_2d( 2, 2, obsdata%nsurf, jpi, jpj, & 
    172161         &                  igrdi, igrdj, gphit, zgphi ) 
    173       CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, jpi, jpj, & 
     162      CALL obs_int_comm_2d( 2, 2, obsdata%nsurf, jpi, jpj, & 
    174163         &                  igrdi, igrdj, tmask(:,:,1), zmask ) 
    175164      DO jtype = 1, knumtypes 
    176165          
    177166         !Find the number observations of type and allocate tempory arrays 
    178          inumtype = COUNT( sstdata%ntyp(:) == ibiastypes(jtype) ) 
     167         inumtype = COUNT( obsdata%ntyp(:) == ibiastypes(jtype) ) 
    179168         ALLOCATE( & 
    180169            & igrdi_tmp(2,2,inumtype), & 
     
    185174            & zbias( 2,2,inumtype ) ) 
    186175         jt=1 
    187          DO jobs = 1, sstdata%nsurf  
    188             IF ( sstdata%ntyp(jobs) == ibiastypes(jtype) ) THEN 
     176         DO jobs = 1, obsdata%nsurf  
     177            IF ( obsdata%ntyp(jobs) == ibiastypes(jtype) ) THEN 
    189178               igrdi_tmp(:,:,jt) = igrdi(:,:,jobs)  
    190179               igrdj_tmp(:,:,jt) = igrdj(:,:,jobs) 
     
    198187         CALL obs_int_comm_2d( 2, 2, inumtype, jpi, jpj, & 
    199188               &           igrdi_tmp(:,:,:), igrdj_tmp(:,:,:), & 
    200                &           z_sstbias(:,:,jtype), zbias(:,:,:) ) 
     189               &           z_obsbias(:,:,jtype), zbias(:,:,:) ) 
    201190         jt=1 
    202          DO jobs = 1, sstdata%nsurf 
    203             IF ( sstdata%ntyp(jobs) == ibiastypes(jtype) ) THEN 
    204                zlam = sstdata%rlam(jobs) 
    205                zphi = sstdata%rphi(jobs) 
    206                iico = sstdata%mi(jobs) 
    207                ijco = sstdata%mj(jobs)          
     191         DO jobs = 1, obsdata%nsurf 
     192            IF ( obsdata%ntyp(jobs) == ibiastypes(jtype) ) THEN 
     193               zlam = obsdata%rlam(jobs) 
     194               zphi = obsdata%rphi(jobs) 
     195               iico = obsdata%mi(jobs) 
     196               ijco = obsdata%mj(jobs)          
    208197               CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi,         & 
    209198                  &                   zglam_tmp(:,:,jt), & 
     
    211200                  &                   zmask_tmp(:,:,jt), zweig, zobsmask ) 
    212201               CALL obs_int_h2d( 1, 1, zweig, zbias(:,:,jt),  zext ) 
    213                ! adjust sst with bias field 
    214                sstdata%robs(jobs,1) = sstdata%robs(jobs,1) - zext(1) 
     202               ! adjust observations with bias field 
     203               obsdata%robs(jobs,kvar) = obsdata%robs(jobs,kvar) - zext(1) 
    215204               jt=jt+1 
    216205            ENDIF 
     
    235224      IF(lwp) THEN 
    236225         WRITE(numout,*) " " 
    237          WRITE(numout,*) "SST bias correction applied successfully" 
     226         WRITE(numout,*) "Bias correction applied successfully" 
    238227         WRITE(numout,*) "Obs types: ",ibiastypes(:), & 
    239228                              " Have all been bias corrected\n" 
    240229      ENDIF 
    241    END SUBROUTINE obs_app_sstbias 
     230   END SUBROUTINE obs_app_bias 
    242231  
    243 END MODULE obs_sstbias 
     232END MODULE obs_bias 
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_field.F90

    r15144 r15180  
    3737    
    3838   ! Expected names for observation types with special behaviours (not needed for all observation types) 
    39    CHARACTER(LEN=8) :: cobsname_sst    = 'SST'  ! Expected variable name for SST 
    40    CHARACTER(LEN=8) :: cobsname_temp3d = 'POTM' ! Expected variable name for 3D temperature 
    41    CHARACTER(LEN=8) :: cobsname_sal3d  = 'PSAL' ! Expected variable name for 3D salinity 
    4239   CHARACTER(LEN=8) :: cobsname_uvel3d = 'UVEL' ! Expected variable name for 3D zonal currents 
    4340   CHARACTER(LEN=8) :: cobsname_vvel3d = 'VVEL' ! Expected variable name for 3D meridional currents 
     
    4744   TYPE obs_group 
    4845      ! 
    49       CHARACTER(LEN=128)                            :: cgroupname    !: Name of obs group (for stdout) 
     46      CHARACTER(LEN=25)                             :: cgroupname    !: Name of obs group (for stdout) 
    5047      CHARACTER(LEN=8),   DIMENSION(:), ALLOCATABLE :: cobstypes     !: Observation types to read from files 
    5148      CHARACTER(LEN=128), DIMENSION(:), ALLOCATABLE :: cobsfiles     !: Observation file names 
    52       CHARACTER(LEN=128), DIMENSION(:), ALLOCATABLE :: csstbiasfiles !: SST bias input file names 
     49      CHARACTER(LEN=128), DIMENSION(:), ALLOCATABLE :: cobsbiasfiles !: Bias input file names 
     50      CHARACTER(LEN=128)                            :: cbiasvarname  !: Bias variable name in input file 
    5351      CHARACTER(LEN=128)                            :: caltbiasfile  !: Altimeter bias input file name 
    5452      ! 
     
    5755      INTEGER  :: nobstypes          !: Number of observation types 
    5856      INTEGER  :: nobsfiles          !: Number of observation files 
    59       INTEGER  :: nextvars           !: Number of extra variables to get 
    60       INTEGER  :: nsstbiasfiles      !: Number of SST bias files 
     57      INTEGER  :: nobsbiasfiles      !: Number of bias files 
     58      INTEGER  :: nbiasvar           !: Index of observation type to be bias corrected 
    6159      INTEGER  :: navtypes           !: Number of profile data types representing a daily average 
     60      INTEGER  :: nextvars           !: Number of extra variables in addition to any in input files 
     61      INTEGER  :: naddvars           !: Number of additional variables in addition to any in input files 
    6262      INTEGER  :: n1dint             !: Type of vertical interpolation method 
    6363      INTEGER  :: n2dint             !: Type of horizontal interpolation method 
     
    6767      LOGICAL  :: lsurf              !: Logical switch for surface data 
    6868      LOGICAL  :: lprof              !: Logical switch for profile data 
    69       LOGICAL  :: lsst               !: Logical switch for SST data 
    70       LOGICAL  :: ltemp3d            !: Logical switch for 3D temperature data 
    71       LOGICAL  :: lsal3d             !: Logical switch for 3D salinity data 
    7269      LOGICAL  :: lvel3d             !: Logical switch for 3D velocity data 
    7370      LOGICAL  :: lsla               !: Logical switch for SLA data 
    7471      LOGICAL  :: laltbias           !: Logical switch for altimeter bias correction 
    75       LOGICAL  :: lsstbias           !: Logical switch for SST bias correction 
     72      LOGICAL  :: lobsbias           !: Logical switch for bias correction 
    7673      LOGICAL  :: lnea               !: Logical switch for rejecting observations near land 
    7774      LOGICAL  :: lbound_reject      !: Logical switch for rejecting obs near the boundary 
    7875      LOGICAL  :: lignmis            !: Logical switch for ignoring missing files 
    79       LOGICAL  :: ls_at_t            !: Logical switch for computing model S at T obs if not there 
     76      LOGICAL  :: lall_at_all        !: Logical switch for computing all model variables at all obs points 
    8077      LOGICAL  :: lnight             !: Logical switch for calculating night-time average 
    81       LOGICAL  :: loutput_clim       !: Logical switch for writing climatological values to fdbk files 
    82       LOGICAL  :: ltime_mean_sla_bkg !: Logical switch for applying time mean of SLA background to remove tidal signal 
    8378      LOGICAL  :: lfp_indegs         !: Logical: T=> averaging footprint is in degrees, F=> in metres 
    8479      ! 
     
    118113      ALLOCATE( sdobsgroup%cobstypes    (sdobsgroup%nobstypes            ), & 
    119114         &      sdobsgroup%cobsfiles    (sdobsgroup%nobsfiles            ), & 
    120          &      sdobsgroup%csstbiasfiles(sdobsgroup%nsstbiasfiles        ), & 
     115         &      sdobsgroup%cobsbiasfiles(sdobsgroup%nobsbiasfiles        ), & 
    121116         &      sdobsgroup%nprofdavtypes(sdobsgroup%navtypes             ), & 
    122117         &      sdobsgroup%rglam        (jpi,jpj,    sdobsgroup%nobstypes), & 
     
    144139      DEALLOCATE( sdobsgroup%cobstypes,     & 
    145140         &        sdobsgroup%cobsfiles,     & 
    146          &        sdobsgroup%csstbiasfiles, & 
     141         &        sdobsgroup%cobsbiasfiles, & 
    147142         &        sdobsgroup%nprofdavtypes, & 
    148143         &        sdobsgroup%rglam,         & 
     
    174169      CHARACTER(LEN=8),   DIMENSION(jpmaxntypes) :: cn_obstypes 
    175170      CHARACTER(LEN=128), DIMENSION(jpmaxnfiles) :: cn_obsfiles 
    176       CHARACTER(LEN=128), DIMENSION(jpmaxnfiles) :: cn_sstbiasfiles 
     171      CHARACTER(LEN=128), DIMENSION(jpmaxnfiles) :: cn_obsbiasfiles 
     172      CHARACTER(LEN=128)                         :: cn_type_to_biascorrect 
     173      CHARACTER(LEN=128)                         :: cn_obsbiasfile_varname 
    177174      CHARACTER(LEN=128)                         :: cn_altbiasfile 
    178175      INTEGER,            DIMENSION(imaxavtypes) :: nn_profdavtypes 
     
    184181      LOGICAL                                    :: ln_prof 
    185182      LOGICAL                                    :: ln_altbias 
    186       LOGICAL                                    :: ln_sstbias 
     183      LOGICAL                                    :: ln_obsbias 
    187184      LOGICAL                                    :: ln_nea 
    188185      LOGICAL                                    :: ln_bound_reject 
    189186      LOGICAL                                    :: ln_ignmis 
    190       LOGICAL                                    :: ln_s_at_t 
     187      LOGICAL                                    :: ln_all_at_all 
    191188      LOGICAL                                    :: ln_night 
    192       LOGICAL                                    :: ln_output_clim 
    193       LOGICAL                                    :: ln_time_mean_sla_bkg 
    194189      LOGICAL                                    :: ln_fp_indegs 
    195190      REAL(wp)                                   :: rn_avglamscl 
     
    201196         &                cn_obsfiles, cn_obstypes, ln_nea, ln_bound_reject,    & 
    202197         &                ln_ignmis, nn_2dint, nn_1dint, nn_profdavtypes,       & 
    203          &                ln_fp_indegs, rn_avglamscl, rn_avgphiscl, ln_sstbias, & 
    204          &                cn_sstbiasfiles, ln_night, ln_altbias,                & 
     198         &                ln_fp_indegs, rn_avglamscl, rn_avgphiscl, ln_obsbias, & 
     199         &                cn_obsbiasfiles, cn_type_to_biascorrect,              & 
     200         &                cn_obsbiasfile_varname, ln_night, ln_altbias,         & 
    205201         &                cn_altbiasfile, nn_msshc, rn_mdtcorr, rn_mdtcutoff,   & 
    206          &                ln_time_mean_sla_bkg, ln_s_at_t, ln_output_clim 
     202         &                ln_all_at_all 
    207203      !!---------------------------------------------------------------------- 
    208204 
    209205      cn_obstypes(:)     = '' 
    210206      cn_obsfiles(:)     = '' 
    211       cn_sstbiasfiles(:) = '' 
     207      cn_obsbiasfiles(:) = '' 
    212208      nn_profdavtypes(:) = -1 
    213209 
     
    229225         sdobsgroup%nobstypes     = 0 
    230226         sdobsgroup%nobsfiles     = 0 
     227         sdobsgroup%naddvars      = 0 
    231228         sdobsgroup%nextvars      = 0 
    232229         sdobsgroup%navtypes      = 0 
    233          sdobsgroup%nsstbiasfiles = 0 
    234          sdobsgroup%lsst          = .false. 
    235          sdobsgroup%ltemp3d       = .false. 
    236          sdobsgroup%lsal3d        = .false. 
     230         sdobsgroup%nobsbiasfiles = 0 
    237231         sdobsgroup%lvel3d        = .false. 
    238232         sdobsgroup%lsla          = .false. 
     
    254248         END DO 
    255249         DO jfile = 1, jpmaxnfiles 
    256             IF ( TRIM(cn_sstbiasfiles(jfile)) /= '' ) THEN 
    257                sdobsgroup%nsstbiasfiles = sdobsgroup%nsstbiasfiles + 1 
     250            IF ( TRIM(cn_obsbiasfiles(jfile)) /= '' ) THEN 
     251               sdobsgroup%nobsbiasfiles = sdobsgroup%nobsbiasfiles + 1 
    258252            ENDIF 
    259253         END DO 
     
    266260               itype = itype + 1 
    267261               sdobsgroup%cobstypes(itype) = TRIM(cn_obstypes(jtype)) 
    268                IF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_sst ) THEN 
    269                   sdobsgroup%lsst = .true. 
    270                ELSEIF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_temp3d ) THEN 
    271                   sdobsgroup%ltemp3d = .true. 
    272                   sdobsgroup%nextvars = sdobsgroup%nextvars + 1 
    273                ELSEIF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_sal3d ) THEN 
    274                   sdobsgroup%lsal3d = .true. 
    275                ELSEIF ( (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_uvel3d) .OR. & 
    276                   &     (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_vvel3d) ) THEN 
     262               IF ( (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_uvel3d) .OR. & 
     263                  & (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_vvel3d) ) THEN 
    277264                  sdobsgroup%lvel3d = .true. 
    278                   sdobsgroup%nextvars = sdobsgroup%nextvars + 1 
    279265               ELSEIF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_sla ) THEN 
    280266                  sdobsgroup%lsla = .true. 
    281                   sdobsgroup%nextvars = sdobsgroup%nextvars + 2 
     267! THESE WILL EACH NEED TO BE 1 (ADD=SSH, EXT=MDT) 
     268                  sdobsgroup%naddvars = 0 
     269                  sdobsgroup%nextvars = 0 
     270! DO THIS FOR FBD TOO 
    282271               ENDIF 
    283272               ! 
     
    313302         ifile = 0 
    314303         DO jfile = 1, jpmaxnfiles 
    315             IF ( TRIM(cn_sstbiasfiles(jfile)) /= '' ) THEN 
     304            IF ( TRIM(cn_obsbiasfiles(jfile)) /= '' ) THEN 
    316305               ifile = ifile + 1 
    317                sdobsgroup%csstbiasfiles(ifile) = cn_sstbiasfiles(jfile) 
    318             ENDIF 
    319          END DO 
     306               sdobsgroup%cobsbiasfiles(ifile) = cn_obsbiasfiles(jfile) 
     307            ENDIF 
     308         END DO 
     309         IF ( ln_obsbias ) THEN 
     310            sdobsgroup%nbiasvar = -1 
     311            DO jtype = 1, sdobsgroup%nobstypes 
     312               IF ( TRIM(sdobsgroup%cobstypes(itype)) == TRIM(cn_type_to_biascorrect) ) THEN 
     313                  sdobsgroup%nbiasvar = jtype 
     314                  EXIT 
     315               ENDIF 
     316            ENDDO 
     317         ENDIF 
    320318 
    321319         sdobsgroup%caltbiasfile       = cn_altbiasfile 
     
    326324         sdobsgroup%lprof              = ln_prof 
    327325         sdobsgroup%laltbias           = ln_altbias 
    328          sdobsgroup%lsstbias           = ln_sstbias 
     326         sdobsgroup%lobsbias           = ln_obsbias 
     327         sdobsgroup%cbiasvarname       = cn_obsbiasfile_varname 
    329328         sdobsgroup%lnea               = ln_nea 
    330329         sdobsgroup%lbound_reject      = ln_bound_reject 
    331330         sdobsgroup%lignmis            = ln_ignmis 
    332          sdobsgroup%ls_at_t            = ln_s_at_t 
     331         sdobsgroup%lall_at_all        = ln_all_at_all 
    333332         sdobsgroup%lnight             = ln_night 
    334          sdobsgroup%loutput_clim       = ln_output_clim 
    335          sdobsgroup%ltime_mean_sla_bkg = ln_time_mean_sla_bkg 
    336333         sdobsgroup%lfp_indegs         = ln_fp_indegs 
    337334         sdobsgroup%ravglamscl         = rn_avglamscl 
     
    395392            WRITE(numout,*) '             N/S diameter of obs footprint                      rn_avgphiscl = ', sdobsgroup%ravgphiscl 
    396393            WRITE(numout,*) '             Logical switch for night-time average                  ln_night = ', sdobsgroup%lnight 
     394            WRITE(numout,*) '             Logical switch for bias correction                   ln_obsbias = ', sdobsgroup%lobsbias 
     395            IF ( sdobsgroup%lobsbias ) THEN 
     396               WRITE(numout,*) '             Observation type to be bias corrected    cn_type_to_biascorrect = ', TRIM(sdobsgroup%cobstypes(sdobsgroup%nbiasvar)) 
     397               WRITE(numout,*) '             Bias variable name in bias files         cn_obsbiasfile_varname = ', TRIM(sdobsgroup%cbiasvarname) 
     398               WRITE(numout,*) '             Bias files in group:', sdobsgroup%nobsbiasfiles 
     399               DO jfile = 1, sdobsgroup%nobsbiasfiles 
     400                  WRITE(numout,*) '                ', TRIM(sdobsgroup%cobsbiasfiles(jfile)) 
     401               END DO 
     402            ENDIF 
    397403            WRITE(numout,*) '          Settings only for profile data, which is ', sdobsgroup%lprof 
    398404            WRITE(numout,*) '             Type of vertical interpolation method                  nn_1dint = ', sdobsgroup%n1dint 
    399405            WRITE(numout,*) '             Daily average types                             nn_profdavtypes = ', sdobsgroup%nprofdavtypes 
    400             WRITE(numout,*) '          Settings only for SST data, which is ', sdobsgroup%lsst 
    401             WRITE(numout,*) '             Logical switch for sst bias                          ln_sstbias = ', sdobsgroup%lsstbias 
    402             IF ( sdobsgroup%lsstbias ) THEN 
    403                WRITE(numout,*) '             SST bias files in group:' 
    404                DO jfile = 1, sdobsgroup%nsstbiasfiles 
    405                   WRITE(numout,*) '                ', TRIM(sdobsgroup%csstbiasfiles(jfile)) 
    406                END DO 
    407             ENDIF 
     406            WRITE(numout,*) '             Logical switch to compute all vars at all pts     ln_all_at_all = ', sdobsgroup%lall_at_all 
    408407            WRITE(numout,*) '          Settings only for SLA data, which is ', sdobsgroup%lsla 
    409408            WRITE(numout,*) '             Logical switch for alt bias                          ln_altbias = ', sdobsgroup%laltbias 
    410409            WRITE(numout,*) '             Alt bias file name                               cn_altbiasfile = ', TRIM(sdobsgroup%caltbiasfile) 
    411             WRITE(numout,*) '             Logical switch for time-mean of SLA        ln_time_mean_sla_bkg = ', sdobsgroup%ltime_mean_sla_bkg 
    412410            WRITE(numout,*) '             MSSH correction scheme                                 nn_msshc = ', sdobsgroup%nmsshc 
    413411            WRITE(numout,*) '             MDT  correction                                      rn_mdtcorr = ', sdobsgroup%rmdtcorr 
    414412            WRITE(numout,*) '             MDT cutoff for computed correction                 rn_mdtcutoff = ', sdobsgroup%rmdtcutoff 
    415             WRITE(numout,*) '          Settings only for 3D temperature/salinity data, temperature is ', sdobsgroup%ltemp3d 
    416             WRITE(numout,*) '                                                             salinity is ', sdobsgroup%lsal3d 
    417             WRITE(numout,*) '             Logical switch to compute model S at T obs            ln_s_at_t = ', sdobsgroup%ls_at_t 
    418             WRITE(numout,*) '             Logical switch for writing climat. at obs points ln_output_clim = ', sdobsgroup%loutput_clim 
    419413         ENDIF 
    420414 
     
    432426         ENDIF 
    433427 
    434          IF ( (sdobsgroup%lsst) .AND. (sdobsgroup%lsstbias) .AND. (sdobsgroup%nsstbiasfiles == 0) ) THEN 
    435             CALL ctl_stop( ' No SST bias files specified for this observation group' ) 
     428         IF ( (sdobsgroup%lobsbias) .AND. (sdobsgroup%nobsbiasfiles == 0) ) THEN 
     429            CALL ctl_stop( ' No bias files specified for this observation group' ) 
    436430         ENDIF 
    437431 
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_oper.F90

    r15144 r15180  
    103103      INTEGER       , INTENT(in   ) ::   k2dint          ! Horizontal interpolation type (see header) 
    104104      INTEGER       , INTENT(in   ) ::   kdaystp         ! Number of time steps per day 
    105       INTEGER       , INTENT(in   ) ::   kvar            ! Number of variables in prodatqc 
     105      INTEGER       , INTENT(in   ) ::   kvar            ! Index of variable in prodatqc 
    106106      REAL(KIND=wp) , INTENT(in   ), DIMENSION(kpi,kpj,kpk) ::   pvar             ! Model field 
    107107      REAL(KIND=wp) , INTENT(in   ), DIMENSION(kpi,kpj,kpk) ::   pmask            ! Land-sea mask 
     
    450450   END SUBROUTINE obs_prof_opt 
    451451 
    452    SUBROUTINE obs_surf_opt( surfdataqc, kt, kpi, kpj,            & 
    453       &                     kit000, kdaystp, psurf, psurfmask,  & 
    454       &                     k2dint, ldnightav, plamscl, pphiscl, & 
     452   SUBROUTINE obs_surf_opt( surfdataqc, kt, kpi, kpj,                & 
     453      &                     kit000, kvar, kdaystp, psurf, psurfmask, & 
     454      &                     k2dint, ldnightav, plamscl, pphiscl,     & 
    455455      &                     lindegrees ) 
    456456 
     
    499499                                       !   (kit000-1 = restart time) 
    500500      INTEGER, INTENT(IN) :: kdaystp   ! Number of time steps per day 
     501      INTEGER, INTENT(IN) :: kvar      ! Index of variable in surfdataqc   
    501502      INTEGER, INTENT(IN) :: k2dint    ! Horizontal interpolation type (see header) 
    502503      REAL(wp), INTENT(IN), DIMENSION(kpi,kpj) :: & 
     
    563564      IF ( ldnightav ) THEN 
    564565 
    565       ! Initialize array for night mean 
     566         ! Initialize array for night mean 
    566567         IF ( kt == 0 ) THEN 
    567568            ALLOCATE ( icount_night(kpi,kpj) ) 
     
    581582            DO jj = 1, jpj 
    582583               DO ji = 1, jpi 
    583                   surfdataqc%vdmean(ji,jj) = 0.0 
     584                  surfdataqc%vdmean(ji,jj,:) = 0.0 
    584585                  zmeanday(ji,jj) = 0.0 
    585586                  icount_night(ji,jj) = 0 
     
    594595         DO jj = 1, jpj 
    595596            DO ji = 1, jpi 
    596                ! Increment the temperature field for computing night mean and counter 
    597                surfdataqc%vdmean(ji,jj) = surfdataqc%vdmean(ji,jj)  & 
    598                       &                    + psurf(ji,jj) * REAL( imask_night(ji,jj) ) 
     597               ! Increment the model field for computing night mean and counter 
     598               surfdataqc%vdmean(ji,jj,kvar) = surfdataqc%vdmean(ji,jj,kvar)  & 
     599                      &                        + psurf(ji,jj) * REAL( imask_night(ji,jj) ) 
    599600               zmeanday(ji,jj)          = zmeanday(ji,jj) + psurf(ji,jj) 
    600601               icount_night(ji,jj)      = icount_night(ji,jj) + imask_night(ji,jj) 
     
    610611                  ! Test if "no night" point 
    611612                  IF ( icount_night(ji,jj) > 0 ) THEN 
    612                      surfdataqc%vdmean(ji,jj) = surfdataqc%vdmean(ji,jj) & 
    613                        &                        / REAL( icount_night(ji,jj) ) 
     613                     surfdataqc%vdmean(ji,jj,kvar) = surfdataqc%vdmean(ji,jj,kvar) & 
     614                       &                             / REAL( icount_night(ji,jj) ) 
    614615                  ELSE 
    615616                     !At locations where there is no night (e.g. poles), 
    616617                     ! calculate daily mean instead of night-time mean. 
    617                      surfdataqc%vdmean(ji,jj) = zmeanday(ji,jj) * zdaystp 
     618                     surfdataqc%vdmean(ji,jj,kvar) = zmeanday(ji,jj) * zdaystp 
    618619                  ENDIF 
    619620               END DO 
     
    689690 
    690691         CALL obs_int_comm_2d( imaxifp,imaxjfp, isurf, kpi, kpj, igrdi, igrdj, & 
    691             &               surfdataqc%vdmean(:,:), zsurfm ) 
     692            &               surfdataqc%vdmean(:,:,kvar), zsurfm ) 
    692693 
    693694      ENDIF 
     
    750751 
    751752         ENDIF 
    752  
     753! WHERE BEST TO DO THIS? 
    753754         IF ( TRIM(surfdataqc%cvars(1)) == 'SLA' .AND. surfdataqc%nextra == 2 ) THEN 
    754755            ! ... Remove the MDT from the SSH at the observation point to get the SLA 
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_prep.F90

    r15089 r15180  
    4242CONTAINS 
    4343 
    44    SUBROUTINE obs_pre_surf( surfdata, surfdataqc, ld_nea, ld_bound_reject, & 
    45                             kqc_cutoff ) 
    46       !!---------------------------------------------------------------------- 
    47       !!                    ***  ROUTINE obs_pre_sla  *** 
     44   SUBROUTINE obs_pre_surf( surfdata, surfdataqc, & 
     45      &                     kpi, kpj, &    
     46      &                     zmask, pglam, pgphi, & 
     47      &                     ld_nea, ld_bound_reject, & 
     48      &                     kqc_cutoff ) 
     49      !!---------------------------------------------------------------------- 
     50      !!                    ***  ROUTINE obs_pre_surf  *** 
    4851      !! 
    4952      !! ** Purpose : First level check and screening of surface observations 
     
    6568      !! * Arguments 
    6669      TYPE(obs_surf), INTENT(INOUT) :: surfdata    ! Full set of surface data 
    67       TYPE(obs_surf), INTENT(INOUT) :: surfdataqc   ! Subset of surface data not failing screening 
    68       LOGICAL, INTENT(IN) :: ld_nea         ! Switch for rejecting observation near land 
     70      TYPE(obs_surf), INTENT(INOUT) :: surfdataqc  ! Subset of surface data not failing screening 
     71      INTEGER, INTENT(IN) :: kpi, kpj              ! Local domain sizes       
     72      REAL(wp), INTENT(IN), DIMENSION(kpi,kpj,surfdata%nvar) :: & 
     73         & zmask       
     74      REAL(wp), INTENT(IN), DIMENSION(kpi,kpj,surfdata%nvar) :: & 
     75         & pglam, & 
     76         & pgphi 
     77      LOGICAL, INTENT(IN) :: ld_nea                ! Switch for rejecting observation near land 
    6978      LOGICAL, INTENT(IN) :: ld_bound_reject       ! Switch for rejecting obs near the boundary 
    70       INTEGER, INTENT(IN), OPTIONAL :: kqc_cutoff   ! cut off for QC value 
     79      INTEGER, INTENT(IN), OPTIONAL :: kqc_cutoff  ! cut off for QC value 
    7180      !! * Local declarations 
    7281      INTEGER :: iqc_cutoff = 255   ! cut off for QC value 
     
    7786      INTEGER :: imin0 
    7887      INTEGER :: icycle       ! Current assimilation cycle 
    79                               ! Counters for observations that 
    80       INTEGER :: iotdobs      !  - outside time domain 
    81       INTEGER :: iosdsobs     !  - outside space domain 
    82       INTEGER :: ilansobs     !  - within a model land cell 
    83       INTEGER :: inlasobs     !  - close to land 
    84       INTEGER :: igrdobs      !  - fail the grid search 
    85       INTEGER :: ibdysobs     !  - close to open boundary 
    86                               ! Global counters for observations that 
    87       INTEGER :: iotdobsmpp     !  - outside time domain 
    88       INTEGER :: iosdsobsmpp    !  - outside space domain 
    89       INTEGER :: ilansobsmpp    !  - within a model land cell 
    90       INTEGER :: inlasobsmpp    !  - close to land 
    91       INTEGER :: igrdobsmpp     !  - fail the grid search 
    92       INTEGER :: ibdysobsmpp  !  - close to open boundary 
     88                                                        ! Counters for observations that are 
     89      INTEGER                           :: iotdobs      !  - outside time domain 
     90      INTEGER, DIMENSION(surfdata%nvar) :: iosdsobs     !  - outside space domain 
     91      INTEGER, DIMENSION(surfdata%nvar) :: ilansobs     !  - within a model land cell 
     92      INTEGER, DIMENSION(surfdata%nvar) :: inlasobs     !  - close to land 
     93      INTEGER, DIMENSION(surfdata%nvar) :: ibdysobs     !  - close to open boundary 
     94      INTEGER                           :: igrdobs      !  - fail the grid search       
     95                                                        ! Global counters for observations that 
     96      INTEGER                           :: iotdobsmpp   !  - outside time domain 
     97      INTEGER, DIMENSION(surfdata%nvar) :: iosdsobsmpp  !  - outside space domain 
     98      INTEGER, DIMENSION(surfdata%nvar) :: ilansobsmpp  !  - within a model land cell 
     99      INTEGER, DIMENSION(surfdata%nvar) :: inlasobsmpp  !  - close to land 
     100      INTEGER, DIMENSION(surfdata%nvar) :: ibdysobsmpp  !  - close to open boundary 
     101      INTEGER                           :: igrdobsmpp   !  - fail the grid search 
     102 
    93103      LOGICAL, DIMENSION(:), ALLOCATABLE :: &  
    94104         & llvalid            ! SLA data selection 
    95       INTEGER :: jobs         ! Obs. loop variable 
     105      INTEGER :: jobs         ! Obs. loop counter 
     106      INTEGER :: jvar         ! Variable loop counter 
    96107      INTEGER :: jstp         ! Time loop variable 
    97108      INTEGER :: inrc         ! Time index variable 
     109      CHARACTER(LEN=256) :: cout1  ! Diagnostic output line 
    98110      !!---------------------------------------------------------------------- 
    99111 
     
    110122      icycle = nn_no     ! Assimilation cycle 
    111123 
    112       ! Diagnotics counters for various failures. 
     124      ! Diagnostic counters for various failures. 
    113125 
    114126      iotdobs  = 0 
    115127      igrdobs  = 0 
    116       iosdsobs = 0 
    117       ilansobs = 0 
    118       inlasobs = 0 
    119       ibdysobs = 0  
     128      iosdsobs(:) = 0 
     129      ilansobs(:) = 0 
     130      inlasobs(:) = 0 
     131      ibdysobs(:) = 0  
    120132 
    121133      ! Set QC cutoff to optional value if provided 
     
    147159      ! ----------------------------------------------------------------------- 
    148160 
    149       CALL obs_coo_spc_2d( surfdata%nsurf,              & 
    150          &                 jpi,          jpj,          & 
    151          &                 surfdata%mi,   surfdata%mj,   &  
    152          &                 surfdata%rlam, surfdata%rphi, & 
    153          &                 glamt,        gphit,        & 
    154          &                 tmask(:,:,1), surfdata%nqc,  & 
    155          &                 iosdsobs,     ilansobs,     & 
    156          &                 inlasobs,     ld_nea,       & 
    157          &                 ibdysobs,     ld_bound_reject, & 
    158          &                 iqc_cutoff                     ) 
    159  
    160       CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 
    161       CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 
    162       CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 
    163       CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 
     161      DO jvar = 1, surfdata%nvar 
     162         CALL obs_coo_spc_2d( surfdata%nsurf,                   & 
     163            &                 jpi,             jpj,             & 
     164            &                 surfdata%mi,     surfdata%mj,     &  
     165            &                 surfdata%rlam,   surfdata%rphi,   & 
     166            &                 pglam(:,:,jvar), pgphi(:,:,jvar), & 
     167            &                 zmask(:,:,jvar), surfdata%nqc,    & 
     168            &                 iosdsobs(jvar),  ilansobs(jvar),  & 
     169            &                 inlasobs(jvar),  ld_nea,          & 
     170            &                 ibdysobs(jvar),  ld_bound_reject, & 
     171            &                 iqc_cutoff                     ) 
     172         CALL obs_mpp_sum_integer( iosdsobs(jvar), iosdsobsmpp(jvar) ) 
     173         CALL obs_mpp_sum_integer( ilansobs(jvar), ilansobsmpp(jvar) ) 
     174         CALL obs_mpp_sum_integer( inlasobs(jvar), inlasobsmpp(jvar) ) 
     175         CALL obs_mpp_sum_integer( ibdysobs(jvar), ibdysobsmpp(jvar) ) 
     176      END DO 
    164177 
    165178      ! ----------------------------------------------------------------------- 
     
    191204       
    192205      IF(lwp) THEN 
     206         DO jvar = 1, surfdataqc%nvar        
     207            IF ( jvar == 1 ) THEN 
     208               cout1=TRIM(surfdataqc%cvars(1))                   
     209            ELSE 
     210               WRITE(cout1,'(A,A1,A)') TRIM(cout1), '/', TRIM(surfdataqc%cvars(jvar))             
     211            ENDIF 
     212         END DO 
     213                
    193214         WRITE(numout,*) 
    194          WRITE(numout,*) ' '//surfdataqc%cvars(1)//' data outside time domain                  = ', & 
     215         WRITE(numout,*) ' '//TRIM(cout1)//' data outside time domain                  = ', & 
    195216            &            iotdobsmpp 
    196          WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data that failed grid search    = ', & 
     217         WRITE(numout,*) ' Remaining '//TRIM(cout1)//' data that failed grid search    = ', & 
    197218            &            igrdobsmpp 
    198          WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data outside space domain       = ', & 
    199             &            iosdsobsmpp 
    200          WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data at land points             = ', & 
    201             &            ilansobsmpp 
    202          IF (ld_nea) THEN 
    203             WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data near land points (removed) = ', & 
    204                &            inlasobsmpp 
    205          ELSE 
    206             WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data near land points (kept)    = ', & 
    207                &            inlasobsmpp 
    208          ENDIF 
    209          WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data near open boundary (removed) = ', & 
    210             &            ibdysobsmpp   
    211          WRITE(numout,*) ' '//surfdataqc%cvars(1)//' data accepted                             = ', & 
    212             &            surfdataqc%nsurfmpp 
     219 
     220         DO jvar = 1, surfdataqc%nvar             
     221            WRITE(numout,*) ' Remaining '//surfdataqc%cvars(jvar)//' data outside space domain       = ', & 
     222                &            iosdsobsmpp(jvar) 
     223             WRITE(numout,*) ' Remaining '//surfdataqc%cvars(jvar)//' data at land points             = ', & 
     224                &            ilansobsmpp(jvar) 
     225             IF (ld_nea) THEN 
     226                WRITE(numout,*) ' Remaining '//surfdataqc%cvars(jvar)//' data near land points (removed) = ', & 
     227                   &            inlasobsmpp(jvar) 
     228             ELSE 
     229                WRITE(numout,*) ' Remaining '//surfdataqc%cvars(jvar)//' data near land points (kept)    = ', & 
     230                   &            inlasobsmpp(jvar) 
     231             ENDIF      
     232             WRITE(numout,*) ' Remaining '//surfdataqc%cvars(jvar)//' data near open boundary (removed) = ', & 
     233                &            ibdysobsmpp(jvar) 
     234          END DO 
     235          WRITE(numout,*) ' '//TRIM(cout1)//' data accepted                             = ', & 
     236             &            surfdataqc%nsurfmpp 
    213237 
    214238         WRITE(numout,*) 
    215239         WRITE(numout,*) ' Number of observations per time step :' 
    216240         WRITE(numout,*) 
    217          WRITE(numout,'(10X,A,10X,A)')'Time step',surfdataqc%cvars(1) 
     241         WRITE(numout,'(10X,A,10X,A)')'Time step',TRIM(cout1) 
    218242         WRITE(numout,'(10X,A,5X,A)')'---------','-----------------' 
    219243         CALL FLUSH(numout) 
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_profiles_def.F90

    r14075 r15180  
    7575 
    7676      REAL(KIND=wp), POINTER, DIMENSION(:,:) :: & 
    77          & vext           !: Extra variables 
     77         & vadd           !: Additional variables 
    7878 
    7979      INTEGER, POINTER, DIMENSION(:) :: & 
     
    9494 
    9595      INTEGER :: nvar     !: Number of variables 
    96       INTEGER :: next     !: Number of extra fields 
     96      INTEGER :: next     !: Number of extra variables 
     97      INTEGER :: nadd     !: Number of additional variables 
    9798      INTEGER :: nprof    !: Total number of profiles within window. 
    9899      INTEGER :: nstp     !: Number of time steps 
     
    104105      ! Bookkeeping arrays with sizes equal to number of variables 
    105106 
    106       CHARACTER(len=8), POINTER, DIMENSION(:) :: & 
    107          & cvars          !: Variable names 
     107      CHARACTER(len=ilenname), POINTER, DIMENSION(:) :: & 
     108         & cvars,    &    !: Variable names 
     109         & cextvars, &    !: Extra variable names 
     110         & caddvars       !: Additional variable names 
     111 
     112      CHARACTER(len=ilenlong), POINTER, DIMENSION(:) :: & 
     113         & clong,    &    !: Variable long names 
     114         & cextlong       !: Extra variable long names 
     115 
     116      CHARACTER(len=ilenlong), POINTER, DIMENSION(:,:) :: & 
     117         & caddlong       !: Additional variable long names 
     118 
     119      CHARACTER(len=ilenunit), POINTER, DIMENSION(:) :: & 
     120         & cunit,    &    !: Variable units 
     121         & cextunit       !: Extra variable units 
     122 
     123      CHARACTER(len=ilenunit), POINTER, DIMENSION(:,:) :: & 
     124         & caddunit       !: Additional variable units 
     125 
     126      CHARACTER(len=ilengrid), POINTER, DIMENSION(:) :: & 
     127         & cgrid          !: Variable grids 
    108128 
    109129      INTEGER, POINTER, DIMENSION(:) :: & 
     
    131151         & rphi           !: Latitude coordinate of profile data 
    132152 
    133       CHARACTER(LEN=8), POINTER, DIMENSION(:) :: & 
     153      CHARACTER(LEN=ilenwmo), POINTER, DIMENSION(:) :: & 
    134154         & cwmo           !: Profile WMO indentifier 
    135155       
     
    160180      TYPE(obs_prof_var), POINTER, DIMENSION(:) :: var 
    161181 
     182      REAL(KIND=wp), POINTER, DIMENSION(:,:) :: & 
     183         & vext        !: Extra variables 
     184 
    162185      ! Arrays with size equal to the number of time steps in the window 
    163186 
     
    197220CONTAINS 
    198221    
    199    SUBROUTINE obs_prof_alloc( prof,  kvar, kext, kprof,  & 
     222   SUBROUTINE obs_prof_alloc( prof,  kvar, kadd, kext, kprof,  & 
    200223      &                       ko3dt, kstp, kpi, kpj, kpk ) 
    201224      !!---------------------------------------------------------------------- 
     
    214237      INTEGER, INTENT(IN) :: kprof  ! Number of profiles 
    215238      INTEGER, INTENT(IN) :: kvar   ! Number of variables 
    216       INTEGER, INTENT(IN) :: kext   ! Number of extra fields within each variable 
     239      INTEGER, INTENT(IN) :: kadd   ! Number of additional fields within each variable 
     240      INTEGER, INTENT(IN) :: kext   ! Number of extra fields 
    217241      INTEGER, INTENT(IN), DIMENSION(kvar) :: & 
    218242         & ko3dt     ! Number of observations per variables 
     
    223247 
    224248      !!* Local variables 
    225       INTEGER :: jvar 
     249      INTEGER :: jvar, jadd, jext 
    226250      INTEGER :: ji 
    227251 
     
    229253 
    230254      prof%nvar      = kvar 
     255      prof%nadd      = kadd 
    231256      prof%next      = kext 
    232257      prof%nprof     = kprof 
     
    241266      ALLOCATE( & 
    242267         & prof%cvars(kvar),    & 
     268         & prof%clong(kvar),    & 
     269         & prof%cunit(kvar),    & 
     270         & prof%cgrid(kvar),    & 
    243271         & prof%nvprot(kvar),   & 
    244272         & prof%nvprotmpp(kvar) & 
     
    247275      DO jvar = 1, kvar 
    248276         prof%cvars    (jvar) = "NotSet" 
     277         prof%clong    (jvar) = "NotSet" 
     278         prof%cunit    (jvar) = "NotSet" 
     279         prof%cgrid    (jvar) = "" 
    249280         prof%nvprot   (jvar) = ko3dt(jvar) 
    250281         prof%nvprotmpp(jvar) = 0 
     282      END DO 
     283 
     284      ! Allocate additional/extra variable metadata 
     285 
     286      ALLOCATE( & 
     287         & prof%caddvars(kadd),      & 
     288         & prof%caddlong(kadd,kvar), & 
     289         & prof%caddunit(kadd,kvar), & 
     290         & prof%cextvars(kext),      & 
     291         & prof%cextlong(kext),      & 
     292         & prof%cextunit(kext)       & 
     293         ) 
     294          
     295      DO jadd = 1, kadd 
     296         prof%caddvars(jadd) = "NotSet" 
     297         DO jvar = 1, kvar 
     298            prof%caddlong(jadd,jvar) = "NotSet" 
     299            prof%caddunit(jadd,jvar) = "NotSet" 
     300         END DO 
     301      END DO 
     302          
     303      DO jext = 1, kext 
     304         prof%cextvars(jext) = "NotSet" 
     305         prof%cextlong(jext) = "NotSet" 
     306         prof%cextunit(jext) = "NotSet" 
    251307      END DO 
    252308 
     
    308364 
    309365         IF ( ko3dt(jvar) >= 0 ) THEN 
    310             CALL obs_prof_alloc_var( prof, jvar, kext, ko3dt(jvar) ) 
     366            CALL obs_prof_alloc_var( prof, jvar, kadd, ko3dt(jvar) ) 
    311367         ENDIF 
    312368          
    313369      END DO 
     370       
     371      ! Allocate extra variables 
     372      ALLOCATE( & 
     373         & prof%vext(kprof,kext) & 
     374         & ) 
    314375 
    315376      ! Allocate arrays of size number of time step size 
     
    432493         & ) 
    433494 
     495      ! Deallocate extra variables 
     496      DEALLOCATE( & 
     497         & prof%vext & 
     498         & ) 
     499       
    434500      ! Deallocate arrays of size number of time step size 
    435501 
     
    458524      DEALLOCATE( & 
    459525         & prof%cvars,    & 
     526         & prof%clong,    & 
     527         & prof%cunit,    & 
     528         & prof%cgrid,    & 
    460529         & prof%nvprot,   & 
    461530         & prof%nvprotmpp & 
    462531         ) 
    463532 
     533      ! Dellocate additional/extra variables metadata 
     534 
     535      DEALLOCATE( & 
     536         & prof%caddvars, & 
     537         & prof%caddlong, & 
     538         & prof%caddunit, & 
     539         & prof%cextvars, & 
     540         & prof%cextlong, & 
     541         & prof%cextunit  & 
     542         ) 
     543 
    464544 
    465545   END SUBROUTINE obs_prof_dealloc 
    466546 
    467547 
    468    SUBROUTINE obs_prof_alloc_var( prof, kvar, kext, kobs ) 
     548   SUBROUTINE obs_prof_alloc_var( prof, kvar, kadd, kobs ) 
    469549 
    470550      !!---------------------------------------------------------------------- 
     
    480560      TYPE(obs_prof), INTENT(INOUT) :: prof   ! Profile data to be allocated 
    481561      INTEGER, INTENT(IN) :: kvar   ! Variable number 
    482       INTEGER, INTENT(IN) :: kext   ! Number of extra fields within each variable 
     562      INTEGER, INTENT(IN) :: kadd   ! Number of additional fields within each variable 
    483563      INTEGER, INTENT(IN) :: kobs   ! Number of observations 
    484564       
     
    498578         & prof%var(kvar)%nvqcf(idefnqcf,kobs)  & 
    499579         & ) 
    500       IF (kext>0) THEN 
     580      IF (kadd>0) THEN 
    501581         ALLOCATE( &  
    502             & prof%var(kvar)%vext(kobs,kext) & 
     582            & prof%var(kvar)%vadd(kobs,kadd) & 
    503583            & ) 
    504584      ENDIF 
     
    534614         & prof%var(kvar)%nvqcf   & 
    535615         & ) 
    536       IF (prof%next>0) THEN 
     616      IF (prof%nadd>0) THEN 
    537617         DEALLOCATE( &  
    538             & prof%var(kvar)%vext  & 
     618            & prof%var(kvar)%vadd  & 
    539619            & ) 
    540620      ENDIF 
     
    576656         & invpro 
    577657      INTEGER :: jvar 
     658      INTEGER :: jadd 
    578659      INTEGER :: jext 
    579660      INTEGER :: ji 
     
    627708      IF ( lallocate ) THEN 
    628709         CALL obs_prof_alloc( newprof,   prof%nvar, & 
    629             &                 prof%next,            & 
     710            &                 prof%nadd, prof%next, & 
    630711            &                 inprof,    invpro,    & 
    631712            &                 prof%nstp, prof%npi,  & 
     
    670751 
    671752            newprof%mi(inprof,:)  = prof%mi(ji,:) 
    672             newprof%mj(inprof,:) = prof%mj(ji,:) 
     753            newprof%mj(inprof,:)  = prof%mj(ji,:) 
    673754            newprof%npidx(inprof) = prof%npidx(ji) 
    674755            newprof%npfil(inprof) = prof%npfil(ji) 
     
    741822                     newprof%var(jvar)%vmod(invpro(jvar))   = & 
    742823                        &                           prof%var(jvar)%vmod(jj) 
    743                      DO jext = 1, prof%next 
    744                         newprof%var(jvar)%vext(invpro(jvar),jext) = & 
    745                            &                      prof%var(jvar)%vext(jj,jext) 
     824                     DO jadd = 1, prof%nadd 
     825                        newprof%var(jvar)%vadd(invpro(jvar),jadd) = & 
     826                           &                      prof%var(jvar)%vadd(jj,jadd) 
    746827                     END DO 
    747828                   
     
    756837            END DO 
    757838 
     839            DO jext = 1, prof%next 
     840               newprof%vext(inprof,jext) = prof%vext(ji,jext) 
     841            END DO 
     842 
    758843         ENDIF 
    759844 
     
    771856 
    772857      newprof%nvar     = prof%nvar 
     858      newprof%nadd     = prof%nadd 
    773859      newprof%next     = prof%next 
    774860      newprof%nstp     = prof%nstp 
     
    777863      newprof%npk      = prof%npk 
    778864      newprof%cvars(:) = prof%cvars(:) 
     865      newprof%clong(:) = prof%clong(:) 
     866      newprof%cunit(:) = prof%cunit(:) 
     867      newprof%cgrid(:) = prof%cgrid(:) 
     868      newprof%caddvars(:) = prof%caddvars(:) 
     869      newprof%caddlong(:) = prof%caddlong(:) 
     870      newprof%caddunit(:) = prof%caddunit(:) 
     871      newprof%cextvars(:) = prof%cextvars(:) 
     872      newprof%cextlong(:) = prof%cextlong(:) 
     873      newprof%cextunit(:) = prof%cextunit(:) 
    779874  
    780875      ! Deallocate temporary data 
     
    810905      !!* Local variables 
    811906      INTEGER :: jvar 
     907      INTEGER :: jadd 
    812908      INTEGER :: jext 
    813909      INTEGER :: ji 
     
    866962               oldprof%var(jvar)%idqcf(:,jl) = prof%var(jvar)%idqcf(:,jj) 
    867963               oldprof%var(jvar)%nvqcf(:,jl) = prof%var(jvar)%nvqcf(:,jj) 
    868                DO jext = 1, prof%next 
    869                   oldprof%var(jvar)%vext(jl,jext) = & 
    870                      &                        prof%var(jvar)%vext(jj,jext) 
     964               DO jadd = 1, prof%nadd 
     965                  oldprof%var(jvar)%vadd(jl,jadd) = & 
     966                     &                        prof%var(jvar)%vadd(jj,jadd) 
    871967               END DO 
    872968                
    873969            END DO 
    874970 
     971         END DO 
     972 
     973         DO jext = 1, prof%next 
     974            oldprof%vext(jk,jext) = prof%vext(jj,jext) 
    875975         END DO 
    876976          
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_read_prof.F90

    r15089 r15180  
    4444 
    4545   SUBROUTINE obs_rea_prof( profdata, knumfiles, cdfilenames, & 
    46       &                     kvars, kextr, kstp, ddobsini, ddobsend, & 
    47       &                     ldvar, ldignmis, ldsatt, & 
     46      &                     kvars, kadd, kextr, kstp, ddobsini, ddobsend, & 
     47      &                     ldvar, ldignmis, ldallatall, & 
    4848      &                     ldmod, cdvars, kdailyavtypes ) 
    4949      !!--------------------------------------------------------------------- 
     
    7272         & cdfilenames(knumfiles)        ! File names to read in 
    7373      INTEGER, INTENT(IN) :: kvars      ! Number of variables in profdata 
    74       INTEGER, INTENT(IN) :: kextr      ! Number of extra fields for each var 
     74      INTEGER, INTENT(IN) :: kadd       ! Number of additional fields 
     75                                        !   in addition to those in the input file(s) 
     76      INTEGER, INTENT(IN) :: kextr      ! Number of extra fields 
     77                                        !   in addition to those in the input file(s) 
    7578      INTEGER, INTENT(IN) :: kstp       ! Ocean time-step index 
    7679      LOGICAL, DIMENSION(kvars), INTENT(IN) :: ldvar     ! Observed variables switches 
    7780      LOGICAL, INTENT(IN) :: ldignmis   ! Ignore missing files 
    78       LOGICAL, INTENT(IN) :: ldsatt     ! Compute salinity at all temperature points 
     81      LOGICAL, INTENT(IN) :: ldallatall     ! Compute salinity at all temperature points 
    7982      LOGICAL, INTENT(IN) :: ldmod      ! Initialize model from input data 
    8083      REAL(dp), INTENT(IN) :: ddobsini  ! Obs. ini time in YYYYMMDD.HHMMSS 
     
    8790      CHARACTER(LEN=15), PARAMETER :: cpname='obs_rea_prof' 
    8891      CHARACTER(len=8) :: clrefdate 
    89       CHARACTER(len=8), DIMENSION(:), ALLOCATABLE :: clvarsin 
    90       INTEGER :: jvar 
     92      CHARACTER(len=ilenname), DIMENSION(:),   ALLOCATABLE :: clvarsin 
     93      CHARACTER(len=ilenlong), DIMENSION(:),   ALLOCATABLE :: cllongin 
     94      CHARACTER(len=ilenunit), DIMENSION(:),   ALLOCATABLE :: clunitin 
     95      CHARACTER(len=ilengrid), DIMENSION(:),   ALLOCATABLE :: clgridin 
     96      CHARACTER(len=ilenname), DIMENSION(:),   ALLOCATABLE :: claddvarsin 
     97      CHARACTER(len=ilenlong), DIMENSION(:,:), ALLOCATABLE :: claddlongin 
     98      CHARACTER(len=ilenunit), DIMENSION(:,:), ALLOCATABLE :: claddunitin 
     99      CHARACTER(len=ilenname), DIMENSION(:),   ALLOCATABLE :: clextvarsin 
     100      CHARACTER(len=ilenlong), DIMENSION(:),   ALLOCATABLE :: clextlongin 
     101      CHARACTER(len=ilenunit), DIMENSION(:),   ALLOCATABLE :: clextunitin 
    91102      INTEGER :: ji 
    92103      INTEGER :: jj 
    93104      INTEGER :: jk 
    94105      INTEGER :: ij 
     106      INTEGER :: jext 
     107      INTEGER :: jvar 
     108      INTEGER :: jadd 
     109      INTEGER :: jadd2 
     110      INTEGER :: iadd 
     111      INTEGER :: iaddin 
     112      INTEGER :: iextr 
    95113      INTEGER :: iflag 
    96114      INTEGER :: inobf 
     
    166184      ALLOCATE( inpfiles(inobf) ) 
    167185 
     186      iadd  = 0 
     187      iextr = 0 
     188 
    168189      prof_files : DO jj = 1, inobf 
    169190 
     
    221242            ENDIF 
    222243 
     244            IF ( (iextr > 0) .AND. (inpfiles(jj)%next /= iextr) ) THEN 
     245               CALL ctl_stop( 'Number of extra variables not consistent', & 
     246                  &           ' with previous files for this type' ) 
     247            ELSE 
     248               iextr = inpfiles(jj)%next 
     249            ENDIF 
     250 
     251            ! Ignore model counterpart 
     252            iaddin = inpfiles(jj)%nadd 
     253            DO ji = 1, iaddin 
     254               IF ( TRIM(inpfiles(jj)%caddname(ji)) == 'Hx' ) THEN 
     255                  iaddin = iaddin - 1 
     256                  EXIT 
     257               ENDIF 
     258            END DO 
     259            IF ( ldmod .AND. ( inpfiles(jj)%nadd == iaddin ) ) THEN 
     260               CALL ctl_stop( 'Model not in input data' ) 
     261            ENDIF 
     262 
     263            IF ( (iadd > 0) .AND. (iaddin /= iadd) ) THEN 
     264               CALL ctl_stop( 'Number of additional variables not consistent', & 
     265                  &           ' with previous files for this type' ) 
     266            ELSE 
     267               iadd = iaddin 
     268            ENDIF 
     269 
    223270            IF ( jj == 1 ) THEN 
    224271               ALLOCATE( clvarsin( inpfiles(jj)%nvar ) ) 
     272               ALLOCATE( cllongin( inpfiles(jj)%nvar ) ) 
     273               ALLOCATE( clunitin( inpfiles(jj)%nvar ) ) 
     274               ALLOCATE( clgridin( inpfiles(jj)%nvar ) ) 
    225275               DO ji = 1, inpfiles(jj)%nvar 
    226276                 clvarsin(ji) = inpfiles(jj)%cname(ji) 
     277                 cllongin(ji) = inpfiles(jj)%coblong(ji) 
     278                 clunitin(ji) = inpfiles(jj)%cobunit(ji) 
     279                 clgridin(ji) = inpfiles(jj)%cgrid(ji) 
    227280                 IF ( clvarsin(ji) /= cdvars(ji) ) THEN 
    228281                    CALL ctl_stop( 'Feedback file variables do not match', & 
     
    230283                 ENDIF 
    231284               END DO 
     285               IF ( iadd > 0 ) THEN 
     286                  ALLOCATE( claddvarsin( iadd ) ) 
     287                  ALLOCATE( claddlongin( iadd, inpfiles(jj)%nvar ) ) 
     288                  ALLOCATE( claddunitin( iadd, inpfiles(jj)%nvar ) ) 
     289                  jadd = 0 
     290                  DO ji = 1, inpfiles(jj)%nadd 
     291                    IF ( TRIM(inpfiles(jj)%caddname(ji)) /= 'Hx' ) THEN 
     292                       jadd = jadd + 1 
     293                       claddvarsin(jadd) = inpfiles(jj)%caddname(ji) 
     294                       DO jk = 1, inpfiles(jj)%nvar 
     295                          claddlongin(jadd,jk) = inpfiles(jj)%caddlong(ji,jk) 
     296                          claddunitin(jadd,jk) = inpfiles(jj)%caddunit(ji,jk) 
     297                       END DO 
     298                    ENDIF 
     299                  END DO 
     300               ENDIF 
     301               IF ( iextr > 0 ) THEN 
     302                  ALLOCATE( clextvarsin( iextr ) ) 
     303                  ALLOCATE( clextlongin( iextr ) ) 
     304                  ALLOCATE( clextunitin( iextr ) ) 
     305                  DO ji = 1, iextr 
     306                    clextvarsin(ji) = inpfiles(jj)%cextname(ji) 
     307                    clextlongin(ji) = inpfiles(jj)%cextlong(ji) 
     308                    clextunitin(ji) = inpfiles(jj)%cextunit(ji) 
     309                  END DO 
     310               ENDIF 
    232311            ELSE 
    233312               DO ji = 1, inpfiles(jj)%nvar 
     
    237316                  ENDIF 
    238317               END DO 
     318               IF ( iadd > 0 ) THEN 
     319                  jadd = 0 
     320                  DO ji = 1, inpfiles(jj)%nadd 
     321                     IF ( TRIM(inpfiles(jj)%caddname(ji)) /= 'Hx' ) THEN 
     322                        jadd = jadd + 1 
     323                        IF ( inpfiles(jj)%caddname(ji) /= claddvarsin(jadd) ) THEN 
     324                           CALL ctl_stop( 'Feedback file additional variables not consistent', & 
     325                              &           ' with previous files for this type' ) 
     326                        ENDIF 
     327                     ENDIF 
     328                  END DO 
     329               ENDIF 
     330               IF ( iextr > 0 ) THEN 
     331                  DO ji = 1, iextr 
     332                     IF ( inpfiles(jj)%cextname(ji) /= clextvarsin(ji) ) THEN 
     333                        CALL ctl_stop( 'Feedback file extra variables not consistent', & 
     334                           &           ' with previous files for this type' ) 
     335                     ENDIF 
     336                  END DO 
     337               ENDIF 
    239338            ENDIF 
    240339 
     
    499598 
    500599      iv3dt(:) = -1 
    501       IF (ldsatt) THEN 
     600      IF (ldallatall) THEN 
    502601         iv3dt(:) = ip3dt 
    503602      ELSE 
    504603         iv3dt(:) = ivart0(:) 
    505604      ENDIF 
    506       CALL obs_prof_alloc( profdata, kvars, kextr, iprof, iv3dt, & 
     605      CALL obs_prof_alloc( profdata, kvars, kadd+iadd, kextr+iextr, iprof, iv3dt, & 
    507606         &                 kstp, jpi, jpj, jpk ) 
    508607 
     
    512611      profdata%nvprot(:) = 0 
    513612      profdata%cvars(:)  = clvarsin(:) 
     613      profdata%clong(:)  = cllongin(:) 
     614      profdata%cunit(:)  = clunitin(:) 
     615      profdata%cgrid(:)  = clgridin(:) 
     616      IF ( iadd > 0 ) THEN 
     617         profdata%caddvars(kadd+1:)   = claddvarsin(:) 
     618         profdata%caddlong(kadd+1:,:) = claddlongin(:,:) 
     619         profdata%caddunit(kadd+1:,:) = claddunitin(:,:) 
     620      ENDIF 
     621      IF ( iextr > 0 ) THEN 
     622         profdata%cextvars(kextr+1:) = clextvarsin(:) 
     623         profdata%cextlong(kextr+1:) = clextlongin(:) 
     624         profdata%cextunit(kextr+1:) = clextunitin(:) 
     625      ENDIF 
    514626      iprof = 0 
    515627 
     
    644756                     & CYCLE 
    645757 
    646                   IF (ldsatt) THEN 
     758                  IF (ldallatall) THEN 
    647759 
    648760                     DO jvar = 1, kvars 
     
    663775                     IF ( ( .NOT. BTEST(inpfiles(jj)%ivlqc(ij,ji,jvar),2) .AND. & 
    664776                       &   .NOT. BTEST(inpfiles(jj)%idqc(ij,ji),2) .AND. & 
    665                        &    ldvar(jvar) ) .OR. ldsatt ) THEN 
    666  
    667                         IF (ldsatt) THEN 
     777                       &    ldvar(jvar) ) .OR. ldallatall ) THEN 
     778 
     779                        IF (ldallatall) THEN 
    668780 
    669781                           ivart(jvar) = ip3dt 
     
    698810                           profdata%var(jvar)%vobs(ivart(jvar)) = & 
    699811                              &                inpfiles(jj)%pob(ij,ji,jvar) 
    700                            IF ( ldmod ) THEN 
    701                               profdata%var(jvar)%vmod(ivart(jvar)) = & 
    702                                  &                inpfiles(jj)%padd(ij,ji,1,jvar) 
    703                            ENDIF 
    704812                           ! Count number of profile var1 data as function of type 
    705813                           itypvar( profdata%ntyp(iprof) + 1, jvar ) = & 
     
    717825                           & inpfiles(jj)%ivlqcf(:,ij,ji,jvar) 
    718826 
    719                         ! Profile insitu T value 
    720                         IF ( TRIM( inpfiles(jj)%cname(jvar) ) == 'POTM' ) THEN 
    721                            profdata%var(jvar)%vext(ivart(jvar),1) = & 
    722                               &                inpfiles(jj)%pext(ij,ji,1) 
     827                        ! Additional variables 
     828                        IF ( iadd > 0 ) THEN 
     829                           jadd2 = 0 
     830                           DO jadd = 1, inpfiles(jj)%nadd 
     831                              IF ( TRIM(inpfiles(jj)%caddname(jadd)) == 'Hx' ) THEN 
     832                                 IF ( ldmod ) THEN 
     833                                    profdata%var(jvar)%vmod(ivart(jvar)) = & 
     834                                       &                inpfiles(jj)%padd(ij,ji,jadd,jvar) 
     835                                 ENDIF 
     836                              ELSE 
     837                                 jadd2 = jadd2 + 1 
     838                                 profdata%var(jvar)%vadd(ivart(jvar),kadd+jadd2) = & 
     839                                    &                inpfiles(jj)%padd(ij,ji,jadd,jvar) 
     840                              ENDIF 
     841                           END DO 
    723842                        ENDIF 
    724843 
     
    726845                   
    727846                  END DO 
     847                   
     848                  ! Extra variables 
     849                  IF ( iextr > 0 ) THEN 
     850                     DO jext = 1, iextr 
     851                        profdata%vext(iprof,kextr+jext) = inpfiles(jj)%pext(ij,ji,jext) 
     852                     END DO 
     853                  ENDIF 
    728854 
    729855               END DO loop_p 
     
    777903      ENDIF 
    778904 
    779       IF (ldsatt) THEN 
     905      IF (ldallatall) THEN 
    780906         profdata%nvprot(:)    = ip3dt 
    781907         profdata%nvprotmpp(:) = ip3dtmpp 
     
    810936      ! Deallocate temporary data 
    811937      !----------------------------------------------------------------------- 
    812       DEALLOCATE( ifileidx, iprofidx, zdat, clvarsin ) 
     938      DEALLOCATE( ifileidx, iprofidx, zdat, & 
     939         &        clvarsin, cllongin, clunitin, clgridin ) 
     940      IF ( iadd > 0 ) THEN 
     941         DEALLOCATE( claddvarsin, claddlongin, claddunitin) 
     942      ENDIF 
     943      IF ( iextr > 0 ) THEN 
     944         DEALLOCATE( clextvarsin, clextlongin, clextunitin ) 
     945      ENDIF 
    813946 
    814947      !----------------------------------------------------------------------- 
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_read_surf.F90

    r15089 r15180  
    3939 
    4040   SUBROUTINE obs_rea_surf( surfdata, knumfiles, cdfilenames, & 
    41       &                     kvars, kextr, kstp, ddobsini, ddobsend, & 
     41      &                     kvars, kadd, kextr, kstp, ddobsini, ddobsend, & 
    4242      &                     ldignmis, ldmod, ldnightav, cdvars ) 
    4343      !!--------------------------------------------------------------------- 
     
    6666         & cdfilenames(knumfiles)       ! File names to read in 
    6767      INTEGER, INTENT(IN) :: kvars      ! Number of variables in surfdata 
    68       INTEGER, INTENT(IN) :: kextr      ! Number of extra fields for each var 
     68      INTEGER, INTENT(IN) :: kadd       ! Number of additional fields 
     69                                        !   in addition to those in the input file(s) 
     70      INTEGER, INTENT(IN) :: kextr      ! Number of extra fields 
     71                                        !   in addition to those in the input file(s) 
    6972      INTEGER, INTENT(IN) :: kstp       ! Ocean time-step index 
    7073      LOGICAL, INTENT(IN) :: ldignmis   ! Ignore missing files 
     
    7881      CHARACTER(LEN=11), PARAMETER :: cpname='obs_rea_surf' 
    7982      CHARACTER(len=8) :: clrefdate 
    80       CHARACTER(len=8), DIMENSION(:), ALLOCATABLE :: clvarsin 
     83      CHARACTER(len=ilenname), DIMENSION(:),   ALLOCATABLE :: clvarsin 
     84      CHARACTER(len=ilenlong), DIMENSION(:),   ALLOCATABLE :: cllongin 
     85      CHARACTER(len=ilenunit), DIMENSION(:),   ALLOCATABLE :: clunitin 
     86      CHARACTER(len=ilengrid), DIMENSION(:),   ALLOCATABLE :: clgridin 
     87      CHARACTER(len=ilenname), DIMENSION(:),   ALLOCATABLE :: claddvarsin 
     88      CHARACTER(len=ilenlong), DIMENSION(:,:), ALLOCATABLE :: claddlongin 
     89      CHARACTER(len=ilenunit), DIMENSION(:,:), ALLOCATABLE :: claddunitin 
     90      CHARACTER(len=ilenname), DIMENSION(:),   ALLOCATABLE :: clextvarsin 
     91      CHARACTER(len=ilenlong), DIMENSION(:),   ALLOCATABLE :: clextlongin 
     92      CHARACTER(len=ilenunit), DIMENSION(:),   ALLOCATABLE :: clextunitin 
    8193      INTEGER :: ji 
    8294      INTEGER :: jj 
    8395      INTEGER :: jk 
     96      INTEGER :: jvar 
     97      INTEGER :: jext 
     98      INTEGER :: jadd 
     99      INTEGER :: jadd2 
     100      INTEGER :: iadd 
     101      INTEGER :: iaddin 
     102      INTEGER :: iextr 
    84103      INTEGER :: iflag 
    85104      INTEGER :: inobf 
     
    121140      TYPE(obfbdata), POINTER, DIMENSION(:) :: & 
    122141         & inpfiles 
     142      CHARACTER(LEN=256) :: cout1  ! Diagnostic output line 
    123143 
    124144      ! Local initialization 
     
    132152 
    133153      ALLOCATE( inpfiles(inobf) ) 
     154 
     155      iadd  = 0 
     156      iextr = 0 
    134157 
    135158      surf_files : DO jj = 1, inobf 
     
    189212            ENDIF 
    190213 
     214            IF ( (iextr > 0) .AND. (inpfiles(jj)%next /= iextr) ) THEN 
     215               CALL ctl_stop( 'Number of extra variables not consistent', & 
     216                  &           ' with previous files for this type' ) 
     217            ELSE 
     218               iextr = inpfiles(jj)%next 
     219            ENDIF 
     220 
     221            ! Ignore model counterpart 
     222            iaddin = inpfiles(jj)%nadd 
     223            DO ji = 1, iaddin 
     224               IF ( TRIM(inpfiles(jj)%caddname(ji)) == 'Hx' ) THEN 
     225                  iaddin = iaddin - 1 
     226                  EXIT 
     227               ENDIF 
     228            END DO 
     229            IF ( ldmod .AND. ( inpfiles(jj)%nadd == iaddin ) ) THEN 
     230               CALL ctl_stop( 'Model not in input data' ) 
     231            ENDIF 
     232 
     233            IF ( (iadd > 0) .AND. (iaddin /= iadd) ) THEN 
     234               CALL ctl_stop( 'Number of additional variables not consistent', & 
     235                  &           ' with previous files for this type' ) 
     236            ELSE 
     237               iadd = iaddin 
     238            ENDIF 
     239 
    191240            IF ( jj == 1 ) THEN 
    192241               ALLOCATE( clvarsin( inpfiles(jj)%nvar ) ) 
     242               ALLOCATE( cllongin( inpfiles(jj)%nvar ) ) 
     243               ALLOCATE( clunitin( inpfiles(jj)%nvar ) ) 
     244               ALLOCATE( clgridin( inpfiles(jj)%nvar ) ) 
    193245               DO ji = 1, inpfiles(jj)%nvar 
    194246                 clvarsin(ji) = inpfiles(jj)%cname(ji) 
     247                 cllongin(ji) = inpfiles(jj)%coblong(ji) 
     248                 clunitin(ji) = inpfiles(jj)%cobunit(ji) 
     249                 clgridin(ji) = inpfiles(jj)%cgrid(ji) 
    195250                 IF ( clvarsin(ji) /= cdvars(ji) ) THEN 
    196251                    CALL ctl_stop( 'Feedback file variables do not match', & 
     
    198253                 ENDIF 
    199254               END DO 
     255               IF ( iadd > 0 ) THEN 
     256                  ALLOCATE( claddvarsin( iadd ) ) 
     257                  ALLOCATE( claddlongin( iadd, inpfiles(jj)%nvar ) ) 
     258                  ALLOCATE( claddunitin( iadd, inpfiles(jj)%nvar ) ) 
     259                  jadd = 0 
     260                  DO ji = 1, inpfiles(jj)%nadd 
     261                    IF ( TRIM(inpfiles(jj)%caddname(ji)) /= 'Hx' ) THEN 
     262                       jadd = jadd + 1 
     263                       claddvarsin(jadd) = inpfiles(jj)%caddname(ji) 
     264                       DO jk = 1, inpfiles(jj)%nvar 
     265                          claddlongin(jadd,jk) = inpfiles(jj)%caddlong(ji,jk) 
     266                          claddunitin(jadd,jk) = inpfiles(jj)%caddunit(ji,jk) 
     267                       END DO 
     268                    ENDIF 
     269                  END DO 
     270               ENDIF 
     271               IF ( iextr > 0 ) THEN 
     272                  ALLOCATE( clextvarsin( iextr ) ) 
     273                  ALLOCATE( clextlongin( iextr ) ) 
     274                  ALLOCATE( clextunitin( iextr ) ) 
     275                  DO ji = 1, iextr 
     276                    clextvarsin(ji) = inpfiles(jj)%cextname(ji) 
     277                    clextlongin(ji) = inpfiles(jj)%cextlong(ji) 
     278                    clextunitin(ji) = inpfiles(jj)%cextunit(ji) 
     279                  END DO 
     280               ENDIF 
    200281            ELSE 
    201282               DO ji = 1, inpfiles(jj)%nvar 
     
    205286                  ENDIF 
    206287               END DO 
     288               IF ( iadd > 0 ) THEN 
     289                  jadd = 0 
     290                  DO ji = 1, inpfiles(jj)%nadd 
     291                     IF ( TRIM(inpfiles(jj)%caddname(ji)) /= 'Hx' ) THEN 
     292                        jadd = jadd + 1 
     293                        IF ( inpfiles(jj)%caddname(ji) /= claddvarsin(jadd) ) THEN 
     294                           CALL ctl_stop( 'Feedback file additional variables not consistent', & 
     295                              &           ' with previous files for this type' ) 
     296                        ENDIF 
     297                     ENDIF 
     298                  END DO 
     299               ENDIF 
     300               IF ( iextr > 0 ) THEN 
     301                  DO ji = 1, iextr 
     302                     IF ( inpfiles(jj)%cextname(ji) /= clextvarsin(ji) ) THEN 
     303                        CALL ctl_stop( 'Feedback file extra variables not consistent', & 
     304                           &           ' with previous files for this type' ) 
     305                     ENDIF 
     306                  END DO 
     307               ENDIF 
     308 
    207309            ENDIF 
    208310 
     
    351453         &               iindx   ) 
    352454 
    353       CALL obs_surf_alloc( surfdata, iobs, kvars, kextr, kstp, jpi, jpj ) 
     455      CALL obs_surf_alloc( surfdata, iobs, kvars, kadd+iadd, kextr+iextr, kstp, jpi, jpj ) 
    354456 
    355457      ! Read obs/positions, QC, all variable and assign to surfdata 
     
    358460 
    359461      surfdata%cvars(:)  = clvarsin(:) 
     462      surfdata%clong(:)  = cllongin(:) 
     463      surfdata%cunit(:)  = clunitin(:) 
     464      surfdata%cgrid(:)  = clgridin(:) 
     465      IF ( iadd > 0 ) THEN 
     466         surfdata%caddvars(kadd+1:)   = claddvarsin(:) 
     467         surfdata%caddlong(kadd+1:,:) = claddlongin(:,:) 
     468         surfdata%caddunit(kadd+1:,:) = claddunitin(:,:) 
     469      ENDIF 
     470      IF ( iextr > 0 ) THEN 
     471         surfdata%cextvars(kextr+1:) = clextvarsin(:) 
     472         surfdata%cextlong(kextr+1:) = clextlongin(:) 
     473         surfdata%cextunit(kextr+1:) = clextunitin(:) 
     474      ENDIF 
    360475 
    361476      ityp   (:) = 0 
     
    433548               surfdata%nsfil(iobs) = iindx(jk) 
    434549 
    435                ! QC flags 
    436                surfdata%nqc(iobs) = inpfiles(jj)%ivqc(ji,1) 
    437  
    438                ! Observed value 
    439                surfdata%robs(iobs,1) = inpfiles(jj)%pob(1,ji,1) 
    440  
    441  
    442                ! Model and MDT is set to fbrmdi unless read from file 
    443                IF ( ldmod ) THEN 
    444                   surfdata%rmod(iobs,1) = inpfiles(jj)%padd(1,ji,1,1) 
    445                   IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) THEN 
    446                      surfdata%rext(iobs,1) = inpfiles(jj)%padd(1,ji,2,1) 
    447                      surfdata%rext(iobs,2) = inpfiles(jj)%pext(1,ji,1) 
     550               DO jvar = 1, kvars 
     551 
     552                  ! QC flags 
     553! WHY IS THIS NOT A FUNCTION OF NUM VARS? 
     554                  surfdata%nqc(iobs) = inpfiles(jj)%ivqc(ji,jvar) 
     555 
     556                  ! Observed value 
     557                  surfdata%robs(iobs,jvar) = inpfiles(jj)%pob(1,ji,jvar) 
     558 
     559! THIS NEEDS SORTING 
     560!                  ! Model and MDT is set to fbrmdi unless read from file 
     561!                  IF ( ldmod ) THEN 
     562!                     surfdata%rmod(iobs,jvar) = inpfiles(jj)%padd(1,ji,1,1) 
     563!                     IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) THEN 
     564!                        surfdata%rext(iobs,1) = inpfiles(jj)%padd(1,ji,2,1) 
     565!                        surfdata%rext(iobs,2) = inpfiles(jj)%pext(1,ji,1) 
     566!                     ENDIF 
     567!                   ELSE 
     568!                     surfdata%rmod(iobs,jvar) = fbrmdi 
     569!                     IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) surfdata%rext(iobs,:) = fbrmdi 
     570!                  ENDIF 
     571 
     572                  ! Additional variables 
     573                  surfdata%rmod(iobs,jvar) = fbrmdi 
     574                  IF ( iadd > 0 ) THEN 
     575                     jadd2 = 0 
     576                     DO jadd = 1, inpfiles(jj)%nadd 
     577                        IF ( TRIM(inpfiles(jj)%caddname(jadd)) == 'Hx' ) THEN 
     578                           IF ( ldmod ) THEN 
     579                              surfdata%rmod(iobs,jvar) = inpfiles(jj)%padd(1,ji,jadd,jvar) 
     580                           ENDIF 
     581                        ELSE 
     582                           jadd2 = jadd2 + 1 
     583                           surfdata%radd(iobs,kadd+jadd2,jvar) = & 
     584                              &                inpfiles(jj)%padd(1,ji,jadd,jvar) 
     585                        ENDIF 
     586                     END DO 
    448587                  ENDIF 
    449                 ELSE 
    450                   surfdata%rmod(iobs,1) = fbrmdi 
    451                   IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) surfdata%rext(iobs,:) = fbrmdi 
     588 
     589               END DO 
     590                   
     591               ! Extra variables 
     592               IF ( iextr > 0 ) THEN 
     593                  DO jext = 1, iextr 
     594                     surfdata%rext(iobs,kextr+jext) = inpfiles(jj)%pext(1,ji,jext) 
     595                  END DO 
    452596               ENDIF 
    453597            ENDIF 
     
    467611      !----------------------------------------------------------------------- 
    468612      IF (lwp) THEN 
    469  
     613         DO jvar = 1, surfdata%nvar        
     614            IF ( jvar == 1 ) THEN 
     615               cout1=TRIM(surfdata%cvars(1))                   
     616            ELSE 
     617               WRITE(cout1,'(A,A1,A)') TRIM(cout1), '/', TRIM(surfdata%cvars(jvar))             
     618            ENDIF 
     619         END DO 
     620  
    470621         WRITE(numout,*) 
    471          WRITE(numout,'(1X,A)')TRIM( surfdata%cvars(1) )//' data' 
     622         WRITE(numout,'(1X,A)')TRIM( cout1 )//' data' 
    472623         WRITE(numout,'(1X,A)')'--------------' 
    473624         DO jj = 1,8 
     
    479630            & '---------------------------------------------------------------' 
    480631         WRITE(numout,'(1X,A,I8)') & 
    481             & 'Total data for variable '//TRIM( surfdata%cvars(1) )// & 
     632            & 'Total data for variable '//TRIM( cout1 )// & 
    482633            & '           = ', iobsmpp 
    483634         WRITE(numout,'(1X,A)') & 
     
    490641      ! Deallocate temporary data 
    491642      !----------------------------------------------------------------------- 
    492       DEALLOCATE( ifileidx, isurfidx, zdat, clvarsin ) 
     643      DEALLOCATE( ifileidx, isurfidx, zdat, clvarsin, & 
     644         &        cllongin, clunitin, clgridin ) 
     645      IF ( iadd > 0 ) THEN 
     646         DEALLOCATE( claddvarsin, claddlongin, claddunitin) 
     647      ENDIF 
     648      IF ( iextr > 0 ) THEN 
     649         DEALLOCATE( clextvarsin, clextlongin, clextunitin ) 
     650      ENDIF 
    493651 
    494652      !----------------------------------------------------------------------- 
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_readmdt.F90

    r14075 r15180  
    108108         & CALL obs_offset_mdt( jpi, jpj, z_mdt, zfill ) 
    109109 
    110       ! Intepolate the MDT already on the model grid at the observation point 
    111    
     110      ! Interpolate the MDT already on the model grid at the observation point 
     111 
    112112      ALLOCATE( & 
    113113         & igrdi(2,2,sladata%nsurf), & 
     
    118118         & zmdtl(2,2,sladata%nsurf)  & 
    119119         & ) 
    120           
     120 
    121121      DO jobs = 1, sladata%nsurf 
    122122 
     
    147147             
    148148         CALL obs_int_h2d( 1, 1, zweig, zmdtl(:,:,jobs),  zext ) 
    149   
    150          sladata%rext(jobs,2) = zext(1) 
     149 
     150! FIGURE OUT THIS ASSIGNMENT  
     151!         sladata%rext(jobs,2) = zext(1) 
    151152 
    152153! mark any masked data with a QC flag 
    153154         IF( zobsmask(1) == 0 )   sladata%nqc(jobs) = IBSET(sladata%nqc(jobs),15) 
    154155 
    155          END DO 
    156           
     156      END DO 
     157 
    157158      DEALLOCATE( & 
    158159         & igrdi, & 
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_surf_def.F90

    r14075 r15180  
    2323   USE obs_mpp, ONLY : &  ! MPP tools  
    2424      obs_mpp_sum_integer 
     25   USE obs_fbm            ! Obs feedback format 
    2526 
    2627   IMPLICIT NONE 
     
    4546      INTEGER :: nsurfmpp   !: Global number of surface data within window 
    4647      INTEGER :: nvar       !: Number of variables at observation points 
     48      INTEGER :: nadd       !: Number of additional fields at observation points 
    4749      INTEGER :: nextra     !: Number of extra fields at observation points 
    4850      INTEGER :: nstp       !: Number of time steps 
     
    6971         & ntyp           !: Type of surface observation product 
    7072 
    71       CHARACTER(len=8), POINTER, DIMENSION(:) :: & 
    72          & cvars          !: Variable names 
    73  
    74       CHARACTER(LEN=8), POINTER, DIMENSION(:) :: & 
     73      CHARACTER(len=ilenname), POINTER, DIMENSION(:) :: & 
     74         & cvars,    &    !: Variable names 
     75         & cextvars, &    !: Extra variable names 
     76         & caddvars       !: Additional variable names 
     77 
     78      CHARACTER(len=ilenlong), POINTER, DIMENSION(:) :: & 
     79         & clong,    &    !: Variable long names 
     80         & cextlong       !: Extra variable long names 
     81 
     82      CHARACTER(len=ilenlong), POINTER, DIMENSION(:,:) :: & 
     83         & caddlong       !: Additional variable long names 
     84 
     85      CHARACTER(len=ilenunit), POINTER, DIMENSION(:) :: & 
     86         & cunit,    &    !: Variable units 
     87         & cextunit       !: Extra variable units 
     88 
     89      CHARACTER(len=ilenunit), POINTER, DIMENSION(:,:) :: & 
     90         & caddunit       !: Additional variable units 
     91 
     92      CHARACTER(len=ilengrid), POINTER, DIMENSION(:) :: & 
     93         & cgrid          !: Variable grids 
     94 
     95      CHARACTER(LEN=ilenwmo), POINTER, DIMENSION(:) :: & 
    7596         & cwmo           !: WMO indentifier 
    7697          
     
    86107         & rext           !: Extra fields interpolated to observation points 
    87108 
    88       REAL(KIND=wp), POINTER, DIMENSION(:,:) :: & 
     109      REAL(KIND=wp), POINTER, DIMENSION(:,:,:) :: & 
     110         & radd           !: Additional fields interpolated to observation points 
     111 
     112      REAL(KIND=wp), POINTER, DIMENSION(:,:,:) :: & 
    89113         & vdmean         !: Time averaged of model field 
    90114 
     
    121145CONTAINS 
    122146    
    123    SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kextra, kstp, kpi, kpj ) 
     147   SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kadd, kextra, kstp, kpi, kpj ) 
    124148      !!---------------------------------------------------------------------- 
    125149      !!                     ***  ROUTINE obs_surf_alloc  *** 
     
    136160      INTEGER, INTENT(IN) :: ksurf   ! Number of surface observations 
    137161      INTEGER, INTENT(IN) :: kvar    ! Number of surface variables 
     162      INTEGER, INTENT(IN) :: kadd    ! Number of additional fields at observation points 
    138163      INTEGER, INTENT(IN) :: kextra  ! Number of extra fields at observation points 
    139164      INTEGER, INTENT(IN) :: kstp    ! Number of time steps 
     
    143168      !!* Local variables 
    144169      INTEGER :: ji 
    145       INTEGER :: jvar 
     170      INTEGER :: jvar, jadd, jext 
    146171 
    147172      ! Set bookkeeping variables 
     
    149174      surf%nsurf    = ksurf 
    150175      surf%nsurfmpp = 0 
     176      surf%nadd     = kadd 
    151177      surf%nextra   = kextra 
    152178      surf%nvar     = kvar 
     
    158184 
    159185      ALLOCATE( & 
    160          & surf%cvars(kvar)    & 
     186         & surf%cvars(kvar), & 
     187         & surf%clong(kvar), & 
     188         & surf%cunit(kvar), & 
     189         & surf%cgrid(kvar)  & 
    161190         & ) 
    162191 
    163192      DO jvar = 1, kvar 
    164193         surf%cvars(jvar) = "NotSet" 
     194         surf%clong(jvar) = "NotSet" 
     195         surf%cunit(jvar) = "NotSet" 
     196         surf%cgrid(jvar) = "" 
     197      END DO 
     198 
     199      ! Allocate additional/extra variable metadata 
     200 
     201      ALLOCATE( & 
     202         & surf%caddvars(kadd),      & 
     203         & surf%caddlong(kadd,kvar), & 
     204         & surf%caddunit(kadd,kvar), & 
     205         & surf%cextvars(kextra),    & 
     206         & surf%cextlong(kextra),    & 
     207         & surf%cextunit(kextra)     & 
     208         ) 
     209          
     210      DO jadd = 1, kadd 
     211         surf%caddvars(jadd) = "NotSet" 
     212         DO jvar = 1, kvar 
     213            surf%caddlong(jadd,jvar) = "NotSet" 
     214            surf%caddunit(jadd,jvar) = "NotSet" 
     215         END DO 
     216      END DO 
     217          
     218      DO jext = 1, kextra 
     219         surf%cextvars(jext) = "NotSet" 
     220         surf%cextlong(jext) = "NotSet" 
     221         surf%cextunit(jext) = "NotSet" 
    165222      END DO 
    166223       
     
    205262      surf%rext(:,:) = 0.0_wp  
    206263 
     264      ! Allocate arrays of number of additional fields at observation points 
     265 
     266      ALLOCATE( &  
     267         & surf%radd(ksurf,kadd,kvar) & 
     268         & ) 
     269 
     270      surf%radd(:,:,:) = 0.0_wp  
     271 
    207272      ! Allocate arrays of number of time step size 
    208273 
     
    215280 
    216281      ALLOCATE( & 
    217          & surf%vdmean(kpi,kpj) & 
     282         & surf%vdmean(kpi,kpj,kvar) & 
    218283         & ) 
    219284 
     
    291356         & ) 
    292357 
     358      ! Deallocate arrays of number of additional fields at observation points 
     359 
     360      DEALLOCATE( &  
     361         & surf%radd & 
     362         & ) 
     363 
    293364      ! Deallocate arrays of size number of grid points size times 
    294365      ! number of variables 
     
    308379 
    309380      DEALLOCATE( & 
    310          & surf%cvars     & 
    311          & ) 
     381         & surf%cvars, & 
     382         & surf%clong, & 
     383         & surf%cunit, & 
     384         & surf%cgrid  & 
     385         & ) 
     386 
     387      ! Dellocate additional/extra variables metadata 
     388 
     389      DEALLOCATE( & 
     390         & surf%caddvars, & 
     391         & surf%caddlong, & 
     392         & surf%caddunit, & 
     393         & surf%cextvars, & 
     394         & surf%cextlong, & 
     395         & surf%cextunit  & 
     396         ) 
    312397 
    313398   END SUBROUTINE obs_surf_dealloc 
     
    343428      INTEGER :: ji 
    344429      INTEGER :: jk 
     430      INTEGER :: jadd 
    345431      LOGICAL, DIMENSION(:), ALLOCATABLE :: llvalid 
    346432 
     
    361447 
    362448      IF ( lallocate ) THEN 
    363          CALL obs_surf_alloc( newsurf,  insurf, surf%nvar, & 
     449         CALL obs_surf_alloc( newsurf,  insurf, surf%nvar, surf%nadd, & 
    364450            & surf%nextra, surf%nstp, surf%npi, surf%npj ) 
    365451      ENDIF 
     
    410496               newsurf%rmod(insurf,jk)  = surf%rmod(ji,jk) 
    411497                
     498               DO jadd = 1, surf%nadd 
     499                  newsurf%radd(insurf,jadd,jk) = surf%radd(ji,jadd,jk) 
     500               END DO 
     501                
    412502            END DO 
    413503 
     
    435525      newsurf%nstp     = surf%nstp 
    436526      newsurf%cvars(:) = surf%cvars(:) 
     527      newsurf%clong(:) = surf%clong(:) 
     528      newsurf%cunit(:) = surf%cunit(:) 
     529      newsurf%cgrid(:) = surf%cgrid(:) 
     530      newsurf%caddvars(:) = surf%caddvars(:) 
     531      newsurf%caddlong(:) = surf%caddlong(:) 
     532      newsurf%caddunit(:) = surf%caddunit(:) 
     533      newsurf%cextvars(:) = surf%cextvars(:) 
     534      newsurf%cextlong(:) = surf%cextlong(:) 
     535      newsurf%cextunit(:) = surf%cextunit(:) 
    437536       
    438537      ! Set gridded stuff 
     
    470569      INTEGER :: jj 
    471570      INTEGER :: jk 
     571      INTEGER :: jadd 
    472572 
    473573      ! Copy data from surf to old surf 
     
    504604            oldsurf%robs(jj,jk)  = surf%robs(ji,jk) 
    505605            oldsurf%rmod(jj,jk)  = surf%rmod(ji,jk) 
     606                
     607            DO jadd = 1, surf%nadd 
     608               oldsurf%radd(jj,jadd,jk) = surf%radd(ji,jadd,jk) 
     609            END DO 
    506610 
    507611         END DO 
  • NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_write.F90

    r15089 r15180  
    5454CONTAINS 
    5555 
    56    SUBROUTINE obs_wri_prof( profdata, padd, pext ) 
     56   SUBROUTINE obs_wri_prof( profdata, clfiletype, padd, pext ) 
    5757      !!----------------------------------------------------------------------- 
    5858      !! 
     
    7777      !! * Arguments 
    7878      TYPE(obs_prof), INTENT(INOUT) :: profdata      ! Full set of profile data 
    79       TYPE(obswriinfo), OPTIONAL :: padd             ! Additional info for each variable 
    80       TYPE(obswriinfo), OPTIONAL :: pext             ! Extra info 
     79      CHARACTER(LEN=25), INTENT(IN) :: clfiletype    ! Base name for file name 
     80      TYPE(obswriinfo), OPTIONAL    :: padd          ! Additional info for each variable 
     81      TYPE(obswriinfo), OPTIONAL    :: pext          ! Extra info 
    8182 
    8283      !! * Local declarations 
    8384      TYPE(obfbdata) :: fbdata 
    8485      CHARACTER(LEN=40) :: clfname 
    85       CHARACTER(LEN=10) :: clfiletype 
    8686      CHARACTER(LEN=ilenlong) :: cllongname  ! Long name of variable 
    8787      CHARACTER(LEN=ilenunit) :: clunits     ! Units of variable 
     
    120120      END DO 
    121121 
    122       SELECT CASE ( TRIM(profdata%cvars(1)) ) 
    123       CASE('POTM') 
    124  
    125          clfiletype='profb' 
    126          CALL alloc_obfbdata( fbdata, 2, profdata%nprof, ilevel, & 
    127             &                 1 + iadd, 1 + iext, .TRUE. ) 
    128          fbdata%cname(1)      = profdata%cvars(1) 
    129          fbdata%cname(2)      = profdata%cvars(2) 
    130          fbdata%coblong(1)    = 'Potential temperature' 
    131          fbdata%coblong(2)    = 'Practical salinity' 
    132          fbdata%cobunit(1)    = 'Degrees centigrade' 
    133          fbdata%cobunit(2)    = 'PSU' 
    134          fbdata%cextname(1)   = 'TEMP' 
    135          fbdata%cextlong(1)   = 'Insitu temperature' 
    136          fbdata%cextunit(1)   = 'Degrees centigrade' 
    137          fbdata%caddlong(1,1) = 'Model interpolated potential temperature' 
    138          fbdata%caddlong(1,2) = 'Model interpolated practical salinity' 
    139          fbdata%caddunit(1,1) = 'Degrees centigrade' 
    140          fbdata%caddunit(1,2) = 'PSU' 
    141          fbdata%cgrid(:)      = 'T' 
    142          DO je = 1, iext 
    143             fbdata%cextname(1+je) = pext%cdname(je) 
    144             fbdata%cextlong(1+je) = pext%cdlong(je,1) 
    145             fbdata%cextunit(1+je) = pext%cdunit(je,1) 
    146          END DO 
    147          DO ja = 1, iadd 
    148             fbdata%caddname(1+ja) = padd%cdname(ja) 
    149             DO jvar = 1, 2 
     122      CALL alloc_obfbdata( fbdata, profdata%nvar, profdata%nprof, ilevel, & 
     123            &                 1 + iadd, iext, .TRUE. ) 
     124      fbdata%caddname(1)   = 'Hx' 
     125      DO jvar = 1, profdata%nvar 
     126         fbdata%cname(jvar)      = profdata%cvars(jvar) 
     127         fbdata%coblong(jvar)    = profdata%clong(jvar) 
     128         fbdata%cobunit(jvar)    = profdata%cunit(jvar) 
     129         fbdata%cgrid(jvar)      = profdata%cgrid(jvar) 
     130         fbdata%caddlong(1,jvar) = 'Model interpolated ' // TRIM(profdata%clong(jvar)) 
     131         fbdata%caddunit(1,jvar) = profdata%cunit(jvar) 
     132         IF (iadd > 0) THEN 
     133            DO ja = 1, iadd 
     134               fbdata%caddname(1+ja) = padd%cdname(ja) 
    150135               fbdata%caddlong(1+ja,jvar) = padd%cdlong(ja,jvar) 
    151136               fbdata%caddunit(1+ja,jvar) = padd%cdunit(ja,jvar) 
    152137            END DO 
    153          END DO 
    154  
    155       CASE('UVEL') 
    156  
    157          clfiletype='velfb' 
    158          CALL alloc_obfbdata( fbdata, 2, profdata%nprof, ilevel, 1, 0, .TRUE. ) 
    159          fbdata%cname(1)      = profdata%cvars(1) 
    160          fbdata%cname(2)      = profdata%cvars(2) 
    161          fbdata%coblong(1)    = 'Zonal velocity' 
    162          fbdata%coblong(2)    = 'Meridional velocity' 
    163          fbdata%cobunit(1)    = 'm/s' 
    164          fbdata%cobunit(2)    = 'm/s' 
    165          DO je = 1, iext 
    166             fbdata%cextname(je) = pext%cdname(je) 
    167             fbdata%cextlong(je) = pext%cdlong(je,1) 
    168             fbdata%cextunit(je) = pext%cdunit(je,1) 
    169          END DO 
    170          fbdata%caddlong(1,1) = 'Model interpolated zonal velocity' 
    171          fbdata%caddlong(1,2) = 'Model interpolated meridional velocity' 
    172          fbdata%caddunit(1,1) = 'm/s' 
    173          fbdata%caddunit(1,2) = 'm/s' 
    174          fbdata%cgrid(1)      = 'U'  
    175          fbdata%cgrid(2)      = 'V' 
    176          DO ja = 1, iadd 
    177             fbdata%caddname(1+ja) = padd%cdname(ja) 
    178             fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 
    179             fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 
    180          END DO 
    181  
    182       END SELECT 
    183        
    184       IF ( ( TRIM(profdata%cvars(1)) /= 'POTM' ) .AND. & 
    185          & ( TRIM(profdata%cvars(1)) /= 'UVEL' ) ) THEN 
    186          CALL alloc_obfbdata( fbdata, 1, profdata%nprof, ilevel, & 
    187             &                 1 + iadd, iext, .TRUE. ) 
    188          fbdata%cname(1)      = profdata%cvars(1) 
    189          fbdata%coblong(1)    = cllongname 
    190          fbdata%cobunit(1)    = clunits 
    191          fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(cllongname) 
    192          fbdata%caddunit(1,1) = clunits 
    193          fbdata%cgrid(:)      = clgrid 
    194          DO je = 1, iext 
    195             fbdata%cextname(je) = pext%cdname(je) 
    196             fbdata%cextlong(je) = pext%cdlong(je,1) 
    197             fbdata%cextunit(je) = pext%cdunit(je,1) 
    198          END DO 
    199          DO ja = 1, iadd 
    200             fbdata%caddname(1+ja) = padd%cdname(ja) 
    201             fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 
    202             fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 
    203          END DO 
    204       ENDIF 
    205  
    206       fbdata%caddname(1)   = 'Hx' 
    207  
    208       WRITE(clfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc 
     138         ENDIF 
     139         IF (iext > 0) THEN 
     140            DO je = 1, iext 
     141               fbdata%cextname(je) = pext%cdname(je) 
     142               fbdata%cextlong(je) = pext%cdlong(je,1) 
     143               fbdata%cextunit(je) = pext%cdunit(je,1) 
     144            END DO 
     145         ENDIF 
     146      END DO 
     147!fbdata%cextname(1)   = 'TEMP' 
     148!fbdata%cextlong(1)   = 'Insitu temperature' 
     149!fbdata%cextunit(1)   = 'Degrees centigrade' 
     150 
     151      WRITE(clfname, FMT="(A,'fb_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc 
    209152 
    210153      IF(lwp) THEN 
     
    274217               ENDIF 
    275218               fbdata%iobsk(ik,jo,jvar)  = profdata%var(jvar)%mvk(jk) 
    276                DO ja = 1, iadd 
    277                   fbdata%padd(ik,jo,1+ja,jvar) = & 
    278                      & profdata%var(jvar)%vext(jk,padd%ipoint(ja)) 
    279                END DO 
    280                DO je = 1, iext 
    281                   fbdata%pext(ik,jo,1+je) = & 
    282                      & profdata%var(jvar)%vext(jk,pext%ipoint(je)) 
    283                END DO 
    284                IF ( ( jvar == 1 ) .AND. & 
    285                   & ( TRIM(profdata%cvars(1)) == 'POTM' ) ) THEN 
    286                   fbdata%pext(ik,jo,1) = profdata%var(jvar)%vext(jk,1) 
    287                ENDIF  
     219               IF (iadd > 0) THEN 
     220                  DO ja = 1, iadd 
     221                     fbdata%padd(ik,jo,1+ja,jvar) = & 
     222                        & profdata%var(jvar)%vadd(jk,padd%ipoint(ja)) 
     223                  END DO 
     224               ENDIF 
     225! MOVE OUTSIDE JVAR LOOP? 
     226               IF (iext > 0) THEN 
     227                  DO je = 1, iext 
     228                     fbdata%pext(ik,jo,je) = & 
     229                        & profdata%vext(jk,pext%ipoint(je)) 
     230                  END DO 
     231               ENDIF 
     232!IF ( ( jvar == 1 ) .AND. & 
     233!   & ( TRIM(profdata%cvars(1)) == 'POTM' ) ) THEN 
     234!   fbdata%pext(ik,jo,1) = profdata%var(jvar)%vext(jk,1) 
     235!ENDIF  
    288236            END DO 
    289237         END DO 
    290238      END DO 
    291239 
    292       IF ( TRIM(profdata%cvars(1)) == 'POTM' ) THEN 
    293          ! Convert insitu temperature to potential temperature using the model 
    294          ! salinity if no potential temperature 
    295          DO jo = 1, fbdata%nobs 
    296             IF ( fbdata%pphi(jo) < 9999.0 ) THEN 
    297                DO jk = 1, fbdata%nlev 
    298                   IF ( ( fbdata%pob(jk,jo,1) >= 9999.0 ) .AND. & 
    299                      & ( fbdata%pdep(jk,jo) < 9999.0 ) .AND. & 
    300                      & ( fbdata%padd(jk,jo,1,2) < 9999.0 ) .AND. & 
    301                      & ( fbdata%pext(jk,jo,1) < 9999.0 ) ) THEN 
    302                      zpres = dep_to_p( REAL(fbdata%pdep(jk,jo),wp), & 
    303                         &              REAL(fbdata%pphi(jo),wp) ) 
    304                      fbdata%pob(jk,jo,1) = potemp( & 
    305                         &                     REAL(fbdata%padd(jk,jo,1,2), wp),  & 
    306                         &                     REAL(fbdata%pext(jk,jo,1), wp), & 
    307                         &                     zpres, 0.0_wp ) 
    308                   ENDIF 
    309                END DO 
    310             ENDIF 
    311          END DO 
    312       ENDIF 
     240!IF ( TRIM(profdata%cvars(1)) == 'POTM' ) THEN 
     241!   ! Convert insitu temperature to potential temperature using the model 
     242!   ! salinity if no potential temperature 
     243!   DO jo = 1, fbdata%nobs 
     244!      IF ( fbdata%pphi(jo) < 9999.0 ) THEN 
     245!         DO jk = 1, fbdata%nlev 
     246!            IF ( ( fbdata%pob(jk,jo,1) >= 9999.0 ) .AND. & 
     247!               & ( fbdata%pdep(jk,jo) < 9999.0 ) .AND. & 
     248!               & ( fbdata%padd(jk,jo,1,2) < 9999.0 ) .AND. & 
     249!               & ( fbdata%pext(jk,jo,1) < 9999.0 ) ) THEN 
     250!               zpres = dep_to_p( REAL(fbdata%pdep(jk,jo),wp), & 
     251!                  &              REAL(fbdata%pphi(jo),wp) ) 
     252!               fbdata%pob(jk,jo,1) = potemp( & 
     253!                  &                     REAL(fbdata%padd(jk,jo,1,2), wp),  & 
     254!                  &                     REAL(fbdata%pext(jk,jo,1), wp), & 
     255!                  &                     zpres, 0.0_wp ) 
     256!            ENDIF 
     257!         END DO 
     258!      ENDIF 
     259!   END DO 
     260!ENDIF 
    313261 
    314262      ! Write the obfbdata structure 
     
    322270   END SUBROUTINE obs_wri_prof 
    323271 
    324    SUBROUTINE obs_wri_surf( surfdata, padd, pext ) 
     272   SUBROUTINE obs_wri_surf( surfdata, clfiletype, padd, pext ) 
    325273      !!----------------------------------------------------------------------- 
    326274      !! 
     
    342290 
    343291      !! * Arguments 
    344       TYPE(obs_surf), INTENT(INOUT) :: surfdata         ! Full set of surface data 
    345       TYPE(obswriinfo), OPTIONAL :: padd               ! Additional info for each variable 
    346       TYPE(obswriinfo), OPTIONAL :: pext               ! Extra info 
     292      TYPE(obs_surf), INTENT(INOUT) :: surfdata      ! Full set of surface data 
     293      CHARACTER(LEN=25), INTENT(IN) :: clfiletype    ! Base name for file name 
     294      TYPE(obswriinfo), OPTIONAL    :: padd          ! Additional info for each variable 
     295      TYPE(obswriinfo), OPTIONAL    :: pext          ! Extra info 
    347296 
    348297      !! * Local declarations 
    349298      TYPE(obfbdata) :: fbdata 
    350299      CHARACTER(LEN=40) :: clfname         ! netCDF filename 
    351       CHARACTER(LEN=10) :: clfiletype 
    352300      CHARACTER(LEN=ilenlong) :: cllongname  ! Long name of variable 
    353301      CHARACTER(LEN=ilenunit) :: clunits     ! Units of variable 
     
    357305      INTEGER :: ja 
    358306      INTEGER :: je 
     307      INTEGER :: jvar 
    359308      INTEGER :: iadd 
    360309      INTEGER :: iext 
     
    374323      CALL init_obfbdata( fbdata ) 
    375324 
    376       SELECT CASE ( TRIM(surfdata%cvars(1)) ) 
    377       CASE('SLA') 
    378           
    379          ! SLA needs special treatment because of MDT, so is all done here 
    380          ! Other variables are done more generically 
    381          ! No climatology for SLA, MDT is our best estimate of that and is already output. 
    382  
    383          CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, & 
    384             &                 2 + iadd, 1 + iext, .TRUE. ) 
    385  
    386          clfiletype = 'slafb' 
    387          fbdata%cname(1)      = surfdata%cvars(1) 
    388          fbdata%coblong(1)    = 'Sea level anomaly' 
    389          fbdata%cobunit(1)    = 'Metres' 
    390          fbdata%cextname(1)   = 'MDT' 
    391          fbdata%cextlong(1)   = 'Mean dynamic topography' 
    392          fbdata%cextunit(1)   = 'Metres' 
    393          DO je = 1, iext 
    394             fbdata%cextname(je) = pext%cdname(je) 
    395             fbdata%cextlong(je) = pext%cdlong(je,1) 
    396             fbdata%cextunit(je) = pext%cdunit(je,1) 
    397          END DO 
    398          fbdata%caddlong(1,1) = 'Model interpolated SSH - MDT' 
    399          fbdata%caddunit(1,1) = 'Metres'  
    400          fbdata%caddname(2)   = 'SSH' 
    401          fbdata%caddlong(2,1) = 'Model Sea surface height' 
    402          fbdata%caddunit(2,1) = 'Metres' 
    403          fbdata%cgrid(1)      = 'T' 
    404          DO ja = 1, iadd 
    405             fbdata%caddname(2+ja) = padd%cdname(ja) 
    406             fbdata%caddlong(2+ja,1) = padd%cdlong(ja,1) 
    407             fbdata%caddunit(2+ja,1) = padd%cdunit(ja,1) 
    408          END DO 
    409  
    410       CASE('SST') 
    411  
    412          clfiletype = 'sstfb' 
    413          cllongname = 'Sea surface temperature' 
    414          clunits    = 'Degree centigrade' 
    415          clgrid     = 'T' 
    416           
    417       CASE('ICECONC') 
    418  
    419          clfiletype = 'sicfb' 
    420          cllongname = 'Sea ice concentration' 
    421          clunits    = 'Fraction' 
    422          clgrid     = 'T' 
    423  
    424       CASE('SSS') 
    425  
    426          clfiletype = 'sssfb' 
    427          cllongname = 'Sea surface salinity' 
    428          clunits    = 'psu' 
    429          clgrid     = 'T' 
    430  
    431       CASE DEFAULT 
    432  
    433          CALL ctl_stop( 'Unknown observation type '//TRIM(surfdata%cvars(1))//' in obs_wri_surf' ) 
    434  
    435       END SELECT 
    436  
    437       ! SLA needs special treatment because of MDT, so is done above 
    438       ! Remaining variables treated more generically 
    439  
    440       IF ( TRIM(surfdata%cvars(1)) /= 'SLA' ) THEN 
    441        
    442          CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, & 
     325      CALL alloc_obfbdata( fbdata, surfdata%nvar, surfdata%nsurf, 1, & 
    443326            &                 1 + iadd, iext, .TRUE. ) 
    444  
    445          fbdata%cname(1)      = surfdata%cvars(1) 
    446          fbdata%coblong(1)    = cllongname 
    447          fbdata%cobunit(1)    = clunits 
    448          DO je = 1, iext 
    449             fbdata%cextname(je) = pext%cdname(je) 
    450             fbdata%cextlong(je) = pext%cdlong(je,1) 
    451             fbdata%cextunit(je) = pext%cdunit(je,1) 
    452          END DO         
    453          IF ( TRIM(surfdata%cvars(1)) == 'ICECONC' ) THEN 
    454             fbdata%caddlong(1,1) = 'Model interpolated ICE' 
    455          ELSE 
    456             fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1)) 
    457          ENDIF 
    458          fbdata%caddunit(1,1) = clunits 
    459          fbdata%cgrid(1)      = clgrid 
    460          DO ja = 1, iadd 
    461             fbdata%caddname(1+ja) = padd%cdname(ja) 
    462             fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 
    463             fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 
    464          END DO 
    465       ENDIF 
    466  
    467327      fbdata%caddname(1)   = 'Hx' 
    468  
    469       WRITE(clfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc 
     328      DO jvar = 1, surfdata%nvar 
     329         fbdata%cname(jvar)      = surfdata%cvars(jvar) 
     330         fbdata%coblong(jvar)    = surfdata%clong(jvar) 
     331         fbdata%cobunit(jvar)    = surfdata%cunit(jvar) 
     332         fbdata%cgrid(jvar)      = surfdata%cgrid(jvar) 
     333         fbdata%caddlong(1,jvar) = 'Model interpolated ' // TRIM(surfdata%clong(jvar)) 
     334         fbdata%caddunit(1,jvar) = surfdata%cunit(jvar) 
     335         IF (iadd > 0) THEN 
     336            DO ja = 1, iadd 
     337               fbdata%caddname(1+ja) = padd%cdname(ja) 
     338               fbdata%caddlong(1+ja,jvar) = padd%cdlong(ja,jvar) 
     339               fbdata%caddunit(1+ja,jvar) = padd%cdunit(ja,jvar) 
     340            END DO 
     341         ENDIF 
     342         IF (iext > 0) THEN 
     343            DO je = 1, iext 
     344               fbdata%cextname(je) = pext%cdname(je) 
     345               fbdata%cextlong(je) = pext%cdlong(je,1) 
     346               fbdata%cextunit(je) = pext%cdunit(je,1) 
     347            END DO 
     348         ENDIF 
     349      END DO 
     350!fbdata%cname(1)      = surfdata%cvars(1) 
     351!fbdata%coblong(1)    = 'Sea level anomaly' 
     352!fbdata%cobunit(1)    = 'Metres' 
     353!fbdata%cextname(1)   = 'MDT' 
     354!fbdata%cextlong(1)   = 'Mean dynamic topography' 
     355!fbdata%cextunit(1)   = 'Metres' 
     356!fbdata%caddname(2)   = 'SSH' 
     357!fbdata%caddlong(2,1) = 'Model Sea surface height' 
     358!fbdata%caddunit(2,1) = 'Metres' 
     359!IF ( TRIM(surfdata%cvars(1)) == 'ICECONC' ) THEN 
     360!   fbdata%caddlong(1,1) = 'Model interpolated ICE' 
     361!ELSE 
     362!   fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1)) 
     363!ENDIF 
     364 
     365      WRITE(clfname, FMT="(A,'fb_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc 
    470366 
    471367      IF(lwp) THEN 
     
    514410            &           surfdata%nyea(jo), & 
    515411            &           fbdata%ptim(jo),   & 
    516             &           krefdate = 19500101 ) 
    517          fbdata%padd(1,jo,1,1) = surfdata%rmod(jo,1) 
    518          IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) fbdata%padd(1,jo,2,1) = surfdata%rext(jo,1) 
    519          fbdata%pob(1,jo,1)    = surfdata%robs(jo,1)  
     412            &           krefdate = 19500101 )  
    520413         fbdata%pdep(1,jo)     = 0.0 
    521414         fbdata%idqc(1,jo)     = 0 
    522415         fbdata%idqcf(:,1,jo)  = 0 
    523          IF ( surfdata%nqc(jo) > 255 ) THEN 
    524             fbdata%ivqc(jo,1)       = 4 
    525             fbdata%ivlqc(1,jo,1)    = 4 
    526             fbdata%ivlqcf(1,1,jo,1) = 0 
     416         DO jvar = 1, surfdata%nvar 
     417            fbdata%padd(1,jo,1,jvar) = surfdata%rmod(jo,jvar) 
     418!IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) fbdata%padd(1,jo,2,1) = surfdata%rext(jo,1) 
     419            fbdata%pob(1,jo,jvar)    = surfdata%robs(jo,jvar) 
     420            IF ( surfdata%nqc(jo) > 255 ) THEN 
     421               fbdata%ivqc(jo,jvar)       = 4 
     422               fbdata%ivlqc(1,jo,jvar)    = 4 
     423               fbdata%ivlqcf(1,1,jo,jvar) = 0 
    527424!$AGRIF_DO_NOT_TREAT 
    528             fbdata%ivlqcf(2,1,jo,1) = IAND(surfdata%nqc(jo),b'0000000011111111') 
     425               fbdata%ivlqcf(2,1,jo,jvar) = IAND(surfdata%nqc(jo),b'0000000011111111') 
    529426!$AGRIF_END_DO_NOT_TREAT 
    530          ELSE 
    531             fbdata%ivqc(jo,1)       = surfdata%nqc(jo) 
    532             fbdata%ivlqc(1,jo,1)    = surfdata%nqc(jo) 
    533             fbdata%ivlqcf(:,1,jo,1) = 0 
    534          ENDIF 
    535          fbdata%iobsk(1,jo,1)  = 0 
    536          IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) fbdata%pext(1,jo,1) = surfdata%rext(jo,2) 
    537          DO ja = 1, iadd 
    538             fbdata%padd(1,jo,2+ja,1) = & 
    539                & surfdata%rext(jo,padd%ipoint(ja)) 
     427            ELSE 
     428               fbdata%ivqc(jo,jvar)       = surfdata%nqc(jo) 
     429               fbdata%ivlqc(1,jo,jvar)    = surfdata%nqc(jo) 
     430               fbdata%ivlqcf(:,1,jo,jvar) = 0 
     431            ENDIF 
     432            fbdata%iobsk(1,jo,jvar)  = 0 
     433!IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) fbdata%pext(1,jo,1) = surfdata%rext(jo,2) 
     434            IF (iadd > 0) THEN 
     435               DO ja = 1, iadd 
     436                  fbdata%padd(1,jo,1+ja,jvar) = & 
     437                     & surfdata%radd(jo,padd%ipoint(ja),jvar) 
     438               END DO 
     439            ENDIF 
    540440         END DO 
    541          DO je = 1, iext 
    542             fbdata%pext(1,jo,1+je) = & 
    543                & surfdata%rext(jo,pext%ipoint(je)) 
    544          END DO 
     441         IF (iext > 0) THEN 
     442            DO je = 1, iext 
     443               fbdata%pext(1,jo,je) = & 
     444                  & surfdata%rext(jo,pext%ipoint(je)) 
     445            END DO 
     446         ENDIF 
    545447      END DO 
    546448 
Note: See TracChangeset for help on using the changeset viewer.