dzfftf.f90 Source File


Contents

Source Code


Source Code

      subroutine dzfftf(n, r, azero, a, b, wsave)
!     version 3  june 1979
         use fftpack_kind, only: dp => rk
         implicit none
         integer, intent(in) :: n
         real(dp), intent(in) :: r(*)
         real(dp), intent(out) :: azero, a(*), b(*)
         real(dp), intent(inout) :: wsave(*)
         real(dp) :: cf, cfm
         integer :: i, ns2, ns2m
         if (n < 2) then
            azero = r(1)
            return
         elseif (n == 2) then
            azero = 0.5_dp*(r(1) + r(2))
            a(1) = 0.5_dp*(r(1) - r(2))
            return
         else
            do i = 1, n
               wsave(i) = r(i)
            end do
            call dfftf(n, wsave, wsave(n + 1))
            cf = 2.0_dp/real(n, dp)
            cfm = -cf
            azero = 0.5_dp*cf*wsave(1)
            ns2 = (n + 1)/2
            ns2m = ns2 - 1
            do i = 1, ns2m
               a(i) = cf*wsave(2*i)
               b(i) = cfm*wsave(2*i + 1)
            end do
            if (mod(n, 2) == 1) return
            a(ns2) = 0.5_dp*cf*wsave(n)
            b(ns2) = 0.0_dp
         end if
      end subroutine dzfftf