我正在用 Python 包装 Fortran 模块。我选择使用 Cython 来做到这一点。我的问题是将 a 传递np.ndarray给 Fortran。我能够np.ndarray从 Fortran 收到一个,但我所有传递给 Fortran 的尝试都没有奏效。
我发现,问题直接出在 Cython - Fortran 接口上,因为我的 Fotran 子例程工作正常(尽可能在没有数据的情况下工作)。Cython 端似乎也能正常工作,我可以在那里操作变量。
我的最低工作示例:
PATTERN_wrap.f90
module PATTERN_wrap
use iso_c_binding, only: c_float, c_double, c_short, c_int
implicit none
CONTAINS
subroutine c_pattern(scalar_variable, array_variable, return_array) bind(c)
implicit NONE
INTEGER(c_int), intent(in) :: scalar_variable
INTEGER(c_int), intent(in), DIMENSION(10, 15) :: array_variable
REAL(c_float), INTENT(OUT), DIMENSION(10) :: return_array
write(*,*) "start fortran"
write(*,*) "scalar_variable"
write(*,*) scalar_variable
write(*,*) "array_variable"
write(*,*) array_variable
return_array = 3
write(*,*) "end fortran"
! call DO_PATTERN(&
! scalar_variable=scalar_variable, &
! array_variable=array_variable, &
! return_array=return_array)
!
end subroutine
end module PATTERN_wrap
注意:对实际执行某些操作的子程序的调用DO_PATTERN已被注释掉,因为此时它不相关。我只是想指出上面的代码是一个包装器。
pattern.pyx
#cython: language_level=3
import cython
import numpy as np
cimport numpy as np
cdef extern:
void c_pattern(
int *scalar_variable,
int *array_variable,
float *return_array
)
def run_pattern(
int scalar_variable,
):
cdef:
np.ndarray[int, ndim=2, mode="fortran"] array_variable = np.ones((10,15), dtype=np.int32, order='F')
np.ndarray[float, ndim=1, mode="fortran"] return_array = np.zeros(10, dtype=np.float32, order='F')
c_pattern(
&scalar_variable,
&array_variable[0,0],
&return_array[0],
)
print('Cython side')
print(return_array)
return return_array
婷婷同学_
相关分类