!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
!

      SUBROUTINE SETERR 1,10
#if defined (DOC)
*
*s/r SETERR -SET OBSERVATION ERROR
*
*Author  : P. Koclas *CMC/AES  February 1995
*Revision: C. Charette - ARMA/AES - Jul 95.
*                      - Correct obs err for asdar,satob,airep.
*                        Add obs err for synop automatic, acars
*Revision: P. Koclas *CMC/AES - August 95.
*                      -ALLOW HUMSAT FAMILY
*          P. Koclas *CMC/AES - April 96
*                       -contents of comstdev  now in comstato
*                       -initialize NCMOEC index in ROBDATA
*                       -More legible output to NULOUT file
*          S. Pellerin *ARMA/AES - Sept 97
*                       -Introduction of type OZ
*          C. Charette *ARMA/AES - Sept 98
*                       -Pressures in Pascal
*          J. Halle    *CMDA/AES - Oct 1999
*                       -added TOVS observation errors
*          C. Charette *ARMA/AES - Jun 2000
*                       -added obs error for surface elements
*          P. Koclas   *CMC/CMDA  September  2000
*                       -vertical interpolation of upper-air obs error
*          J. Halle    *CMDA/SMC - Dec 2000
*                       -TOVS lvel 1B data
*          JM Belanger *CMDA/SMC - june 2001
*                       -32 bits conversion
*          R. Sarrazin *CMDA/CMC - July 2001
*                       -include idburp 188
*          C. Charette *ARMA/AES - Nov 2001
*                       -call abort3d if obserr variance negative
*          J. Halle    *CMDA/SMC - Ma 2002
*                       -adapt to RTTOV7
*        . N. Wagneur  *MSC/CMC  June 2002
*                       -added GOES observation errors
*          J. St-James *CMDA/SMC - July 2003
*                       -add Profiler observation error
*          JM Belanger *CMDA/SMC - dec 2003
*                       -Define Quikscat observation errors
*        . R. Sarrazin *CMC March 2004.
*                       -satwinds errors in 10 layers
*        . D. Anselmo  *MSC/ARMA October 2004.
*                       -add artificial observation error for atmospheric
*                        and surface ln q values added to CMA.
*          J.M. Aparicio *ARMA/MSC* October 2006
*                      - Adapt for GPSRO
*          R. Sarrazin, Nov 2006
*                       -add condition to set AI family ES error
*          S. Macpherson *ARMA/MRD September 2007
*                       -added ground-based GPS observation errors
*
**    Purpose:
*             -set observation errors for each data
*              in CMA.
*
*Arguments
*     none
*
#endif
      IMPLICIT NONE
