当前位置:首页 >> 机械/仪表 >>

Abaqus Python开发使用指南


Abaqus Python 开发使用指南

作者:TJ_JAC 日期:2013.09.01





1 python运行方式 ....................................................................................

................ - 1 1.1 脚本文件的运行......................................................................................... - 1 1.2 Abaqus中Python开发环境(PDE) ................................................................ - 1 1.3 EditPlus中编译py文件 ................................................................................ - 2 2. Python语言基础约束 ........................................................................................... - 3 2.1 使用注释..................................................................................................... - 3 2.2 空行的合理使用......................................................................................... - 3 2.3 代码的分隔符............................................................................................. - 3 2.4 代码的缩进................................................................................................. - 3 3 Python数据结构 .................................................................................................... - 4 3.1 序列............................................................................................................. - 4 3.1.1 索引(indexing).................................................................................. - 4 3.1.2 分片(slicing) ..................................................................................... - 4 3.1.3 序列相加........................................................................................... - 6 3.1.4 乘法................................................................................................... - 6 3.1.5 空序列([ ])................................................................................... - 6 3.1.6 成员资格检查................................................................................... - 6 3.1.7 长度、最大值和最小值................................................................... - 6 3.2 列表(list) ..................................................................................................... - 6 3.2.1 使用list函数创建列表...................................................................... - 7 3.2.2 单个元素赋值................................................................................... - 7 3.2.3 分片赋值........................................................................................... - 7 3.2.4 删除元素........................................................................................... - 8 3.2.5 列表方法........................................................................................... - 8 3.3 元组(tuple).................................................................................................. - 9 3.4 字符串....................................................................................................... - 10 3.4.1 字符串的引号表示方法................................................................. - 10 -

I

3.4.2 转义符(\)......................................................................................... - 10 3.4.3 字符串格式化................................................................................. - 10 3.5 字典(dictionary)........................................................................................ - 12 3.5.1 使用dict函数创建字典................................................................... - 12 3.5.2 字典基本操作................................................................................. - 13 3.5.3 字典的格式化字符串..................................................................... - 13 3.5.4 字典方法......................................................................................... - 13 3.6 集合(set) ................................................................................................... - 14 4 程序结构化设计......................................................................................................15 4.1 赋值魔法........................................................................................................15 4.1.1 序列解包..............................................................................................15 4.1.2 链式赋值..............................................................................................15 4.1.3 增量赋值..............................................................................................15 4.2 条件语句........................................................................................................16 4.3 运算符............................................................................................................16 4.4 循环语句........................................................................................................17 4.4.1 while循环..............................................................................................17 4.4.2 for循环..................................................................................................17 4.4.3 跳出循环..............................................................................................17 5 函数、模块和包......................................................................................................18 5.1 函数................................................................................................................18 5.1.1 内置常用函数......................................................................................18 5.1.2 函数的定义..........................................................................................19 5.2 模块(module).................................................................................................19 5.2.1 模块的创建和导入..............................................................................19 5.2.2 sys模块 .................................................................................................20 5.3 包(package)....................................................................................................20 6. 类和对象.................................................................................................................21 6.1 类的定义........................................................................................................21 6.2 创建对象........................................................................................................21
II

6.3 类的属性和方法............................................................................................21 6.3.1 类的属性..............................................................................................21 6.3.2 类的方法..............................................................................................22 6.4 类的继承........................................................................................................23 7. 文件的输入/输出 ...................................................................................................25 7.1. 文件的创建或打开.......................................................................................25 7.2 文件的读取和写入........................................................................................26 7.2.1 文件的读取..........................................................................................26 7.2.2 文件的写入..........................................................................................26 7.3 文件的删除和重命名....................................................................................26 8 Abaqus_Python脚本接口 .........................................................................................28 8.1 Abaqus_Python脚本接口简介 .......................................................................28 8.1.1 命名空间..............................................................................................28 8.1.2 Abaqus中应用Python语句的文件类型 ...............................................29 8.2 Abaqus_Python脚本接口基础知识 ...............................................................29 8.2.1 Abaqus脚本接口中的数据类型...........................................................29 8.3 Abaqus对象模型.............................................................................................32 8.3.1 Session对象 ..........................................................................................32 8.3.2 Mdb对象 ...............................................................................................33 8.3.3 Odb对象................................................................................................35 8.3.4 Abaqus中的核心模块...........................................................................35 8.3.5 抽象基本类型(abstract base type) ......................................................36 8.3.6 复制和删除对象..................................................................................36 8.3.7 指定区域(region).................................................................................37 8.3.8 指定视图中显示的对象......................................................................38 9 交互式输入..............................................................................................................40 9.1 getInput(…)函数.............................................................................................40 9.2 getInputs(…)函数 ...........................................................................................41 9.3 getWarningReply(…)函数..............................................................................42 10 Job模块对分析过程进行监控 ...............................................................................44
III

10.1 回调函数(callback function) .......................................................................44 10.2 addMessageCallback(…)..............................................................................46 10.2.1 路径(Access)......................................................................................47 10.2.2 必填参数............................................................................................47 10.2.3 可选参数............................................................................................48 10.2.4 返回值................................................................................................48 10.3 Job模块命令 .................................................................................................48 10.3.1 保存模型............................................................................................48 10.3.2 创建Job ..............................................................................................48 10.3.3 提交任务............................................................................................49 10.3.4 提交多个任务....................................................................................49 10.3.5 Job对象的使用 ...................................................................................49 10.4 回调函数的例子..........................................................................................51 10.5 监控计算过程中某个指定变量的计算结果..............................................52 10.5.1 案例背景............................................................................................52 10.5.2 INP文件的监控输出设置 ..................................................................52 10.5.3 定义回调函数monitorDataValue(…)................................................52 10.5.4 定义addMessageCallback()...............................................................53 11 Abaqus_Python脚本对输出数据库的接口 ...........................................................54 11.1 基础概念......................................................................................................54 11.1.1 模型、模型数据库和输出数据库....................................................54 11.1.2 模型数据和结果数据........................................................................54 11.1.3 场输出和历史输出............................................................................55 11.2 输出数据库对象模型..................................................................................55 11.2.1 模型数据............................................................................................56 11.2.2 结果数据............................................................................................58 11.3 从输出数据库读取数据..............................................................................60 11.3.1 打开指定的输出数据库....................................................................60 11.3.2 读取模型数据....................................................................................60 11.3.3 读取结果数据....................................................................................63
IV

11.4 向输出数据库写入数据..............................................................................70 11.4.1 创建一个新的输出数据库................................................................70 11.4.2 写入模型数据....................................................................................70 11.4.3 写入结果数据....................................................................................73 11.5 设置默认的显示变量..................................................................................78 11.6 对Abaqus的分析结果进行数学计算分析 .................................................79 11.6.1 数学运算规则....................................................................................79 11.6.2 有效的数学运算................................................................................80 11.6.3 粗略运算............................................................................................81 11.6.4 结果转换............................................................................................82 11.7 Abaqus_Python脚本接口后处理Odb常用函数 ..........................................82 11.7.1 Odb对象常用成员和方法..................................................................82 11.7.2 OdbPart对象常用成员和方法 ...........................................................82 11.7.3 FieldOutput对象常用成员和方法 .....................................................83 11.7.4 OdbAssembly对象常用成员和方法..................................................84 11.7.5 OdbFrame对象常用成员和方法........................................................84 11.7.6 OdbMeshElement对象常用成员和方法............................................85 11.7.7 OdbMeshNode对象常用成员和方法 ................................................85 11.7.8 OdbSet对象常用成员和方法.............................................................86 11.7.9 OdbStep对象常用成员和方法...........................................................89 11.7.10 Odb命令............................................................................................89

V

Abaqus & Python 开发使用指南

1 python运行方式
1.1 脚本文件的运行
脚本命令或脚本文件均由 abaqsu 的解释器 abaqus cae 或 abaqus viewer 来执行。 ① Command 命令窗口执行脚本时启动 Abaqus/CAE 或 Abaqus/Viewer 命令: abaqus cae script = *.py abaqus viewer script = *.py ② Command 命令窗口执行脚本时不启动 Abaqus/CAE 或 Abaqus/Viewer 命令: abaqus cae noGUI = *.py abaqus viewer noGUI = *.py ③ Command 命令窗口中运行.py 文件的方法:abaqus python *.py ④ CAE 中 CLI 窗口中运行.py 文件的方法:exefile(‘*.py’) 【提示】 :启动 CAE 后将导入 abaqus 定义的所有模块,只有符号常数模块未导 入,应当使用如下命令导入 abaqus 中的所有符号常数: From abaqusConstants import *

1.2 Abaqus中Python开发环境(PDE)
启动 Abaqus PDE 的方法有两种: ① 从 Abaqus/CAE 中启动: 【File】->【Abaqus PDE】

-1-

Abaqus & Python 开发使用指南 ② Command 命令启动 PDE 命令代码:abaqus pde

1.3 EditPlus中编译py文件
在 EditPlus 中使用 Ctrl+1 可以执行 Python 代码, 也可以选择 【工具】 菜单-》 Python 来执行 Python 代码;可以使用快捷键 Ctrl+F11 可以查看当前 python 文 件中的函数列表。 【提示】 :查询 abaqus 中 python 版本的方法:在 CLI 窗口中: >>>import sys >>>sys.version

-2-

Abaqus & Python 开发使用指南

2. Python语言基础约束
2.1 使用注释
编译器认为#号后面跟注释内容, 并按下回车键作为注释行的结束, 默认情况, python 编译器不支持中文注释,可以在 python 代码的开始位置加上注释说明语 句#-*-coding: UTF-8-*-,这样即可在代码中使用中文注释语句。

2.2 空行的合理使用
空行的作用在于分隔两段不同功能或不同含义的代码, 便于后期代码的维护 或重构,一般情况下,设置两个空行。

2.3 代码的分隔符
Python 语言支持使用分号(; )作为一条语句的结束标识,但是 python 语 言中的分号是可以省略的,它要通过换行符来识别语句的结束; Python 语言中的代码分为物理行和逻辑行两类,物理行指的是编写程序时 所看到的行,而逻辑行是指 Python 语言能够识别的单个语句;如果要在一个物 理行中使用多个逻辑行,此时一定语言使用分号(; )进行分隔,例如: x=1;y=2;z=3 如果逻辑行太长,则可以在多个物理行编写一个逻辑行,python 语言中使用 反斜线“\”作为连接符。 【提示】 :如果逻辑行中使用了圆括号、方括号或大括号等暗示行连接时,则无 需使用反斜线。

2.4 代码的缩进
对于 python 语言而言, 代码缩进是一种语法, 如果缩进错误将会抛出异常, python 语言采用代码缩进和冒号(: )来区别代码块之间的层次关系;代码缩进 并无严格空格的个数,通常情况下使用 4 个空格进行缩进,要保持代码中同一层 次的代码拥有相同的缩进量。

-3-

Abaqus & Python 开发使用指南

3 Python数据结构
Python 语言内置的数据结构有:序列、映射和集合(set),其中,序列包括: 列表(list)、元组(tuple)、字符串;映射包括字典(dictionary)。

3.1 序列
序列中的每个元素被分配一个序号,元素的编号从左至右由 0 开始(即序列 中第一个元素的编号为 0,第二个为 1) ,或从右往左开始由-1 开始(即序列中最 后一个元素的编号为-1,倒数第二个为-2) ,元素的位置编号称为该元素的位置 索引。 序 列 的 通 用 操 作 包 括 : 索 引 (indexing) 、 分 片 (slicing) 、 加 (adding) 、 乘 (multiplying)、检查某个元素是否属于序列的成员、计算序列的长度、找出最大 元素和最小元素; 3.1.1 索引(indexing) 通过对一个序列进行索引操作来返回该索引位置的元素值,如: >>>greeting = ‘Hello’ >>>greeting [0] ‘H’ 【提示】 :索引返回单个元素值; 3.1.2 分片(slicing) 通过索引来访问单个元素,分片则可以一个访问多个一定范围内的元素, 如: >>>numbers = [1,2,3,4,5,6,7,8,9,10] >>>numbers [3:6] [4,5,6] ① 访问至最后一个元素或第一个元素 有的时候并不清楚序列最后一个元素的索引值, 此时便不能提供最后一个元 素的索引最后分片的边界,此时可以利用冒号(: )来操作,如:

-4-

Abaqus & Python 开发使用指南 >>>numbers [ 7: ] [8,9,10] ② 使用指定步长 默认情况,分片的步长为 1,省略不写,如上例子所示,用户可以指定整数 的步长,如: >>>numbers [ 0:10:2] [ 1,3,5,7,9 ] ③ 访问整个序列 可以将两个索引都置空,如: >>>numbers [ :] [ 1,2,3,4,5,6,7,8,9,10 ] 【提示】 : I.分片的第一个索引是需要提取部分的第一个元素的编号,而最后的索引 则是分片之后剩下部分的第一个元素的编号(不包含在提取元素内),且要求最右 边的索引要比最作用索引元素晚出现,否则返回一个空序列,如下所示: >>>numbers [ -3:0] [] II. 步长可以是正整数, 也可以是负整数, 但是不能为 0, 如果使用正的步长, 则分片访问序列方向是从左至右, 且要求分片的最左边的索引要早出现最右边的 索引元素,否则,返回空序列,同时最右边的索引值可以超出实际序列的长度; 如果使用负的步长,则分片访问序列方向是从右向左,且要求分片的最右边的索 引要早出现最左边的索引元素,同时对最左边的索引值可以超出实际序列的长 度,如下所示: >>>numbers [ 0:10:2] [ 1,3,5,7,9 ] >>>numbers [ 8:3:-1] [ 9,8,7,6,5 ] III.分片返回的一定是一个序列,哪怕返回的只有一个元素,也必须用序列 表示;

-5-

Abaqus & Python 开发使用指南 3.1.3 序列相加 对于同种类型的序列可以直接用“+”进行序列相加,返回一个新的序列。 >>>[1,2,3]+[4,5,6] [1,2,3,4,5,6] 3.1.4 乘法 用数字 n 乘以一个序列会生成一个新的序列,且在新的序列中,原来的序列 将被重复 n 次。 >>>’python’*5 ‘pythonpythonpythonpythonpython’ 3.1.5 空序列([ ]) 空序列可以简单的用通过两个括号来表示,里面什么都没有,但是,想要创 建一个占有十个元素的空序列,此时需用到 python 的内建值 none,使用方法如 下所示: >>>sequence = [ none] * 10 >>>sequence [ none , none , none , none , none , none , none , none , none , none ] 3.1.6 成员资格检查 使用运算符 in 来检查某个值是否在序列中,并返回 True 或 False。 >>>permissions = ‘rw’ >>>’w’ in permissions True 3.1.7 长度、最大值和最小值 len 函数返回序列中所包含元素额数量, 函数和 max 函数分别返回序列中 min 最小和最大的元素。

3.2 列表(list)
列表时一种可变的序列,列表中的元素都包含在方括号中,各元素之间使用
-6-

