!-------------------------------------- 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 readgd_gusdev(pfld,cdnomvar,kni,knj,knk) 7,10
!
      use mod4dv, only : l4dvar
*
#if defined (DOC)
*
***s/r readgd_gusdev  - Used by Background check in grd_typ = 'GU' and 'LU' mode:
*                       Read and interpolate global st-dev to target LU or GU grid.
*     N.B.: Target grid dimensions mni_in & mnj_in are set to ni, nj in sudim in 'GU' mode...
*     N.B.: On writing to RPN standard file, pfld is stored in 3dvar standard way; i.e. N-->S. IG2 parameter is thus set to 1.
*
*Author  : L. Fillion  *ARMA/EC - 10 Sept 2007.
*Revision:
* L. Fillion  *ARMA/EC - 13 Jan 2009 - Upgrade to v_10_1_2 of 3dvar.
* L. Fillion  *ARMA/EC - 2 Jul 2009 - Allow target to be lam or global.
* L. Fillion  *ARMA/EC - Sept 2009 - Include more flexibility in etiket and ensure abort when reading problems occur.
*
*Arguments
*
#endif
C
      use modfgat, only : nstamplist
      IMPLICIT NONE
*implicits
#include "taglam4d.cdk"
#include "pardim.cdk"
#include "comcst.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
#include "comct0.cdk"
#include "comcva.cdk"
#include "comgem.cdk"
#include "rpnstd.cdk"
#include "cvcord.cdk"
#include "comgrd_param.cdk"
#include "comgrd.cdk"
#include "comgdpar.cdk"
#include "comrgsigla.cdk"
#include "comgemla.cdk"

*
      character*2 cdnomvar
      integer kni,knj,knk
      real*8 pfld(kni,knk,knj)
!
      logical lldebug
      integer ibrpstamp
      integer inip1,injp1,indjj
!
      character*1 clgr, ctyp
      character*2 cvar(5)
      character*8 cetiket
      integer :: k,koutmpg  !  the unit which has the selected records.
      integer idatet,idt,ibits,idtyp,ilatcst
      integer inig1,inig2,inig3,ilng,ix1,ix2,ix3
      integer ikey,ji,jj,jk,invar,iini,iinj,iink,inlev
      integer iniglb,injglb
      integer igdgid,ezqkdef,ezgdef_fmem
      integer igridid_glb,itargetid
      integer ip1_pak_trl,ip1_vco_trl,iip1,iip2,iip3
      integer iip1s(nflev)
      integer idum1,idum2,idum3,idum4
!
      real*8 zmin,zmax,zscalepp,zscalecu,zscaletu,zscalelq,zscalepu
      real*8 zdel_deg
      real ax(mni_in),ay(mnj_in)
      real*8 ztargetfld(mni_in,mnj_in,nflev)
      real*8, allocatable, dimension(:,:,:) :: zinstd
      real*8, allocatable, dimension(:,:,:) :: zglbfld
!
      EXTERNAL ABORT3D
!
!!
      WRITE(NULOUT,FMT='(/,4X,"Starting readgd_gusdev",//)')
      write(nulout,*) 'readgd_gdsdev: Variable ',cdnomvar
!
      lldebug = .false.
!
! 1.  Set global grid identifier and dimensions assumed present in the statistics file 
!     --------------------------------------------------------------------------------
!
      ibrpstamp = -1
      cletiket = 'TUGLDEV' ! n.b.: TUGLDEV and STDDEV on stats file must have same nj,nflev dimensions
      cltypvar = 'S'
!
      ikey = fstinf(nulbgst,iniglb,injglb,ink,-1,cletiket,
     &        -1,-1,-1,'S','TT')

      write(nulout,*) 'readgd_gusdev: fstinf on TUGLDEV to detect non-zonal arrays '
      write(nulout,*) 'readgd_gusdev: iniglb, injglb = ',iniglb,injglb
