!-------------------------------------- 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 varout 1,71
      use mod4dv, only : l4dvar
#if defined (DOC)
*
***s/r varout  - Transfert of the content of COMGD0 on a RPN
*     .          standard file
*
*Author  : S. Pellerin *ARMA/AES  April 2000
*Revision:
*          JM Belanger CMDA/SMC  Aug 2000
*                   . 32 bits conversion
*          S. Pellerin *ARMA/SMC Feb. 2002
*                   . Analysis packing based on trials
*                   . Sum of apropriate model cube in 4Dvar mode
*          C. Charette - ARMA/SMC - Sep. 2004
*                   . Conversion to hybrid vertical coordinate
*          S. Pellerin *ARMA/SMC Jul. 2005
*                   . Logical switch llvint to do vertical interpolation
*                     only vhen necessary
*          C. Charette - ARMA/SMC - Nov. 2005
*                   . INI,INJ,INK are no longer overwritten when npakanl=-999
*                   . Introduced logical switch llgettrl
*          Bin He     - ARMA/SMC - Apr. 2008
*                   . Added reading multiple trial files.
*          S. Pellerin, ARMA, August 2008
*                   . Call to gethybprm2 and getfldprm2
*                   . Avoid loop over trial files and multiple call to fstinf
*                   . Call to 'tmg_' subroutines
*                   . Remove useless call to calgz
*          L. Fillion - ARMA/EC - 04 Apr 2008
*                   . introduce lladjhum.
*          L. Fillion - ARMA/EC - Upgrade lam4d to v_10_1_2 3dvar.
*          L. Fillion - ARMA/EC - 7 Jun 2010 - Restric output of GZ to
*                       lowest level for Topography. Let the model build its GZ from
*                       analysis TT,q
#endif
C
      use modfgat, only : nstamplist
      IMPLICIT NONE
*implicits
#include "pardim.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
#include "comcva.cdk"
#include "comgem.cdk"
#include "compost.cdk"
#include "cvcord.cdk"
#include "rpnstd.cdk"
#include "comgdpar.cdk"
#include "comcst.cdk"
#include "cominterp.cdk"
#include "comct0.cdk"
#include "comfilt.cdk"
*
      integer vfstluk,write_encode_hyb
      integer jvar, jcol
      integer ji,jj,jlev,inbrlev,imode,inbitstr,ilimlvhu
      real*8 zlowvar,zlowwind
#include "localpost.cdk"
C
      integer itrlgid,ip0gid,iip1s(jpnflev),iip1,iip2
      integer iip1s_anl(jpnflev),iip1s_inclr(jpnflev),iip1s_trl(jpnflev)
      integer ip1_pak_trl,ip1_vco_trl,ip1_pak_anl,ip1_vco_anl
      integer ip1_pak_inclr,ip1_pak_hy,ip1_vco_inclr,iip1_hyb_prm
      integer itrlnlev,iwindnlev,igdgid,ezqkdef,ezsetopt,ezdefset,iip3
      integer iig1,iig2,iig3,iig4,ezgprm,ikey,iwindgid,vezsint
      integer iniwind,injwind,inkwind,iig1wind,iig2wind,iig3wind
      integer iig4wind,ikind,iset,ibrpstamp
      integer inpak_gz,inpak_vt,inpak_inc
      integer, allocatable, dimension(:) :: inpak_anl
      integer INIX, INJX, INKX
      real*8 zhighvar(1),zwork,zhighwind(1),zpstrl,zpsanl(1),zpttrl(1)
      real*8 zpresanl(1)
      real*8 zprofi(1),zprofo(1),zvhvar(1),zvtvar(1),zesvar(1)
      real*8 zlev_int(jpnflev),zlev_anl(jpnflev),zlev_trl(jpnflev)
      real*8 zlev_inclr(jpnflev)
      real*8 zps,zptop,zttvar(1),zwrkvec(1),zprestrl(1),zgzvar(1)
      real*8 ztrlq(1),zincq(1),ztopo,zanlq(1)
      real   zptop4, zpref4,zrcoef4,zdummy
      real*8 zptophr, zprefhr,zrcoefhr

      integer  k,koutmpg

      character*1 clgrtypwind,clstring,cltypinc,cltypanl
      character*8 cletik
      pointer (pzhighvar,zhighvar)
      pointer (pzhighwind,zhighwind)
      pointer (pzlowvar,zlowvar(ni,nj,nflev))
      pointer (pzlowwind,zlowwind(ni,nj,nflev))
      pointer (pxpstrl,zpstrl),(pxpttrl,zpttrl),(pxpresanl,zpresanl)
      pointer (pxprestrl,zprestrl),(pxprofi,zprofi),(pxprofo,zprofo)
      pointer (pxvhvar,zvhvar),(pxps,zps),(pxptop,zptop)
      pointer (pxvtvar,zvtvar),(pxttvar,zttvar),(pxwrkvec,zwrkvec)
      pointer (pxgzvar,zgzvar),(pxtopo,ztopo),(pxtrlq,ztrlq)
      pointer (pxincq, zincq),(pxesvar,zesvar)
      pointer (pxanlq,zanlq),(pxpsanl,zpsanl)
      LOGICAL llimplemented,llwind,llbasevar,llvarout,llclip,llp0
      logical llgettrl, lladjhum
      logical :: llvint
      data cltypinc,cltypanl /'R','A'/
      data llclip,llp0 /.true.,.false./
c
      real*8 ZHUMIN(JPNFLEV)
!
!!
      WRITE(NULOUT,FMT='(/,4X,"Starting VAROUT: v_10_2_1",//)')
!
      llvint = .false.
      lladjhum = .true.  ! cluc
      if(lsw) lladjhum = .false.
      if(l1obs) lladjhum = .false.
c
c     Setting degree of horizontal interpolations
c
      igdgid = ezqkdef(ni, nj, 'G', 0,0,0,0,0)
c
      CALL HPALLOC(PZLOWVAR,MAX(NI*NJ*nflev,1),IERR,8)
C
      WRITE(NULOUT,FMT='(/,4X,''Transfer of the gridpoint model'',
     S     '' state on file at iteration No.'',I3)')
     S     NITER
C
c  SET DIAGNOSTIC VARIABLES ON IF FIRST VAR IS PP (for GENINCR branch)
c
      IF(CPPCVAR(1).EQ.'PP') LVARDIAG=.TRUE.
c
      if(l4dvar) then
        ibrpstamp=nstamplist(1)
      else
        ibrpstamp=nbrpstamp
      endif
c *********************************************************
c     Set hybride vertical coordinate parameters from trial field
c
      call gethybprm2(ninmpg,nulout,-1,-1,' ',-1,zptop4,zpref4,zrcoef4
     &     ,iip1_hyb_prm,ntrials)
      zptophr = zptop4
      zprefhr = zpref4
      zrcoefhr= zrcoef4
      write(nulout,*)'varout:zptop4,zpref4,zrcoef4 '
     &       ,zptophr,zprefhr,zrcoefhr

c ----Writing HY to analysis file
c
      if(nulstd.ne.0) then
cprnt      write(nulout,*)'varout:nIP2,niter,cetkinc,ibrpstamp,ptop,pref,coef '
cprnt     &       ,nIP2,niter,cetikinc,ibrpstamp,zptop4,zpref4,zrcoef4
        write(nulout,*) 'Writing variable HY on analysis file'
c
C
C-------Determine the style in which ip1 is encoded (15bits or 31 bits)
C       A value <= 32767 (2**16 -1)  means that ip1 is compacted in 15 bits
C       Determine the type of P which was encoded in IP1
C
        if(iip1_hyb_prm .le. 32767) then
          ip1_pak_hy = 3
        else
          ip1_pak_hy = 2
