这个fortran代码最初是用Fortran 77格式编写的(我将在稍后展示)。在我得到它之后,我通过转换工具将其更改为f90自由格式。使用 intel fortran编译器 ifort
,编译和运行与以前一样好。
然后我想做更多,我想将非标准,过时的数据类型声明f77样式转换为f90标准real*8
,complex*16
,如:real(8)
,complex(16)
等。
但我发现了一件令人难以置信的事情。 我刚改变了一个"复杂* 16"进入"复杂(16)",然后运行时间从10秒增加到2分钟。怎么可能!! ?? 有人可以在fortran解释这种异常行为吗?
以下是详情
可以下载源文件 source code download link 1或souce code download link 2
首先,您可以使用ifort编译f90文件,忽略所有警告
ifort -w test-16.f90
并运行
./a.out
它将在大约10秒内完成(取决于您的计算机)。
现在,我们做了一个小改动。转到第734行,此行显示为
Complex *16 ch, clamda, czero, cspw, com, phase, ctemp
它是f77过时的样式,所以将其改为f90标准
Complex(16) ch, clamda, czero, cspw, com, phase, ctemp
以相同的方式编译,ifort将显示错误
/tmp/ifortvaXMFi.o: In function `fite4_':
test-(16).f90:(.text+0x9ecf): undefined reference to `dimag_'
test-(16).f90:(.text+0xa354): undefined reference to `dimag_'
我不知道为什么,但我发现第744行有一个非常可疑的句子
aimag(ctemp) = dimag(ctemp)
我真的不明白什么意思。但整个代码只有三个地方" ctemp"出现。显然,这条线是多余的。所以我们可以安全地删除它。
因此在删除第744行后,编译就可以了。但是我之前说的运行时间增加到超过2分钟。这真是难以置信,这里有什么不对?
答案 0 :(得分:8)
开始使用,然后了解复杂变量的类型值与构成它的实际值的种类相同。
我不能多说,说实话,如果有人发布了一个相对较长的程序,然后告诉我在编译过程中忽略警告,然后解决他们的问题,那么我就不要这样做了。感觉倾向于付出很大的努力。修复警告,将程序减少到最多几十行,然后我,我怀疑大多数其他人,会更仔细地看。