Abaqus & Python 开发使用指南 逗号进行分隔,列表中的每一个元素可以是序列中的任意一种类型。 3.2.1 使用list函数创建列表 可以直接使用[]来创建列表,也可以使用函数 list 来创建一个列表,list(x), 其中 x 为任何类型的序列,其功能是将序列中的每一个元素单独提取出来作为 新列表的元素。 >>>list([ 1, 2, ‘kk’]) [ 1, 2, ‘kk’ ] >>>list(‘perl’) [‘p’, ‘e’, ‘r’, ‘l’] 3.2.2 单个元素赋值 直接通过访问单个元素,利用等号进行重新赋值即可。 >>>x=[1,1,1] >>>x[1]=2 >>>x [1,2,1] 【提示】 :不能为一个位置不存在的元素进行赋值; 3.2.3 分片赋值 使用分片赋值,其赋的值必须是以列表形式出现,如下所示: >>>name=list(‘perl’) >>>name[2:]=list(‘ar’) >>>name [‘p’, ‘e’, ‘a’, ‘r’] 赋的值所在列表可以比原列表的长度长,如下所示: >>>name=list(‘perl’) >>>name[1:]=list(‘ython’) >>>name [‘p’, ’e’, ’y’,’t’, ’h’, ’o’, ’n’] 分片赋值可以在不需要替换任何原有元素的情况下插入新的元素;
-7-

Abaqus & Python 开发使用指南 >>>number=[1,5] >>>number[1:1]=[2,3,4] >>>number [1,2,3,4,5] 可以利用插入一个空序列来删除原序列中的一部分元素; >>>number[1:4]=[] >>>number [1,5] 3.2.4 删除元素 使用 del 语句来实现从列表中删除元素; >>>del x[2] >>>x [1,2] 3.2.5 列表方法 ① append 该方法用于在列表末尾增加新的元素; >>>lst=[1,2,3] >>>lst.append(4) >>lst [1,2,3,4] ② count 该方法统计某个元素在列表中出现的次数; >>>x=[[1,2],1,1,[2,1,[1,2]]] >>>x.count(1) 2 ③ extend 该方法可以在列表的末尾一次性追加另一个序列中的多个值; >>>a=[1,2,3] >>>b=[4,5,6]
-8-

Abaqus & Python 开发使用指南 >>>a.expend(b) >>>a [1,2,3,4,5,6] ④ index 该方法用于从列表中找出某个值第一个匹配项的索引位置; >>>a= [1,2,3,2,4,5,6] >>>a.index(2) 1 ⑤ insert 该方法用与在列表的指定位置插入一个序列或值; >>>a= [1,2,3,4,5,6] >>>a.insert(3,’four’) >>>a [1,2,3,’four’,4,5,6] ⑥ remove 该方法用于移除列表中某个值的第一个匹配项; >>>a= [1,2,3,2,4,5,6] >>>a.remove(2) >>>a [1,3,2,4,5,6] 【提示】 :列表的方法只是修改原列表,而不是返回一个新列表;

3.3 元组(tuple)
元组是一个不可变的序列,其创建方法使用圆括号括起来,其元素可以是任 意类型的序列,也可以使用函数 tuple 来创建一个新的元组,tuple(x)中 x 可以是 任意类型的序列, 其函数功能是将 x 中的元素单独提取出来, 作为新元组的元素, 如下所示: >>>tuple([1,2,3]) (1,2,3)

-9-

Abaqus & Python 开发使用指南 当某个元组中只包含一个元素时,必须在该元素后面加上逗号(,,如下所 ) 示: >>>(42,)

3.4 字符串
字符串是由一串字符组成的不可变序列。 3.4.1 字符串的引号表示方法 python 语言中使用单引号、 双引号或三引号来表示字符串类型的数据, 其中, 单引号和双引号作用相同,当涉及二者组合使用时,以字符串最外层的配对引 号为字符串引号,而内部的引号则为保留引号; >>>” Let’s go! ” >>>’” Hello, world! ” she said’ 3.4.2 转义符(\) 当字符串中引号不成对出现时, python 无法判断字符串从何处开始和在何处 结束,将输出错误消息,这时可以使用转义字符(\)来实现转义。 >>>’Let\’s go!’ “Let’s go!” 【提示】“\”转义符将其紧跟身后的引号转变为不是字符串的起始或终止标识; : 3.4.3 字符串格式化 字符串格式化操作符的右操作数可以是任何数据类型,如果右操作数是元组 的话,则其中的每一个元素都会被单独格式化,每个值都需要一个对应的转换 说明符,如下所示: >>>’%s plus %s equals %s’ % (1,1,2) ‘1 plus 1 equals 2’ 字符串格式化包括如下几部分: ① 转换说明符:%标记转换说明符的开始; ② 字段宽度和精度: 转换说明符可以包括字段宽度和精度, 字段宽度是转换 后的值所保留的所有字符个数(包括小数点),精度(对于数字转换来说)则是结果
- 10 -

Abaqus & Python 开发使用指南 中应该包含的小数位数,或者(对于字符串转换来说)是转换后的值所包含的最大 字符个数; 这两个参数都是整数(首先是字段宽度,然后是精度),通过点号(.)分隔, 且只要给出精度,则必须包含点号,同时可以使用星号(*)作为字段宽度或者精 度(也可以两者都使用*),此时数值会从元组参数中读出。 >>>’%10f’ % pi ‘ 3.141593’ #字段宽 10,精度 2 #字段宽 10

>>>’%10.2f’ % pi ‘ 3.14’

>>>’%.2f’ % pi ‘3.14’ >>>’%.5s’ % ‘Guido van Rossum’ >>>’Guido’ ③ 符号、对齐和 0 填充:在字段宽度和精度值之前还可以放置一个“标表” , 该标表可以是零、加号、减号或空格,其中,零表示数字将会用 0 进行填充。 >>>’%010.2f’ % pi ‘0000003.14’ 减号(-)用来左对齐数值: >>>’%-10.2f’ % pi ‘3.14 ’ #字段宽 10

空格(“”)意味着在正数前加上空格,这对需要对齐正负数时会很有用: >>>print (‘% 5d’ % 10) + ‘\n’ + (‘% 5d’ % -10)F 10 -10 加号(+)表示无论正数还是负数都标示出符合: >>>print (‘%+5d’ % 10) + ‘\n’ + (‘%+5d’ % -10)F +10 -10 ④ 转换类型:

- 11 -

Abaqus & Python 开发使用指南
转换类型 d,i e E F,f r s 含义 带符合的十进制整数 科学计数法表示的浮点数(小写) 科学计数法表示的浮点数(大写) 十进制的浮点数 字符串(使用 repr 转换任意 python 对象) 字符串(使用 str 转换任意 python 对象)

3.5 字典(dictionary)
序列是通过索引来存储和访问其元素,而一种通过名字引用值的数据结构, 称为映射(mapping),字典是 python 中唯一内建的映射类型。字典中的值并没有 特殊的顺序,但都存储在一个特定的键(key)里,键可以是数字、字符串甚至是 元组。 字典是使用键-值对来表示的内置数据结构,在字典中,键-值对的表示方法 如下: d={key1 :value1,key2 :value2} 其中: I. 键和值之间使用冒号进行分隔; II. 各个键-值对之间使用逗号进行分隔; III. 所有的键-值对都包含在大括号{}中; 3.5.1 使用dict函数创建字典 可以使用其他的字典或者(键,值)这样的序列对建立新字典。 >>>items = [(‘name’,’Gumby’),(‘age’,42)] >>>d=dict(items) >>>d {‘age’: 42 , ‘name’: ‘Gumby’} dict 函数也可以通过关键字参数来创建字典,如下例所示: >>>d=dict(name=’Gumby’,age=42) >>>d
- 12 -

Abaqus & Python 开发使用指南 {‘age’: 42 , ‘name’: ‘Gumby’} 3.5.2 字典基本操作 字典的基本操作在很多方面与序列类似: I.len(d):返回字典 d 中项(键-值对)的数量; II.d[k]:返回关联到键 k 上的值; III.d[k]=v:将值 v 关联到键 k 上; IV.del d[k]:删除键为 k 的项; V.k in d:检查 d 中是否含有键为 k 的项; 字典与列表之间的重要区别: I.键类型:字典的键不一定为整型数据,也可能是其他不可变类型,如浮点 型、字符串或元组; II. 自动添加:即使那个键起初在字典中不存在,可以直接添加其键-值对, 列表则必须通过函数来添加元素,如下例所示: >>>x={} >>>x[42]=’Foobar’ >>>x {42:’Foobar’} 3.5.3 字典的格式化字符串 这里只是针对以字符串作为键的字典进行格式化操作, 在每个转换说明符(%) 后面,可以用圆括号括起来的键,后面再跟上其他的说明元素,如: >>>phonebook={‘Beth’:’9102’,’Alice’:’2341’,’Cecil’,’3258’} >>>”Cecil’s phone number is %(Cecil)s.” % phonebook Cecil’s phone number is 3258. 3.5.4 字典方法 ① clear():该方法清除字典中所有的项,使其成为一个空字典; ② copy():返回一个具有相同键-值对的新字典; ③ get():返回指定键的值; >>>d={‘name’:’Eric’}
- 13 -

Abaqus & Python 开发使用指南 >>>d.get(’name’) ’Eric’ >>>d[’name’] ’Eric’ 【提示】 :d.get(’name’)与 d[’name’]结果一样,但是当访问一个原字典中不存在 的键时,get 方法则返回 none,而后者直接报错; ④ has_key():用于检查字典中是否含有给出的键,如果没有返回 False,否 则返回 True; ⑤ items():返回多个元组组成的列表,每个元组都是一个键-值对; >>>d={’title’:’python’,’url’:’www.kk.com’} >>>d.items() [(’url’,’www.kk.com’),(’title’,’python’)] ⑥ keys():返回字典中所有键组成的列表; ⑦ pop(k):返回字典中键 k 的值,并且同时删除字典中该键-值对; ⑧ values():返回字典中值组成的列表;

3.6 集合(set)
集合是由序列构建的,同时集合中的元素时可变的,并且是无序的。 >>>set([0, 1, 2,3])

- 14 -

Abaqus & Python 开发使用指南

4 程序结构化设计
4.1 赋值魔法
4.1.1 序列解包 多个赋值操作可以同时进行: >>>x,y,z=1,2,3 >>>print x,y,z 123 >>>values=1,2,3 >>>values (1,2,3) >>>x,y,z=values >>>x 1 【提示】 :当函数或方法返回一个元组时,可以讲元组中的值一次性赋予多个变 量; 4.1.2 链式赋值 链式赋值是将同一个值赋给多个变量的捷径; >>>x=y=1 4.1.3 增量赋值 >>>x=2 >>>x+=1 >>>x*=2 >>>x 6 【提示】 :这里赋值运算与 C++中一致,对于+、-、*、/、%等标准运算均适用;

15

Abaqus & Python 开发使用指南

4.2 条件语句
① if 语句: if (表达式): 语句 1 ② if...else 语句: if (表达式): 语句 1 else : 语句 2 ③ if...elif...else 语句: if (表达式 1): 语句 1 Elif(表达式 2): 语句 2 else : 语句 3 【提示】上述三种语句中的每个 if 语句块中均可嵌套使用三种语句中任意一种。 :

4.3 运算符
Python 中的比较和逻辑运算符 表达式 x==y x<y x>y x>=y x<=y x != y x<>y 描述 x 等于 y x 小于 y x 大于 y x 大于等于 y x 小于等于 y x 不等于 y x 不等于 y 表达式 x is y x is not y x in y x not in y and or not 描述 x 和 y 是同一个对象 x 和 y 是不同的对象 x 是 y 的成员 x 不是 y 的成员 且 或 非

16

Abaqus & Python 开发使用指南

4.4 循环语句
4.4.1 while循环 while(表达式) : 语句 1 else : 语句 2 【提示】 :else 语句可以省略,同时表达式两侧的括号也可以省略; 4.4.2 for循环 for 变量 in 集合: 语句 else: 语句 【提示】 :集合可以是元组、列表或字典等内置数据结构,执行过程中,每次循 环都从集合中取出一个值,并把该值赋予变量,for 循环将遍历集合中的每一个 元素,else 语句可以省略,同时表达式两侧的括号也可以省略; 4.4.3 跳出循环 ① break 语句 在循环执行过程中,虽然条件判断为“真” ,但也希望终止执行循环语句,就 需要使用 break 语句,break 语句只能跳出当前循环,如果存在循环嵌套的情况, 在最内层循环使用 break 语句并不能跳出整个循环。 ② continue 语句 continue 语句的功能是告知 python 语言跳过当前循环体中的剩余语句,继续 进行前循环体的下一轮循

17

Abaqus & Python 开发使用指南

5 函数、模块和包
Python 语言的源代码一般由函数、模块和包组成,函数中包含可以重复调用 的代码,通过输入参数来返回计算结果;模块则是处理某一类问题的函数和类 的集合;而包则是由一系列模块组成的集合。

5.1 函数
5.1.1 内置常用函数
内置模块_builtin_内置常用函数 函数名称 abs(x) bool(x) cmp(x,y) float(x) help(object) id(x) input(prompt) raw_input(prompt) len(object) range(start,end,step) xrange(start,end,step) round(x) int(x) set(iterable) sum(iterable [,start=0]) type(object) 返回 x 的绝对值 将 x 的值或表达式转换为布尔类型 比较 x 和 y 的大小 将数字或字符串转换为浮点型数据 返回内置模块中各函数的用法说明 返回对象的标示 接收控制台的输入,返回值为数字类型 接收控制台输入,返回值为字符串类型 返回对象中元素的格式 返回一个列表 与 range()函数类似,但每次只返回 1 个值 对 x 进行四舍五入的操作 将数字或字符串转换为整型数据 返回一个集合 对一个序列求和 返回对象的类型 说明

注:表中 object 表示为对象;prompt 表示用户输入值;iterable 表示为一个序列;函数参 数中[]表示可选参数;

18

Abaqus & Python 开发使用指南 5.1.2 函数的定义 函数定义的格式: def 函数名 ( 参数 1 [=默认值 1],参数 2 [=默认值 2],... ): 语句 return 表达式 ① 函数的形参和实参 定义函数时,圆括号中参数称为形参。调用函数时的给定的参数值称为实参, 实参与形参必须一一对应,参数的顺序和类型也必须一致。 【提示】 :当定义函数时,提供的形参的默认值,要求其定义默认值的瞬时是从 右向左依次定义,不允许跳跃式定义形参默认值。 ② 函数的返回值 函数的返回值都使用 return 语句,后面可以跟变量或者表达式,如果 return 语句后面不带任何参数,返回值为 None;

5.2 模块(module)
模块值的是包含变量、函数和类的 py 文件,使用某个模块中的函数或类之 前,必须首先导入该模块。 【提示】 :可以使用 dir(模块名)函数,该函数列出模块中定义的所有函数、类和 变量名。 5.2.1 模块的创建和导入 导入模块的格式为: import 模块名 上述方法导入模块后,调用模块中的函数或类时,必须使用模块名作为前缀; from 模块名 import 函数名 上述方法导入模块后,调用模块中的函数或类时,直接使用函数即可; 导入模块中所有的类和函数:from 模块名 import * 如果导入模块的类或函数名过长, 可以使用 as 语句将函数名或类名命名为较 短的别名,并使用别名作为类名或函数名来使用,格式如下: from 模块名 import 函数名或类名 as 别名
19

