使用python进行ABAQUS的二次开发的简要说明(by Young 2017.06.27)

(所有用词以英文为准,翻译仅供参考)

一、abaqus二次开发总述:

首先最重要的知识点需要明确,abaqus在求解核心(Solver/ Kernel)和图形用户界面(GUI)之间使用的交互语言天然就是python,因此使用python进行abaqus二次开发是十分自然的选择(当然你也可以用C++,但是鉴于python所拥有的各类开源库函数的优势,python应当是二次开发的首选)。abaqus已经使用python写好了很多用于计算、建模、GUI等操作的模块,因此二次开发的重点在于灵活调用这些模块,完成自己的设计计算需求。所以原则上,所有能通过abaqus/CAE交互完成的操作,使用脚本都可以实现。并且由于Python提供的丰富的函数资源库,会使得很多复杂的建模的过程更加参数化,更加可控,有时候甚至更加简单。

其次二次开发的学习要点在于勤查手册,其中Abaqus Scripting User's Manual和Abaqus Scripting User's Reference Manual是查阅的重点,其中后者是abaqus中各个object内置方法,路径,输入参数等的详细说明。

最后关于调用脚本的几种用法说明:

(1)直接在命令行调用

    调用脚本并打开cae界面: abaqus cae script=myscript.py

    调用用于可视化操作脚本,打开显示界面(注意:此时只有visualization模块被激活): abaqus cae viewer=myscript.py

    调用脚本在命令行执行,同时不打开GUI界面,但会进入python交互界面:abaqus cae noGUI=myscript.py

(2)在abaqus的GUI界面调用

    按照Main Menu: File->Run Script,选择需要调用的脚本文件,abaqus会进行执行

(3)在abaqus的命令行交互界面调用(command line interface,CLI)

    在abaqus的GUI界面打开之后,窗口的最下方会有命令输入的位置,在这里也可以调用python脚本,执行方法是键入命令:

    

execfile('myscript.py')

abaqus的python脚本其实和其他应用场景下的python脚本没有太多区别,只不过有很多abaqus已经开发好的对象库可供使用,其学习过程和学习任何其他python库都是一致的。因此这条在写python代码时的规律对于理解abaqus脚本中的各种现象同样很有帮助:一切皆对象(当然这也是python语言美感的来源之一)。

这里篇幅有限,无法展开介绍python编程,因此只明确python中的几个基本概念:

对象(object): 将具有特定数据结构与组织形式的数据和在数据上所定义的操作全部封装到一起的封装体称为对象;

成员(member):对象内所定义的数据;

方法(method):在对象内定义的对于数据的操作;

构造函数(constructor):一类特殊的方法,用于创建新的对象;

类(class):创建对象的模板,本质也是一种对象,但是更强调它的模板性;

模块(module):已经写好的类,对象,方法或者函数等等的集合,通过一系列操作完成某种特定的功能,module的作用在于方便代码复用,例如from abaqus import * 这个语句就是导入了abaqus这个模块,使得其中功能可以被脚本引用;

字典(dictionary):python中的一种数据类型,无序排列的(key,value)的pair的集合,在abaqus的脚本开发中是十分重要的概念。

 

二、abaqus python脚本构成简述:

尽管整体上看,abaqus的python脚本没有什么特殊之处,但是毕竟作为在abaqus环境下使用的脚本,还是有一些特殊之处是值得一提的。

首先介绍abaqus python脚本中几个比较重要的基本概念:

数据库(database):负责存储模型的各种信息,本质上是一类特殊的对象,也可以理解成带有强烈abaqus特征的对象,比较典型的database就是mdb;

容器(Repository):负责同一类型的对象的存储,可以视为python中的字典,只不过这个字典专门用于存储某一类对象,比如mdb.models中存储了当前环境下所建立的所有模型对象,通过对象的键值,可以实现对于特定对象的调用;

声明使用(Access):通过在脚本开头声明导入某类模块,从而获得该模块中对象、成员和方法的使用权(实际上新的session被打开时,所有模块都被装载了,大部分声明是为了可读性与完备性,但有一些声明是不可以缺少的,后文会提到)

路径(Path):调用某个特定方法的具体语句实现,比如这里mdb.models[name].parts[name].DatumAxisByCylFace就说明了使用DatumAxisByCylFace这个方法的完整路径,需要从mdb这个数据库出发,索引到叫name的model对象,在这个model对象下索引叫name的part对象,这个part对象里面定义了一个方法叫DatumAxisByCylFace。当然同一个方法的路径可以有很多,这一点应当与python语言内在的继承性有关,相似的对象(类)继承自同一个父类,那么不同对象下具有同样的方法其实并不奇怪;

