首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法用f2py编译数组输出的子程序

无法用f2py编译数组输出的子程序
EN

Stack Overflow用户
提问于 2017-04-10 02:30:54
回答 1查看 385关注 0票数 0

我有一个用Fortran编写的子例程,要用f2py编译,编译失败了。我不会在这里发布完整的子例程,但是MWE是:

代码语言:javascript
复制
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

这不符合

代码语言:javascript
复制
/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,这就导致了下面的代码

代码语言:javascript
复制
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

由于此错误而失败的

代码语言:javascript
复制
/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;

环顾四周,我发现了此页,这让我相信(尽管我使用的是f2py2,而不是3),这是一个bug。

对此有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-10 08:32:22

在第一个示例中,f2py不支持可分配的数组参数。它们不适合Python数组。

在另一个示例中,f2py不理解vCorr(dims(1),dims(2)中的dims(1),dims(2)。它不支持那里的数组元素。这是个窃听器。

作为一种解决方法,可以使用标量变量作为维度。

代码语言:javascript
复制
SUBROUTINE mwe(Vars, nxc, nyc, dim1, dim2, vCorr)
  integer, parameter :: dp = kind(1.d0)
  real(dp), dimension(:,:,:,:) :: Vars
  integer :: nxc, nyc
  integer :: dim1, dim2
  real(dp) :: vCorr(dim1,dim2,2*nxc+1,2*nyc+1)

注意:kind=8很难看,不能移植。真正的含义不是8字节,尽管它确实对应于许多编译器中的8字节reals。但并不是所有的人。即使是好的老double precision也更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43314179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档