FEM: ccx solver, add gemetry check analysis

This commit is contained in:
Bernd Hahnebach
2018-10-05 07:09:01 +02:00
committed by wmayer
parent 601e4b5034
commit ef87ae4d36
4 changed files with 52 additions and 31 deletions

View File

@@ -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))

View File

@@ -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:

View File

@@ -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':

View File

@@ -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))