【问题标题】:Gfortran complex actual to real dummy argumentGfortran 复杂的实际到真实的虚拟参数
【发布时间】:2015-05-11 05:51:51
【问题描述】:

我正在尝试将 fftpack 与 gfortran 一起使用,但我遇到了一些错误,我认为这些错误与当虚拟参数被声明为真实时某些例程传递复杂数组有关。

我在 intel fortran 页面上阅读了一条评论,可以禁用“检查例程接口”。有谁知道gfortran是否有类似的选项?

我不想编辑fftpack ...(我想这是因为内存中的复数由两个实数表示,并且数组参数作为引用传递,但如果我错了请纠正我:))

[详细说明并与 cmets 会面...] 因此,在从 netlib 下载 dfftpack 并编译为独立文件(我按下 f77)后,所有子例程都在同一个文件中,例如在

   SUBROUTINE DFFTF (N,R,WSAVE)
   IMPLICIT DOUBLE PRECISION (A-H,O-Z)
   DIMENSION       R(1)       ,WSAVE(1)
   IF (N .EQ. 1) RETURN
   CALL RFFTF1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1))
   RETURN
   END

当调用CALL RFFTF1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1)) 时出现警告。 RFFTF1的开头是这样的……

SUBROUTINE RFFTF1 (N,C,CH,WA,IFAC)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
DIMENSION       CH(*)      ,C(*)       ,WA(*)      ,IFAC(*)

并且编译的警告将实际参数WSAVE(2*N+1) 击中 - 到虚拟参数IFAC:(来自代码::blocks 构建日志窗口的输出)

 mingw32-gfortran.exe -Jobj\Debug\  -Wall -g     -c
 C:\... \dfftpack.f -o obj\Debug\dfftpack.o
 C:\... \dfftpack.f:345.40:
 CALL RFFTB1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1))                   
                                   1 Warning: Type mismatch in argument 
'ifac' at (1); passed REAL(8) to INTEGER(4)

我认为这会导致不正确的结果..(将实数传递给整数似乎不是转换/舍入到最接近的整数,而是转换为其他值。有谁知道它是否应该在调用中四舍五入,例如: NINT(WSAVE(2*N+1))?

【问题讨论】:

  • 如果例程有一个实数数组哑元参数,那么放置一个复数数组实数参数并告诉编译器“相信我,我知道我在做什么”似乎有趣。也许您只是想传递复合体的真正组成部分?
  • 据我所知,Steve Lionels 在这里的评论 software.intel.com/en-us/forums/topic/289586 似乎很常见......
  • 很公平。正如还评论的那样,这不是合法的事情,但如果您确定这是您想要做的事情,那么某人确实可以提出类似的选择。
  • @ErikThysell 您在这里使用其中一种例程吗? netlib.org/fftpack
  • @roygvib 我想我使用的是我在某处找到的 f90 双精度版本。我从 netlib 下载了 .f 版本,并将所有函数放在一个 .f 文件中,然后编译为一个 .o 文件,尽管有很多关于实数到整数转换的警告..

标签: fortran fft gfortran complex-numbers real-datatype


【解决方案1】:

我在将 FFTPACK 5.1 从 FORTRAN 77 重构为 Fortran 2008 时遇到了这个问题。我执行了 C 语言风格的强制转换而不复制,如下所示:

use ISO_C_binding, only: c_f_pointer, c_loc

integer, parameter :: N = 42
complex, target    :: c(N) ! Also works for the allocatable attribute
real, pointer      :: r(:) => null()

! Pass memory address from complex array to real array
call c_f_pointer(c_loc(c), r, shape=[2*size(c)])

call procedure_expecting_real_arg(r, ....)

! Terminate association
nullify( r )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 2014-11-28
    • 2012-02-07
    • 1970-01-01
    • 2014-12-18
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多