!-------------------------------------- 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 vloc_corns(pcorns) 4,15
!
        use mod4dv, only : l4dvar
        use modfgat, only : nstamplist
        IMPLICIT NONE
#if defined (DOC)
*
***s/r  vloc_corns - Vertical Localization of CORNS vertical correlations.
*              Based on approach used in sucorns2.ftn following Mark Buehner's global code.
*              This is found newcessary to control the noise and impact of raw CORNS
*              when TOVS data are assimilated in stratospheric mode; i.e. it was found in lam4d
*              that stratospheric chanels only can impact (~ 0.5 deg) the PBL vertical gradient
*              which is undesirable. Reversely, troposheric data can have a noisy impact on stratospheric
*              increments using raw CORNS. These effects are serious during the summer and can significantly
*              slow-down the minimization (60 to 200 iterations in FGAT mode).
* 
*              N.B.: THe case nanalvar .eq.3 is also supported here.
*
*Author  : Luc Fillion - ARMA/EC - 17 Feb 2009.
*Revision:
*
#endif
#include "pardim.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
#include "comcorr.cdk"
#include "comcva.cdk"
#include "comgem.cdk"
#include "comleg.cdk"
#include "comcst.cdk"
#include "comspg.cdk"
#include "rpnstd.cdk"
#include "comfftla.cdk"
#include "comgrd_param.cdk"
#include "cvcord.cdk"
*
      real*8 pcorns(nksdim2,nksdim2,0:nband-1,1)
!
      INTEGER IJ,II,II2,IN,JK1,JK2,jband
      integer ibrpstamp
      real*8 zps
      real*8 ztt(nflev,nflev,nband),ztpsi(nflev,nflev,nband)
      real*8 zprof(jpnflev)
      real*8 zgaspar(nflev,nflev)
!
!!
      write(NULOUT,*)'  *********************************************'
      write(NULOUT,*)'  vloc_corns --- Vertical Localization of CORNS'
      write(NULOUT,*)'  *********************************************'
!
!1.   Apply vertical localization to CORNS
!     ------------------------------------
!
      zps = 101000. 0
      call calcpres(zprof,vhybinc,nflev,zps,rptopinc
     &             ,rprefinc,rcoefinc,1)
!
      do jk1=1,nflev
        write(nulout,*)'vloc_corns:lev,hyb,zprof,log= ',jk1,vhybinc(jk1)
     &              ,zprof(jk1),log(zprof(jk1))
      enddo
!
! PP-PP  correlations
!
      write(nulout,*)'vloc_corns: RVLOCPSI = ',RVLOCPSI
      call v_gaspar(zgaspar,zprof,RVLOCPSI)
!
      do jk1=1,nflev
        do jk2=1,nflev
          do jband=1,nband
            pcorns(jk1,jk2,jband-1,1)
     &      = pcorns(jk1,jk2,jband-1,1)*zgaspar(jk1,jk2)
          enddo
        enddo
      enddo
!
! PP-CC  correlations
!
      write(nulout,*)'vloc_corns: RVLOCPSI = ',RVLOCPSI
      call v_gaspar(zgaspar,zprof,RVLOCPSI)
!
      do jk1=1,nflev
        do jk2=1,nflev
          do jband=1,nband
            pcorns(jk1,jk2+nflev,jband-1,1)
!cluc     &      = 0.0
     &      = pcorns(jk1,jk2+nflev,jband-1,1)*zgaspar(jk1,jk2)
            pcorns(jk1+nflev,jk2,jband-1,1)
!cluc     &      = 0.0
     &      = pcorns(jk1+nflev,jk2,jband-1,1)*zgaspar(jk1,jk2)
          enddo
        enddo
      enddo
!
! PP-Tu  correlations  (meanningfull for mbal_order = 0)
!
      write(nulout,*)'vloc_corns: RVLOCPSI = ',RVLOCPSI
      call v_gaspar(zgaspar,zprof,RVLOCPSI)
!
      do jk1=1,nflev
        do jk2=1,nflev
          do jband=1,nband
            pcorns(jk1,jk2+2*nflev,jband-1,1)
     &      = pcorns(jk1,jk2+2*nflev,jband-1,1)*zgaspar(jk1,jk2)
            pcorns(jk1+2*nflev,jk2,jband-1,1)
     &      = pcorns(jk1+2*nflev,jk2,jband-1,1)*zgaspar(jk1,jk2)
          enddo
        enddo
      enddo
!
! PP-Lnq  correlations
!
      write(nulout,*)'vloc_corns: RVLOCPSI = ',RVLOCPSI
      call v_gaspar(zgaspar,zprof,RVLOCPSI)
!
      do jk1=1,nflev
        do jk2=1,nflev
          do jband=1,nband
            pcorns(jk1,jk2+3*nflev,jband-1,1)
     &      = 0.0
!cluc     &      = pcorns(jk1,jk2+3*nflev,jband-1,1)*zgaspar(jk1,jk2)
            pcorns(jk1+3*nflev,jk2,jband-1,1)
     &      = 0.0
!cluc     &      = pcorns(jk1+3*nflev,jk2,jband-1,1)*zgaspar(jk1,jk2)
          enddo
        enddo
      enddo
!
! PP-Tb  correlations
!
      if(nanalvar.eq.4) then
        write(nulout,*)'vloc_corns: RVLOCBALT = ',RVLOCBALT
        call v_gaspar(zgaspar,zprof,RVLOCBALT)