*implicits
*
#include "comlun.cdk"
#include "comcst.cdk"
#include "cvcord.cdk"
#include "comdimo.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "comstato.cdk"
#include "partov.cdk"
#include "comtov.cdk"
#include "comtovst.cdk"
#include "cparamgoes.cdk"
#include "comgoes.cdk"
#include "comgoesst.cdk"
#include "comnumbr.cdk"
#include "comgpsgb.cdk"
*
C
C NOTE: YSFERRWGT IN COMGPSGB.CDK (FROM NML FILE) IS USED HERE FOR ERROR WEIGHTING
C       OF TIME SERIES (FGAT) GPS MET OBSERVATIONS PS, TS, DPDS (ORIGINALLY DESIGNED
C       FOR SHIFTPROF OPTION (NOT USED -- LSHIFT = .FALSE. IN NML)
C-----------------------------------------------------------------------
C
      INTEGER JN,JDATA,JJO
      INTEGER ITYP,IFLG,IASS,IDATYP,ILEM,ITY,ilyr
      INTEGER IDATA,IDATEND,IFIND,IDBURP,ITECH,ISAT,ILVL
      INTEGER ILAT1,ILAT2
      INTEGER ILANSEA,ISRCHEQ,INDXREG,INDXCLD,INDXM
      INTEGER INDXSAT,ICHN,ISATNO
      INTEGER ICHN,IPLATF,INSTR,IPLATFORM,INSTRUM
      REAL*8 DELTAP, DELTAPMIN
      REAL*8 ZLAT, ZLON, ZFACTOR, ZTORAD, H, NAPP, NERR
      REAL*8 ZLEV,ZFACT,ZLVL,ZCONGZ,ZVAL,zpb,zpt,zwb,zwt,zcof1,zcof2
      logical llinterp, LLBAD
      CHARACTER*2 SENSORTYPE
C
C     FOR GB-GPS OBSERVATIONS
C     ==========================================================================
      LOGICAL LLCZTDE, LLFER, LLFZTDE, LLZTD, LLRZTDE
      REAL*8  ZTDERR, ZZTD, ZMINZDE
      INTEGER IZTDJ
C
C     REGRESSION EQUATION CONSTANTS FOR ZTD ERROR (SD(O-P)) -- CUBIC FIT
C     - FROM OCTOBER 2004 SD(O-P) AND MEAN ZTD STATISTICS OF NOAA/FSL SITES
C     ---------------------------------------------------------------------------
C
      REAL*8 Z3, Z2, Z1, ZC
      DATA Z3, Z2, Z1, ZC /160.38, -1009.1, 2115.4, -1464.6/
C
C     ZZDERMIN = MIN ZTD OER VALUE (M), ZZFERREJ = MAX FERR VALUE (M) FOR REJECTION
C     ZTDERFAC = MULTIPLICATION FACTOR FOR FORMAL ZTD MEASUREMENT ERROR
C     ZOPEFAC  = FRACTION OF REGRESSION EQUATION SD(O-P) TO USE AS ZTD OBSERVATION ERROR
C     ----------------------------------------------------------------------------------
C
      REAL*8 ZZDERMIN, ZZFERREJ, ZTDERFAC, ZOPEFAC
      DATA ZZDERMIN /0.012D0/
      DATA ZZFERREJ /0.015D0/
      DATA ZTDERFAC /3.0D0/
      DATA ZOPEFAC  /1.0D0/
C     ==========================================================================
C
 221  CONTINUE
C
      WRITE(NULOUT,'(10X,"SUBROUTINE SETERR")')
      WRITE(NULOUT,'(10X,"-----------------",/)')
      WRITE(NULOUT,'(10X,"***********************************")')
      WRITE(NULOUT,'(10X," SET OBSERVATION ERRORS:",/)')
      WRITE(NULOUT,'(10X,"***********************************")')
C
      LLCZTDE = .FALSE.
      LLRZTDE = .FALSE.
      LLFZTDE = .FALSE.
      IF (YZTDERR .LT. 0.0) THEN
         LLFZTDE = .TRUE.
      ELSE IF (YZTDERR .GT. 0.0) THEN
         LLCZTDE = .TRUE.
      ELSE
         LLRZTDE = .TRUE.
      ENDIF
C
C
C     SET STANDARD DEVIATION ERRORS FOR EACH DATA FAMILY
C     ---------------------------------------------------
C
 100  CONTINUE
      ZFACT=VCONV
      ZCONGZ=10.D0*RG
      ZTORAD=1.D0/(RPI/180.D0)
      LLBAD = .FALSE.
      DO JJO = 1, NOBTOT
         IDATA     = MOBHDR(NCMRLN,JJO)
         IDATEND   = MOBHDR(NCMNLV,JJO) + IDATA - 1
         IDATYP    = MOBHDR(NCMOTP,JJO)
         ILANSEA   = MOBHDR(NCMOFL,JJO)
         ZLAT      = ROBHDR(NCMLAT,JJO)
         ZLON      = ROBHDR(NCMLON,JJO)
         ITY       = MOBHDR(NCMITY,JJO)
         IDBURP    = MOD(ITY,1000)
         ITY       = ITY/1000
         IPLATF    = MOD(ITY,1000)
         ITY       = ITY/1000
         ITECH     = MOD(ITY,1000)
         INSTR     = MOD(MOBHDR(NCMBOX,JJO),10000)
         LLZTD     = .FALSE.
         LLFER     = .FALSE.
         ZTDERR    = -1.0
         DO JDATA  = IDATA, IDATEND
            ITYP   = MOBDATA(NCMVNM,JDATA)
            IFLG   = MOBDATA(NCMFLG,JDATA)
            IASS   = MOBDATA(NCMASS,JDATA)
            ILEM   = IFIND(ITYP)
            ZVAL   = ROBDATA8(NCMVAR,JDATA)
C
            IF ( IASS .EQ. 1 .OR. CFAMTYP(IDATYP) .EQ. 'GP') THEN
C
C***********************************************************************
C   UPPER AIR DATA
C***********************************************************************
C
              IF ( (CFAMTYP(IDATYP) .EQ. 'UA') ) THEN
                  CALL LATID(ZFACTOR,ILAT1,ILAT2,ZLAT)
                  ILVL=0
                  ZLEV=ROBDATA8(NCMPPP,JDATA)
                  DO JN =1,JPRLEV
                     ZLVL=SIGN(1.0D0,(ZLEV- FLOAT(NILV(JN)) ) )
                     ILVL=ILVL + MAX(0.0D0,ZLVL)
                  END DO
C
                  IF(ZLAT*ZTORAD .GE. 30. )THEN
                     MOBDATA(NCMOEC,JDATA)=1
                  ELSEIF(ZLAT*ZTORAD.GT.-30..AND.ZLAT*ZTORAD.LT.30.)THEN
                     MOBDATA(NCMOEC,JDATA)=1
                  ELSE
                     MOBDATA(NCMOEC,JDATA)=1
                  ENDIF
C
                  IF ( (ITYP .EQ. NEUS) .OR. (ITYP .EQ. NEVS) )THEN
                    ROBDATA8(NCMOER,JDATA)= XSFCOBERR(ILEM,1,IDBURP)
                  ELSE IF (ITYP .EQ. NETS) THEN
                    ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                  ELSE IF (ITYP .EQ. NESS) THEN
                    ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                  ELSE IF (ITYP .EQ. NEPS ) THEN
                    ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                  ELSE IF (ITYP .EQ. NEPN ) THEN
                    ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                  ELSE
C
C                  *****************************************************************
C                  INTERPOLATE VERTICALLY AND HORIZONTALLY THE RAOB ERROR STATISTICS
C                  *****************************************************************
C
C    ----------------------------
C 2. FIND THE INTERPOLATION LAYER
C    ----------------------------
                    if ( zlev .le. nilv(1) ) then
                     ilyr=1
                     llinterp=.false.
                    else if ( zlev .ge. nilv(jprlev) ) then
                     ilyr=jprlev
                     llinterp=.false.
                    else
                     DO JN =1,JPRLEV-1
                       if ( float(nilv(jn)) .le.  zlev .and. float(nilv(jn+1)) .gt. zlev )  then
                         ilyr=jn
                         llinterp=.true.
                      endif
                     END DO
                    endif
C    ---------------------------
C 2. DO THE INTERPOLATIONS
C    ---------------------------
                    if ( llinterp) then
                       ZPT  = nilv(ilyr)
                       ZPB  = nilv(ilyr+1)
                       ZWB  = LOG(ZLEV/ZPT)/LOG(ZPB/ZPT)
                       ZWT  = 1.0D0 - ZWB
                       zcof1=zwt*XOSTDEV(ILEM,ilyr,ILAT1) + zwb*XOSTDEV(ILEM,ilyr+1,ILAT1)
                       zcof2=zwt*XOSTDEV(ILEM,ilyr,ILAT2) + zwb*XOSTDEV(ILEM,ilyr+1,ILAT2)
                       ROBDATA8(NCMOER,JDATA)=(1.0D0-ZFACTOR)*zcof1 + ZFACTOR*zcof2
                    else
                       ROBDATA8(NCMOER,JDATA)=(1.0D0-ZFACTOR)*XOSTDEV
     +                 (ILEM,ilyr,ILAT1) + ZFACTOR*XOSTDEV(ILEM,ilyr,ILAT2)
                    endif

ccc debug debut
ccc       print *,' seterr:IDBURP,ITYP,ILEM,ilvl,lat1,lat2,'
ccc     &                  ,'fact,XOSTDEV(1),XOSTDEV(2) '
ccc     &            ,IDBURP,ITYP,ILEM,ilvl,ilat1,ilat2,ZFACTOR
ccc     &           ,XOSTDEV(ILEM,ILVL,ILAT1),XOSTDEV(ILEM,ILVL,ILAT2)
ccc debug fin
                  ENDIF
                  IF( (ITYP .EQ. NEES) .AND. (NINT(ZVAL) .EQ. 30) )THEN
                    ROBDATA8(NCMOER,JDATA) = ROBDATA8(NCMOER,JDATA)
     +                                       *SQRT(1.8D0)
                  ENDIF
C
C***********************************************************************
C   TOVS DATA
C***********************************************************************
C
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'TO' ) THEN
                  IF ( ITYP .EQ. NBT1 .OR.
     S                 ITYP .EQ. NBT2 .OR.
     S                 ITYP .EQ. NBT3     )THEN
                     ICHN    = NINT(ROBDATA8(NCMPPP,JDATA))
                     INDXM = ILANSEA
                     IF (INDXM .EQ. 2 ) INDXM = 0
                     INDXREG = ISRCHEQ(MLISREG,NREGST,INDXM)
                     INDXCLD = ISRCHEQ(MLISCLD,NCLDST,ITECH)
                     CALL MAP_SAT(IPLATF,IPLATFORM,ISAT)
                     CALL MAP_INSTRUM(INSTR,INSTRUM,SENSORTYPE)
                     DO JN = 1, NSENSORS
                        IF ( IPLATFORM .EQ. PLATFORM  (JN) .AND.
     &                       ISAT      .EQ. SATELLITE (JN) .AND.
     &                       INSTRUM   .EQ. INSTRUMENT(JN)      ) THEN
                           ROBDATA8(NCMOER,JDATA) =
     S                         TOVERRST(ICHN,INDXCLD,INDXREG,JN)

                        ENDIF
                     ENDDO
                  ENDIF
