Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / external / fftpack / fftpack5 / z1f5kb.F
blob464584c4c5035b7b7c5621ac1541b89c515e1041
1 subroutine z1f5kb ( ido, l1, na, cc, in1, ch, in2, wa )
3 !*****************************************************************************80
5 !! Z1F5KB is an FFTPACK5 auxiliary routine.
9 !  Modified:
11 !    26 Ausust 2009
13 !  Author:
15 !    Original complex single precision by Paul Swarztrauber, Richard Valent.
16 !    Complex double precision version by John Burkardt.
18 !  Reference:
20 !    Paul Swarztrauber,
21 !    Vectorizing the Fast Fourier Transforms,
22 !    in Parallel Computations,
23 !    edited by G. Rodrigue,
24 !    Academic Press, 1982.
26 !    Paul Swarztrauber,
27 !    Fast Fourier Transform Algorithms for Vector Computers,
28 !    Parallel Computing, pages 45-63, 1984.
30 !  Parameters:
32   implicit none
34   integer ( kind = 4 ) ido
35   integer ( kind = 4 ) in1
36   integer ( kind = 4 ) in2
37   integer ( kind = 4 ) l1
39   real ( kind = 8 ) cc(in1,l1,ido,5)
40   real ( kind = 8 ) ch(in2,l1,5,ido)
41   real ( kind = 8 ) chold1
42   real ( kind = 8 ) chold2
43   real ( kind = 8 ) ci2
44   real ( kind = 8 ) ci3
45   real ( kind = 8 ) ci4
46   real ( kind = 8 ) ci5
47   real ( kind = 8 ) cr2
48   real ( kind = 8 ) cr3
49   real ( kind = 8 ) cr4
50   real ( kind = 8 ) cr5
51   real ( kind = 8 ) di2
52   real ( kind = 8 ) di3
53   real ( kind = 8 ) di4
54   real ( kind = 8 ) di5
55   real ( kind = 8 ) dr2
56   real ( kind = 8 ) dr3
57   real ( kind = 8 ) dr4
58   real ( kind = 8 ) dr5
59   integer ( kind = 4 ) i
60   integer ( kind = 4 ) k
61   integer ( kind = 4 ) na
62   real ( kind = 8 ) ti2
63   real ( kind = 8 ) ti3
64   real ( kind = 8 ) ti4
65   real ( kind = 8 ) ti5
66   real ( kind = 8 ), parameter :: ti11 =  0.9510565162951536D+00
67   real ( kind = 8 ), parameter :: ti12 =  0.5877852522924731D+00
68   real ( kind = 8 ) tr2
69   real ( kind = 8 ) tr3
70   real ( kind = 8 ) tr4
71   real ( kind = 8 ) tr5
72   real ( kind = 8 ), parameter :: tr11 =  0.3090169943749474D+00
73   real ( kind = 8 ), parameter :: tr12 = -0.8090169943749474D+00
74   real ( kind = 8 ) wa(ido,4,2)
76   if ( 1 < ido .or. na == 1 ) then
78     do k = 1, l1
79       ti5 = cc(2,k,1,2)-cc(2,k,1,5)
80       ti2 = cc(2,k,1,2)+cc(2,k,1,5)
81       ti4 = cc(2,k,1,3)-cc(2,k,1,4)
82       ti3 = cc(2,k,1,3)+cc(2,k,1,4)
83       tr5 = cc(1,k,1,2)-cc(1,k,1,5)
84       tr2 = cc(1,k,1,2)+cc(1,k,1,5)
85       tr4 = cc(1,k,1,3)-cc(1,k,1,4)
86       tr3 = cc(1,k,1,3)+cc(1,k,1,4)
87       ch(1,k,1,1) = cc(1,k,1,1)+tr2+tr3
88       ch(2,k,1,1) = cc(2,k,1,1)+ti2+ti3
89       cr2 = cc(1,k,1,1)+tr11*tr2+tr12*tr3
90       ci2 = cc(2,k,1,1)+tr11*ti2+tr12*ti3
91       cr3 = cc(1,k,1,1)+tr12*tr2+tr11*tr3
92       ci3 = cc(2,k,1,1)+tr12*ti2+tr11*ti3
93       cr5 = ti11*tr5+ti12*tr4
94       ci5 = ti11*ti5+ti12*ti4
95       cr4 = ti12*tr5-ti11*tr4
96       ci4 = ti12*ti5-ti11*ti4
97       ch(1,k,2,1) = cr2-ci5
98       ch(1,k,5,1) = cr2+ci5
99       ch(2,k,2,1) = ci2+cr5
100       ch(2,k,3,1) = ci3+cr4
101       ch(1,k,3,1) = cr3-ci4
102       ch(1,k,4,1) = cr3+ci4
103       ch(2,k,4,1) = ci3-cr4
104       ch(2,k,5,1) = ci2-cr5
105     end do
107     do i = 2, ido
108       do k = 1, l1
109         ti5 = cc(2,k,i,2)-cc(2,k,i,5)
110         ti2 = cc(2,k,i,2)+cc(2,k,i,5)
111         ti4 = cc(2,k,i,3)-cc(2,k,i,4)
112         ti3 = cc(2,k,i,3)+cc(2,k,i,4)
113         tr5 = cc(1,k,i,2)-cc(1,k,i,5)
114         tr2 = cc(1,k,i,2)+cc(1,k,i,5)
115         tr4 = cc(1,k,i,3)-cc(1,k,i,4)
116         tr3 = cc(1,k,i,3)+cc(1,k,i,4)
117         ch(1,k,1,i) = cc(1,k,i,1)+tr2+tr3
118         ch(2,k,1,i) = cc(2,k,i,1)+ti2+ti3
119         cr2 = cc(1,k,i,1)+tr11*tr2+tr12*tr3
120         ci2 = cc(2,k,i,1)+tr11*ti2+tr12*ti3
121         cr3 = cc(1,k,i,1)+tr12*tr2+tr11*tr3
122         ci3 = cc(2,k,i,1)+tr12*ti2+tr11*ti3
123         cr5 = ti11*tr5+ti12*tr4
124         ci5 = ti11*ti5+ti12*ti4
125         cr4 = ti12*tr5-ti11*tr4
126         ci4 = ti12*ti5-ti11*ti4
127         dr3 = cr3-ci4
128         dr4 = cr3+ci4
129         di3 = ci3+cr4
130         di4 = ci3-cr4
131         dr5 = cr2+ci5
132         dr2 = cr2-ci5
133         di5 = ci2-cr5
134         di2 = ci2+cr5
135         ch(1,k,2,i) = wa(i,1,1)*dr2-wa(i,1,2)*di2
136         ch(2,k,2,i) = wa(i,1,1)*di2+wa(i,1,2)*dr2
137         ch(1,k,3,i) = wa(i,2,1)*dr3-wa(i,2,2)*di3
138         ch(2,k,3,i) = wa(i,2,1)*di3+wa(i,2,2)*dr3
139         ch(1,k,4,i) = wa(i,3,1)*dr4-wa(i,3,2)*di4
140         ch(2,k,4,i) = wa(i,3,1)*di4+wa(i,3,2)*dr4
141         ch(1,k,5,i) = wa(i,4,1)*dr5-wa(i,4,2)*di5
142         ch(2,k,5,i) = wa(i,4,1)*di5+wa(i,4,2)*dr5
143       end do
144     end do
146   else
148     do k = 1, l1
149       ti5 = cc(2,k,1,2)-cc(2,k,1,5)
150       ti2 = cc(2,k,1,2)+cc(2,k,1,5)
151       ti4 = cc(2,k,1,3)-cc(2,k,1,4)
152       ti3 = cc(2,k,1,3)+cc(2,k,1,4)
153       tr5 = cc(1,k,1,2)-cc(1,k,1,5)
154       tr2 = cc(1,k,1,2)+cc(1,k,1,5)
155       tr4 = cc(1,k,1,3)-cc(1,k,1,4)
156       tr3 = cc(1,k,1,3)+cc(1,k,1,4)
157       chold1 = cc(1,k,1,1)+tr2+tr3
158       chold2 = cc(2,k,1,1)+ti2+ti3
159       cr2 = cc(1,k,1,1)+tr11*tr2+tr12*tr3
160       ci2 = cc(2,k,1,1)+tr11*ti2+tr12*ti3
161       cr3 = cc(1,k,1,1)+tr12*tr2+tr11*tr3
162       ci3 = cc(2,k,1,1)+tr12*ti2+tr11*ti3
163       cc(1,k,1,1) = chold1
164       cc(2,k,1,1) = chold2
165       cr5 = ti11*tr5+ti12*tr4
166       ci5 = ti11*ti5+ti12*ti4
167       cr4 = ti12*tr5-ti11*tr4
168       ci4 = ti12*ti5-ti11*ti4
169       cc(1,k,1,2) = cr2-ci5
170       cc(1,k,1,5) = cr2+ci5
171       cc(2,k,1,2) = ci2+cr5
172       cc(2,k,1,3) = ci3+cr4
173       cc(1,k,1,3) = cr3-ci4
174       cc(1,k,1,4) = cr3+ci4
175       cc(2,k,1,4) = ci3-cr4
176       cc(2,k,1,5) = ci2-cr5
177     end do
179   end if
181   return