gpt4 book ai didi

python - Abaqus 可视化密度

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:45 26 4
gpt4 key购买 nike

我正在尝试优化某种 Material 的孔隙率分布。我想可视化结果。我可以使用'visualize->material'来可视化不同的 Material ,但是他给每种 Material 随机颜色。我希望密度最小的 Material 是蓝色的,密度最大的是红色的。因此与应力图相同。

有没有办法在 Abaqus 中做到这一点?

如果在 GUI 中没有简单的方法来执行此操作,我想知道是否可以通过使用脚本来实现?我尝试更改一种颜色,结果产生了以下代码:

session.viewports['Viewport: 1'].enableMultipleColors()
session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
cmap=session.viewports['Viewport: 1'].colorMappings['Material']
session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
session.viewports['Viewport: 1'].disableMultipleColors()
session.viewports['Viewport: 1'].enableMultipleColors()
session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
cmap = session.viewports['Viewport: 1'].colorMappings['Material']
cmap.updateOverrides(overrides={'IMPLANT_MATERIAL0':(True, '#FF0000',
'Default', '#FF0000')})
session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
session.viewports['Viewport: 1'].disableMultipleColors()
session.viewports['Viewport: 1'].enableMultipleColors()
session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
cmap = session.viewports['Viewport: 1'].colorMappings['Material']
session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
session.viewports['Viewport: 1'].disableMultipleColors()

最佳答案

如果您正在寻找应力图可视化之类的东西,则必须编写自己的 FieldOutput 数据。将数据直接输出到外部可视化器通常更容易,但在 Abaqus 中也可以(如果不是有点复杂的话)执行此操作。

一般的流程是这样的:

  1. 生成一个FieldOutput对象;语法是 FO = odbModel.steps.values()[-1].frames[-1].FieldOutput(name=data_name, description=data_description, type=SCALAR),其中

    • odbModel是一个打开的Odb对象,
    • steps.values()[-1] 或命名步骤 steps[...] 是您要输出到的步骤,
    • frames[-1] 是您要在此步骤中输出到的最后一帧(或您选择的一帧),
    • data_namedata_description 是字符串(对于应力等值线图,data_name 相当于标签 S在 odb 输出中)
    • SCALAR 是来自 abaqusConstants 模块的参数
  2. 获取 rootAssembly.instance 对象,以及它们的关联元素 elementSetsectionAssignment,它们具有指向 section 与具有 density 属性的 material

  3. 使用 addData 命令更新 FieldOutput 对象;语法是 addData(position=CENTROID, instance=instance, labels=labels, data=data)
    • CENTROID 是来自 abaqusConstants 模块的参数(假设您只想在元素质心处获得元素密度;您也可以将它们粘贴在积分点上,如果您真的很想要)
    • instance 是与元素集相关联的实例(或者更一般地,分配给该 Material 的 region)
    • labels 是整数的可迭代(listtuple),指定数据要用于的关联实例的元素标签写于
    • datafloat 的可迭代对象的可迭代对象,用于指定数据。在您的情况下,单个密度值意味着 data 是长度为 1 的可迭代对象的可迭代对象,每个可迭代对象包含一个密度值。 data的长度必须等于labels的长度,因为data的每个成员都与elementLabel完全对应> 在 labels 中的相同位置。

下面的示例脚本(警告:强烈建议备份 .odb 以防出现问题)

import odbAccess
from abaqusConstants import SCALAR, CENTROID # Import constants

odbModel = odbAccess.openOdb(odb_file_path) # Put the file path of the `odb` in odb_file_path

FO = odbModel.steps.values()[-1].frames[-1].FieldOutput(name='Density', description='', type=SCALAR)

# Loop through `rootAssembly.instances`
for instance in odbModel.rootAssembly.instances.values():

valid_materials = [] # Valid material names which have `density`

# Loop through `instance.sectionAssignments` to check if the associated `section` has a `material` with the attribute `density`
for i in range(len(instance.sectionAssignments)):
sectionName = instance.sectionAssignments[i].sectionName
matName = odbModel.sections[sectionName].material
if hasattr(odbModel.materials[matName], 'density'):
valid_materials.append(matName)

sectionNames = [] # Build list of valid section names which are associated with a material which has the attribute `density`

for s in odbModel.sections.values():
if s.material in valid_materials:
sectionNames.append(s.name)

if sectionNames:

# Loop through `sectionAssignments` and get all the `elementLabels` in the `region` of the `sectionAssignment`
for sa in instance.sectionAssignments:
sa_labels = []
if sa.sectionName in sectionNames:

# Get labels
if sa.region.elements is not None:
for e in sa.region.elements:
sa_labels.append(e.label)

# Get material
matName = odbModel.sections[sa.sectionName].material
sa_data = [(odbModel.materials[matName].density.table[0][0],)]*len(sa_labels)

# Update `fieldOutput` object
FO.addData(position=CENTROID, instance=instance, labels=sa_labels, data=sa_data)

# Save odb model. The FieldOutput object only exists as reference from `FO` unless the odb model is saved.
odbModel.save()
odbModel.close()
odbModel = odbAccess.openOdb(odb_file_path) # Reopen the model for visualisation. If you can't find the data_name in the list, expand the model to the step and frame for which the data is saved.

我不使用密度,但这是一个模型的杨氏模量输出示例,该模型将两种 Material 分配给各种元素。

enter image description here

关于python - Abaqus 可视化密度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49509158/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com