FEM: solver run, improve output
This commit is contained in:
@@ -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)
|
||||
)
|
||||
|
||||
# ********************************************************************************************
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user