Abaqus & Python 开发使用指南 【提示】 :模块的导入可以放在程序的任意位置,通常建议在程序开始就导入响 应模块,将常用的函数、常数、变量定义为某个模块,编程时导入模块可以提 高程序的编写效率; 5.2.2 sys模块 sys 模块(system 的缩写)中包含于 python 解释器及其环境的相关函数。

5.3 包(package)
包指由一系列模块组合的集合,也是完成某些特定任务的工具箱,包和模块 均位于 Python 语言安装目录下的 Lib 子目录中。 包中至少包含一个由_init_.py 文件组成的文件夹,_init_.py 文件的功能是标 识当前文件夹是一个包,相当于包的注册文件,该文件的内容可以为空。

20

Abaqus & Python 开发使用指南

6. 类和对象
用于描述每个对象包含的数据和特征的任何新数据类型称为类,而对象则是 类实现化后的变量。

6.1 类的定义
类将需要使用的变量和函数组合在一起,称为封装。 使用关键字 class 来定义类,其格式如下所示: class 类名称 : 语句 【提示】 :类的名称要求首字母要大写。

6.2 创建对象
创建对象的过程称为类的实例化,创建一个对象后,该对象将包含 3 个方面 的特性:句柄、属性和方法。句柄用于不同的对象,创建对象后,它将获取一块 存储空间,存储空间的地址即为对象的句柄(或称为标识,即 id);对象的属性和 方法与类的属性和方法相对应。 创建对象的格式:对象名称=类名称()

6.3 类的属性和方法
方法与函数的区别在于: 方法将他们的第一个参数绑定到所属的实例上(即参 数 self), 即类中的方法与函数的区别在于, 方法中的第一个参数一定是 self(这个 参数通常省略不写,但实际存在),而函数没有这个要求。 class Person: def setName(self, name): self.name=name 6.3.1 类的属性 ① 公有属性与私有属性 类的属性分为公有属性(public attribute)和私有属性(private attribute),对象
21

Abaqus & Python 开发使用指南 只有通过调用类中的方法才能访问的属性称为私有属性(即不能通过以:对象名. 属性名称来直接访问该属性),否则,称为类的公有属性。 根据类属性的名称可以判断类属性的类型,如果属性的名称以两个下划线开 始,则表示私有属性,否则,称为公有属性,此命名约定同样适用于方法。 ② 实例属性和静态属性 类的属性又分为实例属性和静态属性。 I.实例属性:指在类的构造函数_init_中定义的变量以 self 作为前缀的属性 称为实例属性,否则只是普通的局部变量,类中其他方法定义的变量也只是局部 变量; >>>class Fruit: price=0 def _init_(self): self.color=’red’ country=’China’ #实例属性 #局部变量 #类的属性

II.静态属性:类可以直接调用静态属性,但实例化对象却不能调用静态属 性,创建新的实例化对象后,静态属性并不会获取新的内存空间,而仍然使用创 建类后静态属性的内存空间,因此,多个实例化对象可以共享静态属性。 【提示】 : i.Python 语言还提供了对象直接访问私有属性的方法,其访问格式如下: 实例化对象名称._类名称_私有属性名称 ii.类可以直接访问其私有属性和静态属性,其访问格式如下: 类名称.私有属性名称或静态属性名称 6.3.2 类的方法 类的方法也分为私有方法与共有方法,私有方法不能够被该类之外的其他函 数调用,也不能被外部类或函数调用,反之,则为公有方法。 ① __init__方法:构造方法用于初始化类的属性,该方法是可选的,如果程 序中未提供构造方法,python 语言将给出默认的__init__方法,该方法在创建新 对象时自动调用; ② __del__方法:析构方法,用于释放对象所占用的资源,其也是可选的,
22

Abaqus & Python 开发使用指南 如果程序中未提供析构方法,python 语言将给出默认的__del__方法;

6.4 类的继承
Python 语言中通过在类名后面使用一对圆括号的方式来表示类的继承关系, 括号中的类为父类;如果父类中定义了__init__方法,子类必须显示调用父类的 __init__方法,如果子类需要扩展父类的行为,可以添加__init__方法中的参数。 实例程序:
学校父类的定义: class SchoolMembers: def __init__(self,name,age): self.name=name self.age=age print ‘(Initiallized SchoolMember:%s)’ %self.name def tell(self): print ‘Name:”%s” Age: “%s”’ %(self.name,self.age) ………………………………………………………………………………………….. 教师子类的定义: class Teacher(SchoolMembers): def __init__(self,name,age,salary): SchoolMember.__init__(self,name,age) self.salary=salary print ‘(Initialized Teacher: %s)’ % self.name def tell(self): SchoolMember.tell(self) print ‘Salary: “%d”’%self.salary ………………………………………………………………………………………….. 学生子类的定义: class Student(SchoolMembers): def __init__(self,name,age,marks): SchoolMember.__init__(self,name,age)
23

#显示调用父类构造方法

#显示调用父类构造方法

Abaqus & Python 开发使用指南
self.marks=marks print ‘(Initialized Student: %s)’ % self.name def tell(self): SchoolMember.tell(self) print ‘Marks: “%d”’%self.marks ………………………………………………………………………………………….. 对象实例化: t=Teacher(‘Mrs Gao’,30,6000) s=Student(‘Wang’,20,95) members=[t,s] #创建序列

for member in members: member.tell() ………………………………………………………………………………………… 运行结果: (Initialized SchoolMember:Mrs Gao) (Initialized Teacher:Mrs Gao) (Initialized SchoolMember:Wang) (Initialized Student:Wang) Name: ”Mrs Gao” Age: “30” Salary: “6000” Name: ”Wang” Age: “20” Marks: “95”

【提示】 :如果一个类继承了多个父类,则称为多重继承,多重继承的声明语句 格式如下所示: 类名称(父类名称 1,父类名称 2,父类名称 3,…)

24

Abaqus & Python 开发使用指南

7. 文件的输入/输出
Python 语言专门提供 os、os.path 和 shuti 等模块来处理文件。

7.1. 文件的创建或打开
调用 file()函数可以创建或打开文件,file()函数的声明语句如下: file(文件名,文件打开模式) file()函数返回一个 file 对象,文件的打开模式如下表所示:
文件打开模式 参数 r r+ w 如果文件不存在,则创建一个新文件 以读写方式打开文件, 首先删除原文件的所有信息, 然后写入新信息, w+ 如果文件不存在,则创建一个新文件 以写入方式打开文件, 并在文件的末尾追加新信息, 如果文件不存在, a 则创建一个新文件 以读写方式打开文件, 并在文件的末尾追加新信息, 如果文件不存在, a+ 则创建一个新文件 file 对象的常用属性和方法 属性和方法 Closed Mode Name close() readline() readlines() 说明 判断文件是否关闭,如果已关闭,则返回 True 显示文件的打开模式 显示文件的名称 关闭文件 从文件中读取一行并作为字符串返回 将文件中的每行信息均存储在列表中返回 以只读方式打开文件 以读写方式打开文件 以写入方式打开文件, 首先删除原文件的所有信息, 然后写入新信息, 说明

25

Abaqus & Python 开发使用指南

7.2 文件的读取和写入
7.2.1 文件的读取 读取文件的方法主要包括三种: ① 一次性读取文件中的所有信息:需要调用 read()方法,并赋值给一个字符 串变量; ② 按行读取文件中的信息:调用 readline()方法,该方法每次只读取文件中 的一行信息,如果希望读取整个文件中的信息,则需要使用循环读取文件,当文 件指针移动到文件末尾处时,如果仍然调用 readline()方法读取文件,则将抛出 异常; ③ 一次读取文件中的多行信息:调用 readlines()方法; 7.2.2 文件的写入 写入文件时可以调用 write()方法或 writelines()方法来实现。 程序实例
f=file(‘tt.txt’,’w’) f.write(tt) f.close

f=file(‘tt.txt’) while True:

#默认为读取

line=f.readline() if len(line) == 0 break print line, f.close() #注意,逗号可以避免 python 自动增加新行 #长度为 0 表明到达文件末尾

【提示】 :每次读取一行或多行的方法,会自动移动文件指针到下一行或下面;

7.3 文件的删除和重命名
删除和重命名文件时需要导入 os 模块和 os.path 模块,os 模块提供了系统环
26

Abaqus & Python 开发使用指南 境、文件、目录等系统级的接口函数,os.path 模块则用于处理文件和目录的路 径,下表则给出 os 模块和 os.path 模块常用函数。
os 模块中常用文件处理函数 常用函数 access(path, mode) chmod(path, mode) remove(path) rename(old, new) 说明 安装 mode 指定的权限访问 path 路径下的文件 改变访问 path 路径下文件的访问权限 删除 path 路径下的文件 对文件或目录进行重命名

os.path 模块中的常用函数 abspath(path) dirname(p) getsize(filename) 返回 path 的绝对路径 返回目录 p 的路径 返回文件 filename 的大小

27

Abaqus & Python 开发使用指南

8 Abaqus_Python脚本接口
8.1 Abaqus_Python脚本接口简介
Abaqus 脚本接口可以实现 Abaqus/CAE 中所有的功能,二者的通信关系如下 图所示,所有的命令都必须经过 python 解释器后才能进入到 Abaqus/CAE 内核 中执行,同时生成扩展名为.rpy 的文件,进入 Abaqus/CAE 内核的命令将被转 换为 INP 文件,在经过求解器进行分析求解。

8.1.1 命名空间 不同命名空间相互独立,同一命名空间不允许变量名相冲突,Abaqus/CAE 可以在脚本命名空间和日志命名空间中执行脚本接口命令。 ① 脚本命名空间 下列三种方式发出的 Abaqus 脚本命令接口将在脚本命名空间中执行:
28

Abaqus & Python 开发使用指南 I.脚本; II.命令行接口(CLI); III.在 Abaqus/CAE 的 File 菜单下,选择 Run Script; ② 日志命名空间 从图形用户界面(GUI)中发出的 Abaqus 脚本接口命令将在日志命令空间中执 行。 8.1.2 Abaqus中应用Python语句的文件类型 ① 环境文件 abaqus_v6,env 使用的 Python 语句; ② INP 文件中*PARAMETER 数据行中参数定义使用的是 Python 语句; ③ 运行参数分析需要编写和执行 Python 脚本(.psf); ④ Abaqus/CAE 中的操作记录文件.rpy; ⑤ Abaqus/CAE 的 File 菜单下的 Run Script; ⑥ 在 Abaqus/CAE 的 File 菜单下选择 Macro Manager,录制宏;

8.2 Abaqus_Python脚本接口基础知识
Abaqus 脚本接口的一般惯例:构造函数的首字母为大写,其他字母为小写, 而其他方法则以小写字母开头;当编写脚本读取 ODB 文件中的数据时,如果对 象已经保存在数据库中,就无需调用构造函数创建对象;如果需要创建 ODB 文 件或者需要向 ODB 文件中写入数据,就必须调用构造函数来创建对象。 【提示】 :构造函数的本质是对应与之同名的类; 8.2.1 Abaqus脚本接口中的数据类型 常用的 Abaqus 脚本接口数据类型有:符号常数(symbolic constant)、库 (repository)、数组(array)、布尔类型(boolean)和序列(sequence)。 ① 符号常数(symbolic constant) 符号常数一般用于方法中的自变量或 Abaqus 对象中的成员属性的值,且规 定符号常数的所有字母必须大写。 如果脚本中需要使用符号常数,则必须导入符号常数模块: from abaqusConstants import *

29

Abaqus & Python 开发使用指南 如果 Abaqus 脚本接口中定义的符号常数不能满足需要, 用户也可以调用构造 函数自行创建任意符号常数,详情参见“SymbolicConstant object” 。 【提示】 :启动 Abaqus/CAE 会自动导入除了符号常数模块外的所有模块。 ② 库(repository)(相当于字典) 库指的存储某一特定类型对象的容器, ,库具有如下特定: I.对象都属于同一类型; II.对象之间建立了映射关系,与 python 中的字典类似,且库的所有键均为 字符串; III.库中所有字母均为小写,且为复数形式; IV.库中通常用于创建模型、部件、材料、分析步等,通过调用构造方法可 以向某个库中添加对象; 【注意】 :可以调用库名的 keys()方法访问库中的键,并以列表形式返回,其中 键-对值无序; 库的重要的方法:

③ 数组(arrays) 实质上,数组与元组类似,同时要求数组的首字母一定大写,且为复数形式, 如 Abaqus 中 所 有 的 节 点 和 单 元 分 别 存 储 在 数 组 MeshNodeArrays 和 MeshElementArrays 中。 ④ 布尔类型(boolean) Python 中布尔类型的值为:True 和 False, Abaqus 扩展了布尔类型, 其值为 ON 和 OFF。 ⑤ 序列(sequence) Abaqus 脚本接口某些方法的参数是由浮点型或整型数据组成的序列(这里的 序列是 Python 中的元组),例如下图中定义材料弹性模量随温度变化的属性:

30

Abaqus & Python 开发使用指南

mdb.models['Model-1'].materials['steel'].Elastic(temperatureDependency=True, table=((200.0E9, 0.3, 0.0),(210.0E9, 0.3, 100.0),(220.0E9, 0.3, 250.0), (225.0E9, 0.3, 500.0)))

Abaqus/CAE 中的序列的元素一定是相同类型的,有如下几处地方需要定义 序列: I.GeomSequence(几何序列):GeomSequence 是一个几何对象序列,如顶点、 边、体、面,例如:
>>>mdb.Model('Body') >>>mySketch = mdb.models['Body'].ConstrainedSketch(name='__profile__', sheetSize=200.0) >>>mySketch.rectangle(point1=(0.0, 0.0), point2=(70.0, 70.0)) >>>switch = mdb.models['Body'].Part(name='Switch', dimensionality=THREE_D, type=DEFORMABLE_BODY) >>>switch.BaseSolidExtrude(sketch=mySketch, depth=20.0)

II.MeshSequence:单元节点或单元的序列; III.SurfSequence:曲面的序列; ⑥ 常用函数 I.type()方法查询对象类型 II._members_属性查询所有属性; III._methods_属性查询所有方法; IV.del 语句删除对象; 【提示】 : I.Abaqus 对象的成员具有只读属性,因此,不允许使用赋值语句指定成员 的值,但是,可以调用 setValues()方法改变成员值;
31

Abaqus & Python 开发使用指南 II.在 CLI 命令窗口中可以使用 Tab 键或 shift+Tab 键来查询对象和方法的 键,完成自动输入对象名(只需用户输入左边半个中括号即可),提高脚本命令的 书写效率;

8.3 Abaqus对象模型
Abaqus 脚本接口中增加了大约 500 个新的对象类型,大大扩展了 Python 语 言的功能,这些对象之间的层次和关系成为 Abaqus 对象模型;一个对象的概念 包括: I.成员:对象封装的数据,即属性; II.方法:处理数据的函数; III.构造函数:创建对象的方法,即类的构造函数; Abaqus 对象模型包含了三个根(root)对象,分别是:Session 对象、Mdb 对 象和 Odb 对象。

8.3.1 Session对象 导入 Session 对象方法: from abaqus import * 或者 from abaqus import session

32

Abaqus & Python 开发使用指南

