!-------------------------------------- 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 getfstgla(ptg,pgzg,pqg,pug,pvg,pesg,ppsg,ppt) 1,25
      use mod4dv, only : l4dvar
*
#if defined (DOC)
*
***s/r getfstgla  - Get some background fields on LAM analysis grid.
!                   (1) Interpolate from trial grid to non-extended analysis grid
!                   (2) Biperiodize the fields.
*                 These fields are needed for:
*                 (1) Dedining the balanced part of analysis increments when
*                     constructing the control vector (and vice-versa: see cv2gd)
*                 (2) Postprocessing diagnostic analysis increments on the analysis grid
*                     using TL observation operators.
*                 (3) On output, pug,pvg contains wind-images.
*
*Author  : L. Fillion  *ARMA/AES - 28 Apr 2008.
*Revision:
* L. Fillion  *ARMA/EC - 17 Jul 2009. Introduce lcva_3db
* L. Fillion  *ARMA/EC - 20 may 2010. 3 Char vrbl in maxmin call.
*
*Arguments
*
#endif
C
      use modfgat, only : nstamplist
      IMPLICIT NONE
*implicits
#include "pardim.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
#include "comct0.cdk"
#include "comgem.cdk"
#include "comcva.cdk"
#include "comgemla.cdk"
#include "rpnstd.cdk"
#include "cvcord.cdk"
#include "comgrd_param.cdk"
#include "comgrd.cdk"
#include "comgdpar.cdk"

*
      REAL*8 SFOQST8,SFOEW8
      EXTERNAL SFOQST8,SFOEW8
!
      integer ibrpstamp
      real*8 ptg(ni,nflev,nj), pqg(ni,nflev,nj), pesg(ni,nflev,nj)
      real*8 pug(ni,nflev,nj), pvg(ni,nflev,nj), pgzg(ni,nflev,nj)
      real*8 ppt(ni,nj),ppsg(ni,nj)
!
      integer igrdin,idim
      character*1 clgr, ctyp
      character*2 cnom
      character*3 clvar
      character*8 cetiket
      integer idatet,idt,ibits,idtyp
      integer ilng,ix1,ix2,ix3
      integer ier,ikey,ji,jj,jk,jlev
      integer igdgid,ezqkdef,ezgdef_fmem
      integer itrggid,ivvgid
      integer idum1,idum2,idum3,idum4
      real*8 zmin,zmax
!
      LOGICAL ldhu2es
      real ax(ni),ay(nj)
      REAL*8 zqsat,zpresa,zpresb
!
      REAL*8 z2din(mni_in,mnj_in),z3din(mni_in,mnj_in,nflev)
      REAL*8 z3din2(mni_in,mnj_in,nflev)
!
      REAL*8 ztrans(ni,nj,nflev)
      REAL*8 zuug(ni,nj,nflev),zvvg(ni,nj,nflev)
      REAL*8 zttg(ni,nj,nflev),zqqg(ni,nj,nflev)
      REAL*8 zgzg(ni,nj,nflev)
      REAL*8 ZPPG(ni,nj,nflev),zpsg(ni,nj)
!
!!
      WRITE(NULOUT,FMT='(/,4X,"Starting getfstgla",//)')
!
      if(l4dvar.and.(.not.lcva_3db)) then
        ibrpstamp=nstamplist(1)
      else
        ibrpstamp=nbrpstamp
      endif
!
!     define grid id info before calling inteprolation subroutine below
!     -----------------------------------------------------------------
!
      do ji=1,ni
        ax(ji)=grd_x_8(ji)
      enddo
      do jj=1,nj
        ay(jj)=grd_y_8(jj)
      enddo
!
      igdgid = ezgdef_fmem(mni_in,mnj_in,'Z','E',mig1tic, mig2tic,mig3tic,mig4tic, ! mig2tic etc already built by sugeom...
     &                     ax,ay)
!
      itrggid = igdgid 
      ivvgid  = igdgid   ! winds on same grid as other fields
