gfortran用双复变量编译问题

时间:2017-07-29 10:23:25

标签: compiler-errors fortran double gfortran complex-numbers

我一直在尝试编译程序并遇到一个看起来很简单的问题。但是,我还没能解决它。任何想法都非常感谢。该程序如下所示,

代码:

  subroutine rescal(zy,nvar)

  integer nvar,i, nexponent
  double complex zy(nvar)
  double precision maxabs, scalfac

  maxabs = 0.d0
  do i = 1, nvar
    maxabs = max(zabs(zy),maxabs)
  enddo

maxabs((rank 0))应该存储zymaxabs的最大值。简单,对吧?

我尝试使用gfortran编译此程序并收到以下错误。我不明白为什么编译器抱怨maxabs应该是1级而不是0级。据我所知,zabs是使用双精度复数的正确函数。< / p>

gfortran -e -Ofast -ffixed-line-length-none -std=legacy -c -o rescal.o rescal.f
rescal.f:13.8:

maxabs = max(zabs(zy),maxabs)
1
Error: Incompatible ranks 0 and 1 in assignment at (1)
make: *** [rescal.o] Error 1

1 个答案:

答案 0 :(得分:1)

max是一个元素函数,给定一个数组参数返回一个数组结果。那么,你的问题是zabs(zy)是一个数组。

简单地说,您在循环时错过了选择zy的元素:

do i = 1, nvar
  maxabs = max(zabs(zy(i)),maxabs)  ! Select the i-th element of zy
enddo

那说了几点:

  • 您可以使用通用zabs;
  • 来避免使用非标准特定abs
  • maxval功能可用。

你可以改为

maxabs = MAXVAL(ABS(zy))