SUBROUTINE convol 1,2
#if defined (DOC)
*
***s/r convol    - Modify horizontal correlations by damping correlations at
*                  large separation distances (according to specified length
*                  scales.
*
*
*Author  : M. Buehner *ARMA/AES October 1998
*Revision:
*          S. Pellerin *ARMA/AES March 2000
*                      .Split of normcorns in convol.ftn and
*                       setcrosscorr.ftn
*          Y. Rochon *ARQX/MSC Sept 2004
*                      .Impose minimum length for Legendre poly
*                       expansion. Applying a space-limiting filter
*                       can result in inducing important oscillations
*                       (Gibbs effect) when the Legendre poly
*                       expansion is not long enough.
*          Y. Yang   Nov 2004
*                      .Change dimension of ZSP and ZGR from (*,4*JPNFLEV) to
*                       (*,NKSDIM) to accommodate more than 4 variable fields.
*          Y.J. Rochon *ARQX/EC April 2008
*                      .Added use of RPORTR
*
#endif
      IMPLICIT NONE
*implicits
#include "pardim.cdk"
#include "comdim.cdk"
#include "comleg.cdk"
#include "comlun.cdk"
#include "comcst.cdk"
#include "comcorr.cdk"
#include "comstate.cdk"
#include "comcva.cdk"
#include "comchem.cdk"
*
*     Local variables
*
*
      INTEGER JPTRUNC,INJ,INJMIN
      PARAMETER(JPTRUNC=200, INJMIN=120)
      REAL*8 DLFACT2,DLC,DSUMMED
      REAL*8 DTLEN,ZR,DLFACT
      INTEGER ILEN,JN,JLAT,JK,JJ
      REAL*8 ZLEGI(0:JPTRUNC, JPLAT)
c    S     , ZLEG(0:JPTRUNC, JPLAT), ZSP(0:JPTRUNC,4*JPNFLEV),
c    +       ZGR(JPLAT,4*JPNFLEV)
     S     , ZLEG(0:JPTRUNC, JPLAT), ZSP(0:JPTRUNC,NKSDIM),
     +       ZGR(JPLAT,NKSDIM)
      REAL*8 DLWTI(JPLAT),ZRMU(JPLAT)
C
C     Arrays for call to GAUSS8 routine
C
      integer INRACP
      real*8 ZSIA(JPLAT),ZRAD(JPLAT),ZPGSSIN2(JPLAT)
      real*8 ZSINM1(JPLAT),ZSINM2(JPLAT),ZSIN2(JPLAT)
C
C     Parameters for calc of ZLEG (use local code instead of ZLEGPOL)
C     Reason: Specification of ZRMU differs from RMU.
C
      REAL*8 DLFACT1, DLN
      REAL*8 DLNORM(0:NTRUNC)
*
c bypass zeroing
c      goto 999
c
*     1. Perform convolution on spectral correlations to limit
*        lateral extent of impact of observations
*
c     1.1 Set up simple spectral transforms
c
      CALL SULEG(NULOUT)
c
      IF (NJ.GE.INJMIN) THEN
C
C        Extract required parm from SULEG results
C
         INJ=NJ
         DO JLAT = 1, NJ
            DLWTI(JLAT) = RWT(JLAT)
            ZRMU(JLAT)=RMU(JLAT)
         END DO
      ELSE
C
C        Apply minimum length to Legendre poly expansion.
C
         INJ=INJMIN
         INRACP=INJ/2
         call GAUSS8(INRACP,ZRMU,DLWTI,ZSIA,ZRAD,ZPGSSIN2,
     1        ZSINM1,ZSINM2,ZSIN2)
         do jn=INRACP+1,INJ
            ZRMU(jn)=-ZRMU(INJ+1-jn)
            DLWTI(jn)=DLWTI(INJ+1-jn)
         enddo
      END IF

c      CALL ZLEGPOL(ZLEG,ZRMU,INJ,NTRUNC,JPTRUNC,JPLAT)
      DO JLAT = 1, INJ
         ZLEG(0,JLAT) = SQRT(0.5)
         ZLEG(1,JLAT) = SQRT(1.5)*ZRMU(JLAT)
      END DO
      DO JN = 0, NTRUNC
         DLN = 1.D0*DFLOAT(JN)
         DLNORM(JN) = DSQRT((2.*DLN + 1.D0)/2.D0)
      END DO
C
      DO JN = 1, NTRUNC-1
         DLN = DFLOAT(JN)
         DLFACT1 = ((2.*DLN+1.)/(DLN+1.))*(DLNORM(JN+1)/DLNORM(JN))
         DLFACT2 = (DLN/(DLN+1.))*(DLNORM(JN+1)/DLNORM(JN-1))
         DO JLAT = 1,INJ
            ZLEG(JN+1,JLAT) = DLFACT1*ZRMU(JLAT)*ZLEG(JN,JLAT)
     S           - DLFACT2*ZLEG(JN-1,JLAT)
         END DO
      END DO
C
      DO JLAT = 1, INJ
         DO JN = 0, NTRUNC
           ZLEGI(JN,JLAT) = ZLEG(JN,JLAT)
         END DO
      END DO
c
c     1.2 CONVERT THE CORRELATIONS IN SPECTRAL SPACE INTO SPECTRAL
*         COEFFICIENTS OF THE CORRELATION FUNCTION AND FUNCTION TO BE
c         SELF-CONVOLVED
c
      do jn=0,ntrunc
        dlfact=((2.0*jn+1)/2.0)**0.25
        dlfact2=((2.0*JN +1.0)/2.0)**(0.25)
        do jk=1,nksdim
          ZSP(jn,jk)=rstddev(jk,jn)*dlfact*dlfact2
        enddo
      enddo
*
c Transform to physical space
*
      CALL ZLEGINV(ZGR,ZSP,ZLEGI,DLWTI,NTRUNC,INJ,NKSDIM
     S     ,JPLAT,JPNFLEV,JPTRUNC)
*
c Truncate in horizontal extent
*
c Step function window
c      do jlat=1,INJ
c        do jk=1,NKSDIM
c          DLFACT=1.0
c          if (jk .gt. NFLEV .and. jk .le. 2*NFLEV) then
c            if (jlat .gt. 38) DLFACT=0.0
c          else
c            if (jlat .gt. 19) DLFACT=0.0
c          endif
c          ZGR(jlat,jk)=DLFACT*ZGR(jlat,jk)
c        enddo
c      enddo
c
* Gaussian window
c
      do jk=1,NKSDIM
c
        if (jk.ge.nsposit(nsvor).and.
     +      jk.lt.nsposit(nsvor)+NFLEV) then
          DTLEN = RPORVO
        elseif (jk.ge.nsposit(nsdiv).and.
     +          jk.lt.nsposit(nsdiv)+NFLEV) then
          DTLEN = RPORDI
        elseif (jk.ge.nsposit(nstt).and.
     +          jk.lt.nsposit(nstt)+NFLEV) then
          DTLEN = RPORTT
        elseif (jk.ge.nsposit(nsq).and.
     +          jk.lt.nsposit(nsq)+NFLEV) then
          DTLEN = RPORQ
        elseif (jk.eq.nsposit(nsps)) then
          DTLEN = RPORPS
        else 
          DO jj=1,NSCMT
             if (jk.ge.nsposit(nstr(jj)).and.
     +          jk.lt.nsposit(nstr(jj))+NFLEV) then
                DTLEN = RPORTR(jj)
                EXIT
             end if
          END DO
        endif
c
        if(DTLEN.gt.0.0) then
          DLC = 1.D0/DBLE(DTLEN)
          DLC = 0.5*DLC*DLC
c
          do jlat=1,INJ
            ZR = RA * ACOS(ZRMU(jlat))
            DLFACT = DEXP(-(ZR**2)*DLC)
            ZGR(jlat,jk)=DLFACT*ZGR(jlat,jk)
          enddo
        endif
c
        write(NULOUT,*) 'zeroing length (km)=',jk,DTLEN/1000.0
      enddo
c
c Transform back to spectral space
*
      CALL ZLEGDIR(ZGR,ZSP,ZLEGI,DLWTI,NTRUNC,INJ,NKSDIM
     S     ,JPLAT,JPNFLEV,JPTRUNC)
*
c Convert back to correlations
*
      do jk=1,NKSDIM
        do jn=0,NTRUNC
           ZSP(jn,jk)=ZSP(jn,jk)*(2.0/(2.0*jn+1.0))**(0.25)
        enddo
      enddo
c
c PUT BACK INTO RSTDDEV
      do JN=0,NTRUNC
        do JK=1,NKSDIM
           RSTDDEV(JK,JN)=ZSP(JN,JK)
        enddo
      enddo
c
c Re-normalize to ensure correlations
c
      do JK=1,NKSDIM
        dsummed=0.d0
        do JN=0,NTRUNC
          dsummed=dsummed+
     +       dble(RSTDDEV(jk,jn)**2)*sqrt(((2.*jn)+1.)/2.)
        enddo
        dsummed=sqrt(dsummed)
        do JN=0,NTRUNC
          if(dsummed.gt.1.d-30)
     +      RSTDDEV(jk,jn)=RSTDDEV(jk,jn)/dsummed
        enddo
      enddo
c
c     CONVERT THE SPECTRAL COEFFICIENTS OF THE CORRELATION FUNCTION
*     .  BACK INTO CORRELATIONS OF SPECTRAL COMPONENTS
      do jn=0,ntrunc
        dlfact=sqrt(0.5)*(1.0/((2.0*jn+1)/2.0))**0.25
        do jk=1,nksdim
          rstddev(jk,jn)=rstddev(jk,jn)*dlfact
        enddo
      enddo
*
      RETURN
      END