!
!     -------------------------------------------------------
!
!     The sequence below is:
!     (1) Read the trial field
!     (2) Interpolate to non-extended analysis grid
!     (3) Biperiodize
!     (4) Transform to correct physical units
!
!     -------------------------------------------------------
!
      IDATE(1) = -1
      CLETIKET = ' '
      CLTYPVAR = 'P'
!
      idim = ni*nj
      call zero(idim,zpsg)
      idim = ni*nj*nflev
      call zero(idim,zttg)
      call zero(idim,zgzg)
      call zero(idim,zqqg)
      call zero(idim,zuug)
      call zero(idim,zvvg)
!
!     Surface-pressure
!     ----------------
!
      write(nulout,*)'reading P0'
      CLNOMVAR = 'P0'
!
      write(nulout,*) 'getfstgla: ibrpstamp = ',ibrpstamp
!
      igrdin = mni_in*mnj_in
      call vhfstfld(z2din,igrdin,itrggid,zvvg,igrdin,ivvgid,1
     &     ,vhybinc,clnomvar,ibrpstamp,ninmpg,ntrials,nulout,nflev,.true.
     &     ,'LINEAR')
      call maxmin(z2din,mni_in,mnj_in,1,zmin,zmax,
     &            idum1,idum2,idum3,idum4,'getfstgla   ',
     &            'P09')
      if(zmin.le.500.or.zmax.gt.1060) then   ! P0 in hPa at this point...
        call abort3d(nulout,
     & 'getfstgla: P0 from trial file is out of physical bounds')
      endif
!
      do jj=1,mnj_in
      do ji=1,mni_in
        zpsg(ji,jj) = z2din(ji,jj) ! extended part of zpsg will remain zero until biperiodicization
      enddo
      enddo
!
      CALL INITGDG2(ppsg,zpsg,ni,nj,1,0,CLNOMVAR)
!
      cletiket='BASICGD '
      clvar = 'P0 '
      if(Grd_typ.eq.'LU') then
!cluc        call write_fld(ppsg,clvar,cletiket,kpak,kbrpstamp,kdeet,kpas,
!cluc     &                 kdatyp,cdtypinc,nulinclr,0,1)
      endif
!
!     Temperature
!     -----------
!
      write(nulout,*)'reading TT'
      CLNOMVAR = 'TT'

      call vhfstfld(z3din,igrdin,itrggid,zvvg,igrdin,ivvgid,nflev
     &     ,vhybinc,clnomvar,ibrpstamp,ninmpg,ntrials,nulout,nflev,.true.
     &     ,'LINEAR')
!
      do jk=1,nflev
      do jj=1,mnj_in
      do ji=1,mni_in
        zttg(ji,jj,jk) = z3din(ji,jj,jk) ! extended part of zttg will remain zero until biperiodicization
      enddo
      enddo
      enddo
!
      CALL INITGDG2(ptg,zttg,ni,nj,nflev,0,CLNOMVAR)
!
      cletiket='BASICGD '
      clvar = 'TT '
      if(grd_typ.eq.'LU') then
!cluc        call write_fld(ptg,clvar,cletiket,nulinclr,0,nflev)
      endif
!
!     Geopotential
!     ------------
!
      write(nulout,*)'reading GZ'
      CLNOMVAR = 'GZ'
! 
      call vhfstfld(z3din,igrdin,itrggid,zvvg,igrdin,ivvgid,nflev
     &     ,vhybinc,clnomvar,ibrpstamp,ninmpg,ntrials,nulout,nflev,.true.
     &     ,'LINEAR')
!
      do jk=1,nflev
      do jj=1,mnj_in
      do ji=1,mni_in
        zgzg(ji,jj,jk) = z3din(ji,jj,jk)
      enddo
      enddo
      enddo
!
      CALL INITGDG2(pgzg,zgzg,ni,nj,nflev,0,CLNOMVAR)
!
      cletiket='BASICGD '
      clvar = 'GZ '
      if(Grd_typ.eq.'LU') then
!        call write_fld(pgzg,clvar,cletiket,nulinclr,0,nflev)
      endif
!
!     Specific-Humidity
!     -----------------
!
      write(nulout,*)'reading HU'
      CLNOMVAR = 'HU'
