!-------------------------------------- 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 readcvsdev 2,13
#if defined (DOC)
*
***s/r readcvsdev  - In grdtyp = 'LU mode: Read the gridpoint standard deviation of (psi,chi_u,t_u,lnq,ps_u)
*
*Author  : Luc Fillion - ARMA/MSC - 7 Oct 2005.
*Revision: Luc Fillion - ARMA/EC - 4 Apr 2006 - Validate Barotropic option.
*                        N.B.: A check should be added in case the bg stats file is used with wrong grid size...
*Revision: Luc Fillion - ARMA/EC - 13 May 2010 - Adjust magnitude of simulated st-dev in 'LU' mode
*                        and simulated context.
*
* Arguments:
*   input:
*
#endif
      implicit none
*implicits
*
*     Global variables
*
#include "taglam4d.cdk"
#include "pardim.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
#include "rpnstd.cdk"
#include "comgem.cdk"
#include "comgrd_param.cdk"
#include "comgrd.cdk"
#include "comcva.cdk"
#include "comrgsigla.cdk"
#include "comstate.cdk"
*
      logical llfilt,llam,lglb,llbuffer
      integer inbrvar3d,inbrvar2d,ilevcst
      parameter(inbrvar3d=4,inbrvar2d=1)
      integer jvar,jn,jlev
      integer ikey,ji,jj,jk,ilen,jlat
      real*8 zwork,zlevmin,zdiff,zscale
      real*8 zgr,zgsig,zpc
      character*2 clvar3d(inbrvar3d),clvar2d(inbrvar2d)
      real*8 zstd2d(ni,nj)
      real*8 zstd3d(ni,nflev,nj)
      real*8 zwrksp(nla,2,nflev)
!---------------------------------------------------------------------
!
      if(lcva_helm) then
        clvar3d(1) = 'PP'
        clvar3d(2) = 'CC'
      else
        clvar3d(1) = 'QQ'
        clvar3d(2) = 'DD'
      endif
      clvar3d(3) = 'TT'
      clvar3d(4) = 'LQ'
!
      clvar2d(1) = 'P0'
!
      llam = .false.
      lglb = .true.
      llfilt = .false.
      llbuffer = .not.lpilot
!
      write(nulout,*) 'readcvsdev:****************************'
      write(nulout,*) 'readcvsdev: lsdevsim = ',lsdevsim
      write(nulout,*) 'readcvsdev: llam = ',llam
      write(nulout,*) 'readcvsdev: llfilt = ',llfilt
      write(nulout,*) 'readcvsdev: lglb = ',lglb
      write(nulout,*) 'readcvsdev: lpilot = ',lpilot
      write(nulout,*) 'readcvsdev: llbuffer = ',llbuffer
      write(nulout,*) 'readcvsdev:****************************'
!
      zlevmin = 0.9000
      ilevcst = nflev
      zdiff = 1.e35
!
      do jlev = 1,nflev
        if(abs(vlev(jlev)-zlevmin).lt.zdiff) then
          ilevcst = jlev
          zdiff = abs(vlev(jlev)-zlevmin)
        endif
      enddo
      write(nulout,*) 'readcvsdev: Level below which TT-sdev is kept cst=',ilevcst
      write(nulout,*) 'readcvsdev: vlev(ilevcst) = ',vlev(ilevcst) 
!
      ilen = ni*nj*nflev
      call zero(ilen,rgsigla)
!
      if(lglb) then
!
!*2.    Use global background error st-dev
!       ----------------------------------
!
        call readcv_gusdev
!
      else if(llam) then
!
!*3.    Use LAM background error st-dev
!       -------------------------------
*
*3.1    Read gridpoint analysis-type variables background error st-dev
*
        ini=ni
        inj=nj
        ink=1
        idate(1) = -1
        ip1      = -1
        ip2      = -1
        ip3      = -1
*
        cletiket = 'CVGDSDEV'
        cltypvar ='E'
!
        write(nulout,*) 'Reading 3D variables'
!
        do jvar = 1, inbrvar3d
          clnomvar = clvar3d(jvar)
          write(nulout,*)'Reading ',clnomvar
          do jk=1,nflev
            ip1 = nip1(jk)
            ikey = vfstlir(zstd2d,nulbgst,ini,inj,ink,idate(1)
     &           ,cletiket,ip1,ip2,ip3,cltypvar,clnomvar)
!
            if(ikey .lt.0 ) then
              call abort3d(nulout
     &             ,'readcvsdev: Problem with background stat file')
            endif