参数(Argument):对象的方法在使用时所需要的输入参数;

2.1. 所有的脚本都必须保证以下面两个语句开头:

 

from abaqus import *
from abaqusConstants import *

第一个语句保证脚本可以使用abaqus中基本的object,同时保证脚本可以使用默认的模型数据库(mdb),在abaqus中以mdb标识;

第二个语句保证Abaqus中定义的各个符号常量可以被脚本正确获取;

当然如果有涉及结果文件后处理还需要:

 

from odbAccess import *

如果涉及可视化操作则需要:

 

from visualization import *

2.2. 随后脚本会导入需要使用的具体的各个模块,例如:

 

import sketch
import part
import assembly
import material
import visualization

这一步的操作是为了保证所需要使用的对象的成员(Members)和方法(Methods)可以被脚本所使用,以material为例:

 

import material
mdb.models[name].materials[name]

 

这里插一句,对于多数已经适应了面向过程编程的人而言,在使用面向对象语言时常常会有看不到赋值操作的慌张。因为乍看起来那个语句没有输出,但显然如果真的没有任何“输出”那必然是无效的编程语句,因此会感到十分困惑和迷茫。所以这里需要强调的是,在面向对象语言中,对象(Object)是数据(Member)和在数据上定义的操作方法(Methods)的集合体,所以当我们使用一个对象的方法时,它所对应的数据成员有可能已经得到了修改,因此我们并不需要额外的赋值操作,对数据的操作(包括赋值)已经在对象的方法里预先定义好了,而这也是为什么人们觉得面向对象的封装性更好的原因。

这里给出一个材料定义的例子:

 

mdb.models[crash].Material[steel]
mdb.models[crash].materials[steel].Elastic(table=((30000000.0, 0.3), ))
elasticityType = mdb.models[crash].materials[steel].elastic.type

通过观察,其实我们已经能发现一个小规律,那就是在abaqus中,同样名称的单词(如这里的material),当它首字母大写(通常作为单数)出现时一般是构造函数(Constructor),而当它全小写(通常作为复数)出现时,它一般是类似字典的容器(abaqus里叫做

repository),它们之间的联系在于那个构造函数是用于构造这个容器中所储存的对象的。在这样认识的基础上,可以很容易避开操作中的一个易错点,那就是什么时候该用什么类型的括号。显然构造函数后面需要的是输入参数(arguments),因此是圆括号,而字典类数据库后面需要的是指示符(index),因此是方括号。

需要注意的是:同样的构造函数,在使用的时候可以有不同的路径(path),如建立Datum的构造函数:

 

mdb.models[name].parts[name].DatumAxisByCylFace
mdb.models[name].rootAssembly.DatumAxisByCylFace

因此同样的构造函数会有各种各样的调用路径,只要这个方法确实是构造函数,那么关于它路径的描述就会在Abaqus Scripting User's Reference Manual中被列出。

2.3.1. 在这之后,对于不是用于后处理的脚本,通常需要建立一个新的模型:


myModel = mdb.Model(name = 'Model A') 

简单解释下这个语句的含义,首先python语言中一切皆对象,不论abaqus管一个对象叫object还是叫database都不能改变其内在的object(对象)属性,之所以会有不同名称,是因为在使用过程中强调的侧重有所不同。所以用python语言来解释就是利用mdb这个对象(abaqus里叫database或者Python里其实应该是一个class)的其中一个Model方法(更确切的说,在这里是一个构造函数,constructor),建立了一个新的对象,并将这个对象赋值给了名为myModel的变量,而在方法Model中,需要的输入参数之一是模型名称name,该参数被赋值为‘Model A’。同样的操作在abaqus里解释起来也可以换一种描述,那就是:我们建立了一个名称为‘Model A’的新模型,将它存储在mdb这个database里,并且将这个新模型的引用交给了变量myModel。

在这里有必要明确一下两种会引起混淆的引用手段:

myPart = myModel.Part(name='Part A', dimensionality=THREE_D, type=DEFORMABLE_BODY)

 


myPart = mdb.models['Model A'].Part(name='Part A', dimensionality=THREE_D,                              type=DEFORMABLE_BODY)

