FEM: ccx solver, add gemetry check analysis
This commit is contained in:
@@ -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))
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user