FEM: input writer, use own element table for each shape type

This commit is contained in:
Bernd Hahnebach
2018-02-09 22:26:04 +01:00
committed by wmayer
parent 5d5d71cf8e
commit 45f3eb7f4d
2 changed files with 53 additions and 20 deletions

View File

@@ -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 : [[], [], ...], ...}

View File

@@ -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)
## @}