从功能上来说,两种引用的效果是相同的,第一种引用是直接引用已经生成的Model对象实例,而第二种引用则是通过在mdb中找models这个字典下对应的‘Model A’的实例,但是这两者殊途同归。

2.3.2. 如果已经有了现有的模型,同样可以通过读取现有的数据文件来进行二次开发:

这样就没有了新建模型的步骤,取而代之的是一个读取命令:

openMdb(pathName)

通过给出指定路径abaqus会打开已经建立的database文件(通常默认后缀是.cae),这样我们可以针对一个已经建立的模型进行二次开发

有些时候,我们如果只有结果文件,则需要使用下面的手段从odb文件出发建立我们需要的模型:

mdb.ModelFromOdbFile(name, odbFileName)

2.4. 在建立了模型之后就是具体的操作细节了:

我们需要做的就是按照abaqus/CAE界面的基本操作流程,在脚本中将各个操作一一实现:

建立几何模型,创建材料参数,分配单元与材料属性,定义边界条件与载荷,划分网格,提交求解,后处理查看等。

 

三、查阅abaqus中对象方法描述的重要手段:

在实际的模型开发工作中,很多时候我们需要知道我们想要实现的操作在abaqus脚本里究竟如何实现,换句话说,如何才能找到合适的对象(object),合适的方法(method),以及它们所对应的路径(Path)。其实熟悉python的话就会知道,__methods__,__doc__是python中常用的查看对象(object)具有哪些方法(methods),方法(Methods)如何使用的两个重要属性(attributes)。在这里又一次体现了abaqus交互操作和python的血缘关系。

因此可以通过__method__来查看一个对象所定义的全部方法,如:

 

mdb.__methods__
myOutputFile.__methods__

同样可以通过__doc__来查看一个对象所定义的某一个方法该如何使用,如:

 

mdb.Model.__doc__
session.Viewport.__doc__

此外还有查阅对象的member列表的方法如下:

objectName.__members__ 

而在abaqus中使用print命令有时候也能查看到member的信息,用法很简单,范例如下:

print nodes1[0]

输出结果:

({'coordinates': (680.0, -115.0, -7.03889030395644e-11), 'instanceName': 'model-1', 'label': 11})

范例2:

p=mdb.models['myModel'].parts['myPart']
print p

输出结果:

({'allInternalSets': 'Repository object', 'allInternalSurfaces': 'Repository object'...}) (结果过长,不完整展示)

可以看到通过print函数,可以极为方便地获取到想要了解的对象的member信息。

python里有时也会用到.__dict__这个属性,这个属性在abaqus里可能不太容易获得需要的信息,但是在import mesh模块之后,mesh.__dict__还是有惊喜的。

那么基于之前的讨论,在遇到某个特定操作不知道如何在脚本中实现时,这里给出一个可供参考的思路:首先确定基本的父级对象,比如想知道如何构造一个具体的材料模型,那父级对象就是mdb.models['myModel'],那么接下来通过mdb.models['myModel'].__methods__我们可以获得model对象中定义的所有方法,根据关键字我们可以找到Material这个构造函数,随后我们通过 mdb.models['myModel'].Material('NewMat')来新建一个material对象‘NewMat’,随后通过mdb.models['myModel'].materials['NewMat'].__methods__我们可以看到刚刚建立的材料对象都有哪些方法可以使用,就能知道具体可以定义那些材料,比如找到了Elastic这个构造函数,那么再使用mdb.models['myModel'].materials['NewMat'].Elastic.__doc__就能够知道Elastic这个构造函数的相关操作,如果描述不足的话,我们可以根据所获得的信息到Reference Manual里去查找更具体的信息。这样信息查找的来源可以变得更加丰富。最常见的基础父级对象是mdb,session还有mesh,从这几个对象出发,再加上abaqus对于对象和方法的命名很少使用缩写,同时结合参考手册,是能够确定大多数操作所对应的脚本实现语句的。

当然还有另外一种更加直接的思路,如果对GUI界面操作十分熟悉的话,利用GUI操作点选实现想要的功能,然后查阅工作路径下生成的.rpy或.jnl文件记录,就能够获得相应GUI操作所对应的脚本命令

 

