Skip to content

Commit

Permalink
FEM: use generic get_elset methods in CalculiX file writer
Browse files Browse the repository at this point in the history
  • Loading branch information
berndhahnebach committed Oct 9, 2015
1 parent 6ece757 commit b51155e
Showing 1 changed file with 60 additions and 96 deletions.
156 changes: 60 additions & 96 deletions src/Mod/Fem/ccxInpWriter.py
Expand Up @@ -511,7 +511,7 @@ def get_ccx_elsets_single_mat_solid(self):

def get_ccx_elsets_single_mat_multiple_beam(self):
mat_obj = self.material_objects[0]['Object']
self.get_beamsection_element_sets()
self.get_femelement_sets(self.beamsection_objects)
for beamsec_data in self.beamsection_objects:
beamsec_obj = beamsec_data['Object']
ccx_elset = {}
Expand All @@ -524,7 +524,7 @@ def get_ccx_elsets_single_mat_multiple_beam(self):

def get_ccx_elsets_single_mat_multiple_shell(self):
mat_obj = self.material_objects[0]['Object']
self.get_shellthickness_element_sets()
self.get_femelement_sets(self.shellthickness_objects)
for shellth_data in self.shellthickness_objects:
shellth_obj = shellth_data['Object']
ccx_elset = {}
Expand All @@ -537,7 +537,7 @@ def get_ccx_elsets_single_mat_multiple_shell(self):

def get_ccx_elsets_multiple_mat_single_beam(self):
beamsec_obj = self.beamsection_objects[0]['Object']
self.get_material_element_sets()
self.get_femelement_sets(self.material_objects)
for mat_data in self.material_objects:
mat_obj = mat_data['Object']
ccx_elset = {}
Expand All @@ -550,7 +550,7 @@ def get_ccx_elsets_multiple_mat_single_beam(self):

def get_ccx_elsets_multiple_mat_single_shell(self):
shellth_obj = self.shellthickness_objects[0]['Object']
self.get_material_element_sets()
self.get_femelement_sets(self.material_objects)
for mat_data in self.material_objects:
mat_obj = mat_data['Object']
ccx_elset = {}
Expand All @@ -562,7 +562,7 @@ def get_ccx_elsets_multiple_mat_single_shell(self):
self.ccx_elsets.append(ccx_elset)

def get_ccx_elsets_multiple_mat_solid(self):
self.get_material_element_sets()
self.get_femelement_sets(self.material_objects)
for mat_data in self.material_objects:
mat_obj = mat_data['Object']
ccx_elset = {}
Expand All @@ -573,8 +573,8 @@ def get_ccx_elsets_multiple_mat_solid(self):
self.ccx_elsets.append(ccx_elset)

def get_ccx_elsets_multiple_mat_multiple_beam(self):
self.get_beamsection_element_sets()
self.get_material_element_sets()
self.get_femelement_sets(self.beamsection_objects)
self.get_femelement_sets(self.material_objects)
for beamsec_data in self.beamsection_objects:
beamsec_obj = beamsec_data['Object']
for mat_data in self.material_objects:
Expand All @@ -592,8 +592,8 @@ def get_ccx_elsets_multiple_mat_multiple_beam(self):
self.ccx_elsets.append(ccx_elset)

def get_ccx_elsets_multiple_mat_multiple_shell(self):
self.get_shellthickness_element_sets()
self.get_material_element_sets()
self.get_femelement_sets(self.shellthickness_objects)
self.get_femelement_sets(self.material_objects)
for shellth_data in self.shellthickness_objects:
shellth_obj = shellth_data['Object']
for mat_data in self.material_objects:
Expand All @@ -610,102 +610,55 @@ def get_ccx_elsets_multiple_mat_multiple_shell(self):
ccx_elset['ccx_mat_name'] = mat_obj.Material['Name'][:80]
self.ccx_elsets.append(ccx_elset)

