子程序的学习就是在于对形参的理解,也在于对子程序的调用逻辑的理解,比如整个分析过程何时会调用子程序,传递给子程序的形参是什么,子程序运行完返回值是什么。
下面以DISP子程序为例介绍这个过程。
SUBROUTINE DISP(U,KSTEP,KINC,TIME,NODE,NOEL,JDOF,COORDS)
C
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION U(3),TIME(3),COORDS(3)
C
user coding to define U
RETURN
END
首先,帮助文档给我们提供了一个子程序接口,研究清楚它。
① 搞清楚每个参量的含义。比如kstep是分析步数,kinc是增量步数,time(1)是分析步时间,time(2)是总时间,time(3)是增量步时间,node是节点号,noel是单元号,jdof是自由度(123对应xyz平移自由度,456对应xyz转动自由度),coords对应的是坐标值;
② 搞清楚输入输出是什么。需要我们定义的是输出,这里就是U(1)(位移)、U(2)位移一阶倒数、U(3)位移二阶倒数;其他的变量都是输入(就是Abaqus主程序提供给子程序的可用的值)。
然后,搞清楚子程序能做什么,怎么做。DISP可用于定义指定边界条件或连接器的运动;DISP子程序会作用在边界条件或连接器运动的所有自由度上,例如,边界条件选择xyz平移自由度,此时定义的U(1)会在3个xyz上都起作用。
下面一段子程序定义了动画中刚体绕中心做圆周运动。刚体参考点的xz平移运动由子程序定义,y向定义为向下压0.5mm。
SUBROUTINE DISP(U,KSTEP,KINC,TIME,NODE,NOEL,JDOF,COORDS)
C
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION U(3),TIME(3),COORDS(3)
C
theta=3.14
if (jdof.eq.1) then
u(1)=25*cos(theta*time(1))-25
else
u(1)=25*sin(theta*time(1))
end if
RETURN
END