updated top-level README and version_decl for V4.5 (#1847)
[WRF.git] / external / fftpack / fftpack5 / sintf1.F
blobfde91c5bc1987772c74f72abe6d1a91774bb084b
1 subroutine sintf1 ( n, inc, x, wsave, xh, work, ier )
3 !*****************************************************************************80
5 !! SINTF1 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
38   real ( kind = 8 ) dsum
39   integer ( kind = 4 ) i
40   integer ( kind = 4 ) ier
41   integer ( kind = 4 ) ier1
42   integer ( kind = 4 ) k
43   integer ( kind = 4 ) kc
44   integer ( kind = 4 ) lnsv
45   integer ( kind = 4 ) lnwk
46   integer ( kind = 4 ) lnxh
47   integer ( kind = 4 ) modn
48   integer ( kind = 4 ) n
49   integer ( kind = 4 ) np1
50   integer ( kind = 4 ) ns2
51   real ( kind = 4 ) sfnp1
52   real ( kind = 4 ) ssqrt3
53   real ( kind = 4 ) t1
54   real ( kind = 4 ) t2
55   real ( kind = 4 ) work(*)
56   real ( kind = 4 ) wsave(*)
57   real ( kind = 4 ) x(inc,*)
58   real ( kind = 4 ) xh(*)
59   real ( kind = 4 ) xhold
61   ier = 0
63   if ( n < 2 ) then
64     return
65   end if
67   if ( n == 2 ) then
68     ssqrt3 = 1.0E+00 / sqrt ( 3.0E+00 )
69     xhold = ssqrt3 * ( x(1,1) + x(1,2) )
70     x(1,2) = ssqrt3 * ( x(1,1) - x(1,2) )
71     x(1,1) = xhold
72     return
73   end if
75   np1 = n + 1
76   ns2 = n / 2
78   do k = 1, ns2
79     kc = np1 - k
80     t1 = x(1,k) - x(1,kc)
81     t2 = wsave(k) * ( x(1,k) + x(1,kc) )
82     xh(k+1) = t1 + t2
83     xh(kc+1) = t2 - t1
84   end do
86   modn = mod ( n, 2 )
88   if ( modn /= 0 ) then
89     xh(ns2+2) = 4.0E+00 * x(1,ns2+1)
90   end if
92   xh(1) = 0.0E+00
93   lnxh = np1
94   lnsv = np1 + int ( log ( real ( np1, kind = 4 ) ) ) + 4
95   lnwk = np1
97   call rfft1f ( np1, 1, xh, lnxh, wsave(ns2+1), lnsv, work, lnwk, ier1 )
99   if ( ier1 /= 0 ) then
100     ier = 20
101     call xerfft ( 'sintf1', -5 )
102     return
103   end if
105   if ( mod ( np1, 2 ) == 0 ) then
106     xh(np1) = xh(np1) + xh(np1)
107   end if
109   sfnp1 = 1.0E+00 / real ( np1, kind = 4 )
110   x(1,1) = 0.5E+00 * xh(1)
111   dsum = x(1,1)
113   do i = 3, n, 2
114     x(1,i-1) = 0.5E+00 * xh(i)
115     dsum = dsum + 0.5E+00 * xh(i-1)
116     x(1,i) = dsum
117   end do
119   if ( modn == 0 ) then
120     x(1,n) = 0.5E+00 * xh(n+1)
121   end if
123   return