75 implicit none
76 class(FastFourierTransform1D), intent(inout) :: this
77 integer, intent(in) :: N
78
79 complex(RP) :: JJ
80 integer :: k
81
82 real(RP) :: angle0
83 real(RP) :: angle
84
85 integer :: M
86 integer :: MM
87
88 complex(RP) :: w1, w2
89
90
91 jj = cmplx( 0.0_rp, 1.0_rp )
92
93 this%N = n
94 if ( is_power_of_two(n) ) then
95 this%use_bluestein = .false.
96 mm = n / 2
97 log_info("FastFourierTransform1D_Init",*) "use_bluestein=F"
98 log_info("FastFourierTransform1D_Init",*) "MM=", mm
99 else
100 this%use_bluestein = .true.
101 m = 1
102 do while ( m < 2*n-1 )
103 m = m * 2
104 end do
105 mm = m / 2
106 log_info("FastFourierTransform1D_Init",*) "use_bluestein=T"
107 log_info("FastFourierTransform1D_Init",*) "M=", m, "MM=", mm
108 end if
109 this%M = m
110
111 allocate( this%W_forward(mm), this%W_backward(mm) )
112
113 angle0 = 2.0_rp * pi / real(2*mm, kind=rp)
114
115 do k=0, mm-1
116 angle = angle0 * real(k, kind=rp)
117 this%W_forward (k+1) = exp(- jj * angle )
118 this%W_backward(k+1) = exp( jj * angle )
119 end do
120
121 if ( this%use_bluestein ) then
122 allocate( this%W1_bluestein(n), this%W2_bluestein(n) )
123
124 do k=0, n-1
125 angle = pi * real(k*k,kind=rp) / real(n, kind=rp)
126 this%W1_bluestein(k+1) = exp(- jj * angle )
127 this%W2_bluestein(k+1) = exp( jj * angle )
128 end do
129 end if
130
131 return