!-------------------------------------- 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 ONEOBS 2,40
      use mod4dv, only : l4dvar
#if defined (DOC)
*
***s/r ONEOBS - Calculate a normalized column of B directly for comparison
*               with results from single obs experiment
*
*Author  : Mark Buehner, October 1998
*Revision:
*     C.Charette ARMA/AES NOV 1998
*          - DOCTOR standards for local variables. Adapt to new names
*            for variables related to oneobs experiments in comcse1.cdk
*            C.Charette ARMA/AES MAR 1999
*          - Write increments in pressure and eta coordinates
*     C.Charette ARMA/AES NOV 1999
*          - Proper date stamp to pass to fstecr
*     S. Pelleirn *ARMA/SMC may 2000
*          -Logical unit cleanup
*     JM Belanger CMDA/SMC  Sep 2000
*                   . 32 bits conversion
*     M. Buehner ARMA/MSC  Jun 2002
*                   Adapted to run with v9.2.0
*     M. Buehner ARMA/MSC  Jan 2003
*                   Adapted to use B-matrix enhanced with SV's
*                   Adapted to calculate 1obs with 4d-var
*     Y. Yang UofT Apr. 2004 (revised by Yves Rochon ARQX/MSC Aug. 2004)
*         1. Ps perturbation is set to zero for observations other than UU, VV,
*            TT and GZ, to avoid undesired dependance. This is consistent with
*            the normal 3dvar.
*         2. Input perturbation is no longer assumed to be at a particular
*            model level, rather it is at the observation level. The increment
*            is distributed to the two nearest model levels through adjoint of
*            the vertical interpolation.
*     C.Charette ARMA/AES SEP 2004
*          - Added option to move observation to nearest analysis level via
*            namelist (see LVLNEAR)
*    -------------------
**    Purpose: Project Background statistics into observation space
*     .
#endif
      IMPLICIT NONE
*implicits
#include "comlun.cdk"
#include "pardim.cdk"
#include "comdim.cdk"
#include "comdimo.cdk"
#include "comcst.cdk"
#include "comct0.cdk"
#include "commvo.cdk"
#include "commvog.cdk"
#include "comgem.cdk"
#include "comcva.cdk"
#include "com1obs.cdk"
#include "comgd0.cdk"
#include "comstate.cdk"
#include "rpnstd.cdk"
#include "compost.cdk"
#include "comphy.cdk"
#include "comleg.cdk"
#include "comsv.cdk"
*
C
      INTEGER IDATA,JLAT,JLON,ILEV,JK,IULSSF,JLA
      INTEGER ILAT,ILON,ILEV1,ILEV2
      REAL*8 ZTRANSE(NI,NJ),ZTRANSP(NI,NJ),ZNORMB,ZSIGOBS,Z1OBSLV
      REAL*8 ZGRAD,ZP1,ZP2,ZDADPS2,ZPRESS,zpresbpb,zpresbpt, ZSCALE
      REAL*8 ZWT, ZWB
      POINTER(PXTRANSE,ZTRANSE),(PXTRANSP,ZTRANSP)
      REAL*8  DVPS

ccc      integer vfstecr
ccc      external vfstecr
*-------------------------------------------------------------------
C
      ZSCALE=1.0d-5
      WRITE(NULOUT,FMT='(/,4X,"Starting ONEOBS",//)')

      write(nulout,*) 'oneobs: before nobtot=',nobtot
      NOBTOT=NJ*NI
      write(nulout,*) 'oneobs: after  nobtot=',nobtot
      call suscal('I')
c
c     Specify the background field and set all related variables
c
      call su1obsbg
c
c     Determine the nearest gridpoint of single obs
c
      ILON=NI1OBSLO
      ILAT=NI1OBSLA
      IDATA = ((ILON-1)*NJ)+ILAT
      write(NULOUT,*) 'oneobs:idata,ilat,ilon,nobtot'
     &            ,idata,ilat,ilon,nobtot
      do jk=1,NFLEV
        write(NULOUT,*) 'oneobs:jk, rppobs(*,idata)='
     &            ,jk,rppobs(jk,idata)
      enddo
      do jk=1,NKGDIMO
        write(NULOUT,*) 'oneobs:jk,gomobsg(*,idata)='
     &           ,jk,gomobsg(jk,idata)
      enddo
