首页/文章/ 详情

Abaqus Fortran子程序的调试攻略(一)

1年前浏览3244


导读


         

         

         

         

 在我所有的程序 Bug 中,80% 是语法错误。剩下的 20% 中,80% 是不重要的逻辑错误。剩下的 4% 中,80% 是指针错误。最后剩下的 0.4% 是有难度的问题。

-MarcDonner,IBM Watson 研究中心


经常收到读者关于Abaqus软件使用过程中Fortran子程序调试的问题,在形形色 色的错误面前许多初学者无从下手,不知如何去查找问题所在。本文将对Abaqus中子程序的调试方法以及如何对错误进行预警做一个简单的介绍。


通过总结各类错误问题,大致可以把子程序编写过程中的错误归为三类:模型错误、语法错误和逻辑错误



01


模型错误


有限元模型中自身材料、截面属性、网格类型、网格划分方式、接触设置、边界/载荷设置、输出设置、软件子程序配置等引起的错误,非子程序本身的错误。此类错误一般会在任务监控界面下的Error或Warning栏中有具体提示。


模型错误属于有限元模型常规建模错误,可以先使用非子程序模型予以测试,排除建模错误之后,再改为子程序计算模型。该类错误属于最容易解决的一类。


02


语法错误


在使用FORTRAN编写子程序时,使用了非法的语句或者非法的格式,而引起的错误。该类错误会直接在任务监控界面提示Error:Problem during compilation编译出错。如下图所示。      
     
具体的语法错误内容将会显示在与任务名同名的XXX.log文件中,该文件位于Abaqus当前的工作目录,语法错误点及所在行数都有明确的提示。      
     

     
例如,将以下代码中第29行注释掉,第28行的语句被打断,变得不完整,将会有哪些提示信息呢?提示信息又将在哪里显示呢?      

使用文本编辑软件(notepad++或UE等)将log文件打开,可以看到提示信息如下,具体的错误类型和错误位置都有明确的提示:      
     


语法错误是许多子程序初学者经常会犯的错误,按照上述方式就可以快速定位错误位置了,至于基本的Fortran语言语法,可以参照应的语法书。      

     
在排除模型错误之后,应优先解决语法错误,此类错误,直观明了,容易查找,也容易修改。      


03


逻辑错误


模型自身没有人为建模错误,子程序语法也没有问题,模型可以调用子程序顺利计算,但计算结果明显异常或者刚一开始计算就跳出,没有明确的错误原因,log文件中也查找不到明确的错误提示。这一类错误,暂归结为逻辑错误。一般是由于公式推导有误、书写笔误、数据格式混乱、分母为0等情况导致。      

     
逻辑错误是子程序编写过程中最常见的一类错误,且十分隐秘,不易察觉,调试起来费时费力。      

     
常见逻辑错误类型有以下几种:      
     
  • 个别变量未声明或者声明类型与实际数据类型不一致

  • 主程序实参维度与子程序形参维度不一致

  • 分母为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


通过print打印出来的数据将显示在Abaqus当前工作目录下与任务名同名的log文件中(或命令提示窗口),根据打印出来的数据信息,逐个检查有问题的数据,进而判断错误在哪里?一般应从前到后,从主程序到子程序,一个代码块一个代码块顺序检查,直至检查到程序最后,所有数据均正常。打印效果如下:      

除了print之外,也通过write命令将数据打印输出到指定文件中,如error.dat根据打印出来的数据信息,逐个检查有问题的数据,进而判断错误在哪里?      


open(unit=10, file=‘error.dat') 

打开error.dat文件,unit指定文件代码,file指定文件名称

write(10, *)  "hello" ,SDV1 ,X,Y,Z

!在文件中写入hello及多个变量



04


提示预警


有些情况下,错误是可以预计的,即在某种条件下,数据自然会出现异常,因此,可以提前在可能出现错误的地方给予相应的错误提示信息。例如,下面的公式:

         
正常情况下,d为正数,因此,当x<=y时,应在程序中给出错误提示信息。在程序执行过程中,如果出现了该类型提示,就可以直接判断出问题出现的位置。          
         

         
if ( x .le. y) then          
    print*,"d不是正数,请检查数据"            
end if           

来源:易木木响叮当
MarcAbaqus理论材料
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-14
最近编辑:1年前
易木木响叮当
硕士 有限元爱好者
获赞 221粉丝 266文章 351课程 2
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