*IF DEF,C91_1C                                                             FOURIE2B.2      
! *****************************COPYRIGHT******************************     FOURIE2B.3      
! (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    FOURIE2B.4      
!                                                                          FOURIE2B.5      
! Use, duplication or disclosure of this code is subject to the            FOURIE2B.6      
! restrictions as set forth in the contract.                               FOURIE2B.7      
!                                                                          FOURIE2B.8      
!                Meteorological Office                                     FOURIE2B.9      
!                London Road                                               FOURIE2B.10     
!                BRACKNELL                                                 FOURIE2B.11     
!                Berkshire UK                                              FOURIE2B.12     
!                RG12 2SZ                                                  FOURIE2B.13     
!                                                                          FOURIE2B.14     
! If no contract has been raised with this copy of the code, the use,      FOURIE2B.15     
! duplication or disclosure of it is strictly prohibited.  Permission      FOURIE2B.16     
! to do so must first be obtained in writing from the Head of Numerical    FOURIE2B.17     
! Modelling at the above address.                                          FOURIE2B.18     
! ******************************COPYRIGHT******************************    FOURIE2B.19     
!+                                                                         FOURIE2B.20     
!                                                                          FOURIE2B.21     
! Subroutine Interface:                                                    FOURIE2B.22     

      SUBROUTINE FOURIER(A,TRIGS,IFAX,INC,JUMP,N,LOT,ISIGN)                 8,6FOURIE2B.23     
      implicit none                                                        FOURIE2B.24     
!                                                                          FOURIE2B.25     
! Description:                                                             FOURIE2B.26     
!                                                                          FOURIE2B.27     
!     SUBROUTINE 'FOURIER' - MULTIPLE FAST REAL PERIODIC TRANSFORM         FOURIE2B.28     
!     UNIFIED MODEL RE-WRITE OF ECMWF ROUTINE FFT991                       FOURIE2B.29     
!                                                                          FOURIE2B.30     
!     REAL TRANSFORM OF LENGTH N PERFORMED BY REMOVING REDUNDANT           FOURIE2B.31     
!     OPERATIONS FROM COMPLEX TRANSFORM OF LENGTH N                        FOURIE2B.32     
!                                                                          FOURIE2B.33     
!     INPUT INFORMATION ...                                                FOURIE2B.34     
!     A IS THE ARRAY CONTAINING INPUT & OUTPUT DATA                        FOURIE2B.35     
!     TRIGS IS A PREVIOUSLY PREPARED LIST OF TRIG FUNCTION VALUES          FOURIE2B.36     
!     IFAX IS A PREVIOUSLY PREPARED LIST OF FACTORS OF N                   FOURIE2B.37     
!     INC IS THE INCREMENT WITHIN EACH DATA 'VECTOR'                       FOURIE2B.38     
!         (E.G. INC=1 FOR CONSECUTIVELY STORED DATA)                       FOURIE2B.39     
!     JUMP IS THE INCREMENT BETWEEN THE START OF EACH DATA VECTOR          FOURIE2B.40     
!     N IS THE LENGTH OF THE DATA VECTORS                                  FOURIE2B.41     
!     LOT IS THE NUMBER OF DATA VECTORS                                    FOURIE2B.42     
!     ISIGN = +1 FOR TRANSFORM FROM SPECTRAL TO GRIDPOINT                  FOURIE2B.43     
!           = -1 FOR TRANSFORM FROM GRIDPOINT TO SPECTRAL                  FOURIE2B.44     
!                                                                          FOURIE2B.45     
!     ORDERING OF COEFFICIENTS:                                            FOURIE2B.46     
!         A(0),B(0),A(1),B(1),A(2),B(2),...,A(N/2),B(N/2)                  FOURIE2B.47     
!         WHERE B(0)=B(N/2)=0; (N+2) LOCATIONS REQUIRED                    FOURIE2B.48     
!                                                                          FOURIE2B.49     
!     ORDERING OF DATA:                                                    FOURIE2B.50     
!         X(0),X(1),X(2),...,X(N-1), 0 , 0 ; (N+2) LOCATIONS REQUIRED      FOURIE2B.51     
!                                                                          FOURIE2B.52     
!     VECTORIZATION IS ACHIEVED ON CRAY BY DOING THE TRANSFORMS            FOURIE2B.53     
!     IN PARALLEL                                                          FOURIE2B.54     
!                                                                          FOURIE2B.55     
!     N MUST BE COMPOSED OF FACTORS 2,3 & 5 BUT DOES NOT HAVE TO BE        FOURIE2B.56     
!     EVEN                                                                 FOURIE2B.57     
!                                                                          FOURIE2B.58     
!     DEFINITION OF TRANSFORMS:                                            FOURIE2B.59     
!     -------------------------                                            FOURIE2B.60     
!                                                                          FOURIE2B.61     
!     ISIGN=+1: X(J)=SUM(K=0,...,N-1)(C(K)*EXP(2*I*J*K*PI/N))              FOURIE2B.62     
!         WHERE C(K)=A(K)+I*B(K) AND C(N-K)=A(K)-I*B(K)                    FOURIE2B.63     
!                                                                          FOURIE2B.64     
!     ISIGN=-1: A(K)=(1/N)*SUM(J=0,...,N-1)(X(J)*COS(2*J*K*PI/N))          FOURIE2B.65     
!               B(K)=-(1/N)*SUM(J=0,...,N-1)(X(J)*SIN(2*J*K*PI/N))         FOURIE2B.66     
!     ..................................................................   FOURIE2B.67     
!     MULTITASKING NOTE: ERROR TRAPPING NOT WORKING IN PRESENT FORM IF     FOURIE2B.68     
!                        CODE IS MULTITASKED.                              FOURIE2B.69     
!                                                                          FOURIE2B.70     
!     NOT SUITABLE FOR SINGLE COLUMN USE.                                  FOURIE2B.71     
!                                                                          FOURIE2B.72     
!     VERSION FOR CRAY Y-MP                                                FOURIE2B.73     
!     REWRITTEN TO UNIFIED MODEL PROGRAMMING STANDARDS FROM ECMWF          FOURIE2B.74     
!     ORIGINAL CODE BY M.H.MAWSON                                          FOURIE2B.75     
!     ORIGINAL CODE WRITER C. TEMPERTON                                    FOURIE2B.76     
!                                                                          FOURIE2B.77     
! History:                                                                 FOURIE2B.78     
! Version   Date     Comment                                               FOURIE2B.79     
! -------   ----     -------                                               FOURIE2B.80     
!                                                                          FOURIE2B.81     
!    4.2*    06/12/96 * Not included in the UM until 4.3.                  FOURIE2B.82     
!                     This version gives exactly the same results          FOURIE2B.83     
!                     on the C90 and T3E as those returned in              FOURIE2B.84     
!                     libmet.a on the C90.  It deals with inc being        FOURIE2B.85     
!                     values other than 1.  It does not have the           FOURIE2B.86     
!                     following error:                                     FOURIE2B.87     
!                     On the grid to spectral transform it returns         FOURIE2B.88     
!                     the the B terms as being positive, whereas           FOURIE2B.89     
!                     FFT991 returns the negative for the B terms.         FOURIE2B.90     
!                     On the inverse transform a change of sign in         FOURIE2B.91     
!                     required again if a change is effected on the        FOURIE2B.92     
!                     forward transform.                                   FOURIE2B.93     
!                     Supplied by A Mills, Cray.  K Rogers                 FOURIE2B.94     
!    4.3    11/4/97   Corrections made to vn4.2                            FOURIE2B.95     
!                     Additional routine InitFourier is not to be          FOURIE2B.96     
!                     used by this version of Fourier. It has been         FOURIE2B.97     
!                     included for use with a later version                FOURIE2B.98     
!                     of Fourier which takes advantage of storing the      FOURIE2B.99     
!                     factor and trig tables.                              FOURIE2B.100    
!                     Supplied by A Mills, Cray.  I Edmond                 FOURIE2B.101    
!    4.5    09/7/98   Added direct call to 'INC_1_FOURIER'                 GBCNF405.68     
!                     if 'INC' is unity.  INC_1_FOURIER is                 GBCNF405.69     
!                     essentially FOURIE2A with some additional            GBCNF405.70     
!                     checks.  This call avoids any data copies.           GBCNF405.71     
!                       Author: Bob Carruthers, Cray Research              GBCNF405.72     
!                                                                          FOURIE2B.102    
! This routine is compatable with routine in FOURIER                       FOURIE2B.103    
!                                                                          FOURIE2B.104    
! It calls the Cray standard routines scfft and csfft.                     FOURIE2B.105    
!                                                                          FOURIE2B.106    
! It must rearrange the data before and after the call to scfft and csff   FOURIE2B.107    
! The rearrangement of the data is dependent on whether the transform      FOURIE2B.108    
! is grid to spectral or spectral to grid.                                 FOURIE2B.109    
!                                                                          FOURIE2B.110    
! Be careful to understand all of this before changing anything!           FOURIE2B.111    
!                                                                          FOURIE2B.112    
! Code Description:                                                        FOURIE2B.113    
!   Language: FORTRAN 77 + common extensions.                              FOURIE2B.114    
!   This code is written to UMDP3 v6 programming standards.                FOURIE2B.115    
!                                                                          FOURIE2B.116    
! System component covered: <appropriate code>                             FOURIE2B.117    
! System Task:              <appropriate code>                             FOURIE2B.118    
!                                                                          FOURIE2B.119    
! Declarations:                                                            FOURIE2B.120    
                                                                           FOURIE2B.121    
! 1.0 Subroutine arguments                                                 FOURIE2B.122    
!   1.1 Scalar arguments with intent(in):                                  FOURIE2B.123    
      integer                                                              FOURIE2B.124    
     & inc                                                                 FOURIE2B.125    
     &,n                                                                   FOURIE2B.126    
     &,lot                                                                 FOURIE2B.127    
     &,jump                                                                FOURIE2B.128    
     &,isign                                                               FOURIE2B.129    
                                                                           FOURIE2B.130    
!   1.2 Array arguments with intent(in):                                   FOURIE2B.131    
      integer ifax(10)                                                     FOURIE2B.132    
                                                                           FOURIE2B.133    
      real    trigs(3*n)                                                   FOURIE2B.134    
                                                                           FOURIE2B.135    
!   1.3 Array arguments with intent(in/out):                               FOURIE2B.136    
      real a(1+jump*(lot-1)+inc*(n+1))                                     FOURIE2B.137    
                                                                           FOURIE2B.138    
!   2.1 Local scalars:                                                     FOURIE2B.139    
      integer                                                              FOURIE2B.140    
     &        k                                                            FOURIE2B.141    
     &       ,i                                                            FOURIE2B.142    
     &       ,l_sign                                                       FOURIE2B.143    
     &       ,isy                                                          FOURIE2B.144    
                                                                           FOURIE2B.145    
      real                                                                 FOURIE2B.146    
     &     scale                                                           FOURIE2B.147    
     &    ,local                                                           FOURIE2B.148    
                                                                           FOURIE2B.149    
!   2.2 Local arrays:                                                      FOURIE2B.150    
      real                                                                 FOURIE2B.151    
     &     l_work  (  4 + 4 * n) ! this will work for both MPP and PVP     FOURIE2B.152    
     &    ,l_table (100 + 4 * n) ! this will work for both MPP and PVP     FOURIE2B.153    
     &    ,l_data  (n+2)                                                   FOURIE2B.154    
                                                                           FOURIE2B.155    
!   3.0 Local parameters:                                                  FOURIE2B.156    
      integer forward                                                      FOURIE2B.157    
        parameter(forward=1)         ! grid to spectral in scfft           FOURIE2B.158    
      integer backward                                                     FOURIE2B.159    
        parameter(backward=-forward) ! spectral to grid in csff            FOURIE2B.160    
!- End of header                                                           FOURIE2B.161    
*IF DEF,T3E                                                                GBCNF405.73     
c                                                                          GBCNF405.74     
c--check if we can call the T3E Fourier code with no data                  GBCNF405.75     
c  copies                                                                  GBCNF405.76     
      if(inc.eq.1) then                                                    GBCNF405.77     
        call inc_1_fourier(a,trigs,ifax,inc,jump,n,lot,isign)              GBCNF405.78     
        return                                                             GBCNF405.79     
      endif                                                                GBCNF405.80     
*ENDIF                                                                     GBCNF405.81     
                                                                           FOURIE2B.162    
      isy  = 0                                                             FOURIE2B.163    
                                                                           FOURIE2B.164    
      call scfft(     0, n, scale, l_data, l_data, l_table, l_work, isy)   FOURIE2B.165    
      if (isign.eq.+1) then                                                FOURIE2B.166    
        l_sign = backward                                                  FOURIE2B.167    
        scale  = 1.0                                                       FOURIE2B.168    
        do k   = 1, lot                                                    FOURIE2B.169    
          do i = 1, n+1, 2                                                 FOURIE2B.170    
            l_data(i)    =  a( 1+(k-1)*jump +(i-1)*inc)                    FOURIE2B.171    
            l_data(i+1)  = -a( 1+(k-1)*jump + i   *inc)                    FOURIE2B.172    
          enddo                                                            FOURIE2B.173    
                                                                           FOURIE2B.174    
      call csfft(l_sign, n, scale, l_data, l_data, l_table, l_work, isy)   FOURIE2B.175    
          l_data(n+1) = 0.0                                                FOURIE2B.176    
          l_data(n+2) = 0.0                                                FOURIE2B.177    
          do i = 1, n+2                                                    FOURIE2B.178    
            a( 1+(k-1)*jump + (i-1) *inc) = l_data(i)                      FOURIE2B.179    
          enddo                                                            FOURIE2B.180    
        enddo                                                              FOURIE2B.181    
      else                                                                 FOURIE2B.182    
        l_sign = forward                                                   FOURIE2B.183    
        scale  = 1.0/n                                                     FOURIE2B.184    
        do k   = 1, lot                                                    FOURIE2B.185    
          do i = 1, n                                                      FOURIE2B.186    
            l_data(i) = a( 1+(k-1)*jump + (i-1) *inc)                      FOURIE2B.187    
          enddo                                                            FOURIE2B.188    
          l_data(n+1) = 0.0                                                FOURIE2B.189    
          l_data(n+2) = 0.0                                                FOURIE2B.190    
                                                                           FOURIE2B.191    
      call scfft(l_sign, n, scale, l_data, l_data, l_table, l_work, isy)   FOURIE2B.192    
          do i = 1, n+1, 2                                                 FOURIE2B.193    
            a( 1+(k-1)*jump +(i-1)*inc) =  l_data(i)                       FOURIE2B.194    
            a( 1+(k-1)*jump + i   *inc) = -l_data(i+1)                     FOURIE2B.195    
          enddo                                                            FOURIE2B.196    
        enddo                                                              FOURIE2B.197    
      endif                                                                FOURIE2B.198    
                                                                           FOURIE2B.199    
      end                                                                  FOURIE2B.200    
                                                                           FOURIE2B.201    
*IF DEF,T3E                                                                GBCNF405.82     
! *****************************COPYRIGHT******************************     GBCNF405.83     
! (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    GBCNF405.84     
!                                                                          GBCNF405.85     
! Use, duplication or disclosure of this code is subject to the            GBCNF405.86     
! restrictions as set forth in the contract.                               GBCNF405.87     
!                                                                          GBCNF405.88     
!                Meteorological Office                                     GBCNF405.89     
!                London Road                                               GBCNF405.90     
!                BRACKNELL                                                 GBCNF405.91     
!                Berkshire UK                                              GBCNF405.92     
!                RG12 2SZ                                                  GBCNF405.93     
!                                                                          GBCNF405.94     
! If no contract has been raised with this copy of the code, the use,      GBCNF405.95     
! duplication or disclosure of it is strictly prohibited.  Permission      GBCNF405.96     
! to do so must first be obtained in writing from the Head of Numerical    GBCNF405.97     
! Modelling at the above address.                                          GBCNF405.98     
! ******************************COPYRIGHT******************************    GBCNF405.99     
!+                                                                         GBCNF405.100    
!                                                                          GBCNF405.101    
! Subroutine Interface:                                                    GBCNF405.102    
CLL   SUBROUTINE INC_1_FOURIER --------------------------------------      GBCNF405.103    
CLL                                                                        GBCNF405.104    
CLL   PURPOSE: ......................................................      GBCNF405.105    
CLL                                                                        GBCNF405.106    
CLL   SUBROUTINE 'INC_1_FOURIER' - MULTIPLE FAST REAL PERIODIC TRANSFORM   GBCNF405.107    
CLL   UNIFIED MODEL RE-WRITE OF ECMWF ROUTINE FFT991, with unit            GBCNF405.108    
CLL   increment data which does therefore need copies on the T3E           GBCNF405.109    
CLL                                                                        GBCNF405.110    
CLL   REAL TRANSFORM OF LENGTH N PERFORMED BY REMOVING REDUNDANT           GBCNF405.111    
CLL   OPERATIONS FROM COMPLEX TRANSFORM OF LENGTH N                        GBCNF405.112    
CLL                                                                        GBCNF405.113    
CLL   INPUT INFORMATION ...                                                GBCNF405.114    
CLL   A IS THE ARRAY CONTAINING INPUT & OUTPUT DATA                        GBCNF405.115    
CLL   TRIGS IS A PREVIOUSLY PREPARED LIST OF TRIG FUNCTION VALUES          GBCNF405.116    
CLL   IFAX IS A PREVIOUSLY PREPARED LIST OF FACTORS OF N                   GBCNF405.117    
CLL   INC IS THE INCREMENT WITHIN EACH DATA 'VECTOR'                       GBCNF405.118    
CLL       (E.G. INC=1 FOR CONSECUTIVELY STORED DATA)                       GBCNF405.119    
CLL                                                                        GBCNF405.120    
CLL   INC must be unity!                                                   GBCNF405.121    
CLL                                                                        GBCNF405.122    
CLL   JUMP IS THE INCREMENT BETWEEN THE START OF EACH DATA VECTOR          GBCNF405.123    
CLL   N IS THE LENGTH OF THE DATA VECTORS                                  GBCNF405.124    
CLL   LOT IS THE NUMBER OF DATA VECTORS                                    GBCNF405.125    
CLL   ISIGN = +1 FOR TRANSFORM FROM SPECTRAL TO GRIDPOINT                  GBCNF405.126    
CLL         = -1 FOR TRANSFORM FROM GRIDPOINT TO SPECTRAL                  GBCNF405.127    
CLL                                                                        GBCNF405.128    
CLL   ORDERING OF COEFFICIENTS:                                            GBCNF405.129    
CLL       A(0),B(0),A(1),B(1),A(2),B(2),...,A(N/2),B(N/2)                  GBCNF405.130    
CLL       WHERE B(0)=B(N/2)=0; (N+2) LOCATIONS REQUIRED                    GBCNF405.131    
CLL                                                                        GBCNF405.132    
CLL   ORDERING OF DATA:                                                    GBCNF405.133    
CLL       X(0),X(1),X(2),...,X(N-1), 0 , 0 ; (N+2) LOCATIONS REQUIRED      GBCNF405.134    
CLL                                                                        GBCNF405.135    
CLL   VECTORIZATION IS ACHIEVED ON CRAY BY DOING THE TRANSFORMS            GBCNF405.136    
CLL   IN PARALLEL                                                          GBCNF405.137    
CLL                                                                        GBCNF405.138    
CLL   N MUST BE COMPOSED OF FACTORS 2,3 & 5 BUT DOES NOT HAVE TO BE EVEN   GBCNF405.139    
CLL                                                                        GBCNF405.140    
CLL   DEFINITION OF TRANSFORMS:                                            GBCNF405.141    
CLL   -------------------------                                            GBCNF405.142    
CLL                                                                        GBCNF405.143    
CLL   ISIGN=+1: X(J)=SUM(K=0,...,N-1)(C(K)*EXP(2*I*J*K*PI/N))              GBCNF405.144    
CLL       WHERE C(K)=A(K)+I*B(K) AND C(N-K)=A(K)-I*B(K)                    GBCNF405.145    
CLL                                                                        GBCNF405.146    
CLL   ISIGN=-1: A(K)=(1/N)*SUM(J=0,...,N-1)(X(J)*COS(2*J*K*PI/N))          GBCNF405.147    
CLL             B(K)=-(1/N)*SUM(J=0,...,N-1)(X(J)*SIN(2*J*K*PI/N))         GBCNF405.148    
CLL   ..................................................................   GBCNF405.149    
CLL                                                                        GBCNF405.150    
CLL Current Code Owner: Bob Carruthers                                     GBCNF405.151    
CLL                                                                        GBCNF405.152    
CLL History:                                                               GBCNF405.153    
CLL  Version   Date        Comment                                         GBCNF405.154    
CLL  =======   ====        =======                                         GBCNF405.155    
CLL  4.5       22/06/98    Original simplified code which assumes          GBCNF405.156    
CLL                        'INC' is 1.  This avoids lots of copies.        GBCNF405.157    
CLL                          Author: Bob Carruthers, Cray Research         GBCNF405.158    
                                                                           GBCNF405.159    
C*L   ARGUMENT LIST                                                        GBCNF405.160    
                                                                           GBCNF405.161    

      subroutine inc_1_fourier(a,trigs,ifax,inc,jump,n,lot,isign)           1,2GBCNF405.162    
                                                                           GBCNF405.163    
      IMPLICIT NONE                                                        GBCNF405.164    
                                                                           GBCNF405.165    
      INTEGER                                                              GBCNF405.166    
     *        INC      ! IN INCREMENT BETWEEN ELEMENTS OF DATA VECTOR      GBCNF405.167    
     *       ,JUMP     ! IN INCREMENT BETWEEN START OF EACH DATA VECTOR    GBCNF405.168    
     *       ,N        ! IN LENGTH OF DATA VECTOR IN GRID-POINT SPACE      GBCNF405.169    
     *                 !    WITHOUT EXTRA ZEROES                           GBCNF405.170    
     *       ,LOT      ! IN NUMBER OF DATA VECTORS                         GBCNF405.171    
     *       ,ISIGN    ! IN DETERMINES TYPE OF TRNASFORM                   GBCNF405.172    
     *       ,IFAX(10) ! IN LIST OF FACTORS OF N                           GBCNF405.173    
                                                                           GBCNF405.174    
      REAL                                                                 GBCNF405.175    
     *        TRIGS(N) ! IN TRIGONOMETRICAL FUNCTIONS                      GBCNF405.176    
                                                                           GBCNF405.177    
      REAL                                                                 GBCNF405.178    
     *     A(JUMP*LOT) ! INOUT DATA                                        GBCNF405.179    
                                                                           GBCNF405.180    
C*   --------------------------------------------------------------        GBCNF405.181    
                                                                           GBCNF405.182    
C*L WORKSPACE. 1 ARRAY IS REQUIRED --------------------------------        GBCNF405.183    
                                                                           GBCNF405.184    
*CALL AMAXSIZE                                                             GBCNF405.185    
                                                                           GBCNF405.186    
      integer ii, inc_1_row_length                                         GBCNF405.187    
c                                                                          GBCNF405.188    
      parameter (inc_1_row_length=2*row_length_max+100)                    GBCNF405.189    
c                                                                          GBCNF405.190    
      real inc_1_work((2*n+4)*lot), inc_1_table(inc_1_row_length),         GBCNF405.191    
     2 inc_1_scale                                                         GBCNF405.192    
c                                                                          GBCNF405.193    
      integer inc_1_flag, inc_1_isys, old_n                                GBCNF405.194    
      data inc_1_flag/0/, inc_1_isys/0/, old_n/0/                          GBCNF405.195    
      save inc_1_flag, inc_1_isys, old_n                                   GBCNF405.196    
c                                                                          GBCNF405.197    
      common/inc_1_fourier_fft/inc_1_table                                 GBCNF405.198    
                                                                           GBCNF405.199    
C*   --------------------------------------------------------------        GBCNF405.200    
                                                                           GBCNF405.201    
C*L EXTERNAL ROUTINES  --------------------------------------------        GBCNF405.202    
                                                                           GBCNF405.203    
C*  ---------------------------------------------------------------        GBCNF405.204    
c                                                                          GBCNF405.205    
c--check the storage space, and compute the Fourier Coefficients           GBCNF405.206    
      if(inc_1_flag.eq.0 .or. n.ne.old_n) then                             GBCNF405.207    
        if(inc_1_row_length.lt.(100+2*n)) then                             GBCNF405.208    
          write(6,'(/''Table for Cray Research FFT Routines '',            GBCNF405.209    
     2     '' is '',i5,'' Words Long, but needs to be '',i5,               GBCNF405.210    
     3     '' Words Long'')') inc_1_row_length, (100+2*n)                  GBCNF405.211    
          call abort()                                                     GBCNF405.212    
        endif                                                              GBCNF405.213    
        inc_1_scale=1.0                                                    GBCNF405.214    
        call scfft(0, n, inc_1_scale, a,  a,                               GBCNF405.215    
     2   inc_1_table, inc_1_work, inc_1_isys)                              GBCNF405.216    
        inc_1_flag=1                                                       GBCNF405.217    
        old_n=n                                                            GBCNF405.218    
      endif                                                                GBCNF405.219    
c                                                                          GBCNF405.220    
c--check that 'INC' is unity                                               GBCNF405.221    
      if(inc.ne.1) then                                                    GBCNF405.222    
        write(6,'(/''This Version of the Fourier Code '',                  GBCNF405.223    
     2   '' only works with INC = 1, not '',i5)') inc                      GBCNF405.224    
        call abort()                                                       GBCNF405.225    
      endif                                                                GBCNF405.226    
c                                                                          GBCNF405.227    
      if(isign.eq.-1) then                                                 GBCNF405.228    
        do ii=1,lot                                                        GBCNF405.229    
          inc_1_scale=1./n                                                 GBCNF405.230    
          call scfft(+1, n, inc_1_scale, a((ii-1)*jump+1),                 GBCNF405.231    
     2     a((ii-1)*jump+1), inc_1_table, inc_1_work, inc_1_isys)          GBCNF405.232    
        enddo                                                              GBCNF405.233    
      endif                                                                GBCNF405.234    
c                                                                          GBCNF405.235    
      if(isign.eq.+1) then                                                 GBCNF405.236    
        inc_1_scale=1.                                                     GBCNF405.237    
        do ii=1,lot                                                        GBCNF405.238    
          call csfft(-1, n, inc_1_scale, a((ii-1)*jump+1),                 GBCNF405.239    
     2     a((ii-1)*jump+1), inc_1_table, inc_1_work, inc_1_isys)          GBCNF405.240    
        enddo                                                              GBCNF405.241    
      endif                                                                GBCNF405.242    
                                                                           GBCNF405.243    
CL    END OF ROUTINE FOURIER                                               GBCNF405.244    
                                                                           GBCNF405.245    
      RETURN                                                               GBCNF405.246    
      END                                                                  GBCNF405.247    
*ENDIF                                                                     GBCNF405.248    
                                                                           FOURIE2B.202    
!+                                                                         FOURIE2B.203    
!                                                                          FOURIE2B.204    
! Subroutine Interface:                                                    FOURIE2B.205    

      SUBROUTINE InitFourier(N,IFAX,TRIGS)                                 FOURIE2B.206    
      implicit none                                                        FOURIE2B.207    
!                                                                          FOURIE2B.208    
! Description:                                                             FOURIE2B.209    
!                                                                          FOURIE2B.210    
!C     SUBROUTINE 'SET66' - COMPUTES FACTORS OF N & TRIGONOMETRIC          FOURIE2B.211    
!C     FUNCTIONS REQUIRED BY STAGGERED SINE TRANSFORM Var_FFT66            FOURIE2B.212    
!C     AND STAGGERED COSINE TRANSFORM Var_FFT55                            FOURIE2B.213    
!C                                                                         FOURIE2B.214    
!C     AUTHOR: CLIVE TEMPERTON JANUARY 1987                                FOURIE2B.215    
!C                                                                         FOURIE2B.216    
! modified Andrew Lorenc Oct 1995:                                         FOURIE2B.217    
! the "standard" TRIGS for the FFT routines are put in TRIGS(1:N).         FOURIE2B.218    
! extra TRIGS for the shifted (co)sine transforms are put in               FOURIE2B.219    
! TRIGS(N+1:N+N).                                                          FOURIE2B.220    
! extra TRIGS for the sine transforms are put in TRIGS(2N+1:2N+N).         FOURIE2B.221    
!                                                                          FOURIE2B.222    
! Parent module: VarMod_Fourier                                            FOURIE2B.223    
!                                                                          FOURIE2B.224    
! History:                                                                 FOURIE2B.225    
! Version   Date     Comment                                               FOURIE2B.226    
! -------   ----     -------                                               FOURIE2B.227    
! 4.3       11/4/97   Original code. Alistair Mills                        FOURIE2B.228    
!                                                                          FOURIE2B.229    
! Code Description:                                                        FOURIE2B.230    
!   Language: FORTRAN 77 + common extensions.                              FOURIE2B.231    
!   This code is written to UMDP3 v6 programming standards.                FOURIE2B.232    
!                                                                          FOURIE2B.233    
! System component covered: <appropriate code>                             FOURIE2B.234    
! System Task:              <appropriate code>                             FOURIE2B.235    
!                                                                          FOURIE2B.236    
! Declarations:                                                            FOURIE2B.237    
!                                                                          FOURIE2B.238    
! 1.0 Subroutine arguments                                                 FOURIE2B.239    
!   1.1 Scalar arguments with intent(in):                                  FOURIE2B.240    
      Integer                                                              FOURIE2B.241    
     & N                                                                   FOURIE2B.242    
                                                                           FOURIE2B.243    
!   1.2 Array arguments with intent(in):                                   FOURIE2B.244    
      Integer                                                              FOURIE2B.245    
     & IFAX(10)                                                            FOURIE2B.246    
                                                                           FOURIE2B.247    
!   1.3 Array arguments with intent(out):                                  FOURIE2B.248    
      Real                                                                 FOURIE2B.249    
     & TRIGS(3*N)                                                          FOURIE2B.250    
                                                                           FOURIE2B.251    
!   2.1 Local scalars:                                                     FOURIE2B.252    
      Integer                                                              FOURIE2B.253    
     & I                                                                   FOURIE2B.254    
     &,K                                                                   FOURIE2B.255    
     &,L                                                                   FOURIE2B.256    
     &,NU                                                                  FOURIE2B.257    
     &,NFAX                                                                FOURIE2B.258    
     &,IFAC                                                                FOURIE2B.259    
                                                                           FOURIE2B.260    
      Real                                                                 FOURIE2B.261    
     & DEL                                                                 FOURIE2B.262    
     &,NIL                                                                 FOURIE2B.263    
     &,NHL                                                                 FOURIE2B.264    
     &,ANGLE                                                               FOURIE2B.265    
                                                                           FOURIE2B.266    
!   2.2 Local arrays:                                                      FOURIE2B.267    
      Integer                                                              FOURIE2B.268    
     & JFAX(10)                                                            FOURIE2B.269    
     &,LFAX(7)                                                             FOURIE2B.270    
                                                                           FOURIE2B.271    
      Character*80 ErrorMessage                                            FOURIE2B.272    
                                                                           FOURIE2B.273    
      Data LFAX/6,8,5,4,3,2,1/                                             FOURIE2B.274    
                                                                           FOURIE2B.275    
!- End of header                                                           FOURIE2B.276    
                                                                           FOURIE2B.277    
!     TRIGS FOR REAL PERIODIC TRANSFORM                                    FOURIE2B.278    
!     ---------------------------------                                    FOURIE2B.279    
      DEL=4.0*ASIN(1.0)/FLOAT(N)                                           FOURIE2B.280    
      NIL=0                                                                FOURIE2B.281    
      NHL=(N/2)-1                                                          FOURIE2B.282    
!DIR$ IVDEP                                                                FOURIE2B.283    
! Fujitsu vectorization directive                                          GRB0F405.229    
!OCL NOVREC                                                                GRB0F405.230    
      DO 10 K=NIL,NHL                                                      FOURIE2B.284    
      ANGLE=FLOAT(K)*DEL                                                   FOURIE2B.285    
      TRIGS(2*K+1)=COS(ANGLE)                                              FOURIE2B.286    
      TRIGS(2*K+2)=SIN(ANGLE)                                              FOURIE2B.287    
   10 CONTINUE                                                             FOURIE2B.288    
!                                                                          FOURIE2B.289    
!     EXTRA TRIGS FOR (CO)SINE TRANSFORM                                   FOURIE2B.290    
!     ----------------------------------                                   FOURIE2B.291    
                                                                           FOURIE2B.292    
      DEL=0.5*DEL                                                          FOURIE2B.293    
      DO K=1,NHL                                                           FOURIE2B.294    
       ANGLE=FLOAT(K)*DEL                                                  FOURIE2B.295    
       TRIGS(2*N+K)=SIN(ANGLE)                                             FOURIE2B.296    
      END DO                                                               FOURIE2B.297    
                                                                           FOURIE2B.298    
!     EXTRA TRIGS FOR SHIFTED (CO)SINE TRANSFORM                           FOURIE2B.299    
!     --------------------------------------                               FOURIE2B.300    
      DEL=0.5*DEL                                                          FOURIE2B.301    
      DO 15 K=1,N                                                          FOURIE2B.302    
      ANGLE=FLOAT(K)*DEL                                                   FOURIE2B.303    
      TRIGS(N+K)=SIN(ANGLE)                                                FOURIE2B.304    
   15 CONTINUE                                                             FOURIE2B.305    
                                                                           FOURIE2B.306    
!                                                                          FOURIE2B.307    
!     NOW FIND FACTORS OF N                                                FOURIE2B.308    
!     ---------------------                                                FOURIE2B.309    
!                                                                          FOURIE2B.310    
! AL 9/10/95.  Removed code following Clive Temperton's advice:            FOURIE2B.311    
! the "fix for small N" section in SET66 was needed for obscure            FOURIE2B.312    
! historical reasons in the version which called CAL routines.             FOURIE2B.313    
! It's not necessary in the all-Fortran version, and removing it           FOURIE2B.314    
! should make things go a bit faster.                                      FOURIE2B.315    
!                                                                          FOURIE2B.316    
!     FIND FACTORS OF N (8,6,5,4,3,2; ONLY ONE 8 ALLOWED)                  FOURIE2B.317    
!     LOOK FOR SIXES FIRST, STORE FACTORS IN DESCENDING ORDER              FOURIE2B.318    
      NU=N                                                                 FOURIE2B.319    
      IFAC=6                                                               FOURIE2B.320    
      K=0                                                                  FOURIE2B.321    
      L=1                                                                  FOURIE2B.322    
   20 CONTINUE                                                             FOURIE2B.323    
      IF (MOD(NU,IFAC).NE.0) GO TO 30                                      FOURIE2B.324    
      K=K+1                                                                FOURIE2B.325    
      JFAX(K)=IFAC                                                         FOURIE2B.326    
      IF (IFAC.NE.8) GO TO 25                                              FOURIE2B.327    
      IF (K.EQ.1) GO TO 25                                                 FOURIE2B.328    
      JFAX(1)=8                                                            FOURIE2B.329    
      JFAX(K)=6                                                            FOURIE2B.330    
   25 CONTINUE                                                             FOURIE2B.331    
      NU=NU/IFAC                                                           FOURIE2B.332    
      IF (NU.EQ.1) GO TO 50                                                FOURIE2B.333    
      IF (IFAC.NE.8) GO TO 20                                              FOURIE2B.334    
   30 CONTINUE                                                             FOURIE2B.335    
      L=L+1                                                                FOURIE2B.336    
      IFAC=LFAX(L)                                                         FOURIE2B.337    
      IF (IFAC .GT. 1) GO TO 20                                            FOURIE2B.338    
                                                                           FOURIE2B.339    
      ! Illegal factors:                                                   FOURIE2B.340    
      write (ErrorMessage, '(a,i4,a)') 'N = ', N,                          FOURIE2B.341    
     &                     ' contains illegal factors.'                    FOURIE2B.342    
                                                                           FOURIE2B.343    
      GOTO 9                                                               FOURIE2B.344    
!                                                                          FOURIE2B.345    
!     NOW REVERSE ORDER OF FACTORS                                         FOURIE2B.346    
   50 CONTINUE                                                             FOURIE2B.347    
      NFAX=K                                                               FOURIE2B.348    
      IFAX(1)=NFAX                                                         FOURIE2B.349    
      DO 60 I=1,NFAX                                                       FOURIE2B.350    
      IFAX(NFAX+2-I)=JFAX(I)                                               FOURIE2B.351    
   60 CONTINUE                                                             FOURIE2B.352    
                                                                           FOURIE2B.353    
 9    continue                                                             FOURIE2B.354    
                                                                           FOURIE2B.355    
      END                                                                  FOURIE2B.356    
*ENDIF                                                                     FOURIE2B.357