c---------set encoding of IP1 to 28 bits for write_encode_hyb
          imode = 0
          CALL CONVIP(iip1_hyb_prm,ZDUMMY,IKIND,imode,clstring,.false.)
        endif
        ierr    = write_encode_hyb(nulstd,'HY',nip2,niter,cetikinc
     &              ,ibrpstamp,zptop4,zpref4,zrcoef4)
        ierr    = write_encode_hyb(nulinclr,'HY',nip2,niter,cetikinc
     &              ,ibrpstamp,zptop4,zpref4,zrcoef4)
        ierr    = write_encode_hyb(nulinchr,'HY',nip2,niter,cetikinc
     &              ,ibrpstamp,zptop4,zpref4,zrcoef4)
      endif
c ****************************************************************
c Get P0 from trial fields for vertical interpolation definition
c
      write(nulout,*)
     &   'Reading P0 and  hybride coordinate parameters  of trial field '
     &   ,' for vertical interpolation'
c
      clnomvar = 'P0'
c
      call getfldprm2(IIP1S_TRL,IIP2,IIP3,ITRLNLEV,CLETIKET,CLTYPVAR
     &     ,IP0GID,clnomvar,ibrpstamp,jpnflev,ninmpg
     &     ,nulout,ip1_pak_trl,ip1_vco_trl,ntrials,koutmpg)
c
      ikey = FSTINF(koutmpg, INI, INJ, INK, ibrpstamp, cletiket,
     &     iip1s_trl(1), iip2, iip3,cltypvar,clnomvar)
c
      if(ikey.lt.0) then
        write(nulout,*) ' ******* ERROR ******* '
        write(nulout,*) 'No P0 found in ',ninmpg
        call abort3d(nulout,'VAROUT')
      endif
c
      ierr = FSTPRM(ikey, IDATEO, IDEET, IPAS, INI, INJ, INK, INBITSTR,
     &     IDATYP,IP1,IP2, IP3, CLTYPVAR, CLNOMVAR, CLETIKET, CLGRTYP,
     &     IG1, IG2,IG3,IG4, ISWA, ILENGTH, IDLTF, IUBC, IEXTR1,
     &     IEXTR2,IEXTR3)
c
      if (npakanl .ne. -999) inbitstr = -npakanl
c
      call hpalloc(pxpstrl,ini*inj,ierr,8)
c
      ikey = VFSTLUK(zpstrl, ikey, INI, INJ, INK)
c
c ****************************************************************
c
c-------Writing PT to analysis file when R coefficient = 1.0
c       Use grid parameters from P0
      if (nulstd.ne.0) then
        if(nint(zrcoef4) .eq. 1)then
          ierr = ezgprm(ip0gid,clgrtyp,ini,inj,iig1,iig2,iig3,iig4)
          call hpalloc(pxpttrl,ini*inj,ierr,8)
          iip1 = 0
          do jcol = 1,ini*inj
            zpttrl(jcol) = zptophr
          enddo
          write(nulout,*) 'Writing PT field on analysis file unit= '
     &                    ,nulstd
          write(nulout,*)'xxx PT inbitstr= ',inbitstr
          IERR  = VFSTECR(zpttrl,zwork,inbitstr
     &       ,nulstd,ibrpstamp,ndeet,npas,ini,inj,1,iip1_hyb_prm,nip2
     &       ,niter,cltypanl,'PT',cetikinc,clgrtyp,iig1,iig2
     &       ,iig3,iig4,nidatyp,.false.)
          if(ierr.lt.0) then
            write(nulout,*) ' ******* ERROR ******* '
            write(nulout,*) 'Problem writing PT field on ',nulstd
            call abort3d(nulout,'VAROUT')
          endif
          call hpdeallc(pxpttrl,ierr,1)
        endif
      endif
c
c-----Analysis grid hybride vertical coordinate parameters
c

      write(nulout,*)' '
      write(nulout,*)'************************************** '
      write(nulout,*)
     &     ' The hybride coordinate parameters from increment'
     &     ,' analysis  grid are:'
      write(nulout,*) ' PTOP = ',rptopinc*rpatmb,' MB'
      write(nulout,*) ' PREF = ',rprefinc*rpatmb,' MB'
      write(nulout,*) ' RCOEF= ',rcoefinc
      write(nulout,*)'************************************** '
      write(nulout,*)' '
c
c-----Setup packing for each variable
c
      allocate(inpak_anl(nppcvar))
c
      inpak_inc  = -16
      if(npakanl .ne. -999) then
        inpak_gz = npakanl
        inpak_vt = npakanl
        do jvar = 1, nppcvar
          inpak_anl(jvar)= npakanl
        enddo
      else
        inpak_gz = -24
        inpak_vt = -16
        do jvar = 1, nppcvar
          ikey = FSTINF(koutmpg, INIX, INJX, INKX, ibrpstamp,
     &         cletiket,-1, -1, -1,cltypvar,cppcvar(jvar))
          if(ikey .ge. 0) then
            ierr = fstprm(ikey,idateo,ideet,inpas,inix,injx,inkx, inbits,
     &           idatyp,ip1,ip2,ip3,cltypvar,clnomvar,cletiket,clgrtyp
     &           ,ig1,ig2,ig3,ig4,iswa,ilength,idltf,iubc,iextr1
     &           ,iextr2,iextr3)
            inpak_anl(jvar) = -inbits
          else
            inpak_anl(jvar) = -16
          endif
          if(cppcvar(jvar) .eq. 'TT') inpak_vt = inpak_anl(jvar)
          if(cppcvar(jvar) .eq. 'GZ') inpak_gz = inpak_anl(jvar)
        enddo
      endif
      write(nulout,*)' '
      write(nulout,*)'************************************** '
      write(nulout,*)
      do jvar =1,nppcvar
        write(nulout,*) 'PACKING for analysed var ',cppcvar(jvar),' is '
     &       ,inpak_anl(jvar)
      enddo
      write(nulout,*) 'PACKING for analysed GZ  is ',inpak_gz
      write(nulout,*) 'PACKING for analysed VT  is ',inpak_vt
      write(nulout,*) 'PACKING for increments   is ',inpak_inc
      write(nulout,*)' '
      write(nulout,*)'************************************** '
c
c Winds have not been processed yet
c
      llwind = .false.
c
      call getfldprm(IIP1S_TRL,IIP2,IIP3,ITRLNLEV,CLETIKET,CLTYPVAR
     &     ,ITRLGID,'UU',ibrpstamp,jpnflev,koutmpg
     &     ,nulout,ip1_pak_trl,ip1_vco_trl)
c Reset switch llvint=.true. if nflev .ne. itrlnlev
c (ie when the number of levels of the analysis grid
c  is not equal to the number of levels of the trial field grid)
c
      if (nflev .ne. itrlnlev) then
        llvint = .true.
      endif
      call hpalloc(pxtopo,ini*inj,ierr,8)
      call hpalloc(pxpsanl,ini*inj,ierr,8)
      call hpalloc(pzlowwind,ni*nj*nflev,ierr,8)
      call hpalloc(pzhighvar,ini*inj*nflev,ierr,8)
      call hpalloc(pzhighwind,ini*inj*nflev,ierr,8)
      call hpalloc(pxpresanl,ini*inj*nflev,ierr,8)
      call hpalloc(pxprofi,ini*inj*nflev,ierr,8)
      call hpalloc(pxps,ini*inj,ierr,8)
      call hpalloc(pxptop,ini*inj,ierr,8)

      call hpalloc(pxprofo,ini*inj*itrlnlev,ierr,8)
      call hpalloc(pxprestrl,ini*inj*itrlnlev,ierr,8)
      call hpalloc(pxvhvar,ini*inj*itrlnlev,ierr,8)
      call hpalloc(pxttvar,ini*inj*itrlnlev,ierr,8)
      call hpalloc(pxtrlq,ini*inj*itrlnlev,ierr,8)
      call hpalloc(pxincq,ini*inj*itrlnlev,ierr,8)
      call hpalloc(pxanlq,ini*inj*itrlnlev,ierr,8)
      call hpalloc(pxvtvar,ini*inj*itrlnlev,ierr,8)
      call hpalloc(pxwrkvec,ini*inj*itrlnlev,ierr,8)
      call hpalloc(pxesvar,ini*inj*itrlnlev,ierr,8)
      call hpalloc(pxgzvar,ini*inj*itrlnlev,ierr,8)

      do jvar = 1, nppcvar
        if(cppcvar(jvar).eq.'GZ'.or.cppcvar(jvar).eq.'VT') then
