!-------------------------------------- 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 writecornsla(pcorns,peig_vec,peig_val,kulcorns,cdflcorns, 6,10
     &                        kdatestamp,kensemble,cdcase,ldnorm)
*
*
#if defined (DOC)
*
***s/r writecornsla  - For Mesovar case: Output CORNS and RSTDDEV on kulcorns RPN standard files
*
*
*Author  : L. Fillion - ARMA/MSC - 3 Oct 2005. 
*Revision:
*
*    L. Fillion - ARMA/EC - 14 Sep 2006 - Output spatial resolution on output file using IP1 parameter.
*    L. Fillion - ARMA/EC - 15 Dec 2008 - All output on kulcorns file only.
*    L. Fillion - ARMA/EC - 14 Jan 2009 - Upgrade lam4d to v_10_1_2. Extra dimension for CORNS.
*    L. Fillion - ARMA/EC - 9 Mar 2009 -  Introduce arguments peig_vec,peig_val
*    L. Fillion - ARMA/EC - Sept 2009 -  Write desired correlation block on ASCI file for publication
*    -------------------
**    Purpose: to estimate the forecast error correlation from an
*     .        ensemble of normalized and unbiased residuals such
*     .        as differences between 12/24h forecast valid at the
*     .        same time
*Arguments
*     KULCORNS  : logical unit assigned to the CORNS file
*     CDFLCORNS : filename for CORNS
*     KDATESTAMP: date of validity
*     KENSEMBLE : number of members in the ensemble used to
*     .           estimate these correlations
#endif
      IMPLICIT NONE
*implicits
*
*     Global variables
*
#include "taglam4d.cdk"
#include "comdim.cdk"
#include "comcorr.cdk"
#include "comcst.cdk"
#include "comgrd_param.cdk"
#include "comgrd.cdk"
#include "comlun.cdk"
#include "comlunla.cdk"
#include "comfftla.cdk"
#include "comcva.cdk"
#include "comcse1.cdk"

#include <rpnmacros_f.h>
*
*     Arguments
*
      character*3 cdcase
      CHARACTER*16 CDFLCORNS
      INTEGER KULCORNS, KDATESTAMP, KENSEMBLE
      real*8 pcorns(nksdim2,nksdim2,0:nband-1,1)
      real*8 peig_vec(nksdim2,nksdim2,nband), peig_val(nksdim2,nband)
*
*     Local variables
*
      character*2 cltypvar,clnomvar
      character*8 cletiket
      character*2 clfield
      integer ii,ji,jj,ij
      real*8 zppttcor(nflev,nflev)
!
      logical ldnorm
      integer jband,ii,ii2,ij,ifois,jrow,jcol
      data ifois/0/
      INTEGER JN, IERR, IPAK, ILEN,JK,JL, ISIZ
      integer idum1,idum2,idum3,idum4
      real*8 zmin,zmax
      real*8 zcon, zfact
      REAL*8 zcorr(nflev,nflev)
      REAL*8 zcorr2(nksdim2,nksdim2)
      REAL*8 zmbandsp(nband)
      real*8 zstdsrc(nksdim2)
      real*8 ztt(nflev,nflev,nband)
      real*8 ztpsi(nflev,nflev,nband)
      real*8 zcorns(nksdim2,nksdim2,0:nband-1,1)
      real*8 zmaxmin(nksdim2,nksdim2)
*
      INTEGER VFSTECR
*
*     *    RPN Standard files parameters
*
      INTEGER IP1,IP2,IP3, IDATYP, IDATEO
*
!
!!
      write(nulout,*) 'writecornsla: cdcase = ',cdcase
      zcorr(:,:) = 0.0
!
      IPAK = -32
      IDATYP = 5
      IP1 = 0
      IP3 = KENSEMBLE
      IDATEO = KDATESTAMP
!
      if(ifois.eq.0) then
        ifois = 1 
!
!       MBANDSP
!
        do jband = 1, nband
          zmbandsp(jband) = real(mbandsp(jband))
        enddo
!
        ip1 = anint(111.*(1.e3)*grd_dx) ! grid resolution in meters
        IP2 = 0
        IERR = VFSTECR(zmbandsp,zmbandsp,IPAK,KULCORNS
     &                ,IDATEO,0,0,nband,1,1
     &                ,IP1,IP2,IP3,'SS','ZZ','MBANDSP ','X'
     &                ,0,0,0,0,IDATYP,.TRUE.)
       
!
        ip1 = anint(111.*(1.e3)*grd_dx) ! grid resolution in meters
!
!       RSTDDEV
!
        do jband = 1, nband
           do jk = 1, nksdim2
             zstdsrc(jk) = RSTDDEV(jk,jband-1)
           enddo
!           do jk = 1, nksdim2
!             write(nulout,*) 'writecornsla: jband,jk,rstddev(jk,jband-1)=',
!     &            jband,jk,rstddev(jk,jband-1)
!           enddo
!
           IP2 = jband-1
           IERR = VFSTECR(zstdsrc,zstdsrc,IPAK,kulcorns
     S          ,IDATEO,0,0,nksdim2,1,1
     S          ,IP1,IP2,IP3,'SS','ZZ','RSTDDEV ','X'
     S          ,0,0,0,0,IDATYP,.TRUE.)
        enddo
        IERR = VFSTECR(zstdsrc,zstdsrc,IPAK,kulcorns
     S       ,IDATEO,0,0,nksdim2,nband-1,1
     S       ,IP1,IP2,IP3,'SS','ZZ','RSTDDEV2','X'
     S       ,0,0,0,0,IDATYP,.TRUE.)
      endif
