FEM: meshtools, add generic method to return femmesh type

This commit is contained in:
Bernd Hahnebach
2021-07-29 18:18:34 +02:00
parent e6a6ac3725
commit ff5509f855
2 changed files with 84 additions and 57 deletions

View File

@@ -555,60 +555,19 @@ def get_z88_element_type(
femmesh, femmesh,
femelement_table=None femelement_table=None
): ):
if not femmesh: return z88_ele_types[meshtools.get_femmesh_eletype(femmesh, femelement_table)]
Console.PrintError("Error: No femmesh.\n")
if not femelement_table:
Console.PrintError("The femelement_table need to be calculated.\n") z88_ele_types = {
femelement_table = meshtools.get_femelement_table(femmesh) "tetra4": 17,
# in some cases lowest key in femelement_table is not [1] "tetra10": 16,
for elem in sorted(femelement_table): "hexa8": 1,
elem_length = len(femelement_table[elem]) "hexa20": 10,
Console.PrintLog("Node count of first element: {}\n".format(elem_length)) "tria3": 0,
break # break after the first elem "tria6": 24,
if meshtools.is_solid_femmesh(femmesh): "quad4": 0,
if femmesh.TetraCount == femmesh.VolumeCount: "quad8": 23,
if elem_length == 4: "seg2": 4,
return 17 "seg3": 4,
elif elem_length == 10: "None": 0,
return 16 }
else:
Console.PrintMessage("Tetra with neither 4 nor 10 nodes.\n")
elif femmesh.HexaCount == femmesh.VolumeCount:
if elem_length == 8:
return 1
elif elem_length == 20:
return 10
else:
Console.PrintError("Hexa with neither 8 nor 20 nodes.\n")
return 0
else:
Console.PrintError("no tetra, no hexa or Mixed Volume Elements.\n")
elif meshtools.is_face_femmesh(femmesh):
if femmesh.TriangleCount == femmesh.FaceCount:
if elem_length == 3:
Console.PrintError("tria3mesh, not supported by Z88.\n")
return 0
elif elem_length == 6:
return 24
else:
Console.PrintError("Tria with neither 3 nor 6 nodes.\n")
return 0
elif femmesh.QuadrangleCount == femmesh.FaceCount:
if elem_length == 4:
Console.PrintError("quad4mesh, not supported by Z88.\n")
return 0
elif elem_length == 8:
return 23
else:
Console.PrintError("Quad with neither 4 nor 8 nodes.\n")
return 0
else:
Console.PrintError("no tria, no quad\n")
return 0
elif meshtools.is_edge_femmesh(femmesh):
Console.PrintMessage("Edge femmesh will be exported as 3D truss element nr 4.\n")
return 4
else:
Console.PrintError("Neither edge nor face nor solid femmesh.\n")
return 0
return 0

View File

@@ -2193,6 +2193,74 @@ def is_zplane_2D_mesh(
return False return False
# ************************************************************************************************
def get_femmesh_eletype(
femmesh,
femelement_table=None
):
if not femmesh:
FreeCAD.Console.PrintError("Error: No femmesh.\n")
if not femelement_table:
FreeCAD.Console.PrintError("The femelement_table need to be calculated.\n")
femelement_table = get_femelement_table(femmesh)
# in some cases lowest key in femelement_table is not [1]
for elem in sorted(femelement_table):
elem_length = len(femelement_table[elem])
FreeCAD.Console.PrintLog("Node count of first element: {}\n".format(elem_length))
break # break after the first elem
if is_solid_femmesh(femmesh):
if femmesh.TetraCount == femmesh.VolumeCount:
if elem_length == 4:
return "tetra4"
elif elem_length == 10:
return "tetra10"
else:
FreeCAD.Console.PrintMessage("Tetra with neither 4 nor 10 nodes.\n")
return "None"
elif femmesh.HexaCount == femmesh.VolumeCount:
if elem_length == 8:
return "hexa8"
elif elem_length == 20:
return "hexa20"
else:
FreeCAD.Console.PrintError("Hexa with neither 8 nor 20 nodes.\n")
return "None"
else:
FreeCAD.Console.PrintError("no tetra, no hexa or Mixed Volume Elements.\n")
elif is_face_femmesh(femmesh):
if femmesh.TriangleCount == femmesh.FaceCount:
if elem_length == 3:
return "tria3"
elif elem_length == 6:
return "tria6"
else:
FreeCAD.Console.PrintError("Tria with neither 3 nor 6 nodes.\n")
return "None"
elif femmesh.QuadrangleCount == femmesh.FaceCount:
if elem_length == 4:
return "quad4"
elif elem_length == 8:
return "quad8"
else:
FreeCAD.Console.PrintError("Quad with neither 4 nor 8 nodes.\n")
return "None"
else:
FreeCAD.Console.PrintError("no tria, no quad\n")
return "None"
elif is_edge_femmesh(femmesh):
if elem_length == 3:
return "seg2"
elif elem_length == 6:
return "seg3"
else:
FreeCAD.Console.PrintError("Seg with neither 2 nor 3 nodes.\n")
return "None"
else:
FreeCAD.Console.PrintError("Neither edge nor face nor solid femmesh.\n")
return "None"
return "None"
# ************************************************************************************************ # ************************************************************************************************
def get_three_non_colinear_nodes( def get_three_non_colinear_nodes(
nodes_coords nodes_coords