尝试使用 netlib 代码 (QUADPACK)。什么是错误?
Trying to use netlib code (QUADPACK). What is xerror?
我正在尝试弄清楚如何使用 quadpack。
在一个文件夹中,我找到了“qag.f plus dependencies”的内容,代码如下 qag_test.f:
(也许这段代码本身不是很重要。这实际上只是 quadpack document 中的一个片段)
REAL A,ABSERR,B,EPSABS,EPSREL,F,RESULT,WORK
INTEGER IER,IWORK,KEY,LAST,LENW,LIMIT,NEVAL
DIMENSION IWORK(100),WORK(400)
EXTERNAL F
A = 0.0E0
B = 1.0E0
EPSABS = 0.0E0
EPSREL = 1.0E-3
KEY = 6
LIMIT = 100
LENW = LIMIT*4
CALL QAG(F,A,B,EPSABS,EPSREL,KEY,RESULT,ABSERR,NEVAL,
* IER,LIMIT,LENW,LAST,IWORK,WORK)
C INCLUDE WRITE STATEMENTS
STOP
END
C
REAL FUNCTION F(X)
REAL X
F = 2.0E0/(2.0E0+SIN(31.41592653589793E0*X))
RETURN
END
使用 gfortran *.f
(安装为 MinGW 64 位),我得到:
C:\Users\username\AppData\Local\Temp\ccIQwFEt.o:qag.f:(.text+0x1e0): undefined re
ference to `xerror_'
C:\Users\username\AppData\Local\Temp\cc6XR3D0.o:qage.f:(.text+0x83): undefined re
ference to `r1mach_'
(and a lot more of the same r1mach_ error)
好像是r1mach is a part of BLAS (and I don't know why it's not packaged in here,但得到的是"auxiliary"),但是xerror是什么?
如何在我的环境 Win7 64 位(希望没有 Cygwin)中正确编译此代码段?
非常感谢您的帮助。
xerror 是一个错误报告例程。查看它的调用方式,它似乎使用了 Hollerith 常数("foo"
写成 3hfoo
的常数)。
if(ier.ne.0) call xerror(26habnormal return from qag ,
* 26,ier,lvl)
xerror 依次调用 xerrwv,传递参数(加上更多)。
这绝对是在 Fortran 77 普及之前写的。
你最好的选择是使用仍然支持 Hollerith 常量的编译器,引入所有依赖项(xeerwv 还有一些,我不知道你为什么不从 netlib 中获取它们)和 运行 它通过你选择的编译器。大多数编译器,包括 gfortran,都支持 Hollerith;忽略警告:-)
您可能需要修改一个例程,即xerprt。使用 gfortran,您可以将其写为
subroutine xerprt(c,n)
character(len=1), dimension(n) :: c
write (*,'(500A)') c
end subroutine xerprt
并将这个放到一个单独的文件中,这样编译器就不会发现等级违规(我知道,我知道...)
我正在尝试弄清楚如何使用 quadpack。
在一个文件夹中,我找到了“qag.f plus dependencies”的内容,代码如下 qag_test.f:
(也许这段代码本身不是很重要。这实际上只是 quadpack document 中的一个片段)
REAL A,ABSERR,B,EPSABS,EPSREL,F,RESULT,WORK
INTEGER IER,IWORK,KEY,LAST,LENW,LIMIT,NEVAL
DIMENSION IWORK(100),WORK(400)
EXTERNAL F
A = 0.0E0
B = 1.0E0
EPSABS = 0.0E0
EPSREL = 1.0E-3
KEY = 6
LIMIT = 100
LENW = LIMIT*4
CALL QAG(F,A,B,EPSABS,EPSREL,KEY,RESULT,ABSERR,NEVAL,
* IER,LIMIT,LENW,LAST,IWORK,WORK)
C INCLUDE WRITE STATEMENTS
STOP
END
C
REAL FUNCTION F(X)
REAL X
F = 2.0E0/(2.0E0+SIN(31.41592653589793E0*X))
RETURN
END
使用 gfortran *.f
(安装为 MinGW 64 位),我得到:
C:\Users\username\AppData\Local\Temp\ccIQwFEt.o:qag.f:(.text+0x1e0): undefined re
ference to `xerror_'
C:\Users\username\AppData\Local\Temp\cc6XR3D0.o:qage.f:(.text+0x83): undefined re
ference to `r1mach_'
(and a lot more of the same r1mach_ error)
好像是r1mach is a part of BLAS (and I don't know why it's not packaged in here,但得到的是"auxiliary"),但是xerror是什么?
如何在我的环境 Win7 64 位(希望没有 Cygwin)中正确编译此代码段?
非常感谢您的帮助。
xerror 是一个错误报告例程。查看它的调用方式,它似乎使用了 Hollerith 常数("foo"
写成 3hfoo
的常数)。
if(ier.ne.0) call xerror(26habnormal return from qag ,
* 26,ier,lvl)
xerror 依次调用 xerrwv,传递参数(加上更多)。
这绝对是在 Fortran 77 普及之前写的。
你最好的选择是使用仍然支持 Hollerith 常量的编译器,引入所有依赖项(xeerwv 还有一些,我不知道你为什么不从 netlib 中获取它们)和 运行 它通过你选择的编译器。大多数编译器,包括 gfortran,都支持 Hollerith;忽略警告:-)
您可能需要修改一个例程,即xerprt。使用 gfortran,您可以将其写为
subroutine xerprt(c,n)
character(len=1), dimension(n) :: c
write (*,'(500A)') c
end subroutine xerprt
并将这个放到一个单独的文件中,这样编译器就不会发现等级违规(我知道,我知道...)