2017-04-10 25 views
0

我有一個子程序,我在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),這是一個錯誤。

對此有何建議?

+0

建議不要使用可分配的數組參數。 F2py不支持它們。可能周圍有重複。另一個看起來像一個錯誤。 –

+0

@VladimirF是的,但如果不支持使用可分配數組的選項,而另一個給我一個錯誤,那麼其他選項是什麼? – TomCho

+0

不要使用dims數組,而是使用單個標量變量dim1和dim2。 –

回答

0

在第一個示例中,f2py不支持可分配數組參數。它們不適合Python數組。

在另一個例子中,f2py不明白dims(1),dims(2)vCorr(dims(1),dims(2)。它不支持數組元素。這是一個錯誤。

作爲一種解決方法使用標量變量維度

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字節的實數。但不是全部。即使是很好的舊double precision更好。

+0

我理解這一點,但我試圖避免這種情況,因爲我的計劃是將此例程擴展到更多維數組(可能是6個或更多)。所以它會成爲一個問題,以正確的順序傳遞許多單獨的整數。沒有其他方法嗎? – TomCho

+0

我不這麼認爲。你可能會嘗試派生類型,我期望有同樣的問題。 –