Abaqus:表面上 select 个元素的脚本

Abaqus: script to select elements on a surface

我正在尝试编写一个 Abaqus/Python 脚本,它将 select 所有 "belong" 的元素添加到某个面孔。 IE。取与网格立方体的一个面有连接的所有元素(稍后我将计算作用在该面上的总力,用于力-位移或应力-应变曲线)。

如果我使用 GUI 执行此操作,我会得到:

mdb.models['Model-1'].rootAssembly.Set(elements=
  mdb.models['Model-1'].rootAssembly.instances['Part-1-1'].elements.getSequenceFromMask(
    mask=('[#0:5 #fff80000 #ff #f #ffe00000 #f000000f #3f', 
          ' #0:6 #fffe #c0003f00 #3 #3fff8 #ffc00 ]', ), ), name='Set-1')

但是,getSequenceFromMask在一般情况下不起作用。我尝试使用 findat 但没有成功。

有办法吗?

几天前我自己也遇到过这个问题。也许我错了,但据我所知,没有办法直接 select 特定元素。您可以使用 "Bounding Box" 或 "Bounding Sphere" select 它们,或者您可以通过零件/实例的面和单元格来获取它们。如果您需要以更具体的方式 select 元素,那么您可以通过它们所连接的节点来获取它们。您可以对这些节点使用 "findAt" 命令,并通过 "getElements()" 命令获取元素。

我就是这样解决的,效果很好。如果有其他方法可以解决这个问题,我会很高兴听到它们,因为这有时真的很令人沮丧。

干杯

在零件或装配体上定义面集:

  part.Set('facename',faces=part.faces.findAt(((1,0,0),),))

其中 (1,0,0) 是面部任意位置的坐标。 (不过不要在 edge/corner 上使用点)

然后在网格化之后,您可以访问附加到该面的元素,例如:

  instance.sets['facename'].elements

请注意,如果您想在 运行 分析后获取 odb 上的那些元素,则有点不同:

  instance.elementSets['FACENAME'].elements

请注意,设置名称在 odb 上是大写的..

您显然是在使用宏来获取表面的位置,以便使用 Python 选择集合。问题是:Macro 工具默认使用 getSequenceFromMask() 并且不是很用户友好...

幸运的是,这个默认选项是可以更改的!只需要 运行 下面一行代码:
session.journalOptions.setValues(replayGeometry=COORDINATE,recoverGeometry=COORDINATE)

现在,当您使用 MacroManager 录制宏时,您会得到 findAt(),这就是您想要的。

额外提示:
您可以将这段代码包含在 custom_v6.env 文件的 onCaeStartup() 函数中。每次打开 CAE 时它都会 运行。

C:\Program Files\Dassault Systemes\SimulationServices\V6R2018x\win_b64\SMA\site\custom_v6.env

您可以 select 使用其标签中的特定元素:

mdb.models['model-name'].parts['part_name'].elements.getFromLabel(lable=element_id)

这样就不需要元素的坐标信息了。只需要元素id就可以访问了