0

背景:
Fortran コードを使用して集中的な計算を行う Python スクリプトがあります。これを行うためにF2Pyを使用しています。特定の Fortran サブルーチンの 1 つが、後の計算で使用される行列を構築します。このサブルーチンはループで繰り返され、各ステップで解決されます。重要な配列と変数を使用するコードのスニペットを以下に示します。

for i in xrange(steps):
    x+=dx
    F_Output=Matrix_Build_F2Py.hamiltonian_solve(array_1, array_2, array_3, array_4)
    #Do things with F_Output

SUBROUTINE Hamiltonian_Solve(array_1, array_2, array_3, array_4, output_array)

!N_Long, N_Short are implied, Work, RWork, LWork, INFO
INTEGER, INTENT(IN), DIMENSION(0:N_Long-1)  :: array_1, array_2, array_3 
INTEGER, INTENT(IN), DIMENSION(0:N_Short-1) :: array_4
COMPLEX*16,ALLOCATABLE                      :: Hamiltonian(:,:)
COMPLEX*16, DIMENSION(0:N_Short             :: Complex_Var
DOUBLE PRECISION, INTENT(OUT), DIMENSION(0:N_Short-1)       :: E
INTEGER                                                     :: LWork, INFO, j
COMPLEX*16,       ALLOCATABLE                               :: Work(:)

ALLOCATE(Hamiltonian(0:N_Short-1, 0:N_Short-1))
ALLOCATE(RWork(MAX(1,3*(N_Short-2))))    
ALLOCATE(Work(MAX(1,LWork)))              
ALLOCATE(E(0:N_Short-1)) 

DO h=0, N_Long-1
Hamiltonian(array_1(h),array_2(h))=Hamiltonian(array_1(h),array_2(h))-Complex_Var(h)
END DO


CALL ZHEEV('N','U',N_Short,Hamiltonian,N_Short,E,Work,LWork,RWork,INFO)

DO j=0,N_Short-1
    Output_Array(j)=E(j)
END DO

END SUBROUTINE

ただし、何らかの理由で、このサブルーチンによって Python プログラムがクラッシュし、次の malloc エラーが生成されます。

error for object 0x1015f9808: incorrect checksum for freed object - object was probably     modified after being freed.

このエラーは、毎回発生するわけではなく、かなりの割合でしか発生しないという点で異常です。エラーの原因は次の行にあると判断しました。

Hamiltonian(array_1(h),array_2(h))=Hamiltonian(array_1(h),array_2(h))-Complex_Var(h)

次のように変更したかのように:

Hamiltonian(array_1(h),array_2(h))=Hamiltonian(array_1(h),array_2(h))

エラーが停止します。ただし、Complex_Var は出力に不可欠です。それ以外の場合、プログラムは単にゼロを生成します。このスレッドは私の問題といくつかの類似点がありますが、その問題は実行するたびに発生するように見えましたが、私はそうではありません。配列が一致しないように注意しました。他の配置 (つまり、numpy の異なる配列形式を考慮していない) は、予想どおり、すぐにセグメンテーション違反を引き起こします。

質問
Complex_Var がコードを壊すのはなぜですか? 問題が系統的ではなく断続的に発生するのはなぜですか? そして、これを回避するための明白な (またはそれほど明白ではない) ヒントはありますか?

どんな助けでも大歓迎です!

4

2 に答える 2

1

最初のコメントと質問の改訂ごとに更新:

問題の式の一部の配列には、上位次元N_long-1(つまり、array_1 と array_2) と配列 Complex_Var dimensionがあることがわかりますN_short。ループは まで繰り返されN_Long-1ます。あなたはそれを知っていN_Long-1 <= N_shortますか?そうでない場合は、無効な添字 o Complex_var にアクセスしている可能性があります。また、array_1 と array_2 の値は常にハミルトンの有効な添字であることをご存知ですか? その配列の予約サイズ外に書き込むと、メモリ アロケータが配列を作成したときに使用した情報が破損し、後でその配列を解放できなくなる可能性があります。

これが問題である場合は、実行時の添字チェックにコンパイラのオプションを使用すると、同様のエラーを見つけるのに役立ちます。

于 2014-01-29T00:26:16.263 に答える
0

コマンドがないことが原因である可能性がありdeallocateます。ただし、この明らかに不完全なコードではわかりにくいです。実際のコード (つまり、コンパイルされるもの) を投稿していただけますか?

于 2014-04-07T11:07:57.630 に答える