|  | ! Fast Fourier/Cosine/Sine Transform | 
|  | !     dimension   :one | 
|  | !     data length :power of 2 | 
|  | !     decimation  :frequency | 
|  | !     radix       :split-radix | 
|  | !     data        :inplace | 
|  | !     table       :use | 
|  | ! subroutines | 
|  | !     cdft: Complex Discrete Fourier Transform | 
|  | !     rdft: Real Discrete Fourier Transform | 
|  | !     ddct: Discrete Cosine Transform | 
|  | !     ddst: Discrete Sine Transform | 
|  | !     dfct: Cosine Transform of RDFT (Real Symmetric DFT) | 
|  | !     dfst: Sine Transform of RDFT (Real Anti-symmetric DFT) | 
|  | ! | 
|  | ! | 
|  | ! -------- Complex DFT (Discrete Fourier Transform) -------- | 
|  | !     [definition] | 
|  | !         <case1> | 
|  | !             X(k) = sum_j=0^n-1 x(j)*exp(2*pi*i*j*k/n), 0<=k<n | 
|  | !         <case2> | 
|  | !             X(k) = sum_j=0^n-1 x(j)*exp(-2*pi*i*j*k/n), 0<=k<n | 
|  | !         (notes: sum_j=0^n-1 is a summation from j=0 to n-1) | 
|  | !     [usage] | 
|  | !         <case1> | 
|  | !             ip(0) = 0  ! first time only | 
|  | !             call cdft(2*n, 1, a, ip, w) | 
|  | !         <case2> | 
|  | !             ip(0) = 0  ! first time only | 
|  | !             call cdft(2*n, -1, a, ip, w) | 
|  | !     [parameters] | 
|  | !         2*n          :data length (integer) | 
|  | !                       n >= 1, n = power of 2 | 
|  | !         a(0:2*n-1)   :input/output data (real*8) | 
|  | !                       input data | 
|  | !                           a(2*j) = Re(x(j)), | 
|  | !                           a(2*j+1) = Im(x(j)), 0<=j<n | 
|  | !                       output data | 
|  | !                           a(2*k) = Re(X(k)), | 
|  | !                           a(2*k+1) = Im(X(k)), 0<=k<n | 
|  | !         ip(0:*)      :work area for bit reversal (integer) | 
|  | !                       length of ip >= 2+sqrt(n) | 
|  | !                       strictly, | 
|  | !                       length of ip >= | 
|  | !                           2+2**(int(log(n+0.5)/log(2.0))/2). | 
|  | !                       ip(0),ip(1) are pointers of the cos/sin table. | 
|  | !         w(0:n/2-1)   :cos/sin table (real*8) | 
|  | !                       w(),ip() are initialized if ip(0) = 0. | 
|  | !     [remark] | 
|  | !         Inverse of | 
|  | !             call cdft(2*n, -1, a, ip, w) | 
|  | !         is | 
|  | !             call cdft(2*n, 1, a, ip, w) | 
|  | !             do j = 0, 2 * n - 1 | 
|  | !                 a(j) = a(j) / n | 
|  | !             end do | 
|  | !         . | 
|  | ! | 
|  | ! | 
|  | ! -------- Real DFT / Inverse of Real DFT -------- | 
|  | !     [definition] | 
|  | !         <case1> RDFT | 
|  | !             R(k) = sum_j=0^n-1 a(j)*cos(2*pi*j*k/n), 0<=k<=n/2 | 
|  | !             I(k) = sum_j=0^n-1 a(j)*sin(2*pi*j*k/n), 0<k<n/2 | 
|  | !         <case2> IRDFT (excluding scale) | 
|  | !             a(k) = (R(0) + R(n/2)*cos(pi*k))/2 + | 
|  | !                    sum_j=1^n/2-1 R(j)*cos(2*pi*j*k/n) + | 
|  | !                    sum_j=1^n/2-1 I(j)*sin(2*pi*j*k/n), 0<=k<n | 
|  | !     [usage] | 
|  | !         <case1> | 
|  | !             ip(0) = 0  ! first time only | 
|  | !             call rdft(n, 1, a, ip, w) | 
|  | !         <case2> | 
|  | !             ip(0) = 0  ! first time only | 
|  | !             call rdft(n, -1, a, ip, w) | 
|  | !     [parameters] | 
|  | !         n            :data length (integer) | 
|  | !                       n >= 2, n = power of 2 | 
|  | !         a(0:n-1)     :input/output data (real*8) | 
|  | !                       <case1> | 
|  | !                           output data | 
|  | !                               a(2*k) = R(k), 0<=k<n/2 | 
|  | !                               a(2*k+1) = I(k), 0<k<n/2 | 
|  | !                               a(1) = R(n/2) | 
|  | !                       <case2> | 
|  | !                           input data | 
|  | !                               a(2*j) = R(j), 0<=j<n/2 | 
|  | !                               a(2*j+1) = I(j), 0<j<n/2 | 
|  | !                               a(1) = R(n/2) | 
|  | !         ip(0:*)      :work area for bit reversal (integer) | 
|  | !                       length of ip >= 2+sqrt(n/2) | 
|  | !                       strictly, | 
|  | !                       length of ip >= | 
|  | !                           2+2**(int(log(n/2+0.5)/log(2.0))/2). | 
|  | !                       ip(0),ip(1) are pointers of the cos/sin table. | 
|  | !         w(0:n/2-1)   :cos/sin table (real*8) | 
|  | !                       w(),ip() are initialized if ip(0) = 0. | 
|  | !     [remark] | 
|  | !         Inverse of | 
|  | !             call rdft(n, 1, a, ip, w) | 
|  | !         is | 
|  | !             call rdft(n, -1, a, ip, w) | 
|  | !             do j = 0, n - 1 | 
|  | !                 a(j) = a(j) * 2 / n | 
|  | !             end do | 
|  | !         . | 
|  | ! | 
|  | ! | 
|  | ! -------- DCT (Discrete Cosine Transform) / Inverse of DCT -------- | 
|  | !     [definition] | 
|  | !         <case1> IDCT (excluding scale) | 
|  | !             C(k) = sum_j=0^n-1 a(j)*cos(pi*j*(k+1/2)/n), 0<=k<n | 
|  | !         <case2> DCT | 
|  | !             C(k) = sum_j=0^n-1 a(j)*cos(pi*(j+1/2)*k/n), 0<=k<n | 
|  | !     [usage] | 
|  | !         <case1> | 
|  | !             ip(0) = 0  ! first time only | 
|  | !             call ddct(n, 1, a, ip, w) | 
|  | !         <case2> | 
|  | !             ip(0) = 0  ! first time only | 
|  | !             call ddct(n, -1, a, ip, w) | 
|  | !     [parameters] | 
|  | !         n            :data length (integer) | 
|  | !                       n >= 2, n = power of 2 | 
|  | !         a(0:n-1)     :input/output data (real*8) | 
|  | !                       output data | 
|  | !                           a(k) = C(k), 0<=k<n | 
|  | !         ip(0:*)      :work area for bit reversal (integer) | 
|  | !                       length of ip >= 2+sqrt(n/2) | 
|  | !                       strictly, | 
|  | !                       length of ip >= | 
|  | !                           2+2**(int(log(n/2+0.5)/log(2.0))/2). | 
|  | !                       ip(0),ip(1) are pointers of the cos/sin table. | 
|  | !         w(0:n*5/4-1) :cos/sin table (real*8) | 
|  | !                       w(),ip() are initialized if ip(0) = 0. | 
|  | !     [remark] | 
|  | !         Inverse of | 
|  | !             call ddct(n, -1, a, ip, w) | 
|  | !         is | 
|  | !             a(0) = a(0) / 2 | 
|  | !             call ddct(n, 1, a, ip, w) | 
|  | !             do j = 0, n - 1 | 
|  | !                 a(j) = a(j) * 2 / n | 
|  | !             end do | 
|  | !         . | 
|  | ! | 
|  | ! | 
|  | ! -------- DST (Discrete Sine Transform) / Inverse of DST -------- | 
|  | !     [definition] | 
|  | !         <case1> IDST (excluding scale) | 
|  | !             S(k) = sum_j=1^n A(j)*sin(pi*j*(k+1/2)/n), 0<=k<n | 
|  | !         <case2> DST | 
|  | !             S(k) = sum_j=0^n-1 a(j)*sin(pi*(j+1/2)*k/n), 0<k<=n | 
|  | !     [usage] | 
|  | !         <case1> | 
|  | !             ip(0) = 0  ! first time only | 
|  | !             call ddst(n, 1, a, ip, w) | 
|  | !         <case2> | 
|  | !             ip(0) = 0  ! first time only | 
|  | !             call ddst(n, -1, a, ip, w) | 
|  | !     [parameters] | 
|  | !         n            :data length (integer) | 
|  | !                       n >= 2, n = power of 2 | 
|  | !         a(0:n-1)     :input/output data (real*8) | 
|  | !                       <case1> | 
|  | !                           input data | 
|  | !                               a(j) = A(j), 0<j<n | 
|  | !                               a(0) = A(n) | 
|  | !                           output data | 
|  | !                               a(k) = S(k), 0<=k<n | 
|  | !                       <case2> | 
|  | !                           output data | 
|  | !                               a(k) = S(k), 0<k<n | 
|  | !                               a(0) = S(n) | 
|  | !         ip(0:*)      :work area for bit reversal (integer) | 
|  | !                       length of ip >= 2+sqrt(n/2) | 
|  | !                       strictly, | 
|  | !                       length of ip >= | 
|  | !                           2+2**(int(log(n/2+0.5)/log(2.0))/2). | 
|  | !                       ip(0),ip(1) are pointers of the cos/sin table. | 
|  | !         w(0:n*5/4-1) :cos/sin table (real*8) | 
|  | !                       w(),ip() are initialized if ip(0) = 0. | 
|  | !     [remark] | 
|  | !         Inverse of | 
|  | !             call ddst(n, -1, a, ip, w) | 
|  | !         is | 
|  | !             a(0) = a(0) / 2 | 
|  | !             call ddst(n, 1, a, ip, w) | 
|  | !             do j = 0, n - 1 | 
|  | !                 a(j) = a(j) * 2 / n | 
|  | !             end do | 
|  | !         . | 
|  | ! | 
|  | ! | 
|  | ! -------- Cosine Transform of RDFT (Real Symmetric DFT) -------- | 
|  | !     [definition] | 
|  | !         C(k) = sum_j=0^n a(j)*cos(pi*j*k/n), 0<=k<=n | 
|  | !     [usage] | 
|  | !         ip(0) = 0  ! first time only | 
|  | !         call dfct(n, a, t, ip, w) | 
|  | !     [parameters] | 
|  | !         n            :data length - 1 (integer) | 
|  | !                       n >= 2, n = power of 2 | 
|  | !         a(0:n)       :input/output data (real*8) | 
|  | !                       output data | 
|  | !                           a(k) = C(k), 0<=k<=n | 
|  | !         t(0:n/2)     :work area (real*8) | 
|  | !         ip(0:*)      :work area for bit reversal (integer) | 
|  | !                       length of ip >= 2+sqrt(n/4) | 
|  | !                       strictly, | 
|  | !                       length of ip >= | 
|  | !                           2+2**(int(log(n/4+0.5)/log(2.0))/2). | 
|  | !                       ip(0),ip(1) are pointers of the cos/sin table. | 
|  | !         w(0:n*5/8-1) :cos/sin table (real*8) | 
|  | !                       w(),ip() are initialized if ip(0) = 0. | 
|  | !     [remark] | 
|  | !         Inverse of | 
|  | !             a(0) = a(0) / 2 | 
|  | !             a(n) = a(n) / 2 | 
|  | !             call dfct(n, a, t, ip, w) | 
|  | !         is | 
|  | !             a(0) = a(0) / 2 | 
|  | !             a(n) = a(n) / 2 | 
|  | !             call dfct(n, a, t, ip, w) | 
|  | !             do j = 0, n | 
|  | !                 a(j) = a(j) * 2 / n | 
|  | !             end do | 
|  | !         . | 
|  | ! | 
|  | ! | 
|  | ! -------- Sine Transform of RDFT (Real Anti-symmetric DFT) -------- | 
|  | !     [definition] | 
|  | !         S(k) = sum_j=1^n-1 a(j)*sin(pi*j*k/n), 0<k<n | 
|  | !     [usage] | 
|  | !         ip(0) = 0  ! first time only | 
|  | !         call dfst(n, a, t, ip, w) | 
|  | !     [parameters] | 
|  | !         n            :data length + 1 (integer) | 
|  | !                       n >= 2, n = power of 2 | 
|  | !         a(0:n-1)     :input/output data (real*8) | 
|  | !                       output data | 
|  | !                           a(k) = S(k), 0<k<n | 
|  | !                       (a(0) is used for work area) | 
|  | !         t(0:n/2-1)   :work area (real*8) | 
|  | !         ip(0:*)      :work area for bit reversal (integer) | 
|  | !                       length of ip >= 2+sqrt(n/4) | 
|  | !                       strictly, | 
|  | !                       length of ip >= | 
|  | !                           2+2**(int(log(n/4+0.5)/log(2.0))/2). | 
|  | !                       ip(0),ip(1) are pointers of the cos/sin table. | 
|  | !         w(0:n*5/8-1) :cos/sin table (real*8) | 
|  | !                       w(),ip() are initialized if ip(0) = 0. | 
|  | !     [remark] | 
|  | !         Inverse of | 
|  | !             call dfst(n, a, t, ip, w) | 
|  | !         is | 
|  | !             call dfst(n, a, t, ip, w) | 
|  | !             do j = 1, n - 1 | 
|  | !                 a(j) = a(j) * 2 / n | 
|  | !             end do | 
|  | !         . | 
|  | ! | 
|  | ! | 
|  | ! Appendix : | 
|  | !     The cos/sin table is recalculated when the larger table required. | 
|  | !     w() and ip() are compatible with all routines. | 
|  | ! | 
|  | ! | 
|  | subroutine cdft(n, isgn, a, ip, w) | 
|  | integer n, isgn, ip(0 : *), nw | 
|  | real*8 a(0 : n - 1), w(0 : *) | 
|  | nw = ip(0) | 
|  | if (n .gt. 4 * nw) then | 
|  | nw = n / 4 | 
|  | call makewt(nw, ip, w) | 
|  | end if | 
|  | if (isgn .ge. 0) then | 
|  | call cftfsub(n, a, ip, nw, w) | 
|  | else | 
|  | call cftbsub(n, a, ip, nw, w) | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine rdft(n, isgn, a, ip, w) | 
|  | integer n, isgn, ip(0 : *), nw, nc | 
|  | real*8 a(0 : n - 1), w(0 : *), xi | 
|  | nw = ip(0) | 
|  | if (n .gt. 4 * nw) then | 
|  | nw = n / 4 | 
|  | call makewt(nw, ip, w) | 
|  | end if | 
|  | nc = ip(1) | 
|  | if (n .gt. 4 * nc) then | 
|  | nc = n / 4 | 
|  | call makect(nc, ip, w(nw)) | 
|  | end if | 
|  | if (isgn .ge. 0) then | 
|  | if (n .gt. 4) then | 
|  | call cftfsub(n, a, ip, nw, w) | 
|  | call rftfsub(n, a, nc, w(nw)) | 
|  | else if (n .eq. 4) then | 
|  | call cftfsub(n, a, ip, nw, w) | 
|  | end if | 
|  | xi = a(0) - a(1) | 
|  | a(0) = a(0) + a(1) | 
|  | a(1) = xi | 
|  | else | 
|  | a(1) = 0.5d0 * (a(0) - a(1)) | 
|  | a(0) = a(0) - a(1) | 
|  | if (n .gt. 4) then | 
|  | call rftbsub(n, a, nc, w(nw)) | 
|  | call cftbsub(n, a, ip, nw, w) | 
|  | else if (n .eq. 4) then | 
|  | call cftbsub(n, a, ip, nw, w) | 
|  | end if | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine ddct(n, isgn, a, ip, w) | 
|  | integer n, isgn, ip(0 : *), j, nw, nc | 
|  | real*8 a(0 : n - 1), w(0 : *), xr | 
|  | nw = ip(0) | 
|  | if (n .gt. 4 * nw) then | 
|  | nw = n / 4 | 
|  | call makewt(nw, ip, w) | 
|  | end if | 
|  | nc = ip(1) | 
|  | if (n .gt. nc) then | 
|  | nc = n | 
|  | call makect(nc, ip, w(nw)) | 
|  | end if | 
|  | if (isgn .lt. 0) then | 
|  | xr = a(n - 1) | 
|  | do j = n - 2, 2, -2 | 
|  | a(j + 1) = a(j) - a(j - 1) | 
|  | a(j) = a(j) + a(j - 1) | 
|  | end do | 
|  | a(1) = a(0) - xr | 
|  | a(0) = a(0) + xr | 
|  | if (n .gt. 4) then | 
|  | call rftbsub(n, a, nc, w(nw)) | 
|  | call cftbsub(n, a, ip, nw, w) | 
|  | else if (n .eq. 4) then | 
|  | call cftbsub(n, a, ip, nw, w) | 
|  | end if | 
|  | end if | 
|  | call dctsub(n, a, nc, w(nw)) | 
|  | if (isgn .ge. 0) then | 
|  | if (n .gt. 4) then | 
|  | call cftfsub(n, a, ip, nw, w) | 
|  | call rftfsub(n, a, nc, w(nw)) | 
|  | else if (n .eq. 4) then | 
|  | call cftfsub(n, a, ip, nw, w) | 
|  | end if | 
|  | xr = a(0) - a(1) | 
|  | a(0) = a(0) + a(1) | 
|  | do j = 2, n - 2, 2 | 
|  | a(j - 1) = a(j) - a(j + 1) | 
|  | a(j) = a(j) + a(j + 1) | 
|  | end do | 
|  | a(n - 1) = xr | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine ddst(n, isgn, a, ip, w) | 
|  | integer n, isgn, ip(0 : *), j, nw, nc | 
|  | real*8 a(0 : n - 1), w(0 : *), xr | 
|  | nw = ip(0) | 
|  | if (n .gt. 4 * nw) then | 
|  | nw = n / 4 | 
|  | call makewt(nw, ip, w) | 
|  | end if | 
|  | nc = ip(1) | 
|  | if (n .gt. nc) then | 
|  | nc = n | 
|  | call makect(nc, ip, w(nw)) | 
|  | end if | 
|  | if (isgn .lt. 0) then | 
|  | xr = a(n - 1) | 
|  | do j = n - 2, 2, -2 | 
|  | a(j + 1) = -a(j) - a(j - 1) | 
|  | a(j) = a(j) - a(j - 1) | 
|  | end do | 
|  | a(1) = a(0) + xr | 
|  | a(0) = a(0) - xr | 
|  | if (n .gt. 4) then | 
|  | call rftbsub(n, a, nc, w(nw)) | 
|  | call cftbsub(n, a, ip, nw, w) | 
|  | else if (n .eq. 4) then | 
|  | call cftbsub(n, a, ip, nw, w) | 
|  | end if | 
|  | end if | 
|  | call dstsub(n, a, nc, w(nw)) | 
|  | if (isgn .ge. 0) then | 
|  | if (n .gt. 4) then | 
|  | call cftfsub(n, a, ip, nw, w) | 
|  | call rftfsub(n, a, nc, w(nw)) | 
|  | else if (n .eq. 4) then | 
|  | call cftfsub(n, a, ip, nw, w) | 
|  | end if | 
|  | xr = a(0) - a(1) | 
|  | a(0) = a(0) + a(1) | 
|  | do j = 2, n - 2, 2 | 
|  | a(j - 1) = -a(j) - a(j + 1) | 
|  | a(j) = a(j) - a(j + 1) | 
|  | end do | 
|  | a(n - 1) = -xr | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine dfct(n, a, t, ip, w) | 
|  | integer n, ip(0 : *), j, k, l, m, mh, nw, nc | 
|  | real*8 a(0 : n), t(0 : n / 2), w(0 : *), xr, xi, yr, yi | 
|  | nw = ip(0) | 
|  | if (n .gt. 8 * nw) then | 
|  | nw = n / 8 | 
|  | call makewt(nw, ip, w) | 
|  | end if | 
|  | nc = ip(1) | 
|  | if (n .gt. 2 * nc) then | 
|  | nc = n / 2 | 
|  | call makect(nc, ip, w(nw)) | 
|  | end if | 
|  | m = n / 2 | 
|  | yi = a(m) | 
|  | xi = a(0) + a(n) | 
|  | a(0) = a(0) - a(n) | 
|  | t(0) = xi - yi | 
|  | t(m) = xi + yi | 
|  | if (n .gt. 2) then | 
|  | mh = m / 2 | 
|  | do j = 1, mh - 1 | 
|  | k = m - j | 
|  | xr = a(j) - a(n - j) | 
|  | xi = a(j) + a(n - j) | 
|  | yr = a(k) - a(n - k) | 
|  | yi = a(k) + a(n - k) | 
|  | a(j) = xr | 
|  | a(k) = yr | 
|  | t(j) = xi - yi | 
|  | t(k) = xi + yi | 
|  | end do | 
|  | t(mh) = a(mh) + a(n - mh) | 
|  | a(mh) = a(mh) - a(n - mh) | 
|  | call dctsub(m, a, nc, w(nw)) | 
|  | if (m .gt. 4) then | 
|  | call cftfsub(m, a, ip, nw, w) | 
|  | call rftfsub(m, a, nc, w(nw)) | 
|  | else if (m .eq. 4) then | 
|  | call cftfsub(m, a, ip, nw, w) | 
|  | end if | 
|  | a(n - 1) = a(0) - a(1) | 
|  | a(1) = a(0) + a(1) | 
|  | do j = m - 2, 2, -2 | 
|  | a(2 * j + 1) = a(j) + a(j + 1) | 
|  | a(2 * j - 1) = a(j) - a(j + 1) | 
|  | end do | 
|  | l = 2 | 
|  | m = mh | 
|  | do while (m .ge. 2) | 
|  | call dctsub(m, t, nc, w(nw)) | 
|  | if (m .gt. 4) then | 
|  | call cftfsub(m, t, ip, nw, w) | 
|  | call rftfsub(m, t, nc, w(nw)) | 
|  | else if (m .eq. 4) then | 
|  | call cftfsub(m, t, ip, nw, w) | 
|  | end if | 
|  | a(n - l) = t(0) - t(1) | 
|  | a(l) = t(0) + t(1) | 
|  | k = 0 | 
|  | do j = 2, m - 2, 2 | 
|  | k = k + 4 * l | 
|  | a(k - l) = t(j) - t(j + 1) | 
|  | a(k + l) = t(j) + t(j + 1) | 
|  | end do | 
|  | l = 2 * l | 
|  | mh = m / 2 | 
|  | do j = 0, mh - 1 | 
|  | k = m - j | 
|  | t(j) = t(m + k) - t(m + j) | 
|  | t(k) = t(m + k) + t(m + j) | 
|  | end do | 
|  | t(mh) = t(m + mh) | 
|  | m = mh | 
|  | end do | 
|  | a(l) = t(0) | 
|  | a(n) = t(2) - t(1) | 
|  | a(0) = t(2) + t(1) | 
|  | else | 
|  | a(1) = a(0) | 
|  | a(2) = t(0) | 
|  | a(0) = t(1) | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine dfst(n, a, t, ip, w) | 
|  | integer n, ip(0 : *), j, k, l, m, mh, nw, nc | 
|  | real*8 a(0 : n - 1), t(0 : n / 2 - 1), w(0 : *), xr, xi, yr, yi | 
|  | nw = ip(0) | 
|  | if (n .gt. 8 * nw) then | 
|  | nw = n / 8 | 
|  | call makewt(nw, ip, w) | 
|  | end if | 
|  | nc = ip(1) | 
|  | if (n .gt. 2 * nc) then | 
|  | nc = n / 2 | 
|  | call makect(nc, ip, w(nw)) | 
|  | end if | 
|  | if (n .gt. 2) then | 
|  | m = n / 2 | 
|  | mh = m / 2 | 
|  | do j = 1, mh - 1 | 
|  | k = m - j | 
|  | xr = a(j) + a(n - j) | 
|  | xi = a(j) - a(n - j) | 
|  | yr = a(k) + a(n - k) | 
|  | yi = a(k) - a(n - k) | 
|  | a(j) = xr | 
|  | a(k) = yr | 
|  | t(j) = xi + yi | 
|  | t(k) = xi - yi | 
|  | end do | 
|  | t(0) = a(mh) - a(n - mh) | 
|  | a(mh) = a(mh) + a(n - mh) | 
|  | a(0) = a(m) | 
|  | call dstsub(m, a, nc, w(nw)) | 
|  | if (m .gt. 4) then | 
|  | call cftfsub(m, a, ip, nw, w) | 
|  | call rftfsub(m, a, nc, w(nw)) | 
|  | else if (m .eq. 4) then | 
|  | call cftfsub(m, a, ip, nw, w) | 
|  | end if | 
|  | a(n - 1) = a(1) - a(0) | 
|  | a(1) = a(0) + a(1) | 
|  | do j = m - 2, 2, -2 | 
|  | a(2 * j + 1) = a(j) - a(j + 1) | 
|  | a(2 * j - 1) = -a(j) - a(j + 1) | 
|  | end do | 
|  | l = 2 | 
|  | m = mh | 
|  | do while (m .ge. 2) | 
|  | call dstsub(m, t, nc, w(nw)) | 
|  | if (m .gt. 4) then | 
|  | call cftfsub(m, t, ip, nw, w) | 
|  | call rftfsub(m, t, nc, w(nw)) | 
|  | else if (m .eq. 4) then | 
|  | call cftfsub(m, t, ip, nw, w) | 
|  | end if | 
|  | a(n - l) = t(1) - t(0) | 
|  | a(l) = t(0) + t(1) | 
|  | k = 0 | 
|  | do j = 2, m - 2, 2 | 
|  | k = k + 4 * l | 
|  | a(k - l) = -t(j) - t(j + 1) | 
|  | a(k + l) = t(j) - t(j + 1) | 
|  | end do | 
|  | l = 2 * l | 
|  | mh = m / 2 | 
|  | do j = 1, mh - 1 | 
|  | k = m - j | 
|  | t(j) = t(m + k) + t(m + j) | 
|  | t(k) = t(m + k) - t(m + j) | 
|  | end do | 
|  | t(0) = t(m + mh) | 
|  | m = mh | 
|  | end do | 
|  | a(l) = t(0) | 
|  | end if | 
|  | a(0) = 0 | 
|  | end | 
|  | ! | 
|  | ! -------- initializing routines -------- | 
|  | ! | 
|  | subroutine makewt(nw, ip, w) | 
|  | integer nw, ip(0 : *), j, nwh, nw0, nw1 | 
|  | real*8 w(0 : nw - 1), delta, wn4r, wk1r, wk1i, wk3r, wk3i | 
|  | ip(0) = nw | 
|  | ip(1) = 1 | 
|  | if (nw .gt. 2) then | 
|  | nwh = nw / 2 | 
|  | delta = atan(1.0d0) / nwh | 
|  | wn4r = cos(delta * nwh) | 
|  | w(0) = 1 | 
|  | w(1) = wn4r | 
|  | if (nwh .eq. 4) then | 
|  | w(2) = cos(delta * 2) | 
|  | w(3) = sin(delta * 2) | 
|  | else if (nwh .gt. 4) then | 
|  | call makeipt(nw, ip) | 
|  | w(2) = 0.5d0 / cos(delta * 2) | 
|  | w(3) = 0.5d0 / cos(delta * 6) | 
|  | do j = 4, nwh - 4, 4 | 
|  | w(j) = cos(delta * j) | 
|  | w(j + 1) = sin(delta * j) | 
|  | w(j + 2) = cos(3 * delta * j) | 
|  | w(j + 3) = -sin(3 * delta * j) | 
|  | end do | 
|  | end if | 
|  | nw0 = 0 | 
|  | do while (nwh .gt. 2) | 
|  | nw1 = nw0 + nwh | 
|  | nwh = nwh / 2 | 
|  | w(nw1) = 1 | 
|  | w(nw1 + 1) = wn4r | 
|  | if (nwh .eq. 4) then | 
|  | wk1r = w(nw0 + 4) | 
|  | wk1i = w(nw0 + 5) | 
|  | w(nw1 + 2) = wk1r | 
|  | w(nw1 + 3) = wk1i | 
|  | else if (nwh .gt. 4) then | 
|  | wk1r = w(nw0 + 4) | 
|  | wk3r = w(nw0 + 6) | 
|  | w(nw1 + 2) = 0.5d0 / wk1r | 
|  | w(nw1 + 3) = 0.5d0 / wk3r | 
|  | do j = 4, nwh - 4, 4 | 
|  | wk1r = w(nw0 + 2 * j) | 
|  | wk1i = w(nw0 + 2 * j + 1) | 
|  | wk3r = w(nw0 + 2 * j + 2) | 
|  | wk3i = w(nw0 + 2 * j + 3) | 
|  | w(nw1 + j) = wk1r | 
|  | w(nw1 + j + 1) = wk1i | 
|  | w(nw1 + j + 2) = wk3r | 
|  | w(nw1 + j + 3) = wk3i | 
|  | end do | 
|  | end if | 
|  | nw0 = nw1 | 
|  | end do | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine makeipt(nw, ip) | 
|  | integer nw, ip(0 : *), j, l, m, m2, p, q | 
|  | ip(2) = 0 | 
|  | ip(3) = 16 | 
|  | m = 2 | 
|  | l = nw | 
|  | do while (l .gt. 32) | 
|  | m2 = 2 * m | 
|  | q = 8 * m2 | 
|  | do j = m, m2 - 1 | 
|  | p = 4 * ip(j) | 
|  | ip(m + j) = p | 
|  | ip(m2 + j) = p + q | 
|  | end do | 
|  | m = m2 | 
|  | l = l / 4 | 
|  | end do | 
|  | end | 
|  | ! | 
|  | subroutine makect(nc, ip, c) | 
|  | integer nc, ip(0 : *), j, nch | 
|  | real*8 c(0 : nc - 1), delta | 
|  | ip(1) = nc | 
|  | if (nc .gt. 1) then | 
|  | nch = nc / 2 | 
|  | delta = atan(1.0d0) / nch | 
|  | c(0) = cos(delta * nch) | 
|  | c(nch) = 0.5d0 * c(0) | 
|  | do j = 1, nch - 1 | 
|  | c(j) = 0.5d0 * cos(delta * j) | 
|  | c(nc - j) = 0.5d0 * sin(delta * j) | 
|  | end do | 
|  | end if | 
|  | end | 
|  | ! | 
|  | ! -------- child routines -------- | 
|  | ! | 
|  | subroutine cftfsub(n, a, ip, nw, w) | 
|  | integer n, ip(0 : *), nw | 
|  | real*8 a(0 : n - 1), w(0 : nw - 1) | 
|  | if (n .gt. 8) then | 
|  | if (n .gt. 32) then | 
|  | call cftf1st(n, a, w(nw - n / 4)) | 
|  | if (n .gt. 512) then | 
|  | call cftrec4(n, a, nw, w) | 
|  | else if (n .gt. 128) then | 
|  | call cftleaf(n, 1, a, nw, w) | 
|  | else | 
|  | call cftfx41(n, a, nw, w) | 
|  | end if | 
|  | call bitrv2(n, ip, a) | 
|  | else if (n .eq. 32) then | 
|  | call cftf161(a, w(nw - 8)) | 
|  | call bitrv216(a) | 
|  | else | 
|  | call cftf081(a, w) | 
|  | call bitrv208(a) | 
|  | end if | 
|  | else if (n .eq. 8) then | 
|  | call cftf040(a) | 
|  | else if (n .eq. 4) then | 
|  | call cftx020(a) | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine cftbsub(n, a, ip, nw, w) | 
|  | integer n, ip(0 : *), nw | 
|  | real*8 a(0 : n - 1), w(0 : nw - 1) | 
|  | if (n .gt. 8) then | 
|  | if (n .gt. 32) then | 
|  | call cftb1st(n, a, w(nw - n / 4)) | 
|  | if (n .gt. 512) then | 
|  | call cftrec4(n, a, nw, w) | 
|  | else if (n .gt. 128) then | 
|  | call cftleaf(n, 1, a, nw, w) | 
|  | else | 
|  | call cftfx41(n, a, nw, w) | 
|  | end if | 
|  | call bitrv2conj(n, ip, a) | 
|  | else if (n .eq. 32) then | 
|  | call cftf161(a, w(nw - 8)) | 
|  | call bitrv216neg(a) | 
|  | else | 
|  | call cftf081(a, w) | 
|  | call bitrv208neg(a) | 
|  | end if | 
|  | else if (n .eq. 8) then | 
|  | call cftb040(a) | 
|  | else if (n .eq. 4) then | 
|  | call cftx020(a) | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine bitrv2(n, ip, a) | 
|  | integer n, ip(0 : *), j, j1, k, k1, l, m, nh, nm | 
|  | real*8 a(0 : n - 1), xr, xi, yr, yi | 
|  | m = 1 | 
|  | l = n / 4 | 
|  | do while (l .gt. 8) | 
|  | m = m * 2 | 
|  | l = l / 4 | 
|  | end do | 
|  | nh = n / 2 | 
|  | nm = 4 * m | 
|  | if (l .eq. 8) then | 
|  | do k = 0, m - 1 | 
|  | do j = 0, k - 1 | 
|  | j1 = 4 * j + 2 * ip(m + k) | 
|  | k1 = 4 * k + 2 * ip(m + j) | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + 2 * nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 - nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + 2 * nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nh | 
|  | k1 = k1 + 2 | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - 2 * nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 + nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - 2 * nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + 2 | 
|  | k1 = k1 + nh | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + 2 * nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 - nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + 2 * nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nh | 
|  | k1 = k1 - 2 | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - 2 * nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 + nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - 2 * nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | end do | 
|  | k1 = 4 * k + 2 * ip(m + k) | 
|  | j1 = k1 + 2 | 
|  | k1 = k1 + nh | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + 2 * nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 - nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - 2 | 
|  | k1 = k1 - nh | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nh + 2 | 
|  | k1 = k1 + nh + 2 | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nh + nm | 
|  | k1 = k1 + 2 * nm - 2 | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | end do | 
|  | else | 
|  | do k = 0, m - 1 | 
|  | do j = 0, k - 1 | 
|  | j1 = 4 * j + ip(m + k) | 
|  | k1 = 4 * k + ip(m + j) | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nh | 
|  | k1 = k1 + 2 | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + 2 | 
|  | k1 = k1 + nh | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nh | 
|  | k1 = k1 - 2 | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | end do | 
|  | k1 = 4 * k + ip(m + k) | 
|  | j1 = k1 + 2 | 
|  | k1 = k1 + nh | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + nm | 
|  | xr = a(j1) | 
|  | xi = a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | end do | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine bitrv2conj(n, ip, a) | 
|  | integer n, ip(0 : *), j, j1, k, k1, l, m, nh, nm | 
|  | real*8 a(0 : n - 1), xr, xi, yr, yi | 
|  | m = 1 | 
|  | l = n / 4 | 
|  | do while (l .gt. 8) | 
|  | m = m * 2 | 
|  | l = l / 4 | 
|  | end do | 
|  | nh = n / 2 | 
|  | nm = 4 * m | 
|  | if (l .eq. 8) then | 
|  | do k = 0, m - 1 | 
|  | do j = 0, k - 1 | 
|  | j1 = 4 * j + 2 * ip(m + k) | 
|  | k1 = 4 * k + 2 * ip(m + j) | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + 2 * nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 - nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + 2 * nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nh | 
|  | k1 = k1 + 2 | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - 2 * nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 + nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - 2 * nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + 2 | 
|  | k1 = k1 + nh | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + 2 * nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 - nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + 2 * nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nh | 
|  | k1 = k1 - 2 | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - 2 * nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 + nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - 2 * nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | end do | 
|  | k1 = 4 * k + 2 * ip(m + k) | 
|  | j1 = k1 + 2 | 
|  | k1 = k1 + nh | 
|  | a(j1 - 1) = -a(j1 - 1) | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | a(k1 + 3) = -a(k1 + 3) | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + 2 * nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 - nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - 2 | 
|  | k1 = k1 - nh | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nh + 2 | 
|  | k1 = k1 + nh + 2 | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nh + nm | 
|  | k1 = k1 + 2 * nm - 2 | 
|  | a(j1 - 1) = -a(j1 - 1) | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | a(k1 + 3) = -a(k1 + 3) | 
|  | end do | 
|  | else | 
|  | do k = 0, m - 1 | 
|  | do j = 0, k - 1 | 
|  | j1 = 4 * j + ip(m + k) | 
|  | k1 = 4 * k + ip(m + j) | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nh | 
|  | k1 = k1 + 2 | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + 2 | 
|  | k1 = k1 + nh | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nh | 
|  | k1 = k1 - 2 | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | j1 = j1 - nm | 
|  | k1 = k1 - nm | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | end do | 
|  | k1 = 4 * k + ip(m + k) | 
|  | j1 = k1 + 2 | 
|  | k1 = k1 + nh | 
|  | a(j1 - 1) = -a(j1 - 1) | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | a(k1 + 3) = -a(k1 + 3) | 
|  | j1 = j1 + nm | 
|  | k1 = k1 + nm | 
|  | a(j1 - 1) = -a(j1 - 1) | 
|  | xr = a(j1) | 
|  | xi = -a(j1 + 1) | 
|  | yr = a(k1) | 
|  | yi = -a(k1 + 1) | 
|  | a(j1) = yr | 
|  | a(j1 + 1) = yi | 
|  | a(k1) = xr | 
|  | a(k1 + 1) = xi | 
|  | a(k1 + 3) = -a(k1 + 3) | 
|  | end do | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine bitrv216(a) | 
|  | real*8 a(0 : 31), x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i | 
|  | real*8 x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i | 
|  | real*8 x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i | 
|  | x1r = a(2) | 
|  | x1i = a(3) | 
|  | x2r = a(4) | 
|  | x2i = a(5) | 
|  | x3r = a(6) | 
|  | x3i = a(7) | 
|  | x4r = a(8) | 
|  | x4i = a(9) | 
|  | x5r = a(10) | 
|  | x5i = a(11) | 
|  | x7r = a(14) | 
|  | x7i = a(15) | 
|  | x8r = a(16) | 
|  | x8i = a(17) | 
|  | x10r = a(20) | 
|  | x10i = a(21) | 
|  | x11r = a(22) | 
|  | x11i = a(23) | 
|  | x12r = a(24) | 
|  | x12i = a(25) | 
|  | x13r = a(26) | 
|  | x13i = a(27) | 
|  | x14r = a(28) | 
|  | x14i = a(29) | 
|  | a(2) = x8r | 
|  | a(3) = x8i | 
|  | a(4) = x4r | 
|  | a(5) = x4i | 
|  | a(6) = x12r | 
|  | a(7) = x12i | 
|  | a(8) = x2r | 
|  | a(9) = x2i | 
|  | a(10) = x10r | 
|  | a(11) = x10i | 
|  | a(14) = x14r | 
|  | a(15) = x14i | 
|  | a(16) = x1r | 
|  | a(17) = x1i | 
|  | a(20) = x5r | 
|  | a(21) = x5i | 
|  | a(22) = x13r | 
|  | a(23) = x13i | 
|  | a(24) = x3r | 
|  | a(25) = x3i | 
|  | a(26) = x11r | 
|  | a(27) = x11i | 
|  | a(28) = x7r | 
|  | a(29) = x7i | 
|  | end | 
|  | ! | 
|  | subroutine bitrv216neg(a) | 
|  | real*8 a(0 : 31), x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i | 
|  | real*8 x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i | 
|  | real*8 x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i | 
|  | real*8 x13r, x13i, x14r, x14i, x15r, x15i | 
|  | x1r = a(2) | 
|  | x1i = a(3) | 
|  | x2r = a(4) | 
|  | x2i = a(5) | 
|  | x3r = a(6) | 
|  | x3i = a(7) | 
|  | x4r = a(8) | 
|  | x4i = a(9) | 
|  | x5r = a(10) | 
|  | x5i = a(11) | 
|  | x6r = a(12) | 
|  | x6i = a(13) | 
|  | x7r = a(14) | 
|  | x7i = a(15) | 
|  | x8r = a(16) | 
|  | x8i = a(17) | 
|  | x9r = a(18) | 
|  | x9i = a(19) | 
|  | x10r = a(20) | 
|  | x10i = a(21) | 
|  | x11r = a(22) | 
|  | x11i = a(23) | 
|  | x12r = a(24) | 
|  | x12i = a(25) | 
|  | x13r = a(26) | 
|  | x13i = a(27) | 
|  | x14r = a(28) | 
|  | x14i = a(29) | 
|  | x15r = a(30) | 
|  | x15i = a(31) | 
|  | a(2) = x15r | 
|  | a(3) = x15i | 
|  | a(4) = x7r | 
|  | a(5) = x7i | 
|  | a(6) = x11r | 
|  | a(7) = x11i | 
|  | a(8) = x3r | 
|  | a(9) = x3i | 
|  | a(10) = x13r | 
|  | a(11) = x13i | 
|  | a(12) = x5r | 
|  | a(13) = x5i | 
|  | a(14) = x9r | 
|  | a(15) = x9i | 
|  | a(16) = x1r | 
|  | a(17) = x1i | 
|  | a(18) = x14r | 
|  | a(19) = x14i | 
|  | a(20) = x6r | 
|  | a(21) = x6i | 
|  | a(22) = x10r | 
|  | a(23) = x10i | 
|  | a(24) = x2r | 
|  | a(25) = x2i | 
|  | a(26) = x12r | 
|  | a(27) = x12i | 
|  | a(28) = x4r | 
|  | a(29) = x4i | 
|  | a(30) = x8r | 
|  | a(31) = x8i | 
|  | end | 
|  | ! | 
|  | subroutine bitrv208(a) | 
|  | real*8 a(0 : 15), x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i | 
|  | x1r = a(2) | 
|  | x1i = a(3) | 
|  | x3r = a(6) | 
|  | x3i = a(7) | 
|  | x4r = a(8) | 
|  | x4i = a(9) | 
|  | x6r = a(12) | 
|  | x6i = a(13) | 
|  | a(2) = x4r | 
|  | a(3) = x4i | 
|  | a(6) = x6r | 
|  | a(7) = x6i | 
|  | a(8) = x1r | 
|  | a(9) = x1i | 
|  | a(12) = x3r | 
|  | a(13) = x3i | 
|  | end | 
|  | ! | 
|  | subroutine bitrv208neg(a) | 
|  | real*8 a(0 : 15), x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i | 
|  | real*8 x5r, x5i, x6r, x6i, x7r, x7i | 
|  | x1r = a(2) | 
|  | x1i = a(3) | 
|  | x2r = a(4) | 
|  | x2i = a(5) | 
|  | x3r = a(6) | 
|  | x3i = a(7) | 
|  | x4r = a(8) | 
|  | x4i = a(9) | 
|  | x5r = a(10) | 
|  | x5i = a(11) | 
|  | x6r = a(12) | 
|  | x6i = a(13) | 
|  | x7r = a(14) | 
|  | x7i = a(15) | 
|  | a(2) = x7r | 
|  | a(3) = x7i | 
|  | a(4) = x3r | 
|  | a(5) = x3i | 
|  | a(6) = x5r | 
|  | a(7) = x5i | 
|  | a(8) = x1r | 
|  | a(9) = x1i | 
|  | a(10) = x6r | 
|  | a(11) = x6i | 
|  | a(12) = x2r | 
|  | a(13) = x2i | 
|  | a(14) = x4r | 
|  | a(15) = x4i | 
|  | end | 
|  | ! | 
|  | subroutine cftf1st(n, a, w) | 
|  | integer n, j, j0, j1, j2, j3, k, m, mh | 
|  | real*8 a(0 : n - 1), w(0 : *) | 
|  | real*8 wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i | 
|  | real*8 wd1r, wd1i, wd3r, wd3i | 
|  | real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i | 
|  | real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i | 
|  | mh = n / 8 | 
|  | m = 2 * mh | 
|  | j1 = m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(0) + a(j2) | 
|  | x0i = a(1) + a(j2 + 1) | 
|  | x1r = a(0) - a(j2) | 
|  | x1i = a(1) - a(j2 + 1) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | a(0) = x0r + x2r | 
|  | a(1) = x0i + x2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i - x2i | 
|  | a(j2) = x1r - x3i | 
|  | a(j2 + 1) = x1i + x3r | 
|  | a(j3) = x1r + x3i | 
|  | a(j3 + 1) = x1i - x3r | 
|  | wn4r = w(1) | 
|  | csc1 = w(2) | 
|  | csc3 = w(3) | 
|  | wd1r = 1 | 
|  | wd1i = 0 | 
|  | wd3r = 1 | 
|  | wd3i = 0 | 
|  | k = 0 | 
|  | do j = 2, mh - 6, 4 | 
|  | k = k + 4 | 
|  | wk1r = csc1 * (wd1r + w(k)) | 
|  | wk1i = csc1 * (wd1i + w(k + 1)) | 
|  | wk3r = csc3 * (wd3r + w(k + 2)) | 
|  | wk3i = csc3 * (wd3i + w(k + 3)) | 
|  | wd1r = w(k) | 
|  | wd1i = w(k + 1) | 
|  | wd3r = w(k + 2) | 
|  | wd3i = w(k + 3) | 
|  | j1 = j + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j) + a(j2) | 
|  | x0i = a(j + 1) + a(j2 + 1) | 
|  | x1r = a(j) - a(j2) | 
|  | x1i = a(j + 1) - a(j2 + 1) | 
|  | y0r = a(j + 2) + a(j2 + 2) | 
|  | y0i = a(j + 3) + a(j2 + 3) | 
|  | y1r = a(j + 2) - a(j2 + 2) | 
|  | y1i = a(j + 3) - a(j2 + 3) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | y2r = a(j1 + 2) + a(j3 + 2) | 
|  | y2i = a(j1 + 3) + a(j3 + 3) | 
|  | y3r = a(j1 + 2) - a(j3 + 2) | 
|  | y3i = a(j1 + 3) - a(j3 + 3) | 
|  | a(j) = x0r + x2r | 
|  | a(j + 1) = x0i + x2i | 
|  | a(j + 2) = y0r + y2r | 
|  | a(j + 3) = y0i + y2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i - x2i | 
|  | a(j1 + 2) = y0r - y2r | 
|  | a(j1 + 3) = y0i - y2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2) = wk1r * x0r - wk1i * x0i | 
|  | a(j2 + 1) = wk1r * x0i + wk1i * x0r | 
|  | x0r = y1r - y3i | 
|  | x0i = y1i + y3r | 
|  | a(j2 + 2) = wd1r * x0r - wd1i * x0i | 
|  | a(j2 + 3) = wd1r * x0i + wd1i * x0r | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3) = wk3r * x0r + wk3i * x0i | 
|  | a(j3 + 1) = wk3r * x0i - wk3i * x0r | 
|  | x0r = y1r + y3i | 
|  | x0i = y1i - y3r | 
|  | a(j3 + 2) = wd3r * x0r + wd3i * x0i | 
|  | a(j3 + 3) = wd3r * x0i - wd3i * x0r | 
|  | j0 = m - j | 
|  | j1 = j0 + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j0) + a(j2) | 
|  | x0i = a(j0 + 1) + a(j2 + 1) | 
|  | x1r = a(j0) - a(j2) | 
|  | x1i = a(j0 + 1) - a(j2 + 1) | 
|  | y0r = a(j0 - 2) + a(j2 - 2) | 
|  | y0i = a(j0 - 1) + a(j2 - 1) | 
|  | y1r = a(j0 - 2) - a(j2 - 2) | 
|  | y1i = a(j0 - 1) - a(j2 - 1) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | y2r = a(j1 - 2) + a(j3 - 2) | 
|  | y2i = a(j1 - 1) + a(j3 - 1) | 
|  | y3r = a(j1 - 2) - a(j3 - 2) | 
|  | y3i = a(j1 - 1) - a(j3 - 1) | 
|  | a(j0) = x0r + x2r | 
|  | a(j0 + 1) = x0i + x2i | 
|  | a(j0 - 2) = y0r + y2r | 
|  | a(j0 - 1) = y0i + y2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i - x2i | 
|  | a(j1 - 2) = y0r - y2r | 
|  | a(j1 - 1) = y0i - y2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2) = wk1i * x0r - wk1r * x0i | 
|  | a(j2 + 1) = wk1i * x0i + wk1r * x0r | 
|  | x0r = y1r - y3i | 
|  | x0i = y1i + y3r | 
|  | a(j2 - 2) = wd1i * x0r - wd1r * x0i | 
|  | a(j2 - 1) = wd1i * x0i + wd1r * x0r | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3) = wk3i * x0r + wk3r * x0i | 
|  | a(j3 + 1) = wk3i * x0i - wk3r * x0r | 
|  | x0r = y1r + y3i | 
|  | x0i = y1i - y3r | 
|  | a(j3 - 2) = wd3i * x0r + wd3r * x0i | 
|  | a(j3 - 1) = wd3i * x0i - wd3r * x0r | 
|  | end do | 
|  | wk1r = csc1 * (wd1r + wn4r) | 
|  | wk1i = csc1 * (wd1i + wn4r) | 
|  | wk3r = csc3 * (wd3r - wn4r) | 
|  | wk3i = csc3 * (wd3i - wn4r) | 
|  | j0 = mh | 
|  | j1 = j0 + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j0 - 2) + a(j2 - 2) | 
|  | x0i = a(j0 - 1) + a(j2 - 1) | 
|  | x1r = a(j0 - 2) - a(j2 - 2) | 
|  | x1i = a(j0 - 1) - a(j2 - 1) | 
|  | x2r = a(j1 - 2) + a(j3 - 2) | 
|  | x2i = a(j1 - 1) + a(j3 - 1) | 
|  | x3r = a(j1 - 2) - a(j3 - 2) | 
|  | x3i = a(j1 - 1) - a(j3 - 1) | 
|  | a(j0 - 2) = x0r + x2r | 
|  | a(j0 - 1) = x0i + x2i | 
|  | a(j1 - 2) = x0r - x2r | 
|  | a(j1 - 1) = x0i - x2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2 - 2) = wk1r * x0r - wk1i * x0i | 
|  | a(j2 - 1) = wk1r * x0i + wk1i * x0r | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3 - 2) = wk3r * x0r + wk3i * x0i | 
|  | a(j3 - 1) = wk3r * x0i - wk3i * x0r | 
|  | x0r = a(j0) + a(j2) | 
|  | x0i = a(j0 + 1) + a(j2 + 1) | 
|  | x1r = a(j0) - a(j2) | 
|  | x1i = a(j0 + 1) - a(j2 + 1) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | a(j0) = x0r + x2r | 
|  | a(j0 + 1) = x0i + x2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i - x2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2) = wn4r * (x0r - x0i) | 
|  | a(j2 + 1) = wn4r * (x0i + x0r) | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3) = -wn4r * (x0r + x0i) | 
|  | a(j3 + 1) = -wn4r * (x0i - x0r) | 
|  | x0r = a(j0 + 2) + a(j2 + 2) | 
|  | x0i = a(j0 + 3) + a(j2 + 3) | 
|  | x1r = a(j0 + 2) - a(j2 + 2) | 
|  | x1i = a(j0 + 3) - a(j2 + 3) | 
|  | x2r = a(j1 + 2) + a(j3 + 2) | 
|  | x2i = a(j1 + 3) + a(j3 + 3) | 
|  | x3r = a(j1 + 2) - a(j3 + 2) | 
|  | x3i = a(j1 + 3) - a(j3 + 3) | 
|  | a(j0 + 2) = x0r + x2r | 
|  | a(j0 + 3) = x0i + x2i | 
|  | a(j1 + 2) = x0r - x2r | 
|  | a(j1 + 3) = x0i - x2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2 + 2) = wk1i * x0r - wk1r * x0i | 
|  | a(j2 + 3) = wk1i * x0i + wk1r * x0r | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3 + 2) = wk3i * x0r + wk3r * x0i | 
|  | a(j3 + 3) = wk3i * x0i - wk3r * x0r | 
|  | end | 
|  | ! | 
|  | subroutine cftb1st(n, a, w) | 
|  | integer n, j, j0, j1, j2, j3, k, m, mh | 
|  | real*8 a(0 : n - 1), w(0 : *) | 
|  | real*8 wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i | 
|  | real*8 wd1r, wd1i, wd3r, wd3i | 
|  | real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i | 
|  | real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i | 
|  | mh = n / 8 | 
|  | m = 2 * mh | 
|  | j1 = m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(0) + a(j2) | 
|  | x0i = -a(1) - a(j2 + 1) | 
|  | x1r = a(0) - a(j2) | 
|  | x1i = -a(1) + a(j2 + 1) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | a(0) = x0r + x2r | 
|  | a(1) = x0i - x2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i + x2i | 
|  | a(j2) = x1r + x3i | 
|  | a(j2 + 1) = x1i + x3r | 
|  | a(j3) = x1r - x3i | 
|  | a(j3 + 1) = x1i - x3r | 
|  | wn4r = w(1) | 
|  | csc1 = w(2) | 
|  | csc3 = w(3) | 
|  | wd1r = 1 | 
|  | wd1i = 0 | 
|  | wd3r = 1 | 
|  | wd3i = 0 | 
|  | k = 0 | 
|  | do j = 2, mh - 6, 4 | 
|  | k = k + 4 | 
|  | wk1r = csc1 * (wd1r + w(k)) | 
|  | wk1i = csc1 * (wd1i + w(k + 1)) | 
|  | wk3r = csc3 * (wd3r + w(k + 2)) | 
|  | wk3i = csc3 * (wd3i + w(k + 3)) | 
|  | wd1r = w(k) | 
|  | wd1i = w(k + 1) | 
|  | wd3r = w(k + 2) | 
|  | wd3i = w(k + 3) | 
|  | j1 = j + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j) + a(j2) | 
|  | x0i = -a(j + 1) - a(j2 + 1) | 
|  | x1r = a(j) - a(j2) | 
|  | x1i = -a(j + 1) + a(j2 + 1) | 
|  | y0r = a(j + 2) + a(j2 + 2) | 
|  | y0i = -a(j + 3) - a(j2 + 3) | 
|  | y1r = a(j + 2) - a(j2 + 2) | 
|  | y1i = -a(j + 3) + a(j2 + 3) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | y2r = a(j1 + 2) + a(j3 + 2) | 
|  | y2i = a(j1 + 3) + a(j3 + 3) | 
|  | y3r = a(j1 + 2) - a(j3 + 2) | 
|  | y3i = a(j1 + 3) - a(j3 + 3) | 
|  | a(j) = x0r + x2r | 
|  | a(j + 1) = x0i - x2i | 
|  | a(j + 2) = y0r + y2r | 
|  | a(j + 3) = y0i - y2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i + x2i | 
|  | a(j1 + 2) = y0r - y2r | 
|  | a(j1 + 3) = y0i + y2i | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2) = wk1r * x0r - wk1i * x0i | 
|  | a(j2 + 1) = wk1r * x0i + wk1i * x0r | 
|  | x0r = y1r + y3i | 
|  | x0i = y1i + y3r | 
|  | a(j2 + 2) = wd1r * x0r - wd1i * x0i | 
|  | a(j2 + 3) = wd1r * x0i + wd1i * x0r | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3) = wk3r * x0r + wk3i * x0i | 
|  | a(j3 + 1) = wk3r * x0i - wk3i * x0r | 
|  | x0r = y1r - y3i | 
|  | x0i = y1i - y3r | 
|  | a(j3 + 2) = wd3r * x0r + wd3i * x0i | 
|  | a(j3 + 3) = wd3r * x0i - wd3i * x0r | 
|  | j0 = m - j | 
|  | j1 = j0 + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j0) + a(j2) | 
|  | x0i = -a(j0 + 1) - a(j2 + 1) | 
|  | x1r = a(j0) - a(j2) | 
|  | x1i = -a(j0 + 1) + a(j2 + 1) | 
|  | y0r = a(j0 - 2) + a(j2 - 2) | 
|  | y0i = -a(j0 - 1) - a(j2 - 1) | 
|  | y1r = a(j0 - 2) - a(j2 - 2) | 
|  | y1i = -a(j0 - 1) + a(j2 - 1) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | y2r = a(j1 - 2) + a(j3 - 2) | 
|  | y2i = a(j1 - 1) + a(j3 - 1) | 
|  | y3r = a(j1 - 2) - a(j3 - 2) | 
|  | y3i = a(j1 - 1) - a(j3 - 1) | 
|  | a(j0) = x0r + x2r | 
|  | a(j0 + 1) = x0i - x2i | 
|  | a(j0 - 2) = y0r + y2r | 
|  | a(j0 - 1) = y0i - y2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i + x2i | 
|  | a(j1 - 2) = y0r - y2r | 
|  | a(j1 - 1) = y0i + y2i | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2) = wk1i * x0r - wk1r * x0i | 
|  | a(j2 + 1) = wk1i * x0i + wk1r * x0r | 
|  | x0r = y1r + y3i | 
|  | x0i = y1i + y3r | 
|  | a(j2 - 2) = wd1i * x0r - wd1r * x0i | 
|  | a(j2 - 1) = wd1i * x0i + wd1r * x0r | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3) = wk3i * x0r + wk3r * x0i | 
|  | a(j3 + 1) = wk3i * x0i - wk3r * x0r | 
|  | x0r = y1r - y3i | 
|  | x0i = y1i - y3r | 
|  | a(j3 - 2) = wd3i * x0r + wd3r * x0i | 
|  | a(j3 - 1) = wd3i * x0i - wd3r * x0r | 
|  | end do | 
|  | wk1r = csc1 * (wd1r + wn4r) | 
|  | wk1i = csc1 * (wd1i + wn4r) | 
|  | wk3r = csc3 * (wd3r - wn4r) | 
|  | wk3i = csc3 * (wd3i - wn4r) | 
|  | j0 = mh | 
|  | j1 = j0 + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j0 - 2) + a(j2 - 2) | 
|  | x0i = -a(j0 - 1) - a(j2 - 1) | 
|  | x1r = a(j0 - 2) - a(j2 - 2) | 
|  | x1i = -a(j0 - 1) + a(j2 - 1) | 
|  | x2r = a(j1 - 2) + a(j3 - 2) | 
|  | x2i = a(j1 - 1) + a(j3 - 1) | 
|  | x3r = a(j1 - 2) - a(j3 - 2) | 
|  | x3i = a(j1 - 1) - a(j3 - 1) | 
|  | a(j0 - 2) = x0r + x2r | 
|  | a(j0 - 1) = x0i - x2i | 
|  | a(j1 - 2) = x0r - x2r | 
|  | a(j1 - 1) = x0i + x2i | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2 - 2) = wk1r * x0r - wk1i * x0i | 
|  | a(j2 - 1) = wk1r * x0i + wk1i * x0r | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3 - 2) = wk3r * x0r + wk3i * x0i | 
|  | a(j3 - 1) = wk3r * x0i - wk3i * x0r | 
|  | x0r = a(j0) + a(j2) | 
|  | x0i = -a(j0 + 1) - a(j2 + 1) | 
|  | x1r = a(j0) - a(j2) | 
|  | x1i = -a(j0 + 1) + a(j2 + 1) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | a(j0) = x0r + x2r | 
|  | a(j0 + 1) = x0i - x2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i + x2i | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2) = wn4r * (x0r - x0i) | 
|  | a(j2 + 1) = wn4r * (x0i + x0r) | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3) = -wn4r * (x0r + x0i) | 
|  | a(j3 + 1) = -wn4r * (x0i - x0r) | 
|  | x0r = a(j0 + 2) + a(j2 + 2) | 
|  | x0i = -a(j0 + 3) - a(j2 + 3) | 
|  | x1r = a(j0 + 2) - a(j2 + 2) | 
|  | x1i = -a(j0 + 3) + a(j2 + 3) | 
|  | x2r = a(j1 + 2) + a(j3 + 2) | 
|  | x2i = a(j1 + 3) + a(j3 + 3) | 
|  | x3r = a(j1 + 2) - a(j3 + 2) | 
|  | x3i = a(j1 + 3) - a(j3 + 3) | 
|  | a(j0 + 2) = x0r + x2r | 
|  | a(j0 + 3) = x0i - x2i | 
|  | a(j1 + 2) = x0r - x2r | 
|  | a(j1 + 3) = x0i + x2i | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2 + 2) = wk1i * x0r - wk1r * x0i | 
|  | a(j2 + 3) = wk1i * x0i + wk1r * x0r | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3 + 2) = wk3i * x0r + wk3r * x0i | 
|  | a(j3 + 3) = wk3i * x0i - wk3r * x0r | 
|  | end | 
|  | ! | 
|  | subroutine cftrec4(n, a, nw, w) | 
|  | integer n, nw, cfttree, isplt, j, k, m | 
|  | real*8 a(0 : n - 1), w(0 : nw - 1) | 
|  | m = n | 
|  | do while (m .gt. 512) | 
|  | m = m / 4 | 
|  | call cftmdl1(m, a(n - m), w(nw - m / 2)) | 
|  | end do | 
|  | call cftleaf(m, 1, a(n - m), nw, w) | 
|  | k = 0 | 
|  | do j = n - m, m, -m | 
|  | k = k + 1 | 
|  | isplt = cfttree(m, j, k, a, nw, w) | 
|  | call cftleaf(m, isplt, a(j - m), nw, w) | 
|  | end do | 
|  | end | 
|  | ! | 
|  | integer function cfttree(n, j, k, a, nw, w) | 
|  | integer n, j, k, nw, i, isplt, m | 
|  | real*8 a(0 : j - 1), w(0 : nw - 1) | 
|  | if (mod(k, 4) .ne. 0) then | 
|  | isplt = mod(k, 2) | 
|  | if (isplt .ne. 0) then | 
|  | call cftmdl1(n, a(j - n), w(nw - n / 2)) | 
|  | else | 
|  | call cftmdl2(n, a(j - n), w(nw - n)) | 
|  | end if | 
|  | else | 
|  | m = n | 
|  | i = k | 
|  | do while (mod(i, 4) .eq. 0) | 
|  | m = m * 4 | 
|  | i = i / 4 | 
|  | end do | 
|  | isplt = mod(i, 2) | 
|  | if (isplt .ne. 0) then | 
|  | do while (m .gt. 128) | 
|  | call cftmdl1(m, a(j - m), w(nw - m / 2)) | 
|  | m = m / 4 | 
|  | end do | 
|  | else | 
|  | do while (m .gt. 128) | 
|  | call cftmdl2(m, a(j - m), w(nw - m)) | 
|  | m = m / 4 | 
|  | end do | 
|  | end if | 
|  | end if | 
|  | cfttree = isplt | 
|  | end | 
|  | ! | 
|  | subroutine cftleaf(n, isplt, a, nw, w) | 
|  | integer n, isplt, nw | 
|  | real*8 a(0 : n - 1), w(0 : nw - 1) | 
|  | if (n .eq. 512) then | 
|  | call cftmdl1(128, a, w(nw - 64)) | 
|  | call cftf161(a, w(nw - 8)) | 
|  | call cftf162(a(32), w(nw - 32)) | 
|  | call cftf161(a(64), w(nw - 8)) | 
|  | call cftf161(a(96), w(nw - 8)) | 
|  | call cftmdl2(128, a(128), w(nw - 128)) | 
|  | call cftf161(a(128), w(nw - 8)) | 
|  | call cftf162(a(160), w(nw - 32)) | 
|  | call cftf161(a(192), w(nw - 8)) | 
|  | call cftf162(a(224), w(nw - 32)) | 
|  | call cftmdl1(128, a(256), w(nw - 64)) | 
|  | call cftf161(a(256), w(nw - 8)) | 
|  | call cftf162(a(288), w(nw - 32)) | 
|  | call cftf161(a(320), w(nw - 8)) | 
|  | call cftf161(a(352), w(nw - 8)) | 
|  | if (isplt .ne. 0) then | 
|  | call cftmdl1(128, a(384), w(nw - 64)) | 
|  | call cftf161(a(480), w(nw - 8)) | 
|  | else | 
|  | call cftmdl2(128, a(384), w(nw - 128)) | 
|  | call cftf162(a(480), w(nw - 32)) | 
|  | end if | 
|  | call cftf161(a(384), w(nw - 8)) | 
|  | call cftf162(a(416), w(nw - 32)) | 
|  | call cftf161(a(448), w(nw - 8)) | 
|  | else | 
|  | call cftmdl1(64, a, w(nw - 32)) | 
|  | call cftf081(a, w(nw - 8)) | 
|  | call cftf082(a(16), w(nw - 8)) | 
|  | call cftf081(a(32), w(nw - 8)) | 
|  | call cftf081(a(48), w(nw - 8)) | 
|  | call cftmdl2(64, a(64), w(nw - 64)) | 
|  | call cftf081(a(64), w(nw - 8)) | 
|  | call cftf082(a(80), w(nw - 8)) | 
|  | call cftf081(a(96), w(nw - 8)) | 
|  | call cftf082(a(112), w(nw - 8)) | 
|  | call cftmdl1(64, a(128), w(nw - 32)) | 
|  | call cftf081(a(128), w(nw - 8)) | 
|  | call cftf082(a(144), w(nw - 8)) | 
|  | call cftf081(a(160), w(nw - 8)) | 
|  | call cftf081(a(176), w(nw - 8)) | 
|  | if (isplt .ne. 0) then | 
|  | call cftmdl1(64, a(192), w(nw - 32)) | 
|  | call cftf081(a(240), w(nw - 8)) | 
|  | else | 
|  | call cftmdl2(64, a(192), w(nw - 64)) | 
|  | call cftf082(a(240), w(nw - 8)) | 
|  | end if | 
|  | call cftf081(a(192), w(nw - 8)) | 
|  | call cftf082(a(208), w(nw - 8)) | 
|  | call cftf081(a(224), w(nw - 8)) | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine cftmdl1(n, a, w) | 
|  | integer n, j, j0, j1, j2, j3, k, m, mh | 
|  | real*8 a(0 : n - 1), w(0 : *) | 
|  | real*8 wn4r, wk1r, wk1i, wk3r, wk3i | 
|  | real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i | 
|  | mh = n / 8 | 
|  | m = 2 * mh | 
|  | j1 = m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(0) + a(j2) | 
|  | x0i = a(1) + a(j2 + 1) | 
|  | x1r = a(0) - a(j2) | 
|  | x1i = a(1) - a(j2 + 1) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | a(0) = x0r + x2r | 
|  | a(1) = x0i + x2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i - x2i | 
|  | a(j2) = x1r - x3i | 
|  | a(j2 + 1) = x1i + x3r | 
|  | a(j3) = x1r + x3i | 
|  | a(j3 + 1) = x1i - x3r | 
|  | wn4r = w(1) | 
|  | k = 0 | 
|  | do j = 2, mh - 2, 2 | 
|  | k = k + 4 | 
|  | wk1r = w(k) | 
|  | wk1i = w(k + 1) | 
|  | wk3r = w(k + 2) | 
|  | wk3i = w(k + 3) | 
|  | j1 = j + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j) + a(j2) | 
|  | x0i = a(j + 1) + a(j2 + 1) | 
|  | x1r = a(j) - a(j2) | 
|  | x1i = a(j + 1) - a(j2 + 1) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | a(j) = x0r + x2r | 
|  | a(j + 1) = x0i + x2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i - x2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2) = wk1r * x0r - wk1i * x0i | 
|  | a(j2 + 1) = wk1r * x0i + wk1i * x0r | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3) = wk3r * x0r + wk3i * x0i | 
|  | a(j3 + 1) = wk3r * x0i - wk3i * x0r | 
|  | j0 = m - j | 
|  | j1 = j0 + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j0) + a(j2) | 
|  | x0i = a(j0 + 1) + a(j2 + 1) | 
|  | x1r = a(j0) - a(j2) | 
|  | x1i = a(j0 + 1) - a(j2 + 1) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | a(j0) = x0r + x2r | 
|  | a(j0 + 1) = x0i + x2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i - x2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2) = wk1i * x0r - wk1r * x0i | 
|  | a(j2 + 1) = wk1i * x0i + wk1r * x0r | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3) = wk3i * x0r + wk3r * x0i | 
|  | a(j3 + 1) = wk3i * x0i - wk3r * x0r | 
|  | end do | 
|  | j0 = mh | 
|  | j1 = j0 + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j0) + a(j2) | 
|  | x0i = a(j0 + 1) + a(j2 + 1) | 
|  | x1r = a(j0) - a(j2) | 
|  | x1i = a(j0 + 1) - a(j2 + 1) | 
|  | x2r = a(j1) + a(j3) | 
|  | x2i = a(j1 + 1) + a(j3 + 1) | 
|  | x3r = a(j1) - a(j3) | 
|  | x3i = a(j1 + 1) - a(j3 + 1) | 
|  | a(j0) = x0r + x2r | 
|  | a(j0 + 1) = x0i + x2i | 
|  | a(j1) = x0r - x2r | 
|  | a(j1 + 1) = x0i - x2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | a(j2) = wn4r * (x0r - x0i) | 
|  | a(j2 + 1) = wn4r * (x0i + x0r) | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | a(j3) = -wn4r * (x0r + x0i) | 
|  | a(j3 + 1) = -wn4r * (x0i - x0r) | 
|  | end | 
|  | ! | 
|  | subroutine cftmdl2(n, a, w) | 
|  | integer n, j, j0, j1, j2, j3, k, kr, m, mh | 
|  | real*8 a(0 : n - 1), w(0 : *) | 
|  | real*8 wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i | 
|  | real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i | 
|  | real*8 y0r, y0i, y2r, y2i | 
|  | mh = n / 8 | 
|  | m = 2 * mh | 
|  | wn4r = w(1) | 
|  | j1 = m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(0) - a(j2 + 1) | 
|  | x0i = a(1) + a(j2) | 
|  | x1r = a(0) + a(j2 + 1) | 
|  | x1i = a(1) - a(j2) | 
|  | x2r = a(j1) - a(j3 + 1) | 
|  | x2i = a(j1 + 1) + a(j3) | 
|  | x3r = a(j1) + a(j3 + 1) | 
|  | x3i = a(j1 + 1) - a(j3) | 
|  | y0r = wn4r * (x2r - x2i) | 
|  | y0i = wn4r * (x2i + x2r) | 
|  | a(0) = x0r + y0r | 
|  | a(1) = x0i + y0i | 
|  | a(j1) = x0r - y0r | 
|  | a(j1 + 1) = x0i - y0i | 
|  | y0r = wn4r * (x3r - x3i) | 
|  | y0i = wn4r * (x3i + x3r) | 
|  | a(j2) = x1r - y0i | 
|  | a(j2 + 1) = x1i + y0r | 
|  | a(j3) = x1r + y0i | 
|  | a(j3 + 1) = x1i - y0r | 
|  | k = 0 | 
|  | kr = 2 * m | 
|  | do j = 2, mh - 2, 2 | 
|  | k = k + 4 | 
|  | wk1r = w(k) | 
|  | wk1i = w(k + 1) | 
|  | wk3r = w(k + 2) | 
|  | wk3i = w(k + 3) | 
|  | kr = kr - 4 | 
|  | wd1i = w(kr) | 
|  | wd1r = w(kr + 1) | 
|  | wd3i = w(kr + 2) | 
|  | wd3r = w(kr + 3) | 
|  | j1 = j + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j) - a(j2 + 1) | 
|  | x0i = a(j + 1) + a(j2) | 
|  | x1r = a(j) + a(j2 + 1) | 
|  | x1i = a(j + 1) - a(j2) | 
|  | x2r = a(j1) - a(j3 + 1) | 
|  | x2i = a(j1 + 1) + a(j3) | 
|  | x3r = a(j1) + a(j3 + 1) | 
|  | x3i = a(j1 + 1) - a(j3) | 
|  | y0r = wk1r * x0r - wk1i * x0i | 
|  | y0i = wk1r * x0i + wk1i * x0r | 
|  | y2r = wd1r * x2r - wd1i * x2i | 
|  | y2i = wd1r * x2i + wd1i * x2r | 
|  | a(j) = y0r + y2r | 
|  | a(j + 1) = y0i + y2i | 
|  | a(j1) = y0r - y2r | 
|  | a(j1 + 1) = y0i - y2i | 
|  | y0r = wk3r * x1r + wk3i * x1i | 
|  | y0i = wk3r * x1i - wk3i * x1r | 
|  | y2r = wd3r * x3r + wd3i * x3i | 
|  | y2i = wd3r * x3i - wd3i * x3r | 
|  | a(j2) = y0r + y2r | 
|  | a(j2 + 1) = y0i + y2i | 
|  | a(j3) = y0r - y2r | 
|  | a(j3 + 1) = y0i - y2i | 
|  | j0 = m - j | 
|  | j1 = j0 + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j0) - a(j2 + 1) | 
|  | x0i = a(j0 + 1) + a(j2) | 
|  | x1r = a(j0) + a(j2 + 1) | 
|  | x1i = a(j0 + 1) - a(j2) | 
|  | x2r = a(j1) - a(j3 + 1) | 
|  | x2i = a(j1 + 1) + a(j3) | 
|  | x3r = a(j1) + a(j3 + 1) | 
|  | x3i = a(j1 + 1) - a(j3) | 
|  | y0r = wd1i * x0r - wd1r * x0i | 
|  | y0i = wd1i * x0i + wd1r * x0r | 
|  | y2r = wk1i * x2r - wk1r * x2i | 
|  | y2i = wk1i * x2i + wk1r * x2r | 
|  | a(j0) = y0r + y2r | 
|  | a(j0 + 1) = y0i + y2i | 
|  | a(j1) = y0r - y2r | 
|  | a(j1 + 1) = y0i - y2i | 
|  | y0r = wd3i * x1r + wd3r * x1i | 
|  | y0i = wd3i * x1i - wd3r * x1r | 
|  | y2r = wk3i * x3r + wk3r * x3i | 
|  | y2i = wk3i * x3i - wk3r * x3r | 
|  | a(j2) = y0r + y2r | 
|  | a(j2 + 1) = y0i + y2i | 
|  | a(j3) = y0r - y2r | 
|  | a(j3 + 1) = y0i - y2i | 
|  | end do | 
|  | wk1r = w(m) | 
|  | wk1i = w(m + 1) | 
|  | j0 = mh | 
|  | j1 = j0 + m | 
|  | j2 = j1 + m | 
|  | j3 = j2 + m | 
|  | x0r = a(j0) - a(j2 + 1) | 
|  | x0i = a(j0 + 1) + a(j2) | 
|  | x1r = a(j0) + a(j2 + 1) | 
|  | x1i = a(j0 + 1) - a(j2) | 
|  | x2r = a(j1) - a(j3 + 1) | 
|  | x2i = a(j1 + 1) + a(j3) | 
|  | x3r = a(j1) + a(j3 + 1) | 
|  | x3i = a(j1 + 1) - a(j3) | 
|  | y0r = wk1r * x0r - wk1i * x0i | 
|  | y0i = wk1r * x0i + wk1i * x0r | 
|  | y2r = wk1i * x2r - wk1r * x2i | 
|  | y2i = wk1i * x2i + wk1r * x2r | 
|  | a(j0) = y0r + y2r | 
|  | a(j0 + 1) = y0i + y2i | 
|  | a(j1) = y0r - y2r | 
|  | a(j1 + 1) = y0i - y2i | 
|  | y0r = wk1i * x1r - wk1r * x1i | 
|  | y0i = wk1i * x1i + wk1r * x1r | 
|  | y2r = wk1r * x3r - wk1i * x3i | 
|  | y2i = wk1r * x3i + wk1i * x3r | 
|  | a(j2) = y0r - y2r | 
|  | a(j2 + 1) = y0i - y2i | 
|  | a(j3) = y0r + y2r | 
|  | a(j3 + 1) = y0i + y2i | 
|  | end | 
|  | ! | 
|  | subroutine cftfx41(n, a, nw, w) | 
|  | integer n, nw | 
|  | real*8 a(0 : n - 1), w(0 : nw - 1) | 
|  | if (n .eq. 128) then | 
|  | call cftf161(a, w(nw - 8)) | 
|  | call cftf162(a(32), w(nw - 32)) | 
|  | call cftf161(a(64), w(nw - 8)) | 
|  | call cftf161(a(96), w(nw - 8)) | 
|  | else | 
|  | call cftf081(a, w(nw - 8)) | 
|  | call cftf082(a(16), w(nw - 8)) | 
|  | call cftf081(a(32), w(nw - 8)) | 
|  | call cftf081(a(48), w(nw - 8)) | 
|  | end if | 
|  | end | 
|  | ! | 
|  | subroutine cftf161(a, w) | 
|  | real*8 a(0 : 31), w(0 : *), wn4r, wk1r, wk1i | 
|  | real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i | 
|  | real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i | 
|  | real*8 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i | 
|  | real*8 y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i | 
|  | real*8 y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i | 
|  | wn4r = w(1) | 
|  | wk1r = w(2) | 
|  | wk1i = w(3) | 
|  | x0r = a(0) + a(16) | 
|  | x0i = a(1) + a(17) | 
|  | x1r = a(0) - a(16) | 
|  | x1i = a(1) - a(17) | 
|  | x2r = a(8) + a(24) | 
|  | x2i = a(9) + a(25) | 
|  | x3r = a(8) - a(24) | 
|  | x3i = a(9) - a(25) | 
|  | y0r = x0r + x2r | 
|  | y0i = x0i + x2i | 
|  | y4r = x0r - x2r | 
|  | y4i = x0i - x2i | 
|  | y8r = x1r - x3i | 
|  | y8i = x1i + x3r | 
|  | y12r = x1r + x3i | 
|  | y12i = x1i - x3r | 
|  | x0r = a(2) + a(18) | 
|  | x0i = a(3) + a(19) | 
|  | x1r = a(2) - a(18) | 
|  | x1i = a(3) - a(19) | 
|  | x2r = a(10) + a(26) | 
|  | x2i = a(11) + a(27) | 
|  | x3r = a(10) - a(26) | 
|  | x3i = a(11) - a(27) | 
|  | y1r = x0r + x2r | 
|  | y1i = x0i + x2i | 
|  | y5r = x0r - x2r | 
|  | y5i = x0i - x2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | y9r = wk1r * x0r - wk1i * x0i | 
|  | y9i = wk1r * x0i + wk1i * x0r | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | y13r = wk1i * x0r - wk1r * x0i | 
|  | y13i = wk1i * x0i + wk1r * x0r | 
|  | x0r = a(4) + a(20) | 
|  | x0i = a(5) + a(21) | 
|  | x1r = a(4) - a(20) | 
|  | x1i = a(5) - a(21) | 
|  | x2r = a(12) + a(28) | 
|  | x2i = a(13) + a(29) | 
|  | x3r = a(12) - a(28) | 
|  | x3i = a(13) - a(29) | 
|  | y2r = x0r + x2r | 
|  | y2i = x0i + x2i | 
|  | y6r = x0r - x2r | 
|  | y6i = x0i - x2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | y10r = wn4r * (x0r - x0i) | 
|  | y10i = wn4r * (x0i + x0r) | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | y14r = wn4r * (x0r + x0i) | 
|  | y14i = wn4r * (x0i - x0r) | 
|  | x0r = a(6) + a(22) | 
|  | x0i = a(7) + a(23) | 
|  | x1r = a(6) - a(22) | 
|  | x1i = a(7) - a(23) | 
|  | x2r = a(14) + a(30) | 
|  | x2i = a(15) + a(31) | 
|  | x3r = a(14) - a(30) | 
|  | x3i = a(15) - a(31) | 
|  | y3r = x0r + x2r | 
|  | y3i = x0i + x2i | 
|  | y7r = x0r - x2r | 
|  | y7i = x0i - x2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | y11r = wk1i * x0r - wk1r * x0i | 
|  | y11i = wk1i * x0i + wk1r * x0r | 
|  | x0r = x1r + x3i | 
|  | x0i = x1i - x3r | 
|  | y15r = wk1r * x0r - wk1i * x0i | 
|  | y15i = wk1r * x0i + wk1i * x0r | 
|  | x0r = y12r - y14r | 
|  | x0i = y12i - y14i | 
|  | x1r = y12r + y14r | 
|  | x1i = y12i + y14i | 
|  | x2r = y13r - y15r | 
|  | x2i = y13i - y15i | 
|  | x3r = y13r + y15r | 
|  | x3i = y13i + y15i | 
|  | a(24) = x0r + x2r | 
|  | a(25) = x0i + x2i | 
|  | a(26) = x0r - x2r | 
|  | a(27) = x0i - x2i | 
|  | a(28) = x1r - x3i | 
|  | a(29) = x1i + x3r | 
|  | a(30) = x1r + x3i | 
|  | a(31) = x1i - x3r | 
|  | x0r = y8r + y10r | 
|  | x0i = y8i + y10i | 
|  | x1r = y8r - y10r | 
|  | x1i = y8i - y10i | 
|  | x2r = y9r + y11r | 
|  | x2i = y9i + y11i | 
|  | x3r = y9r - y11r | 
|  | x3i = y9i - y11i | 
|  | a(16) = x0r + x2r | 
|  | a(17) = x0i + x2i | 
|  | a(18) = x0r - x2r | 
|  | a(19) = x0i - x2i | 
|  | a(20) = x1r - x3i | 
|  | a(21) = x1i + x3r | 
|  | a(22) = x1r + x3i | 
|  | a(23) = x1i - x3r | 
|  | x0r = y5r - y7i | 
|  | x0i = y5i + y7r | 
|  | x2r = wn4r * (x0r - x0i) | 
|  | x2i = wn4r * (x0i + x0r) | 
|  | x0r = y5r + y7i | 
|  | x0i = y5i - y7r | 
|  | x3r = wn4r * (x0r - x0i) | 
|  | x3i = wn4r * (x0i + x0r) | 
|  | x0r = y4r - y6i | 
|  | x0i = y4i + y6r | 
|  | x1r = y4r + y6i | 
|  | x1i = y4i - y6r | 
|  | a(8) = x0r + x2r | 
|  | a(9) = x0i + x2i | 
|  | a(10) = x0r - x2r | 
|  | a(11) = x0i - x2i | 
|  | a(12) = x1r - x3i | 
|  | a(13) = x1i + x3r | 
|  | a(14) = x1r + x3i | 
|  | a(15) = x1i - x3r | 
|  | x0r = y0r + y2r | 
|  | x0i = y0i + y2i | 
|  | x1r = y0r - y2r | 
|  | x1i = y0i - y2i | 
|  | x2r = y1r + y3r | 
|  | x2i = y1i + y3i | 
|  | x3r = y1r - y3r | 
|  | x3i = y1i - y3i | 
|  | a(0) = x0r + x2r | 
|  | a(1) = x0i + x2i | 
|  | a(2) = x0r - x2r | 
|  | a(3) = x0i - x2i | 
|  | a(4) = x1r - x3i | 
|  | a(5) = x1i + x3r | 
|  | a(6) = x1r + x3i | 
|  | a(7) = x1i - x3r | 
|  | end | 
|  | ! | 
|  | subroutine cftf162(a, w) | 
|  | real*8 a(0 : 31), w(0 : *) | 
|  | real*8 wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i | 
|  | real*8 x0r, x0i, x1r, x1i, x2r, x2i | 
|  | real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i | 
|  | real*8 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i | 
|  | real*8 y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i | 
|  | real*8 y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i | 
|  | wn4r = w(1) | 
|  | wk1r = w(4) | 
|  | wk1i = w(5) | 
|  | wk3r = w(6) | 
|  | wk3i = -w(7) | 
|  | wk2r = w(8) | 
|  | wk2i = w(9) | 
|  | x1r = a(0) - a(17) | 
|  | x1i = a(1) + a(16) | 
|  | x0r = a(8) - a(25) | 
|  | x0i = a(9) + a(24) | 
|  | x2r = wn4r * (x0r - x0i) | 
|  | x2i = wn4r * (x0i + x0r) | 
|  | y0r = x1r + x2r | 
|  | y0i = x1i + x2i | 
|  | y4r = x1r - x2r | 
|  | y4i = x1i - x2i | 
|  | x1r = a(0) + a(17) | 
|  | x1i = a(1) - a(16) | 
|  | x0r = a(8) + a(25) | 
|  | x0i = a(9) - a(24) | 
|  | x2r = wn4r * (x0r - x0i) | 
|  | x2i = wn4r * (x0i + x0r) | 
|  | y8r = x1r - x2i | 
|  | y8i = x1i + x2r | 
|  | y12r = x1r + x2i | 
|  | y12i = x1i - x2r | 
|  | x0r = a(2) - a(19) | 
|  | x0i = a(3) + a(18) | 
|  | x1r = wk1r * x0r - wk1i * x0i | 
|  | x1i = wk1r * x0i + wk1i * x0r | 
|  | x0r = a(10) - a(27) | 
|  | x0i = a(11) + a(26) | 
|  | x2r = wk3i * x0r - wk3r * x0i | 
|  | x2i = wk3i * x0i + wk3r * x0r | 
|  | y1r = x1r + x2r | 
|  | y1i = x1i + x2i | 
|  | y5r = x1r - x2r | 
|  | y5i = x1i - x2i | 
|  | x0r = a(2) + a(19) | 
|  | x0i = a(3) - a(18) | 
|  | x1r = wk3r * x0r - wk3i * x0i | 
|  | x1i = wk3r * x0i + wk3i * x0r | 
|  | x0r = a(10) + a(27) | 
|  | x0i = a(11) - a(26) | 
|  | x2r = wk1r * x0r + wk1i * x0i | 
|  | x2i = wk1r * x0i - wk1i * x0r | 
|  | y9r = x1r - x2r | 
|  | y9i = x1i - x2i | 
|  | y13r = x1r + x2r | 
|  | y13i = x1i + x2i | 
|  | x0r = a(4) - a(21) | 
|  | x0i = a(5) + a(20) | 
|  | x1r = wk2r * x0r - wk2i * x0i | 
|  | x1i = wk2r * x0i + wk2i * x0r | 
|  | x0r = a(12) - a(29) | 
|  | x0i = a(13) + a(28) | 
|  | x2r = wk2i * x0r - wk2r * x0i | 
|  | x2i = wk2i * x0i + wk2r * x0r | 
|  | y2r = x1r + x2r | 
|  | y2i = x1i + x2i | 
|  | y6r = x1r - x2r | 
|  | y6i = x1i - x2i | 
|  | x0r = a(4) + a(21) | 
|  | x0i = a(5) - a(20) | 
|  | x1r = wk2i * x0r - wk2r * x0i | 
|  | x1i = wk2i * x0i + wk2r * x0r | 
|  | x0r = a(12) + a(29) | 
|  | x0i = a(13) - a(28) | 
|  | x2r = wk2r * x0r - wk2i * x0i | 
|  | x2i = wk2r * x0i + wk2i * x0r | 
|  | y10r = x1r - x2r | 
|  | y10i = x1i - x2i | 
|  | y14r = x1r + x2r | 
|  | y14i = x1i + x2i | 
|  | x0r = a(6) - a(23) | 
|  | x0i = a(7) + a(22) | 
|  | x1r = wk3r * x0r - wk3i * x0i | 
|  | x1i = wk3r * x0i + wk3i * x0r | 
|  | x0r = a(14) - a(31) | 
|  | x0i = a(15) + a(30) | 
|  | x2r = wk1i * x0r - wk1r * x0i | 
|  | x2i = wk1i * x0i + wk1r * x0r | 
|  | y3r = x1r + x2r | 
|  | y3i = x1i + x2i | 
|  | y7r = x1r - x2r | 
|  | y7i = x1i - x2i | 
|  | x0r = a(6) + a(23) | 
|  | x0i = a(7) - a(22) | 
|  | x1r = wk1i * x0r + wk1r * x0i | 
|  | x1i = wk1i * x0i - wk1r * x0r | 
|  | x0r = a(14) + a(31) | 
|  | x0i = a(15) - a(30) | 
|  | x2r = wk3i * x0r - wk3r * x0i | 
|  | x2i = wk3i * x0i + wk3r * x0r | 
|  | y11r = x1r + x2r | 
|  | y11i = x1i + x2i | 
|  | y15r = x1r - x2r | 
|  | y15i = x1i - x2i | 
|  | x1r = y0r + y2r | 
|  | x1i = y0i + y2i | 
|  | x2r = y1r + y3r | 
|  | x2i = y1i + y3i | 
|  | a(0) = x1r + x2r | 
|  | a(1) = x1i + x2i | 
|  | a(2) = x1r - x2r | 
|  | a(3) = x1i - x2i | 
|  | x1r = y0r - y2r | 
|  | x1i = y0i - y2i | 
|  | x2r = y1r - y3r | 
|  | x2i = y1i - y3i | 
|  | a(4) = x1r - x2i | 
|  | a(5) = x1i + x2r | 
|  | a(6) = x1r + x2i | 
|  | a(7) = x1i - x2r | 
|  | x1r = y4r - y6i | 
|  | x1i = y4i + y6r | 
|  | x0r = y5r - y7i | 
|  | x0i = y5i + y7r | 
|  | x2r = wn4r * (x0r - x0i) | 
|  | x2i = wn4r * (x0i + x0r) | 
|  | a(8) = x1r + x2r | 
|  | a(9) = x1i + x2i | 
|  | a(10) = x1r - x2r | 
|  | a(11) = x1i - x2i | 
|  | x1r = y4r + y6i | 
|  | x1i = y4i - y6r | 
|  | x0r = y5r + y7i | 
|  | x0i = y5i - y7r | 
|  | x2r = wn4r * (x0r - x0i) | 
|  | x2i = wn4r * (x0i + x0r) | 
|  | a(12) = x1r - x2i | 
|  | a(13) = x1i + x2r | 
|  | a(14) = x1r + x2i | 
|  | a(15) = x1i - x2r | 
|  | x1r = y8r + y10r | 
|  | x1i = y8i + y10i | 
|  | x2r = y9r - y11r | 
|  | x2i = y9i - y11i | 
|  | a(16) = x1r + x2r | 
|  | a(17) = x1i + x2i | 
|  | a(18) = x1r - x2r | 
|  | a(19) = x1i - x2i | 
|  | x1r = y8r - y10r | 
|  | x1i = y8i - y10i | 
|  | x2r = y9r + y11r | 
|  | x2i = y9i + y11i | 
|  | a(20) = x1r - x2i | 
|  | a(21) = x1i + x2r | 
|  | a(22) = x1r + x2i | 
|  | a(23) = x1i - x2r | 
|  | x1r = y12r - y14i | 
|  | x1i = y12i + y14r | 
|  | x0r = y13r + y15i | 
|  | x0i = y13i - y15r | 
|  | x2r = wn4r * (x0r - x0i) | 
|  | x2i = wn4r * (x0i + x0r) | 
|  | a(24) = x1r + x2r | 
|  | a(25) = x1i + x2i | 
|  | a(26) = x1r - x2r | 
|  | a(27) = x1i - x2i | 
|  | x1r = y12r + y14i | 
|  | x1i = y12i - y14r | 
|  | x0r = y13r - y15i | 
|  | x0i = y13i + y15r | 
|  | x2r = wn4r * (x0r - x0i) | 
|  | x2i = wn4r * (x0i + x0r) | 
|  | a(28) = x1r - x2i | 
|  | a(29) = x1i + x2r | 
|  | a(30) = x1r + x2i | 
|  | a(31) = x1i - x2r | 
|  | end | 
|  | ! | 
|  | subroutine cftf081(a, w) | 
|  | real*8 a(0 : 15), w(0 : *) | 
|  | real*8 wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i | 
|  | real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i | 
|  | real*8 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i | 
|  | wn4r = w(1) | 
|  | x0r = a(0) + a(8) | 
|  | x0i = a(1) + a(9) | 
|  | x1r = a(0) - a(8) | 
|  | x1i = a(1) - a(9) | 
|  | x2r = a(4) + a(12) | 
|  | x2i = a(5) + a(13) | 
|  | x3r = a(4) - a(12) | 
|  | x3i = a(5) - a(13) | 
|  | y0r = x0r + x2r | 
|  | y0i = x0i + x2i | 
|  | y2r = x0r - x2r | 
|  | y2i = x0i - x2i | 
|  | y1r = x1r - x3i | 
|  | y1i = x1i + x3r | 
|  | y3r = x1r + x3i | 
|  | y3i = x1i - x3r | 
|  | x0r = a(2) + a(10) | 
|  | x0i = a(3) + a(11) | 
|  | x1r = a(2) - a(10) | 
|  | x1i = a(3) - a(11) | 
|  | x2r = a(6) + a(14) | 
|  | x2i = a(7) + a(15) | 
|  | x3r = a(6) - a(14) | 
|  | x3i = a(7) - a(15) | 
|  | y4r = x0r + x2r | 
|  | y4i = x0i + x2i | 
|  | y6r = x0r - x2r | 
|  | y6i = x0i - x2i | 
|  | x0r = x1r - x3i | 
|  | x0i = x1i + x3r | 
|  | x2r = x1r + x3i | 
|  | x2i = x1i - x3r | 
|  | y5r = wn4r * (x0r - x0i) | 
|  | y5i = wn4r * (x0r + x0i) | 
|  | y7r = wn4r * (x2r - x2i) | 
|  | y7i = wn4r * (x2r + x2i) | 
|  | a(8) = y1r + y5r | 
|  | a(9) = y1i + y5i | 
|  | a(10) = y1r - y5r | 
|  | a(11) = y1i - y5i | 
|  | a(12) = y3r - y7i | 
|  | a(13) = y3i + y7r | 
|  | a(14) = y3r + y7i | 
|  | a(15) = y3i - y7r | 
|  | a(0) = y0r + y4r | 
|  | a(1) = y0i + y4i | 
|  | a(2) = y0r - y4r | 
|  | a(3) = y0i - y4i | 
|  | a(4) = y2r - y6i | 
|  | a(5) = y2i + y6r | 
|  | a(6) = y2r + y6i | 
|  | a(7) = y2i - y6r | 
|  | end | 
|  | ! | 
|  | subroutine cftf082(a, w) | 
|  | real*8 a(0 : 15), w(0 : *) | 
|  | real*8 wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i | 
|  | real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i | 
|  | real*8 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i | 
|  | wn4r = w(1) | 
|  | wk1r = w(2) | 
|  | wk1i = w(3) | 
|  | y0r = a(0) - a(9) | 
|  | y0i = a(1) + a(8) | 
|  | y1r = a(0) + a(9) | 
|  | y1i = a(1) - a(8) | 
|  | x0r = a(4) - a(13) | 
|  | x0i = a(5) + a(12) | 
|  | y2r = wn4r * (x0r - x0i) | 
|  | y2i = wn4r * (x0i + x0r) | 
|  | x0r = a(4) + a(13) | 
|  | x0i = a(5) - a(12) | 
|  | y3r = wn4r * (x0r - x0i) | 
|  | y3i = wn4r * (x0i + x0r) | 
|  | x0r = a(2) - a(11) | 
|  | x0i = a(3) + a(10) | 
|  | y4r = wk1r * x0r - wk1i * x0i | 
|  | y4i = wk1r * x0i + wk1i * x0r | 
|  | x0r = a(2) + a(11) | 
|  | x0i = a(3) - a(10) | 
|  | y5r = wk1i * x0r - wk1r * x0i | 
|  | y5i = wk1i * x0i + wk1r * x0r | 
|  | x0r = a(6) - a(15) | 
|  | x0i = a(7) + a(14) | 
|  | y6r = wk1i * x0r - wk1r * x0i | 
|  | y6i = wk1i * x0i + wk1r * x0r | 
|  | x0r = a(6) + a(15) | 
|  | x0i = a(7) - a(14) | 
|  | y7r = wk1r * x0r - wk1i * x0i | 
|  | y7i = wk1r * x0i + wk1i * x0r | 
|  | x0r = y0r + y2r | 
|  | x0i = y0i + y2i | 
|  | x1r = y4r + y6r | 
|  | x1i = y4i + y6i | 
|  | a(0) = x0r + x1r | 
|  | a(1) = x0i + x1i | 
|  | a(2) = x0r - x1r | 
|  | a(3) = x0i - x1i | 
|  | x0r = y0r - y2r | 
|  | x0i = y0i - y2i | 
|  | x1r = y4r - y6r | 
|  | x1i = y4i - y6i | 
|  | a(4) = x0r - x1i | 
|  | a(5) = x0i + x1r | 
|  | a(6) = x0r + x1i | 
|  | a(7) = x0i - x1r | 
|  | x0r = y1r - y3i | 
|  | x0i = y1i + y3r | 
|  | x1r = y5r - y7r | 
|  | x1i = y5i - y7i | 
|  | a(8) = x0r + x1r | 
|  | a(9) = x0i + x1i | 
|  | a(10) = x0r - x1r | 
|  | a(11) = x0i - x1i | 
|  | x0r = y1r + y3i | 
|  | x0i = y1i - y3r | 
|  | x1r = y5r + y7r | 
|  | x1i = y5i + y7i | 
|  | a(12) = x0r - x1i | 
|  | a(13) = x0i + x1r | 
|  | a(14) = x0r + x1i | 
|  | a(15) = x0i - x1r | 
|  | end | 
|  | ! | 
|  | subroutine cftf040(a) | 
|  | real*8 a(0 : 7), x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i | 
|  | x0r = a(0) + a(4) | 
|  | x0i = a(1) + a(5) | 
|  | x1r = a(0) - a(4) | 
|  | x1i = a(1) - a(5) | 
|  | x2r = a(2) + a(6) | 
|  | x2i = a(3) + a(7) | 
|  | x3r = a(2) - a(6) | 
|  | x3i = a(3) - a(7) | 
|  | a(0) = x0r + x2r | 
|  | a(1) = x0i + x2i | 
|  | a(2) = x1r - x3i | 
|  | a(3) = x1i + x3r | 
|  | a(4) = x0r - x2r | 
|  | a(5) = x0i - x2i | 
|  | a(6) = x1r + x3i | 
|  | a(7) = x1i - x3r | 
|  | end | 
|  | ! | 
|  | subroutine cftb040(a) | 
|  | real*8 a(0 : 7), x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i | 
|  | x0r = a(0) + a(4) | 
|  | x0i = a(1) + a(5) | 
|  | x1r = a(0) - a(4) | 
|  | x1i = a(1) - a(5) | 
|  | x2r = a(2) + a(6) | 
|  | x2i = a(3) + a(7) | 
|  | x3r = a(2) - a(6) | 
|  | x3i = a(3) - a(7) | 
|  | a(0) = x0r + x2r | 
|  | a(1) = x0i + x2i | 
|  | a(2) = x1r + x3i | 
|  | a(3) = x1i - x3r | 
|  | a(4) = x0r - x2r | 
|  | a(5) = x0i - x2i | 
|  | a(6) = x1r - x3i | 
|  | a(7) = x1i + x3r | 
|  | end | 
|  | ! | 
|  | subroutine cftx020(a) | 
|  | real*8 a(0 : 3), x0r, x0i | 
|  | x0r = a(0) - a(2) | 
|  | x0i = a(1) - a(3) | 
|  | a(0) = a(0) + a(2) | 
|  | a(1) = a(1) + a(3) | 
|  | a(2) = x0r | 
|  | a(3) = x0i | 
|  | end | 
|  | ! | 
|  | subroutine rftfsub(n, a, nc, c) | 
|  | integer n, nc, j, k, kk, ks, m | 
|  | real*8 a(0 : n - 1), c(0 : nc - 1), wkr, wki, xr, xi, yr, yi | 
|  | m = n / 2 | 
|  | ks = 2 * nc / m | 
|  | kk = 0 | 
|  | do j = 2, m - 2, 2 | 
|  | k = n - j | 
|  | kk = kk + ks | 
|  | wkr = 0.5d0 - c(nc - kk) | 
|  | wki = c(kk) | 
|  | xr = a(j) - a(k) | 
|  | xi = a(j + 1) + a(k + 1) | 
|  | yr = wkr * xr - wki * xi | 
|  | yi = wkr * xi + wki * xr | 
|  | a(j) = a(j) - yr | 
|  | a(j + 1) = a(j + 1) - yi | 
|  | a(k) = a(k) + yr | 
|  | a(k + 1) = a(k + 1) - yi | 
|  | end do | 
|  | end | 
|  | ! | 
|  | subroutine rftbsub(n, a, nc, c) | 
|  | integer n, nc, j, k, kk, ks, m | 
|  | real*8 a(0 : n - 1), c(0 : nc - 1), wkr, wki, xr, xi, yr, yi | 
|  | m = n / 2 | 
|  | ks = 2 * nc / m | 
|  | kk = 0 | 
|  | do j = 2, m - 2, 2 | 
|  | k = n - j | 
|  | kk = kk + ks | 
|  | wkr = 0.5d0 - c(nc - kk) | 
|  | wki = c(kk) | 
|  | xr = a(j) - a(k) | 
|  | xi = a(j + 1) + a(k + 1) | 
|  | yr = wkr * xr + wki * xi | 
|  | yi = wkr * xi - wki * xr | 
|  | a(j) = a(j) - yr | 
|  | a(j + 1) = a(j + 1) - yi | 
|  | a(k) = a(k) + yr | 
|  | a(k + 1) = a(k + 1) - yi | 
|  | end do | 
|  | end | 
|  | ! | 
|  | subroutine dctsub(n, a, nc, c) | 
|  | integer n, nc, j, k, kk, ks, m | 
|  | real*8 a(0 : n - 1), c(0 : nc - 1), wkr, wki, xr | 
|  | m = n / 2 | 
|  | ks = nc / n | 
|  | kk = 0 | 
|  | do j = 1, m - 1 | 
|  | k = n - j | 
|  | kk = kk + ks | 
|  | wkr = c(kk) - c(nc - kk) | 
|  | wki = c(kk) + c(nc - kk) | 
|  | xr = wki * a(j) - wkr * a(k) | 
|  | a(j) = wkr * a(j) + wki * a(k) | 
|  | a(k) = xr | 
|  | end do | 
|  | a(m) = c(0) * a(m) | 
|  | end | 
|  | ! | 
|  | subroutine dstsub(n, a, nc, c) | 
|  | integer n, nc, j, k, kk, ks, m | 
|  | real*8 a(0 : n - 1), c(0 : nc - 1), wkr, wki, xr | 
|  | m = n / 2 | 
|  | ks = nc / n | 
|  | kk = 0 | 
|  | do j = 1, m - 1 | 
|  | k = n - j | 
|  | kk = kk + ks | 
|  | wkr = c(kk) - c(nc - kk) | 
|  | wki = c(kk) + c(nc - kk) | 
|  | xr = wki * a(k) - wkr * a(j) | 
|  | a(k) = wkr * a(k) + wki * a(j) | 
|  | a(j) = xr | 
|  | end do | 
|  | a(m) = c(0) * a(m) | 
|  | end | 
|  | ! |