From 2e2f45f1fe8ab208f080136bcf9261dd7758ecff Mon Sep 17 00:00:00 2001 From: Philipp Knechtges Date: Sun, 25 Apr 2021 00:15:48 +0200 Subject: [PATCH] [FEM] speed up get_femelement_sets in meshtools.py The previous implementation was quite slow in filling up the remaining_femelements list. The new implementation fixes this by using numpy for the heavy work. --- src/Mod/Fem/femmesh/meshtools.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Mod/Fem/femmesh/meshtools.py b/src/Mod/Fem/femmesh/meshtools.py index 3cf89b77c0..5dd1db57ca 100644 --- a/src/Mod/Fem/femmesh/meshtools.py +++ b/src/Mod/Fem/femmesh/meshtools.py @@ -30,7 +30,7 @@ __url__ = "https://www.freecadweb.org" import FreeCAD from femtools import geomtools - +import numpy as np # ************************************************************************************************ def get_femnodes_by_femobj_with_references( @@ -485,7 +485,7 @@ def get_femelement_sets( # fem_objects = FreeCAD FEM document objects # get femelements for reference shapes of each obj.References count_femelements = 0 - referenced_femelements = [] + referenced_femelements = np.zeros((max(femelement_table.keys())+1,),dtype=np.int) has_remaining_femelements = None for fem_object_i, fem_object in enumerate(fem_objects): obj = fem_object["Object"] @@ -503,17 +503,19 @@ def get_femelement_sets( obj.References, femnodes_ele_table ) - referenced_femelements += ref_shape_femelements + ref_shape_femelements_array = np.zeros_like(referenced_femelements) + ref_shape_femelements_array[ref_shape_femelements] = 1 + referenced_femelements += ref_shape_femelements_array count_femelements += len(ref_shape_femelements) fem_object["FEMElements"] = ref_shape_femelements else: has_remaining_femelements = obj.Name # get remaining femelements for the fem_objects if has_remaining_femelements: - remaining_femelements = [] - for elemid in femelement_table: - if elemid not in referenced_femelements: - remaining_femelements.append(elemid) + femelement_table_array = np.zeros_like(referenced_femelements) + femelement_table_array[list(femelement_table.keys())] = 1 + remaining_femelements_array = femelement_table_array > referenced_femelements + remaining_femelements = [ i.item() for i in np.nditer(remaining_femelements_array.nonzero()) ] count_femelements += len(remaining_femelements) for fem_object in fem_objects: obj = fem_object["Object"]