C-----------------------------------------------------------------------
C  GETFCT - INTERPOLATE BACKGROUND PROFILES to the irep report
C           VERTICALLY AND IN TIME
C-----------------------------------------------------------------------
      SUBROUTINE getfct(irep,ibak,fhour,onlysf)

      INCLUDE 'parm.inc'

      LOGICAL onlysf
      LOGICAL latlong, lambert, polarstereo
      COMMON  /counts/ kntgsf
      COMMON /gridef/ imax, jmax, kmax, alat1, elon1, dxx, dyy, elonv, 
     +            alatan, latlong, lambert, polarstereo

      COMMON /guesfc/ psi(mxr,mxb), zsi(mxr,mxb), tsi(mxr,mxb), 
     +            usi(mxr,mxb), vsi(mxr,mxb), qsi(mxr,mxb), 
     +            pmi(mxr,mxb), cpi(mxr,mxb), cni(mxr,mxb),
     +            pxi(mxr,mxb)
      COMMON /guess/ pi(mxl,mxr,mxb), zi(mxl,mxr,mxb), ti(mxl,mxr,mxb),
     +            ui(mxl,mxr,mxb), vi(mxl,mxr,mxb), qi(mxl,mxr,mxb), 
     +            ai(mxl,mxr,mxb)
      real*8 psi,zsi,tsi,usi,vsi,qsi,pmi,cpi,cni,pxi
      real*8 pi,zi,ti,ui,vi,qi,ai

      real*8 bak(10,255)
      REAL*8 hdr(10), cat(255), obs(10,255), qms(10,255)
      REAL*8 adate,vdata,vdate,bdate

      COMMON /observ/ hdr, cat, obs, qms, nlev
      COMMON /vrtfac/ maxprs, vrterp(1200)
      COMMON /vdates/ vdata, vdate(mxb), fhr(mxb), nofo(mxb)
      COMMON /backgv/ bak, nbak

      real*8 p(mxl), z(mxl), t(mxl), u(mxl), v(mxl), q(mxl), a(mxl)

      real*8 f100
c     DATA bmiss /10E10/
      data bmiss /99999997952./
      DATA tzero /273.15/
      DATA betap /.0552/
      DATA beta /.00650/
      DATA rog /29.261/
      DATA g /9.81/
      DATA r /287.05/
      data f100 /100.0/

C-----------------------------------------------------------------------
C-----------------------------------------------------------------------

C  COMPUTE THE TIME INTERPOLATION WEIGHT FOR THIS REPORT
C  -----------------------------------------------------

      IF (ibak.lt.nbak.and.nofo(ibak).ne.1) THEN
        dvhr = mod(vdata,f100)
        fvhr = mod(vdate(ibak),f100)
        IF (fvhr.gt.dvhr) fvhr = dvhr - fvhr + 24.
        timewt = abs((dvhr-fvhr)/(fhr(ibak+1)-fhr(ibak)))
        fhour = fhr(ibak) + abs(dvhr-fvhr)
        in = 1
      ELSE
        timewt = 0.
        fhour = fhr(ibak)
        in = 0
      END IF

      bak = 0

C     TIME INTERPOLATE VALUES FROM ADJACENT FORECAST PROFILES
C     -------------------------------------------------------

      DO it = 0, in
        jbak = ibak + it
        timw = 1 - it - timewt

C       GET GUESS PROFILE AT OB LOCATION
C       --------------------------------

        ps = psi(irep,jbak)
        pm = pmi(irep,jbak)
        zs = zsi(irep,jbak)
        ts = tsi(irep,jbak)
        us = usi(irep,jbak)
        vs = vsi(irep,jbak)
        qs = qsi(irep,jbak)
        cp = cpi(irep,jbak)
        cn = cni(irep,jbak)
        px = pxi(irep,jbak)

        DO k = 1, kmax
          p(k) = pi(k,irep,jbak)
          z(k) = zi(k,irep,jbak)
          t(k) = ti(k,irep,jbak)
c         if(k.eq.1) then
c     print*,'k,irep,jbak,ti(k,irep,jbak)=',k,irep,jbak,ti(k,irep,jbak)
c     print*,'k,p(k),t(k)=',k,p(k),t(k)
c     print*,'t(2),t(3)=',t(2),t(3)
c         endif
          u(k) = ui(k,irep,jbak)
          v(k) = vi(k,irep,jbak)
          q(k) = qi(k,irep,jbak)
c         if(irep.eq.13) then
c          print*,'k,jbak,ai(k,irep,jbak)=',k,jbak,ai(k,irep,jbak)
c         endif
          a(k) = ai(k,irep,jbak)
        END DO
c       print*,'t(2),t(3)=',t(2),t(3)

C       INTERPOLATE GUESS PROFILES TO OB PRESSURES
C       ------------------------------------------

        IF ( onlysf ) THEN
	  lstop = 1
          pfc = psi(irep,jbak)
          pmo = pmi(irep,jbak)
          zob = zsi(irep,jbak)
          tob = tsi(irep,jbak)
          uob = usi(irep,jbak)
          vob = vsi(irep,jbak)
          qob = qsi(irep,jbak)
          IF (pfc.lt.bmiss) THEN
		bak(1,2) = bak(1,2) + pfc * timw
	  ELSE
		bak(1,2) = bmiss
	  END IF
          IF (qob.lt.bmiss) THEN
		bak(2,2) = bak(2,2) + qob * timw * 1.E6
	  ELSE
		bak(2,2) = bmiss
	  END IF
          IF (tob.lt.bmiss) THEN
		bak(3,2) = bak(3,2) + tob * timw - tzero
	  ELSE
		bak(3,2) = bmiss
	  END IF
          IF (zob.lt.bmiss) THEN
		bak(4,2) = bak(4,2) + zob * timw
	  ELSE
		bak(4,2) = bmiss
	  END IF
          IF (uob.lt.bmiss) THEN
		bak(5,2) = bak(5,2) + uob * timw
	  ELSE
		bak(5,2) = bmiss
	  END IF
          IF (vob.lt.bmiss) THEN
		bak(6,2) = bak(6,2) + vob * timw
	  ELSE
		bak(6,2) = bmiss
	  END IF
          IF (pmo.lt.bmiss) THEN
		bak(7,2) = bak(7,2) + pmo * timw
	  ELSE
		bak(7,2) = bmiss
	  END IF
	  IF ( tob.lt.bmiss ) kntgsf = kntgsf + 1
	ELSE
	    lstop = nlev
	END IF	
c       print*,'t(2),t(3)=',t(2),t(3)
C*
        DO l = 1, lstop

          pob = obs(1,l)
c         if(irep.eq.13) print*,'l,obs(2,l)=',l,obs(2,l)
          qob = obs(2,l)
          tob = obs(3,l)
          zob = obs(4,l)
          uob = obs(5,l)
          vob = obs(6,l)
          pmo = obs(7,l)

C         SEA-LEVEL PRESSURE
C         ------------------

          IF ((cat(l).eq.0.or.cat(l).eq.6).and.pm.lt.bmiss) THEN
            pmo = pm
            bak(7,l) = bak(7,l) + pmo * timw
          ELSE
            pmo = bmiss
            bak(7,l) = bmiss
          END IF

C         SURFACE PRESSURE
C         ----------------
          IF (cat(l).eq.0.or.(cat(l).eq.6.and.pm.lt.bmiss)) THEN
            cat(l) = 0
            IF (pob.lt.bmiss) THEN
              pfc = pob
            ELSE IF (zob.lt.bmiss.and.ts.lt.bmiss.and.ps.lt.bmiss.and.zs
     +                  .lt.bmiss) THEN
              dz = zob - zs
              tm = ts - dz * beta * .5
              pfc = ps * exp(-dz/(tm*rog))
            ELSE
              pfc = bmiss
            END IF
          ELSE
            pfc = bmiss
          END IF

C         PSIG IS THE SURFACE (HIGHEST) GUESS PRESSURE
          psig = p(1)

c         if(irep.eq.13) print*,'pob=',pob
c       print*,'t(2),t(3)=',t(2),t(3)
          IF (pob.gt.0..and.pob.lt.bmiss) THEN
            ip = pob
            ip = min(ip,maxprs)
            ip = max(ip,1)

C           SPECIFIC HUMIDITY
C           -----------------

c           if(irep.eq.13) print*,'qob=',qob
c           print*,'qob=',qob
            IF (qob.lt.bmiss) THEN
              lb = vrterp(ip)
              wt = vrterp(ip) - lb
              la = min(lb+1,kmax)
c             if(irep.eq.13) then
c             print*,'la,wt,lb=',la,wt,lb
c             print*,'a(la),a(lb)=',a(la),a(lb)
c             endif
              IF (a(la).lt.bmiss.and.a(lb).lt.bmiss) THEN
                aob = a(lb) + (a(la)-a(lb)) * wt
                qob = exp(aob) * 1.E6
c               print*,'qob=',qob
              ELSE
                qob = bmiss
              END IF
            END IF

