FEM: mesh tools and input writer, better debug print messages

This commit is contained in:
Bernd Hahnebach
2017-11-29 11:10:20 +01:00
parent c21baa8a69
commit 0f6edeccea
2 changed files with 19 additions and 2 deletions

View File

@@ -86,6 +86,7 @@ class FemInputWriter():
def get_constraints_fixed_nodes(self):
# get nodes
for femobj in self.fixed_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
print("Constraint fixed: " + femobj['Object'].Name)
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
# add nodes to constraint_conflict_nodes, needed by constraint plane rotation
for node in femobj['Nodes']:
@@ -94,6 +95,7 @@ class FemInputWriter():
def get_constraints_displacement_nodes(self):
# get nodes
for femobj in self.displacement_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
print("Constraint displacement: " + femobj['Object'].Name)
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
# add nodes to constraint_conflict_nodes, needed by constraint plane rotation
for node in femobj['Nodes']:
@@ -102,26 +104,31 @@ class FemInputWriter():
def get_constraints_planerotation_nodes(self):
# get nodes
for femobj in self.planerotation_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
print("Constraint plane rotation: " + femobj['Object'].Name)
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
def get_constraints_transform_nodes(self):
# get nodes
for femobj in self.transform_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
print("Constraint transform nodes: " + femobj['Object'].Name)
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
def get_constraints_temperature_nodes(self):
# get nodes
for femobj in self.temperature_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
print("Constraint temperature: " + femobj['Object'].Name)
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
def get_constraints_fluidsection_nodes(self):
# get nodes
for femobj in self.fluidsection_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
print("Constraint fluid section: " + femobj['Object'].Name)
femobj['Nodes'] = FemMeshTools.get_femnodes_by_femobj_with_references(self.femmesh, femobj)
def get_constraints_force_nodeloads(self):
# check shape type of reference shape
for femobj in self.force_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
print("Constraint force: " + femobj['Object'].Name)
frc_obj = femobj['Object']
if femobj['RefShapeType'] == 'Vertex':
# print("load on vertices --> we do not need the femelement_table and femnodes_mesh for node load calculation")
@@ -167,6 +174,7 @@ class FemInputWriter():
self.femnodes_ele_table = FemMeshTools.get_femnodes_ele_table(self.femnodes_mesh, self.femelement_table)
for femobj in self.pressure_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
print("Constraint pressure: " + femobj['Object'].Name)
pressure_faces = FemMeshTools.get_pressure_obj_faces(self.femmesh, self.femelement_table, self.femnodes_ele_table, femobj)
# print(len(pressure_faces))
femobj['PressureFaces'] = [(femobj['Object'].Name + ': face load', pressure_faces)]
@@ -174,18 +182,21 @@ class FemInputWriter():
def get_element_geometry2D_elements(self):
# get element ids and write them into the objects
print("Shell thicknesses")
if not self.femelement_table:
self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.shellthickness_objects)
def get_element_geometry1D_elements(self):
# get element ids and write them into the objects
print("Beam sections")
if not self.femelement_table:
self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.beamsection_objects)
def get_element_fluid1D_elements(self):
# get element ids and write them into the objects
print("Fluid sections")
if not self.femelement_table:
self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.fluidsection_objects)
@@ -193,6 +204,7 @@ class FemInputWriter():
def get_material_elements(self):
# it only works if either Volumes or Shellthicknesses or Beamsections are in the material objects
# it means it does not work for mixed meshes and multiple materials, this is checked in check_prerequisites
print("Materials")
if self.femmesh.Volumes:
# we only could do this for volumes, if a mesh contains volumes we're going to use them in the analysis
# but a mesh could contain the element faces of the volumes as faces and the edges of the faces as edges,

View File

@@ -35,9 +35,13 @@ def get_femnodes_by_femobj_with_references(femmesh, femobj):
if femmesh.GroupCount:
node_set = get_femmesh_groupdata_sets_by_name(femmesh, femobj, 'Node')
# print('node_set_group: ', node_set)
if node_set:
print(" nodes where retrieved from existent FEM mesh group data")
if not node_set:
print(" nodes will be retrieved by searching the appropriate nodes in the FEM mesh")
node_set = get_femnodes_by_references(femmesh, femobj['Object'].References)
# print('node_set_nogroup: ', node_set)
return node_set
@@ -73,7 +77,7 @@ def get_femnodes_by_refshape(femmesh, ref):
nodes = []
for refelement in ref[1]:
r = get_element(ref[0], refelement) # the method getElement(element) does not return Solid elements
print(' ReferenceShape : ', r.ShapeType, ', ', ref[0].Name, ', ', ref[0].Label, ' --> ', refelement)
print(' ReferenceShape ... Type: ' + r.ShapeType + ', Object name: ' + ref[0].Name + ', Object label: ' + ref[0].Label + ', Element name: ' + refelement)
if r.ShapeType == 'Vertex':
nodes += femmesh.getNodesByVertex(r)
elif r.ShapeType == 'Edge':
@@ -332,6 +336,7 @@ def get_femelement_sets(femmesh, femelement_table, fem_objects, femnodes_ele_tab
has_remaining_femelements = None
for fem_object_i, fem_object in enumerate(fem_objects):
obj = fem_object['Object']
print("Constraint: " + obj.Name + " --> " + "We gone search in the mesh for the element ID's.")
fem_object['ShortName'] = get_elset_short_name(obj, fem_object_i) # unique short identifier
if obj.References:
ref_shape_femelements = []
@@ -369,7 +374,6 @@ def get_femmesh_groupdata_sets_by_name(femmesh, fem_object, group_data_type):
if grp_name.startswith(obj.Name + "_"):
if femmesh.getGroupElementType(g) == group_data_type:
print(" found mesh group for the IDs: " + grp_name + ', Type: ' + group_data_type)
# print("Constraint: " + obj.Name + " --> " + "IDs are in mesh group: " + grp_name)
return femmesh.getGroupElements(g) # == ref_shape_femelements
return () # an empty tuple is returned if no group data IDs where found
@@ -380,6 +384,7 @@ def get_femelement_sets_from_group_data(femmesh, fem_objects):
sum_group_elements = []
for fem_object_i, fem_object in enumerate(fem_objects):
obj = fem_object['Object']
print("Constraint: " + obj.Name + " --> " + "We have mesh groups. We will search for appropriate group data.")
fem_object['ShortName'] = get_elset_short_name(obj, fem_object_i) # unique short identifier
group_elements = get_femmesh_groupdata_sets_by_name(femmesh, fem_object, 'Volume') # see comments over there !
sum_group_elements += group_elements