零概述 这个帖子文字多,但都是干货,一篇文章完全厘清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)*node1,2, 0.0143, 0.014, 0.0134, 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.pyA simple example: Creating a part."""from abaqus import *from abaqusConstants import *backwardCompatibility.setValues(includeDeprecated=True, reportDeprecated=False)import sketchimport partmyModel = 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 interactivepause 上面的语句涉及到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++提取出来,导入到三方软件中进行可视化。 来源:有限元先生