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
语句声明在其参数列表中命名的实体共享相同的存储位置。在这种情况下 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
+----------+----------+----------+----------+----------+----------+
但是 '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 更安全地完成。有关更多信息,您可能想看看我对
的回答
我试图理解 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
语句声明在其参数列表中命名的实体共享相同的存储位置。在这种情况下 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
+----------+----------+----------+----------+----------+----------+
但是 '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 更安全地完成。有关更多信息,您可能想看看我对