8.3.2 Mdb对象 导入 Mdb 对象方法: from abaqus import * 或者 from abaqus import mdb 上述方法自动创建了 Mdb 对象的一个实例叫做 mdb,且 Mdb 对象仅包含 Model 对象和 Job 对象两种对象;

33

Abaqus & Python 开发使用指南

34

Abaqus & Python 开发使用指南

8.3.3 Odb对象 导入 Odb 对象方法: from odbAccess import * 或 from odbAccess import odb Odb 对象保存在输出数据库中,有模型数据和结果数据组成。

8.3.4 Abaqus中的核心模块 Abaqus 脚本接口需要使用 import 语句来导入模块,想要访问某个对象,必须 首先得导入该对象所属的模块; import abaqusConstants from caeModules import * #导入符号常数模块 #导入 Abaqus/CAE 的所有模块

35

Abaqus & Python 开发使用指南
核心模块 assembly datum interaction job load material mesh part partition section sketch step visualization xyPlot odbAccess 与 Abaqus/CAE 的对应关系 The Assembly module The Datum toolset The Interaction module The Job module The Load module Materials in the Property module The Mesh module The Part module The Partition toolset Sections in the Property module The Sketch module The Step module The Visualization module The X–Y toolset 功能 创建和修改装配件 创建基准工具 创建和修改相互作用属性 创建、提交和监控分析作业 创建、修改载荷和边界条件 创建、修改材料属性 划分网格 创建和修改部件 分割工具 创建、修改界面属性 创建和修改草图 创建和修改分析步 分析结果可视化 绘制 X-Y 图 访问输出数据库

8.3.5 抽象基本类型(abstract base type) Abaqus 对象模型中并未包含的对象称为抽象基本类型的对象,Abaqus 对象 模型中包含的对象称为基本类型, 抽象基本类型的名字就是在 Abaqus/CAE 中建 模时创建对象的名字,例如:在 Step 模块中调用构造函数 StaticStep、BuckleStep 和 FrequencyStep 创建不同的分析步,Step 就是抽象基本类型,Abaqus 脚本接口 模型中还包括下列抽象基本类型: Amplitude、 BoundaryCondition、 Datum、 Field、 Interaction 和 Section。 8.3.6 复制和删除对象 ① 复制对象 Abaqus 脚本接口为大多数对象提供了复制对象的方法, 创建复制对象的方法 称为复制构造函数,复制构造函数的格式如下: 对象的构造函数(name=新对象名称,objectToCopy=复制的对象变量)

36

Abaqus & Python 开发使用指南 复制构造函数返回一个与复制的对象变量类型相同的对象。 例如:
firstBolt=mdb.models[‘Metric’].Part(name=’kk’,dimensionality=THREE_D, type=DEFORMABLE_BODY) secondBolt= mdb.models[‘Metric’].Part(name=’tt’,objectToCopy=firstBolt)

② 删除对象 一般情况下,能够被创建的对象都可以被删除,使用 Python 语言的 del 语句 来删除对象,但要注意,删除对象存储的变量和删除对象不一样,删除了对象, 其存储的变量仍然存在,而删除了变量,该对象仍然存在,可以将该对象赋予 新的变量,如下例子所示:
myMaterial = mdb.models['Model-1'].Material(name='aluminum') del mdb.models['Model-1'].materials['aluminum'] del myMaterial

myMaterial = mdb.models['Model-1'].Material(name='aluminum') del myMaterial myNewMaterial = mdb.models['Model-1'].materials['aluminum']

【提示】 :如果即不是 Mdb 对象成员,也不是 Session 对象成员,则 del 删除了 该对象指向的变量,则该对象也自动被删除。 8.3.7 指定区域(region) 区 域 可以是定义的集合(set)、表面对象(surface object)或临时区域对象 (temporary Region object), Abaqus 脚本接口的很多函数的参数需要一个区域参 数,包括: I.Load 命令:使用 region 参数指定施加载荷的区域,例如,集中力施加在 顶点上,压力施加在面或边上; II.Mesh 命令:使用 region 参数指定单元类型、网格种子的定义区域; III.Set 命令:使用 region 参数指定集合的区域,例如,节点集、单元集等; 【提示】关于区域命令的详细介绍参见 abaqus 脚本参考手册的第 45 章 : “Region Commands” ;
37

Abaqus & Python 开发使用指南 如果在 Abaqus/CAE 中建模,Abaqus 将自动为模型的特征进行编号,在编 写脚本时,建议读者不要通过 Id 号来确定区域命令中的顶点、边、面或体,即 不要出现类似这样的命令:myFace=myModel.parts['Door'].faces[3],其原因是: I.对模型的某个特征进行编辑后,特征的 ID 也将发生改变; II.Abaqus 不同版本中对几何模型和网格的编号算法可能不一样; 建议使用 findAt 方法查找顶点、边、面或体,findAt 方法的参数可以是边、 面或体上的任意点,也可以是顶点的 X、Y、Z 坐标,findAt 方法返回值可能包 含顶点 ID 的对象,或者是包含边、面、体上任意点 ID 的对象。findAt 方法的 默认容差值为 1E-6,因此,将返回指定点或与指定点距离小于 1E-6 的对象。 【提示】 :查找点尽量不要选择两条边、两个面或两个体的角点,如果两个实体 在指定点处相交或重合,findAt 方法将返回查找的第一个实体对象; 如果模型中已经定义了区域,就可以通过区域名来指定,例如:在 CAE 中为 部件中心点创建了集合 CENTER,可以通过区域名 CENTER 指定区域:
centerNSet = odb.rootAssembly.nodeSets['CENTER']

实例:
pillarVertices = doorInstance.vertices.findAt(((-40,30,0),), ((40,0,0),) ) topFace = doorInstance.faces.findAt(((-25,30,10),)) bottomFace = doorInstance.faces.findAt(((-25,0,10),)) myFenderLoad = myModel.Pressure(name='pillarPressure', createStepName='impact', region=((topFace+bottomFace, SIDE1),),magnitude=10E4) myEdge1 = doorInstance.edges.findAt(((10,15,20),)) myEdge2 = doorInstance.edges.findAt(((10,15,0),)) myDisplacementBc= myModel.DisplacementBC(name='xBC', createStepName='impact', region=(pillarVertices, myEdge1+myEdge2,topFace), u1=5.0)

8.3.8 指定视图中显示的对象 编写脚本时应该根据需要指定视图中显示的对象,通常情况下,显示对象包 括:部件、装配件、计算结果(应力、位移、应变等)、X-Y 图和空对象 None。 使用下列命令可以指定视图中显示的对象: session.viewports[name].setvalues(displayedObject=object)
38

Abaqus & Python 开发使用指南
其中,displayObject 参数可以是 Part 对象、Assembly 对象、Sketch 对象、Odb 对象、 XY-Plot 对象或 None 对象,如果 displayObject 为 None,视图中不显示任何对象。

39

Abaqus & Python 开发使用指南

9 交互式输入
当 Abaqus 脚本接口程序在运行过程中, 需要用户定义一下数值, 即此时需要 与用户进行互动,这就涉及到交互式输入的问题,Abaqus 脚本接口提供了三种 交互式输入函数:getInput(…)、getInputs(…)和 getWarningReply(…)。 【 提 示 】 如 果 脚 本 中 包 含 了 getInput(…) 函 数 、 getInputs(…) 函 数 或 : getWarningReply(…)函 数 , 在 脚 本 命 令 中 不 允 许 使 用 参 数 -start、 -reply 或 -noGUI。

9.1 getInput(…)函数
getInput()函数可以定义只包含标签项和一个文本输入框的对话框,在文本框 中可以输入任意参数值, 也可以为其指定默认值, 当按下 Enter 键或 OK 按钮后, 返回值将转换为字符串形式;如果按下 Cancel 按钮,则返回 None。 getInput(…)格式:getInput(prompt=字符串标签名称,default=’默认数值’) 【提示】 :其中函数中的关键字可以省略,同时 default 为可选参数; 调用 getInput()函数时,需要注意下列问题: I.getInput()函数只允许在打开 CAE 的时候用,可以 Run Script 或在 CLI 中使用; II.getInput()函数的返回值一定为字符串,可以调用 float 函数将返回值转 换为浮点型; 【案例 1】 :

>>> from abaqus import * >>> from math import sqrt >>> input = getInput('Please enter a number','9') >>> number=float(input) >>> print sqrt(number)
40

Abaqus & Python 开发使用指南
3.0

【案例 2】 :使用 Abaqus/CAE 中的宏管理录制的一段命令 工作目录下的宏文件 abaqusMacro.py:
from abaqus import * def createViewport(): session.Viewport(name='Viewport: 2', origin=(15.0,15.0), width=145.0, height=90.0) session.viewports['Viewport: 2'].makeCurrent()

修改后的与用户交互式程序:
from abaqus import * def createViewport(): name = getInput('Enter viewport name:') prompt = 'Enter viewport width, height (mm):' w, h = eval(getInput(prompt, '100,50')) vp = session.Viewport(name=name, width=w, height=h) vp.restore() vp.makeCurrent()

9.2 getInputs(…)函数
getInputs()函数可以定义包含多个标签项和相应数量的文本输入框的对话框, 在文本框中可以输入任意参数值,也可以为其指定默认值,当按下 Enter 键或 OK 按钮后,多个返回值被转换为字符串,同时以多个字符串为元素的列表形式 返回;如果按下 Cancel 按钮,则返回 None。 getInputs(…)格式:getInputs(fields , label , dialogTitle) 其中:fields 为一个元组,元组的每个元素为每行字符串标签和默认值构成
41

Abaqus & Python 开发使用指南 的元组,如果没有默认值,则也用双或单引号表示;label 为对话框中顶部中间 的字符串标签,默认为空字符串;dialogTitle 为对话框左上角的字符串标签,默 认值为“Get Inputs”; getInputs(((字符串标签名称 1, ’默认数值 1’), (字符串标签名称 2, ’默认数值 2’), (字符串标签名称 3,’默认数值 3’))) 【案例 1】 :
from abaqus import getInputs fields = (('Width:','10'), ('Length:', '20'), ('Height:', '30')) #元组

length, width, height = getInputs(fields=fields, label='Specify block dimensions:', dialogTitle='Create Block', ) print length, width, height #返回列表

fields = (('Width',''), ('Length', ''), ('Height', '')) length, width, height = getInputs(fields=fields, label='Specify block dimensions:')

9.3 getWarningReply(…)函数
getWarningReply(…)函数的功能是在主窗口中心位置显示警告对话框,单击 对话框中某个标准按钮后,将返回到执行脚本并同时关闭警告对话框,如果需要 输入多行警告信息,可以使用”\n”进行换行。 getWarningReply(…)函数格式:getWarningReply(message , buttons) 其中: message 为字符串, 其值为对话框中显示的内容; bottons 为一个元组, 其值为(YES,NO)或(YES_TO_ALL,CANCEL), 同时该值也是对话框的按钮上显

42

Abaqus & Python 开发使用指南 示的字符;函数的返回值为,用户点击的那个按钮上的字符; 【案例 1】 :
from abaqus import getWarningReply, YES, NO reply = getWarningReply(message='Okay to continue?', buttons=(YES,NO)) if reply == YES: print 'YES clicked' elif reply == NO: print 'NO clicked'

43

Abaqus & Python 开发使用指南

10 Job模块对分析过程进行监控
用户可以编写脚本对计算过程进行实时监控,利用 addMessageCallback 函数 来根据计算过程中反馈的信息,然后执行哪个回调函数,例如,分析过程中某个 场变量达到某个值就必须终止分析,此时,可以在 monitorManager 对象中写回 调函数(callback function)来实现。可以参加脚本参考手册中“26 Job commands 与 32 Messaging commands” 。

10.1 回调函数(callback function)
回调函数的定义: def 函数名称(jobName, messageType, data, userData) 【参数解释】 ① jobName:需要监控的 job 的名称,一个字符串;用户也可以使用符号常 量 ANY_JOB,即表明回调函数会监控所有 job 反馈的信息; ② messageType:一个能够执行回调函数的信息类型的符号常量,用户也可 以使用 ANY_MESSAGE_TYPE,即表明所有类型的信息均能执行回调函数;可 能的信息类型有: ABORTED、 ANY_JOB、 ANY_MESSAGE_TYPE、 COMPLETED、 END_STEP、 ERROR 、 HEADING 、 HEALER_JOB 、 INTERRUPTED 、 ITERATION 、 JOB_ABORTED、 JOB_COMPLETED、 JOB_INTERRUPTED、 JOB_SUBMITTED、 MONITOR_DATA 、 ODB_FILE 、 ODB_FRAME 、 SIMULATION_ABORTED 、 SIMULATION_COMPLETED 、 SIMULATION_INTERRUPTED 、

SIMULATION_SUBMITTED、STARTED、STATUS、STEP、WARNING。 ③ data: 一个 DataObject 对象,详见脚本参考手册 32.1 DataObject Object” “ , 其成员属性有: I.clientHost:运行分析电脑的计算机名称,一个字符串; II.clientName:一个字符串,其可能取值为: “BatchPre” (the input file preprocessor) “Packager” (the Abaqus/Explicit preprocessor packager) “Standard” (the Abaqus/Standard analysis)

44

Abaqus & Python 开发使用指南 “Explicit” (the Abaqus/Explicit analysis) “Calculator” (the postprocessing calculator) III.phase:一个符号常量,可能取值为: BATCHPRE_PHASE PACKAGER_PHASE STANDARD_PHASE EXPLICIT_PHASE CFD_PHASE CALCULATOR_PHASE HEALER_PHASE IV.processId:一个整数,用于指定分析过程的 ID 号; V. threadId: Int specifying the thread ID of the analysis program. Threads are An used for parallel or multiprocessing; in most casesthreadId is set to zero. VI. timeStamp: Int specifying the time the message was sent in seconds since An 00:00:00 UTC, January 1, 1970. ④ userData:Any Python object or None. This object is passed as the userData argument to addMessageCallback. 【案例 1】 : To execute the script, do the following: ? From the Abaqus/CAE command line interface type from simpleMonitor import printMessages ? Submit an analysis job as usual. ? To start printing the messages, type printMessages(ON) from the Abaqus/CAE command line interface. ? To stop printing the messages, type printMessages(OFF) from the Abaqus/CAE command line interface. """ simpleMonitor.py Print all messages issued during an Abaqus; analysis to the Abaqus/CAE command line interface """ from abaqus import *
45

Abaqus & Python 开发使用指南 from abaqusConstants import * from jobMessage import ANY_JOB, ANY_MESSAGE_TYPE #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def simpleCB(jobName, messageType, data, userData): """ This callback prints out all the members of the data objects """ format = '%-18s %-18s %s'

print 'Message type: %s'%(messageType) print print 'data members:' print format%('member', 'type', 'value') members = dir(data) for member in members: memberValue = getattr(data, member) memberType = type(memberValue).__name__ print format%(member, memberType, memberValue) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def printMessages(start=ON): """ Switch message printing ON or OFF """ if start: monitorManager.addMessageCallback(ANY_JOB, ANY_MESSAGE_TYPE, simpleCB, None) else: monitorManager.removeMessageCallback(ANY_JOB, ANY_MESSAGE_TYPE, simpleCB, None)