C           TEMPERATURE
C           -----------

c       print*,'t(2),t(3)=',t(2),t(3)
c           print*,'tob before=',tob
            IF (tob.lt.bmiss) THEN
c             print*,'pob,psig=',pob,psig
              IF (pob.gt.psig) THEN
c               print*,'t(1),betap,tzero=',t(1),betap,tzero
                tob = t(1) + (pob-psig) * betap - tzero
                IF (t(1).ge.bmiss) tob = bmiss
              ELSE
                lb = vrterp(ip)
                wt = vrterp(ip) - lb
                la = min(lb+1,kmax)
c               print*,'ip,lb,wt,la=',ip,lb,wt,la
c               print*,'t(lb),t(la),tzero=',t(lb),t(la),tzero
                IF (t(la).lt.bmiss.and.t(lb).lt.bmiss) THEN
                  tob = t(lb) + (t(la)-t(lb)) * wt - tzero
                ELSE
                  tob = bmiss
                END IF
              END IF
            END IF
c           print*,'tob=',tob

C           HEIGHT
C           ------

            IF (zob.lt.bmiss) THEN
              IF (pob.gt.psig) THEN
                IF (t(1).lt.bmiss.and.p(1).lt.bmiss) THEN
                  tm = t(1) + (.5*(pob-psig)) * betap
                  zob = z(1) - rog * tm * log(pob/p(1))
                ELSE
                  zob = bmiss
                END IF
              ELSE
                lb = vrterp(ip)
                wt = vrterp(ip) - lb
                la = max(min(lb+1,kmax),1)
                IF (t(la).lt.bmiss.and.t(lb).lt.bmiss.and.p(lb).lt.bmiss
     +                      ) THEN
                  tm = t(lb) + (t(la)-t(lb)) * wt
                  zob = z(lb) - rog * tm * log(pob/p(lb))
                ELSE
                  zob = bmiss
                END IF
              END IF
            END IF

C           U AND V COMPONENTS
C           ------------------

            IF (uob.lt.bmiss.or.vob.lt.bmiss) THEN
              lb = vrterp(ip)
              wt = vrterp(ip) - lb
              la = min(lb+1,kmax)
              IF (u(la).lt.bmiss.and.u(lb).lt.bmiss.and.v(la).lt.bmiss
     +                    .and.v(lb).lt.bmiss) THEN
                uob = u(lb) + (u(la)-u(lb)) * wt
                vob = v(lb) + (v(la)-v(lb)) * wt
              ELSE
                uob = bmiss
                vob = bmiss
              END IF
            END IF
          ELSE
            pfc = bmiss
            qob = bmiss
            tob = bmiss
            zob = bmiss
            uob = bmiss
            vob = bmiss
          END IF

C         FILL THE MISSING VALUES WITH A LARGE NUMBER
C         -------------------------------------------

c         if(irep.eq.13) print*,'qob=',qob
          IF (pfc.ge.bmiss) bak(1,l) = bmiss
          IF (qob.ge.bmiss) bak(2,l) = bmiss
          IF (tob.ge.bmiss) bak(3,l) = bmiss
          IF (zob.ge.bmiss) bak(4,l) = bmiss
          IF (uob.ge.bmiss) bak(5,l) = bmiss
          IF (vob.ge.bmiss) bak(6,l) = bmiss

C         SCATTER BACK THE RELEVANT FORECAST VALUES
C         -----------------------------------------

          IF (pfc.lt.bmiss) bak(1,l) = bak(1,l) + pfc * timw
          IF (qob.lt.bmiss) bak(2,l) = bak(2,l) + qob * timw
          IF (tob.lt.bmiss) bak(3,l) = bak(3,l) + tob * timw
          IF (zob.lt.bmiss) bak(4,l) = bak(4,l) + zob * timw
          IF (uob.lt.bmiss) bak(5,l) = bak(5,l) + uob * timw
          IF (vob.lt.bmiss) bak(6,l) = bak(6,l) + vob * timw
c         IF (cape.lt.bmiss) bak(8,l)= bak(8,l) + cape* timw
c         IF (cin.lt.bmiss)  bak(9,l)= bak(9,l) + cin * timw
c         IF (pli.lt.bmiss) bak(10,l)=bak(10,l) + pli * timw

          if(l.eq.1) then
            bak(8,l)=cp
            bak(9,l)=cn
            bak(10,l)=px
          else
            bak(8,l)=bmiss
            bak(9,l)=bmiss
            bak(10,l)=bmiss
          endif

        END DO
      END DO

      RETURN
      END