C
C***********************************************************************
C   GOES DATA
C***********************************************************************
C
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'GO' ) THEN
                  IF ( ITYP .EQ. NBT1 .OR.
     S                 ITYP .EQ. NBT2 .OR.
     S                 ITYP .EQ. NBT3     )THEN
                     ICHN    = NINT(ROBDATA8(NCMPPP,JDATA))
                     INDXREG = ISRCHEQ(MLISREGGO,NREGSTGO,ILANSEA)
                     INDXCLD = ISRCHEQ(MLISCLDGO,NCLDSTGO,ITECH)
C
C*                   Currently processed satellite
C*                   N.B.: 252=GOES08, 253=GOES09, 254=GOES10,
C*                   255=GOES11, 256=GOES12, etc...
C
                     ISATNO  = IPLATF - 244
C
                     INDXSAT = ISRCHEQ(NIDSATGO,NSATGO,ISATNO)
                     ROBDATA8(NCMOER,JDATA) =
     S                   GOERRST(ICHN,INDXCLD,INDXREG,INDXSAT)
                  ENDIF
C
C***********************************************************************
C   GPS RO DATA
C***********************************************************************
C
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'RO' ) THEN
C     
C     *              Process only refractivity data (codtyp 169)
C
                  IF ( MOD(MOBHDR(NCMITY,JJO),1000) .EQ. 169 ) THEN
                     IF ( ITYP .EQ. NEPS ) THEN
                        ROBDATA8(NCMOER,JDATA) = 50.
                     ENDIF
                     IF ( ITYP .EQ. 12001) THEN
                        ROBDATA8(NCMOER,JDATA) = 10.
                     ENDIF
                     IF ( ITYP .EQ. 15036) THEN
