2016-10-17 6 views
1
  • OSのUbuntu 14.04私はその後、私は、Pythonからこの関数を呼び出しf2py
  • を使用してFortranコードで記述された機能をコンパイルします。

そして、私はエラーメッセージを取得: とValueErrorを:INTENT(INOUT)配列の初期化に失敗しました - = 4 elsize期待が、私のFortranコードは32ビットとしてコンパイルされているように見え8f2py誤り、間違ったelsize

を得ました64ビットマシンにもかかわらず。 32ビットコンピュータではすべて正常に動作します。 どうすれば間違っていますか?

答えて

0

解決策が見つかったようです。 最初に、整数配列がFortranサブルーチンに渡されている場合にのみ、報告されたエラーが発生します。 FortranではINTEGER * 4とREAL * 8として宣言していますが、デフォルトのPython intとfloatを使用すると、整数値と実際の配列(値もそうです)が正しく渡されます。 しかし、整数配列の場合、これは機能しませんでした。 Pythonの整数配列は、np.int32型として宣言(または変換)され、FortranサブルーチンでINTEGER * 4として宣言される必要があります。 私のプロジェクトで働いていた配列宣言/変換のサンプルを以下に示します。

のPython:

import numpy as np 
import Fortran_file 
#.... some code 
# variable "data" is integer 2-D array 
data = data.astype(np.int32) # data.astype(int) gives error 
data = np.asfortranarray(data) 
array1 = np.zeros(5, dtype=np.int32, order='F') # dtype=int gives error 
array2 = np.zeros(5, dtype=float, order='F') 
ivalue = 2 # conversion to np.int32 is not needed 
Fortran_file.Fortran_subroutine(data, ivalue, array1, array2) 

のFortran:

SUBROUTINE Fortran_subroutine (matrix, value, array1, array2) 
IMPLICIT NONE 
INTEGER*4 :: matrix(:,:) 
!f2py INTENT(INOUT) :: matrix(:,:) 
INTEGER*4 :: value 
!f2py INTENT(INOUT) :: value 
INTEGER*4 :: array1(5) 
!f2py INTENT(INOUT):: array1(5) 
REAL*8 :: array2(5) 
!f2py INTENT(INOUT) :: array2(5) 

は再び、これは64ビットOS上で意味を持っていました。私が32ビットOSを使用したとき、これらのトリックなしですべてが機能しました。

私は他のデータ型を試していません。

関連する問題