2

Pythonによって呼び出されるサブルーチンの次の開始があります。

以下を使用して Python から呼び出されます。libomp.cic(pos,mpart,boxsize,dim,npart)

subroutine cic(pos,mpart,boxsize,dim,npart,mesh)
use omp_lib
implicit none 
real*8 mpart
!f2py intent(in) :: mpart
real*8 boxsize
!f2py intent(in) :: boxsize
integer dim
!f2py intent(in) :: dim
integer*8 npart
!f2py intent(in) :: npart
real*8, dimension(0:dim-1,0:dim-1,0:dim-1) :: mesh
!f2py intent(out) :: mesh
real*8, dimension(npart,3) :: pos
!f2py intent(in) :: pos

Python スクリプト実行時のエラー:

error: (shape(pos,0)==npart) failed for 1st keyword npart: cic:npart=47099622
WARNING: Failure executing file: <test.py>

何らかの理由でnpart、整数として設定すると機能npartしますが、Pythonから受信してその場で配列を作成することはできませんposmeshを使用しても機能しdimませんがpos、なぜですか? それらが呼び出される順序と関係がありますか?

4

1 に答える 1

3

posこれはintent(in)、ルーチンに入ったときに割り当てられることになっていることを意味します。posは仮引数であるため、これは fortran で自動配列を使用する場合とはまったく異なることに注意してください。問題は、 is であるためposintent(in)宣言f2pyされた次元を ( mpart)に渡す次元でチェックしているnpartことですintent(in)。一致しないため、エラーが発生します。

つまり、2 つintent(in)の変数があり、それらに渡す値に互換性がありません。実際の解決策は、サブルーチンが何をしていると想定されているか、および仮引数の実際の意図がどうあるべきかによって異なります。

posが本当にの場合、原則としてにintent(in)変更できます。この場合、numpy はの割り当てられた次元に基づいて をサブルーチンに渡します。たとえば、次のように呼び出されると思います。npartintent(hide)npartpos

libomp.cic(pos,mpart,boxsize,dim)
于 2013-02-06T12:29:52.537 に答える