【问题标题】:allocate on the fly vectors into fortran from python using f2py使用 f2py 从 python 将动态向量分配到 fortran
【发布时间】:2013-02-05 22:32:23
【问题描述】:

我有以下由 python 调用的子程序的开始:

从 python 调用:libomp.cic(pos,mpart,boxsize,dim,npart)

subroutine cic(pos,mpart,boxsize,dim,npart,mesh)
use omp_lib
implicit none 
real*8 mpart
!f2py intent(in) :: mpart
real*8 boxsize
!f2py intent(in) :: boxsize
integer dim
!f2py intent(in) :: dim
integer*8 npart
!f2py intent(in) :: npart
real*8, dimension(0:dim-1,0:dim-1,0:dim-1) :: mesh
!f2py intent(out) :: mesh
real*8, dimension(npart,3) :: pos
!f2py intent(in) :: pos

运行python脚本时出错:

error: (shape(pos,0)==npart) failed for 1st keyword npart: cic:npart=47099622
WARNING: Failure executing file: <test.py>

由于某种原因,当我将 npart 设置为整数但它无法从 python 接收 npart 并动态创建数组 pos 时,它可以工作。它适用于 mesh 使用 dim 但不适用于 pos,为什么?它与调用它们的顺序有关吗?

【问题讨论】:

  • 评论:为什么不直接在 Fortran 中指定意图?
  • 我可以做到...任何一种方式都应该有效。我刚刚检查过 - 同样的错误。
  • 你能发布一些测试脚本的相关部分吗?

标签: python fortran f2py


【解决方案1】:

pos 被声明为intent(in),这意味着它应该在您进入例程时分配。请注意,这与在 fortran 中使用自动数组完全不同,因为 pos 是一个虚拟参数。问题在于,由于posintent(in)f2py 正在检查它的声明尺寸与您传入的尺寸(mpart),因为npart 也应该是intent(in)。由于它们不匹配,因此您会收到错误消息。

换句话说,您有 2 个intent(in) 变量,而您为它们传递的值是不兼容的。实际的解决方案实际上取决于子例程应该做什么,以及虚拟参数的实际意图应该是什么。

如果pos 真的是intent(in),那么原则上您可以将npart 更改为intent(hide),在这种情况下,numpy 将根据pos 的分配维度将npart 传递给您的子例程。例如,我相信它会被称为:

libomp.cic(pos,mpart,boxsize,dim)

【讨论】:

  • 你是对的,这是一个伪参数。不知道,我怎么会没注意到呢。
  • 谢谢。 pos 是一个 Nx3 向量,它在 python 中改变形状。我想将此向量输入 fortran 但是(如果我理解正确的话),Fortran 必须已经知道 pos 来自 python 时的长度。每次长度都会改变,所以每次将 pos 发送到 cic 时我都必须分配一个 Nx3 数组。 Fortran 有没有办法接收任意大小的 Nx3 矩阵而不必发送 npart (N)?
  • @Griff -- 这就是我所说的intent(hide)。这样,无论你传入什么 Nx3 矩阵,你的子程序都会以Nnpart 传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 2023-03-23
相关资源
最近更新 更多