3

是否可以编写一个调用另一个 Fortran 函数的 Fortran 函数的 Fortran f2py 子例程?例如:

subroutine hello(a)
    ...
    call  newton(b, c)
    ...
end subroutine hello

subroutine newton (d,e)
    ...
    e=q(d)
    ...
end subroutine newton

real function q(x)
    ...
    q = h(x) + h(x-1)
    ...
end function

real function h(x)
    ...
end function h

对不起,混乱。我试过了,但是编译时出错了……我需要从 Python 调用的唯一子程序是第一个子程序,在此先感谢。

4

1 回答 1

2

f2py 允许将 Fortran子例程转换为 python函数。因此,当它尝试将 Fortran 函数转换为 python 可调用对象时,它会引发错误并崩溃。如果要从 python 调用这些函数,则必须将它们重写为子例程。但是,由于它们只需要从一个 Fortran 子例程中调用,因此没有必要这样做。

解决方案是在子例程中包含函数,使用contains. 下面是一个工作示例,使用与上面相同的结构:

下属

subroutine hello(a,b)
  real(8), intent(in) :: a
  real(8), intent(out) :: b

  call  newton(a, b)

end subroutine hello

subroutine newton (d,e)
  real(8), intent(in) :: d
  real(8), intent(out) :: e

  e=q(d)

  contains
    real(8) function q(x)
    real(8) :: x

    q = h(x) + h(x-1)

    end function

    real(8) function h(x)
    real(8) :: x

    h = x*x-3*x+2

    end function h
end subroutine newton

可以使用 f2py 将此文件转换为可调用的 python,特别是使用从命令行运行的f2py 文档f2py -c subs.f -m fsubs中解释的“快速方式”生成可调用的共享对象,可以使用import fsubs. 这个模块有一些帮助:

help(fsubs)
# Output
Help on module fsubs:

NAME
    fsubs

DESCRIPTION
    This module 'fsubs' is auto-generated with f2py (version:2).
    Functions:
      b = hello(a)
      e = newton(d)
...

可以看出,该fsubs模块包含 2 个函数hellonewton2 个子例程。现在,我们可以hello从 python中调用fsubs.hello(4),正如预期的那样,产生 8。

于 2018-05-19T01:46:18.910 回答