fortran中COMPLEX的存储是否保证为两个REAL?

gau*_*teh 3 fortran fft

许多FFT算法利用存储在阵列中交替的实部和虚部的复数.通过创建一个COMPLEX数组并将其传递给FFT例程,是否可以保证它可以使用交替的实部和虚部组件转换为REAL数组(大小的两倍)?

    subroutine fft (data, n, isign)
      dimension data(2*n)

      do 1 i=1,2*n,2
        data(i) = ..
        data(i+1) = ..
 1    continue
    return
    end

    ...
    complex s(n)
    call fft (s, n, 1)
    ...
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,维度数据(2*n)与说它是真实相同吗?)

Hig*_*ark 7

我只是写这个答案,因为经验告诉我,一旦我写下这种答案,真正的Fortran专家就会找到一个纠正我的方法.

我不认为当前的标准,也没有任何前任,明确指出a complex将被实现为两个相邻的内存reals.但是,我认为这是执行的标准的定义的必然结果equivalencecommon.我不认为我曾经遇到过一个实现,其中a complex没有被实现为一对reals.

标准确实保证,尽管a complex可以转换成一对reals.所以,给出一些定义:

complex :: z
complex, dimension(4) :: zarr
real :: r1, r2
real, dimension(8) :: rarr
Run Code Online (Sandbox Code Playgroud)

以下将做你可能期望的事情

r1 = real(z)
r2 = aimag(z)
Run Code Online (Sandbox Code Playgroud)

这两个功能都是基本的,这里有一个皱纹:

real(zarr)
Run Code Online (Sandbox Code Playgroud)

返回一个4元素的实数数组,就像这样

aimag(zarr)
Run Code Online (Sandbox Code Playgroud)

[real(zarr), aimag(zarr)]
Run Code Online (Sandbox Code Playgroud)

是一个8元素的实数数组,其中zarr包含复杂部分的实部.也许

rarr(1:8:2) = real(zarr)
rarr(2:8:2) = aimag(zarr)
Run Code Online (Sandbox Code Playgroud)

会对你好的.我不确定是否有任何更简洁的方法来做到这一点.

亚历山大并不是唯一能够引用标准的人!他引用的部分让我想知道非默认的复杂标量.所以我继续阅读,我认为他指出我们的第6段是密切相关的

(1) - (5)中未指定的任何类型的非指针标量对象占用单个未指定的存储单元,该存储单元对于每种情况和每组类型参数值是不同的,并且与项目的未指定存储单元不同( 4),

我不认为这对这里的任何答案都有任何影响.