5

假设我们需要在 python 程序中调用 fortran 函数,该函数返回一些值。我发现以这种方式重写fortran代码:

subroutine pow2(in_x, out_x)
      implicit none
      real, intent(in)      :: in_x
!f2py real, intent(in, out) :: out_x
      real, intent(out)     :: out_x
      out_x = in_x ** 2
      return
end

并以这种方式在python中调用它:

import modulename
a = 2.0
b = 0.0
b = modulename.pow2(a, b)

给我们工作结果。我可以用其他方式调用fortran函数吗,因为我认为第一种方式有点笨拙?

4

3 回答 3

10

我认为你只需要稍微改变你的 f2py 函数签名(所以那out_x只是intent(out)而且in_x只是intent(in)):

subroutine pow2(in_x, out_x)
  implicit none
  real, intent(in)   :: in_x
  !f2py real, intent(in) :: in_x
  real, intent(out)     :: out_x
  !f2py real, intent(out) :: out_x
  out_x = in_x ** 2
  return
end subroutine pow2

现在编译:

f2py -m test -c test.f90

现在运行:

>>> import test
>>> test.pow2(3)   #only need to pass intent(in) parameters :-)
9.0
>>>

请注意,在这种情况下,无需特殊注释f2py即可正确扫描函数的签名:!f2py

!test2.f90
subroutine pow2(in_x, out_x)
  implicit none
  real, intent(in)   :: in_x
  real, intent(out)     :: out_x
  out_x = in_x ** 2
  return
end subroutine pow2

编译:

f2py -m test2 -c test2.f90

跑:

>>> import test2
>>> test2.pow2(3)   #only need to pass intent(in) parameters :-)
9.0
>>>
于 2012-11-19T21:33:43.790 回答
0

避免intent(inout)参数的另一个好处是(有一些其他限制)可以考虑PURE生成的函数。这与函数式语言采用的无副作用方法有关,并且通过 Fortran 编译器更好的优化和错误检测得到回报,对于自动并行化尤其重要。

于 2013-08-05T00:37:18.147 回答
0

如果您使用的是 IPython,请尝试使用魔法命令,它可以编写

%%fortran
subroutine pow2(in_x, out_x)
  implicit none
  real, intent(in)   :: in_x
  real, intent(out)     :: out_x
  out_x = in_x ** 2
  return
end subroutine pow2

然后只需在您的代码中使用此函数(无需额外导入)。

于 2015-12-01T22:57:49.570 回答