FEM: solver run, improve output

This commit is contained in:
Bernd Hahnebach
2021-07-27 21:56:39 +02:00
parent 57541ef543
commit 33679f34b4
6 changed files with 59 additions and 38 deletions

View File

@@ -104,13 +104,16 @@ class MeshSetsGetter():
# get all known sets
def get_mesh_sets(self):
FreeCAD.Console.PrintMessage("\n") # because of time print in separate line
FreeCAD.Console.PrintMessage(
"Get mesh data for constraints, materials and element geometry...\n"
)
FreeCAD.Console.PrintLog(
"MeshSetsGetter: Get mesh data for "
"node sets (groups), surface sets (groups) and element sets (groups)\n"
)
time_start = time.process_time()
FreeCAD.Console.PrintMessage("Get mesh sets.\n")
# materials and element geometry element sets getter
self.get_element_sets_material_and_femelement_geometry()
@@ -137,7 +140,7 @@ class MeshSetsGetter():
setstime = round((time.process_time() - time_start), 3)
FreeCAD.Console.PrintMessage(
"Getting mesh sets or groups time: {} seconds \n".format(setstime)
"Getting mesh data time: {} seconds.\n".format(setstime)
)
# ********************************************************************************************

View File

@@ -133,8 +133,10 @@ class FemInputWriterCcx(writerbase.FemInputWriter):
def write_solver_input(self):
time_start = time.process_time()
FreeCAD.Console.PrintMessage("\n") # because of time print in separate line
FreeCAD.Console.PrintMessage("CalculiX solver input writing...\n")
FreeCAD.Console.PrintMessage(
"Start writing CalculiX input file to: {}\n"
"Input file:{}\n"
.format(self.file_name)
)
@@ -207,7 +209,7 @@ class FemInputWriterCcx(writerbase.FemInputWriter):
writetime = round((time.process_time() - time_start), 3)
FreeCAD.Console.PrintMessage(
"Writing time CalculiX input file: {} seconds \n".format(writetime)
"Writing time CalculiX input file: {} seconds.\n".format(writetime)
)
# return

View File