!
      call vhfstfld(z3din,igrdin,itrggid,zvvg,igrdin,ivvgid,nflev
     &     ,vhybinc,clnomvar,ibrpstamp,ninmpg,ntrials,nulout,nflev,.true.
     &     ,'LINEAR')
!
      do jk=1,nflev
      do jj=1,mnj_in
      do ji=1,mni_in
        zqqg(ji,jj,jk) = z3din(ji,jj,jk)
      enddo
      enddo
      enddo
!
      CALL INITGDG2(pqg,zqqg,ni,nj,nflev,0,CLNOMVAR)
!
      cletiket='BASICGD '
      clvar = 'HU '
      call maxmin(pqg,ni,nj,nflev,zmin,zmax,
     &            idum1,idum2,idum3,idum4,'getfstgla   ',
     &            'HU9')
      if(Grd_typ.eq.'LU') then
!cluc        call write_fld(pqg,clvar,cletiket,nulinclr,0,nflev)
      endif
!
!     Dewpoint depression
!     -------------------
!
      write(nulout,*)'Calculating ES from HU and TT'
      do jlev = 1,nflev
        do jj = 1,mnj_in
          do ji = 1,mni_in
            zpresb = ((vhybinc(jlev) - rptopinc/rprefinc)
     &                 /(1.0D0-rptopinc/rprefinc))**rcoefinc
            zpresa = rprefinc * (vhybinc(jlev)-zpresb)
            zppg(ji,jj,jlev) = zpresa + zpresb*zpsg(ji,jj)*100.0D0
          enddo
        enddo
      enddo
!
!     ES trial fld  calculation (water phase)
!     pqg = specific humidity;
!     pug = true temperature in kelvin (work fld)
!     ptg = true temperature in celsius
!     pvg = pressure in pascal (work fld)
!
      do jlev = 1,nflev
        do jj = 1, mnj_in
          do ji = 1, mni_in
            zttg(ji,jj,jlev) = zttg(ji,jj,jlev) + 273.16D0
            zqsat= SFOQST8(zttg(ji,jj,jlev),zppg(ji,jj,jlev))
            zqqg(ji,jj,jlev)= MIN ( zqsat ,zqqg(ji,jj,jlev) )
          enddo
        enddo
      enddo
!
      CALL MHUAESGD2(ztrans,zqqg,zttg,zppg,ni,nj,nflev,.false.)
      CALL INITGDG2(pesg,ztrans,ni,nj,nflev,0,CLNOMVAR)
!
!     U wind-image component
!     ----------------------
!
      write(nulout,*)'reading UU and VV'
      CLNOMVAR = 'UU'
!
      call vhfstfld(z3din,igrdin,itrggid,z3din2,igrdin,ivvgid,nflev  ! z3din=uu,z3din2=vv interpolated... 
     &     ,vhybinc,'UV',ibrpstamp,ninmpg,ntrials,nulout,nflev,.true.
     &     ,'LINEAR')
!
      do jk=1,nflev
      do jj=1,mnj_in
      do ji=1,mni_in
        zuug(ji,jj,jk) = z3din(ji,jj,jk)
        zvvg(ji,jj,jk) = z3din2(ji,jj,jk)
      enddo
      enddo
      enddo
!
      CALL INITGDG2(pug,zuug,ni,nj,nflev,0,CLNOMVAR) ! on output, pug contains U wind-image.
!
      cletiket='BASICGD '
      clvar = 'UU '
      if(Grd_typ.eq.'LU') then
!cluc        call write_fld(pug,clvar,cletiket,nulinclr,0,nflev)
      endif
!
!     V wind-image component
!     ----------------------
!
      CLNOMVAR = 'VV'
      CALL INITGDG2(pvg,zvvg,ni,nj,nflev,0,CLNOMVAR) ! on output, pvg contains V wind-image.
!
      cletiket='BASICGD '
      clvar = 'VV '
      if(Grd_typ.eq.'LU') then
!cluc        call write_fld(pvg,clvar,cletiket,nulinclr,0,nflev)
      endif
!
      return
      end