如何将数组及其维度从Python传递到Fortran并在子例程中使用



所以我试图实现以下目标:

  1. 在Python中定义一个数组
  2. 通过f2py将该数组及其维度传递到Fortran中
  3. 在Fortran代码中的各种子例程中使用该数组。(Fortran代码不会更改数组。(

我已经知道,在这个答案的公共块中,这是不可能的。Fortran代码由许多独立的脚本组成,所以我也不能使用contains。这是否可能通过其他方式实现?提前感谢!

是的,这是可能的。这里有一种方法。

像这样创建fortran代码…

!example.f90
subroutine compute(x_1d, x_2d, nx, ny)
implicit none
integer, parameter :: dp = selected_real_kind(15, 307) !double precision
! input variables
integer, intent(in)       :: nx
integer, intent(in)       :: ny
real(kind=dp), intent(in) :: x_1d(nx), x_2d(nx, ny)
!f2py intent(in) x_1d, x_2d
print *, 'Inside fortran code'
print *, 'shape(x_1d) = ',  shape(x_1d)
print *, 'shape(x_2d) = ',  shape(x_2d)
end subroutine compute

用f2py编译它,生成一个可以导入python的模块。

python -m numpy.f2py -m example -h example.pyf example.f90
python -m numpy.f2py -c --fcompiler=gnu95 example.pyf example.f90

现在您应该有一个名为example.cpython-39-x86_64-linux-gnu.so的共享对象文件,它可以直接导入到python中,如下所示:

#example.py
from example import compute
import numpy as np
def main():
nx = 2
ny = 4
x = np.random.rand(nx)
y = np.random.rand(nx, ny)
print(compute.__doc__)
compute(x, y)
return
if __name__ == "__main__":
main()

运行python example.py给出:

compute(x_1d,x_2d,[nx,ny])
Wrapper for ``compute``.
Parameters
----------
x_1d : input rank-1 array('d') with bounds (nx)
x_2d : input rank-2 array('d') with bounds (nx,ny)
Other Parameters
----------------
nx : input int, optional
Default: shape(x_1d, 0)
ny : input int, optional
Default: shape(x_2d, 1)
Inside fortran code
shape(x_1d) =            2
shape(x_2d) =            2           4

请注意,不需要显式传递尺寸。它由f2py和我们放入fortran代码!f2py中的指令自动处理。

相关内容

  • 没有找到相关文章

最新更新