Getting Element Density From Abaqus Output Database Using Python Scripting
Solution 1:
Found a solution, I don't know if it's the fastest but it works:
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])
note: the 'name' attribute will give you a string like, 'solid MATERIALNAME'. So I just cut out the part of the string that gave me the real material name. So it's the sectionCategory attribute of an OdbElementObject that is the answer.
EDIT: This doesn't seem to work after all, it turns out that it gives all elements the same material name, being the name of the first material.
Solution 2:
The properties are associated something like this:
sectionAssignmentconnectssectiontosetsetis the container forelementsectionconnectssectionAssignmenttomaterialinstanceis connected topart(could be from a part from another model)partis connected tomodelmodelis connected tosection
Use the .inp or .cae file if you can. The following gets it from an opened cae file. To thoroughly get elements from materials, you would do something like the following, assuming you're starting your search in rootAssembly.instances:
- Find the
partswhich theinstanceswere created from. - Find the
modelswhich contain theseparts. - Look for all
sectionswithmaterial_namein theseparts, and store all thesectionNamesassociated with this section - Look for all
sectionAssignmentswhich references thesesectionNames - Under each of these
sectionAssignments, there is an associatedregionobject which has the name (as a string) of anelementSetand the name of apart. Get all theelementsfrom thiselementSetin thispart.
Cleanup:
- Use the Python
setobject to remove any multiple references to the same element. - Multiply the number of elements in this set by the number of identical part instances that refer to this material in
rootAssembly.
E.g., for some cae model variable called 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)] += 1continueexcept 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])
Finally, grab the material density associated with material_name then multiply it by num_elements_with_material.
Of course, this method will be extremely slow for larger models, and it is more advisable to use string techniques on the .inp file for faster performance.
Post a Comment for "Getting Element Density From Abaqus Output Database Using Python Scripting"