下面是python调用的子例程的开头:
使用:libomp.cic(pos,mpart,boxsize,dim,npart)
从python调用
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脚本时出错:
^{pr2}$由于某些原因,当我将npart
设置为整数时,它可以工作,但它无法从python接收npart
,并动态创建数组pos
。它使用dim
对mesh
有效,但对{
pos
被声明为intent(in)
,这意味着它应该在您进入例程时被分配。请注意,这与在fortran中使用自动数组完全不同,因为pos
是一个伪参数。问题是,由于pos
是intent(in)
,f2py
正在用传入的维度(mpart
)检查它声明的维度,因为npart
也应该是{换句话说,您有2个
intent(in)
变量,并且为它们传递的值是不兼容的。实际的解决方案实际上取决于子程序应该做什么,以及伪参数的实际意图是什么。如果},在这种情况下,numpy将根据分配的}。e、 g.,我相信它将被称为:
pos
真的是intent(in)
,那么原则上可以将npart
改为{pos
向子例程传递{相关问题 更多 >
编程相关推荐