def get_material_element_sets(self):
# get femelements for reference shapes of each material_obj
FreeCAD.Console.PrintError('Multiple materials defined, this could result in a broken CalculiX input file!\n')
# TODO get the elset nodeids and write them to mat_data['FEMElements']
# if not hasattr(self, 'fem_element_table'):
# self.fem_element_table = getFemElementTable(self.mesh_object.FemMesh)
for mat_data_i, mat_data in enumerate(self.material_objects):
mat_data['ShortName'] = 'Mat' + str(mat_data_i) # unique short ccx_identifier
# mat_obj = mat_data['Object']
mat_data['FEMElements'] = self.ccx_eall

def get_beamsection_element_sets(self):
# get femelements for reference shapes of each beamsec_obj
def get_femelement_sets(self, fem_objects):
# get femelements for reference shapes of each obj.References
if not hasattr(self, 'fem_element_table'):
self.fem_element_table = getFemElementTable(self.mesh_object.FemMesh)
count_femelements_beamsection = 0
referenced_femelements_beamsection = []
has_remaining_femelements_beamsection = None
for beamsec_data_i, beamsec_data in enumerate(self.beamsection_objects):
beamsec_data['ShortName'] = 'Beam' + str(beamsec_data_i) # unique short ccx_identifier
beamsec_obj = beamsec_data['Object']
if beamsec_obj.References:
count_femelements = 0
referenced_femelements = []
has_remaining_femelements = None
for fem_object_i, fem_object in enumerate(fem_objects):
obj = fem_object['Object']
fem_object['ShortName'] = get_ccx_elset_short_name(obj, fem_object_i) # unique short ccx_identifier
if obj.References:
ref_shape_femelements = []
for ref in beamsec_obj.References:
nodeids = []
elemids = []
for ref in obj.References:
femnodes = []
femelements = []
r = ref[0].Shape.getElement(ref[1])
print(' ReferenceShape : ', r.ShapeType, ', ', ref[0].Name, ', ', ref[0].Label, ' --> ', ref[1])
if r.ShapeType == 'Edge':
# print(' BeamSectionReferenceEdge : ', ref[0].Name, ', ', ref[0].Label, ' --> ', ref[1])
nodeids = self.mesh_object.FemMesh.getNodesByEdge(r)
elemids = getFemElementsByNodes(self.fem_element_table, nodeids)
else:
print(' No Edge, but BeamSection needs Edges as reference shapes!')
ref_shape_femelements += elemids
referenced_femelements_beamsection += elemids
count_femelements_beamsection += len(elemids)
beamsec_data['FEMElements'] = ref_shape_femelements
else:
has_remaining_femelements_beamsection = beamsec_obj.Name
# get remaining femelements for the beamsection objects
if has_remaining_femelements_beamsection:
remaining_femelements_beamsection = []
for elemid in self.fem_element_table:
if elemid not in referenced_femelements_beamsection:
remaining_femelements_beamsection.append(elemid)
count_femelements_beamsection += len(remaining_femelements_beamsection)
for beamsec_data in self.beamsection_objects:
beamsec_obj = beamsec_data['Object']
if beamsec_obj.Name == has_remaining_femelements_beamsection:
beamsec_data['FEMElements'] = sorted(remaining_femelements_beamsection)
# check if all worked out well
if not femelements_count_ok(self.fem_element_table, count_femelements_beamsection):
FreeCAD.Console.PrintError('Error in BeamSection -- > femelements_count_ok failed!\n')

