lcy_ouc 发表于 2016-11-22 14:39:17

如何配置MKL的MKL_DFTI来计算FFT(f90接口)

            请问:如何在ivf中配置MKL来调用f90接口,如调用fft程序?具体如何配置,是否需要安装mkl才能使用f90接口?使用的是vs10+ivf2011。

fcode 发表于 2016-11-22 17:03:36

以下代码仅举例
你需要在工程属性里修改 library 使用 MKL 库
项目(或工程菜单),属性,然后按图设置:

Module MKL_FFT !// 以下代码复制粘贴,直接使用
Use MKL_DFTI
private
Type , public :: CLS_FFT
    type(DFTI_DESCRIPTOR), Pointer :: h => NULL()
    Integer :: Err
contains
    Procedure :: Create
    Procedure :: Forward
    Procedure :: Backward
    Procedure :: Destory
End Type CLS_FFT

contains

Subroutine Create( this , N )
    class( CLS_FFT ) :: this
    Integer , Intent( IN ) :: N
    this%Err = DftiCreateDescriptor( this%h , DFTI_SINGLE , DFTI_REAL , 1 , N )
    this%Err = DftiSetValue( this%h , DFTI_PLACEMENT , DFTI_NOT_INPLACE )
    this%Err = DftiCommitDescriptor( this%h )
End Subroutine Create

Function Forward( this , X ) result( F )
    class( CLS_FFT ) :: this
    Real :: X(:)
    Complex :: F( size(X)/2+1 )
    this%Err = DftiComputeForward( this%h , X , F )
End Function Forward

Function Backward( this , X ) result( T )
    class( CLS_FFT ) :: this
    Complex :: X(:)
    Real    :: T( size(X)*2-1 )
    this%Err = DftiComputeBackward( this%h , X , T )
End Function Backward

Subroutine Destory( this )
    class( CLS_FFT ) :: this
    this%Err = DftiFreeDescriptor( this%h )
End Subroutine Destory

End Module MKL_FFT
!// 以上代码复制粘贴,直接使用

Program Test_FFT
use MKL_FFT   !// 这句代码必须 *************
Type( CLS_FFT ) :: FFT !// 这句定义一个 FFT 的过程 ************
Integer , parameter :: N = 30 !//不需要2^k 次方整幂
Real   :: r(N) = & !// 时间域
   
Complex:: f(N/2+1) !// 频率域,为复数,大小为 n/2 + 1

call FFT%Create( N ) !// 创建FFT过程。N 是 FFT 的点数 ************
f= FFT%Forward( r )!// 正向 FFT 变换*************
Do i = 1 , size(f)
    Write( * , * ) i , f( i ) !// 输出频率域
End Do
r = FFT%Backward( f ) / n !// 这一句可以做反傅氏变换 *************
call FFT%Destory() !// 销毁 FFT 过程*************
Do i = 1 , size(r)
    Write( * , * ) i , r(i) !// 输出反变换
End Do
Read(*,*)
End Program Test_FFT




lcy_ouc 发表于 2016-11-28 10:38:34

       你好,看到比较晚。测试了一下,出现如下错误:error #6457: This derived type name has not been declared.   。
问题貌似是需要进行别的设置,请多指点。

fcode 发表于 2016-11-28 11:36:17

Module MKL_FFT !// 以下代码复制粘贴,直接使用Use MKL_DFTI
这里少了一个回车
应该是
Module MKL_FFT !// 以下代码复制粘贴,直接使用
Use MKL_DFTI

lcy_ouc 发表于 2016-11-28 14:13:45

       出现如下错误:Error in opening the compiled module file.Check INCLUDE paths.   。
我在‘初学’群里请教过这个问题,fcode的群主说是应该注意配置include,不知道应该怎么配置,请指点。

fcode 发表于 2016-11-28 14:22:54

你需要把MKL安装目录下的 MKL_DFTI.f90 文件加入工程。
有更多问题,在fcode群里问吧,2338021

cqflhl 发表于 2020-12-29 23:32:40

fcode 发表于 2016-11-22 17:03
以下代码仅举例
你需要在工程属性里修改 library 使用 MKL 库
项目(或工程菜单),属性,然后按图设置:


您好, 我用IVF可以正确编译, 但是用VB6调用DLL的时候就提示找不到文件
我对比了一下没有使用use mkl_dfti的情况下, 只缺少IMSLMKL_DLL.DLL和MKL_INTEL_THREAD.DLL两个文件. 但是把这2个文件不管放在哪里都不行. 不知道应该怎样处理, 请指教, 谢谢

tintin2005 发表于 2022-7-18 18:24:21

fcode 发表于 2016-11-28 11:36
Module MKL_FFT !// 以下代码复制粘贴,直接使用Use MKL_DFTI
这里少了一个回车
应该是


您好,使用MKL完成FFT的过程中,运行了帖子http://bbs.fcode.cn/forum.php?mod=viewthread&tid=1128&highlight=MKL%5C_DFTI中的测试程序,输出结果中频率域,16个f实部虚部皆为0,30个r也与程序中输入的r完全不同, r中多个值为-3579139。请教一下您,感谢反馈。

tintin2005 发表于 2022-8-11 16:00:36

已解决!谢谢提供算例~

wsywsy 发表于 2022-10-31 23:42:19

tintin2005 发表于 2022-8-11 16:00
已解决!谢谢提供算例~

你好同学,我也遇到了和你一样的问题,两次傅里叶变换后结果与输入不符,请问你最后是改了程序的哪些地方呀,希望能学习一下
页: [1] 2
查看完整版本: 如何配置MKL的MKL_DFTI来计算FFT(f90接口)