使用python脚本

时间:2018-03-18 10:26:27

标签: python abaqus

我正在尝试从abaqus输出数据库中获取元素密度。我知道您可以使用'EVOL'为卷请求字段输出,密度可能类似吗?

我担心这不是因为:Getting element mass in Abaqus postprocessor

获得密度的最有效方法是什么?查找设置部分的每个元素?

2 个答案:

答案 0 :(得分:1)

找到了一个解决方案,我不知道它是否最快但是有效:

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'的字符串。所以我只剪出了给我真正材料名称的字符串部分。所以它是作为答案的OdbElementObject的sectionCategory属性。

编辑:这似乎不起作用,事实证明它给所有元素提供了相同的材料名称,作为第一种材料的名称。

答案 1 :(得分:0)

属性与此类似:

  • sectionAssignmentsectionset
  • 联系起来
  • setelement
  • 的容器
  • sectionsectionAssignmentmaterial
  • 联系起来
  • instance已与part相关联(可能来自其他模特的部分)
  • part已与model
  • 相关联
  • model已与section
  • 相关联

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

  1. 找到parts创建的instances
  2. 找到包含这些models。{/ li>的parts
  3. 在这些sections中查找material_name的所有parts,并存储与此部分相关的所有sectionNames
  4. 查找引用这些sectionAssignments
  5. 的所有sectionNames
  6. 在每个sectionAssignments下,都有一个关联的region对象,其中elementSet的名称(字符串)和part的名称。从此elements
  7. 获取此elementSet中的所有part

    清理:

    1. 使用Python set对象删除对同一元素的任何多个引用。
    2. 将此集合中的元素数乘以rootAssembly中引用此材料的相同零件实例的数量。
    3. ,例如,对于名为cae的某些model模型变量:

      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相关联的材料密度,然后乘以num_elements_with_material

      当然,对于较大的模型,此方法将非常慢,并且建议在.inp文件上使用字符串技术以提高性能。