【问题标题】:Passing array to function with assumed-shape将数组传递给具有假定形状的函数
【发布时间】:2017-04-04 02:11:02
【问题描述】:

我正在使用 Python 调用由 f2py 绑定的 Fortran 函数。当我显式标注数组时,我的 sum 调用返回所需的结果,但是当我使用假定形状时,它返回 0

! foo.f95
function sum_test(arr)
  IMPLICIT NONE
  integer(8), dimension(:), intent(in) :: arr
  integer(8) :: sum_test
  sum_test = sum(arr)
end function sum_test

Python 方面:

import foo
foo.sum_test([1,2,3])
0L

如果我在 Fortran 中明确标注:

! foo.f95
function sum_test(arr)
  IMPLICIT NONE
  integer(8), dimension(3), intent(in) :: arr
  integer(8) :: sum_test
  sum_test = sum(arr)
end function sum_test

Python 方面:

import foo
foo.sum_test([1,2,3])
6L

请注意,如果我像这样在假定形状的版本上打印出我的值:

write(*,*) arr

我可以看到数组中的值。

我显然在这里遗漏了一些关键部分!

【问题讨论】:

  • 您好,欢迎您。尽量保持你的帖子简洁,避免冗长的介绍、感谢和问候。您的名字已经在带有图标的帖子下方,无需重复。使用标签fortran 并添加特定版本,如果您有理由这样做(不在此处)。更多人关注更通用的标签,因此您更有可能得到答案。此外,最好在应该使用大写字母的地方使用(I、Fortran、Python),否则您可能会显得“懒惰”。
  • 报告您使用的软件版本和您使用的编译器标志也很好。

标签: python arrays fortran f2py


【解决方案1】:

假定形状的数组要求调用者传递有关数组边界的信息以及数据地址。这样做的机制是依赖于实现的,并不是所有的实现都记录了它们的方法。您的 Python 代码只是传递数据地址,但 Fortran 需要(通常)一个“描述符”数据结构。 (Fortran 2015 指定了执行此操作的标准方法,作为“进一步的 C 互操作性”的一部分。)

我建议改为 Fortran 所谓的“可调整数组”,您可以在其中将范围作为单独的参数传递。

【讨论】:

  • 感谢您的解释!
  • 从 f90 开始,f77 中所谓的可调数组被称为假定大小。正如史蒂夫所说,这可能是您想要的跨语言调用,以便可以使用 f2003 样式 C 互操作性,而不依赖于提供描述符。
  • 我不确定您的回答。我认为 f2py 应该支持假定的形状数组。当然 f2py 必须使用正确编译器的正确调用约定,但它应该被支持。
  • 当我使用子程序而不是函数时,一切正常。当使用函数时,我还必须传递维度才能使其工作
  • 我不同意@tim18 的回复。可调数组和假定大小是两个不同的东西。可调整数组是一个虚拟参数数组,其中一个或多个维度是也是虚拟参数的变量(或在 COMMON 或模块变量中或与主机相关的变量)。假定大小的数组的最后一个上限为 *,并且没有定义的上限。在当前的 Fortran 中不叫可调数组,它们是“显式形状数组”的子集,其中边界是“规范表达式”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2020-07-28
  • 2012-10-17
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多