Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / external / fftpack / fftpack5 / z1f4kf.F
blobc04178ebf48e7ed1f8dada2067c3e3445ec3bfe0
1 subroutine z1f4kf ( ido, l1, na, cc, in1, ch, in2, wa )
3 !*****************************************************************************80
5 !! Z1F4KF 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,4)
40   real ( kind = 8 ) ch(in2,l1,4,ido)
41   real ( kind = 8 ) ci2
42   real ( kind = 8 ) ci3
43   real ( kind = 8 ) ci4
44   real ( kind = 8 ) cr2
45   real ( kind = 8 ) cr3
46   real ( kind = 8 ) cr4
47   integer ( kind = 4 ) i
48   integer ( kind = 4 ) k
49   integer ( kind = 4 ) na
50   real ( kind = 8 ) sn
51   real ( kind = 8 ) ti1
52   real ( kind = 8 ) ti2
53   real ( kind = 8 ) ti3
54   real ( kind = 8 ) ti4
55   real ( kind = 8 ) tr1
56   real ( kind = 8 ) tr2
57   real ( kind = 8 ) tr3
58   real ( kind = 8 ) tr4
59   real ( kind = 8 ) wa(ido,3,2)
61   if ( 1 < ido ) then
63     do k = 1, l1
65       ti1 = cc(2,k,1,1)-cc(2,k,1,3)
66       ti2 = cc(2,k,1,1)+cc(2,k,1,3)
67       tr4 = cc(2,k,1,2)-cc(2,k,1,4)
68       ti3 = cc(2,k,1,2)+cc(2,k,1,4)
69       tr1 = cc(1,k,1,1)-cc(1,k,1,3)
70       tr2 = cc(1,k,1,1)+cc(1,k,1,3)
71       ti4 = cc(1,k,1,4)-cc(1,k,1,2)
72       tr3 = cc(1,k,1,2)+cc(1,k,1,4)
74       ch(1,k,1,1) = tr2 + tr3
75       ch(1,k,3,1) = tr2 - tr3
76       ch(2,k,1,1) = ti2 + ti3
77       ch(2,k,3,1) = ti2 - ti3
78       ch(1,k,2,1) = tr1 + tr4
79       ch(1,k,4,1) = tr1 - tr4
80       ch(2,k,2,1) = ti1 + ti4
81       ch(2,k,4,1) = ti1 - ti4
83     end do
85     do i = 2, ido
86       do k = 1, l1
87         ti1 = cc(2,k,i,1)-cc(2,k,i,3)
88         ti2 = cc(2,k,i,1)+cc(2,k,i,3)
89         ti3 = cc(2,k,i,2)+cc(2,k,i,4)
90         tr4 = cc(2,k,i,2)-cc(2,k,i,4)
91         tr1 = cc(1,k,i,1)-cc(1,k,i,3)
92         tr2 = cc(1,k,i,1)+cc(1,k,i,3)
93         ti4 = cc(1,k,i,4)-cc(1,k,i,2)
94         tr3 = cc(1,k,i,2)+cc(1,k,i,4)
95         ch(1,k,1,i) = tr2+tr3
96         cr3 = tr2-tr3
97         ch(2,k,1,i) = ti2+ti3
98         ci3 = ti2-ti3
99         cr2 = tr1+tr4
100         cr4 = tr1-tr4
101         ci2 = ti1+ti4
102         ci4 = ti1-ti4
103         ch(1,k,2,i) = wa(i,1,1)*cr2+wa(i,1,2)*ci2
104         ch(2,k,2,i) = wa(i,1,1)*ci2-wa(i,1,2)*cr2
105         ch(1,k,3,i) = wa(i,2,1)*cr3+wa(i,2,2)*ci3
106         ch(2,k,3,i) = wa(i,2,1)*ci3-wa(i,2,2)*cr3
107         ch(1,k,4,i) = wa(i,3,1)*cr4+wa(i,3,2)*ci4
108         ch(2,k,4,i) = wa(i,3,1)*ci4-wa(i,3,2)*cr4
109       end do
110     end do
112   else if ( na == 1 ) then
114     sn = 1.0D+00 / real ( 4 * l1, kind = 8 )
116     do k = 1, l1
117       ti1 = cc(2,k,1,1)-cc(2,k,1,3)
118       ti2 = cc(2,k,1,1)+cc(2,k,1,3)
119       tr4 = cc(2,k,1,2)-cc(2,k,1,4)
120       ti3 = cc(2,k,1,2)+cc(2,k,1,4)
121       tr1 = cc(1,k,1,1)-cc(1,k,1,3)
122       tr2 = cc(1,k,1,1)+cc(1,k,1,3)
123       ti4 = cc(1,k,1,4)-cc(1,k,1,2)
124       tr3 = cc(1,k,1,2)+cc(1,k,1,4)
125       ch(1,k,1,1) = sn*(tr2+tr3)
126       ch(1,k,3,1) = sn*(tr2-tr3)
127       ch(2,k,1,1) = sn*(ti2+ti3)
128       ch(2,k,3,1) = sn*(ti2-ti3)
129       ch(1,k,2,1) = sn*(tr1+tr4)
130       ch(1,k,4,1) = sn*(tr1-tr4)
131       ch(2,k,2,1) = sn*(ti1+ti4)
132       ch(2,k,4,1) = sn*(ti1-ti4)
133     end do
135   else
137     sn = 1.0D+00 / real ( 4 * l1, kind = 8 )
139     do k = 1, l1
140       ti1 = cc(2,k,1,1)-cc(2,k,1,3)
141       ti2 = cc(2,k,1,1)+cc(2,k,1,3)
142       tr4 = cc(2,k,1,2)-cc(2,k,1,4)
143       ti3 = cc(2,k,1,2)+cc(2,k,1,4)
144       tr1 = cc(1,k,1,1)-cc(1,k,1,3)
145       tr2 = cc(1,k,1,1)+cc(1,k,1,3)
146       ti4 = cc(1,k,1,4)-cc(1,k,1,2)
147       tr3 = cc(1,k,1,2)+cc(1,k,1,4)
148       cc(1,k,1,1) = sn*(tr2+tr3)
149       cc(1,k,1,3) = sn*(tr2-tr3)
150       cc(2,k,1,1) = sn*(ti2+ti3)
151       cc(2,k,1,3) = sn*(ti2-ti3)
152       cc(1,k,1,2) = sn*(tr1+tr4)
153       cc(1,k,1,4) = sn*(tr1-tr4)
154       cc(2,k,1,2) = sn*(ti1+ti4)
155       cc(2,k,1,4) = sn*(ti1-ti4)
156     end do
158   end if
160   return