SUBROUTINE BGCDATA(PJO,CDFAM) 8,2
#if defined (DOC)
*
***s/r BGCDATA  - Computation OF BACKGROUND CHECK FLAGS
*
*
*Author  : P. Koclas *CMC/CMDA  January 1999
*Revision:
*         P. Koclas February 2002
*          -add argument to isetflag call sequence
*         C. Charette ARMA February 2002
*          -remove conflicting ikount* unit.
*         Y. Yang - Oct. 2004
*            - Switchd order of "cvcord.cdk" and  "comnumbr.cdk"
*              due to the dependence of the former on JPNBRELEM
*         Y.J. Rochon *ARQX March 2006
*            - Added check on ROBDATA(NCMFGE,JDATA)
*         C.Charette *ARMA Oct 2006
*            - Adapted to version V10.0.0 (new combgchk.cdk,new call readnml)
*
**    Purpose:  -Calculate a background check for a data family
*                AND SET the appropriate quality control flags in
*                the CMA
*
*
#endif
      IMPLICIT NONE
*implicits
#include "comlun.cdk"
#include "comdimo.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "comnumbr.cdk"
#include "cvcord.cdk"
#include "comcst.cdk"
#include "combgchk.cdk"
#include "cparbrp.cdk"
*
      REAL*8 PJO,zsum,zsumo
c     REAL*8 PJO
      CHARACTER*2 CDFAM
      INTEGER IFLAG,INAM,ISETFLAG,IOBS,ILEM,IFIND,ITY,IDBURP
      INTEGER IBEGIN,ILAST,ierr,fclos,fnom,ITYP
      INTEGER J,J2,JJ,JD,JDATA,ibgc,icoun
      REAL*8 ZOER,ZOMP,ZFGE,ZBGCHK,ZVAR,ZLEV,ZLAT,ZLON
      LOGICAL LLOK,LMODIF1020
C
C
C     *    .  Read the NAMELIST NAMBGCHK to get user specified BACKGROUND CHECK LIMITS
C     .       -----------------------------------------------------------------------
      CMODEL='GEM'
      lmodif1020=.false.
      CALL READNML('NAMBGCHK',IERR)
      if ( CMODEL(1:8)  .eq. 'GEM-MESO') then
        lmodif1020=.true.
        WRITE(NULOUT,*)'  BACKGROUND CHECK : APPLYING GEM-MESO CRITERIA AT 10-20 Mbs'
      endif
*

      WRITE(NULOUT,*)' '
      WRITE(NULOUT,*)' ------------------------------'
      WRITE(NULOUT,*)'  BACKGROUND CHECK FOR'
      WRITE(NULOUT,*)'       ',CDFAM, ' DATA'
      WRITE(NULOUT,*)' ------------------------------'
      WRITE(NULOUT,*)' '
      WRITE(NULOUT,'(a55,a61)')'  STNID     LATITU LONGITU  ID Elem        Level        ',
     +' Value        Sigmao       Sigmap         O-P          qcflag  '
      WRITE(NULOUT,'(a55,a61)')'  -----     ------ -------  -- ----        -----        ',
     +' -----        ------       ------         ---          ------  '
      icoun=0
      zsum=0.
      zsumo=0.
      PJO=-99.99
      DO J = 1,NFILES
         IF ( (CFAMTYP(J) .EQ.  CDFAM) .AND.( NBEGINTYP(J) .GT. 0) ) THEN
            IBEGIN=NBEGINTYP(J)
             ILAST=NENDTYP(J)
C
C*    1. Computation of (HX - Z)**2/(SIGMAo**2 +SIGMAp**2)
C     .  ----------------------------------------------------
C
 100  CONTINUE
C
            DO JDATA=IBEGIN,ILAST
               ITYP = MOBDATA(NCMVNM,JDATA)
               LLOK=( MOBDATA(NCMASS,JDATA) .EQ. 1)
               IF ( LLOK ) THEN
                  IOBS = MOBDATA(NCMOBS,JDATA)
                  ZVAR = ROBDATA(NCMVAR,JDATA)
                  ZLEV = ROBDATA(NCMPPP,JDATA)
                  ZOER = ROBDATA(NCMOER,JDATA)
                  ZLAT  = ROBHDR(NCMLAT,IOBS)*180./RPI
                  ZLON  = ROBHDR(NCMLON,IOBS)*180./RPI
