NAFPack_Fourier_Transform_dft3.f90 Source File


This file depends on

sourcefile~~nafpack_fourier_transform_dft3.f90~~EfferentGraph sourcefile~nafpack_fourier_transform_dft3.f90 NAFPack_Fourier_Transform_dft3.f90 sourcefile~nafpack_fourier_transform.f90 NAFPack_Fourier_Transform.f90 sourcefile~nafpack_fourier_transform_dft3.f90->sourcefile~nafpack_fourier_transform.f90 sourcefile~nafpack_constant.f90 NAFPack_constant.f90 sourcefile~nafpack_fourier_transform.f90->sourcefile~nafpack_constant.f90 sourcefile~nafpack_implementation_type.f90 NAFPack_implementation_type.f90 sourcefile~nafpack_fourier_transform.f90->sourcefile~nafpack_implementation_type.f90 sourcefile~nafpack_kinds.f90 NAFPack_kinds.f90 sourcefile~nafpack_fourier_transform.f90->sourcefile~nafpack_kinds.f90 sourcefile~nafpack_loop_method.f90 NAFPack_loop_method.f90 sourcefile~nafpack_fourier_transform.f90->sourcefile~nafpack_loop_method.f90 sourcefile~nafpack_math_utils.f90 NAFPack_math_utils.f90 sourcefile~nafpack_fourier_transform.f90->sourcefile~nafpack_math_utils.f90 sourcefile~nafpack_constant.f90->sourcefile~nafpack_kinds.f90 sourcefile~nafpack_implementation_type.f90->sourcefile~nafpack_kinds.f90 sourcefile~nafpack_math_utils.f90->sourcefile~nafpack_kinds.f90

Source Code

submodule(NAFPack_Fourier_Transform) NAFPack_Fourier_Transform_dft3

    implicit none(type, external)

