调用FFTW2的wrapper lib问题
我在应用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写的算法,为避免出现差异,所以暂时想不改变调用函数。
代码如下
program main
!
integer :: N
parameter (N=80)
real in, var
realout
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
使用 fftw2 的话,你得首先编译 wrappers 接口库。
位于 MKL 安装目录下的 interfaces\fftw2xf 文件夹。
VS 的话,使用命令(以 32 位为例)
nmake libia32 compiler=msvs
编译后可以看到 MKL 目录下的 lib\ia32 里多了一个 lib 文件:fftw2xf_double_msvs.lib
把他添加在工程属性里。同时可能需要忽略 msvcrtd 这个库,如图所示:
之后即可正常编译链接了。
1>Compiling with Intel(R) Visual Fortran Compiler XE 14.0.1.139 ...
1>fftw_F_test.f90
1>Linking...
1>Embedding manifest...
1>
1>Console2 - 0 error(s), 0 warning(s)
========== 全部重新生成:成功 1 个,失败 0 个,跳过 0 个 ========== 楚香饭 发表于 2014-10-28 19:26
使用 fftw2 的话,你得首先编译 wrappers 接口库。
位于 MKL 安装目录下的 interfaces\fftw2xf 文件夹。
谢谢您的回复。
我按您说的,在编译wrappers时,出现错误如下,会是哪里出问题了呢?我先重装一下软件试试。
icl 找不到。
icl 是 Intel C++ 编译器,找不到是自然的,你没安装。
但是你设置的 compiler=msvs,应该调用 VS 的 C++ 编译器才对。我也不知道哪里出了问题。
我帮你编译好了一个 lib,你可以直接使用它试试看。如有问题请继续回复。 楚香饭 发表于 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
先给你做个single的lib,代码结果不对,稍候在调。 楚香饭 发表于 2014-10-29 18:51
先给你做个single的lib,代码结果不对,稍候在调。
非常感谢,这么晚了还在打扰您的时间。 楚香饭 发表于 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作用。
很是奇怪。:-L 站长是个热心人,不怕被打扰
页:
[1]