c
      IULSSF=0
C
C*    0. Memory allocation
C
      CALL HPALLOC(PXTRANSE,MAX(NI*NJ,1),IERR,8)
      CALL HPALLOC(PXTRANSP,MAX(NI*NJ,1),IERR,8)
c
      ZSIGOBS=R1OBSOER
      if(C1OBSTP.eq.'GZ') ZSIGOBS=R1OBSOER*RG
c
c     Set vertical Level (for direct computation)
c
      Z1OBSLV=R1OBSLV*100

      ilev1=1
      ilev2=2
      do jk=2,NFLEV-1
        if(Z1OBSLV.gt.RPPOBS(jk,IDATA)) then
          ilev1=jk
          ilev2=jk+1
        endif
      enddo
      if(abs(log(Z1OBSLV)-log(RPPOBS(ilev1,IDATA))).lt.
     +     abs(log(Z1OBSLV)-log(RPPOBS(ilev2,IDATA)))) then
        NI1OBSLV=ilev1
      else
        NI1OBSLV=ilev2
      endif
      write(NULOUT,*) 'ONEOBS:NI1OBS= ',NI1OBSLA,NI1OBSLO,NI1OBSLV
      ILEV=NI1OBSLV
      IF(LVLNEAR) THEN
        write(NULOUT,*) 'ONEOBS:OBSERVATION MOVED TO NEAREST'
     &       ,' VERTICAL LEVEL LVLNEAR= ',LVLNEAR
        Z1OBSLV = RPPOBS(ILEV,IDATA)
        ILEV1   = MAX(ILEV-1,1)
        ILEV2   = MAX(ILEV,2)
        write(NULOUT,*) 'ONEOBS:level specified= ',R1OBSLV*100
     &       ,' nearest level= ', Z1OBSLV
        ELSE
        write(NULOUT,*) 'ONEOBS:OBSERVATION ASSIMILATED AT ITS'
     &         ,' SPECIFIED LEVEL LVLNEAR= ',LVLNEAR,' level= ',Z1OBSLV
     &         ,' PA'
      ENDIF

      write(NULOUT,*)
     &     'ONEOBS:Z1OBSLV,ilev1,ilev2,RPPOBS(ilev1),,RPPOBS(ilev2)'
     &     ,Z1OBSLV,ilev1,ilev2,RPPOBS(ilev1,IDATA),RPPOBS(ilev2,IDATA)
      write(NULOUT,*) 'ONEOBS:IDATA,ILON,ILAT,ILEV,TP='
     +                ,IDATA,ILON,ILAT,ILEV,'  ',C1OBSTP
C
c     1.0 Set desired element to 1.0 others to 0.0
c
      CALL TRANSFER('ZOB0')
      CALL TRANSFER('ZOB1')
      CALL TRANSFER('ZGD0')
      CALL TRANSFER('ZSP0')
c
C     1.1 Do adjoint of vertical interpolation (GOMOBS -> SP)
c
      IF(C1OBSTP.ne.'P0') then
           ZP1  = RPPOBS(ILEV1,IDATA)
           ZP2  = RPPOBS(ILEV2,IDATA)
           ZWB  = LOG(Z1OBSLV/ZP1)/LOG(ZP2/ZP1)
           ZWT  = 1. - ZWB
      ENDIF
