Fortran 77 中的等价性(实数和复数变量)

Equivalence in fortran 77 (real and complex variable)

我试图理解 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,它是复杂变量,在 FFT 子程序上执行了一些更改。但如果是这样,DATA2 的虚部又如何呢?因为 FFT 子程序只包含 REAL 变量。为什么 DATA1 和 DATA2 的数组大小不同?

我在这个论坛找不到任何答案可以满足我的问题。感谢您的回答。这对我有很大帮助。

equivalence 是 Fortran 的两个 存储关联 实体的功能之一。 (另一个是 common 块,关于这个话题我将在这里保持沉默)。 equivalence 语句声明在其参数列表中命名的实体共享相同的存储位置。在这种情况下 data1data2 共享相同的内存位置。

如果您有检查内存位置的工具并将其指向 data1,您会看到类似这样的内容:

+----------+----------+----------+----------+----------+----------+
|          |          |          |          |          |
| data1(0) | data1(1) | data1(2) | data1(3) | data1(4) | data1(...
|          |          |          |          |          |
+----------+----------+----------+----------+----------+----------+

将同一工具指向 data2,您将看到类似这样的内容

+----------+----------+----------+----------+----------+----------+
|                     |                     |                     
|        data2(0)     |        data2(1)     |        data2(....         
|   re          im    |   re          im    |   re          im    
+----------+----------+----------+----------+----------+----------+

但是 'truth' 更像

+----------+----------+----------+----------+----------+----------+
|                     |                     |          
| 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 更安全地完成。有关更多信息,您可能想看看我对

的回答