Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用F2Py的Fortran矩阵的间歇性内存分配错误_Python_Arrays_Fortran_Lapack_F2py - Fatal编程技术网

Python 使用F2Py的Fortran矩阵的间歇性内存分配错误

Python 使用F2Py的Fortran矩阵的间歇性内存分配错误,python,arrays,fortran,lapack,f2py,Python,Arrays,Fortran,Lapack,F2py,背景: 我有一个Python脚本,它使用Fortran代码进行密集计算。我用F2Py来做这个。一个特殊的Fortran子程序构建了一个矩阵,用于以后的计算。该子例程在循环中迭代,并在每一步求解。下面给出了使用基本数组和变量的代码片段: for i in xrange(steps): x+=dx F_Output=Matrix_Build_F2Py.hamiltonian_solve(array_1, array_2, array_3, array_4) #Do thing

背景:
我有一个Python脚本,它使用Fortran代码进行密集计算。我用F2Py来做这个。一个特殊的Fortran子程序构建了一个矩阵,用于以后的计算。该子例程在循环中迭代,并在每一步求解。下面给出了使用基本数组和变量的代码片段:

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))
错误停止。然而,复数变量对于输出是必不可少的,否则程序只会产生零。该线程与我的问题有一些相似之处,但该问题似乎在每次运行后都会出现,而我的问题并非如此。我已经注意确保数组没有不匹配,其他安排(即不考虑numpy的不同数组格式)会像预期的那样立即产生分段错误

问题
为什么Complex_Var会破坏代码?为什么问题是间歇性的而不是系统性的?有什么明显的(或不那么明显的)建议可以避免这种情况吗


任何帮助都将不胜感激

根据问题的第一次评论和修订进行更新:


我看到问题表达式中的一些数组具有高维
N_long-1
(即数组_1和数组_2)和数组复数维
N_short
。循环最多迭代
N_Long-1
。你知道吗,这可能是因为你没有任何
deallocate
命令。然而,很难判断这段明显不完整的代码-您是否可以发布实际代码(即可以编译的代码)?

抱歉,这是我的一个转录错误,为了便于阅读,我在此处更改了参数的名称。正确的循环迭代到N_Long-1,我已经更新了问题以反映它。这将非常奇怪。