为什么改变"复杂* 16"到#34;复杂(16)"导致运行时在fortran中不合理地增加?

时间:2015-10-04 16:29:23

标签: fortran declaration fortran77 intel-fortran

这个fortran代码最初是用Fortran 77格式编写的(我将在稍后展示)。在我得到它之后,我通过转换工具将其更改为f90自由格式。使用 intel fortran编译器 ifort,编译和运行与以前一样好。

然后我想做更多,我想将非标准,过时的数据类型声明f77样式转换为f90标准real*8complex*16,如:real(8)complex(16)等。

但我发现了一件令人难以置信的事情。 我刚改变了一个"复杂* 16"进入"复杂(16)",然后运行时间从10秒增加到2分钟。怎么可能!! ?? 有人可以在fortran解释这种异常行为吗?

以下是详情

可以下载源文件 source code download link 1souce 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分钟。这真是难以置信,这里有什么不对?

1 个答案:

答案 0 :(得分:8)

亲爱的,亲爱的。类型值与变量占用的字节数不同。在大多数(但不是全部)编译器中,复杂(16)是四倍精度(在支持的情况下),这就是为什么你的运行时间通过屋顶。请了解实物价值,例如参见

Fortran 90 kind parameter

开始使用,然后了解复杂变量的类型值与构成它的实际值的种类相同。

我不能多说,说实话,如果有人发布了一个相对较长的程序,然后告诉我在编译过程中忽略警告,然后解决他们的问题,那么我就不要这样做了。感觉倾向于付出很大的努力。修复警告,将程序减少到最多几十行,然后我,我怀疑大多数其他人,会更仔细地看。