!-------------------------------------- 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 corrlengthla(kfile,ldoutfile,lduse) 4,6
*
#if defined (DOC)
*
***s/r corrlengthla: For lam4d option:  calculate and output correlation lengths.
*
*Author: Luc Fillion - ARMA/MSC - Oct 2005.
*Revision: Luc Fillion - ARMA/EC - Oct 2008. - Ensure validation still valid under v_10_1_1.
*                      . Introduce argument ldoutfile.
*Revision: Luc Fillion - ARMA/EC - 27 Aug 2008 - Include lduse argument to save local estimated Length into array rhcorl.
*Revision: Luc Fillion - ARMA/EC - Sept 2008 - Output correlation scales on file for specific use.
*Revision: Luc Fillion - ARMA/EC - 31 May 2010 - Output correlation scales on file for scientific paper.
*
*Arguments
*          kfile: file number
*          ldoutfile: .true. will also output correlation scales on RPN standard file.
*
#endif

      IMPLICIT NONE
*implicits
#include "taglam4d.cdk"
#include "pardim.cdk"
#include "comgrd_param.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
#include "comlunla.cdk"
#include "comcst.cdk"
#include "rpnstd.cdk"
#include "comcorr.cdk"
#include "comcse1.cdk"
#include "comgdpar.cdk"
#include "comfftla.cdk"
#include "comgrd.cdk"
#include "compstat.cdk"
#include "comgem.cdk"
*
*     Arguments
*
      logical ldoutfile,lduse
      INTEGER kfile
*
*     Local Variables
*
      character*2 cllvar(5)
      integer jk, jband, jvar,idim
      REAL*8  ZLPSI(JPNFLEV), ZLCHI(JPNFLEV), ZLTT(JPNFLEV), 
     &        ZLLQ(JPNFLEV)
      REAL*8  ZLPS,zminscale,zltg
      REAL*8  zk2,zd,zdx
      REAL*8  ZLN, ZLTEMP, ZLLENGTH(4*JPNFLEV),
     &      ZLA(4*JPNFLEV), ZLB(4*JPNFLEV), zbeta

*
**
      cllvar(1) = 'PP'
      cllvar(2) = 'CU'
      cllvar(3) = 'TU'
      cllvar(4) = 'LQ'
      cllvar(5) = 'PU'
!
      zminscale = 1.0
*
*     1. Normalization constants
*     .  -----------------------
*
      WRITE(NULOUT,9000)'CORRLENGTHLA- Computing correlation lengths'
      DO JK = 1, NKSDIM
         ZLA(JK)   = 0.0
         ZLB(JK)   = 0.0
      END DO
*
      zdx=dxlam(ni/2,nj/2)
      zd=rns*zdx
      zbeta = (zd/(2.d0*rpi))**2
      do jband = 1, nband
         zk2 = wvnbtot(jband)**3
         DO JK = 1, NKSDIM
            ZLTEMP  = (RSTDDEV(JK,jband-1)**2)
            ZLA(JK) = ZLA(JK) + ZLTEMP*wvnbtot(jband)
            ZLB(JK) = ZLB(JK) + ZLTEMP*zk2
         END DO
      END DO
*
      DO JK = 1, NKSDIM
         if(ZLB(JK).le.0.) then 
           ZLLENGTH(JK) = 0.0
         else
           ZLLENGTH(JK) = SQRT(2.d0*ZLA(JK)*zbeta/ZLB(JK))
         endif
      END DO
*
      DO JK = 1, NFLEV
         ZLPSI(JK) = ZLLENGTH(JK)
         ZLCHI(JK) = ZLLENGTH(JK+NFLEV)
         ZLTT(JK) = ZLLENGTH(JK+2*NFLEV)
         ZLLQ(JK) = ZLLENGTH(JK+3*NFLEV)
      END DO
!
      IF(NFSTVAR2D.gt.1) THEN
        ZLPS = ZLLENGTH(NKSDIM-1)
        ZLTG = ZLLENGTH(NKSDIM)
      ELSE
        ZLPS = ZLLENGTH(NKSDIM)
      ENDIF
!
!     Save into arrays for use through 3dvar
!     --------------------------------------
!
      if(lduse) then
        do jk = 1, nksdim
           rhcorl(jk) = ZLLENGTH(JK)
        enddo
        IF(NFSTVAR2D.gt.1) THEN
          rhcorl(NKSDIM-1) = ZLPS
          rhcorl(NKSDIM) = ZLTG
        ELSE
          rhcorl(NKSDIM) = ZLPS
        ENDIF
!
        do jk=1,nksdim
          if(rhcorl(jk).le.zminscale) then
            write(nulout,*) 'CORRLENGTHLA: jk,nksdim = ',jk,nksdim
            write(nulout,*) 'CORRLENGTHLA: rhcorl(jk)=',rhcorl(jk)
            if(jk.eq.nksdim.and.NFSTVAR2D.gt.1) then
              write(nulout,*) 'CORRLENGTHLA: TG stats missing probably...'
              write(nulout,*) 'CORRLENGTHLA: Will use RCSCLTG from NAMPSTAT'
              CALL READNML('NAMPSTAT',IERR)
              ZLTG = RCSCLTG
              rhcorl(NKSDIM) = ZLTG
            endif
            if(jk.ne.nksdim) then
