繁体   English   中英

带有回调参数和假定形状数组参数的子程序的 F2PY

[英]F2PY with Subroutine having a Call-back argument and an assumed-shape array argument

我正在尝试使用 F2PY 来包装一个 fortran 子例程,该子例程将一个函数和一个假定形状的数组作为参数。 这会导致错误。 我在 Scientific Linux 7.3 上使用 GNU Fortran (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11) 和 F2PY 版本 2。

一个最小的例子是文件“ callback.f90 ”:

!file callback.f90 
subroutine sub(arr,func)
implicit none
  integer,intent(in),dimension(:) :: arr
  external func
  integer :: func
  integer :: i

  i = arr(1)
  print *, func(i)
end subroutine sub  

我将它包装在终端中

f2py -m pymod -h sign.pyf callback.f90
f2py -c sign.pyf callback.f90

这导致以下错误(从德语翻译):

gfortran:f77: /usr/tmp/tmpsADmTS/src.linux-x86_64-2.7/pymod-f2pywrappers.f
/usr/tmp/tmpsADmTS/src.linux-x86_64-2.7/pymod-f2pywrappers.f:6.19:

            use sub__user__routines                                 
               1
Error: Module file »sub__user__routines.mod« at (1) can't be opened
       for reading: File not found

但是,如果arr不是假定的形状,而是固定的大小,则这非常有效。 只要不涉及回调参数,具有假定形状数组的 F2PY 对我来说也很好用,因此问题似乎是这两者之间的某种交互,我无法弄清楚。

看来这确实是 f2py 中的一个错误。 问题是,f2py 错误地将use ...__user__routines插入到编译的 Fortran 文件中。 我已经在https://github.com/numpy/numpy/issues/17797上提交了它。

percuse 评论的提议修复似乎一见钟情。 .pyf文件中的dimension(*)替换dimension(:)使f2py编译运行。 我还没有检查这是否会破坏界面。

大多数(全部?)Fortran 编译器使用描述符(有时称为掺杂向量)来实现假定形状的数组虚拟参数。 这意味着您的示例中子例程 sub 的第一个参数 (arr) 不仅仅是数组的地址。 它是一个结构的地址,其中包含数组数据的地址以及数组边界信息等。 我不熟悉 F2PY 的内部工作原理,但也许它不支持按描述符参数? (按描述符参数的其他示例是具有 POINTER 或 ALLOCATABLE 属性的参数。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM