!-------------------------------------- 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 SOBSRAOB 1 #if defined (DOC) * ***s/r SOBSRAOB * *Author : P. Koclas *CMC/AES October 1998 *Revision: C. Charette *ARMA/AES Mar 1999 * - Refine algorithm to recognize sfc observation if present. * Exclude observations considered in the free atmosphere from being * used in the model sfc boundary layer when the topographies * are too far apart. * C. Charette *ARMA/AES Jan 2000 * - Added llprint for diagnostics * C. Charette *ARMA/AES Feb 2000 * - Remove algorithm to recognize sfc observation. It was * always commented out.Keep observations of TT, T-Td * near the surface when the topographies are close * to each other. This was inadvertaintly left out. * C. Charette *ARMA/AES Mar 2000 * - Remove setting of quality control flags 6 and 9 * Added stnid in print of diagnostics * P. Koclas *CMC/CMDA JAN 2000 * -INCLUDE raobadjustt.ftn__Version11002 (ff,DD) elements * -LLPRINT=.FALSE. * -CHANGE HEADER FLAG IN CASE OF REJECT * C. Charette ARMA/AES JUN 2000 * - Added check on type of vertical coordinate * MOBDATA(NCMVCO,)=2 --> PRESSURE COORDINATE is considered * - Move adjustement of surface observations in RAOB * reports to SFCADJUSTZ * ** Purpose: * Refuse elements which are too far away from the surface of the model * Refuse elements which are considered in the free atmosphere of * the RAOB but fall in the surface boundary layer of the model atmosphere. * *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 "cvcord.cdk"
#include "comnumbr.cdk"
* INTEGER JPINEL,JPRANGE PARAMETER(JPINEL=7,JPRANGE=10) INTEGER IJ,J,JD,JF,JOBS,JDATA,IOBS1,IOBS2,IBAD,IFLG LOGICAL LLREJ,LLNOIR,LLSFC(JPINEL),LLALTOK(JPINEL),LLFOUND REAL*8 ZVAL,ZLEV,ZCRIT,ZDIFF,ZDIFALT,ZPCRIT,ZPMAX(JPINEL) REAL*8 ZLAT,ZLON,ZRADDEG,ZGZG,ZSTNALT,ZPB,ZPT,ZDELP INTEGER ITYP,IDATA,IDATEND,IASS,ICOUNT INTEGER ICOUNTAL,ICOUNTAH,ICOUNTBL,ICOUNTBH INTEGER ILEM,IELGZ,IBEGIN,ILAST INTEGER ILISTEL(JPINEL),INDXEL(JPINEL),IFLGEL(JPINEL) INTEGER ITOTACC(JPINEL),ITOTREJ(JPINEL),IKOUNTT INTEGER ISFCACC(JPINEL),ISFCREJ(JPINEL),ISBLREJ(JPINEL) INTEGER IGZACC(JPINEL),IGZREJ(JPINEL),IBNDREJ(JPINEL) INTEGER INEARACC(JPINEL),IRANGE(JPRANGE) REAL*8 ZLMINF(JPRANGE),ZLMSUP(JPRANGE),ZDIFGZ REAL*8 RLISTCRIT(JPINEL),RSBLCRIT(JPINEL),JPMAX(JPINEL) LOGICAL LLPRINT,LLOK DATA RLISTCRIT/50.,50.,50.,50.,50.,50.,800./ DATA RSBLCRIT /5000.0,5000.0,5000.0,5000.0,5000.0,5000.0,5000.0 / DATA ZLMINF /-9999.,-300.,-200.,-100.,-50., & 0.,50.,100.,200.,300./ DATA ZLMSUP /-300.,-200.,-100.,-50., & 0.,50.,100.,200.,300.,9999./ ILISTEL(1)=NEDD ILISTEL(2)=NEFF ILISTEL(3)=NEUU ILISTEL(4)=NEVV ILISTEL(5)=NEES ILISTEL(6)=NETT ILISTEL(7)=NEGZ C C ccc LLPRINT = .TRUE. LLPRINT = .FALSE. C ccc debug ccc print *,'SOBSRAOB: apres llprint:nulout',NULOUT ccc debug WRITE(NULOUT,* ) ' ' WRITE(NULOUT,* ) ' SUBROUTINE SOBSRAOB ' WRITE(NULOUT,* ) ' ' WRITE(NULOUT,* ) '************************************************' WRITE(NULOUT,222)'%UA ELEMENTS ' & ,( ILISTEL(J),J=1,jpinel) WRITE(NULOUT,223)'%UA REJECTION BOUNDARY(METRE) ' & ,(RLISTCRIT(J),J=1,jpinel) WRITE(NULOUT,223)'%UA REJECTION SBL (PASCAL) ' & ,(RSBLCRIT(J),J=1,jpinel) WRITE(NULOUT,* ) '************************************************' WRITE(NULOUT,* ) ' ' IELGZ = ILISTEL(JPINEL) ZRADDEG = 180./RPI C C SET COUNTERS TO ZERO C DO J=1,JPRANGE IRANGE(J) = 0 ENDDO DO J=1,JPINEL ITOTREJ(J)=0 ITOTACC(J)=0 ISFCACC(J)=0 INEARACC(J)=0 ISFCREJ(J)=0 ISBLREJ(J)=0 IGZACC(J)=0 IGZREJ(J)=0 IBNDREJ(J)=0 END DO IKOUNTT=0 ICOUNT =0 ICOUNTAL =0 ICOUNTAH =0 ICOUNTBL =0 ICOUNTBH =0 C C LOOP OVER OBSERVATIONS C DO JF = 1,NFILES IF ( (CFAMTYP(JF) .EQ. 'UA') .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,A10,2x,A2)')'FAMILY = ',CFAMTYP(JF) C C DO JOBS=IOBS1,IOBS2 IDATA = MOBHDR(NCMRLN,JOBS) IDATEND = MOBHDR(NCMNLV,JOBS) + IDATA - 1 ZLAT=ROBHDR(NCMLAT,JOBS)*ZRADDEG ZLON=ROBHDR(NCMLON,JOBS)*ZRADDEG ZSTNALT=ROBHDR(NCMALT,JOBS) ZDIFALT= ZSTNALT- GOMGZHR(NLEVTRL,JOBS)/RG DO J=1,JPINEL LLALTOK(J) = .FALSE. IF(ABS(ZDIFALT).LE.RLISTCRIT(J)) LLALTOK(J)=.TRUE. ENDDO C C--------HEIGHT GZ DO JDATA= IDATA, IDATEND ITYP=MOBDATA(NCMVNM,JDATA) IASS=MOBDATA(NCMASS,JDATA) LLOK = MOBDATA(NCMVCO,JDATA) .EQ. 2 & .AND. ITYP.EQ.ILISTEL(JPINEL) & .AND. IASS.EQ.1 IF (LLOK ) THEN IKOUNTT=IKOUNTT+1 IFLG = MOBDATA(NCMFLG,JDATA) ITYP=MOBDATA(NCMVNM,JDATA) ZDIFF=99999. ZLEV=ROBDATA8(NCMPPP,JDATA) IASS=MOBDATA(NCMASS,JDATA) ZVAL=ROBDATA8(NCMVAR,JDATA) ZDIFF= ( ZVAL-GOMGZHR(NLEVTRL,JOBS) )/RG ZCRIT= -RLISTCRIT(JPINEL) IF ( ZDIFF .LT. 0.0 ) THEN IF(ZDIFF .GE. ZCRIT) THEN ITOTACC(JPINEL)=ITOTACC(JPINEL)+1 IGZACC(JPINEL)=IGZACC(JPINEL)+1 IF(LLPRINT) THEN WRITE(NULOUT,*) 'Keep GZ BELOW MODEL SFC ' & ,JOBS,ITYP,CSTNID(JOBS),ZLAT,ZLON,ZLEV & ,ZVAL/RG,GOMGZHR(NLEVTRL,JOBS)/RG,ZDIFF,ZCRIT ENDIF ELSE IF ( MOBDATA(NCMASS,JDATA) .EQ. 1) THEN MOBDATA(NCMFLG,JDATA)= & ibset( MOBDATA(NCMFLG,JDATA) , 18 ) IF(LLPRINT) THEN WRITE(NULOUT,*)'REJ GZ BELOW MODEL SFC ' & ,JOBS,ITYP,CSTNID(JOBS),ZLAT,ZLON,ZLEV & ,ZVAL/RG,GOMGZHR(NLEVTRL,JOBS)/RG,ZDIFF & ,ZCRIT ENDIF MOBDATA(NCMASS,JDATA)=0 ITOTREJ(JPINEL)=ITOTREJ(JPINEL)+1 IGZREJ(JPINEL)=IGZREJ(JPINEL)+1 ENDIF ENDIF ENDIF ENDIF ENDDO C C REJECT ELEMENTS OF U,V,T-TD,T BELOW THE MODEL SURFACE C AND THOSE NON SURFACE ELEMENTS PRESENT IN THE SURFACE C BOUNDARY LAYER OF THE RAOB OR OF THE MODEL. C AT THIS POINT WE WANT TO KEEP OBSERVATIONS IN THE FREE C ATMOSPHERE C C C--------------Special case if station elevation is above model elevation C we want to define zpt at a level above the station. C To approximate that value, we will transform the difference C between the 2 elevations into a difference in pressure using C the rule of thumb (1Mb =8 metres) C--------------Even though TT(element=12001) is not assimmilated C it is treated as if it were for the evaluation step. C Otherwise we use observations of TT that are too far C from the model topography in the verification. DO JDATA= IDATA, IDATEND ITYP=MOBDATA(NCMVNM,JDATA) IJ = -1 DO J=1,JPINEL-1 IF(ITYP.EQ.ILISTEL(J))IJ = J ENDDO LLOK = MOBDATA(NCMVCO,JDATA) .EQ. 2 & .AND. ITYP .NE.ILISTEL(JPINEL) & .AND. IJ .NE. -1 IF (LLOK ) THEN ZLEV=ROBDATA8(NCMPPP,JDATA) ZPB =GOMPSHR(1,JOBS) ZPT =GOMPSHR(1,JOBS)-RSBLCRIT(IJ) ZDELP = 999999.0 IF (ZDIFALT .GT. 0.0) THEN ZDELP = ZDIFALT * 100. / 8.0 ZPT = GOMPSHR(1,JOBS)-(ZDELP+RSBLCRIT(IJ)) ENDIF IF(LLALTOK(IJ)) THEN C--------------------Model surface and station altitude are very close C Accept observation if zlev is within the domain C of the trial field ZPB = GOMPSHR(1,JOBS) ZPT = RPPOBSHR(NLEVTRL-1,JOBS) IF(LLPRINT) THEN WRITE(NULOUT,*) 'LLALTOK .EQ. .TRUE. ' & ,JOBS,ITYP,CSTNID(JOBS),ZLAT,ZLON,ZLEV & ,GOMPSHR(1,JOBS),RPPOBSHR(NLEVTRL-1,JOBS) & ,ZDIFALT ENDIF ENDIF IF(ZLEV .GT. ZPB ) THEN MOBDATA(NCMFLG,JDATA)= & ibset( MOBDATA(NCMFLG,JDATA) , 18 ) ZGZG = GOMGZHR(NLEVTRL,JOBS)/RG IF(LLPRINT) THEN WRITE(NULOUT,*) 'Rej Obs below model sfc ' & ,JOBS,ITYP,CSTNID(JOBS),ZLAT,ZLON & ,ZLEV,GOMPSHR(1,JOBS) ENDIF MOBDATA(NCMASS,JDATA)=0 ITOTREJ(IJ)=ITOTREJ(IJ)+1 IBNDREJ(IJ)=IBNDREJ(IJ)+1 ELSEIF(ZLEV.LE.ZPB .AND. ZLEV.GT.ZPT ) THEN MOBDATA(NCMFLG,JDATA)= & ibset( MOBDATA(NCMFLG,JDATA) , 18 ) ZGZG = GOMGZHR(NLEVTRL,JOBS)/RG IF(LLPRINT) THEN WRITE(NULOUT,*) '%UA REJ SBL ITYP,DALT ' & ,ITYP,ZDIFALT WRITE(NULOUT,*) 'Reject LEV IN SBL LYR ' & ,JOBS,ITYP,CSTNID(JOBS),ZLAT,ZLON,ZLEV & ,ZPB,ZPT,RSBLCRIT(IJ),ZDELP,ZDIFALT ENDIF MOBDATA(NCMASS,JDATA)=0 ITOTREJ(IJ)=ITOTREJ(IJ)+1 ISBLREJ(IJ)=ISBLREJ(IJ)+1 ENDIF ENDIF END DO END DO C WRITE(NULOUT,* ) ' ' WRITE(NULOUT,* ) '%UA***************************************' WRITE(NULOUT,222 )'%UA ELEMENTS ' & , ( ILISTEL(J),J=1,JPINEL) WRITE(NULOUT,222)'%UA ACC OB NEAR ',(INEARACC(J),J=1,JPINEL) WRITE(NULOUT,222)'%UA ACC GZ EXT ',(IGZACC(J),J=1,JPINEL) WRITE(NULOUT,222)'%UA ACC TOTAL ',(ITOTACC(J),J=1,JPINEL) WRITE(NULOUT,* ) '%UA***************************************' WRITE(NULOUT,222)'%UA REJ GZ EXT ',(IGZREJ(J),J=1,JPINEL) WRITE(NULOUT,222)'%UA REJ OUT BND ',(IBNDREJ(J),J=1,JPINEL) WRITE(NULOUT,222)'%UA REJ SBL ',(ISBLREJ(J),J=1,JPINEL) WRITE(NULOUT,222)'%UA REJ TOTAL ',(ITOTREJ(J),J=1,JPINEL) WRITE(NULOUT,* ) '%UA***************************************' WRITE(NULOUT,* ) ' ' 222 FORMAT(2x,a29,5(2x,i5)) 223 FORMAT(2x,a29,5(2x,f6.0)) 224 FORMAT(2x,a31,2x,I6,2X,I5,2(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,"%UA NUMBER OF DATA ASSIMILATED BY 3D-VAR" & ," AFTER ADJUSTMENTS:",i10)')IKOUNTT WRITE(NULOUT,* ) ' ' RETURN END