'dlantr' (1) 不是函数
'dlantr' at (1) is not a function
我在尝试使用 Lapack 函数 dlantr
计算三角矩阵的范数时遇到了一个奇怪的问题。基本上,我有一个工作的单文件程序,里面有 dlantr
和一些其他 Lapack 程序,现在我想把它分成模块。 dlantr
在这样一个模块的子程序中结束。但是,尝试使用 gfortran-10 编译所述模块(通过 MPI 包装器编译器,因为那里也有一些 MPI),如
mpifort -o kde.o -c kde.f90
导致错误:
‘dlantr’ at (1) is not a function
这很奇怪,因为
- 同一个子例程中的其他 Lapack 程序(在我的例子中
dtrtri
和 dpotrf
)工作正常
- 同一个模块中的一个简单子程序,如
subroutine foo(a)
real(kind=DP), intent(in) :: a(2,2)
real(kind=DP) :: tmp, dlantr
print*, dlantr('F','L','N',2,2,a,2,tmp)**2
end subroutine
从主程序调用时也能正常工作。在出现问题的子程序中,声明方式同上,在原程序中,即
real(kind=DP) :: ..., dlantr, ...
可以找到有问题的代码here。是什么导致了这种行为,如何解决?
我原来的回答是错误的。这是一个编译器错误,可能 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87127。不过,这种显式使用 external
属性的解决方法可以使错误消失:
real(kind=DP), external :: dlantr
此错误的 MWE 是:
subroutine sub
integer :: d
real :: f
real :: a
associate (c => d)
a = f()
end associate
end subroutine sub
我在尝试使用 Lapack 函数 dlantr
计算三角矩阵的范数时遇到了一个奇怪的问题。基本上,我有一个工作的单文件程序,里面有 dlantr
和一些其他 Lapack 程序,现在我想把它分成模块。 dlantr
在这样一个模块的子程序中结束。但是,尝试使用 gfortran-10 编译所述模块(通过 MPI 包装器编译器,因为那里也有一些 MPI),如
mpifort -o kde.o -c kde.f90
导致错误:
‘dlantr’ at (1) is not a function
这很奇怪,因为
- 同一个子例程中的其他 Lapack 程序(在我的例子中
dtrtri
和dpotrf
)工作正常 - 同一个模块中的一个简单子程序,如
subroutine foo(a)
real(kind=DP), intent(in) :: a(2,2)
real(kind=DP) :: tmp, dlantr
print*, dlantr('F','L','N',2,2,a,2,tmp)**2
end subroutine
从主程序调用时也能正常工作。在出现问题的子程序中,声明方式同上,在原程序中,即
real(kind=DP) :: ..., dlantr, ...
可以找到有问题的代码here。是什么导致了这种行为,如何解决?
我原来的回答是错误的。这是一个编译器错误,可能 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87127。不过,这种显式使用 external
属性的解决方法可以使错误消失:
real(kind=DP), external :: dlantr
此错误的 MWE 是:
subroutine sub
integer :: d
real :: f
real :: a
associate (c => d)
a = f()
end associate
end subroutine sub