updated top-level README and version_decl for V4.4.2 (#1795)
[WRF.git] / external / fftpack / fftpack5 / zmf5kb.F
blobe82acbba64eacf23fbbae643df74e449438bce37
1 subroutine zmf5kb ( lot, ido, l1, na, cc, im1, in1, ch, im2, in2, wa )
3 !*****************************************************************************80
5 !! ZMF5KB 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(2,in1,l1,ido,5)
40   real ( kind = 8 ) ch(2,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 ) im1
61   integer ( kind = 4 ) im2
62   integer ( kind = 4 ) k
63   integer ( kind = 4 ) lot
64   integer ( kind = 4 ) m1
65   integer ( kind = 4 ) m1d
66   integer ( kind = 4 ) m2
67   integer ( kind = 4 ) m2s
68   integer ( kind = 4 ) na
69   real ( kind = 8 ) ti2
70   real ( kind = 8 ) ti3
71   real ( kind = 8 ) ti4
72   real ( kind = 8 ) ti5
73   real ( kind = 8 ), parameter :: ti11 =  0.9510565162951536D+00
74   real ( kind = 8 ), parameter :: ti12 =  0.5877852522924731D+00
75   real ( kind = 8 ) tr2
76   real ( kind = 8 ) tr3
77   real ( kind = 8 ) tr4
78   real ( kind = 8 ) tr5
79   real ( kind = 8 ), parameter :: tr11 =  0.3090169943749474D+00
80   real ( kind = 8 ), parameter :: tr12 = -0.8090169943749474D+00
81   real ( kind = 8 ) wa(ido,4,2)
83   m1d = ( lot - 1 ) * im1 + 1
84   m2s = 1 - im2
86   if ( 1 < ido .or. na == 1 ) then
88     do k = 1, l1
89       m2 = m2s
90       do m1 = 1, m1d, im1
91         m2 = m2 + im2
92         ti5 = cc(2,m1,k,1,2)-cc(2,m1,k,1,5)
93         ti2 = cc(2,m1,k,1,2)+cc(2,m1,k,1,5)
94         ti4 = cc(2,m1,k,1,3)-cc(2,m1,k,1,4)
95         ti3 = cc(2,m1,k,1,3)+cc(2,m1,k,1,4)
96         tr5 = cc(1,m1,k,1,2)-cc(1,m1,k,1,5)
97         tr2 = cc(1,m1,k,1,2)+cc(1,m1,k,1,5)
98         tr4 = cc(1,m1,k,1,3)-cc(1,m1,k,1,4)
99         tr3 = cc(1,m1,k,1,3)+cc(1,m1,k,1,4)
100         ch(1,m2,k,1,1) = cc(1,m1,k,1,1)+tr2+tr3
101         ch(2,m2,k,1,1) = cc(2,m1,k,1,1)+ti2+ti3
102         cr2 = cc(1,m1,k,1,1)+tr11*tr2+tr12*tr3
103         ci2 = cc(2,m1,k,1,1)+tr11*ti2+tr12*ti3
104         cr3 = cc(1,m1,k,1,1)+tr12*tr2+tr11*tr3
105         ci3 = cc(2,m1,k,1,1)+tr12*ti2+tr11*ti3
106         cr5 = ti11*tr5+ti12*tr4
107         ci5 = ti11*ti5+ti12*ti4
108         cr4 = ti12*tr5-ti11*tr4
109         ci4 = ti12*ti5-ti11*ti4
110         ch(1,m2,k,2,1) = cr2-ci5
111         ch(1,m2,k,5,1) = cr2+ci5
112         ch(2,m2,k,2,1) = ci2+cr5
113         ch(2,m2,k,3,1) = ci3+cr4
114         ch(1,m2,k,3,1) = cr3-ci4
115         ch(1,m2,k,4,1) = cr3+ci4
116         ch(2,m2,k,4,1) = ci3-cr4
117         ch(2,m2,k,5,1) = ci2-cr5
118       end do
119     end do
121     do i = 2, ido
122       do k = 1, l1
123         m2 = m2s
124         do m1 = 1, m1d, im1
125           m2 = m2 + im2
126           ti5 = cc(2,m1,k,i,2)-cc(2,m1,k,i,5)
127           ti2 = cc(2,m1,k,i,2)+cc(2,m1,k,i,5)
128           ti4 = cc(2,m1,k,i,3)-cc(2,m1,k,i,4)
129           ti3 = cc(2,m1,k,i,3)+cc(2,m1,k,i,4)
130           tr5 = cc(1,m1,k,i,2)-cc(1,m1,k,i,5)
131           tr2 = cc(1,m1,k,i,2)+cc(1,m1,k,i,5)
132           tr4 = cc(1,m1,k,i,3)-cc(1,m1,k,i,4)
133           tr3 = cc(1,m1,k,i,3)+cc(1,m1,k,i,4)
134           ch(1,m2,k,1,i) = cc(1,m1,k,i,1)+tr2+tr3
135           ch(2,m2,k,1,i) = cc(2,m1,k,i,1)+ti2+ti3
136           cr2 = cc(1,m1,k,i,1)+tr11*tr2+tr12*tr3
137           ci2 = cc(2,m1,k,i,1)+tr11*ti2+tr12*ti3
138           cr3 = cc(1,m1,k,i,1)+tr12*tr2+tr11*tr3
139           ci3 = cc(2,m1,k,i,1)+tr12*ti2+tr11*ti3
140           cr5 = ti11*tr5+ti12*tr4
141           ci5 = ti11*ti5+ti12*ti4
142           cr4 = ti12*tr5-ti11*tr4
143           ci4 = ti12*ti5-ti11*ti4
144           dr3 = cr3-ci4
145           dr4 = cr3+ci4
146           di3 = ci3+cr4
147           di4 = ci3-cr4
148           dr5 = cr2+ci5
149           dr2 = cr2-ci5
150           di5 = ci2-cr5
151           di2 = ci2+cr5
152           ch(1,m2,k,2,i) = wa(i,1,1) * dr2 - wa(i,1,2) * di2
153           ch(2,m2,k,2,i) = wa(i,1,1) * di2 + wa(i,1,2) * dr2
154           ch(1,m2,k,3,i) = wa(i,2,1) * dr3 - wa(i,2,2) * di3
155           ch(2,m2,k,3,i) = wa(i,2,1) * di3 + wa(i,2,2) * dr3
156           ch(1,m2,k,4,i) = wa(i,3,1) * dr4 - wa(i,3,2) * di4
157           ch(2,m2,k,4,i) = wa(i,3,1) * di4 + wa(i,3,2) * dr4
158           ch(1,m2,k,5,i) = wa(i,4,1) * dr5 - wa(i,4,2) * di5
159           ch(2,m2,k,5,i) = wa(i,4,1) * di5 + wa(i,4,2) * dr5
160         end do
161       end do
162     end do
164   else
166     do k = 1, l1
167       do m1 = 1, m1d, im1
168         ti5 = cc(2,m1,k,1,2)-cc(2,m1,k,1,5)
169         ti2 = cc(2,m1,k,1,2)+cc(2,m1,k,1,5)
170         ti4 = cc(2,m1,k,1,3)-cc(2,m1,k,1,4)
171         ti3 = cc(2,m1,k,1,3)+cc(2,m1,k,1,4)
172         tr5 = cc(1,m1,k,1,2)-cc(1,m1,k,1,5)
173         tr2 = cc(1,m1,k,1,2)+cc(1,m1,k,1,5)
174         tr4 = cc(1,m1,k,1,3)-cc(1,m1,k,1,4)
175         tr3 = cc(1,m1,k,1,3)+cc(1,m1,k,1,4)
177         chold1 = cc(1,m1,k,1,1) + tr2 + tr3
178         chold2 = cc(2,m1,k,1,1) + ti2 + ti3
180         cr2 = cc(1,m1,k,1,1) + tr11 * tr2 + tr12 * tr3
181         ci2 = cc(2,m1,k,1,1) + tr11 * ti2 + tr12 * ti3
182         cr3 = cc(1,m1,k,1,1) + tr12 * tr2 + tr11 * tr3
183         ci3 = cc(2,m1,k,1,1) + tr12 * ti2 + tr11 * ti3
185         cc(1,m1,k,1,1) = chold1
186         cc(2,m1,k,1,1) = chold2
188         cr5 = ti11*tr5 + ti12*tr4
189         ci5 = ti11*ti5 + ti12*ti4
190         cr4 = ti12*tr5 - ti11*tr4
191         ci4 = ti12*ti5 - ti11*ti4
192         cc(1,m1,k,1,2) = cr2-ci5
193         cc(1,m1,k,1,5) = cr2+ci5
194         cc(2,m1,k,1,2) = ci2+cr5
195         cc(2,m1,k,1,3) = ci3+cr4
196         cc(1,m1,k,1,3) = cr3-ci4
197         cc(1,m1,k,1,4) = cr3+ci4
198         cc(2,m1,k,1,4) = ci3-cr4
199         cc(2,m1,k,1,5) = ci2-cr5
200       end do
201     end do
203   end if
205   return