导读
“ 在我所有的程序 Bug 中,80% 是语法错误。剩下的 20% 中,80% 是不重要的逻辑错误。剩下的 4% 中,80% 是指针错误。最后剩下的 0.4% 是有难度的问题。”
-MarcDonner,IBM Watson 研究中心
经常收到读者关于Abaqus软件使用过程中Fortran子程序调试的问题,在形形色 色的错误面前许多初学者无从下手,不知如何去查找问题所在。本文将对Abaqus中子程序的调试方法以及如何对错误进行预警做一个简单的介绍。
通过总结各类错误问题,大致可以把子程序编写过程中的错误归为三类:模型错误、语法错误和逻辑错误。
01
—
模型错误
有限元模型中自身材料、截面属性、网格类型、网格划分方式、接触设置、边界/载荷设置、输出设置、软件子程序配置等引起的错误,非子程序本身的错误。此类错误一般会在任务监控界面下的Error或Warning栏中有具体提示。
模型错误属于有限元模型常规建模错误,可以先使用非子程序模型予以测试,排除建模错误之后,再改为子程序计算模型。该类错误属于最容易解决的一类。
02
—
语法错误
03
—
逻辑错误
个别变量未声明或者声明类型与实际数据类型不一致
主程序实参维度与子程序形参维度不一致
分母为0
If 判断语句位置不符合正常逻辑
无限循环
引用位置超出数组自身范围
理论公式代码化的过程中编写有误
针对逻辑错误,建议如下:
应对措施:从前到后,从主程序到子程序,逐个代码块进行检查
检查方式:监控打印疑似有问题的变量
print * ,NOEL,dft,dmt,dfc,dmc
!输出多个单变量
print *,stress(1:6)
!输出数组stress
print*,‘F1=’,F1,‘F2=’,F2
!输出变量及提示信息
do ii=1,6
print*,int(C0 (ii,1:6))
end do
!输出6*6矩阵C0
open(unit=10, file=‘error.dat')
! 打开error.dat文件,unit指定文件代码,file指定文件名称。
write(10, *) "hello" ,SDV1 ,X,Y,Z
!在文件中写入hello及多个变量
04
—
提示预警
有些情况下,错误是可以预计的,即在某种条件下,数据自然会出现异常,因此,可以提前在可能出现错误的地方给予相应的错误提示信息。例如,下面的公式: