使用f2py将动态向量从python分配到fortran中

使用f2py将动态向量从python分配到fortran中,python,fortran,f2py,Python,Fortran,F2py,python调用的子例程的开头如下: 使用以下命令从python调用:libomp.cic(pos、mpart、boxsize、dim、npart) 运行python脚本时出错: error: (shape(pos,0)==npart) failed for 1st keyword npart: cic:npart=47099622 WARNING: Failure executing file: <test.py> 错误:(第一个关键字npart:cic:npart=470996

python调用的子例程的开头如下:

使用以下命令从python调用:
libomp.cic(pos、mpart、boxsize、dim、npart)

运行python脚本时出错:

error: (shape(pos,0)==npart) failed for 1st keyword npart: cic:npart=47099622
WARNING: Failure executing file: <test.py>
错误:(第一个关键字npart:cic:npart=47099622的形状(位置,0)=npart)失败
警告:执行文件失败:

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

pos
被声明为
intent(in)
,这意味着在您进入例程时应该分配它。请注意,这与在fortran中使用自动数组完全不同,因为
pos
是一个伪参数。问题是,由于
pos
intent(in)
f2py
正在用您传入的维度(
mpart
)检查它的声明维度,因为
npart
也应该是
intent(in)
。因为它们不匹配,所以会出现错误

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

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

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

注释:为什么不直接在Fortran中指定意图?我可以这样做。。。任何一种方法都应该有效。我刚刚检查了-同样的错误。你能发布一些测试脚本的相关部分吗?你是对的,这是一个伪参数。不知道,我怎么可能没注意到。谢谢。pos是在python中改变形状的Nx3向量。我想把这个向量输入到fortran中,但是(如果我理解正确的话),fortran必须已经知道当它来自python时pos的长度是多少。每次pos发送到cic时,长度都会发生变化,因此我必须分配一个Nx3阵列。Fortran有没有一种方法可以接收任意大小的Nx3矩阵,而不必发送npart(N)?@Griff——这就是我所说的
intent(hide)
。这样,无论您传入什么Nx3矩阵,您的子例程都将作为
npart
传递。
libomp.cic(pos,mpart,boxsize,dim)