c
c Those variables are re-computed from dependent total analysed variables
c This means that no vertical interpolation are required but increments
c can be diagnosed and even interpolated horizontally if corresponding
c template variable are present in the trial file.
c
          llbasevar = .false.
        else
c
c those variables will be interpolated vertically as long as
c corresponding fields are present in the trial file.
c
          llbasevar = .true.
        endif
c
c Some variable may be request for other to be computed but not
c necessaraly wanted as output..
c
        llvarout = .true.
        llgettrl = .true.
        if(cppcvar(jvar).eq.'TT'.and..not.lttout) llvarout = .false.
        if(cppcvar(jvar).eq.'HU'.and..not.lhuout) llvarout = .false.
c
        llimplemented = .true.
c
        if ((cppcvar(jvar).ne.'UU'.and.cppcvar(jvar).ne.'VV').or.
     &       .not.llwind) then
c
          write(nulout,*) 'Writing variable ',cppcvar(jvar)
c
C     .  2.1 Fields associated with model variables
C
C
          call getfldprm(IIP1S_TRL,IIP2,IIP3,ITRLNLEV,CLETIKET,CLTYPVAR
     &         ,ITRLGID,cppcvar(jvar),ibrpstamp,jpnflev,koutmpg
     &         ,nulout,ip1_pak_trl,ip1_vco_trl)
c
c
c---------Sort the levels encoded in IIP1S_TRL
c
c---------Decode the levels
          imode = -1
          ikind = ip1_vco_trl
          do jlev = 1,itrlnlev
            call VCONVIP( iip1s_trl(jlev), zlev_trl(jlev), ikind, imode,
     &           clstring,.false. )
cprnt       write(nulout,*)'varout decode iip1s_trl:'
cprnt       write(nulout,*)'varout trl:var,jlev,itrlnlev,ip1strl,lev,knd,mod '
cprnt     &      ,cppcvar(jvar),jlev,itrlnlev,iip1s_trl(jlev),zlev_trl(jlev)
cprnt     &      ,ikind, imode
          enddo
c
          call vsort(zlev_trl,itrlnlev)
c
c---------Encode iip1s_trl to match the sorted zlev_trl
          imode = ip1_pak_trl
          ikind = ip1_vco_trl
          do jlev = 1,itrlnlev
            call VCONVIP( iip1s_trl(jlev), zlev_trl(jlev), ikind, imode,
     &           clstring,.false. )
cprnt       write(nulout,*)'varout encode iip1s_trl:'
cprnt       write(nulout,*)'varout trl:var,jlev,itrlnlev,ip1strl,lev,knd,mod '
cprnt     &      ,cppcvar(jvar),jlev,itrlnlev,iip1s_trl(jlev),zlev_trl(jlev)
cprnt     &      ,ikind, imode
          enddo
c
c---------Do setup to properly interpolate the analysed increments to
C         the model levels and model high resolution grid and to encode
C         IP1 on unit nulinchr (increments) and on unit nulstd (analysis)
C         with the same coded values found on the trial field (unit ninmpg)
c
c         Type of vertical coord accepted are
C         ip1_vco_trl = 1 (eta levels)
c         ip1_vco_trl = 2 (2D fields have value 0.0 in pressure coordinate)
C         ip1_vco_trl = 5 (hybrid levels)

          ip1_pak_anl  = ip1_pak_trl
          ip1_vco_anl  = ip1_vco_trl
          if(ip1_vco_trl .eq. 1 ) then ! trial on eta coord
            do jlev = 1,itrlnlev
              zlev_int(jlev) = zlev_trl(jlev) + (1.0 - zlev_trl(jlev))
     &                         *(zptophr/zprefhr)
              zlev_anl(jlev) = zlev_trl(jlev)
            enddo
          elseif(ip1_vco_trl .eq. 5 .or. ip1_vco_trl .eq. 2) then
            do jlev = 1,itrlnlev
              zlev_int(jlev) = zlev_trl(jlev)
              zlev_anl(jlev) = zlev_trl(jlev)
            enddo
          else
            write(nulout,*) ' **** ERROR IN TYPE OF VERTICAL COORD **** '
            write(nulout,*) 'Variable= ',cppcvar(jvar)
     &                      ,' Type= ',ip1_vco_trl
            call abort3d(nulout,'VAROUT')
          endif
c
c---------Encode zlev_anl in iip1s_anl
c
          imode = ip1_pak_anl
          ikind = ip1_vco_anl
          do jlev = 1,itrlnlev
cprnt       write(nulout,*)'varoutanl av convip:',
cprnt     &              'var,jlev,itrlnlev,hy_a,hy_i,ikd,imd '
cprnt     &        ,cppcvar(jvar),jlev,itrlnlev
cprnt     &        ,zlev_anl(jlev),zlev_int(jlev),ikind, imode
            call VCONVIP( iip1s_anl(jlev), zlev_anl(jlev), ikind, imode,
     &               clstring,.false. )
cprnt       write(nulout,*)'varoutanl:',
cprnt     &              'var,jlev,itrlnlev,iip1s_anl,hy_a,hy_i,ikd,imd '
cprnt     &        ,cppcvar(jvar),jlev,itrlnlev,iip1s_anl(jlev)
cprnt     &        ,zlev_anl(jlev),zlev_int(jlev),ikind, imode
          enddo

          if (cppcvar(jvar).eq.'UU'.or.cppcvar(jvar).eq.'VV') then
c
            llwind = .true.
c
            if (cppcvar(jvar).eq.'UU') then
              clnomvar = 'VV'
            else
              clnomvar = 'UU'
            endif
c
          endif
c
          if (itrlnlev.ne.0) then
c
            ierr = ezgprm(itrlgid,clgrtyp,ini,inj,iig1,iig2,iig3,iig4)
c
            if (cppcvar(jvar).eq.'UU'.or.cppcvar(jvar).eq.'VV') then
c
              call getfldprm(IIP1S,IIP2,IIP3,IWINDNLEV,CLETIKET,CLTYPVAR
     &             ,IWINDGID,clnomvar,ibrpstamp,jpnflev,koutmpg
     &             ,nulout,ip1_pak_trl,ip1_vco_trl)
c
c
              ierr = ezgprm(iwindgid,clgrtypwind,iniwind,injwind
     &             ,iig1wind,iig2wind,iig3wind,iig4wind)
c
            endif
          endif
c
c
c---------Do setup and write the analysed increments on the unit
C         nulinclr (low resolution working grid of the 3dvar)
c
          if(vlev(1) .eq. 0.0 .or. rptopinc .eq. 0.0) then
c         ETA or SIGMA levels were read from namelist
            ip1_vco_inclr = 1
            do jlev = 1,nflev
              zlev_inclr(jlev) = vlev(jlev)
            enddo
          else
c         HYBRID levels read from namelist
            ip1_vco_inclr = 5
            do jlev = 1,nflev
              zlev_inclr(jlev) = vhybinc(jlev)
            enddo
          endif
c
          ip1_pak_inclr = nip1_pak_inc
c
          ip1 = -1
          jlev = 1
cprnt      write(nulout,*)' avant do while',cppcvar(jvar)
          do while (jlev.le.nflev.and.ip1.ne.0 )
