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

时间:2015-07-23 14:15:05

标签: 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)
    ...

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

3 个答案:

答案 0 :(得分:7)

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

我不认为当前的标准或其任何前任明确指出complex将被实现为两个相邻的内存reals。但是,我认为此实施是equivalencecommon标准定义的必然结果。我不认为我曾经遇到过complex没有被实现为reals对的实现。

虽然可以将complex转换为reals对,但标准确实可以保证。所以,给出一些定义:

complex :: z
complex, dimension(4) :: zarr
real :: r1, r2
real, dimension(8) :: rarr

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

r1 = real(z)
r2 = aimag(z)

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

real(zarr)

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

一样
aimag(zarr)

[real(zarr), aimag(zarr)]

是一个8元素的实数数组,其中zarr的实部后跟复杂的部分。也许

rarr(1:8:2) = real(zarr)
rarr(2:8:2) = aimag(zarr)

对你来说没问题。我不知道有什么更简洁的方法可以做到这一点。

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

  

项目(1)中未指定的任何类型的非指针标量对象 - (5)   占用一个未指定的存储单元,每个单元都不同   case和每组类型参数值,这是不同的   第(4)项未指明的存储单元,

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

答案 1 :(得分:4)

要附加到Mark's answer,标准中确实说明了这一点:条款16.5.3.2"存储顺序":

  

2在存储关联上下文中

     

[...]

     

(2)一个双精度实数或非精确对象的非指针标量对象   default complex占用两个连续的数字存储单元

强调我的。

至于存储关联背景:条款16.5.3.1"一般"读取

  

1存储序列用于描述存在的关系   变量,公共块和结果变量之间。存储   关联是发生的两个或多个数据对象的关联   当两个或多个存储序列与一个或多个共享或对齐时   更多的存储单元。

因此,var userTable = $('#result').dataTable({ "aaSorting": [], "bInfo": true, "oSearch": {"sSearch": ""}, "bAutoWidth": false, "bLengthChange": false, "bPaginate": false, "scrollX": true, "aoColumns": [ { "bSearchable": false }, { "bSearchable": false }, null, null, null, ] }); 块,显式common和结果变量会发生这种情况。如Mark's said,一般情况没有明确的陈述。 我的猜测是,最方便的是始终遵循这一点以确保兼容性。

感谢IanH指出这一点!

答案 2 :(得分:1)

不,据我所知。

您可以通过EQUIVALENCE,COMMON和ENTRY语句在实际单精度数组和复杂单精度数组之间建立存储关联。

但一般情况下,您无法将复杂数组传递给需要实数数组的子例程。