Fortran Coder

查看: 28167|回复: 11
打印 上一主题 下一主题

[数学库] 如何配置MKL的MKL_DFTI来计算FFT(f90接口)

[复制链接]

11

帖子

3

主题

0

精华

入门

F 币
75 元
贡献
44 点
跳转到指定楼层
楼主
发表于 2016-11-22 14:39:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
            请问:如何在ivf中配置MKL来调用f90接口,如调用fft程序?具体如何配置,是否需要安装mkl才能使用f90接口?使用的是vs10+ivf2011。

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2015

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1572 元
贡献
676 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

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

[Fortran] 纯文本查看 复制代码
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) = & !// 时间域
    [3,2,4,6,2,5,7,8,5,3,7,8,4,2,4,7,8,9,3,2,5,7,8,4,2,5,8,9,4,6]
  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





11

帖子

3

主题

0

精华

入门

F 币
75 元
贡献
44 点
板凳
 楼主| 发表于 2016-11-28 10:38:34 | 只看该作者
       你好,看到比较晚。测试了一下,出现如下错误:error #6457: This derived type name has not been declared.   [DFTI_DESCRIPTOR]。
问题貌似是需要进行别的设置,请多指点。

2015

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1572 元
贡献
676 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

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

11

帖子

3

主题

0

精华

入门

F 币
75 元
贡献
44 点
5#
 楼主| 发表于 2016-11-28 14:13:45 | 只看该作者
       出现如下错误:Error in opening the compiled module file.  Check INCLUDE paths.   [MKL_DFTI]。
我在‘初学’群里请教过这个问题,fcode的群主说是应该注意配置include,不知道应该怎么配置,请指点。

2015

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1572 元
贡献
676 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

6#
发表于 2016-11-28 14:22:54 | 只看该作者
你需要把MKL安装目录下的 MKL_DFTI.f90 文件加入工程。
有更多问题,在fcode群里问吧,2338021

43

帖子

12

主题

0

精华

熟手

F 币
186 元
贡献
87 点
7#
发表于 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个文件不管放在哪里都不行. 不知道应该怎样处理, 请指教, 谢谢

2

帖子

0

主题

0

精华

新人

F 币
17 元
贡献
2 点
8#
发表于 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?mo ... ghlight=MKL%5C_DFTI中的测试程序,输出结果中频率域,16个f实部虚部皆为0,30个r也与程序中输入的r完全不同, r中多个值为-3579139。请教一下您,感谢反馈。

2

帖子

0

主题

0

精华

新人

F 币
17 元
贡献
2 点
9#
发表于 2022-8-11 16:00:36 | 只看该作者
已解决!谢谢提供算例~

1

帖子

0

主题

0

精华

新人

F 币
10 元
贡献
1 点
10#
发表于 2022-10-31 23:42:19 | 只看该作者
tintin2005 发表于 2022-8-11 16:00
已解决!谢谢提供算例~

你好同学,我也遇到了和你一样的问题,两次傅里叶变换后结果与输入不符,请问你最后是改了程序的哪些地方呀,希望能学习一下
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-5 12:15

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表