!-------------------------------------- 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 SETFGESURF 3
#if defined (DOC)
*
***s/r SURFC1DZ  - Computation of Jo and the residuals to the observations
*                 FOR SURFACE DATAFILES
*
*
*Author  : P. Koclas *CMC/AES  September 2000
*Revision:
*         JM Belanger CMDA/SMC Feb 2004
*                   . Introduce "scatterometer family SC"
*          S. Macpherson *ARMA/MRD Sep 2009
*             - exclude GP family ZTD (FGE is set in SETFGEGPS)
*
**    Purpose:  -Interpolate vertically the contents of commvo to
*                the pressure levels of the observations. Then
*                compute Jo.
*                A linear interpolation in ln(p) is performed.
*
*
*Arguments
*
#endif
      IMPLICIT NONE
*implicits
#include "comlun.cdk"
#include "comdim.cdk"
#include "comdimo.cdk"
#include "comphy.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "commvo.cdk"
#include "commvog.cdk"
#include "cvcord.cdk"
#include "comnumbr.cdk"
#include "comfilt.cdk"
*
      INTEGER IPB,IPT,IXTR,IDIM
      INTEGER IOBS,IPOS,IK,IBEGIN,ILAST,JO,IDATA,IDATEND
      INTEGER J,JDATA,IBEGINOB,ILASTOB,ITYP,JJ,ISTYP,JDATA2
      INTEGER ICOUNT,IERR,ILEN,JLIST,JCOUNT,IPOINTR(1)
      REAL*8 ZVAR,ZOER,ZCON,ZINC,ZPHI,ZJON,ZGAMI,ZSLEV,ZQCARG,ZPPOST
      REAL*8 ZWB,ZWT,ZEXP,zexpgz,ZGAMMA,ZTVG,ZPSGOBS
      REAL*8 ZLEV,ZPT,ZPB,ZHHH,ZGAMAZ
      LOGICAL LLOK, LLPRINT,LLUV
      POINTER(PXPOINTR    ,IPOINTR)

C
C     Temperature lapse rate for extrapolation of gz below model surface
C
      LLPRINT = .FALSE.
c        LLPRINT = .TRUE.
      ZGAMMA = 0.0065 / GRAV
      zexp = 1/(RGASD*ZGAMMA)
      zexpgz = (RGASD*ZGAMMA)
C
      DO J = 1,NFILES
         IF ( (CFAMTYP(J) == 'SF') .AND.( NBEGINTYP(J) > 0) .OR.
     &        (CFAMTYP(J) == 'UA') .AND.( NBEGINTYP(J) > 0) .OR.
     &        (CFAMTYP(J) == 'SC') .AND.( NBEGINTYP(J) > 0) .OR.
     &        (CFAMTYP(J) == 'GP') .AND.( NBEGINTYP(J) > 0) )   THEN

c ***** debug *********
c      WRITE(NULOUT,*) 'Setting FGE for SURFACE DATA type ', CFAMTYP(J)
c ***** debug *********
           IBEGIN=NBEGINTYP(J)
           ILAST=NENDTYP(J)
C
C*    1. Computation of (HX - Z)/SIGMA
C     .  -----------------------------
C
 100      CONTINUE
C
C     Process all data within the domain of the model (excluding GB-GPS
C     ZTD and ZTD error data)
C
C
          ILEN = ILAST - IBEGIN +1
          CALL HPALLOC(PXPOINTR,ILEN,IERR,1)
          DO JLIST = 1,NELEMS
            ICOUNT = 0
            DO JDATA=IBEGIN,ILAST
              LLOK=.FALSE.
              IF ( MOBDATA(NCMVCO,JDATA) == 1 ) THEN
                ITYP = MOBDATA(NCMVNM,JDATA)
                IF (ITYP == NETS .OR. ITYP == NEPS .OR.
     &              ITYP == NEPN .OR. ITYP == NESS .OR.
     &              ITYP == NEUS .OR. ITYP == NEVS    ) THEN
                  LLOK=(MOBDATA(NCMASS,JDATA) .EQ. 1 .AND.
     &                 ITYP .EQ. NLIST(JLIST))
                ELSE
                  LLOK=(MOBDATA(NCMASS,JDATA) .EQ. 1 .AND.
     &                 ITYP .EQ. NLIST(JLIST)        .AND.
     &                 MOBDATA(NCMXTR,JDATA)  .ge. 0)
                ENDIF
                IF ( ITYP == NEZD .OR. ITYP == NEFE ) LLOK=.FALSE.
                IF ( LLOK ) THEN
                  ICOUNT = ICOUNT + 1
                  IPOINTR(ICOUNT) = JDATA
                ENDIF
              ENDIF
            ENDDO
C
C-------------- Surface data and data with height vertical coordinate
C
            IF(ICOUNT.GT.0)          THEN
              DO JCOUNT = 1,ICOUNT
                JDATA = IPOINTR(JCOUNT)
                IOBS = MOBDATA(NCMOBS,JDATA)
                ITYP = MOBDATA(NCMVNM,JDATA)
                IPOS = MOBDATA(NCMPOS,JDATA)
                idim=1
                if ( ipos .gt. 5 )idim=0
                IK   = ROBDATA(NCMLYR,JDATA)
                ZLEV = ROBDATA8(NCMPPP,JDATA)
                ZHHH = ZLEV * GRAV

                IF (ITYP == NETS .OR. ITYP == NEPS .OR.
     &              ITYP == NEPN .OR. ITYP == NESS .OR.
     &              ITYP == NEUS .OR. ITYP == NEVS    ) THEN

                  IPT  = IK + IPOS*NFLEV
                  IPB  = IPT+1
                  ROBDATA(NCMFGE,JDATA) = GOMOBS(IPB,IOBS)
c ***** debug *********
c                  write(nulout,*) 'stn,ityp,ipt,ipb,fge'
c                  write(nulout,*) cstnid(iobs),ityp,ipt,ipb,
c     &                            ROBDATA(NCMFGE,JDATA)
c ***** debug *********
                ELSE
                  IPT  = IK + IPOS*NFLEV
                  IPB  = IPT+1
                  ZPT  = GOMGZG(IK,IOBS)
                  ZPB  = GOMGZG(IK+1,IOBS)
                  ZWB  = idim*(ZPT-ZHHH)/(ZPT-ZPB)
                  ZWT  = 1. - ZWB
                  IF ( MOBDATA(NCMXTR,JDATA) .eq. 0) then
                    ROBDATA(NCMFGE,JDATA) = zwb*GOMOBS(IPB,IOBS)
     +                   + ZWT*GOMOBS(IPT,IOBS)
                  ELSE
                    ROBDATA(NCMFGE,JDATA) = GOMOBS(IK + IPOS*NFLEV
     &                   ,IOBS)
                  ENDIF
                if(cstnid(iobs) .eq. '99999999') then
                  write(nulout,*) 'setfgesurf:stn,ityp,xtr,ipt,ipb,zwt,zwb'
     &                 ,cstnid(iobs),ityp,MOBDATA(NCMXTR,JDATA),ipt,ipb
     &                 ,zwt,zwb
                  write(nulout,*) 'setfgesurf:gobs(ipb),gobs(ipt),fge'
     &                 ,GOMOBS(IPB,IOBS),GOMOBS(IPT,IOBS),ROBDATA(NCMFGE
     &                 ,JDATA)
                endif
                ENDIF
              ENDDO
            ENDIF
          ENDDO
          CALL HPDEALLC(PXPOINTR,IERR,1)
C
C
        ENDIF
      END DO
C--------------------------------------------------------------------
      RETURN
      END