c
c Get the variable cppcvar(jvar) in zlowvar vector
c
            call gdout2(cppcvar(jvar),ZLOWVAR(1,1,jlev),ni,nj
     &           ,jlev,llimplemented,IIP1S_INCLR(jlev))
cprnt            write(nulout,*)'apres gdout2',cppcvar(jvar),jvar,jlev
cprnt     &           ,IIP1S_INCLR(jlev),llimplemented
c
c If variable cppcvar is not implemented skip to the next variable
c
            if (.not.llimplemented) goto 200
c
c ... otherwise write low resolution residuals to rpn standard file.
c
            if(cppcvar(jvar).eq.'P0') then  ! stag    to output constant 1010 hPa for Cecilien for stag work
!cluc              zlowvar(:,:,:) = 1010.
!cluc              cletik = 'C240_120'
              if(nulinclr.ne.0.and.llvarout) then
                IERR  = VFSTECR(ZLOWVAR(1,1,jlev),zwork,inpak_inc
     &           ,nulinclr,ibrpstamp,ndeet,npas,ni,nj,1,iip1s_inclr(jlev)
     &           ,nip2,niter,cltypinc,cppcvar(jvar),cletik,cgrtyp,nig1
     &           ,nig2,nig3,nig4,nidatyp,.true.)
              endif
            endif ! stag
!
            if(nulinclr.ne.0.and.llvarout) then
cprnt              write(nulout,*)'rebm inpak_inc= ',jlev,inpak_inc
cprnt     &             ,cppcvar(jvar)
              IERR  = VFSTECR(ZLOWVAR(1,1,jlev),zwork,inpak_inc
     &         ,nulinclr,ibrpstamp,ndeet,npas,ni,nj,1,iip1s_inclr(jlev)
     &         ,nip2,niter,cltypinc,cppcvar(jvar),cetikinc,cgrtyp,nig1
     &         ,nig2,nig3,nig4,nidatyp,.true.)
            endif
c
            if(cppcvar(jvar).eq.'HU' .and. .not. lhintdelhu) then
c
c Get the variable cppcvar(jvar) in zlowvar vector
c
              call gdout2('LQ',ZLOWVAR(1,1,jlev),ni,nj
     &             ,jlev,llimplemented,IIP1S_INCLR(jlev))
c
            endif
c
c If cppcvar is a wind component look for the other component
c
            if(cppcvar(jvar).eq.'VV'.or.cppcvar(jvar).eq.'UU') then
c
              call gdout2(clnomvar,ZLOWWIND(1,1,jlev),ni,nj,jlev
     &             ,llimplemented,IIP1S_INCLR(jlev))
c
              if(nulinclr.ne.0.and.llvarout) then
ccc          write(nulout,*)'xxx inpak_inc= ',jlev,inpak_inc,clnomvar
          IERR  = VFSTECR(zlowwind(1,1,jlev),zwork,inpak_inc
     &         ,nulinclr,ibrpstamp,ndeet,npas,ni,nj,1,iip1s_inclr(jlev)
     &         ,nip2,niter,cltypinc,clnomvar,cetikinc,cgrtyp,nig1,nig2
     &         ,nig3,nig4,nidatyp,.true.)
              endif
c
            endif
c
            jlev = jlev + 1
c
          enddo                 ! enddo while
c
 100      continue
ccc_mhuaes
c       At this point the low resolution analysed increments have been
C       written to the file on unit nulinclr.
c       If the logical switch LANLHU2ES=.T., then the high resolution
C       analysis of T-TD (ES) will be derived from the analyses of HU and TT.
c       If the logical switch LANLHU2ES=.F., then the high resolution
C       analysis of T-TD (ES) will be the sum of trial field of T-TD
C       plus the high resolution analysed increments T-TD. The resulting
C       analysis of T-TD will NOT be consistent with the analysis of HU
c
         if(cppcvar(jvar).eq.'ES'.and.     lanlhu2es) then
           llvarout = .false.
           llgettrl = .false.
         endif
         write(nulout,*)'varout: jvar,cppvar,llvarout,llgettrl= ',jvar
     &        ,cppcvar(jvar),llvarout,llgettrl
ccc_mhuaes

ccc         if (ip1.ne.0) then
         if (itrlnlev.gt.1) then
            inbrlev = nflev
          else
            inbrlev = 1
          endif
c
cprnt       write(nulout,*)' avant if(itrlnlev.ne.0) ',cppcvar(jvar)
          if(itrlnlev.ne.0) then
            call tmg_start(95,'HINT_INC')
            if (cppcvar(jvar).eq. 'UU') then
c
              call hintvec2(zlowvar,zlowwind,ni*nj,igdgid
     &             ,zhighvar,zhighwind
     &             ,ini*inj,itrlgid,inbrlev,'CUBIC')
c
            elseif(cppcvar(jvar).eq.'VV') then
c
              call hintvec2(zlowwind,zlowvar,ni*nj,igdgid
     &             ,zhighwind,zhighvar
     &             ,ini*inj,itrlgid,inbrlev,'CUBIC')
            else
              call hintscal(zlowvar,ni*nj,igdgid,
     &             zhighvar,ini*inj,itrlgid,inbrlev,'CUBIC')
            endif
            call tmg_stop(95)
c
c To write horizontal high res residuals on on analysis levels uncomment
c the following line ...
c            if(nulinchr.ne.0) then
c ... and comment the next one.
cprnt       write(nulout,*)' avant if(nulinchr.ne.0.and.inbrlev.eq.1) '
cprnt     &        ,cppcvar(jvar),inbrlev
            if(nulinchr.ne.0.and.inbrlev.eq.1) then
              if(llvarout) then
                if(cppcvar(jvar).eq.'VV'.or.cppcvar(jvar).eq.'UU') then
                  do jlev = 1, inbrlev
cprnt                    write(nulout,*)'varout:var,jlev,iip1s_anl(jlev) '
cprnt     &                   ,clnomvar,jlev,iip1s_anl(jlev)
cprnt                    write(nulout,*)'rehm inpak_inc= ',jlev,inpak_inc
cprnt     &                   ,clnomvar
                    IERR = VFSTECR(zhighwind((jlev-1)*iniwind*injwind+1)
     &                   ,zwork,inpak_inc,nulinchr,ibrpstamp
     &                   ,ndeet,npas,iniwind,injwind,1,iip1s_anl(jlev)
     &                   ,nip2,niter,cltypinc,clnomvar,cetikinc,clgrtyp
     &                   ,iig1wind,iig2wind,iig3wind,iig4wind,nidatyp,
     &                   .false.)
                  enddo
                endif
              endif
c
c ... and write high resolution residuals to rpn standard file ...
c
              if(cppcvar(jvar).eq.'HU'.and.lolqout.and. .not. lhintdelhu
     &             ) then
                do jlev = 1, inbrlev
cprnt                  write(nulout,*)'rehm LQ inpak_inc= ',jlev,inpak_inc
                  IERR = VFSTECR(zhighvar((jlev-1)*ini*inj+1),zwork,
     &                 inpak_inc,nulinchr,ibrpstamp,ndeet,npas
     &                 ,ini,inj,1,iip1s_anl(jlev),nip2,niter,cltypinc
     &                 ,'LQ',cetikinc,clgrtyp,iig1,iig2,iig3,iig4
     &                 ,nidatyp,.true.)
                enddo
              elseif((cppcvar(jvar).ne.'HU'.or. lhintdelhu) .and.
     &               llvarout) then
                do jlev = 1, inbrlev
