【问题标题】:F2PY with Subroutine having a Call-back argument and an assumed-shape array argumentF2PY 与具有回调参数和假定形状数组参数的子例程
【发布时间】:2017-12-26 10:38:09
【问题描述】:

我正在尝试使用 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 对我来说也可以正常工作,只要不涉及回调参数,因此问题似乎是这两者之间的某种交互,我无法弄清楚。

【问题讨论】:

  • 看看这个最近的问题,如果它是相关的stackoverflow.com/questions/44073679/…尝试在这个网站上搜索更多。不幸的是,f2py 在这方面并不理想。
  • @VladimirF:谢谢,虽然我不认为这是相关的,因为我的错误只发生在同时使用回调参数和假定形状数组时。
  • 您是否尝试改用dimension(*)

标签: python arrays callback fortran f2py


【解决方案1】:

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

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

【讨论】:

  • 更新:此错误已在此期间修复。
【解决方案2】:

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

【讨论】:

  • 假定的形状数组本身是由 f2py 支持的。
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 2021-02-21
  • 2015-03-06
  • 2017-04-04
  • 2014-05-08
  • 2011-07-03
  • 2019-01-08
相关资源
最近更新 更多