!
            zscale = 0.5
            if(clnomvar .eq. 'QQ'.or.clnomvar .eq. 'PP') then
              do ji = 1, ni
              do jj = 1, nj
                rgsiglapp(ji,jk,jj) = zscale*zstd2d(ji,jj)
              enddo
              enddo
            elseif(clnomvar .eq. 'DD'.or.clnomvar .eq. 'CC') then
              do ji = 1, ni
              do jj = 1, nj
                rgsiglacu(ji,jk,jj) = zscale*zstd2d(ji,jj)
              enddo
              enddo
            elseif(clnomvar .eq. 'TT') then
              do ji = 1, ni
              do jj = 1, nj
                if(vlev(jk).le.vlev(ilevcst)) then
                  rgsiglatu(ji,jk,jj) = zscale*zstd2d(ji,jj)
                else
                  rgsiglatu(ji,jk,jj) = rgsiglatu(ji,ilevcst,jj)
                endif
              enddo
              enddo
            elseif(clnomvar .eq. 'LQ') then
              do ji = 1, ni
              do jj = 1, nj
                rgsiglalq(ji,jk,jj) = zstd2d(ji,jj)
              enddo
              enddo
            endif
          enddo
        enddo
!
! Filter sdev
!
        if(llfilt) then
          do jk=1,nflev
          do ji=1,ni
          do jj=1,nj
            zstd3d(ji,jk,jj) = rgsiglapp(ji,jk,jj)
          enddo
          enddo
          enddo
!
          call gdtruncr(zstd3d,zwrksp,'T',ntrunc,'H',.false.,nflev)
!
          do jk=1,nflev
          do ji=1,ni
          do jj=1,nj
            rgsiglapp(ji,jk,jj) = zstd3d(ji,jk,jj)
          enddo
          enddo
          enddo
        endif
        call outhoriz2d(zstd3d,'sdevpp500.od','PP',nflev/2,
     &                  1,ni,1,nj,ni,nj,nflev)
!
        write(nulout,*) 'Reading 2D variables'
!
        do jvar = 1, inbrvar2d
          clnomvar = clvar2d(jvar)
          write(nulout,*)'Reading ',clnomvar
          ip1 = 0
          ip2 = 0
          ikey = vfstlir(zstd2d,nulbgst,ini,inj,ink,idate(1)
     &           ,cletiket,ip1,ip2,ip3,cltypvar,clnomvar)
!
          if(clnomvar .eq. 'P0') then
            do ji = 1, ni
            do jj = 1, nj
              rgsiglapu(ji,1,jj) = zstd2d(ji,jj)*100.0
            enddo
            enddo
          endif
        enddo
      endif
!
      if(llbuffer) then
!PP
        do jk=1,nflev
        do ji=1,ni
        do jj=1,nj
          zstd3d(ji,jk,jj)=rgsiglapp(ji,jk,jj)
        enddo
        enddo
        enddo
        call gdmaskh(zstd3d,nflev)
        do jk=1,nflev
        do ji=1,ni
        do jj=1,nj
          rgsiglapp(ji,jk,jj)=zstd3d(ji,jk,jj)
        enddo
        enddo
        enddo
!Cu
        do jk=1,nflev
        do ji=1,ni
        do jj=1,nj
          zstd3d(ji,jk,jj)=rgsiglacu(ji,jk,jj)
        enddo
        enddo
        enddo
        call gdmaskh(zstd3d,nflev)
        do jk=1,nflev
        do ji=1,ni
        do jj=1,nj
          rgsiglacu(ji,jk,jj)=zstd3d(ji,jk,jj)
        enddo
        enddo
        enddo
!Tu
        do jk=1,nflev
        do ji=1,ni
        do jj=1,nj
          zstd3d(ji,jk,jj)=rgsiglatu(ji,jk,jj)
        enddo
        enddo
        enddo
        call gdmaskh(zstd3d,nflev)
        do jk=1,nflev
        do ji=1,ni
        do jj=1,nj
          rgsiglatu(ji,jk,jj)=zstd3d(ji,jk,jj)
        enddo
        enddo
        enddo
!Lq
        do jk=1,nflev
        do ji=1,ni
        do jj=1,nj
          zstd3d(ji,jk,jj)=rgsiglalq(ji,jk,jj)
        enddo
        enddo
        enddo
        call gdmaskh(zstd3d,nflev)
        do jk=1,nflev
        do ji=1,ni
        do jj=1,nj
          rgsiglalq(ji,jk,jj)=zstd3d(ji,jk,jj)
        enddo
        enddo
        enddo
!Psu
        do ji=1,ni
        do jj=1,nj
          zstd2d(ji,jj)=rgsiglapu(ji,1,jj)
        enddo
        enddo
        call gdmaskh(zstd2d,1)
        do ji=1,ni
        do jj=1,nj
          rgsiglapu(ji,1,jj)=zstd2d(ji,jj)
        enddo
        enddo
      endif
!
!     Initialize TG st-dev
!     --------------------
!
      if(NSEXIST(nstg).eq.1) call sutg_sdev(nulbgst)
!
      WRITE(nulout,*)'DONE in READCVSDEV'
!
      return
      end