C     
C     *                 Observation-estimated geopotential height:
C
cc                        H = ROBDATA8(NCMPPP,JDATA)
C
C     *                 Gross approximation to the refractivity:
C
cc                        IF ( H .LE. 10000 ) THEN
cc                           NAPP = EXP( 5.75 - H/8000. )
cc                        ELSE
cc                           NAPP = EXP( 4.5 - (H-10000.)/6400. )
cc                        ENDIF
C     
C     *                 Observation error    S
C     
cc                        ROBDATA8(NCMOER,JDATA) = 0.05 * NAPP
                        ROBDATA8(NCMOER,JDATA) = 1001.
                     ENDIF
                  ENDIF
C
C***********************************************************************
C   ALL GPS GROUND-BASED DATA (SFC MET AND ZTD) ASSIMILATED OR NOT
C***********************************************************************
C
C
C   GPS SFC MET ERRORS ARE SET TO SYNO SFC OBS ERRORS FROM S/R SUCOVO
C   AND WEIGHTED BY FACTOR YSFERRWGT FOR 3D-VAR FGAT OR 4D-VAR ASSIM.
C   OF TIME-SERIES (YSFERRWGT = 1.0 FOR NORMAL 3D-VAR WITH 3D THINNING)
C
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'GP' ) THEN
C*                Psfc Error (Pa)
                  IF ( ITYP .EQ. NEPS ) THEN
                     ROBDATA8(NCMOER,JDATA) = 75. * YSFERRWGT
                  ENDIF
