如何在Fortran 90/95中使用Fortran 77子程序?

3
我正在使用Fortran 90编写代码,现在需要使用amos Fortran 77库中的特殊函数(http://www.netlib.org/amos/)。我找到了这些例程的模块接口(https://github.com/certik/fortran-utils/blob/master/src/amos.f90)。
我的问题是:如何将它们结合起来并在我的Fortran 90程序中使用,并如何正确编译它们?
我已经为此苦苦挣扎了一整天,仍然无法弄清楚。
以下是我的测试代码:
PROGRAM TEST_ZBESI
USE set_precisions
USE amos
IMPLICIT NONE
INTEGER :: n, i, nz, ierr
!double precision :: zr,zi, cyr(5), cyi(5)
REAL(kind=DBL) :: zr, zi, cyr(5), cyi(5)

n=5
zr=1.0_DBL
zi=2.0_DBL

call ZBESI(zr,zi,0.0_DBL,1,n,cyr,cyi,nz,ierr)
print *,' '
do i=1, n
   write(*,10) i-1, cyr(i)
   write(*,11) i-1, cyi(i)
end do
print *,' NZ=', NZ
print *,' Error code:', ierr
print *,' '

10 format('  zr(',I1,') = ',F10.6)
11 format('  zi(',I1,') = ',F10.6)

END PROGRAM TEST_ZBESI

我得到的结果如下:
  zr(0) =   0.000000
  zi(0) =   0.000000
  zr(1) =   0.000000
  zi(1) =   0.000000
  zr(2) =   0.000000
  zi(2) =   0.000000
  zr(3) =   0.000000
  zi(3) =   0.000000
  zr(4) =   0.000000
  zi(4) =   0.000000
  NZ=           0
  Error code:           4

无论如何我都似乎无法得到正确的答案。

我尝试手动将ZBESI.f Fortran 77代码转换为Fortran 90代码。但是代码太长了,这是一场灾难。


3
请展示你遇到问题的代码样本。同时,请详细说明出现了什么问题:是编译错误还是链接问题? - wallyk
这应该是非常简单的。不仅仅是FORTRAN出了问题,更多的细节将有助于解决问题。 - bob.sacamento
将一些调试写语句放入ZBESI中以查看为什么会出现该错误应该很简单。 - agentp
2个回答

3
除极少数情况外,FORTRAN 77是Fortran 90/95/2003/2008的子集。实际上,编译器仍然支持过时的功能。使用相同的编译器编译FORTRAN 77和Fortran 90/95/2003/2008源代码应该会产生兼容的目标模块。由于需要不同的编译器选项,例如固定格式和自由格式源码布局,您可能需要分别编译这两个语言版本。在Fortan 90/95/2003/2008代码中的接口中,编译器将使用兼容的调用约定。
您遇到了什么具体问题?您需要了解FORTRAN 77的编译器选项吗?您正在使用哪个编译器?
编辑:必须在使用它的源代码之前编译模块。方便起见,先编译FORTRAN 77成一个目标文件,然后使用fortran命令编译Fortran 95以链接所有内容。因此,请尝试:
ifort -c -fixed ZBESI.f
ifort ZBESI.o set_precisions.f90 amos.f90 test_ZBESI.f90.

我正在使用英特尔编译器。现在我的代码可以通过以下方式进行编译:ifort set_precisions.f90 ZBESI.f amos.f90 test_ZBESI.f90。只要我按正确的顺序放置文件,一切都可以正常编译。但输出结果似乎是错误的。我不确定这是由于代码本身还是编译问题造成的。我在原始问题中更新了我的测试代码。谢谢! - user1746066

0

2
欢迎来到 Stack Overflow!欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接页面中最相关的部分,以防目标页面不可用。仅仅提供链接的答案可能会被删除。 - Sabito stands with Ukraine
1
欢迎来到StackOverflow。虽然这个解释可能解决了问题,但是包括一个样例代码来说明为什么这个解决方案有效会真正有助于提高您的帖子质量,并且可能会得到更多的赞。请记住,您正在回答未来的读者的问题,而不仅仅是现在提问的人。我建议您编辑您的答案以添加一些代码示例,请参阅此处→如何撰写好的答案? 谢谢! - Federico Baù

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接