C
      zgrad=0.0
      if(C1OBSTP.eq.'LQ'.and.NMVOEXIST(noq).eq.1) then
           GOMQ(ILEV2,IDATA) = GOMQ(ILEV2,IDATA) + ZWB* R1OBSINO
           GOMQ(ILEV1,IDATA) = GOMQ(ILEV1,IDATA) + ZWT* R1OBSINO
           IF(ILEV.gt.1)
     +       zgrad= 0.0
      elseif(C1OBSTP.eq.'TT'.and.NMVOEXIST(nott).eq.1) then
           GOMT(ILEV2,IDATA) = GOMT(ILEV2,IDATA) + ZWB* R1OBSINO
           GOMT(ILEV1,IDATA) = GOMT(ILEV1,IDATA) + ZWT* R1OBSINO
           IF(ILEV.gt.1)
     +       zgrad=GOMTG(ILEV,IDATA)-GOMTG(ILEV-1,IDATA)
      elseif(C1OBSTP.eq.'VV'.and.NMVOEXIST(novv).eq.1) then
           GOMV(ILEV2,IDATA) = GOMV(ILEV2,IDATA) + ZWB* R1OBSINO
           GOMV(ILEV1,IDATA) = GOMV(ILEV1,IDATA) + ZWT* R1OBSINO
           IF(ILEV.gt.1)
     +       zgrad=GOMVG(ILEV,IDATA)-GOMVG(ILEV-1,IDATA)
      elseif(C1OBSTP.eq.'UU'.and.NMVOEXIST(nouu).eq.1) then
           GOMU(ILEV2,IDATA) = GOMU(ILEV2,IDATA) + ZWB* R1OBSINO
           GOMU(ILEV1,IDATA) = GOMU(ILEV1,IDATA) + ZWT* R1OBSINO
           IF(ILEV.gt.1)
     +       zgrad=GOMUG(ILEV,IDATA)-GOMUG(ILEV-1,IDATA)
***************************************************************
           write(nulout,*)'oneobs:C1OBSTP,IDATA,LEV,vlev(LEV),R1OBSINO= '
     &            ,C1OBSTP,IDATA,ILEV,vlev(ILEV),R1OBSINO
           write(nulout,*)'oneobs: zgrad,GOMUG(ILEV,),GOMUG(ILEV-1,) '
     &            ,GOMUG(ILEV,IDATA),GOMUG(ILEV-1,IDATA)
***************************************************************
      elseif(C1OBSTP.eq.'GZ'.and.NMVOEXIST(nogz).eq.1) then
           GOMGZ(ILEV2,IDATA) = GOMGZ(ILEV2,IDATA) + ZWB* R1OBSINO
           GOMGZ(ILEV1,IDATA) = GOMGZ(ILEV1,IDATA) + ZWT* R1OBSINO
           IF(ILEV.gt.1)
     +       zgrad=GOMGZG(ILEV,IDATA)-GOMGZG(ILEV-1,IDATA)
***************************************************************
           write(nulout,*)'oneobs:C1OBSTP,IDATA,LEV,vlev(LEV),R1OBSINO= '
     &            ,C1OBSTP,IDATA,ILEV,vlev(ILEV),R1OBSINO
        IF(ILEV.gt.1) THEN
          write(nulout,*)'oneobs: zgrad,GOMGZG(ILEV,),GOMGZG(ILEV-1,) '
     &         ,GOMGZG(ILEV,IDATA),GOMGZG(ILEV-1,IDATA)
        ENDIF
***************************************************************
      elseif(C1OBSTP.eq.'ES'.and.NMVOEXIST(noes).eq.1) then
           GOMES(ILEV2,IDATA) = GOMES(ILEV2,IDATA) + ZWB* R1OBSINO
           GOMES(ILEV1,IDATA) = GOMES(ILEV1,IDATA) + ZWT* R1OBSINO
           IF(ILEV.gt.1)
     +       zgrad=0.0
      elseif(C1OBSTP.eq.'P0'.and.NMVOEXIST(nops).eq.1) then
           GOMPS(1,IDATA) = R1OBSINO
      endif
c
      IF(ILEV.GT.1.AND.C1OBSTP.ne.'P0') then
           ZP1  = RPPOBS(ILEV1,IDATA)
           ZP2  = RPPOBS(ILEV2,IDATA)
           zpresbpt = ((vhybinc(ILEV1) - rptopinc/rprefinc)
     &                   /(1.0-rptopinc/rprefinc))**rcoefinc
           zpresbpb = ((vhybinc(ILEV2) - rptopinc/rprefinc)
     &                    /(1.0-rptopinc/rprefinc))**rcoefinc
           ZDADPS2  = ( (ZPRESBPT/ZP1)*LOG(Z1OBSLV/ZP2)
     +                   -(ZPRESBPB/ZP2)*LOG(Z1OBSLV/ZP1) )
     +                   /LOG(ZP2/ZP1)**2
           GOMPS(1,IDATA) = zgrad*ZDADPS2*R1OBSINO