def get_shellthickness_element_sets(self):
# get femelements for reference shapes of each shellth_obj
if not hasattr(self, 'fem_element_table'):
self.fem_element_table = getFemElementTable(self.mesh_object.FemMesh)
count_femelements_shellthickness = 0
referenced_femelements_shellthickness = []
has_remaining_femelements_shellthickness = None
for shellth_data_i, shellth_data in enumerate(self.shellthickness_objects):
shellth_data['ShortName'] = 'Shell' + str(shellth_data_i) # unique short ccx_identifier
shellth_obj = shellth_data['Object']
if shellth_obj.References:
ref_shape_femelements = []
for ref in shellth_obj.References:
nodeids = []
elemids = []
r = ref[0].Shape.getElement(ref[1])
if r.ShapeType == 'Face':
# print(' ShellThicknessReferenceFace : ', ref[0].Name, ', ', ref[0].Label, ' --> ', ref[1])
nodeids = self.mesh_object.FemMesh.getNodesByFace(r)
elemids = getFemElementsByNodes(self.fem_element_table, nodeids)
femnodes = self.mesh_object.FemMesh.getNodesByEdge(r)
elif r.ShapeType == 'Face':
femnodes = self.mesh_object.FemMesh.getNodesByFace(r)
elif r.ShapeType == 'Solid':
# femnodes = self.mesh_object.FemMesh.getNodesBySolid(r) --> TODO
FreeCAD.Console.PrintError('Solid Reference Shapes, CalculiX input file may be broken!\n')
fem_object['FEMElements'] = self.ccx_eall
return
else:
print(' No Face, but ShellThickness needs Faces as reference shapes!')
ref_shape_femelements += elemids
referenced_femelements_shellthickness += elemids
count_femelements_shellthickness += len(elemids)
shellth_data['FEMElements'] = ref_shape_femelements
print(' No Edge, Face or Solid as reference shapes!')
femelements = getFemElementsByNodes(self.fem_element_table, femnodes)
ref_shape_femelements += femelements
referenced_femelements += femelements
count_femelements += len(femelements)
fem_object['FEMElements'] = ref_shape_femelements
else:
has_remaining_femelements_shellthickness = shellth_obj.Name
# get remaining femelements for the shellthickness objects
if has_remaining_femelements_shellthickness:
remaining_femelements_shellthickness = []
has_remaining_femelements = obj.Name
# get remaining femelements for the fem_objects
if has_remaining_femelements:
remaining_femelements = []
for elemid in self.fem_element_table:
if elemid not in referenced_femelements_shellthickness:
remaining_femelements_shellthickness.append(elemid)
count_femelements_shellthickness += len(remaining_femelements_shellthickness)
for shellth_data in self.shellthickness_objects:
shellth_obj = shellth_data['Object']
if shellth_obj.Name == has_remaining_femelements_shellthickness:
shellth_data['FEMElements'] = sorted(remaining_femelements_shellthickness)
if elemid not in referenced_femelements:
remaining_femelements.append(elemid)
count_femelements += len(remaining_femelements)
for fem_object in fem_objects:
obj = fem_object['Object']
if obj.Name == has_remaining_femelements:
fem_object['FEMElements'] = sorted(remaining_femelements)
# check if all worked out well
if not femelements_count_ok(self.fem_element_table, count_femelements_shellthickness):
FreeCAD.Console.PrintError('Error in ShellThickness -- > femelements_count_ok failed!\n')
if not femelements_count_ok(self.fem_element_table, count_femelements):
FreeCAD.Console.PrintError('Error in get_femelement_sets -- > femelements_count_ok failed!\n')


# Helpers
Expand Down Expand Up @@ -812,3 +765,14 @@ def get_ccx_elset_solid_name(mat_name, solid_name=None, mat_short_name=None):
return mat_short_name + solid_name
else:
return mat_name + solid_name


def get_ccx_elset_short_name(obj, i):
if hasattr(obj, "Proxy") and obj.Proxy.Type == 'MechanicalMaterial':
return 'Mat' + str(i)
elif hasattr(obj, "Proxy") and obj.Proxy.Type == 'FemBeamSection':
return 'Beam' + str(i)
elif hasattr(obj, "Proxy") and obj.Proxy.Type == 'FemShellThickness':
return 'Shell' + str(i)
else:
print 'Error: ', obj.Name, ' --> ', obj.Proxy.Type

0 comments on commit b51155e

Please sign in to comment.