GFortran:不在 f03 和 f90 之间传递数组?
GFortran: Not passing arrays between f03 and f90?
我是 Fortran 编程的新手,但我已经开始使用 code::blocks 和 Fortran 插件。
我正在尝试在我的代码 (f03) 和 fftsg.f(代码来自
http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html) 来计算 fft。
fftsg.f 包含一个名为 rdft(实离散傅里叶变换)的子程序,我尝试用它来计算输入信号的 fft。
我的代码如下所示:
program hello
use fftsg ! module containing all of the code in fftsg.f
implicit none
integer :: i
integer,parameter :: n=1024 ! size of the input / output
real(8), dimension(n,2) :: curve1
real(8), dimension(0:n-1) :: curvefft ! data -> rdft -> fft
integer :: ip(0:2+2**(int(log(n/2+0.5)/log(2.0))/2)) ! size specified in fftsg.f
real(8) :: w(0:n/2-1) ! size specified in fftsg.f
integer :: N_fft,isgn ! variables specified fftsg.f
N_fft = 2*n
curve1(:,1) = (/(i*0.001D0,i=0,n-1)/) ! x-axis
curve1(:,2) = sin(40*curve1(:,1))*curve1(:,1)**2 ! sine curve
curvefft(0:n-1) = curve1(:,2) ! input/output to rdft
ip(0) = 0
isgn = 1
call rdft(N_fft,isgn,curvefft,ip,w)
end program
程序编译没有错误或警告(与 fftsg.f 在 code::blocks 中的同一项目中,但在 运行.
时发生错误
调试显示标量 (N_fft, isgn
) 都将它们的值传递给 rdft
,但是传递了数组 (curvefft, ip, w
) 中的 none 个值沿(它们仅显示为大小为 1 的数组,并且值不正确)。
fftsg
模块看起来(压缩)如下:
module fftsg
contains
subroutine rdft(n, isgn, a, ip, w)
integer n, isgn, ip(0 : *), nw, nc
real*8 a(0 : n - 1), w(0 : *), xi
...
end
end module fftsg
有人可以帮忙吗?出了什么问题?结合f03和f90代码有什么用吗?
我不确定我是否完全理解 fftsg 中的代码,但如果我可以将正确的数组传递给 fftsg,这可能是一个开始...
非常感谢任何帮助!
根据声明,子程序 rdft() 似乎使用 a(0:n-1)
subroutine rdft(n, isgn, a, ip, w)
integer n, isgn, ip(0 : *), nw, nc
real*8 a(0 : n - 1), w(0 : *), xi
但实际参数似乎不一致,因为 N_fft 是 2*size(curvefft)。
integer,parameter :: n=1024
real(8), dimension(0:n-1) :: curvefft
integer :: N_fft,isgn
N_fft = 2*n
call rdft(N_fft,isgn,curvefft,ip,w)
我是 Fortran 编程的新手,但我已经开始使用 code::blocks 和 Fortran 插件。
我正在尝试在我的代码 (f03) 和 fftsg.f(代码来自 http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html) 来计算 fft。
fftsg.f 包含一个名为 rdft(实离散傅里叶变换)的子程序,我尝试用它来计算输入信号的 fft。
我的代码如下所示:
program hello
use fftsg ! module containing all of the code in fftsg.f
implicit none
integer :: i
integer,parameter :: n=1024 ! size of the input / output
real(8), dimension(n,2) :: curve1
real(8), dimension(0:n-1) :: curvefft ! data -> rdft -> fft
integer :: ip(0:2+2**(int(log(n/2+0.5)/log(2.0))/2)) ! size specified in fftsg.f
real(8) :: w(0:n/2-1) ! size specified in fftsg.f
integer :: N_fft,isgn ! variables specified fftsg.f
N_fft = 2*n
curve1(:,1) = (/(i*0.001D0,i=0,n-1)/) ! x-axis
curve1(:,2) = sin(40*curve1(:,1))*curve1(:,1)**2 ! sine curve
curvefft(0:n-1) = curve1(:,2) ! input/output to rdft
ip(0) = 0
isgn = 1
call rdft(N_fft,isgn,curvefft,ip,w)
end program
程序编译没有错误或警告(与 fftsg.f 在 code::blocks 中的同一项目中,但在 运行.
时发生错误调试显示标量 (N_fft, isgn
) 都将它们的值传递给 rdft
,但是传递了数组 (curvefft, ip, w
) 中的 none 个值沿(它们仅显示为大小为 1 的数组,并且值不正确)。
fftsg
模块看起来(压缩)如下:
module fftsg
contains
subroutine rdft(n, isgn, a, ip, w)
integer n, isgn, ip(0 : *), nw, nc
real*8 a(0 : n - 1), w(0 : *), xi
...
end
end module fftsg
有人可以帮忙吗?出了什么问题?结合f03和f90代码有什么用吗?
我不确定我是否完全理解 fftsg 中的代码,但如果我可以将正确的数组传递给 fftsg,这可能是一个开始...
非常感谢任何帮助!
根据声明,子程序 rdft() 似乎使用 a(0:n-1)
subroutine rdft(n, isgn, a, ip, w)
integer n, isgn, ip(0 : *), nw, nc
real*8 a(0 : n - 1), w(0 : *), xi
但实际参数似乎不一致,因为 N_fft 是 2*size(curvefft)。
integer,parameter :: n=1024
real(8), dimension(0:n-1) :: curvefft
integer :: N_fft,isgn
N_fft = 2*n
call rdft(N_fft,isgn,curvefft,ip,w)