From fcb91f36af7b4ff0f501e06f761ba2ab40ab23af Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Fri, 16 Jul 2021 07:44:08 +0200 Subject: [PATCH] FEM: make use of mesh data getter class for calculix solver and ccxtools --- src/Mod/Fem/femsolver/calculix/tasks.py | 23 ++++++++-- src/Mod/Fem/femsolver/calculix/writer.py | 2 - src/Mod/Fem/femsolver/writerbase.py | 58 +++--------------------- src/Mod/Fem/femtools/ccxtools.py | 19 +++++++- 4 files changed, 43 insertions(+), 59 deletions(-) diff --git a/src/Mod/Fem/femsolver/calculix/tasks.py b/src/Mod/Fem/femsolver/calculix/tasks.py index 94a05b3d3c..d20bc6e158 100644 --- a/src/Mod/Fem/femsolver/calculix/tasks.py +++ b/src/Mod/Fem/femsolver/calculix/tasks.py @@ -40,6 +40,7 @@ from .. import run from .. import settings from feminout import importCcxDatResults from feminout import importCcxFrdResults +from femmesh import meshsetsgetter from femtools import femutils from femtools import membertools @@ -60,12 +61,28 @@ class Prepare(run.Prepare): def run(self): global _inputFileName self.pushStatus("Preparing input files...\n") + + mesh_obj = membertools.get_mesh_to_solve(self.analysis)[0] # pre check done already + + # get mesh set data + # TODO evaluate if it makes sense to add new task + # between check and prepare to the solver frame work + meshdatagetter = meshsetsgetter.MeshSetsGetter( + self.analysis, + self.solver, + mesh_obj, + membertools.AnalysisMember(self.analysis), + ) + meshdatagetter.get_mesh_sets() + + # write input file w = writer.FemInputWriterCcx( self.analysis, self.solver, - membertools.get_mesh_to_solve(self.analysis)[0], # pre check has been done already - membertools.AnalysisMember(self.analysis), - self.directory + mesh_obj, + meshdatagetter.member, + self.directory, + meshdatagetter.mat_geo_sets ) path = w.write_calculix_input_file() # report to user if task succeeded diff --git a/src/Mod/Fem/femsolver/calculix/writer.py b/src/Mod/Fem/femsolver/calculix/writer.py index 327cbbf0ae..76cc60aa45 100644 --- a/src/Mod/Fem/femsolver/calculix/writer.py +++ b/src/Mod/Fem/femsolver/calculix/writer.py @@ -132,10 +132,8 @@ class FemInputWriterCcx(writerbase.FemInputWriter): # write calculix input def write_calculix_input_file(self): - FreeCAD.Console.PrintMessage("Get mesh sets.\n") time_start = time.process_time() if not self.mat_geo_sets: - self.get_mesh_sets() time_getsets = time.process_time() FreeCAD.Console.PrintMessage( diff --git a/src/Mod/Fem/femsolver/writerbase.py b/src/Mod/Fem/femsolver/writerbase.py index f4870f8918..ae7c432c8f 100644 --- a/src/Mod/Fem/femsolver/writerbase.py +++ b/src/Mod/Fem/femsolver/writerbase.py @@ -97,6 +97,7 @@ class FemInputWriter(): "In rare cases this might not be an error. " ) + # ************************************************* # deprecated, leave for compatibility reasons # if these are calculated here they are calculated twice :-( self.femnodes_mesh = {} @@ -110,6 +111,9 @@ class FemInputWriter(): self.femelement_edges_table = {} self.femelement_count_test = True + # deprecated, leave for compatibility reasons + # do not add new objects + # only the ones which exists on 0.19 release are kept # materials self.material_objects = member.mats_linear self.material_nonlinear_objects = member.mats_nonlinear @@ -119,7 +123,6 @@ class FemInputWriter(): self.fluidsection_objects = member.geos_fluidsection self.shellthickness_objects = member.geos_shellthickness # constraints - self.centrif_objects = member.cons_centrif self.contact_objects = member.cons_contact self.displacement_objects = member.cons_displacement self.fixed_objects = member.cons_fixed @@ -128,7 +131,6 @@ class FemInputWriter(): self.initialtemperature_objects = member.cons_initialtemperature self.planerotation_objects = member.cons_planerotation self.pressure_objects = member.cons_pressure - self.sectionprint_objects = member.cons_sectionprint self.selfweight_objects = member.cons_selfweight self.temperature_objects = member.cons_temperature self.tie_objects = member.cons_tie @@ -220,46 +222,8 @@ class FemInputWriter(): f.write(write_after) # ******************************************************************************************** - # ******************************************************************************************** - # use set for node sets to be sure all nodes are unique - # use sorted to be sure the order is the same on different runs - # be aware a sorted set returns a list, because set are not sorted by default - # - done in return value of meshtools.get_femnodes_by_femobj_with_references - # TODO FIXME might be appropriate for element sets and surfaceface sets too - - # ******************************************************************************************** - # get all known sets - def get_mesh_sets(self): - FreeCAD.Console.PrintMessage( - "Get mesh data for " - "node sets (groups), surface sets (groups) and element sets (groups)\n" - ) - - # materials and element geometry element sets getter - self.get_element_sets_material_and_femelement_geometry() - - # constraints element sets getter - self.get_constraints_centrif_elements() - - # constraints node sets getter - self.get_constraints_fixed_nodes() - self.get_constraints_displacement_nodes() - self.get_constraints_planerotation_nodes() - - # constraints surface sets getter - self.get_constraints_contact_faces() - self.get_constraints_tie_faces() - self.get_constraints_sectionprint_faces() - self.get_constraints_transform_nodes() - self.get_constraints_temperature_nodes() - - # constraints sets with constraint data - self.get_constraints_force_nodeloads() - self.get_constraints_pressure_faces() - self.get_constraints_heatflux_faces() - - # ******************************************************************************************** - # sets + # deprecated, do not add new constraints + # only the ones which exists on 0.19 release are kept def get_constraints_fixed_nodes(self): self.meshdatagetter.get_constraints_fixed_nodes() @@ -290,18 +254,8 @@ class FemInputWriter(): def get_constraints_tie_faces(self): self.meshdatagetter.get_constraints_tie_faces() - def get_constraints_sectionprint_faces(self): - self.meshdatagetter.get_constraints_sectionprint_faces() - def get_constraints_heatflux_faces(self): self.meshdatagetter.get_constraints_heatflux_faces() - def get_constraints_centrif_elements(self): - self.meshdatagetter.get_constraints_centrif_elements() - - def get_element_sets_material_and_femelement_geometry(self): - self.meshdatagetter.get_element_sets_material_and_femelement_geometry() - self.mat_geo_sets = self.meshdatagetter.mat_geo_sets - ## @} diff --git a/src/Mod/Fem/femtools/ccxtools.py b/src/Mod/Fem/femtools/ccxtools.py index 2ed2cee588..06e3f950e2 100644 --- a/src/Mod/Fem/femtools/ccxtools.py +++ b/src/Mod/Fem/femtools/ccxtools.py @@ -366,6 +366,20 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): self.set_inp_file_name() def write_inp_file(self): + + # get mesh set data + # TODO use separate method for getting the mesh set data + from femmesh import meshsetsgetter + meshdatagetter = meshsetsgetter.MeshSetsGetter( + self.analysis, + self.solver, + self.mesh, + membertools.AnalysisMember(self.analysis), + ) + # save the sets into the member objects of the instanz meshdatagetter + meshdatagetter.get_mesh_sets() + + # write input file import femsolver.calculix.writer as iw self.inp_file_name = "" try: @@ -373,8 +387,9 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): self.analysis, self.solver, self.mesh, - self.member, - self.working_dir + meshdatagetter.member, + self.working_dir, + meshdatagetter.mat_geo_sets ) self.inp_file_name = inp_writer.write_calculix_input_file() except Exception: