使用 python 脚本从 abaqus 输出数据库获取元素密度
Getting element density from abaqus output database using python scripting
我正在尝试从 abaqus 输出数据库中获取元素密度。我知道您可以使用 'EVOL' 请求体积的现场输出,密度是否可能类似?
恐怕不是因为这个:Getting element mass in Abaqus postprocessor
获得密度的最有效方法是什么?查找每个元素在哪个节集中?
已找到解决方案,我不知道它是否是最快的但它有效:
odb_file_path=r'your_path\file.odb'
odb = session.openOdb(name=odb_file_path)
instance = odb.rootAssembly.instances['MY_PART']
material_name = instance.elements[0].sectionCategory.name[8:-2]
density=odb.materials[material_name].density.table[0][0])
注意:'name' 属性将为您提供类似 'solid MATERIALNAME' 的字符串。所以我只是删掉了字符串中给我真正的 material 名字的部分。所以答案是 OdbElementObject 的 sectionCategory 属性。
编辑:这似乎不管用,事实证明它赋予所有元素相同的 material 名称,即第一个 material.[=11= 的名称]
属性关联如下:
sectionAssignment
将 section
连接到 set
set
是 element
的容器
section
将 sectionAssignment
连接到 material
instance
连接到 part
(可能来自另一个模型的零件)
part
连接到 model
model
连接到 section
如果可以,请使用 .inp
或 .cae
文件。下面从打开的 cae
文件中获取它。要从 materials
彻底获取 elements
,您可以执行以下操作,假设您在 rootAssembly.instances
中开始搜索:
- 找到创建
instances
的 parts
。
- 找到包含这些
parts
的models
。
- 在这些
parts
中查找所有 sections
和 material_name
,并存储与此部分关联的所有 sectionNames
- 查找所有引用这些
sectionNames
的 sectionAssignments
- 在每个
sectionAssignments
下,都有一个关联的 region
对象,它具有 elementSet
的名称(作为字符串)和 [=20= 的名称].在这个 part
. 中从这个 elementSet
得到所有的 elements
清理:
- 使用 Python
set
对象删除对同一元素的任何多个引用。
- 将此集合中的元素数量乘以在
rootAssembly
中引用此 material 的相同部分实例的数量。
例如,对于一些名为 model
的 cae
模型变量:
model_part_repeats = {}
model_part_elemLabels = {}
for instance in model.rootAssembly.instances.values():
p = instance.part.name
m = instance.part.modelName
try:
model_part_repeats[(m, p)] += 1
continue
except KeyError:
model_part_repeats[(m, p)] = 1
# Get all sections in model
sectionNames = []
for s in mdb.models[m].sections.values():
if s.material == material_name: # material_name is already known
# This is a valid section - search for section assignments
# in part for this section, and then the associated set
sectionNames.append(s.name)
if sectionNames:
labels = []
for sa in mdb.models[m].parts[p].sectionAssignments:
if sa.sectionName in sectionNames:
eset = sa.region[0]
labels = labels + [e.label for e in mdb.models[m].parts[p].sets[eset].elements]
labels = list(set(labels))
model_part_elemLabels[(m,p)] = labels
else:
model_part_elemLabels[(m,p)] = []
num_elements_with_material = sum([model_part_repeats[k]*len(model_part_elemLabels[k]) for k in model_part_repeats])
最后,获取与 material_name
关联的 material 密度,然后将其乘以 num_elements_with_material
。
当然,对于较大的模型,这种方法会非常慢,更建议在 .inp
文件上使用字符串技术以获得更快的性能。
我正在尝试从 abaqus 输出数据库中获取元素密度。我知道您可以使用 'EVOL' 请求体积的现场输出,密度是否可能类似?
恐怕不是因为这个:Getting element mass in Abaqus postprocessor
获得密度的最有效方法是什么?查找每个元素在哪个节集中?
已找到解决方案,我不知道它是否是最快的但它有效:
odb_file_path=r'your_path\file.odb'
odb = session.openOdb(name=odb_file_path)
instance = odb.rootAssembly.instances['MY_PART']
material_name = instance.elements[0].sectionCategory.name[8:-2]
density=odb.materials[material_name].density.table[0][0])
注意:'name' 属性将为您提供类似 'solid MATERIALNAME' 的字符串。所以我只是删掉了字符串中给我真正的 material 名字的部分。所以答案是 OdbElementObject 的 sectionCategory 属性。
编辑:这似乎不管用,事实证明它赋予所有元素相同的 material 名称,即第一个 material.[=11= 的名称]
属性关联如下:
sectionAssignment
将section
连接到set
set
是element
的容器
section
将sectionAssignment
连接到material
instance
连接到part
(可能来自另一个模型的零件)part
连接到model
model
连接到section
如果可以,请使用 .inp
或 .cae
文件。下面从打开的 cae
文件中获取它。要从 materials
彻底获取 elements
,您可以执行以下操作,假设您在 rootAssembly.instances
中开始搜索:
- 找到创建
instances
的parts
。 - 找到包含这些
parts
的models
。 - 在这些
parts
中查找所有sections
和material_name
,并存储与此部分关联的所有sectionNames
- 查找所有引用这些
sectionNames
的 - 在每个
sectionAssignments
下,都有一个关联的region
对象,它具有elementSet
的名称(作为字符串)和 [=20= 的名称].在这个part
. 中从这个
sectionAssignments
elementSet
得到所有的 elements
清理:
- 使用 Python
set
对象删除对同一元素的任何多个引用。 - 将此集合中的元素数量乘以在
rootAssembly
中引用此 material 的相同部分实例的数量。
例如,对于一些名为 model
的 cae
模型变量:
model_part_repeats = {}
model_part_elemLabels = {}
for instance in model.rootAssembly.instances.values():
p = instance.part.name
m = instance.part.modelName
try:
model_part_repeats[(m, p)] += 1
continue
except KeyError:
model_part_repeats[(m, p)] = 1
# Get all sections in model
sectionNames = []
for s in mdb.models[m].sections.values():
if s.material == material_name: # material_name is already known
# This is a valid section - search for section assignments
# in part for this section, and then the associated set
sectionNames.append(s.name)
if sectionNames:
labels = []
for sa in mdb.models[m].parts[p].sectionAssignments:
if sa.sectionName in sectionNames:
eset = sa.region[0]
labels = labels + [e.label for e in mdb.models[m].parts[p].sets[eset].elements]
labels = list(set(labels))
model_part_elemLabels[(m,p)] = labels
else:
model_part_elemLabels[(m,p)] = []
num_elements_with_material = sum([model_part_repeats[k]*len(model_part_elemLabels[k]) for k in model_part_repeats])
最后,获取与 material_name
关联的 material 密度,然后将其乘以 num_elements_with_material
。
当然,对于较大的模型,这种方法会非常慢,更建议在 .inp
文件上使用字符串技术以获得更快的性能。