From ef87ae4d36c80d4ab50dc21d5b1f5277b19579f7 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Fri, 5 Oct 2018 07:09:01 +0200 Subject: [PATCH] FEM: ccx solver, add gemetry check analysis --- src/Mod/Fem/femcommands/commands.py | 5 +++ src/Mod/Fem/feminout/importCcxFrdResults.py | 41 ++++++++++++--------- src/Mod/Fem/femsolver/calculix/writer.py | 8 ++-- src/Mod/Fem/femtools/ccxtools.py | 29 ++++++++++----- 4 files changed, 52 insertions(+), 31 deletions(-) diff --git a/src/Mod/Fem/femcommands/commands.py b/src/Mod/Fem/femcommands/commands.py index 90b7e55e08..b92c9cbedc 100644 --- a/src/Mod/Fem/femcommands/commands.py +++ b/src/Mod/Fem/femcommands/commands.py @@ -766,6 +766,11 @@ class _CommandFemSolverRun(CommandManager): def load_results(ret_code): if ret_code == 0: self.fea.load_results() + elif ret_code == 201: + if self.fea.solver.AnalysisType == 'check': + print('We run into the NOANALYSIS problem!') + # https://forum.freecadweb.org/viewtopic.php?f=18&t=31303&start=10#p260743 + self.fea.load_results() else: print("CalculiX failed ccx finished with error {}".format(ret_code)) diff --git a/src/Mod/Fem/feminout/importCcxFrdResults.py b/src/Mod/Fem/feminout/importCcxFrdResults.py index 234a27b9f4..1a6ab5009b 100644 --- a/src/Mod/Fem/feminout/importCcxFrdResults.py +++ b/src/Mod/Fem/feminout/importCcxFrdResults.py @@ -86,26 +86,31 @@ def importFrd(filename, analysis=None, result_name_prefix=None): span = max(x_span, y_span, z_span) number_of_increments = len(m['Results']) - for result_set in m['Results']: - if 'number' in result_set: - eigenmode_number = result_set['number'] - else: - eigenmode_number = 0 - step_time = result_set['time'] - step_time = round(step_time, 2) - if eigenmode_number > 0: - results_name = result_name_prefix + 'mode_' + str(eigenmode_number) + '_results' - elif number_of_increments > 1: - results_name = result_name_prefix + 'time_' + str(step_time) + '_results' - else: - results_name = result_name_prefix + 'results' + if len(m['Results']) > 0: + for result_set in m['Results']: + if 'number' in result_set: + eigenmode_number = result_set['number'] + else: + eigenmode_number = 0 + step_time = result_set['time'] + step_time = round(step_time, 2) + if eigenmode_number > 0: + results_name = result_name_prefix + 'mode_' + str(eigenmode_number) + '_results' + elif number_of_increments > 1: + results_name = result_name_prefix + 'time_' + str(step_time) + '_results' + else: + results_name = result_name_prefix + 'results' - results = ObjectsFem.makeResultMechanical(FreeCAD.ActiveDocument, results_name) - results.Mesh = result_mesh_object - results = importToolsFem.fill_femresult_mechanical(results, result_set, span) - results = importToolsFem.fill_femresult_stats(results) + results = ObjectsFem.makeResultMechanical(FreeCAD.ActiveDocument, results_name) + results.Mesh = result_mesh_object + results = importToolsFem.fill_femresult_mechanical(results, result_set, span) + results = importToolsFem.fill_femresult_stats(results) + if analysis: + analysis_object.addObject(results) + else: + FreeCAD.Console.PrintMessage('We have nodes but no results in frd file, which means we only have a mesh in frd file. Normaly this happens for analysis type "NOANALYSIS".\n') if analysis: - analysis_object.addObject(results) + analysis_object.addObject(result_mesh_object) if FreeCAD.GuiUp: if analysis: diff --git a/src/Mod/Fem/femsolver/calculix/writer.py b/src/Mod/Fem/femsolver/calculix/writer.py index 237381c035..55d30d5a1f 100644 --- a/src/Mod/Fem/femsolver/calculix/writer.py +++ b/src/Mod/Fem/femsolver/calculix/writer.py @@ -135,7 +135,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): self.write_constraints_displacement(inpfile) # constraints depend on step and depending on analysis type - if self.analysis_type == "frequency": + if self.analysis_type == "frequency" or self.analysis_type == "check": pass elif self.analysis_type == "static": if self.selfweight_objects: @@ -282,7 +282,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): self.write_constraints_displacement(inpfileMain) # constraints depend on step and depending on analysis type - if self.analysis_type == "frequency": + if self.analysis_type == "frequency" or self.analysis_type == "check": pass elif self.analysis_type == "static": if self.selfweight_objects: @@ -733,6 +733,8 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): analysis_type = '*FREQUENCY' elif self.analysis_type == 'thermomech': analysis_type = '*COUPLED TEMPERATURE-DISPLACEMENT' + elif self.analysis_type == 'check': + analysis_type = '*NO ANALYSIS' # analysis line --> solver type if self.solver_obj.MatrixSolverType == "default": pass @@ -760,7 +762,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): pass # not supported for static and frequency! # ANALYSIS parameter line analysis_parameter = '' - if self.analysis_type == 'static': + if self.analysis_type == 'static' or self.analysis_type == 'check': if self.solver_obj.IterationsUserDefinedIncrementations is True or self.solver_obj.IterationsUserDefinedTimeStepLength is True: analysis_parameter = '{},{}'.format(self.solver_obj.TimeInitialStep, self.solver_obj.TimeEnd) elif self.analysis_type == 'frequency': diff --git a/src/Mod/Fem/femtools/ccxtools.py b/src/Mod/Fem/femtools/ccxtools.py index 3e9a6b46cd..24796f1cca 100644 --- a/src/Mod/Fem/femtools/ccxtools.py +++ b/src/Mod/Fem/femtools/ccxtools.py @@ -37,7 +37,7 @@ if FreeCAD.GuiUp: class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): - known_analysis_types = ["static", "frequency", "thermomech"] + known_analysis_types = ["static", "frequency", "thermomech", "check"] finished = QtCore.Signal(int) ## The constructor @@ -685,14 +685,17 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): self.finished.emit(ret_code) progress_bar.stop() if ret_code or self.ccx_stderr: - FreeCAD.Console.PrintError("CalculiX failed with exit code {}\n".format(ret_code)) - FreeCAD.Console.PrintMessage("--------start of stderr-------\n") - FreeCAD.Console.PrintMessage(self.ccx_stderr) - FreeCAD.Console.PrintMessage("--------end of stderr---------\n") - FreeCAD.Console.PrintMessage("--------start of stdout-------\n") - FreeCAD.Console.PrintMessage(self.ccx_stdout) - self.has_for_nonpositive_jacobians() - FreeCAD.Console.PrintMessage("--------end of stdout---------\n") + if ret_code == 201 and self.solver.AnalysisType == 'check': + FreeCAD.Console.PrintMessage('Workaround for wrong exit code for *NOANALYSIS check\n.') + else: + FreeCAD.Console.PrintError("CalculiX failed with exit code {}\n".format(ret_code)) + FreeCAD.Console.PrintMessage("--------start of stderr-------\n") + FreeCAD.Console.PrintMessage(self.ccx_stderr) + FreeCAD.Console.PrintMessage("--------end of stderr---------\n") + FreeCAD.Console.PrintMessage("--------start of stdout-------\n") + FreeCAD.Console.PrintMessage(self.ccx_stdout) + self.has_for_nonpositive_jacobians() + FreeCAD.Console.PrintMessage("--------end of stdout---------\n") else: FreeCAD.Console.PrintMessage("CalculiX finished without error\n") else: @@ -750,7 +753,13 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): self.results_present = True break else: - FreeCAD.Console.PrintError('FEM: No result object in active Analysis.\n') + if self.solver.AnalysisType == 'check': + for m in self.analysis.Group: + if m.isDerivedFrom("Fem::FemMeshObjectPython"): + # we have no result object but a mesh object, this happens in NOANALYSIS mode + break + else: + FreeCAD.Console.PrintError('FEM: No result object in active Analysis.\n') else: raise Exception('FEM: No results found at {}!'.format(frd_result_file))