2017-04-10 18 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 

これは明らかにf2pyが割り当て出力配列を受け付けないことを意味

/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) 

で失敗します。だから私はこのコード

このエラー

/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; 
で失敗
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 

に私を導いているので、vCorrが割り当てられることはありません、配列のような形状Varsを渡すことで、この問題を回避しようとしました

私はthis pageを見て回ったところで、これはバグだと信じています(私はf2py2を使っていても3ではありません)。

これに関するご提案はありますか?

+0

提案は、割り当て可能な配列引数を使用することではありません。 F2pyはそれらをサポートしていません。おそらく周りに重複があります。もう1つはバグのようです。 –

+0

@VladimirFええ、割り当て可能な配列を使用するオプションがサポートされておらず、もう1つが私にバグを与えた場合、他のオプションは何ですか? – TomCho

+0

dims配列は使用しないでください。ただし、単一のスカラ変数dim1とdim2は使用しないでください。 –

答えて

0

最初の例では、f2pyは割り当て可能な配列引数をサポートしていません。それらはPython配列にはうまく適合しません。

他の例では、f2pyはを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

私はそうは思わない。派生型を試してみるかもしれません、私は同じ問題を期待しています。 –

関連する問題