updated top-level README and version_decl for V4.4.2 (#1795)
[WRF.git] / external / fftpack / fftpack5 / msntf1.F
blob18407a504116d8231c3aea1e548aaa743aa20b17
1 subroutine msntf1 ( lot, jump, n, inc, x, wsave, dsum, xh, work, ier )
3 !*****************************************************************************80
5 !! MSNTF1 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   real ( kind = 8 ) dsum(*)
40   integer ( kind = 4 ) i
41   integer ( kind = 4 ) ier
42   integer ( kind = 4 ) ier1
43   integer ( kind = 4 ) jump
44   integer ( kind = 4 ) k
45   integer ( kind = 4 ) kc
46   integer ( kind = 4 ) lj
47   integer ( kind = 4 ) lnsv
48   integer ( kind = 4 ) lnwk
49   integer ( kind = 4 ) lnxh
50   integer ( kind = 4 ) m
51   integer ( kind = 4 ) m1
52   integer ( kind = 4 ) modn
53   integer ( kind = 4 ) n
54   integer ( kind = 4 ) np1
55   integer ( kind = 4 ) ns2
56   real ( kind = 4 ) sfnp1
57   real ( kind = 4 ) ssqrt3
58   real ( kind = 4 ) t1
59   real ( kind = 4 ) t2
60   real ( kind = 4 ) work(*)
61   real ( kind = 4 ) wsave(*)
62   real ( kind = 4 ) x(inc,*)
63   real ( kind = 4 ) xh(lot,*)
64   real ( kind = 4 ) xhold
66   ier = 0
67   lj = ( lot - 1 ) * jump + 1
69   if ( n < 2 ) then
70     return
71   end if
73   if ( n == 2 ) then
74     ssqrt3 = 1.0E+00 / sqrt ( 3.0E+00 )
75     do m = 1, lj, jump
76       xhold =  ssqrt3 * ( x(m,1) + x(m,2) )
77       x(m,2) = ssqrt3 * ( x(m,1) - x(m,2) )
78       x(m,1) = xhold
79     end do
80   end if
82   np1 = n + 1
83   ns2 = n / 2
85   do k = 1, ns2
86     kc = np1 - k
87     m1 = 0
88     do m = 1, lj, jump
89       m1 = m1 + 1
90       t1 = x(m,k) - x(m,kc)
91       t2 = wsave(k) * ( x(m,k) + x(m,kc) )
92       xh(m1,k+1) = t1 + t2
93       xh(m1,kc+1) = t2 - t1
94     end do
95   end do
97   modn = mod ( n, 2 )
99   if ( modn /= 0 ) then
100     m1 = 0
101     do m = 1, lj, jump
102       m1 = m1 + 1
103       xh(m1,ns2+2) = 4.0E+00 * x(m,ns2+1)
104     end do
105   end if
107   do m = 1, lot
108     xh(m,1) = 0.0E+00
109   end do
111   lnxh = lot - 1 + lot * ( np1 - 1 ) + 1
112   lnsv = np1 + int ( log ( real ( np1, kind = 4 ) ) ) + 4
113   lnwk = lot * np1
115   call rfftmf ( lot, 1, np1, lot, xh, lnxh, wsave(ns2+1), lnsv, work, &
116     lnwk, ier1 )
118   if ( ier1 /= 0 ) then
119     ier = 20
120     call xerfft ( 'msntf1', -5 )
121     return
122   end if
124   if ( mod ( np1, 2 ) == 0 ) then
125     do m = 1, lot
126       xh(m,np1) = xh(m,np1) + xh(m,np1)
127     end do
128   end if
130   sfnp1 = 1.0E+00 / real ( np1, kind = 4 )
131   m1 = 0
132   do m = 1, lj, jump
133     m1 = m1 + 1
134     x(m,1) = 0.5E+00 * xh(m1,1)
135     dsum(m1) = x(m,1)
136   end do
138   do i = 3, n, 2
139     m1 = 0
140     do m = 1, lj, jump
141       m1 = m1 + 1
142       x(m,i-1) = 0.5E+00 * xh(m1,i)
143       dsum(m1) = dsum(m1) + 0.5E+00 * xh(m1,i-1)
144       x(m,i) = dsum(m1)
145     end do
146   end do
148   if ( modn /= 0 ) then
149     return
150   end if
152   m1 = 0
153   do m = 1, lj, jump
154     m1 = m1 + 1
155     x(m,n) = 0.5E+00 * xh(m1,n+1)
156   end do
158   return