@@ -100,13 +100,14 @@ def run_fem_solver(solver, working_dir=None):
"""
if solver.Proxy.Type == "Fem::SolverCcxTools":
App.Console.PrintMessage("CalxuliX ccx tools solver!\n")
from femtools.ccxtools import CcxTools as ccx
App.Console.PrintMessage("Run of CalxuliX ccx tools solver started.\n")
fea = ccx(solver)
fea.reset_mesh_purge_results_checked()
if working_dir is None:
fea.run()
fea.run() # standard, no working dir is given in solver
else:
# not the standard way
fea.update_objects()
fea.setup_working_dir(working_dir)
fea.setup_ccx()
@@ -116,7 +117,8 @@ def run_fem_solver(solver, working_dir=None):
fea.ccx_run()
fea.load_results()
else:
App.Console.PrintError("Houston, we have a problem ...!\n{}\n".format(message))
App.Console.PrintError("Houston, we have a problem...!\n{}\n".format(message))
App.Console.PrintMessage("Run of CalxuliX ccx tools solver finished.\n")
else:
# App.Console.PrintMessage("Frame work solver!\n")
try:
@@ -418,7 +420,9 @@ class Check(BaseTask):
def checkMesh(self):
meshes = membertools.get_member(
self.analysis, "Fem::FemMeshObject")
self.analysis,
"Fem::FemMeshObject"
)
if len(meshes) == 0:
self.report.error("Missing a mesh object.")
self.fail()
@@ -426,7 +430,8 @@ class Check(BaseTask):
elif len(meshes) > 1:
self.report.error(
"Too many meshes. "
"More than one mesh is not supported.")
"More than one mesh is not supported."
)
self.fail()
return False
return True
@@ -436,8 +441,9 @@ class Check(BaseTask):
self.analysis, "App::MaterialObjectPython")
if len(matObjs) == 0:
self.report.error(
"No material object found. "
"At least one material is required.")
"Missing a material object. "
"At least one material is required."
)
self.fail()
return False
return True
@@ -451,7 +457,9 @@ class Check(BaseTask):
supported = True
if not supported:
self.report.warning(
"Ignored unsupported constraint: %s" % m.Label)
"Ignored unsupported constraint: {}"
.format(m.Label)
)
return True

View File

@@ -226,22 +226,26 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject):
def update_objects(self):
## @var mesh
# mesh of the analysis. Used to generate .inp file and to show results
# mesh for the analysis
self.mesh = None
mesh, message = membertools.get_mesh_to_solve(self.analysis)
if mesh is not None:
self.mesh = mesh
else:
if FreeCAD.GuiUp:
QtGui.QMessageBox.critical(None, "Missing prerequisite", message)
raise Exception(message + "\n")
# the prerequisites will run anyway and they will print a message box anyway
# thus do not print one here, but print a console warning
FreeCAD.Console.PrintWarning(
"{} The prerequisite check will fail.\n"
.format(message)
)
## @var members
# members of the analysis. All except solvers and the mesh
# members of the analysis. All except the solver and the mesh
self.member = membertools.AnalysisMember(self.analysis)
def check_prerequisites(self):
FreeCAD.Console.PrintMessage("Check prerequisites.\n")
FreeCAD.Console.PrintMessage("\n") # because of time print in separate line
FreeCAD.Console.PrintMessage("Check prerequisites...\n")
message = ""
# analysis
if not self.analysis:
@@ -251,7 +255,7 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject):
message += "No solver object defined in the analysis\n"
if not self.working_dir:
message += "Working directory not set\n"
if not (os.path.isdir(self.working_dir)):
if not os.path.isdir(self.working_dir):
message += (
"Working directory \'{}\' doesn't exist."
.format(self.working_dir)
@@ -577,7 +581,8 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject):
return (int(m.group(1)), int(m.group(2)))
def ccx_run(self):
FreeCAD.Console.PrintMessage("Run CalculiX ...\n")
FreeCAD.Console.PrintMessage("\n") # because of time print in separate line
FreeCAD.Console.PrintMessage("CalculiX solver run...\n")
if self.test_mode:
FreeCAD.Console.PrintError("CalculiX can not be run if test_mode is True.\n")
return
@@ -627,16 +632,15 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject):
self.setup_working_dir()
message = self.check_prerequisites()
if message:
error_message = (
"CalculiX was not started due to missing prerequisites:\n{}\n"
.format(message)
)
FreeCAD.Console.PrintError(error_message)
text = "CalculiX can not be started due to missing prerequisites:\n"
error_app = "{}{}".format(text, message)
error_gui = "{}\n{}".format(text, message)
FreeCAD.Console.PrintError(error_app)
if FreeCAD.GuiUp:
QtGui.QMessageBox.critical(
None,
"Missing prerequisite",
error_message
error_gui
)
return False
else:
@@ -652,7 +656,7 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject):
)
return False
else:
FreeCAD.Console.PrintMessage(
FreeCAD.Console.PrintLog(
"Writing CalculiX input file completed.\n"
)
ret_code = self.ccx_run()
@@ -670,7 +674,7 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject):
)
return False
else:
FreeCAD.Console.PrintMessage("**** try to read result files\n")
FreeCAD.Console.PrintLog("Try to read result files\n")
self.load_results()
# TODO: output an error message if there where problems reading the results
return True
@@ -788,7 +792,8 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject):
return False
def load_results(self):
FreeCAD.Console.PrintMessage("We will load the ccx frd and dat result file.\n")
FreeCAD.Console.PrintMessage("\n") # because of time print in separate line
FreeCAD.Console.PrintMessage("CalculiX read results...\n")
self.results_present = False
self.load_results_ccxfrd()
self.load_results_ccxdat()

View File

@@ -31,13 +31,14 @@ __url__ = "https://www.freecadweb.org"
import FreeCAD
from FreeCAD import Units
from . import femutils
from femsolver.calculix.solver import ANALYSIS_TYPES
def check_analysismember(analysis, solver, mesh, member):
FreeCAD.Console.PrintMessage("Check prerequisites.\n")
from FreeCAD import Units
message = ""
# solver
@@ -71,7 +72,7 @@ def check_analysismember(analysis, solver, mesh, member):
# mesh
if not mesh:
message += "No mesh object defined in the analysis\n"
message += "No mesh object defined in the analysis.\n"
if mesh:
if mesh.FemMesh.VolumeCount == 0 \
and mesh.FemMesh.FaceCount > 0 \
@@ -96,12 +97,12 @@ def check_analysismember(analysis, solver, mesh, member):
and mesh.FemMesh.EdgeCount == 0:
message += (
"FEM mesh has neither volume nor shell or edge elements. "
"Provide a FEM mesh with elements!\n"
"Provide a FEM mesh with elements.\n"
)
# material linear and nonlinear
if not member.mats_linear:
message += "No material object defined in the analysis\n"
message += "No material object defined in the analysis.\n"
has_no_references = False
for m in member.mats_linear:
if len(m["Object"].References) == 0:

View File

@@ -363,13 +363,15 @@ def get_refshape_type(fem_doc_object):
first_ref_obj = fem_doc_object.References[0]
first_ref_shape = get_element(first_ref_obj[0], first_ref_obj[1][0])
st = first_ref_shape.ShapeType
FreeCAD.Console.PrintMessage(
"References: {} in {}, {}\n". format(st, fem_doc_object.Name, fem_doc_object.Label)
FreeCAD.Console.PrintLog(
"References: {} in {}, {}\n"
. format(st, fem_doc_object.Name, fem_doc_object.Label)
)
return st
else:
FreeCAD.Console.PrintMessage(
"References: empty in {}, {}\n". format(fem_doc_object.Name, fem_doc_object.Label)
FreeCAD.Console.PrintLog(
"References: empty in {}, {}\n"
. format(fem_doc_object.Name, fem_doc_object.Label)
)
return ""