正在尝试使用netlib代码(故障诊断灯)。什么是xerror? [英] Trying to use netlib code (QUADPACK). What is xerror?

查看:0
本文介绍了正在尝试使用netlib代码(故障诊断灯)。什么是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:UsersusernameAppDataLocalTempccIQwFEt.o:qag.f:(.text+0x1e0): undefined re
ference to `xerror_'
C:UsersusernameAppDataLocalTempcc6XR3D0.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(我也不知道为什么不打包成here而是作为辅助获取),但什么是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

并将这个文件放到一个单独的文件中,这样编译器就不会捕获排名冲突(我知道,我知道...)

这篇关于正在尝试使用netlib代码(故障诊断灯)。什么是xerror?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