!-------------------------------------- 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 SOBSSFC 1 #if defined (DOC) * ***s/r SOBSSFC * *Author : P. Koclas *CMC/AES October 1998 *Revision: C.Charette *ARMA/AES MAR 1999 * - REJECT FLAGS IN CMA * C. Charette *ARMA/AES Jan 2000 * - Added llprint for diagnostics *Revision: P KOCLAS CMC/CMDA JAN 2000 * -CHANGE HEADER FLAG IN CASE OF REJECT * C. Charette *ARMA/AES MAR2000 * - Remove setting of qc flags 6 and 9 * C. Charette *ARMA/AES OCT2000 * - Remove displacement of accepted elements 12203,11215,11216 C to the model surface height when the reported height is C greater than the model surface height. * S. Macpherson *ARMA/MRD Sep 2007 * - Added GPS (GP) family data (met and ZTD). * DZMAX from namelist file is used for ZTD. * ** Purpose: * Refuse elements which are too far away from the surface. * Replace the pressure of elements which are slightly below * the model surface by the pressure of the trial field. * *Arguments: * * none #endif IMPLICIT NONE *implicits #include "comlun.cdk"
#include "comdimo.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "commvohr.cdk"
#include "comcst.cdk"
#include "comfilt.cdk"
#include "cvcord.cdk"
#include "comnumbr.cdk"
#include "comgpsgb.cdk"
* INTEGER JPINEL,JPIDLND PARAMETER(JPINEL=10,JPIDLND=10) INTEGER J,JD,JF,JID,JOBS,JDATA,IOBS1,IOBS2,IBAD,IFLG LOGICAL LLREJ, LLPRINT, LLOK REAL*8 ZVAL,ZLEV,ZLEV2,ZDIFF,ZHHH,ZMODEL INTEGER ITYP,IDATA,IDATEND,IDBURP,ITY INTEGER ILEM,ICRIT,IBEGIN,ILAST INTEGER ILISTEL(JPINEL),IDLND(JPIDLND) INTEGER IKOUNTREA(JPINEL),IKOUNTREJ(JPINEL),IKOUNTT REAL*8 RLISTCRIT(JPINEL) DATA RLISTCRIT/50.,50.,50.,50.,50. & ,800.,800.,800.,800.,1000. / C SYNOP(3) TEMP/PILOT(6) GPS MET(1) DATA IDLND / 12, 14, 146, 32, 35, 135, 136, 137, 138, 189 / C C C RESET DZMAX FOR GB GPS ZTD TO VALUE IN NAMELIST FILE C RLISTCRIT(10) = DZMAX C ILISTEL(1)=NEDS ILISTEL(2)=NEFS ILISTEL(3)=NEUS ILISTEL(4)=NEVS ILISTEL(5)=NESS ILISTEL(6)=NETS ILISTEL(7)=NEPS ILISTEL(8)=NEPN ILISTEL(9)=NEGZ ILISTEL(10)=NEZD C WRITE(NULOUT,* ) ' ' WRITE(NULOUT,* ) ' SUBROUTINE SOBSSFC ' WRITE(NULOUT,* ) ' ' WRITE(NULOUT,* ) '*****************************************************' WRITE(NULOUT,222)'ELEMENTS ',( ILISTEL(J),J=1,jpinel) WRITE(NULOUT,223)'REJECTION BOUNDARY(METRE) ',(RLISTCRIT(J),J=1,jpinel) WRITE(NULOUT,* ) '*****************************************************' WRITE(NULOUT,* ) ' ' LLPRINT = .FALSE. ccc LLPRINT = .TRUE. C C SET COUNTERS TO ZERO C DO J=1,JPINEL IKOUNTREJ(J)=0 IKOUNTREA(J)=0 END DO IKOUNTT=0 C C LOOP OVER OBSERVATIONS C DO JF = 1,NFILES IF ( (CFAMTYP(JF) .EQ. 'SF') .AND.( NBEGINTYP(JF) .GT. 0) .OR. & (CFAMTYP(JF) .EQ. 'UA') .AND.( NBEGINTYP(JF) .GT. 0) .OR. & (CFAMTYP(JF) .EQ. 'GP') .AND.( NBEGINTYP(JF) .GT. 0) ) THEN IBEGIN=NBEGINTYP(JF) ILAST=NENDTYP(JF) IOBS1=MOBDATA(NCMOBS,NBEGINTYP(JF)) IOBS2=MOBDATA(NCMOBS,NENDTYP(JF)) WRITE(NULOUT,'(2x,A9,2x,A2)')'FAMILY = ',CFAMTYP(JF) C C DO JOBS=IOBS1,IOBS2 IF(LLPRINT) THEN ccc CALL PRNTHDR(JOBS,NULOUT) ccc CALL PRNTBDY(JOBS,NULOUT) ENDIF IDATA = MOBHDR(NCMRLN,JOBS) IDATEND = MOBHDR(NCMNLV,JOBS) + IDATA - 1 DO JDATA= IDATA, IDATEND LLOK = MOBDATA(NCMVCO,JDATA) .EQ. 1 IF (LLOK) THEN IKOUNTT=IKOUNTT+1 IFLG = MOBDATA(NCMFLG,JDATA) ITYP=MOBDATA(NCMVNM,JDATA) ITY = MOBHDR(NCMITY,JOBS) IDBURP = MOD(ITY,1000) ZDIFF=99999. IF ( (ITYP .eq. NEGZ) ) THEN LLREJ = .FALSE. DO JD=1,NFLAGS IBAD= 13-NLISTFLG(JD) LLREJ=( BTEST(IFLG,IBAD) ) .OR. LLREJ END DO IF ( .NOT. LLREJ ) THEN ZVAL=ROBDATA8(NCMVAR,JDATA) ZDIFF= ABS( ( ZVAL-GOMGZHR(NLEVTRL,JOBS) )/RG ) ZLEV=ROBDATA8(NCMPPP,JDATA) ENDIF ELSE ZHHH=ROBDATA8(NCMPPP,JDATA) ITYP=MOBDATA(NCMVNM,JDATA) ZDIFF= ABS( ZHHH- GOMGZHR(NLEVTRL,JOBS)/RG ) ZLEV=ROBDATA8(NCMPPP,JDATA) ENDIF ZVAL=ROBDATA8(NCMVAR,JDATA) ITYP=MOBDATA(NCMVNM,JDATA) ZLEV2=ROBDATA8(NCMPPP,JDATA) C C APPLY FILTER TO SELECTED ELEMENTS C DO J=1,JPINEL ICRIT=RLISTCRIT(J) ILEM=ILISTEL(J) IF (ZLEV .EQ. ZLEV2 .AND. ITYP .EQ. ILEM ) THEN IF ( ZDIFF .LE. ICRIT) THEN IF ( MOBDATA(NCMASS,JDATA) .EQ. 1) THEN IKOUNTREA(J)=IKOUNTREA(J)+1 IF(LLPRINT) THEN ZMODEL = GOMGZHR(NLEVTRL,JOBS)/RG write(nulout,*)'Keep OBS:stnid,jobs,ityp,icrit,' & ,'zlev,zhhh,zmodel,zdiff ' & ,CSTNID(JOBS),JOBS,ITYP,ICRIT & ,zlev,zhhh,zmodel,zdiff ENDIF ENDIF ELSE IF ( MOBDATA(NCMASS,JDATA) .EQ. 1) THEN MOBDATA(NCMFLG,JDATA)= & ibset( MOBDATA(NCMFLG,JDATA) , 18 ) IF(LLPRINT) THEN WRITE(NULOUT,225) 'Reject OBS ',JOBS,ITYP & ,CSTNID(JOBS),IDBURP & ,ROBHDR(NCMLAT,JOBS),ROBHDR(NCMLON,JOBS) ENDIF MOBDATA(NCMASS,JDATA)=0 IKOUNTREJ(J)=IKOUNTREJ(J)+1 ENDIF ENDIF ENDIF END DO ENDIF END DO END DO C WRITE(NULOUT,* ) ' ' WRITE(NULOUT,* ) '*****************************************************' WRITE(NULOUT,222 )'ELEMENTS ', ( ILISTEL(J),J=1,JPINEL) WRITE(NULOUT,222)'ACCEPTED ',(IKOUNTREA(J),J=1,JPINEL) WRITE(NULOUT,222)'REJECTED ',(IKOUNTREJ(J),J=1,JPINEL) WRITE(NULOUT,* ) '*****************************************************' WRITE(NULOUT,* ) ' ' 222 FORMAT(2x,a29,10(2x,i5)) 223 FORMAT(2x,a29,10(2x,f5.0)) 224 FORMAT(2x,a17,2x,I6,2X,I5,1x,a9,1x,2(2x,f9.2)) 225 FORMAT(2x,a13,2x,I6,2X,I5,1x,a9,1x,I6,1x,4(2x,f9.2)) C ENDIF END DO C IKOUNTT=0 DO JDATA=1,NDATA IF ( MOBDATA(NCMASS,JDATA) .EQ. 1) IKOUNTT=IKOUNTT+1 END DO WRITE(NULOUT,'(1X," NUMBER OF DATA ASSIMILATED BY 3D" & ,"-VAR AFTER ADJUSTMENTS: ",i10)')IKOUNTT WRITE(NULOUT,* ) ' ' RETURN END