C*                Tsfc Error (K)
                  IF ( ITYP .EQ. NETS ) THEN
                     ROBDATA8(NCMOER,JDATA) = 2.0 * YSFERRWGT
                  ENDIF
C*                T-Td Error (K)
                  IF ( ITYP .EQ. NESS ) THEN
                     ROBDATA8(NCMOER,JDATA) = 3.0 * YSFERRWGT
                  ENDIF
C*                ZTD Error Error (DUMMY VALUE so 3DVar won't abort)
                  IF ( ITYP .EQ. NEFE ) THEN
                     ROBDATA8(NCMOER,JDATA) = 0.001
                     LLFER = .TRUE.
                     ZTDERR = ZVAL
                  ENDIF
C*                ZTD Error
                  IF ( ITYP .EQ. NEZD ) THEN
                     IF ( LLCZTDE) ROBDATA8(NCMOER,JDATA) = YZTDERR
                     ZZTD = ZVAL
                     IZTDJ = JDATA
                     LLZTD = .TRUE.
                  ENDIF
C
C***********************************************************************
C   ACARS, ASDAR,ADS, SATOB AIREP DATA
C***********************************************************************
C
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'AI'
     &              .OR. CFAMTYP(IDATYP) .EQ. 'SW') THEN
                  ZLEV=ROBDATA8(NCMPPP,JDATA)
C
C    SATOB
C
                  IF ( IDBURP .EQ. 88 .OR. IDBURP .EQ. 188 ) THEN

                    DELTAPMIN = ABS(LOG(ZLEV*RPATMB)-LOG(XSTDEVLV(1,2)))
                    ILYR = 1
                    DO JN = 2, 10
                      DELTAP = ABS(LOG(ZLEV*RPATMB)-LOG(XSTDEVLV(JN,2)))
                      IF ( DELTAP < DELTAPMIN ) THEN
                        DELTAPMIN = DELTAP
                        ILYR = JN
                      END IF
                    END DO

                    IF ((ITYP .EQ. NEUU) .OR. (ITYP .EQ. NEVV))THEN
                        ROBDATA8(NCMOER,JDATA)=XSTDEVLV(ILYR,1)
                    ELSE IF (ITYP .EQ. NETT )THEN
                         ROBDATA8(NCMOER,JDATA)= SQRT(XSTDEV(4,1))
                    ENDIF
