我有一個子程序,我在Fortran中編寫與f2py編譯和編譯失敗。我不會在這裏發佈完整的子程序但MWE是:無法編譯子程序與數組輸出與f2py
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是的,但如果不支持使用可分配數組的選項,而另一個給我一個錯誤,那麼其他選項是什麼? – TomCho
不要使用dims數組,而是使用單個標量變量dim1和dim2。 –