python 随机抽取几行_abaqus脚本之单元随机赋予材料

这篇博客介绍了如何使用Python脚本在ABAQUS中为不同单元随机分配材料。通过创建10个section,遍历所有单元并利用random库进行随机选择,实现了材料的随机赋予。博主强调了明确目标、拆分步骤、调试和错误处理在编写脚本过程中的重要性。
摘要由CSDN通过智能技术生成

15283042f24cac3a3b843884ebea38d8.png

hello,大家好。今天教学一个,给不同的单元随机赋予材料的脚本。写脚本的方法,与之前写的镦粗脚本的方法一致。如果没看过的小伙伴,可以先看上一期。

无悔果:Abaqus-python脚本到底应该怎么写?一文带你入门​zhuanlan.zhihu.com
6a9d8d46d486c3ee8000b2a4efb23b2f.png

话不多说,直接开始吧。

1 任务

写脚本之前,一定要明确目前。反复的问自己,我想用脚本实现什么?在写脚本的过程,请一定牢记你的目标。把实现这个目标的过程,拆分成无数个简单的步骤。这样就能写出逻辑性很强的好代码。

我们今天的任务,是写一个给单元随机赋予材料的脚本。首先,模型描述,假设有10种材料模型,用的20*20*20的模型,单元大小设为1。实现的步骤为:

1.1 生成10个section

1.2 逐个遍历单元

1.3 给单元随机赋予section

做好这三步,就能实现我们想要的随机赋予材料模型的脚本了。

2 建模

建模,首先需要把模型建好,单元画好,这个比较简单。模型是20*20*20,单元大小为1:

5982ed2a5ab663ec45fe9746feeb0fc6.png

3 写脚本

3.1 生成10个section

如果你不知道怎么用脚本生成,劝退,可能你没有天赋不适合写脚本(开个玩笑)。如果你不知道怎么做,那就对了,如果你所有的函数都知道,那可能不是正常人,请留言告诉我,让我叫你一声大佬。

要知道怎么写脚本,首先需要在cae界面做一步,然后在abaqus的rpy文件里看出现了什么。这里我就不多描述了,如果有疑问,还不知道怎么做的,请看我的上一期文章,本文开头有链接。

7e9f6853871c80eecf3bd0b3b2acd93c.png

这里我建了一个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交互窗口打上就能看到。

c2b5d903f728adb0e7f240ace87b2745.png

3.3 给单元随机赋予section

还是老套路,我们给一个单元赋予seciton,看看在rpy文件会出现什么。

f003ef9807db282ae606d129bb2bfdeb.png

给一个单元先建立一个set,然后赋予材料是选这个set。在rpy文件中出现的内容如下:

a6427fe2a607c8be28343b5175e1e9ba.png

一共也就几行,是不是很简单。好,把这几行有用的复制到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。感觉已经改的面目全非了,但是效果更好了。

尝试一下脚本:

face88d5a4c1c28f2f91917ffd645597.png

8000个单元,虽然运行的有点慢,大概用了几分钟。但是结果已经是符合我们的需求了,可以看出,已经对每个单元随机赋予了不同的材料属性。完美运行,调试成功。

3.3 最终代码

因为懒得打字,就用图片了。想要源码的,可以私信或者留言告诉我,我会把源码置顶在评论区域。

483f63ca41a8cf23330e52c637806cbf.png

4 总结

今天就总结几个心得,跟大家反馈反馈。

(1)写脚本之前,一定一定一定要知道目标是什么,要时刻牢记;

(2)用流程图或者用文字,把逻辑写出来,清楚的知道你每一步要做什么;

(3)在写脚本的过程中,要不停的调试,最好是写一个小功能就运行一次,方便检查错误;

(4)出错是非常非常非常正常的事,不要着急,沉下心,你总会找到问题所在。


下期再见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值