contains

    module function dft3_cmplx_sp(signal, loop_method) result(result)
        complex(sp), dimension(:, :, :), intent(in) :: signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(sp), dimension(:, :, :), allocatable :: result
        complex(sp), dimension(:, :, :), allocatable :: tmp
        type(LoopMethod) :: loop_method_used
        integer(isp) :: i, j, Nx, Ny, Nz

        if (present(loop_method)) then
            loop_method_used = loop_method
        else
            loop_method_used = default_loop_method
        end if

        Nx = size(signal, 1)
        Ny = size(signal, 2)
        Nz = size(signal, 3)
        allocate (result(Nx, Ny, Nz))
        allocate (tmp(Nx, Ny, Nz))

        do i = 1, Nx
            do j = 1, Ny
                tmp(i, j, :) = dft_cmplx_sp(signal(i, j, :), loop_method_used)
            end do
        end do

        do i = 1, Nx
            do j = 1, Nz
                result(i, :, j) = dft_cmplx_sp(tmp(i, :, j), loop_method_used)
            end do
        end do

        tmp = result
        do j = 1, Ny
            do i = 1, Nz
                result(:, j, i) = dft_cmplx_sp(tmp(:, j, i), loop_method_used)
            end do
        end do

    end function dft3_cmplx_sp

    module function idft3_cmplx_sp(f_signal, loop_method) result(result)
        complex(sp), dimension(:, :, :), intent(in) :: f_signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(sp), dimension(:, :, :), allocatable :: result
        complex(sp), dimension(:, :, :), allocatable :: tmp
        type(LoopMethod) :: loop_method_used
        integer(isp) :: i, j, Nx, Ny, Nz

        if (present(loop_method)) then
            loop_method_used = loop_method
        else
            loop_method_used = default_loop_method
        end if

        Nx = size(f_signal, 1)
        Ny = size(f_signal, 2)
        Nz = size(f_signal, 3)
        allocate (result(Nx, Ny, Nz))
        allocate (tmp(Nx, Ny, Nz))

        do i = 1, Nx
            do j = 1, Ny
                tmp(i, j, :) = idft_cmplx_sp(f_signal(i, j, :), loop_method_used)
            end do
        end do

        do i = 1, Nx
            do j = 1, Nz
                result(i, :, j) = idft_cmplx_sp(tmp(i, :, j), loop_method_used)
            end do
        end do

        tmp = result
        do j = 1, Ny
            do i = 1, Nz
                result(:, j, i) = idft_cmplx_sp(tmp(:, j, i), loop_method_used)
            end do
        end do

    end function idft3_cmplx_sp

    module function dft3_cmplx_dp(signal, loop_method) result(result)
        complex(dp), dimension(:, :, :), intent(in) :: signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(dp), dimension(:, :, :), allocatable :: result
        complex(dp), dimension(:, :, :), allocatable :: tmp
        type(LoopMethod) :: loop_method_used
        integer(isp) :: i, j, Nx, Ny, Nz

        if (present(loop_method)) then
            loop_method_used = loop_method
        else
            loop_method_used = default_loop_method
        end if

        Nx = size(signal, 1)
        Ny = size(signal, 2)
        Nz = size(signal, 3)
        allocate (result(Nx, Ny, Nz))
        allocate (tmp(Nx, Ny, Nz))

        do i = 1, Nx
            do j = 1, Ny
                tmp(i, j, :) = dft_cmplx_dp(signal(i, j, :), loop_method_used)
            end do
        end do

        do i = 1, Nx
            do j = 1, Nz
                result(i, :, j) = dft_cmplx_dp(tmp(i, :, j), loop_method_used)
            end do
        end do

        tmp = result
        do j = 1, Ny
            do i = 1, Nz
                result(:, j, i) = dft_cmplx_dp(tmp(:, j, i), loop_method_used)
            end do
        end do

    end function dft3_cmplx_dp

    module function idft3_cmplx_dp(f_signal, loop_method) result(result)
        complex(dp), dimension(:, :, :), intent(in) :: f_signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(dp), dimension(:, :, :), allocatable :: result
        complex(dp), dimension(:, :, :), allocatable :: tmp
        type(LoopMethod) :: loop_method_used
        integer(isp) :: i, j, Nx, Ny, Nz

        if (present(loop_method)) then
            loop_method_used = loop_method
        else
            loop_method_used = default_loop_method
        end if

        Nx = size(f_signal, 1)
        Ny = size(f_signal, 2)
        Nz = size(f_signal, 3)
        allocate (result(Nx, Ny, Nz))
        allocate (tmp(Nx, Ny, Nz))

        do i = 1, Nx
            do j = 1, Ny
                tmp(i, j, :) = idft_cmplx_dp(f_signal(i, j, :), loop_method_used)
            end do
        end do

        do i = 1, Nx
            do j = 1, Nz
                result(i, :, j) = idft_cmplx_dp(tmp(i, :, j), loop_method_used)
            end do
        end do

        tmp = result
        do j = 1, Ny
            do i = 1, Nz
                result(:, j, i) = idft_cmplx_dp(tmp(:, j, i), loop_method_used)
            end do
        end do

    end function idft3_cmplx_dp

    module function dft3_cmplx_qp(signal, loop_method) result(result)
        complex(qp), dimension(:, :, :), intent(in) :: signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(qp), dimension(:, :, :), allocatable :: result
        complex(qp), dimension(:, :, :), allocatable :: tmp
        type(LoopMethod) :: loop_method_used
        integer(isp) :: i, j, Nx, Ny, Nz

        if (present(loop_method)) then
            loop_method_used = loop_method
        else
            loop_method_used = default_loop_method
        end if

        Nx = size(signal, 1)
        Ny = size(signal, 2)
        Nz = size(signal, 3)
        allocate (result(Nx, Ny, Nz))
        allocate (tmp(Nx, Ny, Nz))

        do i = 1, Nx
            do j = 1, Ny
                tmp(i, j, :) = dft_cmplx_qp(signal(i, j, :), loop_method_used)
            end do
        end do

        do i = 1, Nx
            do j = 1, Nz
                result(i, :, j) = dft_cmplx_qp(tmp(i, :, j), loop_method_used)
            end do
        end do

        tmp = result
        do j = 1, Ny
            do i = 1, Nz
                result(:, j, i) = dft_cmplx_qp(tmp(:, j, i), loop_method_used)
            end do
        end do

    end function dft3_cmplx_qp

    module function idft3_cmplx_qp(f_signal, loop_method) result(result)
        complex(qp), dimension(:, :, :), intent(in) :: f_signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(qp), dimension(:, :, :), allocatable :: result
        complex(qp), dimension(:, :, :), allocatable :: tmp
        type(LoopMethod) :: loop_method_used
        integer(isp) :: i, j, Nx, Ny, Nz

        if (present(loop_method)) then
            loop_method_used = loop_method
        else
            loop_method_used = default_loop_method
        end if

        Nx = size(f_signal, 1)
        Ny = size(f_signal, 2)
        Nz = size(f_signal, 3)
        allocate (result(Nx, Ny, Nz))
        allocate (tmp(Nx, Ny, Nz))

        do i = 1, Nx
            do j = 1, Ny
                tmp(i, j, :) = idft_cmplx_qp(f_signal(i, j, :), loop_method_used)
            end do
        end do

        do i = 1, Nx
            do j = 1, Nz
                result(i, :, j) = idft_cmplx_qp(tmp(i, :, j), loop_method_used)
            end do
        end do

        tmp = result
        do j = 1, Ny
            do i = 1, Nz
                result(:, j, i) = idft_cmplx_qp(tmp(:, j, i), loop_method_used)
            end do
        end do

    end function idft3_cmplx_qp

    module function dft3_real_sp(signal, loop_method) result(result)
        real(sp), dimension(:, :, :), intent(in) :: signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(sp), dimension(:, :, :), allocatable :: result
        complex(sp), dimension(size(signal, 1), &
                               size(signal, 2), &
                               size(signal, 3)) :: signal_cmplx
        integer(isp) :: Nx, Ny, Nz

        Nx = size(signal, 1)
        Ny = size(signal, 2)
        Nz = size(signal, 3)
        allocate (result(Nx, Ny, Nz))

        signal_cmplx = cmplx(signal, 0.0_dp, kind=sp)

        if (present(loop_method)) then
            result = dft3_cmplx_sp(signal_cmplx, loop_method)
        else
            result = dft3_cmplx_sp(signal_cmplx)
        end if
    end function dft3_real_sp

    module function idft3_real_sp(f_signal, loop_method) result(result)
        real(sp), dimension(:, :, :), intent(in) :: f_signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(sp), dimension(:, :, :), allocatable :: result
        complex(sp), dimension(size(f_signal, 1), &
                               size(f_signal, 2), &
                               size(f_signal, 3)) :: f_signal_cmplx
        integer(isp) :: Nx, Ny, Nz

        Nx = size(f_signal, 1)
        Ny = size(f_signal, 2)
        Nz = size(f_signal, 3)
        allocate (result(Nx, Ny, Nz))

        f_signal_cmplx = cmplx(f_signal, 0.0_dp, kind=sp)

        if (present(loop_method)) then
            result = idft3_cmplx_sp(f_signal_cmplx, loop_method)
        else
            result = idft3_cmplx_sp(f_signal_cmplx)
        end if
    end function idft3_real_sp

    module function dft3_real_dp(signal, loop_method) result(result)
        real(dp), dimension(:, :, :), intent(in) :: signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(dp), dimension(:, :, :), allocatable :: result
        complex(dp), dimension(size(signal, 1), &
                               size(signal, 2), &
                               size(signal, 3)) :: signal_cmplx
        integer(isp) :: Nx, Ny, Nz

        Nx = size(signal, 1)
        Ny = size(signal, 2)
        Nz = size(signal, 3)
        allocate (result(Nx, Ny, Nz))

        signal_cmplx = cmplx(signal, 0.0_dp, kind=dp)

        if (present(loop_method)) then
            result = dft3_cmplx_dp(signal_cmplx, loop_method)
        else
            result = dft3_cmplx_dp(signal_cmplx)
        end if
    end function dft3_real_dp

    module function idft3_real_dp(f_signal, loop_method) result(result)
        real(dp), dimension(:, :, :), intent(in) :: f_signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(dp), dimension(:, :, :), allocatable :: result
        complex(dp), dimension(size(f_signal, 1), &
                               size(f_signal, 2), &
                               size(f_signal, 3)) :: f_signal_cmplx
        integer(isp) :: Nx, Ny, Nz

        Nx = size(f_signal, 1)
        Ny = size(f_signal, 2)
        Nz = size(f_signal, 3)
        allocate (result(Nx, Ny, Nz))

        f_signal_cmplx = cmplx(f_signal, 0.0_dp, kind=dp)

        if (present(loop_method)) then
            result = idft3_cmplx_dp(f_signal_cmplx, loop_method)
        else
            result = idft3_cmplx_dp(f_signal_cmplx)
        end if
    end function idft3_real_dp

    module function dft3_real_qp(signal, loop_method) result(result)
        real(qp), dimension(:, :, :), intent(in) :: signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(qp), dimension(:, :, :), allocatable :: result
        complex(qp), dimension(size(signal, 1), &
                               size(signal, 2), &
                               size(signal, 3)) :: signal_cmplx
        integer(isp) :: Nx, Ny, Nz

        Nx = size(signal, 1)
        Ny = size(signal, 2)
        Nz = size(signal, 3)
        allocate (result(Nx, Ny, Nz))

        signal_cmplx = cmplx(signal, 0.0_dp, kind=qp)

        if (present(loop_method)) then
            result = dft3_cmplx_qp(signal_cmplx, loop_method)
        else
            result = dft3_cmplx_qp(signal_cmplx)
        end if
    end function dft3_real_qp

    module function idft3_real_qp(f_signal, loop_method) result(result)
        real(qp), dimension(:, :, :), intent(in) :: f_signal
        type(LoopMethod), optional, intent(in) :: loop_method
        complex(qp), dimension(:, :, :), allocatable :: result
        complex(qp), dimension(size(f_signal, 1), &
                               size(f_signal, 2), &
                               size(f_signal, 3)) :: f_signal_cmplx
        integer(isp) :: Nx, Ny, Nz

        Nx = size(f_signal, 1)
        Ny = size(f_signal, 2)
        Nz = size(f_signal, 3)
        allocate (result(Nx, Ny, Nz))

        f_signal_cmplx = cmplx(f_signal, 0.0_dp, kind=qp)

        if (present(loop_method)) then
            result = idft3_cmplx_qp(f_signal_cmplx, loop_method)
        else
            result = idft3_cmplx_qp(f_signal_cmplx)
        end if
    end function idft3_real_qp

end submodule NAFPack_Fourier_Transform_dft3