2

我有以下由 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为整数时它可以工作,但它无法npart从 python 接收并动态创建数组pos。它适用于mesh使用dim但不适用pos,为什么?它与调用它们的顺序有关吗?

4

1 回答 1

3

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

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

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

libomp.cic(pos,mpart,boxsize,dim)
于 2013-02-06T12:29:52.537 回答