!
      igridid_glb = ezqkdef(iniglb, injglb, 'G', 0,0,0,0,0)
!      write(nulout,*) 'readgd_gusdev: igridid_glb=',igridid_glb
!
!      if(ink.ne.nflev.and.cdnomvar.ne.'P0') then
!        call abort3d(nulout,'readgd_gusdev: Global st-dev & analysis have diff Nb. Levels')
!      endif
!
      allocate(zglbfld(iniglb,injglb,nflev))
!
! 2.  Set target analysis grid onto which interpolation is done
!     ---------------------------------------------------------
!
! N.B.: Target grid dimensions mni_in & mnj_in are set to ni, nj in sudim in 'GU' mode...
!
      if(grd_typ.eq.'GU') then
        itargetid = ezqkdef(ni, nj, 'G', 0,0,0,0,0)
      else
        do ji=1,mni_in
          ax(ji)=grd_x_8(ji)
        enddo
        do jj=1,mnj_in
          ay(jj)=grd_y_8(jj)
        enddo
!
        itargetid= ezgdef_fmem(mni_in,mnj_in,'Z','E',mig1tic, mig2tic,mig3tic,mig4tic,
     &                         ax,ay)  ! tic tac same as extended grid
      endif
!
!     3dvar storage is N-->S : Get IG2 here to be able to inverse pole orientation from input fields if necessary
!     ig2 = 0 means storage from S--> N; ig2=1: N-->S
!
      IERR = FSTPRM(ikey,IDATEO,IDEET,INPAS   ! all capitals are ouput arguments....
     +     ,INI,INJ,INK, INBITS, IDATYP
     +     ,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR,CLETIKET,CLGRTYP
     +     ,IG1,IG2,IG3,IG4,ISWA,ILENGTH,IDLTF
     +     ,IUBC,IEXTR1,IEXTR2,IEXTR3)
!
! 3.  Read desired field and interpolate Horizontally to analysis grid
!     ----------------------------------------------------------------
!
      ibrpstamp = -1
      cletiket = 'STDDEV'  ! may have 1 x nj dimension....
      cltypvar = ' '
!
      ikey = fstinf(nulbgst,iini,iinj,ink,-1,cletiket,    ! used here to detect horiz. dimensions
     &        -1,-1,-1,cltypvar,cdnomvar)
!
      if(injglb.ne.iinj) then
        write(nulout,*) 'readgd_gusdev: For TUGLDEV: iinj = ',injglb
        write(nulout,*) 'readgd_gusdev: For STDDEV: iinj = ',iinj
        call abort3d(nulout,'readgd_gusdev: Must be same dimensions')
      endif
      allocate(zinstd(iini,iinj,ink))

      write(nulout,*) 'readgd_gusdev: Reading global st-dev for variable ',cdnomvar
      write(nulout,*) 'readgd_gusdev: fstinf on STDDEV to detect zonal or non-zonal arrays '
      write(nulout,*) 'readgd_gusdev: iini, iinj, ink = ',iini,iinj,ink
      if(iini.eq.1) then
        write(nulout,*) 'readgd_gusdev: iini = 1 ... Zonal fields are used'
      endif
!
!3.1  Read field
!     ----------
!
      ibrpstamp = -1
      cletiket = 'STDDEV'  ! may have 1 x nj dimension....
      cltypvar = 'E'