!
        do jk1=1,nflev
          do jk2=1,nflev
            do jband=1,nband
              pcorns(jk1,jk2+nksdim,jband-1,1)
     &        = pcorns(jk1,jk2+nksdim,jband-1,1)*zgaspar(jk1,jk2)
              pcorns(jk1+nksdim,jk2,jband-1,1)
     &        = pcorns(jk1+nksdim,jk2,jband-1,1)*zgaspar(jk1,jk2)
            enddo
          enddo
        enddo
      endif
!
! CC-CC correlations
!
      write(nulout,*)'vloc_corns: RVLOCCHI = ',RVLOCCHI
      call v_gaspar(zgaspar,zprof,RVLOCCHI)
!
      do jk1=1,nflev
        do jk2=1,nflev
          do jband=1,nband
            pcorns(jk1+nflev,jk2+nflev,jband-1,1)
     &      = pcorns(jk1+nflev,jk2+nflev,jband-1,1)*zgaspar(jk1,jk2)
          enddo
        enddo
      enddo
!
! CC-TT correlations
!
      write(nulout,*)'vloc_corns: RVLOCCHI = ',RVLOCCHI
      call v_gaspar(zgaspar,zprof,RVLOCCHI)
!
      do jk1=1,nflev
        do jk2=1,nflev
          do jband=1,nband
            pcorns(jk1+nflev,jk2+2*nflev,jband-1,1)
     &      = 0.0
!cluc     &      = pcorns(jk1+nflev,jk2+2*nflev,jband-1,1)*zgaspar(jk1,jk2)
            pcorns(jk1+2*nflev,jk2+nflev,jband-1,1)
     &      = 0.0
!cluc     &      = pcorns(jk1+2*nflev,jk2+nflev,jband-1,1)*zgaspar(jk1,jk2)
          enddo
        enddo
      enddo
!
! CC-Lnq correlations
!
      write(nulout,*)'vloc_corns: RVLOCCHI = ',RVLOCCHI
      call v_gaspar(zgaspar,zprof,RVLOCCHI)
!
      do jk1=1,nflev
        do jk2=1,nflev
          do jband=1,nband
            pcorns(jk1+nflev,jk2+3*nflev,jband-1,1)
     &      = 0.0
!     &      = pcorns(jk1+nflev,jk2+3*nflev,jband-1,1)*zgaspar(jk1,jk2)
            pcorns(jk1+3*nflev,jk2+nflev,jband-1,1)
     &      = 0.0
!cluc     &      = pcorns(jk1+3*nflev,jk2+nflev,jband-1,1)*zgaspar(jk1,jk2)
          enddo
        enddo
      enddo
!
! Tu-Tu correlations
!
      write(nulout,*)'vloc_corns: RVLOCUNBALT = ',RVLOCUNBALT
      call v_gaspar(zgaspar,zprof,RVLOCUNBALT)
!
      do jk1=1,nflev
        do jk2=1,nflev
          do jband=1,nband
            pcorns(jk1+2*nflev,jk2+2*nflev,jband-1,1)
     &      = pcorns(jk1+2*nflev,jk2+2*nflev,jband-1,1)*zgaspar(jk1,jk2)
          enddo
        enddo
      enddo
!
! Tu-Lnq correlations
!
      write(nulout,*)'vloc_corns: RVLOCUNBALT = ',RVLOCUNBALT
      call v_gaspar(zgaspar,zprof,RVLOCUNBALT)
!
      do jk1=1,nflev
        do jk2=1,nflev
          do jband=1,nband
            pcorns(jk1+2*nflev,jk2+3*nflev,jband-1,1)
     &      = 0.0
!cluc     &      = pcorns(jk1+2*nflev,jk2+3*nflev,jband-1,1)*zgaspar(jk1,jk2)
            pcorns(jk1+3*nflev,jk2+2*nflev,jband-1,1)
     &      = 0.0
!cluc     &      = pcorns(jk1+3*nflev,jk2+2*nflev,jband-1,1)*zgaspar(jk1,jk2)
          enddo
        enddo
      enddo
!
! Lnq
!
      write(nulout,*)'vloc_corns: RVLOCLQ = ',RVLOCLQ
      call v_gaspar(zgaspar,zprof,RVLOCLQ)
!
      do jk1=1,nflev
        do jk2=1,nflev
          do jband=1,nband
            pcorns(jk1+3*nflev,jk2+3*nflev,jband-1,1)
     &      = pcorns(jk1+3*nflev,jk2+3*nflev,jband-1,1)*zgaspar(jk1,jk2)
          enddo
        enddo
      enddo
!
! TB_TB
!
      if(nanalvar.eq.4) then
        write(nulout,*)'vloc_corns: RVLOCBALT = ',RVLOCBALT
        call v_gaspar(zgaspar,zprof,RVLOCBALT)
!
        do jk1=1,nflev
          do jk2=1,nflev
            do jband=1,nband
              pcorns(jk1+4*nflev,jk2+4*nflev,jband-1,1)
     &        = pcorns(jk1+4*nflev,jk2+4*nflev,jband-1,1)*zgaspar(jk1,jk2)
            enddo
          enddo
        enddo
      endif
!
!      call normcornsla(pcorns)
!
 998  continue
      return
      end