我正在使用Fortran 90编写代码,现在我需要使用* amos Fotran 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代码。但代码太长了,这是一场灾难。
答案 0 :(得分:3)
除极少数例外情况外,FORTRAN 77是Fortran 90/95/2003/2008的子集。在实践中,编译器仍然支持过时的功能。使用相同的编译器编译FORTRAN 77和Fortran 90/59/2003/2008源应生成兼容的对象模块。您可能必须单独编译这两种语言版本,因为可能需要不同的编译器选项,例如,对于固定和自由格式的源布局。使用Fortan 90/95/2003/2008代码中的接口,编译器将使用兼容的调用约定。
你有什么具体问题?您需要知道FORTRAN 77的编译器选项吗?你使用什么编译器?
编辑:您必须在使用它的源代码之前编译模块。首先将FORTRAN 77编译成目标文件,然后使用编译Fortran 95的fortran命令链接所有内容很方便。所以试试:
ifort -c -fixed ZBESI.f
ifort ZBESI.o set_precisions.f90 amos.f90 test_ZBESI.f90.
答案 1 :(得分:0)
我遇到了同样的问题。就我而言,这是因为从 ZBESI.f 调用的 I1MACH 和 D1MACH 返回了错误的答案。在文件中使用 https://github.com/certik/fortran-utils/blob/master/src/legacy/amos/d1mach.f90 让它发挥作用。