零
概述
这个帖子文字多,但都是干货,一篇文章完全厘清abaqus二次开发的所有概念。
“abaqus二次开发”是一个笼统的概念,下面可以进行细分,如abaqus建模二次开发、后处理二次开发和子程序二次开发等,不同的二次开发涉及的目的不一样,采用的工具不一样,下面逐个解释。
壹
abaqus建模二次开发
正式介绍建模二次开发之前,先介绍abaqus的模型组织方式,一共有两种。
一种是基于part的建模方式,即首先创建若干个part,然后通过assembly关键字进行组装,所有的部件、点、线和面都是基于part进行索引的。这种组织方式是现在使用最广泛的,其设计是依据python的面向对象编程思想。
另一种是直接组装,不涉及part、asselbly等关键词,这种组织方式在帮助文档里面经常看得到,帮助文档里面还会出现一些上古的关键字,如
*heading
test bergstrom-boyce, uniaxial loading
strain rate=-0.01/s, material: Chloroprene Rubber (65 pph carbon black)
*node
1,
2, 0.014
3, 0.014, 0.013
4, 0.0, 0.013
*element,type=cax4,elset=eall
...
1,2,2,0.
2,2,2,0.
*end step
**
上面inp文件来自:help.3ds.com/2017/English/DSSIMULIA_Established/SIMAINPRefResources/mbbcdo3mcy_un_1e_2_cl65.inp?contextscope=all
上面的模型组织方式就不涉及part,而是直接进行组装的,这种inp文件无法通过abaqus gui界面获得,只能通过自己手动编程序生成。
下面正式介绍abaqus建模二次开发。
特别注意的是,不要将建模二次开发和子程序二次开发搞混淆,二者有本质不同。建模二次开发主要涉及到模型的创建,常常用于解决多次的繁琐操作,如混凝土细观尺度模拟、零厚度单元批量创建等等,建模二次开发不涉及有限元计算。
abaqus建模二次开发主要针对第一种模型组织方式,即直接在abaqus gui中进行编程操作。主要采用python进行编程,python处理大模型时候会出现速度慢的现象,为此,abaqus提供了C++二次开发工具,但C++二次开发对使用者有一定门槛,目前很少见到采用C++进行二次开发的,更多的是用python编程,然后优化程序提高计算速度。
abaqus提供了若干种建模二次开发方式,这里只介绍一种方式,即在外部完成python程序,然后在abaqus中通过“run script”按钮运行程序,如下面的程序
"""
modelAExample.py
A simple example: Creating a part.
"""
from abaqus import *
from abaqusConstants import *
backwardCompatibility.setValues(includeDeprecated=True,
reportDeprecated=False)
import sketch
import part
myModel = mdb.Model(name='Model A')
mySketch = myModel.ConstrainedSketch(name='Sketch A',
sheetSize=200.0)
xyCoordsInner = ((-5 , 20), (5, 20), (15, 0),
(-15, 0), (-5, 20))
xyCoordsOuter = ((-10, 30), (10, 30), (40, -30),
(30, -30), (20, -10), (-20, -10),
(-30, -30), (-40, -30), (-10, 30))
for i in range(len(xyCoordsInner)-1):
mySketch.Line(point1=xyCoordsInner[i],
point2=xyCoordsInner[i+1])
for i in range(len(xyCoordsOuter)-1):
mySketch.Line(point1=xyCoordsOuter[i],
point2=xyCoordsOuter[i+1])
myPart = myModel.Part(name='Part A', dimensionality=THREE_D,
type=DEFORMABLE_BODY)
myPart.BaseSolidExtrude(sketch=mySketch, depth=20.0)
myViewport = session.Viewport(name='Viewport for Model A',
origin=(10, 10), width=150, height=100)
myViewport.setValues(displayedObject=myPart)
myViewport.partDisplay.setValues(renderStyle=SHADED)
以上程序来源于abaqus官方文档。这里只讲解概念,不讲解程序细节。
可以在“start session”界面点击“run script”,然后选择已经编写好的py文件。
也可以在abaqus主界面的菜单栏依次选择file->run script
上面程序的运行后,abaqus会创建如下模型
以上是通过python在abaqus gui界面中进行模型二次开发。
abaqus还提供了inp文件二次开发方式,即完全通过自编程序生成inp计算文件,然后通过bat文件或者直接在作业界面进行计算。这种二次开发方式对学者能力有较高要求,需要非常的熟悉abaqus的inp文件,还需要非常熟悉有限元计算的各个流程。
一般来讲,不建议采用这种方式进行建模,更好的方法是将两种建模方式进行结合,即一部分通过python实现,然后导出inp计算文件,在导出的inp文件中手动修改少部分内容。
贰
子程序二次开发
abaqus建模二次开发用于解决模型的问题,abaqus子程序二次开发则涉及到有限元核心计算的方方面面。
abaqus本身为学者提供了非常强大的功能,但是对于特定问题,如复杂的温度荷载、切削分析等等,abaqus自身功能无法解决,但是abaqus向学者提供了一系列的二次开发接口,即abaqus子程序,学者可以自己编程实现特定需求,然后以子程序的形式嵌入进abaqus主程序中。
子程序二次开发的大致流程为:按照自己的理论进行公式推导,离散为有限元格式,然后编程,编译运行。
如下面展示了uel二次开发接口
SUBROUTINE UEL(RHS,AMATRX,SVARS,ENERGY,NDOFEL,NRHS,NSVARS,
1 PROPS,NPROPS,COORDS,MCRD,NNODE,U,DU,V,A,JTYPE,TIME,DTIME,
2 KSTEP,KINC,JELEM,PARAMS,NDLOAD,JDLTYP,ADLMAG,PREDEF,NPREDF,
3 LFLAGS,MLVARX,DDLMAG,MDLOAD,PNEWDT,JPROPS,NJPROP,PERIOD)
C
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION RHS(MLVARX,*),AMATRX(NDOFEL,NDOFEL),PROPS(*),
1 SVARS(*),ENERGY(8),COORDS(MCRD,NNODE),U(NDOFEL),
2 DU(MLVARX,*),V(NDOFEL),A(NDOFEL),TIME(2),PARAMS(*),
3 JDLTYP(MDLOAD,*),ADLMAG(MDLOAD,*),DDLMAG(MDLOAD,*),
4 PREDEF(2,NPREDF,NNODE),LFLAGS(*),JPROPS(*)
user coding to define RHS, AMATRX, SVARS, ENERGY, and PNEWDT
RETURN
END
abaqus提供了两种编程语言用于子程序二次开发,分别为fortran和C++,最经常用的是fortran,一种古老的计算语言,但是在计算速度方面,有一种不让廉颇的气魄。
这里介绍两种调用子程序的方法。
一种为采用bat文件调用。将编写好的for文件和事先准备好的inp文件放到同一个文件夹中,然后再准备一个bat文件,下面给出一个例子
call abaqus job=jobname.inp user=user_subroutine.for cpus=10 interactive
pause
上面的语句涉及到inp文件名称、子程序名称和cpu个数,然后直接双击准备好的bat文件就能运行子程序。
另一种调用方法是直接在abaqus gui中定义job然后调用子程序,具体的步骤为
在Module中进入job部分,点击create job,在source中选择input file,如
这便将inp文件导入了,然后点击continue,调用子程序
按照上面的步骤,选择事先准备的fortran子程序,然后点击提交计算即可。
abaqus子程序二次开发是一项非常有挑战性的工作,需要学者熟悉有限元计算的方方面面,还要懂商业有限元软件内部的运行机制等等,对使用者的数学功底、编程功底等等有着较高的要求。
叁
后处理二次开发
后处理在计算结果展示时候有着重要的作用,当abaqus自带的后处理功能不能满足使用要求时,常常将数据导出到第三方软件中进行可视化,如:tecplot、sufur和paraview等等软件,这是后处理二次开发的一个使用场景。
另外,当自己想要的结果中abaqus没有输出的时候,自己就需要依据abaqus输出的计算结果进行二次计算,这时候也需要将abaqus的计算结果导出,自己编程进行后续的计算。
当采用一些子程序的时候,会影响到abaqus的可视化,如采用uel子程序的时候,odb中的单元室无法显示的,只有一系列的“XXXX”显示在窗口中,如
这时候也需要将abaqus的计算结果用python或者C++提取出来,导入到三方软件中进行可视化。