фона:
У меня есть сценарий Python, который использует Fortran код для его интенсивных вычислений. Я использую F2Py для этого. Одна конкретная подпрограмма Fortran создает матрицу, используемую в последующих вычислениях. Эта подпрограмма повторяется в цикле и решается на каждом шаге. Фрагмент кода с использованием основных массивов и переменных приведен ниже:перемежающейся Распределение памяти Ошибка для Fortran матрицы с использованием F2Py
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 и генерирует следующую таНос ошибку:
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 необходим для вывода, иначе программа просто производит нули. This Нить имеет некоторое сходство с моей проблемой, но эта проблема, похоже, возникала после каждого запуска, у меня нет. Я позаботился о том, чтобы массивы не были несоответствующими, другие механизмы (т. Е. Не учитывающие форматы массивов numpy) сразу же создают ошибку сегментации, как и ожидалось.
Вопрос
Почему Complex_Var нарушает код? Почему проблема прерывистая, а не систематическая? И есть ли очевидные (или не столь очевидные) советы, чтобы избежать этого?
Любая помощь была бы высоко оценена!
Извините, это была ошибка транскрипции с моей стороны, я изменил названия параметров здесь для удобства чтения. Правильный цикл повторяется до N_Long-1, и я обновил вопрос, чтобы его отразить. – MarkyD43