C
C                 BACKGROUND CHECK
C
                  ZOMP  =-ROBDATA(NCMOMF,JDATA)*ROBDATA(NCMOER,JDATA)
                  IF (ABS(ROBDATA(NCMFGE,JDATA)-PPMIS).LT.0.01*PPMIS) THEN
C                    
C                    May not be available due to obs type.
C
                     ZFGE = 0.0
                  ELSE
                     ZFGE = ROBDATA(NCMFGE,JDATA)
                  END IF
                  IF (ZFGE**2+ZOER**2.LT.1.e-5.and.CFAMTYP(J).NE.'TR')THEN
                     WRITE(NULOUT,*)' Problem for STNID FGE ZOER='
     &                   ,CSTNID(IOBS),ZFGE,ZOER
                     ZFGE=1.E-5
                     ZOER=1.E-5
                  ENDIF
                  ZBGCHK=(ZOMP)**2/(ZFGE**2 + ZOER**2)
                  ibgc=ZBGCHK/1.
                  ibgc=min(ibgc,99)
C
C                 UPDATE QUALITY CONTROL FLAGS
C                 ( ELEMENT FLAGS + GLOBAL HEADER FLAGS)
C
                  IOBS =MOBDATA(NCMOBS,JDATA)
                  INAM =MOBDATA(NCMVNM,JDATA)
                if( inam.eq.12192 .and. MOBDATA(NCMXTR,JDATA).eq.0)then
                   zsum=zsum+zfge*zfge
                   zsumo=zsumo+zoer*zoer
                   icoun=icoun+1
                endif
                  ILEM =IFIND(INAM)
                  ITY=MOBHDR(NCMITY,IOBS)
                  IDBURP=MOD(ITY,1000)
                  IFLAG=ISETFLAG(CDFAM,IDBURP,INAM,ZLEV,ZBGCHK,LMODIF1020)
                  IF(IFLAG .GE. 2 )WRITE(NULOUT      ,122)
     &                 CSTNID(IOBS),zlat,zlon,IDBURP,INAM,ZLEV,ZVAR,ZOER
     &                 ,ZFGE,ZOMP,ZBGCHK,IFLAG
                  IF ( IFLAG .EQ. 1 ) THEN
                     MOBDATA(NCMFLG,JDATA)=IBSET(MOBDATA(NCMFLG,JDATA),13)
                  ELSEIF ( IFLAG .EQ. 2 ) THEN
                     MOBDATA(NCMFLG,JDATA)=IBSET(MOBDATA(NCMFLG,JDATA),14)
                     MOBDATA(NCMFLG,JDATA)=IBSET(MOBDATA(NCMFLG,JDATA),16)
                     MOBDATA(NCMFLG,JDATA)=IBSET(MOBDATA(NCMFLG,JDATA),09)
                     MOBHDR(NCMST1,IOBS)= ibset(MOBHDR(NCMST1,IOBS),06)

                  ELSEIF ( IFLAG .EQ. 3 ) THEN
                     MOBDATA(NCMFLG,JDATA)=IBSET(MOBDATA(NCMFLG,JDATA),15)
                     MOBDATA(NCMFLG,JDATA)=IBSET(MOBDATA(NCMFLG,JDATA),16)
                     MOBDATA(NCMFLG,JDATA)=IBSET(MOBDATA(NCMFLG,JDATA),09)
                     MOBHDR(NCMST1,IOBS)= ibset(MOBHDR(NCMST1,IOBS),06)
                  ENDIF
  444          continue
               ENDIF
C
             END DO
 200  CONTINUE
122   FORMAT(2x,a9,1x,f6.2,1x,f7.2,1x,I3,1x,I5,6(2x,G11.3),I3 )
C
cpik     ENDIF
cpik  END DO
      ENDIF
      END DO
      WRITE(NULOUT,*)' '
      WRITE(NULOUT,*)' ---------------------------'
      WRITE(NULOUT,*)'           DONE             '
      WRITE(NULOUT,*)' ---------------------------'
      WRITE(NULOUT,*)' '
      if ( icoun .gt. 0) then
         write(nulout,*) ' icoun meanfge=',icoun,zsum/icoun
         write(nulout,*) ' icoun meanzoer',icoun,zsumo/icoun
      endif
      RETURN
      END