调试经验

调试经验积累

2018.12.25

程序运行1010步以后就会出现错误 Caught signal number 11 SEGV: Segmentation Violation, probably memory access out of range。通过查看几个输出信息定位程序错误地方,然后逐行排除,最后发现是因为没有 fclose;

 

Maccormack 格式求解激波管问题

错误1:

U[i][k]=U[i][k]+0.5*nu*q*(U[i+1][k]-2*U[i][k]+U[i-1][k]);  

该语句中U[i][k]会对下一个U[i+1][k]造成影响,因为改变了右端项。解决办法是用一个新的变量UF[i][k]= U[i][k]+0.5*nu*q*(U[i+1][k]-2*U[i][k]+U[i-1][k]); 然后再赋值给U[i][k].

 

找到方式:移除别人的程序中的人工粘性项,发现也出了问题,所以我的程序很有可能也是人工粘性出了问题。进而看到别人程序多此一举地把人工粘性赋值给了中间变量,实际上并不是多此一举。

 

修改结果:错误1不是主要错误,修改后并没有改善。同样是500步,别人程序已经扩散开,而我的还是一个间断,没有扩散开。

 

错误2

for(k=1;k<3;k++)  发现重大错误,k竟然从1开始的!!!!!!!!!!!!

找到方式:一行一行输出对比,偶然看到k竟然从1开始的。

调试成功了!就是k循环从1开始的原因。

调试时间:一晚上加一下午

 

错误3

分母上为零。调试方法:看到结果为无穷大,使用一步推进,还是无穷大,说明是分母为零的可能性很大。不同位置输出数值,发现人工粘性密度变化作为参考系数的分母处为零。

 

墨尔本大学校徽动图制作

错误:

数据与结果不符

原因:宏定义函数写错(第一次是函数写错,用参考的程序替代;第二次是未加括号)

 

一维N-S方程TVD格式求解激波

错误:

一步发散

原因:循环的次数写错,把i<im-1写成了I<im-2.(用源程序一段一段代替后发现错误在该段)

还有错误:

还是循环次数写错,i应该从零开始,而不是从1开始。

 

二维方腔有限体积、人工压缩方法求解

错误:死循环

查找:通过输出的方式找到循环位置。

原因:复制循环外层,忘记修改i为j,死循环。

 

错误:残差不变化

原因:残差写在更新变量之后了,这样就是0。所以err一直显示不变,为1。按道理应该是0,所以某个变量没有更新,找到压强p至始至终没有更新。

 

错误:第二步压强就发生突变,u速度也变化很大。

原因:压强变化大的原因是压强修正公式中忘记乘以dt。

 

错误:速度变化剧烈

方法:不进行三阶quick求内场点,只看upwind函数执行后有没有剧烈变化,发现没有,所以问题很有可能在三阶quick格式中。

 

用输出的方式,找到un突变的原因是:quick格式求解时,求p的导数用了p[i+1]-p[i],忘记了j坐标,应为p[i+1][j]-p[i][j]。

 

错误:计算结果与物理不符合,且步数很大时候,结果发散。

实在找不到,对照源程序,发现公式中一个项的符号因为等号左右导致错误。

 

c++ 魔兽争霸小程序

错误一:变量写错,导致循环出问题

错误二:++id在循环内外的逻辑不清导致错误

错误三:id大小从1开始导致小标检索越界错误

错误四:不同类的相同函数没有同步修改

posted on 2018-12-25 10:53  BabyStep  阅读(393)  评论(0编辑  收藏  举报

导航