10.2 addMessageCallback(…)
当 导 入 Abaqus 模 块 后 , 一 个 MonitorMgr 对 象 自 动 被 创 建 , addMessageCallback(…)方法是该对象的一个方法,该方法用于指定调用哪个回 调函数。

46

Abaqus & Python 开发使用指南 10.2.1 路径(Access) monitorManager 10.2.2 必填参数 ① jobName A String specifying the name of the job to be monitored or the SymbolicConstant ANY_JOB. ② messageType A SymbolicConstant specifying which message type will call this callback. Possible values are:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

ABORTED ANY_JOB ANY_MESSAGE_TYPE COMPLETED END_STEP ERROR HEADING HEALER_JOB HEALER_TYPE INTERRUPTED ITERATION JOB_ABORTED JOB_COMPLETED JOB_INTERRUPTED JOB_SUBMITTED MONITOR_DATA ODB_FILE ODB_FRAME SIMULATION_ABORTED SIMULATION_COMPLETED
47

Abaqus & Python 开发使用指南
? ? ? ? ? ?

SIMULATION_INTERRUPTED SIMULATION_SUBMITTED STARTED STATUS STEP WARNING

③ callback A Python function to be called. The interface definition of the callback function is : def onMessage(jobName, messageType, data, userData)
? ?

jobName is a String. messageType is a SymbolicConstant with possible values as listed previously for the addMessageCallbackmethod.

? ?

data is a DataObject object. userData is the object passed as the userData argument to the addMessageCallback method.

10.2.3 可选参数 ① userData:Any Python object or None. This object is passed to the callback function. 10.2.4 返回值 None

10.3 Job模块命令
10.3.1 保存模型 >>>mdb.saveAs(pathname=’D:/temp/kk’) 10.3.2 创建Job >>>import job >>>job=mdb.JobFromInputFile(name=’job_1’,inputFileName=’rubber.inp’)

48

Abaqus & Python 开发使用指南 10.3.3 提交任务 >>>mdb.jobs[‘job_1’].submit()或者>>>job.submit() 10.3.4 提交多个任务 >>>mdb.jobs[‘job_1’].waitForCompletion() waitForCompletion()方法会等待自己提交的 job 运行结束后,再提交其他的 job;例如: >>>myJob1 = mdb.Job(name='Job-1') >>>myJob2 = mdb.Job(name='Job-2') >>>myJob1.submit() >>>myJob1.waitForCompletion() >>>myJob2.submit() >>>myJob2.waitForCompletion() 10.3.5 Job对象的使用 Job 对象没有构造函数,其相应的方法和属性如下所示: ① Access import job mdb.coexecutions[name].jobs[name] mdb.jobs[name] ② kill():该方法用于 killjob,没有任何参数,返回值为 None; ③ submit(...):该方法提交一个 job 来分析; Required arguments None. Optional arguments I.consistencyChecking A Boolean specifying whether to perform consistency checking for the job. The default value is ON. It is not recommended to turn the consistency checking off unless you are absolutely sure the model is consistent. II.datacheckJob
49

Abaqus & Python 开发使用指南 A Boolean specifying whether to run the job as a datacheck analysis. The default value is False. The datacheckJob and continueJob arguments cannot both be True. III.continueJob A Boolean specifying whether to run the job as a continuation analysis. The default value is False. The datacheckJob and continue Job arguments cannot both be True. Return value
None

④ waitForCompletion()
This method interrupts the execution of the script until the end of the analysis. If you call the

waitForCompletion method and thestatus member is neither SUBMITTED nor RUNNING,
Abaqus assumes the analysis has either completed or aborted and returns immediately.

⑤ 成员属性 I. name:job 名称,一个字符串;. II.type:指定 job 类型的一个符号常量,可能取值为:
ANALYSIS、SYNTAXCHECK、RECOVER 和 RESTART,默认值为 ANALYSIS;

III.waitHours:一个整数,用于指定在提交 job 之前需要等待的时间,默认值 为 0;如果参数 queue 被设置,该参数不起作用;同时该参数与 waitMinutes.、 waitHours 和 atTime 一起工作; IV.waitMinutes:一个整数,指定提交 job 需要等待时间的分,默认值为 0; V.numCpus:一个整数,指定用于分析的 CPU 数目,默认值为 1; VI.memory:一个整数,指定用于分析用的内存数量,默认值为 90; VII.memoryUnits:一个符号常量,用于定义内存数量的单位,默认值为 PERCENTAGE, 可能取值为: PERCENTAGE、 MEGA_BYTES 和 GIGA_BYTES; IX. atTime: String specifying the time at which to submit the job. The default value A is an empty string; 【提示】:You can use the atTime argument when creating a Job object on a Windows workstation; however, the at command is available only on UNIX platforms;

50

Abaqus & Python 开发使用指南 X.userSubroutine:A String specifying the file containing the user's subroutine definitions. The default value is an empty string; XI.messages:A MessageArray object specifying the messages received during an analysis; ⑥ Corresponding analysis keywords *HEADING *PREPRINT

10.4 回调函数的例子
# Define the callback function from abaqus import * from abaqusConstants import * import visualization def onMessage(jobName, messageType, data, viewport): if ((messageType==ABORTED) or (messageType==ERROR)): print 'Solver problem; stop execution of callback function' elif (messageType==JOB_COMPLETED): odb = visualization.openOdb(path=jobName + '.odb') viewport.setValues(displayedObject=odb) viewport.odbDisplay.display.setValues(plotState=CONTOURS_ON_DEF) viewport.odbDisplay.commonOptions.setValues(renderStyle=FILLED) ………………………………………………………………………………………….. myJobName = 'Deform' monitorManager.addMessageCallback(jobName='myJobName', messageType=ANY_MESSAGE_TYPE, callback=onMessage, userData=myViewport) myJob = mdb.Job(name=myJobName, model='Beam', description=jobDescription) myJob.submit() # End of example script.
51

Abaqus & Python 开发使用指南

10.5 监控计算过程中某个指定变量的计算结果
对于大型的有限元分析,监控分析作业非常必要,例如对应力、应变、位移 等变量进行监控,实时掌握有限元分析的执行情况。 10.5.1 案例背景 在某个 INP 文件中,对部件 52 号节点的位移 U2 进行监控,要求当 52 号节 点的位移 U2 达到-1.5 时就停止分析。 10.5.2 INP文件的监控输出设置 在 INP 文件中要求对 52 号节点进行定义集合,同时要求在某个分析步中定 义其监控输出,其语句如下: …………………………………… *Nset , nset = monitor , instance = dome-1 52 , …………………………………… *Monitor , dof = 2 ,node = monitor , frequency = 1 *End Step 【能力提升】 :*Monitor 的用法 该关键字用于在分析过程中,监控某一个节点的某个自由度,且在 step 中定 义,其格式为: *MONITOR , NODE=node_number ,DOF = dof , FREQUENCY = N 【提示】 :在 INP 文件中该语句只能出现在分析步的最后一行,即*End Step 的 上一行;同时可以在不同的分析步中,可以设置监控不同的节点或自由度; CAE 中的操作:Step 模块中, 【Output】-》 【DOF Monitor】,在 CAE 中设置 只能对一个节点和自由度进行监控, 在不同分析步中不能够更改监控的节点和自 由度; 10.5.3 定义回调函数monitorDataValue(…) def monitorDataValue(jobName, messageType, data, userData): print “%-8s %s”%(data.time, data.value)

52

Abaqus & Python 开发使用指南 if data.value<-1.5: mdb.jobs[jobName].kill() 10.5.4 定义addMessageCallback() monitorManager.addMessageCallback(jobName='rubberDome', messageType=MONITOR_DATA, callback=monitorDataValue, userData=None) 【提示】:对分析任务进行监控的流程:首先提交分析任务,然后再运行由回 调函数和 monitorManager.addMessage(…)函数构成的 py 文件;

53

Abaqus & Python 开发使用指南

11 Abaqus_Python脚本对输出数据库的接口
默认情况,在 Abaqus/CAE 中只能以只读属性打开输出数据库,对输出数据 库进行操作时,必须将只读属性去掉。 编写脚本访问输出数据库时,应注意下列问题: ① 不能修改或删除输出数据库中的数据,创建新的 odb 文件时,只允许从 ODB 文件中复制数据,而不会删除数据; ② 对于同一个输出数据库文件,每次只允许一个用户访问,为了防止损坏 文件,访问过程中输出数据库文件将自动被锁定,在工作目录下自动生成.lc 的 文件; ③ 从输出数据库中读取数据向后兼容,但向输出数据库中写入数据不向后 兼容;

11.1 基础概念
三组常用概念: 1) 模型、模型数据库和输出数据库; 2) 模型数据和结果数据; 3) 场输出和历史输出; 11.1.1 模型、模型数据库和输出数据库 ① 模型: 模型中包含了分析所需要的所有信息, 可以包含任意多个部件及其 相关属性(材料、接触、边界条件、载荷、网格、分析步等),每个模型中只能包 含一个装配体,同一个模型数据库中各个模型相互独立; ② 模型数据库:模型数据库由任意多个模型组成,扩展名为.cae; ③ 输出数据库:输出数据库文件包含后处理模块需要的所有结果,扩展名 为.odb,输出数据库通常包含三类信息:场输出、历史输出和诊断信息,其中诊 断信息会部分写到.msg 或.sta 文件中。 11.1.2 模型数据和结果数据 模型数据指定义分析模型的数据,如:部件、材料、边界材料等;

54

Abaqus & Python 开发使用指南 结果数据指输出数据库中的场输出或历史输出数据; 11.1.3 场输出和历史输出 场输出可以是整个模型,也可以是模型的某个区域,场输出只能输出某个量 的所有计算结果,因此包含的数据信息量很大;而历史输出来源于模型的一小部 分,一般用于生产曲线用途。

11.2 输出数据库对象模型
如果希望编写脚本来访问和处理输出数据库中的计算结果,则必须使用下列 语句: from odbAccess import * from abaqusConstants import * 如果希望编写脚本访问或创建输出数据库中的模型数据,则应该使用下列语 句导入相应模块: from odbMaterial import * from odbSection import * Abaqus 生成的输出数据库包含模型数据和结果数据两部分,如下图所示:

55

Abaqus & Python 开发使用指南 11.2.1 模型数据 模型数据用于存储部件和部件实例的单元信息、 材料、 边界条件、 但是, Abaqus 脚本接口并未将所有的模型数据都写入到输出数据库中, 如载荷信息就不会写入 输出数据库中,存储在模型数据库中的模型数据主要有:部件、装配体、部件实 例、区域、材料、截面、截面分配和截面分类。 ① 部件(parts) 输出数据库中的部件包含所有的节点、单元、表面和集合的信息; ② 根装配体(root assembly) 每个输出数据库中只能包含一个根装配体;

【提示】 :模型数据库中可以存储多个模型数据,因此编写脚本时需要指定模型 名,而输出数据库中只包含一个模型数据,因此编写脚本时就无需指定模型名, 如下列代码: #访问模型数据库: mdb = openMdb(pathName='/users/smith/mdb/hybridVehicle') myModel = mdb.models['Transmission'] myPart = myModel.rootAssembly.instances['housing'] #访问相应的输出数据库中的同一个模型数据: odb = openOdb(path='/users/smith/odb/transmission.odb') myPart = odb.rootAssembly.instances['housing'] 【技巧】 :可以使用 prettyPrint()方法来查看输出数据库的状态和对象模型的层 次结构关系,如下面代码: from odbAccess import *
56

Abaqus & Python 开发使用指南 from textRepr import * odb=openOdb('Deform.odb') prettyPrint(odb,2) ({'analysisTitle': 'Cantilever beam tutorial', 'closed': False, 'description': 'DDB object', 'diagnosticData': ({'analysisErrors': 'OdbSequenceAnalysisError object', 'analysisWarnings': 'OdbSequenceAnalysisWarning object', 'jobStatus': JOB_STATUS_COMPLETED_SUCCESSFULLY, 'jobTime': 'OdbJobTime object', 'numberOfAnalysisErrors': 0, 'numberOfAnalysisWarnings': 0, 'numberOfSteps': 1, 'numericalProblemSummary': 'OdbNumericalProblemSummary object', 'steps': 'OdbSequenceDiagnosticStep object'}), 'isReadOnly': False, 'jobData': ({'analysisCode': ABAQUS_STANDARD, 'creationTime': 'date time year', 'machineName': '', 'modificationTime': 'date time year', 'name': 'Deform.odb', 'precision': SINGLE_PRECISION, 'productAddOns': 'tuple object', 'version': 'Abaqus/Standard release'}), 'name': 'Deform.odb', 'parts': {'BEAM': 'Part object'}, 'path': 'C:/Deform.odb', 'rootAssembly': ({'connectorOrientations': 'ConnectorOrientationArray object', 'datumCsyses': 'Repository object', 'elementSet': 'Repository object', 'elementSets': 'Repository object', 'elements': 'OdbMeshElementArray object', 'instance': 'Repository object', 'instances': 'Repository object', 'name': 'ASSEMBLY', 'nodeSet': 'Repository object', 'nodeSets': 'Repository object', 'nodes': 'OdbMeshNodeArray object', 'sectionAssignments': 'Sequence object', 'surface': 'Repository object', 'surfaces': 'Repository object'}),
57

Abaqus & Python 开发使用指南 'sectionCategories': {'solid < STEEL >': 'SectionCategory object'}, 'sectorDefinition': None, 'steps': {'Beamload': 'OdbStep object'}, 'userData': ({'annotations': 'Repository object', 'xyData': 'Repository object',
'xyDataObjects': 'Repository object'})})

11.2.2 结果数据 结构数据指的是有限元分析输出的结果,Abaqus 脚本接口将输出数据库中的 结果数据分为下列几部分,如下图所示:

58

Abaqus & Python 开发使用指南

① 分析步(steps) 访问方法:odb.steps[‘分析步名称字符串’] ② 帧(frames) 输出数据库中每个增量步的分析结果称为帧, 而每个分析步一般包含多个帧, 注意帧的数据结构为不可变的列表,访问方法: odb.steps[‘分析步名称字符串’].frames[-1] ③ 场输出(fieldOutputs) 默认是输出整个模型的场输出变量,但是信息量很大,用户可以指定某个区 域的场输出(如输出自定义集合的场输出变量),访问方法: odb.steps[‘分析步名称字符串’].frames[-1].fieldOutputs[‘S’] 【提示】:分析步和场输出的数据结构均为字典形式,而帧的数据结构为不可 变的列表形式; ④ 历史输出(historyOutputs) 历史输出必须指定模型的某个点或某个区域,即 historyRegions 对象,该对 象定义为:节点、积分点、某个区域、材料点或整个模型,访问历史输出区域所 在区域的命令如下: odb.steps[‘分析步名称字符串’].historyRegions[‘区域名称字符串’] 访问指定区域的历史输出指令:

59

Abaqus & Python 开发使用指南 odb.steps[‘分析步名称字符串’].historyRegions[‘区域名称字符 串’].historyOutputs[‘U2’]