!cluc              call abort3d(nulout,'CORRLENGTHLA:
!     &           Problem with estimated correlation Length')
            endif
          endif
        enddo
      endif
*
*     PRINT THE RESULTS
*
      open (unit=nutemp,file='lam_correl_scales.od')
      write(nutemp,910) nflev
!
      IF(NFSTVAR2D.gt.1) THEN
        WRITE(NULOUT,FMT=9006)'CHARACTERISTIC LENGTHS (KM)',
     &     'PP', 'UC', 'UT', 'LQ', 'UP', 'TG'
        DO JK = 1, NFLEV
          WRITE(NULOUT,FMT=9007) JK,
     &          ZLPSI(JK)/1000., ZLCHI(JK)/1000., ZLTT(JK)/1000.,
     &          ZLLQ(JK)/1000., ZLPS/1000., ZLTG/1000.
          write(nutemp,900) vlev(jk)*1000.,ZLPSI(JK)/1000.,
     &          ZLCHI(JK)/1000.,ZLTT(JK)/1000.,ZLLQ(JK)/1000.
        END DO
      ELSE
        WRITE(NULOUT,FMT=9004)'CHARACTERISTIC LENGTHS (KM)',
     &     'PP', 'UC', 'UT', 'LQ', 'UP'
        DO JK = 1, NFLEV
          WRITE(NULOUT,FMT=9005) JK,
     &          ZLPSI(JK)/1000., ZLCHI(JK)/1000., ZLTT(JK)/1000.,
     &          ZLLQ(JK)/1000., ZLPS/1000.
          write(nutemp,900) vlev(jk)*1000.,ZLPSI(JK)/1000.,
     &          ZLCHI(JK)/1000.,ZLTT(JK)/1000.,ZLLQ(JK)/1000.
        END DO
      ENDIF
!
      close(nutemp)
*
 900  format(5(E13.7,1X))
 910  format(I4)
 9000 FORMAT(/,8X,A,/)
 9004 FORMAT(///,'%%',22X,A,/,2x,'Level (hPa)'
     &     ,8x,A,14x,A
     &     ,14x,A,14x,A,14x,A,14x,A,14x,A)
 9005 FORMAT('%%',2X,I6,8X,G12.6,4X,G12.6,4X,G12.6,4X,G12.6
     &     ,4X,G12.6,4X,G12.6,4X,G12.6)
 9006 FORMAT(///,'%%',12X,A,/,2x,'Level (hPa)'
     &     ,6x,A,8x,A
     &     ,12x,A,10x,A,12x,A,10x,A,10x,A,10x,A)
 9007 FORMAT('%%',2X,I6,8X,G12.6,4X,G12.6,4X,G12.6,4X,G12.6
     &     ,4X,G12.6,4X,G12.6,4X,G12.6,4X,G12.6)
!
      if(ldoutfile) then
!
!       write out the length scales
        INK     = NFLEV
        INI     = 1
        INJ     = 1
        CLETIKET='LONGCORR'
        CLGRTYP = 'X'
        IP1     = 0
        IP2     = 0
        IP3     = nensemble
        idateo  = ndatestat
        IDEET   = 0
        IPAS    = 0
        IG1     = 0
        IG2     = 0
        IG3     = 0
        IG4     = 0
        IDATYP  = 5
        CLTYPVAR = 'X'
        IPAK    = -32
!
        do jvar = 1, 5
!
          CLNOMVAR = cllvar(jvar)
!
          if(CLNOMVAR.eq.'PP') then
            IERR =VFSTECR(ZLPSI,ZLPSI,IPAK,
     &          kfile,IDATEO,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,
     &          CLTYPVAR,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,
     &          IDATYP,.TRUE.)
!
          else if(CLNOMVAR.eq.'CU') then
            IERR =VFSTECR(ZLCHI,ZLCHI,IPAK,
     &          kfile,IDATEO,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,
     &          CLTYPVAR,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,
     &          IDATYP,.TRUE.)
!
          else if(CLNOMVAR.eq.'TU') then
            IERR =VFSTECR(ZLTT,ZLTT,IPAK,
     &          kfile,IDATEO,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,
     &          CLTYPVAR,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,
     &          IDATYP,.TRUE.)
!
          else if(CLNOMVAR.eq.'LQ') then
            IERR =VFSTECR(ZLLQ,ZLLQ,IPAK,
     &          kfile,IDATEO,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,
     &          CLTYPVAR,CLNOMVAR,CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,
     &          IDATYP,.TRUE.)
          endif
        enddo
!
        INK=1
        IERR =VFSTECR(ZLPS,ZLPS,IPAK,
     &          kfile,IDATEO,IDEET,IPAS,INI,INJ,INK,IP1,IP2,IP3,
     &          CLTYPVAR,'PU',CLETIKET,CLGRTYP,IG1,IG2,IG3,IG4,
     &          IDATYP,.TRUE.)
      endif
!
      return
      end