C
C     AIREP
C
                  ELSE IF (IDBURP .EQ. 128 ) THEN
                      IF ((ITYP .EQ. NEUU) .OR. (ITYP .EQ. NEVV))THEN
                        IF (  ZLEV .LT. 500.*RMBTPA ) THEN
                          ROBDATA8(NCMOER,JDATA)=RMSKNT*SQRT(XSTDEV(2,2))
                        ELSE
                          ROBDATA8(NCMOER,JDATA)=RMSKNT*SQRT(XSTDEV(1,2))
                        ENDIF
                      ELSE IF (ITYP .EQ. NETT )THEN
                         ROBDATA8(NCMOER,JDATA)= SQRT(XSTDEV(4,2))
                      ELSE IF (ITYP .EQ. NEES )THEN
                         ROBDATA8(NCMOER,JDATA)= SQRT(XSTDEV(5,2))
                      ENDIF
C
C     ASDAR, ACARS + ADS
C
                  ELSE IF (IDBURP .EQ. 42 .OR. IDBURP .EQ. 157 .OR. IDBURP .EQ. 177) THEN
                     IF ((ITYP .EQ. NEUU) .OR. (ITYP .EQ. NEVV))THEN
                        IF (  ZLEV .LT. 500.*RMBTPA ) THEN
                          ROBDATA8(NCMOER,JDATA)=RMSKNT*SQRT(XSTDEV(2,3))
                        ELSE
                          ROBDATA8(NCMOER,JDATA)=RMSKNT*SQRT(XSTDEV(1,3))
                       ENDIF
                     ELSE IF (ITYP .EQ. NETT )THEN
                          ROBDATA8(NCMOER,JDATA)= SQRT(XSTDEV(4,3))
                     ELSE IF (ITYP .EQ. NEES )THEN
                          ROBDATA8(NCMOER,JDATA)= SQRT(XSTDEV(5,3))
                     ENDIF
                  ENDIF
C
C***********************************************************************
C   SURFACE DATA
C***********************************************************************
C
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'SF' ) THEN
C
C                 SYNOP AND SHIP NON-AUTOMATIQUE
C
ccc debug debut
ccc          print *,' seterr:IDBURP,ITYP,ILEM,XSFCOBERR ',IDBURP,ITYP,ILEM
ccc     &           ,XSFCOBERR(ILEM,1,IDBURP)
ccc debug fin
                  IF ( (IDBURP .EQ. 12) .OR. (IDBURP .EQ. 13) ) THEN
                     IF ( (ITYP .EQ. NEUS) .OR. (ITYP .EQ. NEVS) )THEN
                        ROBDATA8(NCMOER,JDATA)= XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NETS) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NESS) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NEPS ) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NEPN ) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF ( (ITYP .EQ. NEUU) .OR. (ITYP .EQ. NEVV) )THEN
                        ROBDATA8(NCMOER,JDATA)=RMSKNT*SQRT(XSTDEV(1,4))
                     ELSE IF (ITYP .EQ. NEGZ) THEN
                        ROBDATA8(NCMOER,JDATA)=ZCONGZ*SQRT(XSTDEV(3,4))
                     ELSE IF (ITYP .EQ. NETT) THEN
                        ROBDATA8(NCMOER,JDATA)=SQRT(XSTDEV(4,4))
                     ELSE IF (ITYP .EQ. NEES) THEN
                        ROBDATA8(NCMOER,JDATA)=SQRT(XSTDEV(5,4))
                     ENDIF
C
C                 DRIBU AND DRIFTER
C
                  ELSE IF( (IDBURP .EQ. 14) .OR. (IDBURP .EQ. 18) )THEN
                     IF ( (ITYP .EQ. NEUS) .OR. (ITYP .EQ. NEVS) )THEN
                        ROBDATA8(NCMOER,JDATA)= XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NETS) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NESS) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NEPS ) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NEPN ) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF ( (ITYP .EQ. NEUU) .OR. (ITYP .EQ. NEVV) )THEN
                        ROBDATA8(NCMOER,JDATA)=RMSKNT*SQRT(XSTDEV(1,4))
                     ELSE IF (ITYP .EQ. NEGZ) THEN
                        ROBDATA8(NCMOER,JDATA)=ZCONGZ*SQRT(XSTDEV(3,4))
                     ELSE IF (ITYP .EQ. NETT) THEN
                        ROBDATA8(NCMOER,JDATA)=SQRT(XSTDEV(4,4))
                     ELSE IF (ITYP .EQ. NEES) THEN
                        ROBDATA8(NCMOER,JDATA)=SQRT(XSTDEV(5,4))
                     ENDIF