11.3 从输出数据库读取数据
要想读取输出数据库中的数据, 首先必须导入 odbAccess 的模块, 命令如下: from odbAccess import * from abaqusConstants import * 如果脚本文件还想要访问模型数据中的数据,则必须另外再导入其余的相应 的模块,如导入材料和截面模块命令: from odbMaterial import * from odbSection import * 11.3.1 打开指定的输出数据库 调用 openOdb()方法可以打开指定的输出数据库,对应的命令如下: from odbAccess import * odb=openOdb(path=’*.odb’) openOdb()方法的用途:打开已经存在的 odb 文件,并返回一个 Odb 对象: import visualization session.openOdb(name='myOdb', path='stress.odb', readOnly=True) 其中, I.name:为要打开的 odb 文件名称,默认情况 name 与 path 中的名称一样, 这时 name 参数可以省略; II.path:为 odb 文件的路径的字符串; III.readOnly:一个布尔值,True 或 False,默认为只读属性,即 Trre; 11.3.2 读取模型数据 模型数据中许多对象为库, 用户可以使用 keys()方法来查询该对象的键名称; ① 根装配体(root assembly) 一个输出数据库只包含一个根装配体,通过访问 odbAssembly 对象访问: myAssembly = odb.rootAssembly

60

Abaqus & Python 开发使用指南 ② 部件实例(part instances) 部件实例存储在 OdbAssembly 对象的部件实例库(instances)中,使用下列命 令来查询部件实例的名称: for instanceName in odb.rootAssembly.instances.keys(): print instanceName ③ 区域(Regions) 输出数据库中的区域指的是 OdbSet 对象,可以是存储在输出数据库中的部 件和部件实例集合、节点集、单元集、或单元构成的表面,其中部件位于 OdbAssembly 对象下面,而部件直接位于 Odb 对象下面; 例如: >>> print 'Node sets = ',odb.rootAssembly.nodeSets.keys() Node sets = ['ALL NODES']

>>> print 'Node sets = ', odb.rootAssembly.instances['PART-1-1'].nodeSets.keys() >>>print 'Element sets =‘.',odb.rootAssembly.instances['PART-1-1'].elementSets.keys() Node sets = ['ALLN', 'BOT', 'CENTER', 'N1', 'N19', 'N481', 'N499', 'PUNCH', 'TOP'] Element sets = ['CENT', 'ETOP', 'FOAM', 'PMASS', 'UPPER']

>>> topNodeSet = odb.rootAssembly.instances['PART-1-1'].nodeSets['TOP'] 【提示】:定义的节点集合、单元集合和单元表面集合均属于 OdbSet 对象,用 户可以创建一个变量指定一个区域(即一个集合),然后可以使用该区域来作为场 输出的一个子区域。 ④ 材料(Materials) 材料存储于 Odb 对象下面的 materials 库中,访问材料库的命令如下: allMaterials = odb.materials for materialName in allMaterials.keys(): print 'Material Name : ',materialName for material in allMaterials.values():
61

Abaqus & Python 开发使用指南 if hasattr(material,'elastic'): elastic = material.elastic if elastic.type == ISOTROPIC: print 'isotropic elastic behavior, type = %s' \ % elastic.moduli title1 = 'Young modulus title2 = '' if elastic.temperatureDependency == ON: title2 = 'Temperature dep = elastic.dependencies title3 = '' for x in range(dep): title3 += ' field # %d' % x print '%s %s %s' % (title1,title2,title3) for dataline in elastic.table: print dataline 【提示】:关于 Material 对象的详细介绍,参见脚本参考手册的“29 Material commands”。 ⑤ 截面(sections) 截面存储在 Odb 对象的截面库(sections)中, 下面命令将输出截面库中所有截 面的名称: allSections = odb.sections for sectionName in allSections.keys(): print 'Section Name : ',sectionName for mySection in allSections.values(): if type(mySection) == HomogeneousSolidSectionType: print 'material name = ', mySection.material print 'thickness = ', mySection.thickness ⑥ 截面分配(section assignments) ' Poisson\'s ratio '

62

Abaqus & Python 开发使用指南 截面分配存储在 OdbAssembly 对象的 odbSectionAssignmentArray 库中, 部 件实例对象访问 odbSectionAssignmentArray 库的命令如下: instances = odb.rootAssembly.instances for instance in instances.values(): assignments = instance.sectionAssignments print 'Instance : ',instance.name for sa in assignments: region = sa.region elements = region.elements print ' Section : ',sa.sectionName print ' Elements associated with this section : ' for e in elements: print ' label : ',e.label ⑦ 解析刚体表面(analytical rigid surfaces) 解析刚体表面存储于 OdbPart 对象或 OdbInstance 对象下面,每一个 OdbPart 对象或 OdbInstance 对象仅有一个解析刚体表面。 ⑧ 刚体(Rigid bodies) 刚体存储于 odbRigidBodyArray 下,每个 OdbPart、OdbInstance 对象和 OdbAssembly 对象仅拥有一个 odbRigidBodyArray。 ⑨ 欲拉截面(pretension sections) pretension sections 存储于 OdbAssembly 对象下 odbPretensionSectionArray 中。 11.3.3 读取结果数据 结果数据包括:分析步、帧、场输出、历史输出。 ① 分析步(steps) 分析步存储在 Odb 对象下的分析步库(steps)中,调用 keys()方法可以获取分 析步库中的关键字; >>>for stepName in odb.steps.keys(): >>>print stepName Step-1
63

Abaqus & Python 开发使用指南 Step-2 Step-3 【提示】:对于库而言,使用 values()方法,可以将库中所有的键值以列表形式 返回,因此可以指定输出哪一下关键字,使用如下命令: >>>step1 = odb.steps.values()[0] >>>print step1.name Step-1 ② 帧(frames) 每一个分析步包含了许多帧的列表, 每个帧包含了每一个增量步的分析结果。 >>>lastFrame = odb.steps['Step-1'].frames[-1] ③ 整个模型的场输出数据(field output data) 场输出数据存储于 OdbFrame 对象的场输出库(fieldOutputs)中, 库的关键字 就是场输出变量名称, 每一个场输出变量都是一个 FieldOutput 对象; 使用 keys() 访问某帧场输出的所有变量,命令如下: >>>for fieldName in lastFrame.fieldOutputs.keys(): >>>print fieldName COPEN CPRESS CSHEAR1 CSLIP1 LE RF RM3 S U UR3 用户在设定场输出变量的时候,不同的变量可以以不同的频率输出,因此, 在输出数据库中,并不是每一个帧中都包含某一个场输出变量,因此,用户需 TARGET/IMPACTOR TARGET/IMPACTOR TARGET/IMPACTOR TARGET/IMPACTOR

64

Abaqus & Python 开发使用指南 要对某帧进行检查是否含有某个场输出变量, 下面的程序列出某帧所有的场输出 变量: 【程序命令】: # For each field output value in the last frame, # print the name, description, and type members. for f in lastFrame.fieldOutputs.values(): print f.name, ':', f.description print 'Type: ', f.type # For each location value, print the position. for loc in f.locations: print 'Position:',loc.position print 【运行结果】: COPEN TARGET/IMPACTOR : Contact opening

Type: SCALAR Position: NODAL

CPRESS

TARGET/IMPACTOR : Contact pressure

Type: SCALAR Position: NODAL

CSHEAR1

TARGET/IMPACTOR : Frictional shear

Type: SCALAR Position: NODAL

CSLIP1

TARGET/IMPACTOR : Relative tangential motion direction 1

Type: SCALAR Position: NODAL

LE : Logarithmic strain components
65

Abaqus & Python 开发使用指南 Type: TENSOR_2D_PLANAR Position: INTEGRATION_POINT

RF : Reaction force Type: VECTOR Position: NODAL

RM3 : Reaction moment Type: SCALAR Position: NODAL

S : Stress components Type: TENSOR_2D_PLANAR Position: INTEGRATION_POINT

U : Spatial displacement Type: VECTOR Position: NODAL

UR3 : Rotational displacement Type: SCALAR Position: NODAL 【提示】:每一个 FieldOutput 对象拥有一个属性 values,其返回一个由 FieldValue 对象组成的序列,序列中的每一个 FieldValue 对象可以使用 _members_查询其属性。例如: displacement=lastFrame.fieldOutputs['U'] fieldValues=displacement.values # For each displacement value, print the nodeLabel # and data members. for v in fieldValues:
66

Abaqus & Python 开发使用指南 print 'Node = %d U[x] = %6.4f, U[y] = %6.4f' % (v.nodeLabel, v.data[0], v.data[1]) 运行结果: Node = 1 U[x] = 0.0000, U[y] = -76.4580 Node = 3 U[x] = -0.0000, U[y] = -64.6314 Node = 5 U[x] = 0.0000, U[y] = -52.0814 Node = 7 U[x] = -0.0000, U[y] = -39.6389 Node = 9 U[x] = -0.0000, U[y] = -28.7779 Node = 11 U[x] = -0.0000, U[y] = -20.3237... 查询 FieldVaule 对象的成员属性: fieldValues[0].__members__ 运行结果: ['instance', 'elementLabel', 'nodeLabel', 'position', 'face', 'integrationPoint', 'sectionPoint', 'localCoordSystem', 'type', 'data', 'magnitude', 'mises', 'tresca', 'press', 'inv3', 'maxPrincipal', 'midPrincipal', 'minPrincipal', 'maxInPlanePrincipal', 'minInPlanePrincipal', 'outOfPlanePrincipal'] ④ 指定某个区域的场输出数据 用户可以使用区域参数来读取该区域的场输出数据,前提用户必须首先定义 好区域(即一个 OdbSet 对象),然后使用 getSubset()方法来读取该区域的场输出 数据,通常情况下,读取单元节点集合或单元集合的数据,例如: center = odb.rootAssembly.instances['PART-1-1'].nodeSets['PUNCH'] displacement=lastFrame.fieldOutputs['U'] centerDisplacement = displacement.getSubset(region=center) centerValues = centerDisplacement.values for v in centerValues: print v.nodeLabel, v.data

67

Abaqus & Python 开发使用指南 【提示】:subSubset 的参数 region 可以是一个区域、an element type、a position 或者 section point data. 例如: topCenter =odb.rootAssembly.instances['PART-1-1'].elementSets['CENT'] stressField = odb.steps['Step-2'].frames[3].fieldOutputs['S'] # The following variable represents the stress at # integration points for CAX4 elements from the # element set "CENT." field = stressField.getSubset(region=topCenter, position=INTEGRATION_POINT, elementType = 'CAX4') fieldValues = field.values for v in fieldValues: print 'Element label = ', v.elementLabel, if v.integrationPoint: print 'Integration Point = ', v.integrationPoint else: print # For each tensor component. for component in v.data: # Print using a format. The comma at the end of the # print statement suppresses the carriage return. print '%-10.5f' % component, 运行结果: Element label = S : 0.01230 Element label = S : 0.01313 Element label = S : 0.00619 Element label = 1 Integration Point = -0.05658 0.00892 1 -0.00015 2 -0.00106 3 -0.00023 4
68

1 Integration Point = -0.05659 0.00892

1 Integration Point = -0.05642 0.00892

1 Integration Point =

Abaqus & Python 开发使用指南 S : 0.00697 Element label = S : 0.01281 Element label = S : 0.01183 Element label = -0.05642 0.00892 -0.00108 1 -0.00146 2 -0.00257 3 ...

11 Integration Point = -0.05660 0.00897

11 Integration Point = -0.05651 0.00897

11 Integration Point =

⑤ 读取历史输出数据 一般情况下,历史输出只是对某个点或者模型的一小部分区域输出计算结果 (如,能量),历史输出区域可以是一个节点、一个积分点、某个区域或一个材料 点,而不允许对多个点进行历史输出。

场输出与帧相关,而历史输出与帧无关,只与分析步有关,历史输出数据存 储在 OdbStep 对象的 historyRegions 库中,库的关键字即为用户定义的历史输 出区域;所有与历史输出相关的点都保存为历史输出区域(HistoryRegion)对象, HistoryRegion 对象包含了多个历史输出(HistoryOutput)对象,而每一个 HistoryOutput 对象又是由(frameValue , value)组成的序列,即该序列中的每一 个元素又是由(frameValue , value)组成的元组。 【实例】:输出第二个分析步中的历史输出数据 U2 并写入 ASCII 文件: from odbAccess import * odb = openOdb(path='viewer_tutorial.odb') step2 = odb.steps['Step-2']
69

Abaqus & Python 开发使用指南 region = step2.historyRegions['Node PART-1-1.1000'] u2Data = region.historyOutputs['U2'].data dispFile = open('disp.dat','w') for time, u2Disp in u2Data: dispFile.write('%10.4E dispFile.close() %10.4E\n' % (time, u2Disp))

11.4 向输出数据库写入数据
当用户新写一个输出数据库时,需要使用相应的对象构造函数创建相应的对 象,并使用相应对象的方法来赋值操作。 11.4.1 创建一个新的输出数据库 调用 Odb 对象的构造函数 Odb()来创建一个空的输出数据库,对应的命令: odb = Odb(name='myData', analysisTitle='derived data', description='tesproblem', path='testWrite.odb') 新创建的输出数据库还应该使用 save()方法来保存,命令如下: odb.save() 【提示】:打开或创建一个输出数据库时,Abaqus 自动创建根装配体对象 (RootAssembly); 11.4.2 写入模型数据 由于创建的输出数据库中不包含任何模型的信息,因此,写入模型数据时, 首先要创建部件,并向部件中添加节点和单元;然后再创建部件实例,并定义装 配体;如果输出数据库中已经包含了结果数据,用户不允许改变模型的几何形 状,目的是保证分析结果和模型信息一一对应。 ① 部件(Part) Abaqus/CAE 创建的部件的几何信息都将存储在模型数据库中,而不会存储 在输出数据库中,输出数据库中只保存部件的节点信息、单元信息、表面定义 信息和集合信息;用户可以调用 Part 构造函数在输出数据库(Odb 对象)中创建 部件对象,并可以指定部件的类型(目前仅支持创建变形体,刚体不支持)。 >>>part1=odb.Part(name='part-1', embeddedSpace=THREE_D,\
70

Abaqus & Python 开发使用指南 type=DEFORMABLE_BODY) 创建了一个空的 OdbPart 对象后, 需要使用该对象的 addNodes()方法通过指 定节点编号和节点坐标来添加节点信息,也可以同时定义节点集合。 >>>nodeData = ( (1, 1,0,0), (2, 2,0,0), (3, 2,1,0.1), (4, 1,1,0.1),\

(5, 2,-1,-0.1),

(6, 1,-1,-0.1), )

>>>part1.addNodes(nodeData=nodeData, nodeSetName='nset-1') 对于创建节点集合,还可以使用构造函数 NodeSetFromNodeLabel 指定节点 编号来创建节点集合: >>>nodeLabels=(2 , 3) >>>part1.NodeSetFromNodeLabels(name=’nset-2’,nodeLabels = nodeLabels) 创建了节点和节点集合后,还应该创建单元并指定单元类型,调用 addElement()方法可以向部件中添加单元,也可以同时定义单元集合和截面分 类: >>># Set up the section categories >>>sCat = odb.SectionCategory(name='S5', description='Five-Layered Shell') >>>spBot = sCat.SectionPoint(number=1, description='Bottom') >>>spMid = sCat.SectionPoint(number=3, description='Middle') >>>spTop = sCat.SectionPoint(number=5, description='Top') >>>elementData = ((1, 1,2,3,4), (2, 6,5,2,1),) >>>part1.addElements(elementData=elementData, type='S4',\
elementSetName='eset-1', sectionCategory=sCat)

