f2py子程序调用fortran函数

时间:2012-11-06 14:43:08

标签: function subroutine f2py

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

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调用的唯一子是第一个子,请提前感谢。

1 个答案:

答案 0 :(得分:0)

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

解决方案是使用contains将功能包含在子程序中。下面是一个工作示例,使用与上面相同的结构:

subs.f

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 callable,特别是使用" quick方式"在命令行的f2py docs运行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个子函数,hellonewton两个函数。现在,我们可以使用hello从python中调用fsubs.hello(4),如预期的那样,产生8。