cprnt                  write(nulout,*)'rehm inpak_inc= ',jlev,inpak_inc
cprnt     &                 ,cppcvar(jvar)

                  IERR = VFSTECR(zhighvar((jlev-1)*ini*inj+1),zwork
     &                 ,inpak_inc,nulinchr,ibrpstamp,ndeet,npas
     &                 ,ini,inj,1,iip1s_anl(jlev),nip2,niter,cltypinc
     &                 ,cppcvar(jvar),cetikinc,clgrtyp,iig1,iig2,iig3
     &                 ,iig4,nidatyp,.true.)
                enddo
              endif
            endif
          endif
c
cprnt       write(nulout,*)' avant if(itrlnlev.gt.1.and.llbasevar) '
cprnt     &        ,cppcvar(jvar),inbrlev,llbasevar
          if (itrlnlev.gt.1.and.llbasevar) then ! BEGIN 3D FIELDS
c
c ------ Vertical interpolation to trial levels ------
c
c Computation of pressure values on analysis profiles of the high
c resolution horizonal grid
c
c Interpolation of high res. P0 and PT to high res. variable grid
c
            if (llvint) then
              ierr = ezsetopt('INTERP_DEGREE','CUBIC')
              iset = ezdefset(itrlgid,ip0gid)
              ierr = vezsint(zps,zpstrl,ini,inj,1,ini,inj,1)
              call calcpres(zpresanl,vhybinc,nflev,zps,rptopinc*rpatmb
     &             ,rprefinc*rpatmb,rcoefinc,ini*inj)
c
c Computation of pressure values on trial profiles of the high
c resolution horizonal grid
c
cprnt       write(nulout,*)' avant calcpres (zprestrl '
              call calcpres(zprestrl,zlev_int,itrlnlev,zps,zptophr
     &             ,zprefhr,zrcoefhr,ini*inj)
c
              do jlev = 1, nflev
                do jcol = 1, ini*inj
                  zprofi((jcol-1)*nflev + jlev) = zhighvar((jlev-1)*ini
     &                 *inj+jcol)
                enddo
              enddo
c
cprnt       write(nulout,*)' avant  vintprof '
              call vintprof(zprofo,zprestrl,itrlnlev,zprofi,
     &             zpresanl,nflev,ini*inj)
c
              do jlev = 1, itrlnlev
                do jcol = 1, ini*inj
                  zvhvar((jlev-1)*ini*inj+jcol) =
     &                 zprofo((jcol-1)*itrlnlev+jlev)
                enddo
              enddo
            else
              do jlev = 1, itrlnlev
                do jcol = 1, ini*inj
                  zvhvar((jlev-1)*ini*inj+jcol) =
     &                zhighvar((jlev-1)*ini*inj+jcol)
                enddo
              enddo
            endif

            if(cppcvar(jvar).eq. 'HU') then
              ierr = ezsetopt('INTERP_DEGREE','CUBIC')
              iset = ezdefset(itrlgid,ip0gid)
c interpolation of ANALYSED surface pressure on HU grid
              ierr = vezsint(zps,zpsanl,ini,inj,1,ini,inj,1)
c computation of pressure values on eta trial levels based on ANALYSED
C P0
              call calcpres(zprestrl,zlev_int,itrlnlev,zps,zptophr
     &             ,zprefhr,zrcoefhr,ini*inj)
            endif
c
c Writing to standard files
c
            call tmg_start(96,'WR_HR_INC')
            do jlev = 1,itrlnlev
cprnt              write(nulout,*)'avant if(nulinchr.ne.0 ',CPPCVAR(JVAR)
cprnt     &             ,jlev,IIP1S_ANL(JLEV)
              if(nulinchr.ne.0) then
                if(cppcvar(jvar).eq.'HU'.and.lolqout.and. .not.
     &               lhintdelhu)then
cprnt                  write(nulout,*)'rehm LQ inpak_inc= ',jlev,inpak_inc
                  IERR  = VFSTECR(zvhvar((jlev-1)*ini*inj+1),zwork
     &                 ,inpak_inc,nulinchr,ibrpstamp,ndeet,npas
     &                 ,ini,inj,1,iip1s_anl(jlev),nip2,niter,cltypinc
     &                 ,'LQ',cetikinc,clgrtyp,iig1,iig2,iig3,iig4
     &                 ,nidatyp,.true.)
                elseif((cppcvar(jvar).ne.'HU'.or.lhintdelhu).and
     &                 .llvarout) then
cprnt        write(nulout,*)'avant vfstecr nulinchr ',CPPCVAR(JVAR),jlev
cprnt     &                 ,IIP1S_ANL(JLEV)
                  IERR  = VFSTECR(zvhvar((jlev-1)*ini*inj+1),zwork
     &                 ,inpak_inc,nulinchr,ibrpstamp,ndeet,npas
     &                 ,ini,inj,1,iip1s_anl(jlev),nip2,niter,cltypinc
     &                 ,cppcvar(jvar),cetikinc,clgrtyp,iig1,iig2,iig3
     &                 ,iig4,nidatyp,.true.)
cprnt                  write(nulout,*)'apres vfstecr nulinchr ',CPPCVAR(JVAR)
cprnt     &                 ,jlev,IIP1S_ANL(JLEV)
                endif
              endif
c
c Look for corresponding trial field
c
              if(llgettrl) then
                  ikey = FSTINF(koutmpg, INI, INJ, INK, ibrpstamp,
     &                 cletiket,iip1s_trl(jlev), iip2, iip3,cltypvar
     &                 ,cppcvar(jvar))
c
cprnt              write(nulout,*)'varoutW:cppcvar(jvar),ikey',cppcvar(jvar)
cprnt     &             ,ikey
              if (ikey.lt.0) then
                write(nulout,*) 'Problems finding variable '
     &               ,cppcvar(jvar),' at level ',zlev_trl(jlev)
     &               ,' in trial file'
                call abort3d(nulout,'VAROUT')
              endif
c
              ikey = VFSTLUK(zhighvar,ikey, INI, INJ, INK)
c
c Sum of increments and trial field
c
              if(cppcvar(jvar).eq.'HU') then
c
                if (lhintdelhu) then
                  do jcol = 1, ini*inj
                    zvhvar((jlev-1)*ini*inj+jcol) = max(zhighvar(jcol)
     &                   ,1.0D-12) +zvhvar((jlev-1)*ini*inj+jcol)
                  enddo
                else
                  do jcol = 1, ini*inj
                    zvhvar((jlev-1)*ini*inj+jcol) =
     &                   exp(
     &                   log(max(zhighvar(jcol),1.0D-12))
     &                   + zvhvar((jlev-1)*ini*inj+jcol)
     &                   )
                  enddo
                endif
c
c Get the trial specific humidity for increment ajustment
c
                do jcol = 1, ini*inj
                  ztrlq((jlev-1)*ini*inj+jcol) = zhighvar(jcol)
c
c                 CAREFULL: zprofo is now re-used as re-alligned
c                           pressure vector for use with AJHUM
c                 Note: zprestrl contains pressure column based
c                       on corrected surface pressure
                  zprofo((jlev-1)*ini*inj+jcol) =
     &                 zprestrl((jcol-1)*itrlnlev+jlev)
                enddo
c
              else
c
                do jcol = 1, ini*inj
                  zvhvar((jlev-1)*ini*inj+jcol) = zhighvar(jcol) +
     &                 zvhvar((jlev-1)*ini*inj+jcol)
c
                  if(cppcvar(jvar).eq.'TT'.and.(lhuout.or.lvtout.or
     &                 .lgzout)) then
                    zttvar((jlev-1)*ini*inj+jcol) = zvhvar((jlev-1)*ini
     &                   *inj+jcol)
                  endif
c
                enddo
c
              endif
c
            else
              write(nulout,*) 'VAROUT:  '
     &               ,cppcvar(jvar),' at level ',zlev_trl(jlev)
     &               ,' in trial file'

            endif
c
          enddo
            call tmg_stop(96)
c
            if(cppcvar(jvar).eq.'HU'.and.lladjhum) then