C
C                 STATION AUTOMATIQUE, PATROL SHIPS
C
                  ELSE IF((IDBURP .GE. 145) .AND. (IDBURP .LE. 147))THEN
                     IF ( (ITYP .EQ. NEUS) .OR. (ITYP .EQ. NEVS) )THEN
                        ROBDATA8(NCMOER,JDATA)= XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NETS) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NESS) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NEPS ) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF (ITYP .EQ. NEPN ) THEN
                        ROBDATA8(NCMOER,JDATA)=XSFCOBERR(ILEM,1,IDBURP)
                     ELSE IF ( (ITYP .EQ. NEUU) .OR. (ITYP .EQ. NEVV) )THEN
                        ROBDATA8(NCMOER,JDATA)=RMSKNT*SQRT(XSTDEV(1,4))
                     ELSE IF (ITYP .EQ. NEGZ) THEN
                        ROBDATA8(NCMOER,JDATA)=ZCONGZ*SQRT(XSTDEV(3,4))
                     ELSE IF (ITYP .EQ. NETT) THEN
                        ROBDATA8(NCMOER,JDATA)=SQRT(XSTDEV(4,4))
                     ELSE IF (ITYP .EQ. NEES) THEN
                        ROBDATA8(NCMOER,JDATA)=SQRT(XSTDEV(5,4))
                     ENDIF
                  ENDIF
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'SC' ) THEN
                 ROBDATA8(NCMOER,JDATA)= XSFCOBERR(ILEM,1,IDBURP)
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'TO' ) THEN
                 ILVL=INT(ROBDATA8(NCMPPP,JDATA))
                 ROBDATA8(NCMOER,JDATA)= 1.0D0
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'OZ' ) THEN
                 ROBDATA8(NCMOER,JDATA)=
     s                0.6D0*ROBDATA8(NCMVAR,JDATA)
C
C                 SATEMS
C
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'ST' ) THEN
                  ILVL=0
                  ZLEV=ROBDATA8(NCMPPP,JDATA)
                  DO JN =1,JPSALEV
                     ZLVL=SIGN(1.0D0,(ZLEV-NISLV(JN)) )
                     ILVL=ILVL + MAX(0.0D0,ZLVL)
                  END DO
                  IF ( (ITECH .EQ. 1) .OR. (ITECH .EQ. 4) ) THEN
                     ROBDATA8(NCMOER,JDATA)= XSATDEV(ILVL,1)
                     MOBDATA(NCMOEC,JDATA)= 1
                  ELSE IF ( (ITECH .EQ. 2) .OR. (ITECH .EQ. 3) ) THEN
                     ROBDATA8(NCMOER,JDATA)= XSATDEV(ILVL,2)
                     MOBDATA(NCMOEC,JDATA)= 2
                  ELSE
                     ROBDATA8(NCMOER,JDATA)= XSATDEV(ILVL,1)
                     MOBDATA(NCMOEC,JDATA)= 1
                  ENDIF
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'HU' ) THEN
               ELSE IF ( CFAMTYP(IDATYP) .EQ. 'PR' ) THEN
                     ROBDATA8(NCMOER,JDATA)= 2.2
               ELSE
                  WRITE(NULOUT,*)' UNKNOWN DATA FAMILY:',CFAMTYP(IDATYP)
               ENDIF
C
C***********************************************************************
C              Check for case where error should have been set but was
C              not. 3dvar will abort in this case.
C***********************************************************************
C
               IF (CFAMTYP(IDATYP) .NE. 'GP') THEN
                 IF(ROBDATA8(NCMOER,JDATA) .LE. 0.0) THEN
                    LLBAD = .TRUE.
                 ENDIF
