是的,这是可能的。这里有一种方法。
所以我试图实现以下目标:
- 在Python中定义一个数组
- 通过
f2py
将该数组及其维度传递到Fortran中 - 在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
中的指令自动处理。