c
c CAREFULL: un-ajusted trial specific humidity copied in variable zprestrl
c
              do jlev = 1,itrlnlev
                zhumin(jlev)=0.04
                do jcol = 1, ini*inj
                  zprestrl((jlev-1)*ini*inj+jcol) =
     &                 ztrlq((jlev-1)*ini*inj+jcol)
                  zanlq((jlev-1)*ini*inj+jcol) =
     &                 zvhvar((jlev-1)*ini*inj+jcol)
                  if (ztrlq((jlev-1)*ini*inj+jcol).lt.zhumin(jlev)
     &             .and.ztrlq((jlev-1)*ini*inj+jcol).gt.0.0)
     &             zhumin(jlev)=ztrlq((jlev-1)*ini*inj+jcol)
                enddo
             enddo
             ilimlvhu=nint(rlimlvhu)

c trial specific humidity ajustment (zprestrl)
             write(nulout,*) ' '
             write(nulout,*) ' *** TRIAL SPECIFIC HUMIDITY AJUSTMENT '
             write(nulout,*) ' '
             call tmg_start(97,'AJ_HU')
             call AJHUM(zprofo,zttvar,zprestrl,zvtvar,zwrkvec,ini,inj
     &            ,itrlnlev,zlev_trl,zhumin,llclip)
c specific humidity analysis ajustment (zvhvar)
             write(nulout,*) ' '
             write(nulout,*) ' *** ANAL SPECIFIC HUMIDITY AJUSTMENT '
             write(nulout,*) ' '
             call AJHUM(zprofo,zttvar,zvhvar,zvtvar,zwrkvec,ini,inj
     &            ,itrlnlev,zlev_anl,zhumin,llclip)
              call tmg_stop(97)
c
ccc_mhuaes
c
c T-Td  analysis after ajustments (zesvar)
              if(lanlhu2es) then
c                ES analysis calculation and  writing
c                   zhvar = specific humidity;
C                   zwrkvec= true temperature in kelvin
C                   zttvar = true temperature in celsius
C                   zprofo = pressure in mb
C                   zincq = pressure in pascal
                do jlev = 1,itrlnlev
                  do jcol = 1, ini*inj
                    zwrkvec((jlev-1)*ini*inj+jcol) =
     &                   zttvar((jlev-1)*ini*inj+jcol) + 273.16D0
                    zincq((jlev-1)*ini*inj+jcol) =
     &                   zprofo((jlev-1)*ini*inj+jcol) * 100.0D0
                  enddo
                enddo
                call tmg_start(3,'MHUAESGD2')
                CALL MHUAESGD2(zesvar,zvhvar,zwrkvec,zincq,ini,inj
     &                 ,itrlnlev,lswphes)
                call tmg_stop(3)
C             set T-TD between  zero and rlimit_es read namelist
                do jlev = 1,itrlnlev
                  do jcol = 1, ini*inj
                    zesvar((jlev-1)*ini*inj+jcol) =
     &                   max(zesvar((jlev-1)*ini*inj+jcol),0.0D0)
                    zesvar((jlev-1)*ini*inj+jcol) =
     &                   min(zesvar((jlev-1)*ini*inj+jcol),rlimit_es)
                  enddo
                enddo
              endif
C
              if (cvcord(1:3).eq.'MAM'.and.nulinchr.ne.0) then
c
c               Adjust HU increment such that
c
c                   Q    =   Q(adjusted) - Q
c                    inc      a             t
c
                do jlev = 1,itrlnlev
                  do jcol = 1, ini*inj
                    zincq((jlev-1)*ini*inj+jcol) =
     &	               zvhvar((jlev-1)*ini*inj+jcol)-
     &                 ztrlq((jlev-1)*ini*inj+jcol)
                  enddo
c
cprnt      write(nulout,*)'varout dans if(MAM) avant VFSTECR'
cprnt     &      ,CPPCVAR(JVAR),jlev,iip1s_anl(jlev)
                  IERR = VFSTECR(zincq((jlev-1)*ini*inj+1),zwork
     &                 ,inpak_inc,nulinchr,ibrpstamp,ndeet,npas
     &                 ,ini,inj,1,iip1s_anl(jlev),nip2,niter,cltypinc
     &                 ,cppcvar(jvar),cetikinc,clgrtyp,iig1,iig2,iig3
     &                 ,iig4,nidatyp,.true.)
c
                enddo
              end if
c------------- Computation of new specific humidity analysis based on ajusted
c              increments:
c
c              Q  = Q  + ( Q(ajusted) - Q(ajusted) )
c              a    t      a            t
c
              do jlev = 1,itrlnlev
                do jcol = 1, ini*inj
                  zanlq((jlev-1)*ini*inj+jcol) =
     &                 ztrlq((jlev-1)*ini*inj+jcol) +
     &                 (zvhvar((jlev-1)*ini*inj+jcol) -
     &                 zprestrl((jlev-1)*ini*inj+jcol))
c             temperature conversion for mfotvt
                  zwrkvec((jlev-1)*ini*inj+jcol) =
     &                 zttvar((jlev-1)*ini*inj+jcol) + 273.16D0
                enddo
              enddo
c
c             here ztrlq is filled with new virtual temperature based on
C             ajusted HU
c
              CALL MFOTVT8(ztrlq,zwrkvec,zanlq,ini*inj,itrlnlev,ini*inj)
              do jlev = 1,itrlnlev
                do jcol = 1, ini*inj
                  ztrlq((jlev-1)*ini*inj+jcol) =
     &                 ztrlq((jlev-1)*ini*inj+jcol) -
     &                 zwrkvec((jlev-1)*ini*inj+jcol)
                ENDDO
              ENDDO
            endif
c
            call tmg_start(98,'COMP_GZ')
            if (cppcvar(jvar).eq.'HU'.and.lgzout) then
c           Looking for topography
              ikey = FSTINF(koutmpg, INI, INJ, INK, ibrpstamp,
     &             cletiket,iip1s_trl(itrlnlev), iip2, iip3,cltypvar
     &             ,'GZ')
c
cprnt              write(nulout,*)'varoutZ:cppcvar(jvar),ikey',cppcvar(jvar)
cprnt     &             ,ikey
              if (ikey.lt.0) then
                write(nulout,*) 'Problems finding variable '
     &             ,'GZ',' at level ',zlev_trl(itrlnlev),' in trial file'
                call abort3d(nulout,'VAROUT')
              endif
c
              ikey = VFSTLUK(ztopo,ikey, INI, INJ, INK)
c
              if(.not.lcva_hemis) then
                call calgz(zprofo,zvtvar,zgzvar,ztopo,ini,inj,itrlnlev
     &             ,iip1s_trl)
              endif
c
c ztrlq here contain vt from q fitred increment
c
            endif
c
            call tmg_stop(98)
c
            call tmg_start(5,'WR_HR_AN')
            if(nulstd.ne.0) then
              do jlev = 1,itrlnlev
c
c Writing analysis field
c
                if(llvarout) then
                  IERR  = VFSTECR(zvhvar((jlev-1)*ini*inj+1),zwork
     &                 ,inpak_anl(jvar),nulstd,ibrpstamp,ndeet,npas,ini
     &                 ,inj,1,iip1s_anl(jlev),nip2,niter,cltypanl
     &                 ,cppcvar(jvar),cetikinc,clgrtyp,iig1,iig2,iig3
     &                 ,iig4,nidatyp,.true.)
                endif
c
                if(cppcvar(jvar).eq.'HU') then
                  if(lvtout) then
c             VT writing
                    IERR = VFSTECR(zvtvar((jlev-1)*ini*inj+1),zwork
     &                   ,inpak_vt,nulstd,ibrpstamp,ndeet,npas,ini,inj
     &                   ,1,iip1s_anl(jlev),nip2,niter,cltypanl,'VT'
     &                   ,cetikinc,clgrtyp,iig1,iig2,iig3,iig4,nidatyp
     &                   ,.false.)
                  endif
