Fortran Coder

查看: 8943|回复: 8

[数学库] 调用FFTW2的wrapper lib问题

[复制链接]

8

帖子

2

主题

0

精华

入门

F 币
52 元
贡献
28 点
发表于 2014-10-28 17:33:16 | 显示全部楼层 |阅读模式
    我在应用FFTW时遇到了如下的问题,一直没有解决,向大家请教一,非常感谢!

    我用的是windows系统,编译器是Intel Fortran,VS2008。对工程属性做了设置:Project->Properties->Fortran->Libraries->Use Intel Math Kernel Library项,改为 ”Parallel (/Qmkl:parallel)“
    应用中遇到如下问题:
    当应用FFTW3的函数时,如:sfftw_plan_r2r_1d、sfftw_execute、sfftw_destroy_plan等,是可行的。
    但是想用FFTW2中函数时,如:rfftw_f77_create_plan、rfftw_f77_one、rfftw_f77_destroy_plan,就一直提示函数未定义。现在是在调试一个基于FFTW2写的算法,为避免出现差异,所以暂时想不改变调用函数。

    代码如下
[Fortran] 纯文本查看 复制代码
program main 
   ! 
   integer :: N 
   parameter (N=80) 
   real in, var
   real  out
   dimension in(N), out(N) 
   dimension var(N) 
   integer :: plan,plan2 
   integer :: i 
   real :: ran 
   ! 

   do i=1,N 
     call random_number(ran) 
     in(i-1)=ran 
   end do 
   ! 
 call rfftw_f77_create_plan(plan,N,FFTW_FORWARD,FFTW_ESTIMATE)
 call rfftw_f77_one(plan,in,var)
 call rfftw_f77_destroy_plan(plan)  

 call rfftw_f77_create_plan(plan2,N,FFTW_BACKWARD,FFTW_ESTIMATE)
 call rfftw_f77_one(plan2,var,out)
 call rfftw_f77_destroy_plan(plan2)  

   ! 
   open(18,file='testft.dat') 
   do i=1,N 
   write(18,*)i,real(in(i)),real(out(i))
   end do 
   close(18) 
end program main 


709

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
596 元
贡献
305 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

发表于 2014-10-28 19:26:03 | 显示全部楼层
使用 fftw2 的话,你得首先编译 wrappers 接口库。

位于 MKL 安装目录下的 interfaces\fftw2xf 文件夹。
VS 的话,使用命令(以 32 位为例)
nmake libia32 compiler=msvs

编译后可以看到 MKL 目录下的 lib\ia32 里多了一个 lib 文件:fftw2xf_double_msvs.lib

把他添加在工程属性里。同时可能需要忽略 msvcrtd 这个库,如图所示:
PhoXo1.gif

之后即可正常编译链接了。

1>Compiling with Intel(R) Visual Fortran Compiler XE 14.0.1.139 [IA-32]...
1>fftw_F_test.f90
1>Linking...
1>Embedding manifest...
1>
1>Console2 - 0 error(s), 0 warning(s)
========== 全部重新生成:  成功 1 个,失败 0 个,跳过 0 个 ==========

8

帖子

2

主题

0

精华

入门

F 币
52 元
贡献
28 点
 楼主| 发表于 2014-10-29 16:09:26 | 显示全部楼层
楚香饭 发表于 2014-10-28 19:26
使用 fftw2 的话,你得首先编译 wrappers 接口库。

位于 MKL 安装目录下的 interfaces\fftw2xf 文件夹。

谢谢您的回复。
我按您说的,在编译wrappers时,出现错误如下,会是哪里出问题了呢?我先重装一下软件试试。 1.jpg 2.jpg

709

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
596 元
贡献
305 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

发表于 2014-10-29 16:44:24 | 显示全部楼层
icl 找不到。
icl 是 Intel C++ 编译器,找不到是自然的,你没安装。

但是你设置的 compiler=msvs,应该调用 VS 的 C++ 编译器才对。我也不知道哪里出了问题。

我帮你编译好了一个 lib,你可以直接使用它试试看。如有问题请继续回复。

fftw2xf_double_msvs.zip

11.83 KB, 下载次数: 5

8

帖子

2

主题

0

精华

入门

F 币
52 元
贡献
28 点
 楼主| 发表于 2014-10-29 17:23:24 | 显示全部楼层
楚香饭 发表于 2014-10-29 16:44
icl 找不到。
icl 是 Intel C++ 编译器,找不到是自然的,你没安装。

以之前1楼的程序为例,现在程序编译时不报错了,但是执行完rfftw_f77_create_plan后,plan=0,应该是没create成功。
我将变量由real改为real*8,将 rfftw_f77_* 改为 fftw_f77_* 后,就可以了,只不过逆变换后,与原数据差异很大,而且没有规律,不知道是为什么。
应该是再做一个float型的lib才可以用 rfftw_f77_* ? 您那可以弄吗? 谢谢。

1楼程序改错 Line17:    in(i-1)=ran   ->      in(i)=ran

709

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
596 元
贡献
305 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

发表于 2014-10-29 18:51:16 | 显示全部楼层
先给你做个single的lib,代码结果不对,稍候在调。

fftw2xf_single_msvs.zip

11.84 KB, 下载次数: 4

8

帖子

2

主题

0

精华

入门

F 币
52 元
贡献
28 点
 楼主| 发表于 2014-10-29 19:08:21 | 显示全部楼层
楚香饭 发表于 2014-10-29 18:51
先给你做个single的lib,代码结果不对,稍候在调。

非常感谢,这么晚了还在打扰您的时间。

8

帖子

2

主题

0

精华

入门

F 币
52 元
贡献
28 点
 楼主| 发表于 2014-10-29 19:53:01 | 显示全部楼层
楚香饭 发表于 2014-10-29 18:51
先给你做个single的lib,代码结果不对,稍候在调。

我将Additional Dependencies 改为 fftw2xf_single_msvs.lib 后,又试验了一下,对于 rfftw 还是没反应,create 后 plan=0。
在没有 fftw2xf_double_msvs.lib 情况下,fftw 虽然仍然能用,但结果应该是异常,原数据为0~1,正逆变换后,变为 n*E100+ 。
两个lib都包含了 fftw 和 rfftw 的相关接口,但会有double和single的区别,当工程中同时加入两个lib后,排在第一个的lib作用。
很是奇怪。

100

帖子

0

主题

0

精华

专家

F 币
550 元
贡献
291 点

规矩勋章元老勋章

QQ
发表于 2014-10-30 09:40:01 | 显示全部楼层
站长是个热心人,不怕被打扰
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-3-29 20:02

Powered by Tencent X3.4

© 2013-2024 Tencent

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