Fem: Improve meshtools.get_ccx_elements* functions

This commit is contained in:
marioalexis
2025-08-28 11:13:39 -03:00
parent 4b11789f02
commit cbcb583102

View File

@@ -291,7 +291,9 @@ def get_ccxelement_faces_elements_from_binary_search(bit_pattern_dict):
return faces
def get_ccxelement_edges_from_binary_search(bit_pattern_dict):
def get_ccxelement_edges_from_binary_search(bit_pattern_dict, sets_getter):
shell_mode = sets_getter.solver_obj.ModelSpace == "3D"
offset = 2 if shell_mode else 0
tria3_mask = {0b011: 1, 0b110: 2, 0b101: 3}
tria6_mask = {0b001011: 1, 0b010110: 2, 0b100101: 3}
quad4_mask = {0b0011: 1, 0b0110: 2, 0b1100: 3, 0b1001: 4}
@@ -307,7 +309,7 @@ def get_ccxelement_edges_from_binary_search(bit_pattern_dict):
mask_dict = vol_dict[bit_pattern_dict[ele][0]]
for key in mask_dict:
if (key & bit_pattern_dict[ele][1]) == key:
faces.append([ele, mask_dict[key]])
faces.append([ele, mask_dict[key] + offset])
# print("EDGES:", faces)
FreeCAD.Console.PrintMessage(f"found Edges: {len(faces)}\n")
@@ -1502,9 +1504,66 @@ def get_ref_shape_node_sum_geom_table(node_geom_table):
# ************************************************************************************************
# ***** methods for retrieving element face sets *************************************************
# ***** charged faces ****************************************************************************
def get_charge_density_obj_elements(femmesh, femelement_table, femnodes_ele_table, femobj):
def pair_obj_reference(obj_ref):
pairs = []
for feat, ref in obj_ref:
for sub_ref in ref:
sub = (feat, sub_ref)
pairs.append(sub)
return pairs
def get_ccx_elements(sets_getter, ref_pair):
ref_obj, sub_ref = ref_pair
geom_type = ref_obj.getSubObject(sub_ref).ShapeType
elem = []
is_sub_element = False
model_dim = 0
if is_solid_femmesh(sets_getter.femmesh):
model_dim = 3
elif is_face_femmesh(sets_getter.femmesh):
model_dim = 2
elif is_edge_femmesh(sets_getter.femmesh):
model_dim = 1
match model_dim:
case 3:
match geom_type:
case "Solid":
elem = get_ccx_elements_by_references(sets_getter, ref_pair)
is_sub_element = False
case "Face" | "Edge" | "Vertex":
elem = get_ccx_subelements_by_references(sets_getter, ref_pair)
is_sub_element = True
case 2:
match geom_type:
case "Face":
elem = get_ccx_elements_by_references(sets_getter, ref_pair)
is_sub_element = False
case "Edge" | "Vertex":
elem = get_ccx_subelements_by_references(sets_getter, ref_pair)
is_sub_element = True
case 1:
match geom_type:
case "Edge":
is_sub_element = False
elem = get_ccx_elements_by_references(sets_getter, ref_pair)
case "Vertex":
elem = get_ccx_subelements_by_references(sets_getter, ref_pair)
is_sub_element = True
case 0:
match geom_type:
case "Vertex":
elem = get_ccx_elements_by_references(sets_getter, ref_pair)
is_sub_element = False
return (*elem, is_sub_element)
def get_ccx_elements_by_references(sets_getter, femobj_ref):
node_set = []
res = []
result = []
# TODO get elements from mesh groups
# if femmesh.GroupCount:
# node_set = get_femmesh_groupdata_sets_by_name(femmesh, femobj, "Node")
@@ -1515,36 +1574,33 @@ def get_charge_density_obj_elements(femmesh, femelement_table, femnodes_ele_tabl
# "from existent finite element mesh group data.\n"
# )
if not node_set:
elem = []
FreeCAD.Console.PrintLog(
" Finite element mesh nodes will be retrieved "
"by searching the appropriate nodes in the finite element mesh.\n"
)
for feat, ref in femobj["Object"].References:
for sub_ref in ref:
sub = (feat, (sub_ref,))
node_set = get_femnodes_by_references(femmesh, [sub])
charged_volume_node_set = sorted(set(node_set))
feat, sub_ref = femobj_ref
sub = (feat, (sub_ref,))
node_set = get_femnodes_by_references(sets_getter.femmesh, [sub])
charged_volume_node_set = sorted(set(node_set))
bit_pattern_dict = get_bit_pattern_dict(
femelement_table, femnodes_ele_table, charged_volume_node_set
)
sh = feat.getSubObject(sub_ref)
if sh.ShapeType == "Solid":
charged_elem = get_ccxelement_volumes_elements_from_binary_search(
bit_pattern_dict
)
elif sh.ShapeType == "Face":
charged_elem = get_ccxelement_faces_elements_from_binary_search(
bit_pattern_dict
)
res.append((sub, charged_elem))
bit_pattern_dict = get_bit_pattern_dict(
sets_getter.femelement_table, sets_getter.femnodes_ele_table, charged_volume_node_set
)
sh = feat.getSubObject(sub_ref)
if sh.ShapeType == "Solid":
elem = get_ccxelement_volumes_elements_from_binary_search(bit_pattern_dict)
elif sh.ShapeType == "Face":
elem = get_ccxelement_faces_elements_from_binary_search(bit_pattern_dict)
return res
result = (sub, elem)
return result
def get_charge_density_obj_faces(femmesh, femelement_table, femnodes_ele_table, femobj):
def get_ccx_subelements_by_references(sets_getter, femobj_ref):
node_set = []
res = []
result = []
# TODO get elements from mesh groups
# if femmesh.GroupCount:
# node_set = get_femmesh_groupdata_sets_by_name(femmesh, femobj, "Node")
@@ -1555,28 +1611,28 @@ def get_charge_density_obj_faces(femmesh, femelement_table, femnodes_ele_table,
# "from existent finite element mesh group data.\n"
# )
if not node_set:
sub_elem = []
FreeCAD.Console.PrintLog(
" Finite element mesh nodes will be retrieved "
"by searching the appropriate nodes in the finite element mesh.\n"
)
for feat, ref in femobj["Object"].References:
for sub_ref in ref:
sub = (feat, (sub_ref,))
node_set = get_femnodes_by_references(femmesh, [sub])
charged_face_node_set = sorted(set(node_set))
feat, sub_ref = femobj_ref
sub = (feat, (sub_ref,))
node_set = get_femnodes_by_references(sets_getter.femmesh, [sub])
charged_face_node_set = sorted(set(node_set))
bit_pattern_dict = get_bit_pattern_dict(
femelement_table, femnodes_ele_table, charged_face_node_set
)
sh = feat.getSubObject(sub_ref)
if sh.ShapeType == "Face":
charged_faces = get_ccxelement_faces_from_binary_search(bit_pattern_dict)
elif sh.ShapeType == "Edge":
charged_faces = get_ccxelement_edges_from_binary_search(bit_pattern_dict)
bit_pattern_dict = get_bit_pattern_dict(
sets_getter.femelement_table, sets_getter.femnodes_ele_table, charged_face_node_set
)
sh = feat.getSubObject(sub_ref)
if sh.ShapeType == "Face":
sub_elem = get_ccxelement_faces_from_binary_search(bit_pattern_dict)
elif sh.ShapeType == "Edge":
sub_elem = get_ccxelement_edges_from_binary_search(bit_pattern_dict, sets_getter)
res.append((sub, charged_faces))
result = (sub, sub_elem)
return res
return result
# ***** pressure faces ***************************************************************************