2014-01-28 4 views
0

фона:
У меня есть сценарий 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 нарушает код? Почему проблема прерывистая, а не систематическая? И есть ли очевидные (или не столь очевидные) советы, чтобы избежать этого?

Любая помощь была бы высоко оценена!

ответ

1

обновляется за первый комментарий и пересмотр вопроса:

Я вижу, что некоторые массивы в выражении задачи имеют верхний размер N_long-1 (т.е. array_1 и array_2) и массив Complex_Var размер N_short. Цикл повторяется до N_Long-1. Знаете ли вы, что N_Long-1 <= N_short? Если нет, вы можете получить доступ к незаконному индексу o Complex_var. И знаете ли вы, что значения в array_1 и array_2 всегда являются юридическими индексами для Гамильтона? Если вы пишете вне зарезервированного размера этого массива, вы можете повредить информацию, используемую распределителем памяти, когда она создала некоторый массив, не позволяя ему освободить этот массив позже.

Если это проблема, использование опции вашего компилятора для проверки индекса времени выполнения может помочь вам найти похожие ошибки.

+0

Извините, это была ошибка транскрипции с моей стороны, я изменил названия параметров здесь для удобства чтения. Правильный цикл повторяется до N_Long-1, и я обновил вопрос, чтобы его отразить. – MarkyD43

0

Это может быть потому, что у вас нет никаких команд deallocate. Однако с этим явно неполным кодом трудно сказать - можете ли вы опубликовать фактический код (т. Е. Что-то, что будет скомпилировано)?

+0

Это было бы очень странно. –

Смежные вопросы