f2py中的malloc错误

2024-09-30 18:17:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用f2py来运行一个简单的三维集成问题。在

调用fortran代码的python代码如下:

#!/Library/Frameworks/EPD64.framework/Versions/Current/bin/python
import pymods as modules
import pygauleg as gauleg
import pyint as integrator
import pylab as pl
import sys
import math
import time

############################################
# main routine #############################
############################################
zero = 0.0
one = 1.0
pi = pl.pi

Nr = 10
Nt = 10
Np = 2*Nt
r0 = zero
rf = one
NNang = Nr*Nt*Np

print 'Nr Nt Np = ', Nr, Nt, Np
print 'NNang = ', NNang
print 'r0 rf = ', r0, rf

Nx = int(math.floor( (one*NNang)**(one/3.0) ))
Ny = int(math.floor( (one*NNang)**(one/3.0) ))
Nz = int(math.floor( (one*NNang)**(one/3.0) ))

Nx = int(pl.floor(float(Nx)*1.75))
Ny = int(pl.floor(float(Ny)*1.75))
Nz = int(pl.floor(float(Nz)*1.75))

NNxyz = Nx*Ny*Nz


print 'Nx Ny Nz = ', Nx, Ny, Nz
print 'NNxyz = ', NNxyz
xyz0 = -rf
xyzf = rf

t1 = time.time()
xt = pl.zeros(Nt)
wt = pl.zeros(Nt)
gauleg.gauleg(xt, wt, 0.0, pl.pi, Nt)
print 'outside of gauleg'

虽然fortran子程序有点长,但它的重要部分是开始。。。在

^{pr2}$

最后。。。在

 98 
 99 print*, 'returning'
100 
101 end subroutine

子程序顶部的注释(第5-11行)是fortran模块mod_gvars中的结构。似乎一切都按照计划进行,直到这个子程序返回为止。输出如下:

Nr Nt Np =  10 10 20
NNang =  2000
r0 rf =  0.0 1.0
Nx Ny Nz =  21 21 21
NNxyz =  1728
 n =           10
 m =  5
 returning
python(14167) malloc: *** error for object 0x1081f77a8: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Abort trap

似乎子程序只有在返回时才遇到问题。为什么会这样?在


Tags: importasnponenrintplprint
1条回答
网友
1楼 · 发布于 2024-09-30 18:17:13

这类问题通常发生在Python中的引用计数错误中,例如,如果f2py中存在错误,或者如果Fortran中覆盖的内存超过了numpy数组中分配的内存,则可能会发生这种情况。所有这些错误只会在Fortran子例程退出后随机出现,通常是在Python中释放一些内存时。在

要调试它,请尝试打印进入Fortran的所有数组,也就是说,打印数组x,w,以确保可以访问其中的所有内存(测试f2py使用相同的类型等等)。在

确保在Fortran中使用边界检查(至少在gfortran中使用-fbounds-check,最好是-fcheck=all来检查所有问题)。在

您也可以在debugger或valgrind下运行它,它可能会告诉您问题在哪里。在

最后,我个人更喜欢用Cython直接包装Fortran。然后我可以轻松访问所有生成的文件,并使用iso_c_bindingFortran模块,以便Fortran编译器检查Fortran和C(Python)之间的所有类型是否兼容,请参见here中的示例。在

相关问题 更多 >