From 45f3eb7f4dbfd4f364af52950293f9a7cef2561c Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Fri, 9 Feb 2018 22:26:04 +0100 Subject: [PATCH] FEM: input writer, use own element table for each shape type --- src/Mod/Fem/femmesh/meshtools.py | 28 ++++++++++++++++++ src/Mod/Fem/femsolver/writerbase.py | 45 ++++++++++++++++------------- 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/Mod/Fem/femmesh/meshtools.py b/src/Mod/Fem/femmesh/meshtools.py index e4d116783a..cf73c60d43 100644 --- a/src/Mod/Fem/femmesh/meshtools.py +++ b/src/Mod/Fem/femmesh/meshtools.py @@ -108,6 +108,34 @@ def get_femelement_table(femmesh): return femelement_table +def get_femelement_volumes_table(femmesh): + """ get_femelement_volumes_table(femmesh): { elementid : [ nodeid, nodeid, ... , nodeid ] }""" + table = {} + for i in femmesh.Volumes: + table[i] = femmesh.getElementNodes(i) + return table + + +def get_femelement_faces_table(femmesh, faces_only=None): + """ get_femelement_faces_table(femmesh): { elementid : [ nodeid, nodeid, ... , nodeid ] }""" + table = {} + if not faces_only: + faces_only = femmesh.FacesOnly + for i in faces_only: + table[i] = femmesh.getElementNodes(i) + return table + + +def get_femelement_edges_table(femmesh, edges_only=None): + """ get_femelement_edges_table(femmesh): { elementid : [ nodeid, nodeid, ... , nodeid ] }""" + table = {} + if not edges_only: + edges_only = femmesh.EdgesOnly + for i in edges_only: + table[i] = femmesh.getElementNodes(i) + return table + + def get_femnodes_ele_table(femnodes_mesh, femelement_table): '''the femnodes_ele_table contains for each node its membership in elements {nodeID : [[eleID, NodePosition], [], ...], nodeID : [[], [], ...], ...} diff --git a/src/Mod/Fem/femsolver/writerbase.py b/src/Mod/Fem/femsolver/writerbase.py index 38a4c10175..9444c10ab7 100644 --- a/src/Mod/Fem/femsolver/writerbase.py +++ b/src/Mod/Fem/femsolver/writerbase.py @@ -87,6 +87,11 @@ class FemInputWriter(): self.femelement_table = {} self.constraint_conflict_nodes = [] self.femnodes_ele_table = {} + self.femelements_edges_only = [] + self.femelements_faces_only = [] + self.femelement_volumes_table = {} + self.femelement_faces_table = {} + self.femelement_edges_table = {} def get_constraints_fixed_nodes(self): # get nodes @@ -189,30 +194,30 @@ class FemInputWriter(): def get_element_geometry2D_elements(self): # get element ids and write them into the objects FreeCAD.Console.PrintMessage('Shell thicknesses\n') - 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) + if not self.femelement_faces_table: + self.femelement_faces_table = FemMeshTools.get_femelement_faces_table(self.femmesh) + FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_faces_table, self.shellthickness_objects) def get_element_geometry1D_elements(self): # get element ids and write them into the objects FreeCAD.Console.PrintMessage('Beam sections\n') - 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) + if not self.femelement_edges_table: + self.femelement_edges_table = FemMeshTools.get_femelement_edges_table(self.femmesh) + FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_edges_table, self.beamsection_objects) def get_element_rotation1D_elements(self): # get for each geometry edge direction the element ids and rotation norma FreeCAD.Console.PrintMessage('Beam rotations\n') - if not self.femelement_table: - self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh) - FemMeshTools.get_femelement_direction1D_set(self.femmesh, self.femelement_table, self.beamrotation_objects, self.theshape) + if not self.femelement_edges_table: + self.femelement_edges_table = FemMeshTools.get_femelement_edges_table(self.femmesh) + FemMeshTools.get_femelement_direction1D_set(self.femmesh, self.femelement_edges_table, self.beamrotation_objects, self.theshape) def get_element_fluid1D_elements(self): # get element ids and write them into the objects FreeCAD.Console.PrintMessage('Fluid sections\n') - 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) + if not self.femelement_edges_table: + self.femelement_edges_table = FemMeshTools.get_femelement_edges_table(self.femmesh) + FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_edges_table, self.fluidsection_objects) def get_material_elements(self): # it only works if either Volumes or Shellthicknesses or Beamsections are in the material objects @@ -228,8 +233,8 @@ class FemInputWriter(): FreeCAD.Console.PrintMessage(all_found) FreeCAD.Console.PrintMessage('\n') if all_found is False: - if not self.femelement_table: - self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh) + if not self.femelement_volumes_table: + self.femelement_volumes_table = FemMeshTools.get_femelement_volumes_table(self.femmesh) # we're going to use the binary search for get_femelements_by_femnodes() # thus we need the parameter values self.femnodes_ele_table if not self.femnodes_mesh: @@ -238,12 +243,12 @@ class FemInputWriter(): self.femnodes_ele_table = FemMeshTools.get_femnodes_ele_table(self.femnodes_mesh, self.femelement_table) FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects, self.femnodes_ele_table) if self.shellthickness_objects: - if not self.femelement_table: - self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh) - FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects) + if not self.femelement_faces_table: + self.femelement_faces_table = FemMeshTools.get_femelement_faces_table(self.femmesh) + FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_faces_table, self.material_objects) if self.beamsection_objects or self.fluidsection_objects: - if not self.femelement_table: - self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh) - FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects) + if not self.femelement_edges_table: + self.femelement_edges_table = FemMeshTools.get_femelement_edges_table(self.femmesh) + FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_edges_table, self.material_objects) ## @}