背景:
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 がコードを壊すのはなぜですか? 問題が系統的ではなく断続的に発生するのはなぜですか? そして、これを回避するための明白な (またはそれほど明白ではない) ヒントはありますか?
どんな助けでも大歓迎です!