如何使用现代 Fortran 中的 FFTW 智慧
How to use FFTW wisdom from modern Fortran
我想使用 FFTW 智慧系统来记住工作之间的 FFTW 计划。来自 C 程序的智慧的使用记录在此处:http://www.fftw.org/fftw2_doc/fftw_2.html 对于 C,相关字符串将被修改为 FFTW_MEASURE | FFTW_USE_WISDOM
。我试图在这里效仿:
!! to compile: gfortran -O3 --fast-math -I/usr/include -o usewisdom usewisdom.f90 -lfftw3
Module FFTW3
use, intrinsic :: iso_c_binding
include 'fftw3.f03'
End Module FFTW3
Program usewisdom
use FFTW3
integer (kind=c_int), parameter :: nx=2048,ny=2048,np=ny/2+1
real (kind=c_double) :: omega(ny,nx)=1.d0
complex (kind=c_double_complex) :: fftomega(np,nx)
ier=fftw_import_wisdom_from_filename("wisdom")
print *,"wisdom output should not be 0:",ier
call dfftw_plan_dft_r2c_2d(fwd,ny,nx,omega,fftomega,&
&FFTW_PATIENT | FFTW_USE_WISDOM)
call dfftw_execute_dft_r2c(fwd,omega,fftomega) !rem clobbers omega
End Program usewisdom
但是 gfortran 不喜欢这个字符串:
gfortran -O3 --fast-math -I/usr/include -o usewisdom usewisdom.f90 -lfftw3
usewisdom.f90:16:21:
&FFTW_PATIENT | FFTW_USE_WISDOM)
1
Error: Syntax error in argument list at (1)
有什么建议吗?
根据 Modern Fortran interface documentation:
Multiple planner flags are combined with ior
(equivalent to ‘|
’ in C). e.g. FFTW_MEASURE | FFTW_DESTROY_INPUT
becomes ior(FFTW_MEASURE, FFTW_DESTROY_INPUT)
. (You can also use ‘+
’ as long as you don’t try to include a given flag more than once.)
因此,您应该包括 FFTW_USE_WISDOM
规划器标志,如下所示:
call dfftw_plan_dft_r2c_2d(fwd,ny,nx,omega,fftomega,&
&ior(FFTW_PATIENT, FFTW_USE_WISDOM))
或
call dfftw_plan_dft_r2c_2d(fwd,ny,nx,omega,fftomega,&
&FFTW_PATIENT + FFTW_USE_WISDOM)
请注意,用于组合标志的类似语法也可用于旧版 Fortran,如 this section of the documentation 中所述。
我想使用 FFTW 智慧系统来记住工作之间的 FFTW 计划。来自 C 程序的智慧的使用记录在此处:http://www.fftw.org/fftw2_doc/fftw_2.html 对于 C,相关字符串将被修改为 FFTW_MEASURE | FFTW_USE_WISDOM
。我试图在这里效仿:
!! to compile: gfortran -O3 --fast-math -I/usr/include -o usewisdom usewisdom.f90 -lfftw3
Module FFTW3
use, intrinsic :: iso_c_binding
include 'fftw3.f03'
End Module FFTW3
Program usewisdom
use FFTW3
integer (kind=c_int), parameter :: nx=2048,ny=2048,np=ny/2+1
real (kind=c_double) :: omega(ny,nx)=1.d0
complex (kind=c_double_complex) :: fftomega(np,nx)
ier=fftw_import_wisdom_from_filename("wisdom")
print *,"wisdom output should not be 0:",ier
call dfftw_plan_dft_r2c_2d(fwd,ny,nx,omega,fftomega,&
&FFTW_PATIENT | FFTW_USE_WISDOM)
call dfftw_execute_dft_r2c(fwd,omega,fftomega) !rem clobbers omega
End Program usewisdom
但是 gfortran 不喜欢这个字符串:
gfortran -O3 --fast-math -I/usr/include -o usewisdom usewisdom.f90 -lfftw3
usewisdom.f90:16:21:
&FFTW_PATIENT | FFTW_USE_WISDOM)
1
Error: Syntax error in argument list at (1)
有什么建议吗?
根据 Modern Fortran interface documentation:
Multiple planner flags are combined with
ior
(equivalent to ‘|
’ in C). e.g.FFTW_MEASURE | FFTW_DESTROY_INPUT
becomesior(FFTW_MEASURE, FFTW_DESTROY_INPUT)
. (You can also use ‘+
’ as long as you don’t try to include a given flag more than once.)
因此,您应该包括 FFTW_USE_WISDOM
规划器标志,如下所示:
call dfftw_plan_dft_r2c_2d(fwd,ny,nx,omega,fftomega,&
&ior(FFTW_PATIENT, FFTW_USE_WISDOM))
或
call dfftw_plan_dft_r2c_2d(fwd,ny,nx,omega,fftomega,&
&FFTW_PATIENT + FFTW_USE_WISDOM)
请注意,用于组合标志的类似语法也可用于旧版 Fortran,如 this section of the documentation 中所述。