四、abaqus中数据类型都有哪些(Abaqus Scripting User's Manual 5.3节):

4.1. SymbolicConstants (符号常量)

如前所述,from abaqusConstants import * 语句是调用这些常量的前提。这些常量都以全文大写的形式出现,这些常量会作为一些方法的输入参数,或者是为对象成员赋值时出现。举例说来,Elastic这个对象的type成员的值就可以是下列这些符号常量:

ISOTROPIC,ORTHOTROPIC, ANISOTROPIC, ENGINEERING_CONSTANTS, LAMINA, TRACTION, 或者COUPLED_TRACTION

当然在需要的时候,甚至可以通过

SymbolicConstant这个构造函数来构造用户自己的常量

4.2. Booleans(布尔类型变量)

和python中定义的布尔数类型是相同的,分为True和False两种取值,但是需要注意的是abaqus还有一类自己定义的布尔值,可以取ON和OFF,使用type函数时,会提示值为

AbaqusBoolean,这里需要注意一下。

4.3.

Repositories(容器型变量)

这是abaqus中最为重要的变量类型,是各种操作得以实现的基础,它很像python中的字典(dictionary)。举个例子,

mdb.models就是一个包含所有定义的model的Repository,通过model的名称(类比字典里的键值),就可以提取出这个名称对应的模型对象:mdb.models['Model-1']。而进一步,mdb.models['Model-1'].parts则可以引用所有在‘Model-1’之内的part对象。

如果需要查看容器内已经定义的对象名称和值,通过mdb.models.values()和mdb.models.keys()可以得到容器内已经定义的对象信息。key对应对象名(键),value对应对象(值)。这里操作不仅针对models这个容器有效,换成其他任意的容器,操作都是类似的,比如mdb.models['Model-1'].sketches.keys()可以查看所有创建的Sketch的索引键。

 

五、几何建模操作说明(几何建模命令的主要集中于37节parts commands和48节sketcher commands)

5.1. abaqus建模时基本几何元素对象的说明:(Abaqus Scripting User's Reference Manual, Part I 第7章 Basic geometry commands

    5.1.1. Cell/CellArray 对象: 

        体几何元素,这里以体几何元素为例,着重谈一下有Array和没有Array的区别。Cell 对象指的是一个单独的体对象,而CellArray对象指的是一群体对象的序列,它们的引用方法类似但是有所区别,如果是引用Cell对象的话:mdb.models[name].parts[name].cells[i]等可以实现调用,注意这里明确给出了下标,所以这里引用的一定是某一个具体的体对象,而Cell Object中定义的方法大多也只能作用於单独的一个体,如果引用CellArray对象的话,mdb.models[name].parts[name].cells等可以实现调用,注意区别,没有下标了,所以这是针对体对象所构成的集合对象的引用,而在CellArray下定义的方法自然多是用于处理多个体对象的。

    5.1.2. Edge/EdgeArray 对象:

        一维线几何元素

    5.1.3. Face/FaceArray 对象:

        二维面几何元素,这里以FaceArray对象为例,介绍一个十分有用的方法,findAt(...) ,这个方法可以根据座标选择需要执行操作的面对象

    5.1.4. Vertex/VertexArray 对象: 

        零维点区域几何元素,可以理解为顶点。

5.2. 在草图(sketch)中构建几何对象(48.5节 ConstrainedSketcherOptions object)

 

mdb.models[name].ConstrainedSketch(name='yourName', sheetSize=Value)

可以创建一个新的草图(Sketch),这个草图(Sketch)会被储存在sketches这个repository里,如要访问草图,那么路径是mdb.model['name'].sketches['name']。在Sketch中可以创建Arc,Circle,Ellipse,Fillet,Line这些几何元素,这些几何元素会以mdb.models[name].sketches[name].geometry[i]的形式储存在geometry这个repository里,每一个index都对应一个独立的几何对象,并可以对其使用相对应的方法进行操作

草图绘制中旋转矩阵(transform matrix)的说明,这个矩阵可以用于描述所要建立的sketch在三维global 座标系下的方向和位置,这个变换矩阵会由两部分组成,一部分是3X3的旋转矩阵,还有一部分是描述平移的三维向量。

5.3. 高亮显示几何元素操作 (Abaqus Scripting User's Reference Manual, Part I,11.7节 Highlight commands)

这是十分常用的操作,用于高亮选中的几何元素,判断是否是自己需要的,在建模、施加载荷中会频繁用到,其用法十分简单,直接:highlight(object) 就可以完成,更具体的例子类似这样:

# Find baseline according to onPoint coordinate
baseline = e.findAt(((x,-y,0.0)),)
highlight(baseline) #You will see the highlighted line in your viewport

 

highlight命令所支持的高亮对象包括:

mdb下:Vertex, Edge, Face, Surface, Cell, Node, Element, Element Face, Element Edge, Feature, Datum, Instance, Set, Load, Boundary condition, Predefined field, Display group, 

odb下: Node, Element, Display Group

如果要取消高亮,那么对应的命令是unhighlight()

5.4. 关于Sketch平面的几点说明

sketch平面是建模中常常会使用到的辅助平面,正确理解sketch平面方向的定义过程有助于建模过程的快速实现,下面给出的是一个定义sketch平面的组合语句块:

 

p = mdb.models['myModel'].parts['myPart'] #取出part信息
d1 = p.datums #取出参考几何元素容器的信息
#在所要绘制草图的平面建立一个参考平面
lbs1 = p.DatumPlaneByPrincipalPlane(principalPlane=YZPLANE, offset=500.0) 
#建立一条参考线备用,用于确定sketch平面x轴方向
edge =p.DatumAxisByTwoPoint(point1=(0.0,0.0,-1000.0), point2=(0.0,1000.0,-1000.0)) 
#利用之前的参考信息生成所需sketch平面的转换矩阵(会考虑旋转和平移)
t = p.MakeSketchTransform(sketchPlane=d1[lbs1.id], sketchUpEdge=d1[edge.id], 
                       sketchPlaneSide=SIDE1, origin=(500.0, 0.0, 0.0)) 
#使用刚刚新建的转换矩阵t,完成sketch平面的创建
s = mdb.models['myModel'].ConstrainedSketch(name='__profile__', sheetSize=1000.0,
                                            gridSpacing=20.0, transform=t)

 

关于sketch平面座标系定义的问题这里值得讨论一下:MakeSketchTransform这个constructor中sketchPlane关键字负责控制sketch所在的平面,sketchUpEdge负责控制sketch平面的方向,可以与

sketchOrientation参数配合使用,sketchOrientation默认是RIGHT,因此sketchUpEdge可以用于指示x座标轴所指向的方向,从sketch的origin出发指向sketchUpEdge的方向即为x轴正方向,或者说y轴会与此sketchUpEdge平行。而sketchPlaneSide负责控制参考面法向,其实控制了sketch平面使用左手系还是右手系,x单位向量与y单位向量的叉积与平面法向量方向相同时使用关键字SIDE1,与平面法向量反向相反时使用SIDE2。

这个语句组模块的有用之处在于后续可能涉及sketch的命令:例如常用的CutExtrude等,是需要设置sketchPlane,sketchUpEdge等信息的,因此强烈建立在使用这些命令前先利用MakeSketchTransform建立对应的sketch平面,随后在CutExtrude这些后续命令中使用完全相同的sketch平面设置,这样做的好处是可以避免潜在的设置冲突,否则错误的排除是十分棘手的,因为建模问题首先排查的可能是几何参数冲突。

如果sketch的名称被命名为__edit__的情况下,那么abaqus会将参考几何和非单位矩阵的转换矩阵完全拷贝下来,以进行进一步的修改,如果为其他名称的话,那么sketch构造函数会去除reference geometry,重设转换矩阵,创建一个完全独立的新sketch。(参见Scripting User's Reference Manual 48.1.2 节关于ConstrainedSketch的描述:If the name of the sketch to be copied to is __edit__, Abaqus creates an exact copy that contains both reference geometry and a nonidentity transform matrix. Otherwise, the Sketch copy constructor strips the reference geometry from the copied sketch and sets the transform matrix to identity, creating a standalone copy.)此外,当使用"__profile__"来命名时,GUI界面是无法查看到所建立的sketch的,使用完后abaqus会自动销毁。

5.5. 关于显示的说明:

通过session的viewports数据库的方法进行显示设置也是常见的途径,样例代码如下所示:

session.viewports['Viewport: 1'].setValues(displayedObject=p)

其中'Viewport: 1'是默认的viewport名称,通过setValues的方法可以对显示做设置,这里命令的含义是在默认的viewport中显示对象p。在这里可以显示的对象类型包括StubType, Part, ConstrainedSketch, Assembly, XYPlot, oda_ModelIntObj, or BeamProfilePlot。其中Part,ConstrainedSketch和Assembly的显示在建模过程很有帮助。

 

六、网格划分操作说明(着重参考Script User's Reference Manual 31节:Mesh commands的部分 

Mesh命令可以用于划分part instances 和regions,也可以用于分配单元尺寸,单元类型和网格划分的控制参数。

6.1 撒种子(seed)的相关操作:

seedEdgeByBias(...) 按照一定的比例非均匀的撒种子seedEdgeByNumber(...)按照给定的单元数目均匀的划分edgeseedEdgeBySize(...)按照单元尺寸均匀的划分edgeseedPart(...)在给定区域按照单元尺寸为指定part分配种子位置

代码示例:

 

mdb.models['myModel'].parts['myPart'].seedPart(size=5.0)
p=mdb.models['myModel'].parts['myPart']

6.2 设置单元的相关操作:(此部分代码里的p是从parts里提取出的一个part object,承接之前代码案例)

setMeshControls(...) 控制指定区域的mesh参数,代码示例:

 

p.setMeshControls(regions=pickedRegions, algorithm=MEDIAL_AXIS)

关於单元类型设置,手册31.3节 ElemType object也可以进行element类型的设置,这里的设置参数会更加详细,代码示例:

 

elemType1 = mesh.ElemType(elemCode=S4R, elemLibrary=STANDARD,                            secondOrderAccuracy=OFF)elemType2 = mesh.ElemType(elemCode=S3, elemLibrary=STANDARD)

setElementType(...) 分配单元类型,将设置好的单元object分配到各个指定区域:

 

p.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2))

6.3 网格生成方式:

网格生成的通常有两类,top-down和bottom-up两类。前者的一般步骤是建立几何体,撒种子,控制划分参数,划分网格,generateMesh(...) 是此类生成mesh方法所需要调用的命令,在撒好种子之后,通常用这个方法生成对应的mesh;

示例参考代码如下:

 

p.generateMesh()

后者,也就是bottom-up的方法,是从低维度的网格元素出发向上构建模型网格,比如针对某些具备对称性或周期性的网格,通过2D网格生成3D网格,常用的方法有:

generateBottomUpExtrudedMesh(...)使2D网格沿指定向量延伸生成3D网格,generateBottomUpSweptMesh(...)通过2D网格扫略生成3D网格,generateBottomUpRevolvedMesh(...)通过2D网格绕指定旋转轴旋转生成3D网格。

 

七、装配操作说明(着重参考Script User's Reference Manual 6节:Assembly commands的部分 

首先对abaqus内的装配过程做下简单说明:装配涉及的要素主要是Part、Instance、Assembly还有model。Part可以理解为机械系统的单个零件的模板,instance是零件的实体,Assembly是零件组装的过程,model是零件组装出的机械结构,可以是局部结构,也可以是整体结构。很显然有些零件的复用程度高,就像螺栓螺母等标准件,在之后划分网格时并不希望对同样的结构进行多次划分,而是希望以一次划分为模板从而其他标准件的划分可以跟随改变,这样就衍生出了dependent和independent的instance,顾名思义dependent的instance网格划分是彼此关联的,independent则彼此独立。不同的part在创建时都是在各自的座标系里,彼此不干涉,但是当需要一个整体结构时就需要将part对应的instance进行组装,使它们能按照预想的方位去组织结构,这个过程就是Assembly,而参与Assembly的只会是instance,而不能是part,否则会引发错误。在实际操作中的组装是有多个层次的,大系统里可能嵌套小系统,直接组装大系统会带来巨大的座标计算的麻烦。这时候我们需要先针对局部系统组装出一个低级别的model,然后在更高级别的model里通过之前的低级别model来创建instance,之后调用这个instance在高级别的model里面完成复杂系统的组装。但是无论是哪个级别的model,都只能有一个Assembly。这里先了解下脚本中的Assembly对象,abaqus在Model对象创建时会同时创建一个rootAssembly的成员(member),通常使用的路径是:

 

import assembly
mdb.models['myModel'].rootAssembly

在装配问题中,常常会涉及多个座标系的处理,因此在这个部分,新建一个参考座标系会很有帮助:

 

a=mdb.models['myModel'].rootAssembly
a.DatumCsysByDefault(coordSysType=CARTESIAN)

这里再补充一下part的创建命令:

 

p = mdb.models['myModel'].Part(name='myPart', dimensionality=THREE_D, 
                               type=DEFORMABLE_BODY)

出于装配的需要,由part出发新建PartInstanc对象也是常用的命令:

 

mdb.models[name].rootAssembly.Instance(name='myInstance',part=p)

这里展示一个组装的案例:

 

a=mdb.models['cyclinder_shell_group'].rootAssembly
ins1=a.Instance(name='c1',part=part1)
face1=ins1.faces[0]
ins2=a.Instance(name='c2',part=part2)
face2=ins2.faces[0]
a.Coaxial(movableAxis=face1,fixedAxis=face2,flip=OFF)

这段代码将两个圆柱面以同轴的形式加以组装,要注意组装时候使用的几何元素应当来自Instance object,如果来自part会引起错误。

 

八、载荷与边界条件施加说明(着重参考Script User's Reference Manual 9节:Boundary Condition commands的部分 

首先介绍在这个过程中十分有用的一条命令:regionToolset.Region(...),通过这条命令可以选择指定的元素集合,并在其上施加载荷或边界条件。不仅如此,在很多其他场合,这条命令也是十分有用的(注:涉及区域选取的命令可以参考45.3节Region Object的部分)。需要注意的是abaqus不会为region object提供任何的repository,因此在使用时需要注意分配变量保存所创建的region。示例代码如下:

 

import regionToolset
myRegion = regionToolset.Region(vertices=v[2:4],edges=e[4:5]+e[6:9])

具体可提供的输入参量可查阅手册。另外提一下,与region命令相类似的的还有set相关的命令:

 

import part
set = mdb.models['Model-1'].rootAssembly.Set(name='mySet', faces=f[3:4], 
                                             xEdges=e[1:3]) 
                                           

在这个命令里,一个面被选择作为set,但是将构成面的两条边排除在了set之外。

有时候也可以是region与set的连用,例如:

eset = a.Set(edges=selected_edges, name='myEdges')
selected_nodes = a.sets['myEdges'].edges[v].getNodes()
nset = a.Set(nodes=selected_nodes, name='myNodes') 
region = a.sets['myNodes']

就施加载荷与边界条件而言,在选中了所要施加的对象之后,就是调用相应的命令将载荷或是边界条件施加到相应的位置了,例如位移边界条件的施加:

mdb.models['Model'].EncastreBC(name=‘L’, createStepName='Step', region=region)

具体的施加方法查阅手册的相应章节即可获得。

 

九、任务提交与后处理说明(参考Script User's Reference Manual 26节:Job commands的部分 

首先是新任务的创建命令,可以基于mdb数据库中已有的信息创建一个新的job用于之后的提交计算,样例如下:

import job
mdb.Job(name='newJob', model='myModel')

随后还有涉及到job的提交的相关命令:

 

mdb.jobs['newJob'].submit()
mdb.jobs['newJob'].waitForCompletion()

这里的两条命令,第一条用于提交生成的job,第二条用于暂停执行脚本,等待任务求解完成再继续脚本执行

 

十、绘制显示的说明(参考Script User's Reference Manual 11.4节 Viewport object、35节Odb Display commands、47节:Session commands以及54节View commands的部分 

大部分的前后处理显示操作都是与viewport对象相关的。viewport是abaqus用于储存应用产生的图像的容器,一个viewport对象中会储存关于各个对象在当前viewport中如何显示的各种设置。下面通过示例代码来展示相关操作的实现:

 

import session
session.Viewport(name='myViewport',origin=(20,20),width=90)
session.viewports['myViewport'].bringToFront()
session.viewports['myViewport'].makeCurrent()
session.viewports['myViewport'].setValues(displayedObject=myPart)

这段代码的功能包括创建一个新的viewport,将其前置可见,使其成为当前激活的viewport,最后在其上显示之前保存的part对象。

odbDisplay的这个部分,主要是用于后处理的显示,详细的使用参见手册。

session command这部分命令所创建的对象并不与模型一起储存,这些对象的生命周期是与当前session相关的,如果当前session被销毁的话,那么所创建的object会跟随被销毁。

 

附录A1  Abaqus GUI Toolkit简介:

Abaqus GUI Toolkit是abaqus自动化流程处理的工具之一,可以充分扩展Abaqus/CAE的GUI功能,提供更高效的问题解决方法。关于这个部分的学习,主要应当参考Abaqus GUI User's Manual和Abaqus GUI Toolkit Reference Manual,其中第一个manual是工具使用的介绍,第二个manual是相关class和method的详细记录。这个模块的作用在于实现用户自定义的界面开发,使Abaqus的功能能够最大化的适应用户的特定需求。

A1.1 Abaqus为用户开放的开发接口介绍:

abaqus在各个层次上都有开放接口给用户实现定制化开发,对于Abaqus实现用户定制化设置可以有以下几种途径,其功能也各不相同:

(1)User subroutines:可以变更Abaqus/Standard和Abaqus/Explicit计算分析的方式,例如可以使用subroutine自定义材料本构,开发标准库之外的材料响应。换句话说user subroutine可以进入Abaqus计算求解分析的内核,并被求解器的内核所调用,需要的话可以查阅Abaqus User Subroutines Reference Manual;

(2)Environment files:用于更改Abaqus的默认设置,比如配置用户熟悉的求解环境等,属于最表层的个性化定制,程序的主体和界面不会脱离abaqus设计的范畴,可以查阅Abaqus Analysis User’s Manual来获得更多的信息;

(3)Kernel scripts:用于创建各类新的函数,执行用户定义的建模和后处理的任务,也就是常说的Abaqus二次开发,整体说来是通过python脚本调用abaqus的各个成熟模块更高效更有针对性的进行建模、计算求解和后处理,Abaqus Scripting User’s Manual是主要的信息查阅来源 ;

(4)GUI scripts:用于创建新的用户图形界面(GUI),图形界面上实现定制化的开发。

 

A1.2 理解Kernel与GUI的关系

无论如何,有一点需要知道,那就是Abaqus GUI Toolkit的运行是离不开Abaqus/CAE环境的,只有在这个环境下一些底层的功能才能正常使用和工作。因此理解Abaqus/CAE的执行过程是十分有益的。Abaqus/CAE的执行分为两个分离的部分:Kernel(内核)和GUI(用户图形界面)。Kernel的功能在于访问Abaqus各个数据库,通过命令实现数据库的创建与修改,从而完成计算任务的执行,而GUI的作用在于收集用户输入,然后将这些输入打包成命令流发送给Kernel去执行。从这个角度看,即使没有GUI界面,计算任务也可以通过Kernel脚本的方式直接实现。因此真正有吸引力的GUI开发是和Kernel脚本分不开的,通过Kernel脚本实现某些特定的功能,然后通过Abaqus GUI Toolkit将各种功能封装起来实现外层的GUI展现,这样的定制化开发可以大大降低用户的使用门槛,极其有功能针对性地进行深度二次开发。

Abaqus GUI Toolkit是FOX GUI Toolkit的扩展,这是用C++完成的GUI实现库,这些库里的类基本都是用于图形界面的开发。Abaqus GUI Toolkit中会有两种不同的类名,其中以FX开头的类就是FOX的标准类,而以AFX开头的类则属于经过Abaqus扩展的库。

所以,Abaqus GUI Toolkit的学习需要python语言的知识,对于Kernel scripts的理解,对面向对象语言的理解,最后还需要对于GUI设计有一定的了解。

 

 A1.3 Abaqus GUI Toolkit可以实现的功能:

通过这个模块能实现的功能包括:

(1)创建一个全新的GUI模块(Module),GUI模块指的是具有相似功能的组合体,例如Abaqus/CAE里的Part,Assembly等模块;

(2)创建一个新的GUI工具集(Toolset),这个和GUI模块有些类似,所不同的在于工具集可能会被多个模块共同使用,例如Abaqus/CAE中的Datum工具集;

(3)自定义对话框与执行窗口满足个性化需求;

(4)有选择的显示或隐藏已有的Abaqus模块或工具集,有选择的设计菜单栏与各个选项;

(5)或者干脆在Abaqus/CAE模块上做简单修改。

 

A1.4 Abaqus GUI Application的构成要素:

一个Abaqus GUI Application构成要素可能包括一下这些元素:

Widget : 最基本的构成元素,用于收集用户输入,比如一个空白的文字域,或者一个勾选框

Layout manager:负责Widget的布局安排

Dialog boxes:使用Layout manager将Widget组封装起来,为某个特定功能提供对应的输入对话框

Modes:用于控制特定用户界面的显示,也负责该界面相关命令的分发

Modules and toolsets:将具有相似功能组装在一起就构成了模块与工具集

Applications:负责相对高级的活动实现,例如管理Application所要使用的GUI进程,更新Widget的状态,负责与桌面窗口管理的交互等等

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章