Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / external / fftpack / fftpack5 / zmfm1b.F
blob1356467555a3743e347af0edd8101db54bce63db
1 subroutine zmfm1b ( lot, jump, n, inc, c, ch, wa, fnf, fac )
3 !*****************************************************************************80
5 !! ZMFM1B 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   complex ( kind = 8 ) c(*)
35   real ( kind = 8 ) ch(*)
36   real ( kind = 8 ) fac(*)
37   real ( kind = 8 ) fnf
38   integer ( kind = 4 ) ido
39   integer ( kind = 4 ) inc
40   integer ( kind = 4 ) ip
41   integer ( kind = 4 ) iw
42   integer ( kind = 4 ) jump
43   integer ( kind = 4 ) k1
44   integer ( kind = 4 ) l1
45   integer ( kind = 4 ) l2
46   integer ( kind = 4 ) lid
47   integer ( kind = 4 ) lot
48   integer ( kind = 4 ) n
49   integer ( kind = 4 ) na
50   integer ( kind = 4 ) nbr
51   integer ( kind = 4 ) nf
52   real ( kind = 8 ) wa(*)
54   nf = int ( fnf )
55   na = 0
56   l1 = 1
57   iw = 1
59   do k1 = 1, nf
61     ip = int ( fac(k1) )
62     l2 = ip * l1
63     ido = n / l2
64     lid = l1 * ido
65     nbr = 1 + na + 2 * min ( ip - 2, 4 )
67     if ( nbr == 1 ) then
68       call zmf2kb ( lot, ido, l1, na, c, jump, inc, ch, 1, lot, wa(iw) )
69     else if ( nbr == 2 ) then
70       call zmf2kb ( lot, ido, l1, na, ch, 1, lot, c, jump, inc, wa(iw) )
71     else if ( nbr == 3 ) then
72       call zmf3kb ( lot, ido, l1, na, c, jump, inc, ch, 1, lot, wa(iw) )
73     else if ( nbr == 4 ) then
74       call zmf3kb ( lot, ido, l1, na, ch, 1, lot, c, jump, inc, wa(iw) )
75     else if ( nbr == 5 ) then
76       call zmf4kb ( lot, ido, l1, na, c, jump, inc, ch, 1, lot, wa(iw) )
77     else if ( nbr == 6 ) then
78       call zmf4kb ( lot, ido, l1, na, ch, 1, lot, c, jump, inc, wa(iw) )
79     else if ( nbr == 7 ) then
80       call zmf5kb ( lot, ido, l1, na, c, jump, inc, ch, 1, lot, wa(iw) )
81     else if ( nbr == 8 ) then
82       call zmf5kb ( lot, ido, l1, na, ch, 1, lot, c, jump, inc, wa(iw) )
83     else if ( nbr == 9 ) then
84       call zmfgkb ( lot, ido, ip, l1, lid, na, c, c, jump, inc, ch, ch, &
85         1, lot, wa(iw) )
86     else if ( nbr == 10 ) then
87       call zmfgkb ( lot, ido, ip, l1, lid, na, ch, ch, 1, lot, c, c, &
88         jump, inc, wa(iw) )
89     end if
91     l1 = l2
92     iw = iw + ( ip - 1 ) * ( ido + ido )
94     if ( ip <= 5 ) then
95       na = 1 - na
96     end if
98   end do
100   return