!
      if(ink.gt.1) then
        if(ink.ne.nflev) then
          call abort3d(nulout,'readgd_gusdev: ink .ne. nflev ')
        endif
        ierr=vfstlir(zinstd,nulbgst,iini,iinj,ink,-1
     &              ,cletiket,-1,-1,-1,' ',cdnomvar)
        if(ierr.lt.0) then
          write(nulout,*) 'readgd_gusdev: On file = ',nulbgst
          write(nulout,*) 'readgd_gusdev: Level, Variable = ',jk,cdnomvar
          write(nulout,*) 'readgd_gusdev: cletiket = ',cletiket
          write(nulout,*) 'readgd_gusdev: IINI,IINJ = ',IINI,IINJ
          call abort3d(nulout,'readgd_gusdev: Reading problem ')
        endif
        do jk = 1, ink
          do jj = 1,injglb
            indjj = injglb-jj+1
            do ji = 1,iniglb
              if(iini.eq.1) then
                zglbfld(ji,indjj,jk) = zinstd(1,jj,jk)
              else
                zglbfld(ji,indjj,jk) = zinstd(ji,jj,jk)
              endif
            enddo
          enddo
        enddo
      else
        inlev = nflev
        if(cdnomvar.eq.'P0') inlev = 1
        do jk = 1, inlev
          ierr=vfstlir(zinstd,nulbgst,iini,iinj,iink,-1
     &                ,cletiket,-1,-1,-1,' ',cdnomvar)
          if(ierr.lt.0) then
            write(nulout,*) 'readgd_gusdev: On file = ',nulbgst
            write(nulout,*) 'readgd_gusdev: Level, Variable = ',jk,cdnomvar
            write(nulout,*) 'readgd_gusdev: cletiket = ',cletiket
            write(nulout,*) 'readgd_gusdev: IINI,IINJ,IINK = ',IINI,IINJ,IINK
            call abort3d(nulout,'readgd_gusdev: Reading problem ')
          endif
!
          if(cdnomvar.eq.'P0') then
            do jj = 1,inj
              write(nulout,*) 'readgd_gusdev: P0: jj,STDDEV=',jj,zinstd(1,jj,1)
            enddo
!          call maxmin(zinstd,iini,1,iinj,zmin,zmax,
!     &                idum1,idum2,idum3,idum4,'readgd_gusdev  ',
!     &                cdnomvar)
          endif
!
!         Fill all longitudes in case zonal average st-dev are input fields
 
          do jj = 1,injglb
            indjj = injglb-jj+1
            do ji = 1,iniglb
              if(iini.eq.1) then
                zglbfld(ji,indjj,jk) = zinstd(1,jj,jk)
              else
                zglbfld(ji,indjj,jk) = zinstd(ji,jj,jk)
              endif
            enddo
          enddo
        enddo
      endif
!
!*3.2 Interpolate 3D field horizontally from global grid to target grid
!     ----------------------------------------------------------------- 
!
      write(nulout,*) 'readgd_gusdev: avant hintscal'
      write(nulout,*) 'readgd_gusdev: iniglb,injglb=',iniglb,injglb
      write(nulout,*) 'readgd_gusdev: igridid_glb=',igridid_glb
      write(nulout,*) 'readgd_gusdev: mni_in,mnj_in=',mni_in,mnj_in
      write(nulout,*) 'readgd_gusdev: itargetid=',itargetid
      write(nulout,*) 'readgd_gusdev: ink=',ink
!
      call hintscal(zglbfld,iniglb*injglb,igridid_glb,
     &              ztargetfld,mni_in*mnj_in,itargetid,ink,'CUBIC')
!
      if(cdnomvar.eq.'P0') then
        do ji = 1,mni_in
          write(nulout,*) 'readgd_gusdev: P0: ji,st-dev=',ji,ztargetfld(ji,mnj_in/2,1)
        enddo
      endif
!
      call maxmin(ztargetfld,mni_in,ink,mnj_in,zmin,zmax,
     &            idum1,idum2,idum3,idum4,'readgd_gusdev  ',
     &            cdnomvar)
!
      pfld(:,:,:) = 0.0
!
      do jk = 1,ink
      do jj = 1,mnj_in
      do ji = 1,mni_in
          pfld(ji,jk,jj) = ztargetfld(ji,jj,jk)
      enddo
      enddo
      enddo
!
      deallocate(zinstd)
      deallocate(zglbfld)
!
      return
      end