ccc_mhuaes
c             ES analysis writing
                  IF(LANLHU2ES) THEN
                    IERR = VFSTECR(zesvar((jlev-1)*ini*inj+1),zwork
     &                   ,inpak_vt,nulstd,ibrpstamp,ndeet,npas,ini,inj
     &                   ,1,iip1s_anl(jlev),nip2,niter,cltypanl,'ES'
     &                   ,cetikinc,clgrtyp,iig1,iig2,iig3,iig4,nidatyp
     &                   ,.true.)
                  ENDIF
                  if(lgzout) then
c             GZ writing
                    if(lcva_hemis.and.jlev.eq.nflev) then
                      IERR = VFSTECR(ztopo,zwork
     &                   ,inpak_gz,nulstd,ibrpstamp,ndeet,npas,ini,inj
     &                   ,1,iip1s_anl(nflev),nip2,niter,cltypanl,'GZ'
     &                   ,cetikinc,clgrtyp,iig1,iig2,iig3,iig4,nidatyp
     &                   ,.true.)
                    else if(.not.lcva_hemis) then
                      IERR = VFSTECR(zgzvar((jlev-1)*ini*inj+1),zwork
     &                   ,inpak_gz,nulstd,ibrpstamp,ndeet,npas,ini,inj
     &                   ,1,iip1s_anl(jlev),nip2,niter,cltypanl,'GZ'
     &                   ,cetikinc,clgrtyp,iig1,iig2,iig3,iig4,nidatyp
     &                   ,.true.)
                    endif
                  endif
                endif
              enddo
            endif
            call tmg_stop(5)
c
            if(cppcvar(jvar).eq.'VV'.or.cppcvar(jvar).eq.'UU') then
c
c ------ Vertical interpolation to trial levels ------
c
c Computation of pressure values on analysis profiles of the high
c resolution horizonal grid
c
c Interpolation of high res. P0 and PT to high res. variable grid
c
              if (llvint) then
                ierr = ezsetopt('INTERP_DEGREE','CUBIC')
                iset = ezdefset(iwindgid,ip0gid)
                ierr = vezsint(zps,zpstrl,iniwind,injwind,1,ini,inj,1)
c
                call calcpres(zpresanl,vhybinc,nflev,zps,rptopinc*rpatmb
     &               ,rprefinc*rpatmb,rcoefinc,iniwind*injwind)
c
c Computation of pressure values on trial profiles of the high
c resolution horizonal grid
c
c
                call calcpres(zprestrl,zlev_int,itrlnlev,zps,zptophr
     &               ,zprefhr,zrcoefhr,iniwind*injwind)
c
                do jlev = 1, nflev
                  do jcol = 1, iniwind*injwind
                    zprofi((jcol-1)*nflev + jlev) =
     &                   zhighwind((jlev-1)*iniwind*injwind+jcol)
                  enddo
                enddo
c
                call vintprof(zprofo,zprestrl,itrlnlev,zprofi,zpresanl
     &               ,nflev,iniwind*injwind)
c
c
                do jlev = 1, itrlnlev
                  do jcol = 1, iniwind*injwind
                    zvhvar((jlev-1)*iniwind*injwind+jcol) =
     &                   zprofo((jcol-1)*itrlnlev+jlev)
                  enddo
                enddo
              else
ccc                zvhvar = zhighwind
                do jlev = 1, itrlnlev
                  do jcol = 1, iniwind*injwind
                    zvhvar((jlev-1)*iniwind*injwind+jcol) =
     &                  zhighwind((jlev-1)*iniwind*injwind+jcol)
                  enddo
                enddo
              endif
c
c Writing to standard files
c
              call tmg_start(5,'WR_HR_AN')
              do jlev = 1,itrlnlev
                if(nulinchr.ne.0) then
                  IERR  = VFSTECR(zvhvar((jlev-1)*iniwind*injwind+1)
     &                 ,zwork,inpak_inc,nulinchr,ibrpstamp,ndeet
     &                 ,npas,iniwind,injwind,1,iip1s_anl(jlev),nip2
     &                 ,niter,cltypinc,clnomvar,cetikinc,clgrtyp
     &                 ,iig1wind,iig2wind,iig3wind,iig4wind,nidatyp,
     &                 .false.)
                endif
c
c Look for corresponding trial field
c
                do k=1,ntrials
                  ikey = FSTINF(ninmpg(k), INI, INJ, INK, ibrpstamp, cletiket
     &               ,iip1s_trl(jlev), iip2, iip3,cltypvar,clnomvar)
                  if(ikey >=0) exit
                enddo
c
cprnt   write(nulout,*)'varoutY:cppcvar(jvar),ikey',cppcvar(jvar),ikey
                if (ikey.lt.0) then
                  write(nulout,*) 'Problems finding variable '
     &                 ,cppcvar(jvar),' at level ',zlev_trl(jlev)
     &                 ,' in trial file'
                  call abort3d(nulout,'VAROUT')
                endif
c
                ikey = VFSTLUK(zhighvar,ikey, INI, INJ, INK)
c
c Sum of increments and trial field
c
                do jcol = 1, ini*inj
                  zvhvar((jlev-1)*ini*inj+jcol) = zhighvar(jcol) +
     &                 zvhvar((jlev-1)*ini*inj+jcol)
                enddo
c
              enddo
c
              do jlev = 1,itrlnlev
c Writing analysis field
c
                if(nulstd.ne.0) then
                  IERR  = VFSTECR(zvhvar((jlev-1)*ini*inj+1),zwork
     &                 ,inpak_anl(jvar),nulstd,ibrpstamp,ndeet,npas,ini
     &                 ,inj,1,iip1s_anl(jlev),nip2,niter,cltypanl
     &                 ,clnomvar,cetikinc,clgrtyp,iig1wind,iig2wind
     &                 ,iig3wind,iig4wind,nidatyp,.true.)
                endif
              enddo
              call tmg_stop(5)
            endif
c
c ------     End of vertical interpolation      ------
c
c 2D variables
          elseif(itrlnlev.eq.1) then ! BEGIN 2D FIELDS
c
c Sum of increments and trial field for 2d variables
c
c Looking for corresponding trial field
c
              ikey = fstinf(koutmpg, INI, INJ, INK, ibrpstamp,
     &             cletiket,iip1s_trl(itrlnlev), iip2, iip3,cltypvar
     &             ,cppcvar(jvar))
c
cprnt            write(nulout,*)'varoutX 2d field:cppcvar(jvar),ikey'
cprnt     &           ,cppcvar(jvar),ikey
            if (ikey.lt.0) then
              write(nulout,*) 'Problems finding variable ',cppcvar(jvar)
     &             ,' at level ',zlev_trl(itrlnlev),' in trial file'
              call abort3d(nulout,'VAROUT')
            endif
c
c
            ikey = vfstluk(zvhvar,ikey, INI, INJ, INK)
c
c Sum of increments and trial field
c
            if(cppcvar(jvar).eq.'P0') then
              llp0 = .true.
              do jcol = 1, ini*inj
                zhighvar(jcol) = zvhvar(jcol) + zhighvar(jcol)
                zpsanl(jcol) = zhighvar(jcol)
              enddo
            else
              do jcol = 1, ini*inj
                zhighvar(jcol) = zvhvar(jcol) + zhighvar(jcol)
              enddo
            endif
c
c Writing analysis field
c
            if(nulstd.ne.0) then
              IERR  = VFSTECR(zhighvar,zwork,inpak_anl(jvar),nulstd
     &             ,ibrpstamp,ndeet,npas,ini,inj,1,iip1s_anl(itrlnlev)
     &             ,nip2,niter,cltypanl,cppcvar(jvar),cetikinc,clgrtyp
     &             ,iig1,iig2,iig3,iig4,nidatyp,.true.)
