调试经验
调试经验积累
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开始导致小标检索越界错误
错误四:不同类的相同函数没有同步修改