使用 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= 的名称]

属性关联如下:

  • sectionAssignmentsection 连接到 set
  • setelement
  • 的容器
  • sectionsectionAssignment 连接到 material
  • instance 连接到 part(可能来自另一个模型的零件)
  • part 连接到 model
  • model 连接到 section

如果可以,请使用 .inp.cae 文件。下面从打开的 cae 文件中获取它。要从 materials 彻底获取 elements,您可以执行以下操作,假设您在 rootAssembly.instances 中开始搜索:

  1. 找到创建 instancesparts
  2. 找到包含这些partsmodels
  3. 在这些 parts 中查找所有 sectionsmaterial_name,并存储与此部分关联的所有 sectionNames
  4. 查找所有引用这些 sectionNames
  5. sectionAssignments
  6. 在每个 sectionAssignments 下,都有一个关联的 region 对象,它具有 elementSet 的名称(作为字符串)和 [=20= 的名称].在这个 part.
  7. 中从这个 elementSet 得到所有的 elements

清理:

  1. 使用 Python set 对象删除对同一元素的任何多个引用。
  2. 将此集合中的元素数量乘以在 rootAssembly 中引用此 material 的相同部分实例的数量。

例如,对于一些名为 modelcae 模型变量:

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 文件上使用字符串技术以获得更快的性能。