我是 FORTRAN 的绝对初学者,我煞费苦心地将一个 1000 行的 FORTRAN 源文件转换为 MATLAB 供我自己使用。到目前为止,我通过放入大量PRINT
语句来跟踪变量并确保数学正常工作,这一切都很好。我在 FORTRAN 中遇到了一件我无法解决的奇怪事情。
有一个子程序被定义为
subroutine addprc
complex tmat,b,ci,c1,c2,cim,ab1(50),ab2(50),acans(10,2),fg1(50),fg2(50)
common dtr,rtd,pi
common /mtxcom/ nrank,nranki,tmat(50,50),b(50,50),cmxnrm(25)
common /cmvcom/ nm,kmv,cmv,twm,prodm
下面还有更多common
和dimension
分配,但它们不应该是相关的。第一次ab1(50)
定义数组是在这个子程序中。对于我的 MATLAB 脚本,我已将其初始化为ab1=zeros(1,50);
. 然后在此循环中使用它(在 FORTRAN 中):
do 20 n = 1,nrank
np = n+nrank
cn = real(n)
n1 = n+1
c1 = 4.0*ci**n
c2 = 4.0*ci**n1
p1 = cn*costh*pnmllg(n1)-(cn+cmv)*pnmllg(n)
p2 = cmv*pnmllg(n1)
ab1(n-ij) = c1*p2*uu1
ab1(np-ijt) = -c2*p1*uu1
ab2(n-ij) = -c1*p1*uu2
ab2(np-ijt) = c2*p2*uu2
此时我已经检查了所有其他变量的值,它们与我的 MATLAB 脚本一致。向后工作我发现了ab1
已经包含值的问题。循环之前的打印命令,例如
PRINT *,'before ab1', SUM(ab1)
do 20 n = 1,1
返回(107.500008, 5.38305187)
。它是一个复数,所以这两个值都很好,但它里面有什么东西不好吗?事实上,唯一ab1
使用的时间就是在这段代码中。
我在这里有什么遗漏吗?我查看了源文件 (ctrl-f:ab1) 以找到它的任何实例。原始源代码是一个 .for 文件,我在 Eclipse 下使用 gfortran 编译了它们。谢谢你的时间。