!-------------------------------------- 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 dft2d_rpn(psp,pgd,kiway,kni,knj) 2,4
!
!**s/r dft2d_rpn  - 
!
!Author  : Luc Fillion *MSC/CAN - 2 Nov 2004. Adaptation for 3D-VAR of original Bertrand Denis's version.
!Revision:
!
!Arguments
!  psp: Output spectral array (kni+2,knj+2)
!  pgd: Input  gridpoint array (kni,knj)
!
      IMPLICIT NONE
*implicits
#include "taglam4d.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
!
      integer kiway,kni,knj 
      real*8 psp((kni+2)*(knj+2))
      real*8 pgd(kni*knj)
!
      integer nid,njd,mmax,nmax,nip,njp,init,injt
      integer i,j,ij,ijt,imaxl,cas
      integer iway,iaxe,nx,ny,nfact
      real*8 zr1((kni+2)*(knj+2))
      real*8 zr2((kni+2)*(knj+2))
      real*8 zr3((kni+2)*(knj+2))
!
!!
!      write(nulout,*) 'DFT2DRPN: START'
      cas=5  ! regular (sin,cos) DFT
      imaxl=(kni+2)*(knj+2)   
!
      IF (MOD( kni,2 ).EQ.0 .OR.
     &        MOD( knj,2 ).EQ.0 )                               THEN
            
!        WRITE(6,*) ' STANDARD PERIODIC FOURIER TRANSFORMS',
!     &             ' REQUIRE THAT DIMENSIONS BE ODD'
!        CALL                                 XIT(' Varspec',-6 )
            
      endif
      nid = kni            ! NUMBER OF DISTINCT POSITION IN X.
      njd = knj            ! NUMBER OF DISTINCT POSITION IN X.

***   ISSUE A WARNING IF A FAST TRANSFORM CANNOT BE USED.

      NFACT = NID
      CALL NGFFT( NFACT )
      IF (NFACT.NE.NID)                                    THEN 
        WRITE(6,*) 'WARNING: A FAST TRANSFORM CANNOT BE USED:'
        WRITE(6,6110) NID,NFACT
      endif
!
      NFACT = NJD
      CALL NGFFT( NFACT )
      IF (NFACT.NE.NJD)                                    THEN 
        WRITE(6,*) 'WARNING: A FAST TRANSFORM CANNOT BE USED:'
        WRITE(6,6120) NJD,NFACT
      endif
!
***   SET THE MAXIMUM OF INTEGER WAVENUMBERS SUPPORTED BY THE GRID.
!      
      MMAX = NID/2
      NMAX = NJD/2

***   NEED TO PADD THE INPUT ARRAY
!
*                       --------------------
*                       |O O O O O O O O O |
*                       |O O O O O O O O O |
*                       |X X X X X X X O O |
*                       |X X X X X X X O O |
*                       |X X X X X X X O O |
*                       |X X X X X X X O O |
*                       --------------------
!
      if(kiway.eq.-1) then

        NIP = 2 ! EXTRA SPACES NEEDED BY THE FFT
        NJP = 2
!
        init = NID+NIP
        injt = NJD+NJP
!
        IJ  = 0
        IJT = 0

        DO  J=1,injt
            DO  I=1,init
                IJT = IJT+1
                IF (I.GT.NID .OR. 
     +              J.GT.NJD )                                   THEN
                    psp(IJT) = 0.0
                ELSE
                    IJ     = IJ+1
                    psp(IJT) = pgd(IJ)
                END IF
            END DO
        END DO
      else
      endif

***    DO THE TRANSFORMS IN TWO 1-D PASSES.
*      ======================================

***    FIRST PASS ==> ALONG INDEX "I"
*      ----------
      IWAY = kiway                   ! -1: gd2sp; +1: sp2gd
      

      IAXE = 0                    ! TRANSFORM FOLLOWING X
      
      IF (IAXE.EQ.0)                                           THEN
          NX = NID                ! TRANSFORM FOLLOWING X
          NY = NJD
      ELSE 
          NX = NJD                ! TRANSFORM FOLLOWING Y
          NY = NID
      END IF

      CALL TRANS1D(psp,zr1,zr2,zr3,imaxl,NX,NY,CAS,IAXE,IWAY )

      IAXE = 1                    ! TRANSFORM FOLLOWING Y

      IF (IAXE.EQ.0)                                           THEN
          NX = NID                ! TRANSFORM FOLLOWING X
          NY = NJD                ! TRANSFORM FOLLOWING X
      ELSE 
          NX = NJD                ! TRANSFORM FOLLOWING Y
          NY = NID                ! TRANSFORM FOLLOWING X
      END IF

***    SECOND PASS => ALONG INDEX "J"
*      -----------

      CALL TRANS1D(psp,zr1,zr2,zr3,imaxl,NX,NY,CAS,IAXE,IWAY )

      if(kiway.eq.+1) then

        NIP = 2 ! EXTRA SPACES NEEDED BY THE FFT
        NJP = 2
!
        init = NID+NIP
        injt = NJD+NJP
!
        IJ  = 0
        IJT = 0

        DO  J=1,injt
            DO  I=1,init
                IJT = IJT+1
                IF (I.GT.NID .OR. 
     +              J.GT.NJD )                                   THEN
                    psp(IJT) = 0.0
                ELSE
                    IJ     = IJ+1
                    pgd(IJ) = psp(IJT)
                END IF
            END DO
        END DO
      endif
!
!
 0004 FORMAT(A4)
 0005 FORMAT(BN,I5)
 0010 FORMAT(BN,E10.0)

 5000 FORMAT(10X,3I5,E5.0) 

 6000 FORMAT(5X,A4,I12,1X,A4,I10,2I4,I8,I6)
 6001 FORMAT(' CAS  =',I1)
 6002 FORMAT(' LOGV =',I1)
 6003 FORMAT(' CLUST=',I1)
 6004 FORMAT(' DX   =',F10.5,' Kilometers.')
 6010 FORMAT('0',I6,' records processed.')
 6110 FORMAT('N = kni-1  =  ', I4,' THE nearest factorizable N = ',I4)
 6120 FORMAT('N = knj-1  =  ', I4,' the nearest factorizable N = ',I4)
 6130 FORMAT('N = kni = ', I4,' the nearest factorizable N = ',I4)
 6140 FORMAT('N = knj = ', I4,' the nearest factorizable N = ',I4)
 6160 FORMAT(' Problem reading input parametres.')
!
!      write(nulout,*) 'DFT2DRPN: END'
      return
      end