!-------------------------------------- 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 SOBSPROF 1
#if defined (DOC)
*
***s/r  SOBSPROF
*
*Author  : J. St-James October 2002
*          - Based on the subroutine sobsraob.  Adapt to
*            Profiler data
*
**    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.
*
*Revision
*           C. Charette ARMA/SMC jan. 2005
*            - Removed debug statements
*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 /400.0,400.0,400.0,400.0,400.0,400.0,400.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
C      LLPRINT = .TRUE.
      LLPRINT = .FALSE.
C
      WRITE(NULOUT,* ) ' '
      WRITE(NULOUT,* ) ' SUBROUTINE SOBSPROF '
      WRITE(NULOUT,* ) ' '
      WRITE(NULOUT,* ) '************************************************'
      WRITE(NULOUT,222)'%PR ELEMENTS                  '
     &     ,(  ILISTEL(J),J=1,jpinel)
      WRITE(NULOUT,223)'%PR REJECTION BOUNDARY(METRE) '
     &     ,(RLISTCRIT(J),J=1,jpinel)
      WRITE(NULOUT,223)'%PR REJECTION SBL (METRE) '
     &     ,(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. 'PR') .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        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. 1
     &                 .AND. ITYP .NE.ILISTEL(JPINEL)
     &                 .AND. IJ .NE. -1
                  IF (LLOK )  THEN
                     ZLEV=ROBDATA8(NCMPPP,JDATA)
                     ZPB =GOMGZHR(NLEVTRL,JOBS)/RG
                     ZPT =GOMGZHR(NLEVTRL,JOBS)/RG + RSBLCRIT(IJ)
                     IF (ZDIFALT .GT. 0.0) THEN
                        ZPT=GOMGZHR(NLEVTRL,JOBS)/RG
     &                        + (ZDIFALT+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 = GOMGZHR(NLEVTRL,JOBS)/RG
                        ZPT = GOMGZHR(NLEVTRL-1,JOBS)/RG
                        IF(LLPRINT) THEN
                           WRITE(NULOUT,*) 'LLALTOK .EQ. .TRUE. '
     &                          ,JOBS,ITYP,CSTNID(JOBS),ZLAT,ZLON,ZLEV
     &                          ,GOMGZHR(NLEVTRL,JOBS)/RG,
     &                          GOMGZHR(NLEVTRL-1,JOBS)/RG,ZDIFALT
                        ENDIF
                     ENDIF
                     IF(ZLEV .LT. 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,GOMGZHR(NLEVTRL-1,JOBS)/RG,ZPT
     &                          ,JDATA,ZPB,ZDIFALT
                        ENDIF
                        MOBDATA(NCMASS,JDATA)=0
                        ITOTREJ(IJ)=ITOTREJ(IJ)+1
                        IBNDREJ(IJ)=IBNDREJ(IJ)+1
                     ELSEIF(ZLEV.GE.ZPB .AND. ZLEV.LT.ZPT ) THEN
                        MOBDATA(NCMFLG,JDATA)=
     &                       ibset( MOBDATA(NCMFLG,JDATA) , 18 )
                        ZGZG = GOMGZHR(NLEVTRL,JOBS)/RG
                        IF(LLPRINT) THEN
                           WRITE(NULOUT,*) '%PR 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,* ) '%PR***************************************'
            WRITE(NULOUT,222 )'%PR ELEMENTS          '
     &           , (  ILISTEL(J),J=1,JPINEL)
            WRITE(NULOUT,222)'%PR ACC OB NEAR ',(INEARACC(J),J=1,JPINEL)
            WRITE(NULOUT,222)'%PR ACC TOTAL   ',(ITOTACC(J),J=1,JPINEL)
            WRITE(NULOUT,* ) '%PR***************************************'
            WRITE(NULOUT,222)'%PR REJ OUT BND ',(IBNDREJ(J),J=1,JPINEL)
            WRITE(NULOUT,222)'%PR REJ SBL     ',(ISBLREJ(J),J=1,JPINEL)
            WRITE(NULOUT,222)'%PR REJ TOTAL   ',(ITOTREJ(J),J=1,JPINEL)
            WRITE(NULOUT,* ) '%PR***************************************'
            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,"%PR NUMBER OF DATA ASSIMILATED BY 3D-VAR"
     &          ," AFTER ADJUSTMENTS:",i10)')IKOUNTT
      WRITE(NULOUT,* ) ' '

      RETURN
      END