C
               ELSE
C  GP FAMILY CASE
                 IF (IASS .EQ. 1) THEN
                   IF ((.NOT. LLZTD) .AND. ROBDATA8(NCMOER,JDATA) .LE. 0.0) THEN
                     LLBAD = .TRUE.
                   ENDIF
                   IF ((LLZTD .AND. LLCZTDE) .AND. ROBDATA8(NCMOER,JDATA) .LE. 0.0) THEN
                     LLBAD = .TRUE.
                   ENDIF
                 ENDIF
               ENDIF
C
               IF (LLBAD) THEN
                 WRITE(NULOUT,*)'  PROBLEM OBSERR VARIANCE FAM= '
     &              ,CFAMTYP(IDATYP)
                  WRITE(NULOUT,
     &               '(1X,"STNID= ",A10,"IDBURP= ",I5," LAT= ",F10.2
     &              ," LON = ",F10.2)')
     &              CSTNID(JJO),IDBURP,ZLAT*ZTORAD,ZLON*ZTORAD
                  WRITE(NULOUT,'(1X,"ELEMENT= ",I6," LEVEL= ",F10.2,
     &              " OBSERR = ",E10.2)')
     &              ITYP,ROBDATA8(NCMPPP,JDATA),ROBDATA8(NCMOER,JDATA)
               ENDIF

            ELSE

c  set artificial obs errors for ln q.
              IF ( CFAMTYP(IDATYP) .EQ. 'UA'  .AND.
     &             ( ITYP          .EQ. NEHU  .OR.
     &               ITYP          .EQ. NEHS ) ) THEN
                 ROBDATA8(NCMOER,JDATA) = 888.0
              ENDIF
C           end of assim=1 or GP family IF
            ENDIF
C
C        end of JDATA loop over observed elements at a location (obs)
         END DO
C
C    ------------------------------------------------------
C    SET THE GB-GPS ZTD ERROR
C    ------------------------------------------------------
C
         IF ( CFAMTYP(IDATYP) .EQ. 'GP' ) THEN
            IF ( .NOT. LLCZTDE ) THEN
              IF (LLZTD) THEN
C             Compute minimum ZTD error as a function of ZTD using regression
C             statistics SD(O-P)
              ZMINZDE = Z3*ZZTD**3 + Z2*ZZTD**2 + Z1*ZZTD + ZC
              ZMINZDE = ZMINZDE * ZOPEFAC * 0.001
                IF (LLRZTDE) THEN
                  ROBDATA8(NCMOER,IZTDJ) = MAX(ZZDERMIN, ZMINZDE)
                ELSE
                  IF (LLFER) THEN
                    ROBDATA8(NCMOER,IZTDJ) = MAX(ZZDERMIN, ZTDERR*ZTDERFAC)
                  ELSE
                    ROBDATA8(NCMOER,IZTDJ) = MAX(ZZDERMIN, ZMINZDE)
                  ENDIF
                ENDIF
              ENDIF
            ENDIF
C  *** APPLY TIME-SERIES WEIGHTING FACTOR TO OBSERVATION ERROR (YZDERRWGT=1 FOR 3D-VAR)
            IF (LLZTD) ROBDATA8(NCMOER,IZTDJ) = ROBDATA8(NCMOER,IZTDJ)*YZDERRWGT
         ENDIF
C     end of JJO loop over locations (obs)
      END DO
C
 400  CONTINUE
      IF(LLBAD) THEN
        WRITE(NULOUT,*)'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
        WRITE(NULOUT,*)' Warning 3DV:seterr: PROBLEM OBSERR VARIANCE'
     &       ,' SEE LISTING FOR MORE DETAILS'
        WRITE(NULOUT,*)'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
        CALL ABORT3D(NULOUT,'SETERR:PROBLEM OBSERR VARIANCE.')
      ENDIF
      WRITE(NULOUT,'(10X,"DONE SETERR")')
      WRITE(NULOUT,'(10X,"-----------------",/)')
      RETURN
      END