***************************************************************
           write(nulout,*)'oneobs: IDATA,ILEV,zp1,zp2,zwt,zwb,vlev(ILEV)= '
     &            ,IDATA,ILEV,zp1,zp2,zwt,zwb,vlev(ILEV)
           write(nulout,*)'oneobs: C1OBSTP,R1OBSINO,ZDADPS2,zgrad,gomps= '
     &             ,C1OBSTP,R1OBSINO,ZDADPS2,ZGRAD,GOMPS(1,IDATA)
***************************************************************
      ENDIF
c
      CALL APREOBS
      CALL GDTOMVOAD
      if(l4dvar.and.NSVMODE.eq.0) then
        DO JK = 1, NKGDIM
          DO JLAT = 1, NJ
            DO JLON = 1, NI
              GD(JLON,JK,JLAT) = GD(JLON,JK,JLAT) * ZSCALE *
     +                             RWT(JLAT)/NILON(JLAT)
            ENDDO
          ENDDO
        ENDDO
        call putdx('A')
        call getdx('A')
      endif
      IF(NSVMODE.gt.0) CALL SPA2SPADSV
      if(nanalvar.eq.4) then
        CALL SPA2GDAD
      else
        CALL SPGDA
        CALL SPA2SPAD
      endif
c
c     1.2 Now forward models (SP -> GOMOBS)
c
      DO JK=1,NVADIM
        VAZX(JK)=0.0
      ENDDO
      call cainad(NVADIM,VAZX)
      call cain(NVADIM,VAZX)
c
      if(nanalvar.eq.4) then
        CALL SPA2GD
      else
        CALL SPA2SP
        call SPGD
      endif
      if(l4dvar.and.NSVMODE.eq.0) then
        nsim3d=nsim3d+1
        call putdx('F')
        call getdx('F')
        call endsim
        DO JK = 1, NKGDIM
          DO JLAT = 1, NJ
            DO JLON = 1, NI
              GD(JLON,JK,JLAT) = GD(JLON,JK,JLAT) / ZSCALE
            ENDDO
          ENDDO
        ENDDO
      endif
      IF(NSVMODE.gt.0) CALL SPA2SPSV
      CALL GDTOMVO
      CALL LPREOBS
c
C*    Following added by Y. Yang
C
c     Do equivalent of vertical ineterpolation
C     to interpolate from the model levels to observation level
C
      IF(C1OBSTP.ne.'P0') then
          ZP1  = RPPOBS(ILEV1,IDATA)
          ZP2  = RPPOBS(ILEV2,IDATA)
          ZWB  = LOG(Z1OBSLV/ZP1)/LOG(ZP2/ZP1)
          ZWT  = 1. - ZWB

          dvps=0.0
          if (ILEV.GT.1) then
             zpresbpt = ((vhybinc(ILEV1) - rptopinc/rprefinc)
     &                   /(1.0-rptopinc/rprefinc))**rcoefinc
             zpresbpb = ((vhybinc(ILEV2) - rptopinc/rprefinc)
     &                    /(1.0-rptopinc/rprefinc))**rcoefinc
             ZDADPS2  = ( (ZPRESBPT/ZP1)*LOG(Z1OBSLV/ZP2)
     +                   -(ZPRESBPB/ZP2)*LOG(Z1OBSLV/ZP1) )
     +                   /LOG(ZP2/ZP1)**2
             dvps=  zgrad*ZDADPS2*GOMPS(1,IDATA)
          endif

C         Interpolate to the observation level
C
***************************************************************
          write(nulout,*)'oneobs: IDATA,ILEV,zp1,zp2,vlev(ILEV)= '
     &            ,IDATA,ILEV,zp1,zp2,vlev(ILEV)
          write(nulout,*)'oneobs: C1OBSTP,R1OBSINO,ZDADPS2,zgrad,gomps= '
     &             ,C1OBSTP,R1OBSINO,ZDADPS2,ZGRAD,GOMPS(1,IDATA)
