使用f2py将动态向量从python分配到fortran中
python调用的子例程的开头如下: 使用以下命令从python调用:使用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
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)