!-------------------------------------- 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 BGCDATA(PJO,CDFAM) 9,4
#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.
* S. Macpherson ARMA September 2009
* -added separate error check for GP family (GB-GPS)
* -added more output information from routine
* -added GP family specific output
*
** 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 "cvcord.cdk"
#include "comcst.cdk"
#include "combgchk.cdk"
#include "comnumbr.cdk"
#include "comgpsgb.cdk"
*
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. IT IS APPLIED
C (ALONG WITH YZDERRWGT FOR ZTD) IN S/R SETERR AS A MULT. FACTOR TO ERRORS.
C YZDERRWGT AND YSFERRWGT = 1 FOR NORMAL 3D-VAR (3D-THINNING).
C
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
INTEGER INOBS, INREJ, INZOBS, INZREJ
INTEGER INPOBS, INTOBS, INDOBS, INPREJ, INTREJ, INDREJ
REAL*8 ZOER,ZOMP,ZFGE,ZBGCHK,ZVAR,ZLEV,ZLAT,ZLON,ZSOP
LOGICAL LLOK, LLZD, LMODIF1020
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,a74)')' STNID LATITU LONGITU ID Elem Level ',
+' Value Sigmao Sigmap O-P SigmaOP qcflag '
WRITE(NULOUT,'(a55,a74)')' ----- ------ ------- -- ---- ----- ',
+' ----- ------ ------ --- ------- ------ '
icoun=0
zsum=0.
zsumo=0.
PJO=-99.99
INOBS=0
INREJ=0
C
C* Initialize counters for GP family observations
C
IF (CDFAM .EQ. 'GP') THEN
INZOBS=0
INPOBS=0
INTOBS=0
INDOBS=0
INZREJ=0
INPREJ=0
INTREJ=0
INDREJ=0
ENDIF
C
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
INOBS = INOBS + 1
IF (CDFAM .EQ. 'GP') THEN
IF (ITYP .EQ. NEZD) INZOBS = INZOBS+1
IF (ITYP .EQ. NEPS) INPOBS = INPOBS+1
IF (ITYP .EQ. NETS) INTOBS = INTOBS+1
IF (ITYP .EQ. NESS) INDOBS = INDOBS+1
ENDIF
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 BACK GROUND CHECK
C
ZOMP =-ROBDATA(NCMOMF,JDATA)*ROBDATA(NCMOER,JDATA)
ZFGE = ROBDATA(NCMFGE,JDATA)
IF ( CDFAM .EQ. 'GP' ) THEN
IF (ITYP .EQ. NEZD) THEN
ZOER = ZOER/YZDERRWGT
ELSE
ZOER = ZOER/YSFERRWGT
ENDIF
IF (ZFGE .LT. 1.E-3 .OR. ZOER .LT. 1.E-3 ) THEN
WRITE(NULOUT,*)' Problem for STNID FGE ZOER=',CSTNID(IOBS),ZFGE,ZOER
CALL ABORT3D
(NULOUT,'BGCDATA: PROBLEM WITH FGE, OER.')
ENDIF
ELSE
IF ( ZFGE**2 + ZOER**2 .LT. 1.e-5)THEN
WRITE(NULOUT,*)' Problem for STNID FGE ZOER=',CSTNID(IOBS),ZFGE,ZOER
ZFGE=1.E-5
ZOER=1.E-5
ENDIF
ENDIF
ZBGCHK=(ZOMP)**2/(ZFGE**2 + ZOER**2)
ibgc=ZBGCHK/1.
ibgc=min(ibgc,99)
ZSOP = SQRT(ZFGE**2 + ZOER**2)
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)
C
C CONVERT ZTD VALUES FROM M TO MM FOR PRINTOUT
C
LLZD = .FALSE.
IF ( CDFAM .EQ. 'GP' .AND. ITYP .EQ. NEZD) THEN
ZVAR = ZVAR * 1000.0
ZOER = ZOER * 1000.0
ZFGE = ZFGE * 1000.0
ZOMP = ZOMP * 1000.0
ZSOP = ZSOP * 1000.0
LLZD = .TRUE.
ENDIF
C
IF (IFLAG .GE. 2 ) THEN
WRITE(NULOUT,122)
& CSTNID(IOBS),zlat,zlon,IDBURP,INAM,ZLEV,ZVAR,ZOER
& ,ZFGE,ZOMP,ZSOP,ZBGCHK,IFLAG
INREJ = INREJ + 1
IF (CDFAM .EQ. 'GP') THEN
IF (ITYP .EQ. NEZD) INZREJ = INZREJ+1
IF (ITYP .EQ. NEPS) INPREJ = INPREJ+1
IF (ITYP .EQ. NETS) INTREJ = INTREJ+1
IF (ITYP .EQ. NESS) INDREJ = INDREJ+1
ENDIF
ENDIF
C
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,7(2x,F11.2),I3 )
C
cpik ENDIF
cpik END DO
ENDIF
END DO
C
IF ( INOBS .GT. 0 ) THEN
WRITE(NULOUT,*)' '
WRITE(NULOUT,*) ' BGCDATA: FINISHED BGCHECK OF ',CDFAM, ' DATA'
WRITE(NULOUT,123) 'BGCDATA: ',INREJ, ' OBSERVATIONS REJECTED OUT OF ', INOBS
WRITE(NULOUT,*)' '
ENDIF
C
IF ( (INOBS .GT. 0) .AND. (CDFAM .EQ. 'GP') ) THEN
WRITE(NULOUT,*)' '
WRITE(NULOUT,*) ' BGCDATA: REPORT FOR GP FAMILY OF OBSERVATIONS'
WRITE(NULOUT,123) 'BGCDATA: ',INZREJ, ' ZTD OBSERVATIONS REJECTED OUT OF ', INZOBS
WRITE(NULOUT,123) 'BGCDATA: ',INPREJ, ' PSFC OBSERVATIONS REJECTED OUT OF ', INPOBS
WRITE(NULOUT,123) 'BGCDATA: ',INTREJ, ' TSFC OBSERVATIONS REJECTED OUT OF ', INTOBS
WRITE(NULOUT,123) 'BGCDATA: ',INDREJ, ' DPDS OBSERVATIONS REJECTED OUT OF ', INDOBS
WRITE(NULOUT,*)' '
ENDIF
C
123 FORMAT(2X,A,I0,A,I0)
C
WRITE(NULOUT,*)' '
WRITE(NULOUT,*)' ---------------------------'
WRITE(NULOUT,*)' DONE BGCDATA '
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