ABAQUS二次开发教程

发布时间:2018-01-26 14:42:28   来源:文档文库   
字号:

ABAQUSPython语言)二次开发

人生苦短,我用Python

作者:Fan Shengbao

Python2.7

201712


目录

第一章 Python程序基本语法 1

1.1 Python语法结构 1

1.2 Python元组 1

1.3 Python列表 1

1.4 Python字典 2

1.5 Python集合 3

1.6 Python字符串 3

1.7 Python分支语句 4

1.8 Python循环语句 5

1.8.1 for循环 5

1.8.2 while循环 5

1.9 Python定义函数 5

1.10 Python模块 6

1.11 Python 7

1.12 Python文件和目录 7

1.12.1 目录操作 7

1.12.2 文件操作 7

1.13 Python异常处理 8

第二章 ABAQUS/Python二次开发 9

2.1 ABAQUS执行Python程序 9

2.2 编写ABAQUS/Python程序 10

2.3 ABAQUS录制Python程序 10

2.4 ABAQUS/Python对象介绍 11

2.4.1 session对象 11

2.4.2 mdb对象 11

2.4.3 odb对象 13

2.5 ABAQUS完整二次开发示例 14

2.6 ABAQUS二次开发常用函数 16

2.6.1 Part模块常用函数 16


第一章Python程序基本语法

1.1 Python语法结构

Python语言以缩进约束每个程序块编写程序时要特别注意每一行的缩进同一层次的语句应具有相同的缩进量下面是一段Python程序示例

#-*- coding:utf-8 -*-

foriin range(1,10):

for j in range(1,i+1):

printstr(j)+'x'+str(i)+' = '+str(i*j),

print

程序主要功能是实现乘法口诀表输出打印,其中“#-*- coding:utf-8 -*-约定文档的编码方式程序主体部分两个嵌套的for循环语句组成,可以看到每一个for循环块的内部都具有相同的缩进量程序输出结果如下:

1x1=1

1x2=2 2x2=4

1x3=3 2x3=6 3x3=9

1x4=4 2x4=8 3x4=12 4x4=16

1x5=5 2x5=10 3x5=15 4x5=20 5x5=25

1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36

1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49

1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64

1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

Python程序中一行#”号后面内容为注释,“#”号只支持单行注释,多行注释使用’’’ …‘’’”注释符。

'''

Abaqus6.14 Python

'''

1.2 Python元组

Python元组tuple相当于C语言中的数组简化版,其内容和长度均不可变,只能对其内容进行访问

tt1 =(1,2,3,4,5)

print tt1[1]

程序执行结果:

2

1.3 Python列表

Python中的列表list相当于C语言中的数组C语言中的数组使用起来更方便灵活长度和内容均可修改,列表是编程时使用较多的结构

list1 =[1,2,3,4,5]

print list1[1]

list1[1]=5

print list1

list1.append(6)

print list1

程序执行结果:

2

[1, 5, 3, 4, 5]

[1, 5, 3, 4, 5, 6]

Python列表常用操作方法:

11Python列表常用操作方法

对列表进行切片操作(元组也能进行相应的操作

list1 =[1,2,'3','a','b',5]

print list1[2:4]

print list1[2:]

print list1[1::2]

print list1[:-2]

输出结果

['3', 'a']

['3', 'a', 'b', 5]

[2, 'a', 5]

[1, 2, '3', 'a']

1.4 Python字典

Python的字典dict)对于存储数据非常有用,其存储的数据是无序的,每一个键对应着一个键是一种映射型数据类型。

dict1 ={'author':'FanShengbao','software':'Abaqus'}

dict1['data']='2017'#添加一个字典元素

print dict1['software']#打印‘software’键的键值

print dict1.keys()#打印所有键

print dict1.values()#打印所有的键值

print dict1.items()#打印所有键及其键值

程序输出结果:

Abaqus

['software', 'Data', 'author']

['Abaqus', '2017', 'Fan Shengbao']

[('software','Abaqus'),('Data','2017'),('author','FanShengbao')]

从打印的结果可以看出,字典的存储是无顺序的获取字典键值需通过键来访问,键是唯一多个键可以对应相同的内容。

1.5 Python集合

Python中集合set概念来源于数学在的集合,集合中的每个元素都是唯一存在,多次添加同一元素只存在一个。集合区别于列表和元组,其不能通过下表进行访问,但可以将其转换位列表后再进行其他操作。

set1 =set('abcde')

print set1

set1.add('f')#添加’f’元素

