基于Python的ABAQUS二次开发及在板料快速冲压成形模拟中的应用
- 格式:pdf
- 大小:455.65 KB
- 文档页数:5
Python是一种高级编程语言,它在科学计算、数据分析、人工智能等领域有着广泛的应用。
Abaqus是一款常用的商业有限元软件,它主要用于工程结构分析和仿真。
二次开发是指在现有软件的基础上,使用编程语言对软件进行扩展和定制化。
1. Python在Abaqus二次开发中的应用在Abaqus软件中,Python被作为主要的二次开发语言来使用。
用户可以利用Python对Abaqus进行自动化操作、批量处理、数据分析等工作。
Python的简洁语法和强大的库支持,使得Abaqus二次开发变得更加高效和灵活。
2. Abaqus中的循环提交作业在Abaqus中,循环提交作业是指对多个任务进行批量处理的操作。
用户需要对多个模型进行相似的分析,可以利用循环提交作业的方式来提高分析效率。
通过编写Python脚本,可以实现循环读取模型文件并提交分析任务的功能。
3. Python在循环提交作业中的应用Python在Abaqus中循环提交作业的过程中发挥着重要的作用。
用户可以利用Python脚本来实现对多个模型的批量处理,节约时间和人力成本。
Python的循环结构和文件操作能力,使得循环提交作业变得更加简单和高效。
4. 二次开发与循环提交作业的结合通过Python的二次开发功能,用户可以定制化地实现循环提交作业的功能。
用户可以编写Python脚本来实现针对特定工程需求的循环提交作业流程,提高软件的灵活性和适用性。
二次开发也可以使得循环提交作业的过程更加智能化和自动化。
5. 实例分析以某工程仿真为例,用户需要对多个零件进行疲劳分析。
通过Python的二次开发,用户可以编写循环提交作业的脚本,实现自动读取不同零件模型并提交分析任务的功能。
这样一来,用户无需手动逐个提交任务,极大地提高了分析工作的效率。
Python在Abaqus的二次开发中能够很好地支持循环提交作业的功能。
通过二次开发,用户可以定制化地实现循环提交作业的流程,提高软件的适用性和工作效率。
基于Python的Abaqus前、后处理GUI插件二次开发与应用作者:***来源:《计算机辅助工程》2022年第02期摘要:为提高Abaqus建模效率并进行可视化数据分析,利用Python语言对Abaqus前-后处理进行二次开发。
分析某柴油机机油-水冷却器模块组件,结果表明:前处理模块开发螺栓GUI插件,能够批量创建相同规格的螺栓载荷,提高前期建模效率,缩短分析周期;后处理模块开发Campbell制图插件,能根据工程实际需要将模态结果数据绘制成Campbell图,并将计算结果可视化输出。
关键词: Abaqus; Python; 二次开发; 前处理; 后处理; GUI界面中图分类号: TP391.99; TB115.1文献标志码: BGUI plugin redevelopment and application of Abaquspre-and post-processing based on PythonTIAN Yutai(Shanghai New Power Automotive Technology Co., Ltd., Shanghai 200438, China)Abstract: To improve the efficiency of Abaqus modeling and achieve visual data analysis,redevelopment of Abaqus pre-and post-processing is carried out with Python language. A diesel engine oil-water cooler module is analyzed. The results show that: a bolt GUI plug-in is developed for the pre-processing module, which can create bolt loads of the same specification in bulk,improving pre-modeling efficiency and shortening the analysis cycle; the Campbell mapping plug-in is investigated for the post-processing module, which can draw the modal result data into Campbell diagrams according to the actual needs of engineering and visualize the calculation results for output.Key words: Abaqus;Python; redevelopment; pre-processing;post-processing; GUI interface0引言作为国际通用计算分析软件,Abaqus具有丰富的单元类型与材料非线性模型,在各领域发挥至关重要的作用。
第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。
ABAQUS在冲压成形有限元模拟中的应用
作者:美国ABAQ…资料库来源:《CAD/CAM与制造业信息化》
本文所示的ABAQUS软件的应用成功地节省了产品设计开发的成本,同时还能缩短设计开发的时间,而且模拟的结果与实际结果相距不大,是一款不可多得的优秀软件。
一、模拟加工过程中的成本节约
加工成形技术是制造工业的中一种重要的技术。
当前,制造行业加工工艺正朝着高技术的方向发展,越来越多的公司在产品研发和制造过程中开始注重仿真技术的应用。
采用ABAQUS进行仿真模拟的目的是节约开发成本、加快研发速度和提高产品质量。
ABAQUS可以针对不同操作系统(如Unix,Linux和Windows等)进行单机或多机并行运算,节省更多运算时间。
下面以ABAQUS某汽车用户的车门设计为例,说明ABAQUS在冲压成型有限元模拟中的应用。
传统的车门设计流程如图1所示。
图1 某型号汽车车门的传统设计流程
其中主要设计及加工成本如下:
1.软质模具的设计和加工成本为20万美元;
11 / 11。
Python语言和ABAQUS后处理二次开发1易桂莲杜家政隋允康2(北京工业大学机械工程与应用电子技术学院,100124北京)摘要:采用Python脚本语言二次开发ABAQUS的后处理模块,讨论了ABAQUS的脚本接口和对象模型在二次开发中的作用和调用流程。
通过开发Python脚本程序提取ABAQUS进行数值模拟后的计算结果,有效地解决了提取大量结果进行重复操作的问题,提高了后处理的效率。
关键词:ABAQUS后处理二次开发;Python;动力响应分析;振动特性0 引言ABAQUS是国际上最先进的大型通用有限元计算分析软件之一,可以模拟绝大部分工程材料的线性和非线性行为。
ABAQUS自带的CAE是进行有限元分析的前后处理模块,也是建模、分析和后处理的人机交互平台,它具有良好的人机对话界面,因此ABAQUS软件在工程中得到了广泛的应用。
Python是一种面向对象的脚本语言,它功能强大,既可以独立运行,也可以用作脚本语言。
特别适用于快速的应用程序开发[1]。
通过开发Python脚本程序提取ABAQUS进行数值模拟后的计算结果,有效地解决了提取大量结果进行重复操作的问题1 二次开发接口介绍ABAQUS 脚本接口是一个基于对象的程序库,脚本接口中的每个对象都拥有相应的数据成员和函数。
对象的函数专门用于处理对象中的数据成员,被称为相应对象的方法,用于生成对象的方法被称为构造函数。
在对象创建后,可以使用该对象提供的方法来处理对象中的数据成员[2]。
ABAQUS提供了一套应用程序编程接口(API,Application Program Interface)来操作ABAQUS/CAE实现建模/后处理等功能。
接口编程采用Python的语法编写脚本,但扩展了Python脚本语言,额外提供了大约500个对象模型。
对象模型之间关系复杂,图1展示了这些对象模型之间的层次结构和相互关系。
其中,Container表示容器,里面包含有其他的对象;Singular object表示单个对象。
ABAQUS二次开发技术在板带热连轧数值模拟中的应用王云杰;张小平;康兵【摘要】考虑到板带轧制有限元分析过程中建模效率低、参数修改复杂等缺陷,依据参数化分析理论,采用ABAQUS软件提供的GUI工具包与Python脚本接口,通过二次开发得到了带钢热连轧机组可逆轧制过程的专用的前、后处理模块,用户在输入有限个参数的前提下,能实现前处理模块自动化建模、后处理模块数据的提取与分析.利用某钢厂提供的带钢热连轧机组现场生产数据对所开发的前、后处理模块进行了应用验证.验证结果表明:对于前、后处理模块的较优开发,不仅有效的提高了轧制过程模型的建模效率,而且所开发的模块可靠性较高,模拟计算数据与生产数据基本吻合,相对误差不超过5%.【期刊名称】《太原科技大学学报》【年(卷),期】2015(036)006【总页数】5页(P446-450)【关键词】板带热连轧;数值模拟;ABAQUS二次开发技术;参数化研究【作者】王云杰;张小平;康兵【作者单位】太原科技大学重型机械教育部研究工程中心,太原030024;太原科技大学重型机械教育部研究工程中心,太原030024;太原科技大学重型机械教育部研究工程中心,太原030024【正文语种】中文【中图分类】TG335.5+5ABAQUS有限元软件是应用较为广泛的模拟分析软件之一,具备丰富的单元库与材料模型库,可以模拟分析绝大部分工程材料的线性与高度非线性行为。
软件的前、后处理器为用户提供了强大功能,但有些功能如自动化建模[1]、参数化研究[2]、访问结果数据库[3-4]等需要通过二次开发技术或借助于其它软件才能实现。
ABAQUS通过Python脚本程序为程序开发者提供了多个内嵌库函数,库函数的调用可直接操纵内核处理功能。
朱兆华利用Python语言与ABAUQS GUI工具包开发出适合板料件(圆形拉深和球形胀形)成形的模块,同时增加了保存、导入材料变形数据的功能,节省了用户用于模拟操作的时间,提高了效率[5];李传宇等基于ABAQUS软件实现了H型钢多道次热轧工艺仿真系统的创建,模拟分析了轧件在各道次轧制过程中的内部应力、应变与温度场的分布情况,实现了分析流程的自动化[6];熊威等为提高使用ABAQUS软件进行模拟分析并对结果数据进行有效提取、分析、处理的效率,结合MATLAB软件实现了对ABAQUS的前处理与后处理的二次开发,优化了T型梁的网格划分,得到了回弹补偿方程[7-8];张芳利用ABAQUS提供的用户图形AFX GUI Toolkit工具包和Python脚本接口,通过二次开发得到了带钢热连轧粗轧前处理模块,分析了板厚对稳定段狗骨的影响规律[9]。
基于Python的Abaqus二次开发实例讲解(asian58 2013.6.26)基于Python的Abaqus的二次开发便捷之处在于:1、所有的代码均可以先在Abaqus\CAE中操作一遍后再通过rp文件读取,然后再在此基础上进行相应的修改;2、Python是一种解释性语言,读起来非常清晰,因此在修改程序的过程中,不存在程序难以理解的问题;3、Python是一种通用性的、功能非常强大的面向对象编程语言,有许多成熟的类似于Matlab函数的程序在网络上流传,为后期进一步的数据处理提供了方便。
为了更加方便地完成Abaqus的二次开发,需进行一些相关约定:1、所有参数化直接通过点的坐标值进行,直接对几何尺寸的参数化反而更加繁琐;2、程序参数化已不允许在模型中添加太多的Tie,因此不同零部件的绑定直接通过共节点来进行,这就要求建模方法与常规的建模方法有所区别。
思路如下:将一个整机拆成几个大的Part来建立,一个Part中包含许多零件,这样在划分网格式时就可以自动实现共节点的绑定。
不同的零件可通过建立不同的Set来进行区分,不同Part 的绑定可以通过Tie来实现。
将一个复杂的结构拆成几个恰当的Part来建立,一方面可以将复杂的模型简单化,使建立复杂模型成为可能;另一方面,不同的Part可单独调用,从而又可实现程序的模块化,增加程序的适应范围,延长程序的使用寿命,也方便后期程序的维护和修改。
3、通过py文件建立起的模型要进行参数优化,已不适合采用Isight中Abaqus模块,需要用到Isight的Simcode模块。
下面详细解释一个臂架的py文件。
#此程序用来绘制臂架前段#导入相关模块# -*- coding: mbcs -*-from abaqus import *from abaqusConstants import *#定义整个臂架的长、宽、高L0=14300W0=1650H0=800#创建零件P01_12 L1=H0+200 W1=200 T1=12s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=2000.0)g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints s.setPrimaryObject(option=STANDALONE)s.rectangle(point1=(W0/2, L1/2), point2=(W0/2+W1, -L1/2))s.rectangle(point1=(-W0/2, L1/2), point2=(-W0/2-W1, -L1/2))p = mdb.models['Model-1'].Part(name='Part-1', dimensionality=THREE_D, type=DEFORMABLE_BODY)p = mdb.models['Model-1'].parts['Part-1'] p.BaseShell(sketch=s)session.viewports['Viewport: 1'].setValues(displayedObject=p) del mdb.models['Model-1'].sketches['__profile__']#定义零件的厚度p = mdb.models['Model-1'].parts['Part-1'] f = p.faces pickedFaces01 = f.findAt (((W0/2, L1/2, 0),),((-W0/2, L1/2, 0),), ) p.assignThickness(faces=pickedFaces01, thickness=T1) p.Set(faces=pickedFaces01, name='P01_12')#创建辅助平面和辅助坐标系p = mdb.models['Model-1'].parts['Part-1']p.DatumCsysByThreePoints(name='Datum csys-1', coordSysType=CARTESIAN, origin=( 0.0, 0.0, 0.0), line1=(1.0, 0.0, 0.0), line2=(0.0, 1.0, 0.0))p = mdb.models['Model-1'].parts['Part-1']p.DatumPlaneByPrincipalPlane(principalPlane=XYPLANE, offset=L0)#创建零件P02_12 L2=L1 W2=W1 T2=12p = mdb.models['Model-1'].parts['Part-1'] d = p.datums#将草图原点参数化t = p.MakeSketchTransform(sketchPlane=d[5], sketchUpEdge=d[4].axis2, sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, origin=(0.0, 0.0, L0)) s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=29006.85, gridSpacing=725.17, transform=t) g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraints s.setPrimaryObject(option=SUPERIMPOSE)p = mdb.models['Model-1'].parts['Part-1']s.rectangle(point1=(W0/2, L2/2), point2=(W0/2+W2, -L2/2))s.rectangle(point1=(-W0/2, L2/2), point2=(-W0/2-W2, -L2/2))p = mdb.models['Model-1'].parts['Part-1']d2 = p.datumsp.Shell(sketchPlane=d2[5], sketchUpEdge=d2[4].axis2, sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, sketch=s)s.unsetPrimaryObject()del mdb.models['Model-1'].sketches['__profile__']#定义零件的厚度p = mdb.models['Model-1'].parts['Part-1'] Array f = p.facespickedFaces02 = f.findAt(((W0/2, L1/2, L0),),((-W0/2, L1/2, L0),), )p.assignThickness(faces=pickedFaces02, thickness=T2)p.Set(faces=pickedFaces02, name='P02_12')#创建零件P03_12和零件P04_08T3=12T4=8p = mdb.models['Model-1'].parts['Part-1']d = p.datumst = p.MakeSketchTransform(sketchPlane=d[5], sketchUpEdge=d[4].axis2, sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, origin=(0.0, 0.0, L0)) s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=29006.85, gridSpacing=725.17, transform=t)g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraintss.setPrimaryObject(option=SUPERIMPOSE)#创建草图p = mdb.models['Model-1'].parts['Part-1']s.Line(point1=(-W0/2-W1, H0/2), point2=(-W0/2, H0/2))s.Line(point1=(W0/2, H0/2), point2=(W0/2+W1, H0/2))s.Line(point1=(-W0/2-W1, -H0/2), point2=(-W0/2, -H0/2))s.Line(point1=(W0/2, -H0/2), point2=(W0/2+W1, -H0/2))p = mdb.models['Model-1'].parts['Part-1']d2 = p.datumsp.ShellExtrude(sketchPlane=d2[5], sketchUpEdge=d2[4].axis2,sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, sketch=s, depth=L0, flipExtrudeDirection=ON)s.unsetPrimaryObject()del mdb.models['Model-1'].sketches['__profile__']#定义零件P03_12的厚度p = mdb.models['Model-1'].parts['Part-1']f = p.facespickedFaces03 = f.findAt(((-W0/2, H0/2, L0/2),),((W0/2, H0/2, L0/2),),)p.assignThickness(faces=pickedFaces03, thickness=T3)p.Set(faces=pickedFaces03, name='P03_12')#定义零件P04_12的厚度p = mdb.models['Model-1'].parts['Part-1']f = p.facespickedFaces04 = f.findAt(((-W0/2, -H0/2, L0/2),),((W0/2, -H0/2, L0/2),),)p.assignThickness(faces=pickedFaces04, thickness=T4)p.Set(faces=pickedFaces04, name='P04_12')#创建零件P05_08T5=8p = mdb.models['Model-1'].parts['Part-1']d = p.datumst = p.MakeSketchTransform(sketchPlane=d[5], sketchUpEdge=d[4].axis2, sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, origin=(0.0, 0.0, L0))s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',sheetSize=29006.85, gridSpacing=725.17, transform=t)g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraintss.setPrimaryObject(option=SUPERIMPOSE)p = mdb.models['Model-1'].parts['Part-1']s.Line(point1=(-W0/2-W1/2, H0/2), point2=(-W0/2-W1/2, -H0/2))s.Line(point1=(W0/2+W1/2, H0/2), point2=(W0/2+W1/2, -H0/2))p = mdb.models['Model-1'].parts['Part-1']d2 = p.datumsp.ShellExtrude(sketchPlane=d2[5], sketchUpEdge=d2[4].axis2,sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, sketch=s, depth=L0,flipExtrudeDirection=ON)s.unsetPrimaryObject()del mdb.models['Model-1'].sketches['__profile__']#定义零件P05_8的厚度p = mdb.models['Model-1'].parts['Part-1']f = p.facespickedFaces05 = f.findAt(((-W0/2-W1/2, 0, L0/2),),((W0/2+W1/2, 0, L0/2),),)p.assignThickness(faces=pickedFaces05, thickness=T5)p.Set(faces=pickedFaces05, name='P05_08')#创建零件P06_08L6=W0+W1n=L0//2520+1T6=8p = mdb.models['Model-1'].parts['Part-1']f, d = p.faces, p.datumst = p.MakeSketchTransform(sketchPlane=f[0], sketchUpEdge=d[4].axis2, sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, origin=(W0/2+W1/2, -H0/2,0))s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',sheetSize=28684, gridSpacing=717, transform=t)g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraintss.setPrimaryObject(option=SUPERIMPOSE)p = mdb.models['Model-1'].parts['Part-1']#循环命令绘制平行隔板for i in range(0,n): Array s.Line(point1=(-500-(i*2520), H0), point2=(-500-(i*2520), 0.0))p = mdb.models['Model-1'].parts['Part-1']f1, d2 = p.faces, p.datumsp.ShellExtrude(sketchPlane=f1[0], sketchUpEdge=d2[4].axis2,sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, sketch=s, depth=L6,flipExtrudeDirection=ON)s.unsetPrimaryObject()del mdb.models['Model-1'].sketches['__profile__']#定义零件P06_08的厚度p = mdb.models['Model-1'].parts['Part-1']f = p.facesfor i in range(0,n): Array pickedFaces = f.findAt(((0, H0/4, 500+i*2520),))p.assignThickness(faces=pickedFaces, thickness=T6)p.Set(faces=pickedFaces, name='P06_08_'+str(1+i))#创建零件P07_12,P08_12W7=200L7=W0+W1T7=12T8=12p = mdb.models['Model-1'].parts['Part-1']f, e = p.faces, p.edgest = p.MakeSketchTransform(sketchPlane=f.findAt(coordinates=(W0/2+W1/2, 0.0, 100.0)),sketchUpEdge=e.findAt(coordinates=(W0/2+W1/2, 0.0, 0.0)),sketchOrientation=RIGHT,sketchPlaneSide=SIDE1,origin=(W0/2+W1/2, -H0/2, 0.0))s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',sheetSize=53678, gridSpacing=1341, transform=t)g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraintss.setPrimaryObject(option=SUPERIMPOSE)p = mdb.models['Model-1'].parts['Part-1']#循环命令绘制平行隔板for i in range(0,n):s.Line(point1=(400+i*2520, -H0), point2=(600+i*2520, -H0))s.Line(point1=(400+i*2520, 0), point2=(600+i*2520, 0))p = mdb.models['Model-1'].parts['Part-1']f1, e1 = p.faces, p.edgesp.ShellExtrude(sketchPlane=f.findAt(coordinates=(W0/2+W1/2, 0.0, 100.0)),sketchUpEdge=e.findAt(coordinates=(W0/2+W1/2, 0.0, 0.0)),sketchPlaneSide=SIDE1,sketchOrientation=RIGHT, sketch=s, depth=W0+W1, flipExtrudeDirection=ON, keepInternalBoundaries=ON)s.unsetPrimaryObject()del mdb.models['Model-1'].sketches['__profile__']#定义零件P07_12的厚度p = mdb.models['Model-1'].parts['Part-1']f = p.facesfor i in range(0,n):pickedFaces07 = f.findAt(((0, H0/2, 400+i*2520),),((0, H0/2, 600+i*2520),),) p.assignThickness(faces=pickedFaces07, thickness=T7)p.Set(faces=pickedFaces07, name='P07_12_'+str(1+i))fp=[]for i in range(0,2):fp.append(f.findAt(((0, H0/2, 400+i*2520),),((0, H0/2, 600+i*2520),),))p.Set(faces=fp, name='P07_fp')#定义零件P08_12的厚度p = mdb.models['Model-1'].parts['Part-1']f = p.facesfor i in range(0,n):pickedFaces08 = f.findAt(((0, -H0/2, 400+i*2520),),((0, -H0/2, 600+i*2520),),) p.assignThickness(faces=pickedFaces08, thickness=T7)p.Set(faces=pickedFaces08, name='P08_12_'+str(1+i))#为中间隔板创建空腔#定义相关参数边界距离、圆角d0=100r0=100p = mdb.models['Model-1'].parts['Part-1']f1, e1 = p.faces, p.edgest = p.MakeSketchTransform(f.findAt(coordinates=(0, 0.0, 500.0)),sketchUpEdge=e.findAt(coordinates=(W0/2+W1/2, 0.0, 500.0)),sketchPlaneSide=SIDE1, sketchOrientation=RIGHT,origin=(0.0, 0.0, 500.0))s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',sheetSize=5910.0, gridSpacing=147.0, transform=t)g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraintss.setPrimaryObject(option=SUPERIMPOSE)p = mdb.models['Model-1'].parts['Part-1']p.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES)#创建矩形s.rectangle(point1=(-W0/2-W1/2+d0, H0/2-d0), point2=(W0/2+W1/2-d0, -H0/2+d0)) #创建圆角s.FilletByRadius(radius=r0,curve1=g[29], nearPoint1=(-W0/2-W1/2+d0, H0/2-d0), curve2=g[26], nearPoint2=(-W0/2-W1/2+d0, H0/2-d0))s.FilletByRadius(radius=r0, curve1=g[26], nearPoint1=(-W0/2-W1/2+d0, -H0/2+d0), curve2=g[27], nearPoint2=(-W0/2-W1/2+d0, -H0/2+d0)) s.FilletByRadius(radius=r0, curve1=g[27], nearPoint1=(W0/2+W1/2-d0, -H0/2+d0), curve2=g[28], nearPoint2=(W0/2+W1/2-d0, -H0/2+d0)) s.FilletByRadius(radius=r0, curve1=g[28], nearPoint1=(W0/2+W1/2-d0, H0/2-d0), curve2=g[29], nearPoint2=(W0/2+W1/2-d0, H0/2-d0))p = mdb.models['Model-1'].parts['Part-1']f1, d2 = p.faces, p.datumsp.CutExtrude(f.findAt(coordinates=(0, 0.0, 500.0)),sketchUpEdge=e.findAt(coordinates=(W0/2+W1/2, 0.0, 500.0)),sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, sketch=s, depth=L0, flipExtrudeDirection=OFF)s.unsetPrimaryObject()del mdb.models['Model-1'].sketches['__profile__']#开始建立梁Beam_1p = mdb.models['Model-1'].parts['Part-1']f, d = p.faces, p.datums#绘制参考面p.DatumPlaneByOffset(plane=f.findAt(coordinates=(W0/2, -H0/2, 100.0)),flip=SIDE2, offset=8.0)dp1 = d.keys()[-1]p = mdb.models['Model-1'].parts['Part-1']d = p.datumst = p.MakeSketchTransform(sketchPlane=d[dp1], sketchUpEdge=d[4].axis1,sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, origin=(0.0, 0.0,0.0))s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=31857.0, gridSpacing=796.0, transform=t)g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraintss.setPrimaryObject(option=SUPERIMPOSE)p = mdb.models['Model-1'].parts['Part-1']#计算中间加强梁的数量if n%2==1:n1=n//2 n2=n//2 else:n1=n//2 n2=n//2-1 for i in range(0,n1):s.Line(point1=(-500-i*2520*2, W0/2+W1/2), point2=(-500-2520-i*2520*2,-W0/2-W1/2 )) for i in range(0,n2):s.Line(point1=(-500-2520-i*2520*2,-W0/2-W1/2), point2=(-500-2*2520-i*2520*2,W0/2+W1/2 ))#在基准平面dp1上面绘制梁p = mdb.models['Model-1'].parts['Part-1'] d2 = p.datums e = p.edgesp.Wire(sketchPlane=d2[dp1], sketchUpEdge=d2[4].axis1, sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, sketch=s) s.unsetPrimaryObject()del mdb.models['Model-1'].sketches['__profile__'] edges1=[] for i in range(0,n-1): edges1.append (e.findAt(((0, -H0/2-8, 500+2520/2+i*2520),),)) p.Set(edges=edges1, name='Beam_1') ############################开始定义有限元分析的相关参数 #定义材料mdb.models['Model-1'].Material(name='steel')mdb.models['Model-1'].materials['steel'].Elastic(table=((210000.0, 0.3), )) mdb.models['Model-1'].materials['steel'].Density(table=((7.8e-06, ), ))#定义壳单元属性mdb.models['Model-1'].HomogeneousShellSection(name='shell', preIntegrate=OFF, material='steel', thicknessType=UNIFORM, thickness=10.0, thicknessField='', idealization=NO_IDEALIZATION, poissonDefinition=DEFAULT,thicknessModulus=None, temperature=GRADIENT, useDensity=OFF, integrationRule=SIMPSON, numIntPts=5) #赋所有壳单元属性p = mdb.models['Model-1'].parts['Part-1']for i in range(1,5):region1 = p.sets['P0'+str(i)+'_12']p.SectionAssignment(region=region1, sectionName='shell', offset=0.0,offsetType=FROM_GEOMETRY , offsetField='',thicknessAssignment=FROM_GEOMETRY )region2 = p.sets['P05_08']p.SectionAssignment(region=region2, sectionName='shell', offset=0.0, offsetType=FROM_GEOMETRY, offsetField='',thicknessAssignment=FROM_GEOMETRY)for i in range(1,n+1): Array region3 = p.sets['P06_08_'+str(i)]p.SectionAssignment(region=region3, sectionName='shell', offset=0.0,offsetType=FROM_GEOMETRY, offsetField='',thicknessAssignment=FROM_GEOMETRY)for i in range(1,n+1):region4 = p.sets['P07_12_'+str(i)]p.SectionAssignment(region=region4, sectionName='shell', offset=0.0,offsetType=FROM_GEOMETRY, offsetField='',thicknessAssignment=FROM_GEOMETRY)for i in range(1,n+1):region5 = p.sets['P08_12_'+str(i)]p.SectionAssignment(region=region5, sectionName='shell', offset=0.0,offsetType=FROM_GEOMETRY, offsetField='',thicknessAssignment=FROM_GEOMETRY)#定义梁单元属性mdb.models['Model-1'].LProfile(name='L_65', a=65.0, b=65.0, t1=7.0, t2=7.0)mdb.models['Model-1'].BeamSection(name='B_65', integration=DURING_ANALYSIS,poissonRatio=0.0, profile='L_65', material='steel', temperatureVar=LINEAR,consistentMassMatrix=False)#赋所有梁单元属性p = mdb.models['Model-1'].parts['Part-1']region = p.sets['Beam_1']p.SectionAssignment(region=region, sectionName='B_65', offset=0.0,offsetType=MIDDLE_SURFACE, offsetField='',thicknessAssignment=FROM_SECTION)p.assignBeamSectionOrientation(region=region, method=N1_COSINES, n1=(0.0, 0.0,-1.0))#定义装配体import assemblya = mdb.models['Model-1'].rootAssemblya.DatumCsysByDefault(CARTESIAN)p = mdb.models['Model-1'].parts['Part-1']a.Instance(name='Part-1-1', part=p, dependent=ON)#定义分析步import stepmdb.models['Model-1'].StaticStep(name='Step-1', previous='Initial')#定义底面与梁的tiedimport interactiona = mdb.models['Model-1'].rootAssemblyregion1=a.instances['Part-1-1'].sets['P04_12']region2=a.instances['Part-1-1'].sets['Beam_1']mdb.models['Model-1'].Tie(name='Constraint-1', master=region1, slave=region2, positionToleranceMethod=COMPUTED, adjust=OFF, tieRotations=ON, thickness=ON)#开始定义耦合#导入相关模块import regionToolseta = mdb.models['Model-1'].rootAssemblyd, r = a.datums, a.referencePoints#定义参考点a.ReferencePoint(point=(0.0, H0/2, 500+2520/2))rp1 = r.keys()[-1]refPoints1=(r1[rp1], )region1=regionToolset.Region(referencePoints=refPoints1)s1 = a.instances['Part-1-1'].facesregion2 = a.instances['Part-1-1'].sets['P07_fp']mdb.models['Model-1'].Coupling(name='Constraint-2', controlPoint=region1, surface=region2, influenceRadius=WHOLE_SURFACE, couplingType=DISTRIBUTING, localCsys=None, u1=ON, u2=ON, u3=ON, ur1=ON, ur2=ON, ur3=ON)#########################定义边界条件import loada = mdb.models['Model-1'].rootAssemblyd, r = a.datums, a.referencePointsregion = a.instances['Part-1-1'].sets['P02_12']mdb.models['Model-1'].DisplacementBC(name='SPC', createStepName='Initial', region=region, u1=SET, u2=SET, u3=SET, ur1=SET, ur2=SET, ur3=SET,amplitude=UNSET, distributionType=UNIFORM, fieldName='', localCsys=None)a = mdb.models['Model-1'].rootAssemblyregion = a.instances['Part-1-1'].sets['P08_12_'+str(n-1)]mdb.models['Model-1'].DisplacementBC(name='SPC2', createStepName='Initial', region=region, u1=SET, u2=SET, u3=SET, ur1=SET, ur2=SET, ur3=SET,amplitude=UNSET, distributionType=UNIFORM, fieldName='', localCsys=None)r1 = a.referencePointsrefPoints1=(r1[rp1], )region = regionToolset.Region(referencePoints=refPoints1)mdb.models['Model-1'].ConcentratedForce(name='force', createStepName='Step-1',region=region, cf2=-10000.0, distributionType=UNIFORM, field='',localCsys=None)mdb.models['Model-1'].Gravity(name='G', createStepName='Step-1', comp2=-9.8, distributionType=UNIFORM, field='')#################划分网格import meshp = mdb.models['Model-1'].parts['Part-1']p.seedPart(size=20.0, deviationFactor=0.1, minSizeFactor=0.1)p.generateMesh()a = mdb.models['Model-1'].rootAssembly###############创建作业并提交分析import jobmdb.Job(name='006', 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='', multiprocessingMode=DEFAULT, numCpus=4, numDomains=4) mdb.jobs['006'].submit(consistencyChecking=ON)mdb.jobs['006'].waitForCompletion()###############进入后处理模块import visualizationo3 = session.openOdb(name='F:/ABAQUS/006.odb')session.viewports['Viewport: 1'].setValues(displayedObject=o3)session.viewports['Viewport: 1'].odbDisplay.display.setValues(plotState=( CONTOURS_ON_DEF, ))session.viewports['Viewport: 1'].view.setValues(session.views['Iso'])mdb.saveAs(pathName='F:/ABAQUS/006.cae')第11 页共11 页。
基于Python的ABAQUS二次开发应用
谢瑞敏;王雪军
【期刊名称】《中国水运(下半月)》
【年(卷),期】2017(017)010
【摘要】ABAQUS二次开发对于ABAQUS在工程分析中的应用具有很大的促进作用.通过开发Python脚本程序控制ABAQUS的建模过程,可以有效解决手工建模时的重复繁琐问题,提高了前处理的效率.在ABAQUS环境下执行Python脚本,可方便地实现自动化创建、重复、修改模型及分析任务,实现参数化研究,访问结果数据库等功能.本文以某船闸闸室为例,介绍了基于Python的ABAQUS二次开发原理与方法,讨论了ABAQUS的脚本接口和对象模型在二次开发中的作用和调用流程,以及讨论了数据的读取与处理、结果输出与查看等关键技术.
【总页数】3页(P77-79)
【作者】谢瑞敏;王雪军
【作者单位】江苏省泰州引江河管理处,江苏泰州 225300;泰州市海陵建筑设计院有限公司,江苏泰州 225300
【正文语种】中文
【中图分类】TP391
【相关文献】
1.基于ABAQUS-Python二次开发的滚筒柜框架参数化建模与谐响应分析 [J], 宋涛;马成功;王贺;洪诚
2.基于Python的ABAQUS二次开发在骨钻削仿真中的应用 [J], 陈春城;胡亚辉;郑清春;张善青
3.基于Python的ABAQUS二次开发在飞机蒙皮锤铆中的应用 [J], 陈彦海;秦运海;姜春英;康玉祥;叶长龙
4.基于ABAQUS-Python低碳钢实验可视化分析及二次开发 [J], 郑烨;王铎;张林怡;谢雅芳;黄珠琼
5.基于Python的ABAQUS二次开发在复合材料层合板冲击建模中的应用 [J], 陈芳育;李进;邱玮桢;吕泉江
因版权原因,仅展示原文概要,查看原文内容请购买。
第16卷第4期2009年8月塑性工程学报J OU RNAL OF PL ASTICIT Y EN GIN EERIN GVol 116 No 14Aug 1 2009doi :1013969/j 1issn 1100722012120091041013基于Python 的ABAQUS 二次开发及在板料快速冲压成形模拟中的应用(北京航空航天大学飞行器制造工程系,北京 100191) 吴向东 刘志刚 万 敏 王文平 黄 霖摘 要:采用Python 脚本语言对ABAQUS 的前处理模块进行二次开发,讨论了Python 脚本在ABAQUS 二次开发中的作用和调用过程,提出了程序开发的思路及一般步骤。
通过开发针对板料快速冲压成形模拟的Python 脚本程序,使用户能够根据压力机实际参数创建真实加载速度幅值曲线。
结果表明,所开发的程序界面友好,可操作性强。
通过典型冲压成形实例,比较分析结点滑动速度和结点运动速度曲线,证明了有限元软件模拟的真实加载速度可以反映板料和模具之间的滑动速度,为后续的实际试验提供分析依据。
关键词:Python ;ABAQUS ;快速冲压;二次开发中图分类号:T G 38613+5 文献标识码:A 文章编号:100722012(2009)0420068205Study and development on the application of ABAQUS in thesheet metal rapid forming simulation based on PythonWU Xiang 2dong L IU Zhi 2gang WAN Min WAN G Wen 2ping HUAN G Lin (Beihang University ,Department of Aircraft Manufacturing ,Beijing 100191 China )Abstract :Python scripting language was used for pre 2processing module of ABAQUS for secondary development ,the role of Py 2thon script and the call process was discussed in the ABAQUS secondary development ,the development of ideas and general steps was put forward.Through the Python script for the sheet metal rapid forming simulation ,an effective solution was proposed to allow users creating true loading rate amplitude according actual press parameters.The results showed that the procedure was f riendly and feasible.Through a typical Stamping example ,compared and analyzed the node slip velocity curve and translational velocity curve.It proved the truth that the true loading rate simulating by Finite element software can reflect the slip velocity be 2tween sheet metal and die ,providing the basis for the follow 2up analysis in actual testing.K ey w ords :Python ;ABAQUS ;rapid forming ;second development吴向东 E 2mail :xdwu @buaa 1edu 1cn作者简介:吴向东,男,1970年生,北京航空航天大学机械学院,副教授,主要从事先进塑性成形工艺与装备技术的研究收稿日期:2008211218;修订日期:2009201210 引 言为适应汽车工业大规模、快速、敏捷生产的需求,以东风日产等为代表的日系汽车厂逐步引进了快速冲压生产线,冲压频率由原来的每分钟7次提高到每分钟12次,冲压速度提高了近一倍,同时也提高了单线产能和模具利用率,但由于缺乏汽车钢板快速冲压成形特征的研究与掌握,对速度提高所引起的拉薄、拉裂问题,无法提供有效的工艺改进措施及模具改善方案。
另外,冲压速度的提升使板料和模具之间的相对滑动速度提高,从而导致模具和板料的温度升高增加[1],影响板料和模具之间的摩擦状况[2],温度的升高和摩擦状况的改变往往会影响板料的成形性能,因此,准确获得板料在冲压过程中各点滑动速度显得尤为重要。
目前冲头的速度已经知道,但是其并不等于板料和模具之间的滑动速度,为获得板料的相对滑动速度,本文采用有限元数值模拟的方法进行了研究,旨在通过输入冲头的实际速度,获得板料在冲压过程中各个部位的相对滑动速度。
ABAQU S 作为一种功能强大的通用有限元分析软件,在板料冲压等准静态过程中有很好的应用[3]。
为了研究快速成形过程中变形速度的实际变化,需要对成形过程中真实的加载速率进行模拟,分析结点的滑动速度和压力机加载速率之间的关系,找到加载过程中变形速度的变化规律。
因此,需要利用ABAQU S软件提供的接口,编写创建真实加载速度的脚本程序,尽可能真实地模拟加载过程。
本文基于Pyt hon语言对ABAQU S前处理过程进行了开发。
通过用户自定义压力机参数计算加载速率的幅值曲线。
通过计算实例,分析结点的滑动速度和结点运动速度的关系,为后续的实际试验提供分析依据。
同时,本文的研究也为基于Pyt hon 的研究开发在其他领域的应用,提供了重要的指导和借鉴。
1 ABAQUS软件及其Python脚本介绍111 ABAQUS二次开发接口ABAQU S软件具有很强的通用性和扩展性,允许用户根据自己的需要编写子程序,ABAQU S 提供了丰富的编程接口供用户使用,常见的开发主要有以下几种途径[4]:1)通过用户子程序可以开发新的模型,控制ABAQU S计算过程和计算结果;2)通过内核脚本可以实现前处理建模和后处理分析计算结果;3)通过GU I脚本可以创建新的图形用户界面和用户交互。
本文用到的是第2)种和第3)种方法,通过图形用户界面(GU I)得到用户输入的参数,通过Pyt hon 脚本控制ABAQU S内核实现前后处理的操作[5]。
112 ABAQUS二次开发与Python脚本ABAQU S脚本接口是一个基于对象的程序库,内嵌脚本语言Pyt hon。
ABAQU S采用Pyt hon的语法编写脚本,但扩展了Pyt hon脚本语言,额外提供了大约500个对象模型[6]。
ABAQU S对象模型分为session,mdb,odb3类。
session对象用来定义视图,远程队列,用户定义的视图等;mdb对象包括计算模型对象和作业对象;odb对象包括计算模型对象和计算结果数据。
对ABAQU S前处理模块进行二次开发,主要是对models对象进行操作。
models几乎包含了建模编程需要的所有对象类型,是主要考虑的对象类型。
图1展示了这些模型之间的层次结构和相互关系[7]。
图1 ABAQUS对象模型Fig11 ABAQUS object model2 基于Pyt hon的ABAQU S程序开发基于Pyt hon对ABAQU S前处理模块进行二次开发,建立曲柄压力机的真实加载幅值曲线。
曲柄压力机的滑块速度由滑块行程S、连杆长度L、曲柄转速n决定,同时,为使程序更易于用户使用和方便操作,需要编写用户界面程序和Plug2in程序。
同理,为使用户更直观地观察所创建的幅值对象,编写了加载幅值的自动绘图程序。
通过提取用户当前创建的幅值对象,绘制幅值曲线。
211 实际滑块运动速度分析图2所示为结点正置的曲柄压力机的运动关系简图,所谓结点正置是指滑块和连杆的连接点的运动轨迹位于曲柄旋转中心和连接点的连线上[8]。
图2 曲柄滑块机构运动简图Fig12 Slider2crank mechanism movement diagram压力机的加载速度计算公式为v=ωR(sinα+λ2sin2α)(1) 压力机的加载滑块位移计算公式为D=R[(1-co sα)+λ4(1-cos2α)](2)式中 v———滑块速度(向下方向为正)D———滑块位移(向下方向为正)n———曲柄转速ω———曲柄角速度,ω=2πnα———曲柄转角,α=ωtR———曲柄的半径,R=S/2(S为滑块位移)λ———连杆系数,λ=R/L(L为连杆长度)96 第4期吴向东等:基于Pyt hon的ABAQU S二次开发及在板料快速冲压成形模拟中的应用由式(2)并利用余弦定理,可得滑块运动时间与位移的关系式:t =arcco s 1+c 2λ-2c2(1+λ-cλ)ω, c =D/R (3)212 程序核心代码引入ABAQU S 的几个基本模块,定义创建光滑幅值曲线的函数,采用式(1)计算压力机的加载速率,创建光滑加载幅值对象。
表1为所开发的核心程序代码。
表1 压力机加载速率计算程序代码Tab 11 Code of press loading rate calculation program#Amplitude 1py#程序名称from abaqusConstants import 3#引入abaqusConstants 模块from abaqus import 3#引入abaqus 模块from math import 3#引入math 模块#定义函数,创建压力机的加载幅值对象#参数timespan 为加载持续的时间;I N 为幅值曲线上点的个数;D 为压力机的滑块位移;#S 为曲柄压力机的滑块行程;L 为压力机的连杆长度;n 为曲柄的转速def CreateSmoothStepAmplitude (name ,timespan ,I N ,D ,S ,L ,n ): import amplitude #引入amplitude 对象 vp =session 1currentViewportName #定义视图名称 model =session 1sessionState[vp ][′modelName ′]#定义模型名称 m =mdb 1models[model ]#创建模型 k =timespan/IN w =23pi 3n/60#w 为角速度 R =S/210#R 为曲柄半径 v =1103R/L #v 为连杆系数 c =1103D/R #c 为位移系数 to =acos (110+(c 3c 3v -2103c )/(2103(110+v -c 3v )))/w #计算滑块的初始滑动时间 data =[] for i in range (IN +1):#for 循环逐一计算幅值对象中的数据对 t =to +k 3i v =w 3R 3(sin (w 3t )+(S 3sin (2103w 3t ))/(4103L )) data 1append ((t ,v )) m 1SmoothStepAmplitude (name =name ,data =data )#创建光滑幅值对象 将程序保存成后缀为1py 的Pyt hon 文件。