!-------------------------------------- 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 corrlengthla2(kfile,ldoutfile,lduse) 2,7
*
#if defined (DOC)
*
***s/r corrlengthla2: For lam4d option: Extension of corrlengthla.ftn
*
*Author: Luc Fillion - ARMA/EC - 5 Mar 2009.
*
*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 "comcst.cdk"
#include "rpnstd.cdk"
#include "comcorr.cdk"
#include "comcse1.cdk"
#include "comgdpar.cdk"
#include "comfftla.cdk"
#include "comgrd.cdk"
#include "compstat.cdk"
*
* Arguments
*
logical ldoutfile,lduse
INTEGER kfile
*
* Local Variables
*
character*2 cllvar(6)
integer jk, jband, jvar,idim
REAL*8 ZLPS,zminscale,zltg,zltemp
REAL*8 zk2,zd,zdx, zbeta
real*8 ZLLQ(nflev), ZLTB(nflev)
REAL*8 ZLPSI(nflev), ZLCHI(nflev), ZLTT(nflev)
REAL*8 ZLLENGTH(nksdim2)
real*8 ZLA(nksdim2), ZLB(nksdim2)
*
**
cllvar(1) = 'PP'
cllvar(2) = 'CU'
cllvar(3) = 'TU'
cllvar(4) = 'LQ'
cllvar(5) = 'TB'
cllvar(6) = 'PU'
!
zminscale = 1.0
*
* 1. Normalization constants
* . -----------------------
*
WRITE(NULOUT,9000)'corrlengthla2- Computing correlation lengths'
DO JK = 1, nksdim2
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, nksdim2
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, nksdim2
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)
ZLTB(JK) = ZLLENGTH(JK+4*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, nksdim2
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,nksdim2
if(rhcorl(jk).le.zminscale) then
write(nulout,*) 'corrlengthla2: jk,nksdim = ',jk,nksdim
write(nulout,*) 'corrlengthla2: rhcorl(jk)=',rhcorl(jk)
if(jk.eq.nksdim.and.NFSTVAR2D.gt.1) then
write(nulout,*) 'corrlengthla2: TG stats missing probably...'
write(nulout,*) 'corrlengthla2: Will use RCSCLTG from NAMPSTAT'
CALL READNML
('NAMPSTAT',IERR)
ZLTG = RCSCLTG
rhcorl(NKSDIM) = ZLTG
endif
if(jk.ne.nksdim) then
!cluc call abort3d(nulout,'corrlengthla2:
! & Problem with estimated correlation Length')
endif
endif
enddo
endif
*
* PRINT THE RESULTS
*
WRITE(NULOUT,FMT=9006)'CHARACTERISTIC LENGTHS (KM)',
+ 'PP', 'UC', 'UT', 'LQ', 'TB', 'UP', 'TG'
!
DO JK = 1, NFLEV
WRITE(NULOUT,FMT=9007) JK,
S ZLPSI(JK)/1000., ZLCHI(JK)/1000., ZLTT(JK)/1000.,
S ZLLQ(JK)/1000., ZLTB(JK)/1000., ZLPS/1000., ZLTG/1000.
END DO
*
9000 FORMAT(/,8X,A,/)
9006 FORMAT(///,'%%',12X,A,/,2x,'Level (hPa)'
S ,6x,A,10x,A
S ,15x,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
S ,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, 6
!
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.)
!
else if(CLNOMVAR.eq.'TB') then
IERR =VFSTECR
(ZLTB,ZLTB,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