updated top-level README and version_decl for V4.4.2 (#1795)
[WRF.git] / external / fftpack / fftpack5 / mcsqf1.F
blobeb7c54805a895cdbd2b9780caea5090887d00b42
1 subroutine mcsqf1 ( lot, jump, n, inc, x, wsave, work, ier )
3 !*****************************************************************************80
5 !! MCSQF1 is an FFTPACK5 auxiliary routine.
8 !    Copyright (C) 1995-2004, Scientific Computing Division,
9 !    University Corporation for Atmospheric Research
11 !  Modified:
13 !    27 March 2009
15 !  Author:
17 !    Paul Swarztrauber
18 !    Richard Valent
20 !  Reference:
22 !    Paul Swarztrauber,
23 !    Vectorizing the Fast Fourier Transforms,
24 !    in Parallel Computations,
25 !    edited by G. Rodrigue,
26 !    Academic Press, 1982.
28 !    Paul Swarztrauber,
29 !    Fast Fourier Transform Algorithms for Vector Computers,
30 !    Parallel Computing, pages 45-63, 1984.
32 !  Parameters:
34   implicit none
36   integer ( kind = 4 ) inc
37   integer ( kind = 4 ) lot
39   integer ( kind = 4 ) i
40   integer ( kind = 4 ) ier
41   integer ( kind = 4 ) ier1
42   integer ( kind = 4 ) jump
43   integer ( kind = 4 ) k
44   integer ( kind = 4 ) kc
45   integer ( kind = 4 ) lenx
46   integer ( kind = 4 ) lnsv
47   integer ( kind = 4 ) lnwk
48   integer ( kind = 4 ) lj
49   integer ( kind = 4 ) m
50   integer ( kind = 4 ) m1
51   integer ( kind = 4 ) modn
52   integer ( kind = 4 ) n
53   integer ( kind = 4 ) np2
54   integer ( kind = 4 ) ns2
55   real ( kind = 4 ) work(lot,*)
56   real ( kind = 4 ) wsave(*)
57   real ( kind = 4 ) x(inc,*)
58   real ( kind = 4 ) xim1
60   ier = 0
61   lj = ( lot - 1 ) * jump + 1
62   ns2 = ( n + 1 ) / 2
63   np2 = n + 2
65   do k = 2, ns2
66     kc = np2 - k
67     m1 = 0
68     do m = 1, lj, jump
69       m1 = m1 + 1
70       work(m1,k)  = x(m,k) + x(m,kc)
71       work(m1,kc) = x(m,k) - x(m,kc)
72     end do
73   end do
75   modn = mod ( n, 2 )
77   if ( modn == 0 ) then
78     m1 = 0
79     do m = 1, lj, jump
80       m1 = m1 + 1
81       work(m1,ns2+1) = x(m,ns2+1) + x(m,ns2+1)
82     end do
83   end if
85   do k = 2, ns2
86     kc = np2 - k
87     m1 = 0
88     do m = 1, lj, jump
89       m1 = m1 + 1
90       x(m,k)  = wsave(k-1) * work(m1,kc) + wsave(kc-1) * work(m1,k)
91       x(m,kc) = wsave(k-1) * work(m1,k)  - wsave(kc-1) * work(m1,kc)
92     end do
93   end do
95   if ( modn == 0 ) then
96     m1 = 0
97     do m = 1, lj, jump
98       m1 = m1 + 1
99       x(m,ns2+1) = wsave(ns2) * work(m1,ns2+1)
100     end do
101   end if
103   lenx = ( lot - 1 ) * jump + inc * ( n - 1 ) + 1
104   lnsv = n + int ( log ( real ( n, kind = 4 ) ) ) + 4
105   lnwk = lot * n
107   call rfftmf ( lot, jump, n, inc, x, lenx, wsave(n+1), lnsv, work, lnwk, ier1 )
109   if ( ier1 /= 0 ) then
110     ier = 20
111     call xerfft ( 'mcsqf1', -5 )
112     return
113   end if
115   do i = 3, n, 2
116     do m = 1, lj, jump
117       xim1 = 0.5E+00 * ( x(m,i-1) + x(m,i) )
118       x(m,i) = 0.5E+00 * ( x(m,i-1) - x(m,i) )
119       x(m,i-1) = xim1
120     end do
121   end do
123   return