!-------------------------------------- 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 hcorglb_simul0 1,2
#if defined (DOC)
*
***s/r hcorglb_simul0: Characterization of the horizontal forecast error correlation
*                    using Gaussian functions.
*                    The output is rstddev array = sqrt(spectral density)
*
*
*Author: Luc Fillion *ARMA/EC  - 29 Aug 2008.
*
*Revision: 
*
*
*Revision:
*
*     Purpose: 
*
*
#endif
      IMPLICIT NONE
*implicits
#include "pardim.cdk"
#include "comdim.cdk"
#include "comgdpar.cdk"
#include "comct0.cdk"
#include "comleg.cdk"
#include "comlun.cdk"
#include "comcst.cdk"
#include "comcva.cdk"
#include "comgd0.cdk"
#include "comsp.cdk"
#include "comspg.cdk"
#include "comgem.cdk"
#include "comstate.cdk"
#include "comcorr.cdk"
C
      LOGICAL  LLPB, LLSOAR, LLPRINT
      INTEGER  JVAR, JGL, JLON, jk, JLA, JM, JN, JM0
      INTEGER  INVAR, IFLEV, INI, ILEN, IERR
      REAL*8     ZR, ZPOLE, ZCONST
      REAL*8     ZPORVO, ZPORDI, ZPORTT, ZPORQ, ZPORPS, ZABS
      REAL*8   DL1SRA4, DLCORR, DLENSC2, DLCSURN,DLALPHA, DLN, DLFAC
      real*8 ztol
      real*8 z3d(nibeg:niend,nksdim,njbeg:njend)
      real*8 zsp(nla,2,nksdim)
      real*8 zcscl(nksdim)
*     
**    
      ztol = 1.e-12
      DL1SRA4 =1.D0/DBLE(RA)
      DL1SRA4 = DL1SRA4**4
      ZCONST  = 1.E10
      LLSOAR  = .FALSE.
      LLPRINT = .FALSE.
      DLALPHA = 0.2D0
      DLN     = 3.D0
C
      z3d(:,:,:) = 0.0
      zsp(:,:,:) = 0.0
!
      do  jk = 1, nflev
        zcscl(jk) = 500.e3 ! PSI
      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
      if(nfstvar2d.gt.1) then
        zcscl(nksdim-1) = 200.e3     ! Ps_u
        zcscl(nksdim) = 100.e3     ! Ps_u
      else if(nfstvar2d.eq.1) then
        zcscl(nksdim) = 200.e3     ! Ps_u
      endif
C     
      WRITE(NULOUT,*)" Gaussian correlations are considered"
!
      do  jk = 1, nksdim
        DLENSC2 = 1.D0/DBLE(zcscl(jk))
        DLENSC2 = 0.5*DLENSC2*DLENSC2
        DO  JGL = 1, NJ
          ZR = RA * ACOS(RMU(JGL))
          INI = NILON(JGL)
          DLCORR = DEXP(-(ZR**2)*DLENSC2)
          if(abs(DLCORR).lt.ztol) DLCORR=ztol
          DO  JLON = 1, INI
            z3d(JLON,jk,JGL) = DLCORR
          END DO
        END DO
      END DO
C     
C*    TRANSFORM TO SPECTRAL SPACE
C     ---------------------------
C     
      call reespe(nksdim,zsp,z3d,nla,nibeg,niend,njbeg,njend,nksdim)
C     
C*    CHECK POSITIVENESS
C     ------------------
C     
      do 141 jk = 1, nksdim
        LLPB = .FALSE.
        DO 142 JLA = 1, NTRUNC+1
          ZABS = ABS(zsp(JLA,1,jk))
          LLPB = LLPB.OR.((zsp(JLA,1,jk).LT.0.)
     S              .AND.(ZABS/zsp(1,1,jk).GT.ztol))
!          IF(LLPB) THEN
!            write(nulout,*) 'hcorglb_simul0: jla,jk=',jla,jk
!            write(nulout,*) 'hcorglb_simul0: zsp(jla,1,jk) = ',zsp(jla,1,jk)
!            write(nulout,*) 'hcorglb_simul0: zsp(jla,2,jk) = ',zsp(jla,2,jk)
!            CALL ABORT3D(NULOUT,' Negative correlations:  hcorglb_simul0     ')
!          ENDIF
 142    CONTINUE
        DO 144 JLA = 1, NTRUNC+1
           zsp(JLA,1,jk) = ABS(zsp(JLA,1,jk))
 144    CONTINUE
 141  CONTINUE
c
c     Transform to correlation coefficents (cf. eqn. 11, Boer 1983, JAS, but using 3dvar scalar product)
c
      do jk = 1, nksdim
         do  jla = 1, ntrunc+1
           jn = jla-1
           zsp(jla,1,jk)=zsp(jla,1,jk)*sqrt(1./(2.0*jn+1.0))
        enddo
      enddo
C     
C*    Renormalize Spectral densities (now in zsp) to ensure 1 at the pole
C     -------------------------------------------------------------------
C     
      DO jk = 1, nksdim
        ZPOLE = 0.
        DO  JLA = 1, NTRUNC+1
          JN = JLA-1
          ZPOLE = ZPOLE + zsp(JLA,1,jk)
        END DO
!        WRITE(NULOUT,FMT=9162)ZPOLE,JVAR,jk
        IF(ZPOLE.LE.0.) THEN
          WRITE(UNIT=NULOUT
     S             ,FMT='("POLE VALUE NEGATIVE IN hcorglb_simul0")')
          CALL ABORT3D(NULOUT,'hcorglb_simul0        ')
        ENDIF
        DO JLA = 1, NTRUNC+1
          zsp(JLA,1,jk) = zsp(JLA,1,jk)/ZPOLE
          zsp(JLA,2,jk) = 0.0
        END DO
      END DO
 9162 FORMAT(4X,"Central value of correlation function:",4X,G12.6
     S        ,2X,"JVAR = ",I2,2X,"jk = ",I2)
!
!       call speree(nksdim,zsp,z3d,nla,nibeg,niend,njbeg,njend,nksdim)
!       write(nulout,*) 'hcorglb_simul0: recovered central value of Gaussian = ',z3d(1,1,1)
!     
!     Build rstddev as sqrt(spectral density)
!     ---------------------------------------
!     
      do jk = 1, nksdim
         DO JN = 0, NTRUNC
            rstddev(jk,jn) = sqrt(zsp(JN+1,1,jk))
         END DO
      END DO
C
      RETURN
      END