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,
femelement_table=None
):
if not femmesh:
Console.PrintError("Error: No femmesh.\n")
if not femelement_table:
Console.PrintError("The femelement_table need to be calculated.\n")
femelement_table = meshtools.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])
Console.PrintLog("Node count of first element: {}\n".format(elem_length))
break # break after the first elem
if meshtools.is_solid_femmesh(femmesh):
if femmesh.TetraCount == femmesh.VolumeCount:
if elem_length == 4:
return 17
elif elem_length == 10:
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
return z88_ele_types[meshtools.get_femmesh_eletype(femmesh, femelement_table)]
z88_ele_types = {
"tetra4": 17,
"tetra10": 16,
"hexa8": 1,
"hexa20": 10,
"tria3": 0,
"tria6": 24,
"quad4": 0,
"quad8": 23,
"seg2": 4,
"seg3": 4,
"None": 0,
}

View File

@@ -2193,6 +2193,74 @@ def is_zplane_2D_mesh(
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(
nodes_coords