gfortran 编译器错误调用递归 log_gamma 函数

gfortran compiler error calling recursive log_gamma function

我上传了一个 2F1 超几何函数,但在我的电脑上无法编译。它来自 this article。我用

GNU Fortran (Built by Jeroen for the R-project) 8.3.0

随 RTools 4.0 一起提供。你能弄清楚为什么它不能编译以及如何解决这个问题吗?在下面的代码中,我只保留了产生错误的一行。接下来给出错误。

MODULE HYP_2F1_MODULE
  !--------------------------------------------------------------------
  IMPLICIT NONE
  INTEGER, PARAMETER :: PR=KIND(1.0D0)
  REAL(PR)     ::  ONE=1.0D0
CONTAINS
  !
END MODULE HYP_2F1_MODULE
!
!----------------------------------------------------------------------
RECURSIVE FUNCTION LOG_GAMMA(Z) RESULT(RES)

  USE HYP_2F1_MODULE
  IMPLICIT NONE
  COMPLEX(PR),INTENT(IN) :: Z
  COMPLEX(PR)  :: RES
  !
     RES = LOG_GAMMA( ONE -z);
  !
END FUNCTION LOG_GAMMA

这是错误信息

 testZ.f90:18:22:

      RES = LOG_GAMMA( ONE - Z);
                 1
Error: 'x' argument of 'log_gamma' intrinsic at (1) must be REAL

有一个同名的 Fortran 2008+ 内部函数

16.9.119 LOG_GAMMA (X)
1 Description. Logarithm of the absolute value of the gamma function.
2 Class. Elemental function.
3 Argument. X shall be of type real. Its value shall not be a negative integer or zero.

这里有一些我不完全理解的冲突。显而易见的解决方法是重命名您的函数。我能说的是,如果没有 result 子句(由于递归属性,您需要它),内在函数将被隐藏。这可能是一个编译器错误。

还要考虑一下,同名的内在函数是否也不能从你的函数中做你需要的事情。

除了@VladimirF 的建议之外,您还可以添加编译器标志 -std=f95 以强制遵守 Fortran 95 标准。如果您还没有添加 -fall-intrinsics 这将禁用 Fortran 95 之后标准中的所有内在函数,并且应该使遗留代码正常工作。