***************************************************************
          if(C1OBSTP.eq.'LQ'.and.NMVOEXIST(noq).eq.1) then
             ZNORMB = ZWB*GOMQ(ILEV2,IDATA) + ZWT*GOMQ(ILEV1,IDATA)+dvps
          elseif(C1OBSTP.eq.'TT'.and.NMVOEXIST(nott).eq.1) then
             ZNORMB = ZWB*GOMT(ILEV2,IDATA) + ZWT*GOMT(ILEV1,IDATA)+dvps
          elseif(C1OBSTP.eq.'VV'.and.NMVOEXIST(novv).eq.1) then
             ZNORMB = ZWB*GOMV(ILEV2,IDATA) + ZWT*GOMV(ILEV1,IDATA)+dvps
          elseif(C1OBSTP.eq.'UU'.and.NMVOEXIST(nouu).eq.1) then
             ZNORMB = ZWB*GOMU(ILEV2,IDATA) + ZWT*GOMU(ILEV1,IDATA)+dvps
          elseif(C1OBSTP.eq.'GZ'.and.NMVOEXIST(nogz).eq.1) then
             ZNORMB = ZWB*GOMGZ(ILEV2,IDATA)+ZWT*GOMGZ(ILEV1,IDATA)+dvps
          elseif(C1OBSTP.eq.'ES'.and.NMVOEXIST(noes).eq.1) then
             ZNORMB = ZWB*GOMES(ILEV2,IDATA)+ZWT*GOMES(ILEV1,IDATA)+dvps
          endif
      ENDIF
C
      if(C1OBSTP.eq.'P0') then
         ZNORMB=GOMPS(1,IDATA)
      endif
      write(nulout,*) 'oneobs: output HBH^T = ',ZNORMB
c
c     Grab var_b=HBH^T for the single obs, which is ZNORMB,
C     for normalizing the column of B
c
      ZNORMB=ZNORMB/R1OBSINO
      write(NULOUT,*) 'EFFECTIVE BACKGROUND VARIANCE=',ZNORMB
      ZNORMB=ZNORMB+(zsigobs**2)
      write(NULOUT,*) 'final EFFECTIVE BACKGROUND VARIANCE=',ZNORMB
c
c *****************************************************
c     OUTPUT T PROFILE AT OBS LOCATION FOR PIERRE
c
c      do jk=1,NFLEV
c        write(69,*) jk,GOMT(jk,IDATA)
c      enddo
c *****************************************************
c
c     2. Write out 3D fields to file (in MKS units)
c
C     Do not store pressure level - instead store eta.
C
      IERR = FNOM(IULSSF,'inc1obs.fst','RND',0)
      IERR =  FSTOUV(IULSSF,'RND')
c
C
CCC   Define a valid date stamp to satisfy fstecr
C                         YYYYMMDD HHMMSShh
      CALL NEWDATE(IDATEO,19991125,12000000,3)
C
      IDEET  = 0
      INPAS  = 0
      INK    = 1
      INJ    = NJ
      INI    = NI
      IP2    = 0
      IP3    = 0
C
C     Parameters obtained via (compost)
C
      CLGRTYP  =  CGRTYP
      IG1      =  NIG1
      IG2      =  NIG2
      IG3      =  NIG3
      IG4      =  NIG4
      IDATYP   =  NIDATYP
      IPAK     =  NPAK
C
      CLTYPVAR = 'R'
C
      CLNOMVAR = 'LQ'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMQ(JK,IDATA)/ZNORMB
            ZTRANSP(JLON,NJ-JLAT+1) = GOMQ(JK,IDATA)/ZNORMB
C-----------Compute  LQ on P levels
            IF(JK.gt.1) then
              zgrad=GOMQG(JK,IDATA)-GOMQG(JK-1,IDATA)
              ZP1  = RPPOBS(JK-1,IDATA)
              ZP2  = RPPOBS(JK,IDATA)
              zpresbpb = ((vhybinc(jk) - rptopinc/rprefinc)
     &                     /(1.0-rptopinc/rprefinc))**rcoefinc
              ZDADPS2  = -(ZPRESBPB/ZP2)*LOG(ZP2/ZP1)
              zpress= GOMQ(JK,IDATA) +
     +                        zgrad*ZDADPS2*GOMPS(1,IDATA)
              ZTRANSP(JLON,NJ-JLAT+1)= zpress/ZNORMB
            ENDIF
          END DO
        END DO
