hello,大家好。今天教学一个,给不同的单元随机赋予材料的脚本。写脚本的方法,与之前写的镦粗脚本的方法一致。如果没看过的小伙伴,可以先看上一期。
无悔果:Abaqus-python脚本到底应该怎么写?一文带你入门zhuanlan.zhihu.com话不多说,直接开始吧。
1 任务
写脚本之前,一定要明确目前。反复的问自己,我想用脚本实现什么?在写脚本的过程,请一定牢记你的目标。把实现这个目标的过程,拆分成无数个简单的步骤。这样就能写出逻辑性很强的好代码。
我们今天的任务,是写一个给单元随机赋予材料的脚本。首先,模型描述,假设有10种材料模型,用的20*20*20的模型,单元大小设为1。实现的步骤为:
1.1 生成10个section
1.2 逐个遍历单元
1.3 给单元随机赋予section
做好这三步,就能实现我们想要的随机赋予材料模型的脚本了。
2 建模
建模,首先需要把模型建好,单元画好,这个比较简单。模型是20*20*20,单元大小为1:
3 写脚本
3.1 生成10个section
如果你不知道怎么用脚本生成,劝退,可能你没有天赋不适合写脚本(开个玩笑)。如果你不知道怎么做,那就对了,如果你所有的函数都知道,那可能不是正常人,请留言告诉我,让我叫你一声大佬。
要知道怎么写脚本,首先需要在cae界面做一步,然后在abaqus的rpy文件里看出现了什么。这里我就不多描述了,如果有疑问,还不知道怎么做的,请看我的上一期文章,本文开头有链接。
这里我建了一个Material-1,给了一个密度和弹性模量,再建立了一个Section-1。它的脚本如红框所示。把它复制到任何你喜欢的python开发环境下,开始处理。(我习惯用pyCharm的,个人感觉比较好用)
from abaqus import *
from abaqusConstants import *
myModel = mdb.models["Model-1"]
for number in range(1, 11):
materialName = "Material-{}".format(number)
sectionName = "Section-{}".format(number)
myModel.Material(name=materialName)
myModel.materials[materialName].Elastic(table=((70000.0-100*number, 0.3), ))
myModel.materials[materialName].Density(table=((2.7e-09, ), ))
myModel.HomogeneousSolidSection(name=sectionName, material=materialName, thickness=None)
简单做了一些处理,用for循环做了10个material和对应的section。为了区分每种材料的区别,我对每个材料的弹性模量做一点小改动。
3.2 逐个遍历单元
遍历每个单元其实很简单,只需要一个for循环就够了。
for element in myModel.parts["Part-1"].elements:
pass
这里需要用到一点小小的基础,如果不知道,记住就好了。这么做,for循环里的element,就是abaqus里的MeshElement对象。也就是每个单元,如果你把想看它有多少个话,在abaqus交互窗口打上就能看到。
3.3 给单元随机赋予section
还是老套路,我们给一个单元赋予seciton,看看在rpy文件会出现什么。
给一个单元先建立一个set,然后赋予材料是选这个set。在rpy文件中出现的内容如下:
一共也就几行,是不是很简单。好,把这几行有用的复制到3.2步的for循环里。做一点改动。
myPart = myModel.parts['Part-1']
myElement = myPart.elements
for iter in range(len(myElement)):
randNum = random.randint(1, 10)
setName = 'Set-{}'.format(iter)
myPart.Set(elements=myElement[iter:iter+1], name=setName)
myPart.SectionAssignment(region=myPart.sets[setName], sectionName='Section-{}'.format(randNum),
offset=0.0,offsetType=MIDDLE_SURFACE, offsetField='',
thicknessAssignment=FROM_SECTION)
这里需要用到随机数random.randint(),所以在开头需要导入一个包import random。感觉已经改的面目全非了,但是效果更好了。
尝试一下脚本:
8000个单元,虽然运行的有点慢,大概用了几分钟。但是结果已经是符合我们的需求了,可以看出,已经对每个单元随机赋予了不同的材料属性。完美运行,调试成功。
3.3 最终代码
因为懒得打字,就用图片了。想要源码的,可以私信或者留言告诉我,我会把源码置顶在评论区域。
4 总结
今天就总结几个心得,跟大家反馈反馈。
(1)写脚本之前,一定一定一定要知道目标是什么,要时刻牢记;
(2)用流程图或者用文字,把逻辑写出来,清楚的知道你每一步要做什么;
(3)在写脚本的过程中,要不停的调试,最好是写一个小功能就运行一次,方便检查错误;
(4)出错是非常非常非常正常的事,不要着急,沉下心,你总会找到问题所在。
下期再见~