ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】

2017-01-20  by:CAE仿真在线  来源:互联网





太长不想看

1. 如何用python创建模型?

2. 如何用python批量剖分模型?

3. 你们还是仔细看看吧,别偷懒了。




上回小胖给大家介绍了Python与ABAQUS的一些相关基础内容(自己挖的坑,跪着也要填完),当然针对是菜鸟宝宝的。高手可以对本系列教程无视,只“赞赏”就好了


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片1


后面我们具体讲一下如何在CAE界面内运行你所需要的命令。今天我们先讲一下建模相关的。


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片2
Abaqus的Python版本

ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片3


最近的4个Abaqus版本中,6.12和6.13采用的是Python 2.6.2, 6.14和2016(内部版本6.16)采用的是Python 2.7.3。这可以在CAE界面中的Help-about abaqus中查询得到。

ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片4


Abaqus应该是集成了Python的基本程序包,所以各位应该不用担心自己系统内的Python会和Abaqus自带的Python产生冲突。Python程序基本的功能,包括文件读写、函数运算甚至系统命令的调用,你都可以在CAE内通过run script完成。借用 Simwe/Abaqus 吴聊SP版主的一句话——Abaqus采用Python做前后处理,简直太英明了。


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片2
Part创建命令

ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片3

小胖现在CAE里建立了这么一个三维块体



ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元培训资料图片7


方法嘛,当然是part-create,然后通过sketch画好截面图后拉伸形成的啦。我们看看相关jnl文件中的对应命令是什么


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元培训资料图片8

////////////////////////////////////////////////////////////////////////////////////////

from part import *
from material import *
from section import *
from assembly import *
from step import *
from interaction import *
from load import *
from mesh import *
from optimization import *
from job import *
from sketch import *
from visualization import *
from connectorBehavior import *

mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0)
mdb.models['Model-1'].sketches['__profile__'].Line(point1=(0.0, 0.0), point2=(
15.0, 0.0))
mdb.models['Model-1'].sketches['__profile__'].HorizontalConstraint(
addUndoState=False, entity=
mdb.models['Model-1'].sketches['__profile__'].geometry[2])
mdb.models['Model-1'].sketches['__profile__'].Line(point1=(15.0, 0.0), point2=(
15.0, 15.0))
mdb.models['Model-1'].sketches['__profile__'].VerticalConstraint(addUndoState=
False, entity=mdb.models['Model-1'].sketches['__profile__'].geometry[3])
mdb.models['Model-1'].sketches['__profile__'].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models['Model-1'].sketches['__profile__'].geometry[2], entity2=
mdb.models['Model-1'].sketches['__profile__'].geometry[3])
mdb.models['Model-1'].sketches['__profile__'].Line(point1=(15.0, 15.0), point2=
(0.0, 15.0))
mdb.models['Model-1'].sketches['__profile__'].HorizontalConstraint(
addUndoState=False, entity=
mdb.models['Model-1'].sketches['__profile__'].geometry[4])
mdb.models['Model-1'].sketches['__profile__'].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models['Model-1'].sketches['__profile__'].geometry[3], entity2=
mdb.models['Model-1'].sketches['__profile__'].geometry[4])
mdb.models['Model-1'].sketches['__profile__'].Line(point1=(0.0, 15.0), point2=(
0.0, 0.0))
mdb.models['Model-1'].sketches['__profile__'].VerticalConstraint(addUndoState=
False, entity=mdb.models['Model-1'].sketches['__profile__'].geometry[5])
mdb.models['Model-1'].sketches['__profile__'].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models['Model-1'].sketches['__profile__'].geometry[4], entity2=
mdb.models['Model-1'].sketches['__profile__'].geometry[5])
mdb.models['Model-1'].Part(dimensionality=THREE_D, name='soil', type=
DEFORMABLE_BODY)
mdb.models['Model-1'].parts['soil'].BaseSolidExtrude(depth=20.0, sketch=
mdb.models['Model-1'].sketches['__profile__'])

/////////////////////////////////////////////////////////////////////////////

其实前面红字部分的众多import,只有part和sketch是对这一步创建part有用的。宝宝们可以通过命令mdb.models['Model-1'].sketches系列命令看出如何在命令窗口用Python操作sketch。


各个命令基本都有相应的CAE操作对应,举个栗子:

mdb.models['Model-1'].Part(dimensionality=THREE_D, name='soil', type=
DEFORMABLE_BODY)

mdb.models['Model-1'].parts['soil'].BaseSolidExtrude(depth=20.0, sketch=
mdb.models['Model-1'].sketches['__profile__'])

就对应以下操作:


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元资料图片9


各位宝宝其实可以保存jnl文件,如果没有CAE文件或相关文件丢失时,可以直接运行jnl中相关命令,很快可以恢复模型。事实上,Abaqus自己recovery的时候应该也是以jnl文件为依据的。


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片2
Part剖分命令

ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片3


剖分的CAE操作,宝宝们想必已然很熟悉了。但在实际工程的模拟中,往往需要剖几十次甚至上百次,这就不好玩了。比如一个隧道,需要模拟100步的开挖,那么就需要沿着轴线方向至少剖分100次。这种情况看起来比较复杂,其实还是有规律可循的——因为沿着轴线方向每隔比如2米就剖分一次,宝宝们很容易想到用循环命令。现在小胖提供一个速成的方法。


我们还是以上边那个三维实体为例,假如需要沿Z轴方向剖分100次,那么每次剖分间距即为20/100=0.2 m。在CAE中,我们通常直接选用cell的剖分模式。


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片12


如果需要用define cutting plane模式,那么需要沿Z轴先布置好对应的参考点(datum-point)。


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片13


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片14


