2015-04-04 134 views
0

我需要运行在此处找到的旧程序:http://netlib.sandia.gov/conformal/,其标题为“kirch1”。我完全没有运行fortran代码的经验,但我想从我的Mac OS X 10.10命令行中这样做。在旧代码上使用gfortran编译

我知道我的系统上安装了'gfortan'编译器,但我不确定这是不是像这个旧代码。当我运行gfortran KIRCH1.f(该文件是上面的那个),我收到以下错误:

KIRCH1.f:266.8: 

     x(2) = -1. + dx             
     1 
Warning: Array reference at (1) is out of bounds (2 > 1) in dimension 1 
KIRCH1.f:200.21: 

     common /param1/ nq2,c2,x2(20),z2(20),qwork2(460),betam2(20)  
        1 
Warning: Padding of 4 bytes required before 'c2' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons 
KIRCH1.f:285.21: 

     common /param1/ nq,c,x(20),z(20),qwork(460),betam(20)    
        1 
Warning: Padding of 4 bytes required before 'c' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons 
Undefined symbols for architecture x86_64: 
    "_gaussj_", referenced from: 
     _qinitx_ in ccoKtvwZ.o 
    "_ns01a_", referenced from: 
     _ksolv_ in ccoKtvwZ.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 

这个错误似乎是做在代码的语法?我怀疑代码本身有什么问题,所以我想它与我的代码系统解释有关(因为没有更好的方法来表示这个)

我没有Fortran编程经验,我应该提到。我究竟做错了什么?

编辑

正如埃德·史密斯 建议我跑gfortran sclibdbl.f KIRCH1.f,但我仍然得到以下警告:

KIRCH1.f:266.8: 

     x(2) = -1. + dx             
     1 
Warning: Array reference at (1) is out of bounds (2 > 1) in dimension 1 
KIRCH1.f:200.21: 

     common /param1/ nq2,c2,x2(20),z2(20),qwork2(460),betam2(20)  
        1 
Warning: Padding of 4 bytes required before 'c2' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons 
KIRCH1.f:285.21: 

     common /param1/ nq,c,x(20),z(20),qwork(460),betam(20)    
        1 
Warning: Padding of 4 bytes required before 'c' in COMMON 'param1' at (1); reorder elements or use -fno-align-commons 
+0

那些第一件事情不是错误,而是警告(基于编写代码的旧方法)。您的错误来自链接器。为了解决这个问题,你需要找到一些指令:至少告诉你在哪里可以找到引用的其他函数/子程序。 – francescalus 2015-04-04 17:01:36

+0

啊,我看到谢谢。这些子程序可以在http://www.netlib.org/conformal/sclibdbl找到。我需要做些什么来将它们连接在一起? – Jack 2015-04-04 17:05:50

+0

链接的代码使用旧规则声明假定大小(伪参数)数组的维数为'1',例如:'double precision x(1)'。您可以放心地忽略该警告,关闭边界检查或将这些声明更改为'double precision x(*)'。 – agentp 2015-04-06 19:02:58

回答

2

以下编译对我来说:

gfortran sclibdbl.f KIRCH1.f 

其中KIRCH1.f是来自http://netlib.sandia.gov/conformal/kirch1sclibdb1.f的代码是t他编码http://netlib.org/conformal/sclibdbl

您只是缺少在KIRCH1源代码中引用但包含在sclibdbl中的必需的子程序gaussjns01a。来自netlib.org/conformal/sclibdbl的代码包括gaussjns01a子例程(注意gfortran中缺省情况下将下划线添加到例程名称中)。

正如@francescalus指出的那样,它是现代Fortran编译器和旧式FORTRAN代码。这个警告是因为现代fortran对数组范围更加明确。在这段代码中,x的大小为1,传递给yxtran(),这是可以的,因为传递是对数组开始的引用。当元素2被访问时,现代fortran编译器会担心。您可以通过将-fno-align-commons标志添加到编译器中来删除两个常见块错误。通过用x(n-1)替换第258行上的x(1),可以消除x(1)错误。就个人而言,我不会担心,除非您在运行代码时注意到问题/意外行为(尤其是来自netlib)。

+0

感谢您的回答。如果您阅读我上面的编辑,我仍然会收到一些警告。这是否也发生在你身上? – Jack 2015-04-06 16:59:01

+0

增加了一些警告的解释,希望这有助于(除非它出错,基本上不用担心)。 – 2015-04-06 17:25:21

+0

非常感谢 – Jack 2015-04-06 17:35:13