【提示】: I. 关于 Part 的构造函数、addNodes 方法、addElements 方法详细信息,参 见脚本参考手册的 OdbPart 对象。 II.关于创建节点集合和单元集合的详细信息,参见脚本参考手册的 OdbSet 对象; III.添加单元节点与单元、定义单元集合与节点集合的方法中参数一般数据 结构都是元组格式,希望特别注意; ② 根装配体(RootAssembly 对象)

71

Abaqus & Python 开发使用指南 当用户创建一个输出数据库时,这个 RootAssembly 对象自动被创建,访问 根装配体的方法与读取数据库的语法相同, 用户可以在根装配体下创建部件实例 和区域。 >>>odb.rootAssembly ③ 部件实例(Part instances) 调用 Instance 构造函数可以创建部件实例,如: >>>a = odb.rootAssembly >>>instance1 = a.Instance(name='part-1-1', object=part1) 【提示】:只能够对部件添加节点和单元,而不允许对部件实例添加节点和单 元;详情参考脚本参考手册中的 OdbInstance 对象。 ④ 区域(Regions) 区域命令用于从单元编号中创建单元集合、从节点编号中创建节点集合和单 元表面集合,而且可以对部件、部件实例或根装配体创建集合。同一个部件中, 节点和单元编号都是惟一的,而装配体中的节点和单元编号有可能重合,因此 重回的单元和节点可以属于不同的部件。 【实例】: # An element set on an instance eLabels = [9,99] elementSet = instance1.ElementSetFromElementLabels( name='elsetA',elementLabels=eLabels) # A node set on the rootAssembly nodeLabels = (5,11) instanceName = 'part-1-1' nodeSet = assembly.NodeSetFromNodeLabels( name='nodesetRA',((instanceName,nodeLabels),)) 【提示】:关于 region 的相关命令参见脚本参考手册的 Region commands。 ⑤ 材料(Materials) 利用 Material()构造函数可 Odb 对象的材料库(materials)中存储了所有材料, 以在输出数据库中创建新的材料,如: >>>material_1=odb.Material(name=’Elastic Material’)
72

Abaqus & Python 开发使用指南 >>>material_1.Elastic(type = ISOTROPIC , table ((12000, 0.3),)) 【提示】:关于 material 的相关命令参见脚本参考手册的 Material commands。 ⑥ 截面(Section) Section 对象可以创建截面(sections)和梁形状(profiles),Section 对象存储在 Odb 对象的截面库(sections)中,创建 Section 对象之前必须首先创建 Material 对象,否则,将会抛出异常。 ⑦ 截面分配(Section assignments) 截面分配对象可以为模型中的区域分配截面和材料特性,它是 Odb 对象的成 员,所有单元必须定义截面和材料特性,截面分配将部件实例中的单元与截面 属性建立联系。 【提示】:关于 assignSection 的相关命令参见脚本参考手册的 assignSection。 11.4.3 写入结果数据 向输出数据库中写入结果数据时,应该首先创建 Step 对象,如果需要向输出 数据库中写入场输出数据,还应该创建 Frame 对象,而历史输出数据与 Step 对 象有关; ① 分析步(steps) 调用 Step 构造函数可以为时域(time domain)、频域(frequency domain)或模态 域(modal domain)的分析结果创建分析步。 >>>step1 = odb.Step(name='step-1', description='', domain=TIME, timePeriod=1.0) 【提示】:关于 Step 的相关命令参见脚本参考手册的 OdbStep 对象。 ② 帧(frames) 调用 Frame()构造函数可以为场输出创建帧对象; >>>rame1 = step1.Frame(incrementNumber=1, frameValue=0.1, description='') 【提示】:关于 frame 的相关命令参见脚本参考手册的 OdbFrame 对象。 ③ 写入场输出数据 FieldOutput 对象包含了大量的数据(如,单元每个积分点的应力张量),而且 每个数据都有位置(location)、类型(type)和值(value)等成员。用户编写脚本向 Frame 对象中添加场输出数据之前,必须首先调用 FieldOutput 构造函数创建 FieldOutput 对象,然后调用 addData 方法添加数据。
73

Abaqus & Python 开发使用指南 【实例】 : # Create the part and the instance. part1 = odb.Part(name='part-1', embeddedSpace=THREE_D, type=DEFORMABLE_BODY) a = odb.rootAssembly instance1 = a.Instance(name='part-1-1', object=part1) # Write nodal displacements uField = frame1.FieldOutput(name='U', description='Displacements', type=VECTOR) # Create the node labels. nodeLabelData = (1, 2, 3, 4, 5, 6) # Each set of data corresponds to a node label. dispData = ((1,2,3), (4,5,6), (7,8,9),(10,11,12),(13, 14, 15),(16,17,18)) # Add nodal data to the FieldOutput object using the # node labels and the nodal data for this part instance. uField.addData(position=NODAL, instance=instance1, labels=nodeLabelData, data=dispData) # Make this the default deformed field for this step. step1.setDefaultDeformedField(uField) ………………………………………………………………………………………… 【FieldOutput()构造函数的详情参数】 【Path】 session.odbs[name].steps[name].frames[i].FieldOutput 【Required arguments】 name:A String specifying the output variable name. description:A String specifying the output variable. type:A SymbolicConstant specifying the output type. 可能取值有:SCALAR、 VECTOR、TENSOR_3D_FULL、TENSOR_3D_PLANAR、 TENSOR_3D_SURFACE、TENSOR_2D_PLANAR 和 TENSOR_2D_SURFACE.
74

Abaqus & Python 开发使用指南

【Optional arguments】 componentLabels A sequence of Strings specifying the labels for each component of the value. The length of the sequence must match the type. If type=TENSOR, the default value is name with the suffixes ('11', '22', '33', '12', '13', '23'). Iftype=VECTOR, the default value is name with the suffixes ('1', '2', '3'). If type=SCALAR, the default value is an empty sequence. validInvariants A sequence of SymbolicConstants specifying which invariants should be calculated for this field. An empty sequence indicates that no invariants are valid for this field. Possible values are:
? MAGNITUDE ? MISES ? TRESCA ? PRESS ? INV3 ? MAX_PRINCIPAL ? MID_PRINCIPAL ? MIN_PRINCIPAL ? MAX_INPLANE_PRINCIPAL ? MIN_INPLANE_PRINCIPAL ? OUTOFPLANE_PRINCIPAL

The default value is an empty sequence. isEngineeringTensor A Boolean specifying whether the field is an engineering tensor or not. Setting isEngineeringTensor to true makes a tensor field behave as a strain like quantity where the off-diagonal components of tensor are halved for invariants computation. This parameter applies only to tensor field outputs. The default value is OFF.
75

Abaqus & Python 开发使用指南 【Return value】 A FieldOutput object. 【提示】 :关于场输出的相关命令参见脚本参考手册的 FieldOutput 对象。 ………………………………………………………………………………………….. 【使用 addData 添加数据实例】 : # Write stress tensors (output only available at # top/bottom section points) # The element defined above (S4) has 4 integration # points. Hence, there are 4 stress tensors per element. # Abaqus creates one layer of section points each # time the script calls the addData method. elementLabelData = (1, 2) topData = ((1.,2.,3.,4.), (1.,2.,3.,4.), (1.,2.,3.,4.), (1.,2.,3.,4.),(1.,2.,3.,4.), (1.,2.,3.,4.), (1.,2.,3.,4.), (1.,2.,3.,4.),) bottomData = ((1.,2.,3.,4.), (1.,2.,3.,4.),(1.,2.,3.,4.), (1.,2.,3.,4.),(1.,2.,3.,4.), (1.,2.,3.,4.), (1.,2.,3.,4.), (1.,2.,3.,4.),) transform = ((1.,0.,0.), (0.,1.,0.), (0.,0.,1.)) sField = frame1.FieldOutput(name='S',description='Stress', type=TENSOR_3D_PLANAR, componentLabels=('S11', 'S22', 'S33','S12'), validInvariants=(MISES,)) sField.addData(position=INTEGRATION_POINT, sectionPoint=spTop, instance=instance1, labels=elementLabelData, data=topData, localCoordSystem=transform) sField.addData(position=INTEGRATION_POINT, sectionPoint=spBot, instance=instance1, labels=elementLabelData, data=bottomData, localCoordSystem=transform) # For this step, make this the default field for # visualization. step1.setDefaultField(sField) ④ 写入历史输出数据 写入历史输出数据时历史输出区域并不存在,因此,首先必须调用构造函数

76

Abaqus & Python 开发使用指南 创建历史输出区域对象,如: >>>point1 = HistoryPoint(element=instance1.elements[0]) >>>step1 = odb.Step(name='step-1', description='', domain=TIME, timePeriod=1.0) >>>h1 = step1.HistoryRegion(name='my history',description='my stuff',point=point1) 创建完历史输出区域对象后, 就可以调用 HistoryOutput()构造函数创建历史 输出对象,然后调用历史输出对象的 addData()方法向其中添加数据,如: h1_u1 = h1.HistoryOutput(name='U1',description='Displacement', type=SCALAR) h1_rf1 = h1.HistoryOutput(name='RF1',description='Reaction Force',type=SCALAR)

# Similarly for Step 2 step2 = odb.Step(name='step-2', description='', domain=TIME, timePeriod=1.0) h2 = step2.HistoryRegion(name='my history',description='my stuff', point=point1) h2_u1 = h2.HistoryOutput(name='U1',description='Displacement', type=SCALAR) h2_rf1 = h2.HistoryOutput(name='RF1',description='Reaction Force',type=SCALAR) 每个 HistoryOutput 对象都是由(frameValue , value)组成的序列,可以调用 addData()方法向其中添加数据,其中 frameValue 和 value 也分别是一个元组; timeData = (0.0, 0.1, 0.3, 1.0) u1Data = (0.0, 0.0004, 0.0067, 0.0514) rf1Data = (27.456, 32.555, 8.967, 41.222) h1_u1.addData(frameValue=timeData, value=u1Data) h1_rf1.addData(frameValue=timeData, value=rf1Data) # similar for step2 timeData = (1.2, 1.9, 3.0, 4.0) u1Data = (0.8, 0.9, 1.3, 1.5) rf1Data = (0.9, 1.1, 1.3, 1.5) h2_u1.addData(frameValue=timeData, value=u1Data) h2_rf1.addData(frameValue=timeData, value=rf1Data) 【提示】 :详情参见脚本参考手册中 Odb commands 下面的 HistoryPoint 对象、 HistoryRegion 对象和 HistoryOutput 对象;

77

Abaqus & Python 开发使用指南

11.5 设置默认的显示变量
Abaqus/Viewer 使用默认设置来显示场变量的云图和变形图。对于变形图而 言,默认情况下,变形前场变量使用 Mises 应力,变形后场变量使用位移”U”, 而不允许使用应力的某个分量(如 U1)作为默认的变形后的场变量,默认的显示 变量设置适用于分析步的所有帧,如图所示:

78

Abaqus & Python 开发使用指南 【使用位移’U’作为某个分析步场变量和变形后场变量的实例】: field=odb.steps['impact'].frames[1].fieldOutputs['U'] odb.steps['impact'].setDefaultField(field) odb.steps['impact'].setDefaultDeformedField(field) 根据需要,也可以为不同分析步设置默认场输出变量和变形后的场输出变 量,此时,需要使用循环语句进行循环设置,命令如下: for step in odb.steps.values(): step.setDefaultField(field)

11.6 对Abaqus的分析结果进行数学计算分析
用户可以编写脚本对输出数据库进行运算分析,包括:数学运算规则、有效 的数学运算、粗略运算和结果转换。 11.6.1 数学运算规则 FieldOutput 对象、FieldValue 对象和 HistoryOutput 对象都支持数学运算,其 有效的数学运算规则有: ① 允许对张量分量或向量进行数学运算; ② 可以根据张量分量来计算不变量; ③ 不支持 FieldOutput 对象和 HistoryOutput 对象、 FieldValue 对象和 HistoryOutput 对象之间进行数学运算; ④ 不支持两个向量对象、两个张量对象之间的乘法和除法运算; ⑤ 数学运算表达式中的数据类型必须相兼容; I.向量与张量不支持求和运算; II.三维表面张量和三维平面张量不支持求和运算; III.积分点的结果数据不能够与单元节点的结果数据进行求和运算; ⑥ 如果通过 getSubset()方法获取数学运算表达式中的场变量,则必须使用 getSubset()方法安装相同顺序获取每个场变量; ⑦ 三角函数中各参数的单位是弧度; ⑧ 如果建立了局部坐标系,张量的数学运算基于局部坐标系,否则,基于全局 坐标系;
79

Abaqus & Python 开发使用指南 ⑨ 如果 FieldValue 对象中的数据类型均相同,则允许对模型中不同位置的 FieldValue 对象进行数学运算;如果 FieldValue 对象的位置不同,则计算得 到的 FieldValue 对象值与位置无关; ⑩ 不支持复数运算; 11.6.2 有效的数学运算
Table 11-1 数学运算中用到的缩略语 缩略语 all float FO FV HO 允许值 FieldOutput objects, FieldValue objects, HistoryVariable objects, or floating point numbers floating point numbers FieldOutput objects FieldValue objects HistoryOutput objects

Table 11-2 有效的数学运算 符号 all + float FO + FO FV + FV HO + HO -all all - float FO - FO FV - FV HO + HO all * float all / float abs(all) 运算 加 加 加 加 相反数 减 减 减 减 乘 除 绝对值 返回值 all FO FV HO all all FO FV HO all all all 符号 atan(all) cos(all) degreeToRadian (all) exp(all) exp10(all) log(all) log10(all) float ** float power(FO, float) power(FV, float) power(HO, float) radianToDegree (all) 运算 反正切 余弦 角度转为弧度 自然指数 10 为底指数 自然对数 10 为底对数 幂运算 幂运算 幂运算 幂运算 弧度转为角度 返回值 all all all all all all all all FO FV HO all

80

Abaqus & Python 开发使用指南
符号 acos(all) asin(all) tan(all) 运算 反余弦 反正弦 正切 返回值 all all all 符号 sin(all) sqrt(all) 运算 正弦 平方根 返回值 all all

11.6.3 粗略运算 粗略计算一般用于从众多场变量数据中查找极大值或极小值,对从多工况或 多分析步中搜索极值非常有帮助。 Abaqus 脚本接口中提供了两个粗略计算命令:maxEnvelope()和 minEnvelope(): (env, lcIndex) = maxEnvelope([field1, field2, ...]) (env, lcIndex) = minEnvelope([field1, field2, ...])

(env, lcIndex) = maxEnvelope([field1, field2, ...],invariant) (env, lcIndex) = minEnvelope([field1, field2, ...],invariant)