set1.add('b')#添加’b’元素

print set1

printlist(set1)

输出结果

set(['a', 'c', 'b', 'e', 'd'])

set(['a', 'c', 'b', 'e', 'd', 'f'])

['a', 'c', 'b', 'e', 'd', 'f']

Python集合常见操作方法:

12Python集合常见操作方法

1.6 Python字符串

Python的字符串是一种只能访问的数据类型定义之后不能对其内容进行修改,否则程序将抛出异常

str1 ='Abaqus 6.14 Python'

print str1[0:6]

print str1.center(30,'-')

程序运行结果:

Abaqus

------Abaqus 6.14 Python------

Python字符串常见操作方法:

13Python字符串常见操作方法

1.7 Python分支语句

if分支语句有以下三种基本形式可根据不同情况选用不同的形式,使用时需替换pass占位语句

1.8 Python循环语句

Python编程语言只包含两种循环结构,分别是for循环while循环。for循环要比while循环使用更加频繁。

1.8.1 for循环

1) for循环主体结构:

foriin range(1,10):

pass

else:

pass

其中pass为占位符,else可省略,else只有在for循环不是break中断的情况下才会执行else下的语句。

2) for循环可遍历元组、列表和字符串

foriin[1,2,3,4,5]:

printi

3) for具有一些比较高级的迭代功能(比普通循环更加高效,执行速度更快

print[i*iforiin range(10)]

print[(i,j)foriin range(3)for j in range(3)ifi!= j]

程序执行结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

[(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]

1.8.2 while循环

while循环主体结构:

i=0

whilei<10:

pass

i+=1

else:

pass

1.9 Python定义函数

Python语言定义函数采用def进行声明函数体进行统一缩进Python函数常用的有两种:参数有默认值的函数参数无默认值的函数,函数参数某一个带默认参数时,其后的参数也需带默认值。

#参数无默认值

defFunName1(arg1,arg2):

return arg1+arg2

#给参数指定默认值

defFunName2(arg1,arg2=1):

return arg1+arg2

#函数调用

print FunName1(1,2)#返回3

print FunName2(1)#返回2

print FunName2(1,2)#返回3

Python语言也有一些自带的函数:

14Python自带函数

表中只列举了部分直接访问的函数,Python标准库中包含着许多函数,如math

1.10 Python模块

Python模块就是一个py文件,文件中可包含变量函数和类。在另一个py文件导入该模块,调用其中的函数

导入模块的方法:

importModelName

fromModelNameimportFunName

导入自建模块注意Python搜索路径只有将模块入搜索路径中,才能通过以上方法导入Python模块可通过以下代码查看当前Python编辑器搜索路径和添加目录到Python的搜索路径

import sys

printsys.path#打印Python的搜索路径

sys.path.append('D:\\...')#“D:\\...”添加到搜索路径中

1.11 Python

Python一个初始化文件“__init__.py”一个或多个函数文件(模块文件组成将这些python文件放入同一个文件夹下就构成了一个Python“__init__.py”文件用来申明包中包含的模块文件如图所示为一个包文件构成:

1.1 Python文件构成

__init__.py文件的内容如下:

__author__ ="Fan Shengbao"

__all__ =['openOdbFile','getMaxStress','getMaxDisplacement']

其他文件中均包含着对应函数

导入模块的方法(包文件夹需放入Python的搜索路径之下

单个函数导入fromPythonPackageName import getMaxStress

②一次全部导入:fromPythonPackageName import *

1.12 Python文件和目录

1.12.1 目录操作

获取当前工作目录更改当前工作目录:

importos

printos.getcwd()#获取当前工作目录

os.chdir('D:\\')#更改当前工作目录

获取指定目录的某种类型文件可以使用一个Python标准库glob,代码实例如下:

import glob

printglob.glob('D:\\*.odb')#获取所有的odb文件

printglob.glob('D:\\name.*')#所有以name为名的文件

1.12.2 文件操作

打开和关闭文件

file = open('D:\\1.txt')#打开文件,也可指定打开方式rw等)

file.close()#关闭文件

读写文件内容:

通常读文件时使用一条语句读取全部内容,并将每一行内容独立存入列表中,具体示例代码如下:

f =open('D:\\1.txt').read().split('\n').strip()

可以使用下表所示的读写文件函数进行读写操作,Python还有其他的一些读写操作函数未列举在表中

15文件读写函数

1.13 Python异常处理

Python异常处理能够规避程序执行错误,当程序出错能够进行相应的处理或者直接忽略错误继续执行程序

异常处理结构pass可以替换为相应的代码)

try:

pass

exceptErrorType:

pass

finally:

pass

可能出的代码放入try代码行下面,except指定错误类型或不指定接受所有错误)指定错误发生时,程序执行except下的程序,最后执行finally下的程序


第二章ABAQUS/Python二次开发

2.1 ABAQUS执行Python程序

ABAQUS执行Python程序的方法可以找百度,下图为ABAQUS软件自带的编译器PDE,可用于调试Python程序,支持断点调试

2.1 ABAQUS软件PDE编辑器

常用ABAQUS软件执行Python方法:

File—>Run Script…选择需要运行的Python程序文件

直接在宏程序里面编写程序,调用宏管理器File—>Macro Manager…执行程序

③只写几行代码的话,可以ABAQUS软件底部的kernel command line interface中编写

word/media/image4.gif

2.2kernel command line interface窗口

2.2 编写ABAQUS/Python程序

下面是一个ABAQUS/Python程序的简单例子:段程序生成如图所示的三维模型,并导入到装配模块中。

#-*- coding:utf-8 -*-

fromabaqusimport*

#导入Abaqus常量模块

fromabaqusConstantsimport*

#导入Abaqus中常用的模块,例如stepmaterial……

fromcaeModulesimport*

#新建一个Model并命名为Model-1

model1 =mdb.Model(name='Model-1')

#创建一个三维可变形实体,并命名为Part-1

part1 =model1.Part(name='Part-1',dimensionality=THREE_D,

type=DEFORMABLE_BODY)

#创建一个名为Sketch-1的草图

skt= model1.ConstrainedSketch(name='Sketch-1',sheetSize=100)

#在创建的草图中绘制一个矩形

skt.rectangle(point1=(-50,-50),point2=(50,50))

#在草图中心绘制一个R=25的圆

skt.CircleByCenterPerimeter(center=(0,0),point1=(25,0))

#对草图skt进行拉伸,指定深度为50

part1.BaseSolidExtrude(sketch=skt,depth=50)

asm= model1.rootAssembly #访问装配模块

#将新建的part1添加到装配中

asm.Instance(name='Part-1-1',part=part1,dependent=ON)

2.3 ABAQUS录制Python程序

使用宏管理器可以ABAQUS的操作录制Python程序,通过宏录制可缩短程序开发时间,方便ABAQUS软件进行二次开发。稍加修改录制后的程序,就能得到要的效果。

图为ABAQUS软件的管理器(File>Macro Manager…

2.3ABAQUS软件宏管理器

点击Create…能够ABAQUS软件的操作进行录制,生成Python代码并添加到宏管理器中,某些情况下需对程序进行一定的编辑才能重复出录制的操作直接运行可能得不到与之前操作一样的结果或者程序直接报错

2.4 ABAQUS/Python对象介绍

2.4.1 session对象

session模块主要用来控制窗口显示属性,例如新建多个窗口设置窗口大小、调整当前显示窗口和打开odb文件录制程序会出现多session开头的语句其中大部分记录的是我们调整视图操作例如转动平移一下模型编辑时可删除这些语句

获取当前显示的窗口名称

viewportName=session.currentViewportName

获取当前显示的窗口model名称

viewportName=session.currentViewportName

modelName=session.viewports[viewportName].displayedObject.modelName

新建一个窗口:

session.Viewport(name ='Viewport: 2')

2.4.2 mdb对象

mdb象是ABAQUS前处理中最为重要的一个对象是一个顶层对象下面包含着丰富的子对象方法

21mdb对象信息

每个cae文件包含一个或多个Model,大部分前处理信息均包含在每个Model下面通过mdb.models[modelName]可单独访问每个Model的数据。通过每个Model可继续访问之下的partmaterialrootAssembly

2.4 Model下的部分对象

Python前处理中可以用来建立复杂的三维模型下面程序建立一个三维函数曲面图,数学公式如式2.1所示,代码如下:

word/media/image9.gif 2.1

#程序开始

#-*- coding:utf-8 -*-

fromabaqusimport*

fromabaqusConstantsimport*

fromcaeModulesimport*

import math

part1 =mdb.models['Model-1'].Part(name='Part-1',

dimensionality=THREE_D,type=DEFORMABLE_BODY)

point_U=[]

point_Utemp=None

point_V=[]

point_Vtemp=[]

foriin range(-100,100):

point_V.append([])

foriinxrange(-100,100):

point_U=[]

for j inxrange(-100,100):

x =0.025*i

y =0.025*j

coord=(x,y,3*x*math.exp(-x**2-y**2))

point_U.append(coord)

point_V[j+100].append(coord)

part1.WireSpline(points=point_U,mergeType=MERGE,

meshable=ON,smoothClosedSpline=ON)

foriinpoint_V:

part1.WireSpline(points=i,mergeType=MERGE,

meshable=ON,smoothClosedSpline=ON)

part2 =mdb.models['Model-1'].Part(name='Part-2',

dimensionality=THREE_D,type=DEFORMABLE_BODY)

edges=[]

foriinpoint_V:

part2.WireSpline(points=i,mergeType=MERGE,

meshable=ON,smoothClosedSpline=ON)

foriinpoint_V:

edges.append((part2.edges.findAt(i[0]),))

part2.ShellLoft(loftsections=(edges),startCondition=NONE,

endCondition=NONE)

asm=mdb.models['Model-1'].rootAssembly

asm.Instance(name='Part-1-1',part=part1,dependent=ON)

asm.Instance(name='Part-2-1',part=part2,dependent=ON)

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

该程序生成两个三维模型,如图所示:

2.5线框模型 2.6曲面模型

2.4.3 odb对象

odb对象和mdb对象有很多的相似性,包含的对象和访问方式也几近相同。下面代码可用于读取指定odb文件的最后分析步的最大应力并打印显示出来

defreadMaxStress(myViewport,jobName):

path=os.getcwd()

o1 =session.openOdb(name=path+'\\'+jobName+'.odb')

myViewport.setValues(displayedObject=o1)

myViewport.odbDisplay.setPrimaryVariable(variableLabel='S',

outputPosition=INTEGRATION_POINT, refinement=(

INVARIANT,'Mises'),)

myViewport.odbDisplay.display.setValues(plotState=(

UNDEFORMED,))

myViewport.odbDisplay.display.setValues(plotState=(

CONTOURS_ON_DEF,))

printmyViewport.odbDisplay.contourOptions.autoMaxValue

2.5 ABAQUS完整二次开发示例

该段程序实现了平板拉伸应力分析,完成了建模、添加边界条件载荷监控计算状态和应力自动读取完整分析过程

#-*- coding:utf-8 -*-

fromabaqusimport*

fromabaqusConstantsimport*

fromcaeModulesimport*

importos

import __main__

defPlateTensile(h,w,r,t,f):

#检测输入是否正确

if r>=h/2.0:

print"Error: Radius > Height"

returnFalse

if r>=w/2.0:

print"Error: Radius > width"

returnFalse

if r<=0or t <=0or f ==0:

print"ERROR!!!"

returnFalse

#创建名为‘Model-1’的模型对象

model=mdb.Model(name ='Model-1')

part=model.Part(name='Part-1',dimensionality=THREE_D,

type=DEFORMABLE_BODY)

asm=model.rootAssembly

skt1 =model.ConstrainedSketch(name='Skt1',sheetSize=200)

skt1.rectangle(point1=(-w/2.0,-h/2.0),point2=(w/2.0,h/2.0))

skt1.CircleByCenterPerimeter(center=(0,0),point1=(r,0))

part.BaseShell(sketch = skt1)

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

model.Material(name='Material-1')

model.materials['Material-1'].Elastic(table=((210000.0,0.3),))

model.HomogeneousShellSection(name='Section-1',preIntegrate=OFF,

material='Material-1',thicknessType=UNIFORM,thickness=t,

thicknessField='', idealization=NO_IDEALIZATION,

poissonDefinition=DEFAULT,thicknessModulus=None,

temperature=GRADIENT,useDensity=OFF,

integrationRule=SIMPSON,numIntPts=5)

f1 =part.faces

region=regionToolset.Region(faces=f1)

part.SectionAssignment(region=region,sectionName='Section-1',

offset=0.0,offsetType=MIDDLE_SURFACE,offsetField='',

thicknessAssignment=FROM_SECTION)

asm.Instance(name='Part-1-1', part=part, dependent=ON)

model.StaticStep(name='Step-1', previous='Initial')

s1 =asm.instances['Part-1-1'].edges

edges1 =s1.findAt(((w/2.0,0,0),))

edges2 =s1.findAt(((-w/2.0,0,0),))

rp1 =asm.ReferencePoint(point=(w/2.0,0,0))

region1 =regionToolset.Region(edges=edges1)

region2=regionToolset.Region(referencePoints=(

asm.referencePoints[rp1.id],))

#参考点和边进行耦合操作

model.Coupling(name='Constraint-1',controlPoint=region2,

surface=region1,influenceRadius=WHOLE_SURFACE,

couplingType=KINEMATIC,localCsys=None, u1=ON, u2=ON,

u3=ON, ur1=ON, ur2=ON, ur3=ON)

model.ConcentratedForce(name='Load-1',createStepName='Step-1',

region=region2, cf1=f,distributionType=UNIFORM, field='',

localCsys=None)

model.EncastreBC(name='BC-1',createStepName='Initial',

region=regionToolset.Region(edges=edges2),localCsys=None)

part.setMeshControls(regions=f1,elemShape=QUAD)

part.seedPart(size=(w+h)/200.0,deviationFactor=0.1,

minSizeFactor=0.1)

part.generateMesh()

jobName='Test-1'

mdb.Job(name=jobName, model='Model-1', description='',

type=ANALYSIS,atTime=None,waitMinutes=0,waitHours=0,

queue=None, memory=90,memoryUnits=PERCENTAGE,

getMemoryFromAnalysis=True,explicitPrecision=SINGLE,

nodalOutputPrecision=SINGLE,echoPrint=OFF,

modelPrint=OFF,contactPrint=OFF,historyPrint=OFF,

userSubroutine='',scratch='',resultsFormat=ODB,

multiprocessingMode=DEFAULT,numCpus=1,numGPUs=0)

fromjobMessageimport JOB_ABORTED,JOB_COMPLETED,JOB_SUBMITTED

#读取最大应力值并打印

defreadMaxStress(userData):

path=os.getcwd()

o1 =session.openOdb(name=path+'\\'+jobName+'.odb')

userData.setValues(displayedObject=o1)

userData.odbDisplay.setPrimaryVariable(variableLabel='S',

outputPosition=INTEGRATION_POINT, refinement=(

INVARIANT,'Mises'),)

userData.odbDisplay.display.setValues(plotState=(

UNDEFORMED,))

userData.odbDisplay.display.setValues(plotState=(

CONTOURS_ON_DEF,))

printuserData.odbDisplay.contourOptions.autoMaxValue

myViewport=session.viewports['Viewport: 1']

defdealResult(jobName,messageType,data,userData):

ifmessageType==JOB_ABORTED:

print'ERROR!'.center(100,'-')

ifmessageType==JOB_COMPLETED:

print'COMPLETED'.center(100,'-')

readMaxStress(userData)

monitorManager.removeMessageCallback(jobName=jobName,

messageType=ANY_MESSAGE_TYPE,

callback=dealResult,userData=myViewport)

#设置监控job是否计算完成

monitorManager.addMessageCallback(jobName=jobName,

messageType=ANY_MESSAGE_TYPE,

callback=dealResult,userData=myViewport)

#提交job进行计算

mdb.jobs[jobName].submit(consistencyChecking=OFF)

if __name__ =="__main__":

PlateTensile(50,100,10,1,100)

2.6 ABAQUS二次开发常用函数

2.6.1 Part模块常用函数

1). 访问Part路径mdb.models[ModelName].parts[PartName]

2). 创建一个新的Part

mdb.models[ModelName].Parts[name=PartName,dimensionality=dimensionality,type=partType]

必须指定参数

namePart的名字

dimensionalityTHREE_DTWO_D_PLANARAXISYMMETRIC.

type:为DEFORMABLE_BODYEULERIANDISCRETE_RIGID_SURFACEANALYTIC_RIGID_SURFACE

可选参数:

twist一个布尔值只有在轴对称可变形体才需指定,其默认值为OFF

3) 已有的Part中复制一个Part

mdb.models[ModelName].Part(name=PartName,objectToCopy=part)

必须指定参数:

name指定复制Part名字

objectToCopy指定一个已有的Part对象

②可选参数

scale缩放因子,默认值为1

mirrorPlane:可能值为XYPLANEXZPLANEYZPLANE。也可指定一个镜像平面,如果指定平面,参数compressFeatureList将自动设置ON默认值NONE

compressFeatureList如果设置为ON会丢失原来的Part中的datum点和set默认值OFF

separate是否分离不相连的cell进入多个Part,默认值为OFF

4) 未完待续………

本文来源:https://www.2haoxitong.net/k/doc/cdf0fc017275a417866fb84ae45c3b3567ecdda3.html

《ABAQUS二次开发教程.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式