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

2024-06-16 13:21:14 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是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。它使用dimmesh有效,但对{}无效,为什么?这和它们被调用的顺序有关吗?在


Tags: inposinteger例程realdimmeshdimension
1条回答
网友
1楼 · 发布于 2024-06-16 13:21:14

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

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

如果pos真的是intent(in),那么原则上可以将npart改为{},在这种情况下,numpy将根据分配的pos向子例程传递{}。e、 g.,我相信它将被称为:

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

相关问题 更多 >