!-------------------------------------- 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 --------------------------------------
!
C
C  X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
C

      subroutine hcorla_simul0 1,5
*
***s/r hcorla_simul0  - Characterization of the horizontal forecast error correlation
*                      using Gaussian functions.
*                      The output is rstddev array = sqrt(spectral density)
*
*Author  : Luc Fillon - ARMA-EC - 27 Aug 2008.
*Revision:
* Luc Fillon - ARMA-EC - 20 May 2010 - Simplify for P0 and TG.
*    -------------------
*
*Arguments
*
*
      implicit none
*implicits
#include "taglam4d.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
#include "comgdpar.cdk"
#include "comcst.cdk"
#include "comct0.cdk"
#include "comcva.cdk"
#include "comcorr.cdk"
#include "comsp.cdk"
#include "comgd1.cdk"
#include "comfftla.cdk"
#include "comgrd_param.cdk"
#include "comgrd.cdk"
#include "rpnstd.cdk"
#include "comsim.cdk"
#include "comin.cdk"
*
      character*2 clcorspace
      character*3 clvar
      logical llprint
      integer jfi,jfj,jk,ik2,inf2,ji,jj,jla,ila,ilev,iip3
      integer in,ix,jband,ik,imin,imax,imid,jm
      real*8 zsum,zsumb,zd,zbeta,zlength
      real*8 zk,zx,zremainder,zmid,zdx
      real*8 zcon,zfacpp,znorm,zfac,ztol
      real*8 ztrunc2,zkx,zky,zcorr,zhscal,zlpsi

      real*8 zcscl(nksdim)      
      real*8 zfld(ni,nj)
      real*8 z2d(ni,nj)
      real*8 zgdxy(ni,nj)
      real*8 z3d(ni,nksdim,nj)
      real*8 zsp(nla,2,nksdim)      
      real*8 zrstddev(nksdim,0:ntrunc)      
*
**
      write(nulout,*) 'hcorla_simul0: ACTIVE'
      ztol = 1.e-12
      clcorspace = 'GD'
      llprint = .true.
!
!
        do  jk = 1, nflev
          zcscl(jk) = 500.e3
        enddo
        do  jk = nflev+1,2*nflev
          zcscl(jk) = 500.e3     ! CHI_u
        enddo
        do  jk = 2*nflev+1,3*nflev
          zcscl(jk) = 150.e3     ! T_u
        enddo
        do  jk = 3*nflev+1,4*nflev
          zcscl(jk) = 100.e3     ! q
        enddo
        do  jk = 4*nflev+1,nksdim
          zcscl(jk) = 100.e3 
        enddo
!
!       Homogeneous and isotropic error correlation in Grid-point space
!       ---------------------------------------------------------------
!
        do jk = 1, nksdim
           call cormdl(z2d,zcscl(jk),'G',1,1,1,1)
           do jj = 1, nj
              do ji = 1, ni
                 z3d(ji,jk,jj) = z2d(ji,jj)
              enddo
           enddo
        enddo
!
        do jk = 1, nksdim
           call cormdl(z2d,zcscl(jk),'G',1,ni,1,1)
           do jj = 1, nj
              do ji = 1, ni
                 z3d(ji,jk,jj) = z2d(ji,jj) + z3d(ji,jk,jj)
              enddo
           enddo
        enddo
!
        do jk = 1, nksdim
           call cormdl(z2d,zcscl(jk),'G',1,1,nj,1)
           do jj = 1, nj
              do ji = 1, ni
                 z3d(ji,jk,jj) = z2d(ji,jj) + z3d(ji,jk,jj)
              enddo
           enddo
        enddo
!
        do jk = 1, nksdim
           call cormdl(z2d,zcscl(jk),'G',1,ni,nj,1)
           do jj = 1, nj
              do ji = 1, ni
                 z3d(ji,jk,jj) = z2d(ji,jj) + z3d(ji,jk,jj)
              enddo
           enddo
        enddo
!
        do jk = 1, nksdim
           do jj = 1, nj
              do ji = 1, ni
                 zgdxy(ji,jj) = z3d(ji,jk,jj)
              enddo
           enddo
           call dft2dr(zsp(1,1,jk),zgdxy)
        enddo
!
        zrstddev(:,:) = 0.0
!
        do jk = 1, nksdim  ! psi,chiu,Tu etc...
          do jband = 1, nband
            do jm = 1, mbandsp(jband)
              ila=mila(jm,jband)
              zrstddev(jk,jband-1)=zrstddev(jk,jband-1)+zsp(ila,1,jk)  ! sp(ila,2) never used (cf. transp.ftn)
              if(zrstddev(jk,jband-1).lt.ztol) zrstddev(jk,jband-1)=ztol
            enddo
          enddo
        enddo
!
        do jband = 1, nband
          do jk = 1, nksdim
            zrstddev(jk,jband-1)=zrstddev(jk,jband-1)/mbandsp(jband)
          enddo
        enddo
!
!       Ensure normalization to one of correlation function from spectral densities (currently in zrstddev)
!
        do jk = 1, nksdim
          zsum = 0.
          do jband = 1, nband
            zsum = zsum + (zrstddev(jk,jband-1))*wvnbtot(jband)
          enddo
          zcon = 1./zsum
          do jband = 1, nband
            zrstddev(jk,jband-1) = zcon*zrstddev(jk,jband-1)
          enddo
        enddo
!
!       Build rstddev as sqrt(spectral density)
!
        do jk = 1, nksdim
          do jband = 1, nband
            rstddev(jk,jband-1) = sqrt(zrstddev(jk,jband-1))
          enddo
        enddo
!
!       Estimate the Microscale correlation length
!
        do jk = 1, nksdim
          zsum = 0.
          zsumb = 0.
          do jband = 1, nband
            zsum = zsum + (rstddev(jk,jband-1)**2)*wvnbtot(jband)
            zsumb = zsumb + (rstddev(jk,jband-1)**2)*(wvnbtot(jband)**3)
          enddo
!
          zdx=dxlam(ni/2,nj/2)
          zd=rns*zdx
          zbeta=(zd/(2.*rpi))**2
          zlength=sqrt(2.*zsum*zbeta/zsumb)
!
          if(llprint) then
          write(nulout,*) ' '
          write(nulout,*) '*********************************************'
          write(nulout,*) 'hcorla_simul0: From Spectral form of rstddev:
     &     jk, zlength (km) = ',jk,zlength/1.e3
          write(nulout,*) '*********************************************'
          write(nulout,*) ' '
          endif
        enddo
!
      return
      end