write(*,*)在子程序里打了一行,命令行窗口干干净净,ABAQUS UI底部那个消息框也什么都没有,一度以为代码根本没跑。调了半天,最后才发现子程序确实跑了,只是输出被吞了。
abaqus 2019,Windows 10 22H2,Intel Visual Fortran 2019,Visual Studio 2017,D:\temp\subtest\test.for,D:\temp\subtest\Job-1.inp,命令行abaqus job=Job-1 user=test.for interactive,D:\temp\subtest\Job-1.log,D:\temp\subtest\Job-1.msg。
测试结果:1,不可以输出在黑色的命令窗口,interactive模式下也不显示,non-interactive更不用想。2,也不可以输出在abaqus UI的底部窗口,CAE那个消息区一直是空的。3,尝试输出到文件:OK,用OPEN和WRITE组合写到一个txt里,每步都往里面追加,跑完打开看内容完整。4,子程序中的边界条件为一次性瞬时加载,这个跟输出没关系,是另一个测试项,顺带记一下。

具体做法就是子程序开头加OPEN(UNIT=100, FILE='D:\temp\subtest\debug_out.txt', STATUS='UNKNOWN', POSITION='APPEND'),中间需要打的地方WRITE(100,*) 'STEP=',KSTEP,' INC=',KINC,' STRESS=',STRESS(1),末尾CLOSE(100)。UNIT号别用6和5,那两个是系统预留给屏幕和键盘的,写了也白写。STATUS='UNKNOWN'保证文件不存在的时候自动建,POSITION='APPEND'保证多次调用不会覆盖前一次的内容。路径用绝对路径,相对路径在子程序里的工作目录不确定,找不到文件的话OPEN直接报错。每个增量步都OPEN和CLOSE一次影响效率,可以只在KINC==1的时候OPEN,后面APPEND,但ABAQUS每个增量步调用子程序多次,状态变量不保持,老老实实每次OPEN最稳。
有一次帮同事调一个UMAT,他写的损伤变量在特定应变下应该突变,但结果一直不突变。那天下午他在我工位上改代码,旁边会议室在装修,电钻声音一阵一阵的,桌上放着他中午吃剩的外卖,味道有点大。他在UMAT里插了一堆write(*,*),命令行刷屏了但内容全是一样的初始值,看不到增量步编号。我让他改成写文件,把KINC和损伤变量一起写出来,跑完之后打开txt一看,损伤变量在第47个增量步确实跳了,但那个位置的应变已经超过他预期的阈值了,说明前面弹性模量算错了,导致应变发展比预想的快。没有这个输出文件,根本定位不到是应变路径的问题还是损伤准则的问题。
后处理想省事的话,把中间变量存到SDV里,后处理的时候用ABAQUS的XY Data或者Python脚本从ODB里读出来画曲线,比写文件方便,能直接跟应力应变画在一起对比。SDV的数量在*DEPVAR里提前规划好,NSTATEV=50够用了。调试阶段用写文件,验证阶段用SDV存ODB,两套并行。
另一个要注意的点,子程序里的WRITE如果UNIT号没指定对,或者文件被别的进程占用了,可能不报错但也不写内容。跑完之后先去目标路径看一眼文件在不在,不在的话就是OPEN那步出问题了。文件在但内容是空的,检查WRITE的格式和变量类型,FORMATTED和UNFORMATTED写出来的东西不一样,列表输出用*最省事。
D:\temp\subtest\debug_out.txt
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删