我试图理解Fortran 77代码,但偶然发现了代码上的EQUIVALENCE()语句。
以下是代码的一部分:
REAL*8 DATA1(0:N-1)
COMPLEX*16 DATA2(0:N/2-1)
EQUIVALENCE(DATA1, DATA2)
...
...
CALL FFT(DATA1, N/2, -1)
基本上,FFT子程序是一维复数到复数的FFT引擎。在子程序中有一些置换和矩阵向量乘法。
代码稍后以这种方式调用DATA2:
K0=DATA2(0)
K1=DCONJG(DATA2(0))
任何人都可以告诉我为什么使用EQUIVALENCE()语句?我的假设是DATA1,它是REAL,被改为DATA2,它是COMPLEX变量,在FFT子程序上执行了一些改变。但如果是这样,那么DATA2的想象部分呢?因为FFT子程序只包含REAL变量。为什么DATA1和DATA2的数组大小不同?
我在这个论坛中找不到满足我问题的答案。谢谢你的回答。这对我很有帮助。
答案 0 :(得分:3)
equivalence
是Fortran实体的存储关联的两个功能之一。 (另一个是common
块,我将在这里保持沉默。 equivalence
语句声明其参数列表中指定的实体共享相同的存储位置。在这种情况下,data1
和data2
共享相同的内存位置。
如果您有检查内存位置的工具并将其指向data1
,您会看到以下内容:
+----------+----------+----------+----------+----------+----------+
| | | | | |
| data1(0) | data1(1) | data1(2) | data1(3) | data1(4) | data1(...
| | | | | |
+----------+----------+----------+----------+----------+----------+
将同一工具指向data2
,您会看到类似这样的内容
+----------+----------+----------+----------+----------+----------+
| | |
| data2(0) | data2(1) | data2(....
| re im | re im | re im
+----------+----------+----------+----------+----------+----------+
但'真相'更像是
+----------+----------+----------+----------+----------+----------+
| | |
| data1(0) data1(1) | data1(2) data1(3) | data1(4) data1(...
| | |
| data2(0) | data2(1) | data2(....
| re im | re im | re im
+----------+----------+----------+----------+----------+----------+
data1(0)
与data2(0)
的真实组件位于同一位置。 data1(1)
是data2(0)
的虚构成分,依此类推。
这是偶然遇到的equivalence
应用程序之一 - 能够在查看数据complex
或成对reals
之间切换。但是,它不仅限于这种类型转换,没有什么可以说你不能等价整数和实数,或任何其他类型。
偶尔会看到的另一个用途是使用equivalence
将数组从一个等级重新映射到另一个等级。例如,给定
integer, dimension(3,2) :: array2
integer, dimension(6) :: array1
和
equivalence(array1(1),array2(1,1))
可以将相同的元素视为属于rank-2数组或rank-1数组,以满足程序的需要。
equivalence
这些天通常不赞成,现代Fortran可以更安全地完成它所使用的大部分内容。有关更多信息,您可能需要查看我对Is the storage of COMPLEX in fortran guaranteed to be two REALs?