【发布时间】:2017-04-10 02:30:54
【问题描述】:
我有一个用 Fortran 编写的子例程,要用 f2py 编译,但编译失败。我不会在这里发布完整的子程序,但 MWE 是:
SUBROUTINE mwe(Vars, nxc, nyc, vCorr)
IMPLICIT NONE
real(kind=8), dimension(:,:,:,:) :: Vars
integer :: nxc, nyc
integer :: dims(4), nv, nt, nx, ny
real(kind=8), intent(out), allocatable :: vCorr(:,:,:,:)
dims = shape(Vars)
nv=dims(1)
nt=dims(2)
nx=dims(3)
ny=dims(4)
allocate(vCorr(nv, nt, 2*nxc+1, 2*nyc+1))
print*,size(vCorr)
print*,size(Vars)
END SUBROUTINE
这失败了
/tmp/tmpy43di1/src.linux-x86_64-2.7/mwe-f2pywrappers.f:30:31:
call mwe(vars, nxc, nyc, vcorr)
1
Error: Actual argument for ‘vcorr’ must be ALLOCATABLE at (1)
这显然意味着 f2py 不接受可分配的输出数组。所以我试图通过将形状Vars 作为数组传递来规避这个问题,因此不必分配vCorr,这导致我使用了这段代码
SUBROUTINE mwe(Vars, nxc, nyc, dims, vCorr)
IMPLICIT NONE
real(kind=8), dimension(:,:,:,:) :: Vars
integer :: nxc, nyc
integer :: dims(4)
real(kind=8) :: vCorr(dims(1),dims(2),2*nxc+1,2*nyc+1)
print*,size(vCorr)
print*,size(Vars)
END SUBROUTINE
失败并出现此错误
/tmp/tmp0Y1S9x/src.linux-x86_64-2.7/mwemodule.c:296:39: error: called object ‘dims’ is not a function or function pointer
vcorr_Dims[0]=dims(1),vcorr_Dims[1]=dims(2),vcorr_Dims[2]=2 * nxc + 1,vcorr_Dims[3]=2 * nyc + 1;
环顾四周后,我遇到了this page,这让我相信(即使我使用的是 f2py2,而不是 3)这是一个错误。
对此有什么建议吗?
【问题讨论】:
-
建议不要使用可分配的数组参数。 F2py 不支持它们。周围可能有重复。另一个看起来像一个错误。
-
@VladimirF 是的,但是如果不支持使用可分配数组的选项,并且另一个给我一个错误,那么其他选项是什么?
-
不要使用 dims 数组,而是使用单个标量变量 dim1 和 dim2。