cprnt       write(nulout,*)'varout fstecr anlm:var= ',CPPCVAR(JVAR)
            endif
c
          endif                 ! END 3D FIELDS and 2D FIELDS
c
          call tmg_start(6,'2D_FIELD_OUT')
          if (clgrtyp.eq.'Z') then
c
c ----- Writing positional parameters
c
            cletiket = ' '
            cltypvar = ' '
              ikey = FSTINF(koutmpg, iNI, iNJ, iNK, -1,cletiket, iig1
     &             ,iig2,iig3,cltypvar,'>>')
c
            ierr = fstprm(ikey,idateo,ideet,inpas,ini,inj,ink, inbits,
     &           idatyp,ip1,ip2,ip3,cltypvar,clnomvar,cletiket,clgrtyp
     &           ,ig1,ig2,ig3,ig4,iswa,ilength,idltf,iubc,iextr1
     &           ,iextr2,iextr3)
c
c
            ikey = VFSTLUK(zhighvar, ikey, iNI, iNJ, iNK)
c
            if(nulinchr.ne.0) then
              ierr = vfstecr(zhighvar, zwork, -inbits, nulinchr, idateo
     &             ,ideet,inpas, ini, inj, ink, ip1, ip2, ip3, cltypvar
     &             ,clnomvar,cletiket,clgrtyp,ig1, ig2, ig3, ig4, idatyp
     &             ,.true.)
            endif
            if(nulstd.ne.0) then
              ierr = vfstecr(zhighvar, zwork, -inbits, nulstd, idateo
     &             ,ideet,inpas, ini, inj, ink, ip1, ip2, ip3, cltypvar
     &             ,clnomvar,cletiket,clgrtyp,ig1, ig2, ig3, ig4, idatyp
     &             ,.true.)
            endif
c
c
            cletiket = ' '
            cltypvar = ' '
              ikey = FSTINF(koutmpg, iNI, iNJ, iNK, -1,cletiket, iig1
     &             ,iig2,iig3,cltypvar,'^^')
c
            ierr = fstprm(ikey,idateo,ideet,inpas,ini,inj,ink, inbits
     &           ,idatyp,ip1,ip2,ip3,cltypvar,clnomvar,cletiket,clgrtyp
     &           ,ig1,ig2,ig3,ig4,iswa,ilength,idltf,iubc,iextr1
     &           ,iextr2,iextr3)
c
c
            ikey = VFSTLUK(zhighvar, ikey, iNI, iNJ, iNK)
c
            if(nulinchr.ne.0) then
              ierr = vfstecr(zhighvar, zwork, -inbits, nulinchr, idateo
     &             ,ideet,inpas, ini, inj, ink, ip1, ip2, ip3, cltypvar
     &             ,clnomvar,cletiket,clgrtyp,ig1, ig2, ig3, ig4, idatyp
     &             ,.true.)
            endif
c
            if(nulstd.ne.0) then
              ierr = vfstecr(zhighvar, zwork, -inbits, nulstd, idateo
     &             ,ideet,inpas, ini, inj, ink, ip1, ip2, ip3, cltypvar
     &             ,clnomvar,cletiket,clgrtyp,ig1, ig2, ig3, ig4, idatyp
     &             ,.true.)
            endif
c
c
            if(cppcvar(jvar).eq.'VV'.or.cppcvar(jvar).eq.'UU') then
c
              cletiket = ' '
              cltypvar = ' '
                ikey = FSTINF(koutmpg, iNI, iNJ, iNK, -1,cletiket,
     &               iig1wind,iig2wind,iig3wind,cltypvar,'>>')
c
              ierr = fstprm(ikey,idateo,ideet,inpas,ini,inj,ink
     &             ,inbits,idatyp,ip1,ip2,ip3,cltypvar,clnomvar
     &             ,cletiket,clgrtyp,ig1,ig2,ig3,ig4,iswa,ilength
     &             ,idltf,iubc,iextr1,iextr2,iextr3)
c
c
              ikey = VFSTLUK(zhighvar, ikey, iNI, iNJ, iNK)
c
              if(nulinchr.ne.0) then
                ierr = vfstecr(zhighvar,zwork,-inbits,nulinchr,idateo
     &               ,ideet,inpas, ini, inj, ink, ip1, ip2, ip3
     &               ,cltypvar,clnomvar,cletiket,clgrtyp,ig1, ig2, ig3
     &               ,ig4,idatyp,.true.)
              endif
              if(nulstd.ne.0) then
                ierr = vfstecr(zhighvar, zwork, -inbits, nulstd, idateo
     &               ,ideet,inpas, ini, inj, ink, ip1, ip2, ip3,cltypvar
     &               ,clnomvar,cletiket,clgrtyp,ig1, ig2, ig3, ig4
     &               ,idatyp,.true.)
              endif
c
c
              cletiket = ' '
              cltypvar = ' '
                ikey = FSTINF(koutmpg, iNI, iNJ, iNK, -1,cletiket,
     &               iig1wind,iig2wind,iig3wind,cltypvar,'^^')
c
              ierr = fstprm(ikey,idateo,ideet,inpas,ini,inj,ink
     &             ,inbits,idatyp,ip1,ip2,ip3,cltypvar,clnomvar
     &             ,cletiket,clgrtyp,ig1,ig2,ig3,ig4,iswa,ilength
     &             ,idltf,iubc,iextr1,iextr2,iextr3)
c
c
              ikey = VFSTLUK(zhighvar, ikey, iNI, iNJ, iNK)
c
              if(nulinchr.ne.0) then
                ierr = vfstecr(zhighvar,zwork,-inbits,nulinchr,idateo
     &               ,ideet,inpas, ini, inj, ink, ip1, ip2, ip3
     &               ,cltypvar,clnomvar,cletiket,clgrtyp,ig1, ig2, ig3
     &               ,ig4,idatyp,.true.)
              endif
              if(nulstd.ne.0) then
                ierr = vfstecr(zhighvar, zwork, -inbits, nulstd, idateo
     &               ,ideet,inpas, ini, inj, ink, ip1, ip2, ip3,cltypvar
     &               ,clnomvar,cletiket,clgrtyp,ig1, ig2, ig3, ig4
     &               ,idatyp,.true.)
              endif
            endif
          endif
          call tmg_stop(6)
        endif
c
 200  enddo
c
c*    9. Deallocation of local arrays (Abort on error)
c     .  ---------------------------------------------
c
      call hpdeallc(pzhighvar,ierr,1)
      call hpdeallc(pzhighwind,ierr,1)
      call hpdeallc(pxpresanl,ierr,1)
      call hpdeallc(pxprofi,ierr,1)
      call hpdeallc(pxprofo,ierr,1)
      call hpdeallc(pxprestrl,ierr,1)
      call hpdeallc(pxvhvar,ierr,1)
      call hpdeallc(pxttvar,ierr,1)
      call hpdeallc(pxtrlq,ierr,1)
      call hpdeallc(pxincq,ierr,1)
      call hpdeallc(pxanlq,ierr,1)
      call hpdeallc(pxvtvar,ierr,1)
      call hpdeallc(pxwrkvec,ierr,1)
      call hpdeallc(pxesvar,ierr,1)
      call hpdeallc(pxgzvar,ierr,1)
      call hpdeallc(pxpsanl,ierr,1)
      call hpdeallc(pxpstrl,ierr,1)
      call hpdeallc(pzlowvar,ierr,1)
      call hpdeallc(pxtopo,ierr,1)
      call hpdeallc(pzlowwind,ierr,1)
      call hpdeallc(pxps,ierr,1)
      call hpdeallc(pxptop,ierr,1)
      deallocate(inpak_anl)

c
      write(nulout,*) 'END of VAROUT'
c
      RETURN
      END