!
!     CORNS
!
      if(cdcase.eq.'ORI') then
        cltypvar = 'SS'
        clnomvar = 'ZZ'
        cletiket = 'CORRNS  '
      else if(cdcase.eq.'LOC') then
        cltypvar = 'XX'
        clnomvar = 'ZN'
        cletiket = 'CORNSLOC'
      else if(cdcase.eq.'MIN') then
        cltypvar = 'XX'
        clnomvar = 'ZN'
        cletiket = 'CORNSMIN'
      endif
!
      do jband = 1, nband
        do jcol = 1,nksdim2
          do jrow = 1,nksdim2
            zcorns(jrow,jcol,jband-1,1) = pcorns(jrow,jcol,jband-1,1)
            zmaxmin(jrow,jcol)=zcorns(jrow,jcol,jband-1,1)
          enddo
        enddo
        write(nulout,*) 'writecornsla: Point 1, jband = ',jband
        call maxmin(zmaxmin,nksdim2,1,nksdim2,zmin,zmax,
     &              idum1,idum2,idum3,idum4,'writecornsla',
     &              'COR')
      enddo
!
      if(.not.ldnorm.and.(cdcase.ne.'MIN')) call scalecorns(zcorns,'D')
!
      do jband = 1, nband
         IP2 = jband-1
         IERR = VFSTECR(zcorns(1,1,jband-1,1),zcorns(1,1,jband-1,1),IPAK,KULCORNS
     &        ,IDATEO,0,0,nksdim2,nksdim2,1
     &        ,IP1,IP2,IP3,cltypvar,clnomvar,cletiket,'X'
     &        ,0,0,0,0,IDATYP,.TRUE.)
      enddo
!
!     *    . 3.5 Calcultate the total vertical correlation matrix and
!                write on file (cf. step 7. of "Summary" section of Lam4d document)
!
      if(cdcase.ne.'MIN') then
        if(cdcase.eq.'ORI') then
          cletiket = 'CORV_ORI'
        else if(cdcase.eq.'LOC') then
          cletiket = 'CORV_LOC'
        endif
!
        DO JK = 1, nflev
          DO JL = 1, nflev
            zcorr(JK,JL) = 0.0
            do jband = 1, nband
              zcon = 2.d0
              if(jband.eq.1) zcon = 1.d0
              zfact = 2.d0*mbandsp(jband) - zcon
              if(jband.eq.1) zfact = 2.*zfact
              zcorr(JK,JL) = zcorr(JK,JL) +
     &           zfact*wvnbtot(jband)*RSTDDEV(JK,jband-1)*RSTDDEV(JL,jband-1)
     &           * zcorns(JK,JL,jband-1,1)
            END DO
          END DO
        END DO
!
        DO JK = 1, nflev
           DO JL = 1, nflev
             if(zcorr(JK,JK).gt.0.0.and.zcorr(JL,JL).gt.0.0) then ! avoid zero corns due to spectral filtering...
              zcorr(JK,JL) = zcorr(JK,JL) / (SQRT(zcorr(JK,JK)
     &                                        * zcorr(JL,JL)))
            endif
           END DO
        END DO
        DO JK = 1, nflev
          write(nulout,*) 'writecornsla: jk, zcorr(nflev/2,jk) = ',jk,zcorr(nflev/2,JK)
        enddo
!
        IERR = VFSTECR(zcorr(1,1),zcorr(1,1),IPAK,KULCORNS
     &               ,IDATEO,0,0,nflev,nflev,1
     &               ,IP1,IP2,IP3,cltypvar,'TT',cletiket,'X'
     &               ,0,0,0,0,IDATYP,.TRUE.)
      endif
!
!     Write desired correlation block on ASCI file for publication
!     ------------------------------------------------------------
!
      clfield = 'CO'
!
      jn = 5
!
      do ji = 1, nflev
        ii = 2*nflev+ji
        do jj = 1, nflev
          ij = 2*nflev+jj
          zppttcor(ji,jj) = zcorns(ji,ij,jn,1)
        enddo
      enddo
!
      open (unit=nutemp,file='psi_tt_corr_wvnb_05_lam.od')
      write(nutemp,910) nflev,nflev,1
      write(nutemp,'(A2)') clfield
      jk = 1
      write(nutemp,920) jk
      do jj = 1, nflev
        write(nutemp,800) (zppttcor(ji,jj),ji=1,nflev)
      enddo
      close(nutemp)
!
 800  format(100(E13.7,1X))
 900  format(E13.7,1X,$)
 901  format(E13.7)
 910  format(3(I4,1X))
 920  format(I4)
!
      if(cdcase.eq.'EIG') then
!
        write(nulout,*) 'writecornsla: writing eigenvalues/eigenvectors of CORNS'
!
! EIGVAL
!
         do jk = 1, nksdim2
           write(nulout,*) 'writecornsla: jband,jk,peig_val(jk,5)=',
     &             jband,jk,peig_val(jk,5)
         enddo
!
         IP2 = nband
         IERR = VFSTECR(peig_val,peig_val,IPAK,kulcorns
     S          ,IDATEO,0,0,nksdim2,nband,1
     S          ,IP1,IP2,IP3,'X','EI','EIGENVAL','X'
     S          ,0,0,0,0,IDATYP,.TRUE.)
!
! EIGVEC
!
        do jband = 1, nband
           IP2 = jband-1
           IERR = VFSTECR(peig_vec(1,1,jband),peig_vec(1,1,jband),IPAK,KULCORNS
     &        ,IDATEO,0,0,nksdim2,nksdim2,1
     &        ,IP1,IP2,IP3,'X','EV','EIGENVEC','X'
     &        ,0,0,0,0,IDATYP,.TRUE.)
        enddo
!
        call outhoriz2d(peig_val,'eigvalcor.od','EI',1,
     &                  1,nksdim2,1,nksdim2,nksdim2,nksdim2,1)
!
      endif
 998  continue
!
      END