C
        CLETIKET = '1OBSETA'
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c       CLETIKET = '1OBSPRES'
c       IERR = VFSTECR(ZTRANSP,ZTRANSP,IPAK,IULSSF,IDATEO
c    S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
c    S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c
      enddo
c
      CLNOMVAR = 'ES'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMES(JK,IDATA)/ZNORMB
            ZTRANSP(JLON,NJ-JLAT+1) = GOMES(JK,IDATA)/ZNORMB
C-----------Compute  ES on P levels
            IF(JK.gt.1) then
              zgrad=GOMESG(JK,IDATA)-GOMESG(JK-1,IDATA)
              ZP1  = RPPOBS(JK-1,IDATA)
              ZP2  = RPPOBS(JK,IDATA)
              zpresbpb = ((vhybinc(jk) - rptopinc/rprefinc)
     &                     /(1.0-rptopinc/rprefinc))**rcoefinc
              ZDADPS2  = -(ZPRESBPB/ZP2)*LOG(ZP2/ZP1)
              zpress= GOMES(JK,IDATA) +
     +                        zgrad*ZDADPS2*GOMPS(1,IDATA)
              ZTRANSP(JLON,NJ-JLAT+1)= zpress/ZNORMB
            ENDIF
          END DO
        END DO
C
        CLETIKET = '1OBSETA'
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c       CLETIKET = '1OBSPRES'
c       IERR = VFSTECR(ZTRANSP,ZTRANSP,IPAK,IULSSF,IDATEO
c    S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
c    S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c
      enddo
c
      CLNOMVAR = 'UU'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMU(JK,IDATA)*RKNTMS/ZNORMB
            ZTRANSP(JLON,NJ-JLAT+1) = GOMU(JK,IDATA)*RKNTMS/ZNORMB
C-----------Compute  UU on P levels
            IF(JK.gt.1) then
              zgrad=GOMUG(JK,IDATA)-GOMUG(JK-1,IDATA)
              ZP1  = RPPOBS(JK-1,IDATA)
              ZP2  = RPPOBS(JK,IDATA)
              zpresbpb = ((vhybinc(jk) - rptopinc/rprefinc)
     &                     /(1.0-rptopinc/rprefinc))**rcoefinc
              ZDADPS2  = -(ZPRESBPB/ZP2)*LOG(ZP2/ZP1)
              zpress= GOMU(JK,IDATA) +
     +                        zgrad*ZDADPS2*GOMPS(1,IDATA)
              ZTRANSP(JLON,NJ-JLAT+1)= zpress*RKNTMS/ZNORMB
            ENDIF

          END DO
        END DO
C
        CLETIKET = '1OBSETA'
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c       CLETIKET = '1OBSPRES'
c       IERR = VFSTECR(ZTRANSP,ZTRANSP,IPAK,IULSSF,IDATEO
c    S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
c    S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c
      enddo
c
      CLNOMVAR = 'VV'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMV(JK,IDATA)*RKNTMS/ZNORMB
            ZTRANSP(JLON,NJ-JLAT+1) = GOMV(JK,IDATA)*RKNTMS/ZNORMB
C-----------Compute  VV on P levels
            IF(JK.gt.1) then
              zgrad=GOMVG(JK,IDATA)-GOMVG(JK-1,IDATA)
              ZP1  = RPPOBS(JK-1,IDATA)
              ZP2  = RPPOBS(JK,IDATA)
              zpresbpb = ((vhybinc(jk) - rptopinc/rprefinc)
     &                     /(1.0-rptopinc/rprefinc))**rcoefinc
              ZDADPS2  = -(ZPRESBPB/ZP2)*LOG(ZP2/ZP1)
              zpress= GOMV(JK,IDATA) +
     +                        zgrad*ZDADPS2*GOMPS(1,IDATA)
              ZTRANSP(JLON,NJ-JLAT+1)= zpress*RKNTMS/ZNORMB
            ENDIF
          END DO
        END DO
C
        CLETIKET = '1OBSETA'
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c       CLETIKET = '1OBSPRES'
c       IERR = VFSTECR(ZTRANSP,ZTRANSP,IPAK,IULSSF,IDATEO
c    S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
c    S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c
      enddo
c
      CLNOMVAR = 'TT'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMT(JK,IDATA)/ZNORMB
            ZTRANSP(JLON,NJ-JLAT+1) = GOMT(JK,IDATA)/ZNORMB
C-----------Compute  TT on P levels
            IF(JK.gt.1) then
              zgrad=GOMTG(JK,IDATA)-GOMTG(JK-1,IDATA)
              ZP1  = RPPOBS(JK-1,IDATA)
              ZP2  = RPPOBS(JK,IDATA)
              zpresbpb = ((vhybinc(jk) - rptopinc/rprefinc)
     &                     /(1.0-rptopinc/rprefinc))**rcoefinc
              ZDADPS2  = -(ZPRESBPB/ZP2)*LOG(ZP2/ZP1)
              zpress= GOMT(JK,IDATA) +
     +                        zgrad*ZDADPS2*GOMPS(1,IDATA)
              ZTRANSP(JLON,NJ-JLAT+1)= zpress/ZNORMB
            ENDIF
          END DO
        END DO
C
        CLETIKET = '1OBSETA'
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c       CLETIKET = '1OBSPRES'
c       IERR = VFSTECR(ZTRANSP,ZTRANSP,IPAK,IULSSF,IDATEO
c    S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
c    S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
C
      enddo
c
      CLNOMVAR = 'GZ'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMGZ(JK,IDATA)/(ZNORMB*RG*10.0)
            ZTRANSP(JLON,NJ-JLAT+1) = GOMGZ(JK,IDATA)/(ZNORMB*RG*10.0)
C-----------Compute  GZ on P levels
            IF(JK.gt.1) then
              zgrad=GOMGZG(JK,IDATA)-GOMGZG(JK-1,IDATA)
              ZP1  = RPPOBS(JK-1,IDATA)
              ZP2  = RPPOBS(JK,IDATA)
              zpresbpb = ((vhybinc(jk) - rptopinc/rprefinc)
     &                     /(1.0-rptopinc/rprefinc))**rcoefinc
              ZDADPS2  = -(ZPRESBPB/ZP2)*LOG(ZP2/ZP1)
              zpress= GOMGZ(JK,IDATA) +
     +                        zgrad*ZDADPS2*GOMPS(1,IDATA)
              ZTRANSP(JLON,NJ-JLAT+1)= zpress/(ZNORMB*RG*10.0)
            ENDIF

          END DO
        END DO
C
        CLETIKET = '1OBSETA'
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c       CLETIKET = '1OBSPRES'
c       IERR = VFSTECR(ZTRANSP,ZTRANSP,IPAK,IULSSF,IDATEO
c    S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
c    S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c
      enddo
c
      CLNOMVAR = 'P0'
      CLETIKET = '1OBSETA'
        ip1=0
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMPS(1,IDATA)*1.0e-2/ZNORMB
          END DO
        END DO
C
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c
c****************************************************************************
c WRITE OUT BACKGROUND FIELD
c
      CLETIKET = '1OBSBG '
c
      CLNOMVAR = 'LQ'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = exp(GOMQG(JK,IDATA))
          END DO
        END DO
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c
      enddo
c
      CLNOMVAR = 'ES'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMESG(JK,IDATA)
          END DO
        END DO
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c
      enddo
c
      CLNOMVAR = 'UU'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMUG(JK,IDATA)*RKNTMS
          END DO
        END DO
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c
      enddo
c
      CLNOMVAR = 'VV'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMVG(JK,IDATA)*RKNTMS
          END DO
        END DO
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
      enddo
c
      CLNOMVAR = 'TT'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMTG(JK,IDATA) - tcdk
          END DO
        END DO
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
      enddo
c
      CLNOMVAR = 'GZ'
      do jk=1,NFLEV
        ip1=nip1(jk)
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMGZG(JK,IDATA)/(RG*10.0)
          END DO
        END DO
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
      enddo
c
      CLNOMVAR = 'P0'
        ip1=0
        IDATA=0
        DO jlon = 1, NI
          DO jlat = 1, NJ
            IDATA=IDATA+1
            ZTRANSE(JLON,NJ-JLAT+1) = GOMPSG(1,IDATA)*1.0e-2
          END DO
        END DO
        IERR = VFSTECR(ZTRANSE,ZTRANSE,IPAK,IULSSF,IDATEO
     S       ,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,CLTYPVAR
     S       ,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,IDATYP,.TRUE.)
c
c
      IERR =  FSTFRM (IULSSF)
      IERR =  FCLOS  (IULSSF)
c
      CALL HPDEALLC(PXTRANSE,IERR,1)
      CALL HPDEALLC(PXTRANSP,IERR,1)
C
      RETURN
      END