(env, lcIndex) = maxEnvelope([field1, field2, ...],componentLabel) (env, lcIndex) = minEnvelope([field1, field2, ...],componentLabel) Envelope 命令将返回 env 和 lcIndex 两个 FieldOutput 对象,其中:env 对象 为搜索到的极值,lcIndex 对象表示与搜索到极值对应的场变量索引号; invariant 和 componentLabel 参数都可可选参数,如果从向量或张量中搜索极 值,则必须使用符号常数指定这两个可选参数;invariant 参数的可能取值包括: MAGNITUDE、MISES、TRESCA、PRESS、INV3、MAX_PRINCIPAL、 MID_PRINCIPAL、MIN_PRINCIPAL;componentLabel 参数的取值为一个字符 串;详情参见脚本参考手册中 Odb commands 中的 Odb commands 中的函数; 粗略计算应满足下列规定: ① 搜索极大值和极小值时, Abaqus 使用标量对列表中的各个数据进行比较, 如果搜索到向量或张量,则必须给定不变量参数 invariant 或某个分量编号参数 componentLabel; ② 比较列表中场变量的数据类型必须相同;
81

Abaqus & Python 开发使用指南 I.同一个场变量列表中不允许同时出现向量和张量; II.搜索列表中所有场变量都必须是同一输出区域的结果数据; 11.6.4 结果转换 如果场变量为向量或张量,Abaqus 脚本接口支持在直角坐标系、柱坐标系和 球坐标系之间进行结果转换。

11.7 Abaqus_Python脚本接口后处理Odb常用函数
11.7.1 Odb对象常用成员和方法 (1) 进入 Odb 对象的途径: >>>import odbAccess >>>session.odbs[name] (2) 常用成员: ① isReadOnly :A Boolean specifying whether the output database was opened with read-only access; ② rootAssembly:An OdbAssembly object. ③ parts:A repository of OdbPart objects. ④ Materials:A repository of Material objects. ⑤ Steps:A repository of OdbStep objects. ⑥ Sections:A repository of Section objects. 11.7.2 OdbPart对象常用成员和方法 (1) 进入 OdbPart 对象的途径: >>>import odbAccess >>>session.odbs[name].parts[name] (2) 常用方法: ① getElementFromLabel(label=单元号):从 OdbPart 对象中检索指定单元号的 一个单元,返回一个 OdbMeshElement 对象; 异常结果:Invalid element label ② getNodeFromLabel label=节点号) 从 Part 对象中检索指定节点号的一个节 ( : 点,返回一个 OdbMeshNode 对象; 异常结果:Invalid node label
82

Abaqus & Python 开发使用指南 (3) 常用成员: ① nodes:An OdbMeshNodeArray object ② elements :An OdbMeshElementArray object. ③ nodeSets:A repository of OdbSet objects specifying node sets. ④ elementSets:A repository of OdbSet objects specifying element sets. ⑤ surfaces:A repository of OdbSet objects specifying surfaces. 11.7.3 FieldOutput对象常用成员和方法 (1) 进入 FieldOutput 对象的途径: >>>import odbAccess >>>session.odbs[name].steps[name].frames[i].fieldOutputs[name] (2) 常用方法: ① FieldOutput(…):创建并返回一个 FieldOutput 对象; >>> session.odbs[name].steps[name].frames[i].FieldOutput() I.必填参数: i. name:A String specifying the output variable name; ii. description:A String specifying the output variable; iii. Type:一个符号常量,可能取值为: SCALAR, VECTOR, TENSOR_3D_FULL, TENSOR_3D_PLANAR, TENSOR_3D_SURFACE, TENSOR_2D_PLANAR, and TENSOR_2D_SURFACE; II.选填参数: i. componentLabels:A sequence of Strings specifying the labels for each component of the value. The length of the sequence must match the type. If type=TENSOR, the default value is name with the suffixes ('11', '22', '33', '12', '13', '23'). If type=VECTOR, the default value is name with the suffixes ('1', '2', '3'). If type=SCALAR, the default value is an empty sequence.; ② addData(…):将 getSubset()与数学运算得到的 field 变量数据增加到一个 FieldOutput 对象; I.必填参数: i. field:A FieldOutput object specifying the data to add;
83

Abaqus & Python 开发使用指南 ③ getSubset(…):返回 A FieldOutput object with a subset of the field values; I.选填参数: i. region: OdbMeshElement specifying the region for which to extract values; An ④ getSubset(…):返回 A FieldOutput object with a subset of the field values; I.选填参数: i. region:An OdbMeshNode specifying the region for which to extract values; (3) 常用成员: ① values::A FieldValueArray object specifying the order of the objects in the array is determined by the Abaqus Scripting Interface; see the data argument to the addData method for a description of the order; 11.7.4 OdbAssembly对象常用成员和方法 OdbAssembly 对象没有构造函数,当一个 Odb 对象被创建时,该对象就自动 被创建。 (1) 进入 OdbAssembly 对象的途径: >>>import odbAccess >>>session.odbs[name].rootAssembly (2) 常用成员: ① instances:A repository of OdbInstance objects. ② nodeSets:A repository of OdbSet objects specifying node sets. ③ elementSets:A repository of OdbSet objects specifying element sets. ④ Surfaces:A repository of OdbSet objects specifying surfaces. ⑤ Nodes:An OdbMeshNodeArray object. ⑥ Elements:An OdbMeshElementArray object. 11.7.5 OdbFrame对象常用成员和方法 (1) 进入 OdbFrame 对象的途径: >>>import odbAccess >>>session.odbs[name].steps[name].frames[i] (2) 常用方法: ① Frame(…):创建一个 OdbFrame 对象; >>> session.odbs[name].steps[name].Frame(…)
84

Abaqus & Python 开发使用指南 I.必填参数: i. incrementNumber:An Int specifying the frame increment number within the step. The base frame has normally increment number 0, and the results run from 1. In case of multiple load cases, the same increment number is duplicated for each loadcase; ii. frameValue:A Float specifying the value in units determined by the domain member of the Step object. The equivalent in the time domain is stepTime; in the frequency domain the equivalent is frequency; and in the modal domain the equivalent is mode. (3) 常用成员: ① frameId:An Int specifying the frame ID for the frame; ②fieldOutputs:A repository of FieldOutput objects specifying the key to the fieldOutputsrepository is a String representing an output variable;. 11.7.6 OdbMeshElement对象常用成员和方法 (1) 进入 OdbMeshElement 对象的途径: >>>import odbAccess >>>session.odbs[name].parts[name].elements[i] >>> session.odbs[name].rootAssembly.elements[i] >>> session.odbs[name].rootAssembly.elementSets[name].elements[i] (2) 常用成员: ① label:An Int specifying the element label. ② Type:A String specifying the element type. 11.7.7 OdbMeshNode对象常用成员和方法 (1) 进入 OdbMeshNode 对象的途径: >>>import odbAccess >>>session.odbs[name].parts[name].elementSets[name].nodes[i] >>> session.odbs[name].rootAssembly. elementSets[name].nodes[i] (2) 常用成员: ① label:An Int specifying the node label.
85

Abaqus & Python 开发使用指南 ② coordinates:A tuple of Floats specifying the nodal coordinates in the global Cartesian
coordinate system;

11.7.8 OdbSet对象常用成员和方法 该对象用于定义模型的一个 region。 (1) 进入 OdbSet 对象的途径: >>>import odbAccess >>> session.odbs[name].parts[name].elementSets[name] >>> session.odbs[name].parts[name].nodeSets[name] >>> session.odbs[name].parts[name].surfaces[name] >>> session.odbs[name].rootAssembly.elementSets[name] >>> session.odbs[name].rootAssembly.instances[name].elementSets[name] >>> session.odbs[name].rootAssembly.instances[name].nodeSets[name] >>> session.odbs[name].rootAssembly.instances[name].surfaces[name] >>> session.odbs[name].rootAssembly.nodeSets[name] >>> session.odbs[name].rootAssembly.surfaces[name] >>>session.odbs[name].steps[name].frames[i].fieldOutputs[name].values[i].insta\ nce.elementSets[name] >>>session.odbs[name].steps[name].frames[i].fieldOutputs[name].values[i].insta\ nce.nodeSets[name] >>>session.odbs[name].steps[name].frames[i].fieldOutputs[name].values[i].insta\ nce.surfaces[name] (2) 常用方法: ① NodeSet(…):从OdbMeshNode对象中一个节点集合,返回一个OdbSet对象; This method creates a node set from an array of OdbMeshNode objects (for part instance-level sets) or from a sequence of arrays of OdbMeshNode objects (for assembly-level sets). I.Path >>> session.odbs[name].parts[name].NodeSet >>> session.odbs[name].rootAssembly.instances[name].NodeSet >>> session.odbs[name].rootAssembly.NodeSet
86

Abaqus & Python 开发使用指南 II. 必填参数 i. name:A String specifying the name of the set and the repository key. ii. nodes: A sequence of OdbMeshNode objects. For example: For a part: nodes=part1.nodes[1:5] For an assembly: nodes=(instance1.nodes[6:7], instance2.nodes[1:5]) ② NodeSetFromNodeLabels(…):This method creates a node set from a sequence of node labels,并返回一个 OdbSet 对象; I.Path >>> session.odbs[name].parts[name].NodeSetFromNodeLabels >>> session.odbs[name].rootAssembly.instances[name].NodeSetFromNodeLabels >>> session.odbs[name].rootAssembly.NodeSetFromNodeLabels II. 必填参数 i. name:A String specifying the name of the set and the repository key. ii. nodeLabels: A sequence of node labels. A node label is a sequence of Int node identifiers. For example: For a part:
nodeLabels=(2,3,5,7)

For an assembly:
nodeLabels=(('Instance-1', (2,3,5,7)), ('Instance-2', (1,2,3)))

③ ElementSet(…):This method creates an element set from an array of OdbMeshElement objects (for part instance-level sets) or from a sequence of arrays of OdbMeshElement objects (for assembly-level sets),并返回一个OdbSet对象; I.Path >>> session.odbs[name].parts[name].ElementSet >>> session.odbs[name].rootAssembly.instances[name].ElementSet II. 必填参数
87

Abaqus & Python 开发使用指南 i. name:A String specifying the name of the set and the repository key. ii. elements: A sequence of OdbMeshElement objects. For example: For a part: elements=instance1.elements[1:5] For an assembly: elements=(instance1.elements[1:5], instance2.elements[1:5]) ④ ElementSetFromElementLabels(…):This method creates a element set from a sequence of element labels,并返回一个 OdbSet 对象; I.Path >>> session.odbs[name].parts[name].ElementSetFromElementLabels >>>session.odbs[name].rootAssembly.instances[name].ElementSetFromElement\ Labels >>> session.odbs[name].rootAssembly. ElementSetFromNodeLabels II. 必填参数 i. name:A String specifying the name of the set and the repository key. ii. elementLabels: A sequence of element labels. A element label is a sequence of Int element identifiers. For example: For a part: elementLabels=(2,3,5,7) For an assembly: elementLabels=(('Instance-1', (2,3,5,7)), ('Instance-2', (1,2,3))) (3) 常用成员: ① name:A String specifying the name of the set and the repository key; ② nodes: OdbMeshNodeArray object specifying if a set spans more than one An part instance, this member is a sequence of sequences for each part instance;

88

Abaqus & Python 开发使用指南 ③ elements:An OdbMeshElementArray object specifying if a set spans more than one part instance, this member is a sequence of sequences for each part instance. 11.7.9 OdbStep对象常用成员和方法 输出数据库和模型数据库拥有相同的分析步。 (1) 进入 OdbStep 对象的途径: >>> import odbAccess >>> session.odbs[name].steps[name] (2) 常用方法: ① Step(…):创建一个 OdbStep 对象; I.Path >>> session.odbs[name].Step II. 必填参数 i. name:A String specifying the repository key; ii. description: A string specifying the step description; iii. domain:A SymbolicConstant specifying the domain of the step. Possible values are
TIME, FREQUENCY, ARC_LENGTH, and MODAL

② setDefaultDeformedField(…):This method sets the default deformed field variable in a step,无返回值; I. 必填参数 i. field:A FieldOutput object specifying the default deformed field variable for visualization; ③ setDefaultField(…): This method sets the default field variable in a step, 无返回; I. 必填参数 i. field:A FieldOutput object specifying the default field variable for visualization; (3) 常用成员: ① number:An Int specifying the step number; ② frames:An OdbFrameArray object; 11.7.10 Odb命令 >>> import odbAccess
89

Abaqus & Python 开发使用指南 >>> shockLoadOdb = odbAccess.openOdb(path='myOdb.odb') Required argument path A String specifying the path to an existing output database (.odb) file. Optional argument readOnly A Boolean specifying whether the file will permit only read access or both read and write access. The initial value is False, indicating that both read and write access will be permitted. readInternalSets A Boolean specifying whether the file will permit access to sets specified as Internal on the database. The initial value is False, indicating that internal sets will not be read. Return value An Odb object.

90


相关文章:
使用心得
3. abaqus 内部函数格式参考 documentation( 需下载 )-Abaqus Scripting Reference Manual 4.Anaconda 是 python 函数库,使用一些函数时必须装上此软件;要想 输出...
Abaqus二次开发
Abaqus 二次开发 二次开发——Abaqus/python 入门体会 入门实例 #=== 自己的论文要用到有限元进行数值模拟分析, 以前都用 ansys 计算, ansys 中岩土的本构 可...
基于Python的Abaqus二次开发实例讲解
基于PythonAbaqus 二次开发实例讲解(asian58 2013.6.26) 基于 PythonAbaqus 的二次开发便捷之处在于: 1、所有的代码均可以先在 Abaqus\CAE 中操作...
abaqus_二次开发详解
我曾 想用最笨 地方法,在 uvarm 中定义输出,利用 getvrm 获取材料点的值,...ABAQUSPython 7页 免费 abaqus二次开发 8页 免费©2015 Baidu 使用百度前必读...
Python语言在ABAQUS中的应用
Python语言在ABAQUS中的应用_冶金/矿山/地质_工程科技_专业资料。Python 语言在 ABAQUS 中的应用 【摘要】采用 python 脚本语言二次开发 abaqus,通过开发 python 脚...
SIMULAYT介绍
AFM使得CATIA V5用户可以使用集15年复合 材料研究开发设计的经验于一身的复合...例如: ABAQUS/CAE MC和python复合材料建模器。分析软件可基于Layup文件进行复 合...
hypermesh使用指南
hypermesh使用指南_计算机软件及应用_IT/计算机_专业资料。Hypermesh 软件是美国 Altair...Hypermesh 与 ABAQUS 接口问题 Hypermesh 划分好网格以后通过 inp 文件输入到 ...
Python二次开发程序详解
为两个面上的一条边, 这里边的定义由 ABAQUS 内定, 具体可以查阅参考手册. ...基于Boost.Python库的混... 5页 免费 使用python 开发 windo... 4页 免费©...
Mpcci初级使用指南
Mpcci初级使用指南_机械/仪表_工程科技_专业资料。Mpcci初级使用指南Mpcci 初级使用指南 我电脑安装的是 mpcci4.1,支持 abaqus6.10,6.11; FLUENT6.3,12,13,14. ...
石亦平书笔记-abaqus入门
python 和 c++保留了 API 接口,用于后处理。 输出类型有两种类型:场数据...ABAQUS/standard 是一个通用分析模块,它使用隐式求解方法,能够求解广泛领域的线性...
更多相关标签:
python 3程序开发指南 | python程序开发指南 | python web开发指南 | python开发指南 pdf | python开发指南 | python3开发指南 | python hdf5 使用指南 | 使用python开发的网站 |