第9章ABAQUS二次开发基础知识要点:;ABAQUS二次开发概述;ABAQUS用户子程序接口;ABAQUS用户子程序介绍;应用举例本章导读:本章主要介绍了大型有限元软件ABAQUS二次开发的基本情况,主要包括:ABAQUS二次开发概述、ABAQUS用户子程序接口、ABAQUS用户子程序介绍等,最后给出两个算例,介绍采用ABAQUS进行二次开发以及建立ABAQUS主程序与用户子程序之间口的基本过程。9.1ABAQUS二次开发概述随着计算技术和计算机的快速发展,有限元软件的发展速度迅速,功能日渐强大。目前国际上被广泛采用的通用有限元软件有ANSYS、MSC、ABAQUS等。利用商业软件进行计算现在已是科学研究中的一项重要手段。由于工程问题的千差万别,不同的用户有不同的专业背景和发展方向,通用软件不免在具体的专业方面有所欠缺,针对这些不足,大部分的通用软件都提供了二次开发功能,以帮助用户减少重复性的编程工作、提高开发起点、缩短研发周期、降低开发成本,并能简化后期维护工作,给用户带来很多方便。基于通用软件平台进行开发,是目前研究的一个重要发展方向。ABAQUS也提供了若干用户子程序(UserSubroutines)接口,它是一个功能非常强大且适用的分析工具,与命令行的程序格式相比,用户子程序的限制少得多,从而使用更加灵活方便。ABAQUS不仅提供标准的有限元分析程序,而且具有良好的开放性,可利用它提供的用户子程序接口生成非标准的分析程序来满足用户的需要,在实际工程中得到广泛应用。ABAQUS允许用户通过子程序以代码的形式来扩展主程序的功能,并给用户提供了强大而又灵活的用户子程序接口和应用程序接口(UtilityRoutine),ABAQUS共有42个用户子程序接口,15个应用程序接口,用户可以定义包括边界条件、荷载条件、接触条件、材料特性以及利用用户子程序和其它应用软件进行数值交换等等。这些用户子程序接口使得用户解决一些问题时有很大的灵活性,同时大大的扩充了ABAQUS的功能。例如:通过用户定义单元接口,用户自定义的任何类型的线性或非线性单元都可以被引入模型中,对于线性单元刚度矩阵和质量矩阵可以直接确定。例如:如果荷载条件是时间的函数,这在ABAQUS/CAE和INPUT文件中是难以实现的,但在用户子程序DLOAD中就很容易实现。同时,用户子程序也可被用来定义这些单元的线性和非线性特性。通过用户材料子程序接口,用户可定义任何补充的材料模型,不但任意数量的材料常数都可以作为资料被读取,而且ABAQUS对于任何数量的与解相关的状态变量在每一材料计数点都提供了存储功能,以便在这些子程序中应用。9.2ABAQUS用户子程序接口ABAQUS的用户子程序是根据ABAQUS提供的相应接口,按照Fortran语法,用户自己编写的代码。它是一个独立的程序单元,可以独立的被存储和编译,也能被其它程序单元引用,因此,利用它可带回大量数据供引用程序使用,也可以用它来完成各种特殊的功能。它的一般结构形式是:SUBROUTINES(x1,x2,……,xn)INCLUDE‘ABA_PARAM.INC’(用于ABAQUS/Standard用户子程序中)ORINCLUDE‘VABA_PARAM.INC’)(用于ABAQUS/Explicit用户子程序中)……RETURNEND其中,x1,x2,……,xn是ABAQUS提供的用户子程序的接口参数,有些参数是ABAQUS传到用户子程序中的,例如:SUBROUTINEDLOAD中的KSTEP、KINC、COORDS;有些是需要用户自己定义的,例如F。文件aba_param.inc和vaba_param.inc随着ABAQUS软件的安装而包含在操作系统中,它们含有重要的参数,帮助ABAQUS主求解程序对用户子程序进行编译和链接。当控制遇到RETURN语句时便返回到引用程序单元中去,END语句是用户子程序结束的标志。在一个算例中,用户可以用到多个用户子程序,但必须把它们放在一个以.for为扩展名的文件中。运行带有用户子程序的算例有两种方法:一是在CAE中运行,在EDITJOB菜单中的GENERAL子菜单的USERSUBROUTINEFILE对话框中选择用户子程序所在的文件即可;另外是在ABAQUS.COMMAND中运行,语法如下:abaqusjob=job-nameuser={source-file|object-file}编制用户子程序时应注意:(1)用户子程序相互之间不能调用,但可以调用用户自己编写的Fortran子程序和ABAQUS应用程序。ABAQUS应用程序必须由用户子程序调用。当用户编写Fortran子程序时,建议子程序名以K开头,以免和ABAQUS内部程序冲突。(2)当用户在用户子程序中利用OPEN打开外部文件时,要注意以下两点:一是设备号的选择是有限制的,只能取15~18和大于100的设备号,其余的都已被ABAQUS占用;二是用户需提供外部文件的绝对路径而不是相对路径。(3)对于不同的用户子程序ABAQUS调用的时间是不同的,有的是在每个STEP的开始,有的是STEP的结尾,有的是在每个INCREMENT的开始等等。当ABAQUS调用用户子程序时,都会把当前的STEP和INCREMENT利用用户子程序的两个实参KSTEP和KINC传给用户子程序,用户可把它们输出到外部文件中,这样就可清楚的知道ABAQUS何时调用该用户子程序。为保证用户子程序的正确执行,子程序的书写必须遵循ABAQUS的相关规定。此外,ABAQUS的脚本语言接口非常友好,其自嵌的脚本语言是Python系国际上广泛使用、功能强大、具有良好开放性的一种面向对象程序设计语言。所以,应用Python在ABAQUS中进行二次开发也比较方便,且可移植性强。ABAQUS以基于Python的语法规则向二次开发者提供了许多库函数,这些库函数主要是用来增强ABAQUS的交互式(GUI)操作功能。用户可以通过ABAQUS的交互式(GUD界面实现分析对象的特征造型、指定材料属性、完成网格剖分和控制、提交并监控分析作业,也可以使用ABAQUS脚本语言越过ABAQUS的交互式(GUI)界面直接高效地向ABAQUS内核提交任务。使用Python可以进行参数化建模,修改交互式建立的模型,还可以一次提交多个作业。在国外,众多的有限元分析和研究者热衷于使用ABAQUS,一个很重要的原因就在于ABAQUS给用户提供了功能强大,使用方便的二次开发工具和接口,使得用户可以方便的进行富含个性化的有限元建模、分析和后处理,满足特定工程问题的需要。9.3ABAQUS用户子程序介绍ABAQUS程序具有良好的开放性,可利用它提供的用户子程序接口生成非标准的分析程序来满足用户的需要,在实际工程中得到广泛应用。9.9.1用户子程序分类ABAQUS用户子程序大致可以分为7类,下面为具体的分类及用户常用子程序。1.用户定义的初始条件利用此类子程序可以在分析时定义初始条件,例如:初始应力场的定义,可以采用SIGINI用户子程序来定义;在渗流场分析时定义初始孔隙水压力分析可采用UPOREP用户子程序;多孔介质初始孔隙度分布的定义可采用VOIDRI用户子程序。2.用户定义的边界条件利用此类子程序可以在结构分析或耦合分析时定义特殊类型的边界条件,如定义节点位移,定义分布机械载荷,定义流体流速和流量等。例如:定义非均布的渗流流速和流量可采用DFLOW和DFLUX用户子程序,以及定义非均布的渗流系数可采用FLOW用户子程序;定义特殊类型的位移边界可采用DISP用户子程序;定义特殊类型分布的面力载荷可采用DLOAD子程序;定义特殊分布的牵引力可采用UTRACLOAD子程序;定义温度场边界的UTEMP子程序。9.用户定义的材料特性和本构关系利用此类子程序可以定义各种本构模型,如各向异性或正交各向异性的弹性应力-应变关系,各种非线性弹塑性本构关系、也可以定义蠕变应变率演化方程、定义非线性应力-应变关系,定义加工硬化或应变硬化曲线等。例如:采用UMAT子程序可以定义各类本构模型,包括非线性弹性、弹塑性以及蠕变等模型;例如采用CREEP子程序可以定义各类蠕变或膨胀演化方程;关于材料的热力学特性可以采用UMATHT子程序;定义粘弹性材料或超弹性材料可以采用UHYPEL和UHYPER子程序;Mullins材料模型的损伤特性定义可以采用UMULLINS用户子程序。4.用户定义的单元对于特殊类型的单元,可采用UEL子程序进行定义。5.用户定义的状态变量状态变量主要包括定义场变量、与求解过程相关的状态变量,以后重新定义材料点的状态变量,主要有UFIELD子程序、SDVINI子程序和USDFLD子程序。此外还包括定义摩擦接触属性的子程序,如定义摩擦接触行为的FRIC子程序,以及接触面行为定义的UINTER子程序等。6.定义输出量的用户子程序此类用户子程序可以定义提取单元结果,将单元量输出,写到后处理结果文件中,如UVARM子程序;此外,读取结果文件可采用URDFIL子程序。7.其他用户子程序此外,还包括特殊类型用途的子程序,如定义多点约束的子程序MPC,定义局部坐标的ORIENT子程序等。上述子程序的分类仅限于在岩土工程领域,其他领域有不同的分类方法。9.3.2常用用户子程序简介下面就选出几个常用的用户子程序和应用程序进行详细解释:1.DLOAD子程序功能:荷载可以被定义为积分点坐标、时间、单元编号和单元节点编号的函数。用户可以从其他程序的结果文件中进行相关操作来定义积分点F的大小。SUBROUTINEDLOAD(F,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT,COORDS,JLTYP,SNAME)主要参数:F为用户定义的是每个积分点所作用的荷载的大小;KSTEP,KINC为ABAQUS传到用户子程序当前的STEP和INCREMENT值;TIME(1),TIME(2)为当前STEPTIME和INCREMENTTIME的值;NOEL,NPT为积分点所在单元的编号和积分点的编号;COORDS为当前积分点的坐标;除F外,所有参数的值都是ABAQUS传到用户子程序中的。示例描述:在每个积分点施加的荷载不仅是坐标的函数,而且是随STEP变化而变化的。SUBROUTINEDLOAD(P,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT,COORDS,1JLTYP,SNAME)CINCLUDE'ABA_PARAM.INC'CDIMENSIONTIME(2),COORDS(3)CHARACTER*80SNAMEPARAMETER(PLOAD=100.E4)CIF(KSTEP.EQ.1)THEN!当STEP=1时的荷载大小P=PLOADELSEIF(KSTEP.EQ.2)THEN!当STEP=2时的荷载大小P=COORDS(1)*PLOAD!施加在积分点的荷载P是坐标的函数ELSEIF(KSTEP.EQ.3)THEN!当STEP=3时的荷载大小P=COORDS(1)**2*PLOADELSEIF(KSTEP.EQ.4)THEN!当STEP=4时的荷载大小P=COORDS(1)**3*PLOADELSEIF(KSTEP.EQ.5)THEN!当STEP=5时的荷载大小P=COORDS(1)**4*PLOADENDIFRETURNEND2.DISP子程序功能:该用户子程序用于指定预定义边界条件强制边界条件或者又可称为第类边界条件,它可用于定义各种类型自由度的边界条件,可以是时间和坐标的函数。SUBROUTINEDISP(U,KSTEP,KINC,TIME,NODE,NOEL,JDOF,COORDS)主要参数:是当前节点上指定变量总的值。指定的变量可以是位移、旋转自由度、孔隙压力、温度等,由用户在分析输入文件即中指定的自由度决定。U(1)表示位移,U(2)表示速度,U(3)表示加速度。KSTEP,KINC为ABAQUS传到用户子程序当前的STEP和INCREMENT值;TI