Python语言和ABAQUS前处理二次开发

  • 格式:pdf
  • 大小:542.75 KB
  • 文档页数:6

第38卷第1期2006年3月郑州大学学报(理学版)J.ofZhengzhouUniv.(Nat.Sci.Ed.)V01.38NO.1Mar.2006Python语言和ABAQUS前处理二次开发钟同圣1,卫丰1,王鸷2,智友海1(1.西北工业大学工程力学系西安710072;2.西北工业大学土木工程系西安710072)摘要:采用Python脚本语言二次开发ABAQUS的前处理模块,讨论了ABAQUS的脚本接口和对象模型在二次开发中的作用和调用流程.通过开发Python脚本程序控制ABAQUS的建模和划分网格的过程,有效地解决了包含大量重复单元的模型手工建模时的重复繁琐等问题,提高了前处理的效率.关键词:ABAQUS;二次开发;前处理;Python语言中图分类号:TP391文章编号:1671—6841(2006)01—0060—050引言ABAQUS是目前国际上最为先进的通用非线性有限元分析软件之一[1].软件包括种类丰富的材料库和单元库,可以模拟绝大部分工程材料的线性和非线性行为,而且材料库和单元库分开,材料和单元之间的组合能力很强.可以胜任复杂结构的静态与动态分析,能够驾驭非常庞大的问题和模拟结构与材料高度非线性的影响.ABAQUS自带的CAE是进行有限元分析的前后处理模块,也是建模、分析和后处理的人机交互平台,因此ABAQUS在工程界有广泛的应用∽j.Python是一种简单易学,功能强大的编程语言,它有高效率的高级数据结构,可以简单而有效地实现面向对象编程口3.Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在大多数平台上的许多领域都是一个理想的脚本语言,特别适用于快速的应用程序开发.ABAQUS有限元程序就通过集成脚本语言Python向二次开发者提供了很多库函数.通过Python语言调用这些库函数来增强ABAQUS的交互式操作功能.绕过ABAQUS/CAE界面,直接操纵ABAQUS内核,实现建模、划分网格、指定材料属性,提交作业,后处理分析结果等等功能.本文介绍利用Python脚本语言来操作ABAQUS前处理过程,实现自动建模、划分网格功能.在模型复杂、划分网格操作繁琐的情况下可以自动化处理,避免了在使用ABAQUS/CAE前处理过程中的完全手工操作,节省了大量时间和精力,提高了工作效率.1二次开发接口介绍ABAQUS二次开发有如下几种途径:(1)通过用户子程序可以开发新的模型,控制ABAQUS计算过程和计算结果;(2)通过环境初始化文件可以改变ABAQUS的许多缺省设置;(3)通过内核脚本可以实现前处理建模和后处理分析计算结果;(4)通过GUI脚本可以创建新的图形用户界面和用户交互.本文用到的是第3种方法,通过编写Python脚本控制ABAQUS内核实现自动前处理.ABAQUS脚本接口是一个基于对象的程序库,内嵌脚本语言Python,提供了一套应用程序编程接口(API)来操作ABAQUs/cAE实现建模/后处理等功能.接口编程采用Python的语法编写脚本,但扩展了Python脚本语言,额外提供了大约500个对象模型.对象模型之间关系复杂,图1展示了这些对象模型之间的层次结构和相互关系.其中,Container表示容器,里面包含有其他的对象;Singularobject表示单个对象.收稿日期:2005—11—17作者简介:卫丰(1952一),男,教授,主要从事固体火箭发动机结构完整性分析研究;E-mail:weife98@263.net.第1期钟同圣等:Python语言和ABAQUS前处理二次开发61整个对象模型被分成三类,其中,session对象用来定义视图,远程队列,用户定义的视图等.mdb对象包括计算模型对象和作业对象.odb对象包括计算模型对象和计算结果数据.每一类对象下面又包括各类子对象,比如mdb对象下面的计算模型models对象又包括很多子对象,如图2所示.在对前处理过程进行二次开发的时候基本上都是和models对象打交道.它里面几乎包含了建模编程需要的所有对象类型,是主要考虑的对象类型.编写好的脚本文件提交给ABAQUS的执行过程为:ABAQusABAQus对象模型自带的Python解释器解释脚本语言;调用ABAQUS图1内核执行脚本命令;生成inp输入文件;提交给分析器进行有限元计算;生成结果文件.运行脚本的途径有:(1)在ABAQUS/CAE主窗口中的最下面有一个命令行接口(CLI),可以在里面输入脚本命令执行.既可以输入单行的命令执行;也可以把编写好的命令一整块复制进去执行;还可以利用命令execfile(7XXX.PY7)运行脚本文件.这种执行脚本的方式有一个优点,就是可以交互执行命令,在某一条命令出错的情况下重新输入正确的命令,而不需要跑到文本编辑器里面修改脚本文件,再回到ABAQUS重新运行.(2)启动ABAQUS的时候会显示一个启动对话框,选择RunScript运行脚本文件.(3)从ABAQUS/CAE主窗口选择菜单File一>RunScript运行脚本文件.(4)以命令行方式运行ABAQUs时可以在命令行中指定要运行的脚本文件,例如:abaquscaescript=XXX.py.图2models对象层次结构2算例通过一个例子来详细分析Python脚本的编写和常用ABAQUS对象模型的使用,从中可以体会到ABAQUS二次开发的强大功能和开发过程的简洁明了.问题可以描述为计算一块带孔电路板在两端受均匀拉力作用下的应力应变分布.电路板形状为长方形,厚度均匀为20mm,在电路板上面均匀分布着一些半径为10mm的圆孔,相邻圆孔圆心之间的距离为40mm,形状如图3所示.图3只是一个宽为400mm高为320mm的模型,里面所带的孑L有80个,如果手工建模的话也不是很复杂.但如果宽和高都增长一倍,里面的孔就会增加到320个,建模工作量将增长4倍,而且都是重复工作.如果再把划分网格所需要的分割模型也算进去,那么前处理就会占去太多的时间.所以,可以通过编写一段脚本来自动完成建模和划分网格的图3带孔电路板模型62郑州大学学报(理学版)第38卷工作.而且,可以在运行脚本的时候决定宽和高的值,还有网格的密度,具有更大的灵活性.下面开始分析每一条脚本命令.fromabaqusimport*fromabaqusConstantsimport*为了使用ABAQUS提供的对象模型,首先需要导人几个重要的模块.导入abaqus模块后可以在脚本中使用mdb对象,导人abaqusConstants模块后可以在脚本中使用ABAQUS预定义的一些常量,比如下面就会看到的THREED等.fields=((’Width:7,74007),(7Height:’,73207))iWidth==NonewhileiWidth一=None:iWidth,iHeight=getInputs(fields=fields,label=’EnterHolePlateDimensions:7)iWidth==int(iWidth)iHeight==int(iHeight)iRadius210图4getInputs函数运行效果图iWidth—iWidth—iWidth%(iRadius*4)iHeight—iHeight—iHeight%(iRadius*4)接着,调用getInputs函数提示用户输入模型的宽和高.getInputs函数的第一个参数是一个元组,包括提示对话框中要显示的输入框的文本和输入框的缺省值.这里,假设缺省的宽为400mm,高为320mm;另外一个参数是提示对话框的说明文本,如图4所示.如果用户按了取消键放弃输入,getInputs函数会返回一个None值,通过while循环可以不断的提示,直到用户输入值.接着把返回的字符串值转换成整型值,然后把宽和高取成40mm的倍数,为的是产生一个规范的模型.myModel=mdb.Model(name=7ModelA’)mySketch—myModel.Sketch(name=7SketchA’,sheetSize=iWidth*2)调用mdb对象的方法:Model创建一个模型,命名为ModelA.把创建好的模型赋给变量myModel,下面的语句要用到模型的时候就可以直接使用myModel这个简短的名字,而不需要使用mdb.models[7Mod—elA7].接着创建一个sketch对象,设定大概尺寸为模型宽度的两倍,命名为SketchA.mySketch.rectangle(pointl一(0,O),point2=(iWidth,iHeight))i=2*iRadiuswhilei<iWidth:j一2*iRadiuswhilej<iHeight:mySketch.CircleByCenterPerimeter(center=(i,j),pointl一(i,J+iRadius))j=j+4*iRadiusi—i+4*iRadius在Sketch中画一个矩形,矩形的尺寸就是刚才输入的尺寸.然后利用一个双重循环在矩形上面画圆打孔.画矩形画圆都用到了sketch对象的方法.myPart=myModel.Part(name=’PartA7dimensionality=THREE—D,type=DEFORMABLE—BODY)myPart.BaseSolidExtrude(sketch=mySketch,depth=20.O)根据创建的sketch拉伸成一个零件模型,模型为三维可变形体,厚度20mm.myViewport—session.Viewport(name=’ViewportforModelA第1麓锋弱圣等:Python语言争ABAQUS前处理二次秀发63origin=(10,10),width=150,height=100)myViewport.makeCurrent()myViewport。

maximize()myViewport.setValues(displayedObject=myPart)myViewport.partDisplay.setValues(renderStyle=SHADED)创建一个视图显示零件,用到的都是session对象的子对象viewport中的方法。

SHADED是~个预定义的变量,表示显示风格.axisl—myPart。

DatumAxisByTwoPoint(pointl一(0。

0,0。

0,0.0),point2一(iWidth,0.0,0。

O))axis2一myPart.DatumAxisByTwoPoint(pointl=(O.0,0.0,0.O),point2一(O.0,iHeight,0.0))datums—myPart.datumsi一2*iRadiuswhilei<iWidth:d—myPart.DatumPointByCoordinate(coords=(i,0。