我们以上图箭头所指向的点为参考点,沿Z轴正向偏移0.2,创建第一个datum point。然后保存,去jnl文件中查看相关命令:


mdb.models['Model-1'].parts['soil'].DatumPointByOffset(point=
mdb.models['Model-1'].parts['soil'].vertices[10], vector=(0.0, 0.0, 0.2))


我们看到最后一个vector=(0.0, 0.0, 0.2)那个命令中有0.2,就知道循环有望啊。按照以下命令:

from part import *
for i in range(1, 101):
mdb.models['Model-1'].parts['soil'].DatumPointByOffset(point=mdb.models['Model-1'].parts['soil'].vertices[10], vector=(0.0, 0.0, 0.2*i))


注意两点:1. 不要忘了import;2.python循环计数是从0开始,循环至给定结尾的上一个整数,对于我们上边的例子也就是100。


先来看下效果:


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元仿真图片15


是不是很痛快?是不是觉得如果早知道,手就不用抽筋了?反正当时小胖是这么想的。我们再来看看剖分的命令能不能循环。先在CAE里剖分一下试试,看看jnl命令:


mdb.models['Model-1'].parts['soil'].PartitionCellByPlanePointNormal(cells=mdb.models['Model-1'].parts['soil'].cells.getSequenceFromMask(('[#1 ]', ), ), normal=mdb.models['Model-1'].parts['soil'].edges[1], point= mdb.models['Model-1'].parts['soil'].datums[105])


一脸懵逼啊,什么鬼啊?怎么还有乱码乱入??getSequenceFromMask是哪国人?

ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元仿真图片16

别着急。“在做abaqus二次开发时,经常会遇到getSequenceFromMask,里面给出的是一个掩码编码,一般不具备通用性,在参数化建模或者优化分析里面应避免使用它。”大家可以参考这个帖子

http://forum.simwe.com/forum.php?mod=viewthread&tid=1111700&highlight=abaqus%2Brpy%2Bmask


反正输入命令

session.journalOptions.setValues(replayGeometry=INDEX,recoverGeometry=INDEX)

就对了。


然后我们看下命令形式是啥


mdb.models['Model-1'].parts['soil'].PartitionCellByPlanePointNormal(cells=mdb.models['Model-1'].parts['soil'].cells[0:1], normal=mdb.models['Model-1'].parts['soil'].edges[1], point=mdb.models['Model-1'].parts['soil'].datums[105])


是不是友好多啦?但datums后面中括号里的序号咋获得?这个实际上可以通过建立datum point的时候采用命令


d=mdb.models['Model-1'].parts['soil'].DatumPointByOffset(point=mdb.models['Model-1'].parts['soil'].vertices[10], vector=(0.0, 0.0, 0.2))


获得。如果需要获取id,那么直接“d.id”即可。这样,我们就可以重新来一遍,思路是先创建一个datum point,然后获取datum的id,再接着创建partition。因为如果还采用define cutting plane的方法创建partition的话,中间需要edges等几何信息都会随着剖分的进行而改变,因此,我们需要一个全局不变的参考方式。我们这里选择先定义切割平面。有了datum point,自然很容易创建切割平面。但需要一个参考轴。我们可以先定义一个,即Z轴


mdb.models['Model-1'].parts['soil'].DatumAxisByPrincipalAxis(principalAxis=ZAXIS)


然后此时,我们的datum point也不宜在用偏移的方式,宝宝们可以直接采用coordinate的方式来获取命令,也就是下图所示


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元仿真图片17


然后我们就可以进行剖分程序了。总的程序如下:


from part import *
a=mdb.models['Model-1'].parts['soil'].DatumAxisByPrincipalAxis(principalAxis=ZAXIS)
aid=a.id # 创建参考轴线
for i in range(1, 101):
d=mdb.models['Model-1'].parts['soil'].DatumPointByCoordinate(coords=(0.0, 0.0, 0.2*i)) #以坐标的方式创建参考点们
did=d.id #当前创建的参考点的id号
p=mdb.models['Model-1'].parts['soil'].DatumPlaneByPointNormal(normal=mdb.models['Model-1'].parts['soil'].datums[aid], point=mdb.models['Model-1'].parts['soil'].datums[did]) #创建参考平面,将用来切割模型
pid=p.id #参考平面的id号
mdb.models['Model-1'].parts['soil'].PartitionCellByDatumPlane(cells=mdb.models['Model-1'].parts['soil'].cells[:], datumPlane=mdb.models['Model-1'].parts['soil'].datums[pid])
#批量切割


我们来看看效果


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元仿真图片18



ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片2
小结


ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】abaqus有限元图片3


所谓授人以鱼不如授人以渔。宝宝们可以按照小胖今天所讲的方法自己探索Python的程序化建模方法。


转自微信号:算盘坊

开放分享:优质有限元技术文章,助你自学成才

相关标签搜索:ABAQUS程序化建模教程(二)——模型的创建和批量修改【转发】 abaqus分析培训 abaqus技术教程 abaqus岩土分析 钢筋混凝土仿真 abaqus分析理论 abaqus软件下载 abaqus umat用户子程序编程 Abaqus代做 Abaqus基础知识 Fluent、CFX流体分析 HFSS电磁分析 Ansys培训 

编辑
在线报名:
  • 客服在线请直接联系我们的客服,您也可以通过下面的方式进行在线报名,我们会及时给您回复电话,谢谢!
验证码

全国服务热线

1358-032-9919

广州公司:
广州市环市中路306号金鹰大厦3800
电话:13580329919
          135-8032-9919
培训QQ咨询:点击咨询 点击咨询
项目QQ咨询:点击咨询
email:kf@1cae.com