FEM: solver, improve analysis member tests

This commit is contained in:
Bernd Hahnebach
2021-07-27 23:40:00 +02:00
parent c756881ffa
commit c0c6212f0c
6 changed files with 70 additions and 18 deletions

View File

@@ -52,8 +52,21 @@ class Check(run.Check):
def run(self):
self.pushStatus("Checking analysis...\n")
self.checkMesh()
self.checkMaterial()
self.check_mesh_exists()
# workaround use Calculix ccxtools pre checks
from femtools.checksanalysis import check_member_for_solver_calculix
message = check_member_for_solver_calculix(
self.analysis,
self.solver,
membertools.get_mesh_to_solve(self.analysis)[0],
membertools.AnalysisMember(self.analysis)
)
if message:
text = "CalculiX can not be started...\n"
self.report.error("{}{}".format(text, message))
self.fail()
return
class Prepare(run.Prepare):

View File

@@ -47,9 +47,9 @@ class Check(run.Check):
def run(self):
self.pushStatus("Checking analysis...\n")
if (self.checkMesh()):
if (self.check_mesh_exists()):
self.checkMeshType()
self.checkMaterial()
self.check_material_exists()
self.checkEquations()
def checkMeshType(self):

View File

@@ -418,11 +418,11 @@ class Machine(BaseTask):
class Check(BaseTask):
def checkMesh(self):
meshes = membertools.get_member(
self.analysis,
"Fem::FemMeshObject"
)
def get_several_member(self, t):
return membertools.get_several_member(self.analysis, t)
def check_mesh_exists(self):
meshes = self.get_several_member("Fem::FemMeshObject")
if len(meshes) == 0:
self.report.error("Missing a mesh object.")
self.fail()
@@ -436,10 +436,9 @@ class Check(BaseTask):
return False
return True
def checkMaterial(self):
matObjs = membertools.get_member(
self.analysis, "App::MaterialObjectPython")
if len(matObjs) == 0:
def check_material_exists(self):
objs = self.get_several_member("App::MaterialObjectPython")
if len(objs) == 0:
self.report.error(
"Missing a material object. "
"At least one material is required."
@@ -448,6 +447,42 @@ class Check(BaseTask):
return False
return True
def check_material_single(self):
objs = self.get_several_member("App::MaterialObjectPython")
if len(objs) > 1:
self.report.error("Only one Material allowed for this solver.")
self.fail()
return False
return True
def check_geos_beamsection_single(self):
objs = self.get_several_member("Fem::ElementGeometry1D")
if len(objs) > 1:
self.report.error("Only one beamsection allowed for this solver.")
self.fail()
return False
return True
def check_geos_shellthickness_single(self):
objs = self.get_several_member("Fem::ElementGeometry2D")
if len(objs) > 1:
self.report.error("Only one shellthickness allowed for this solver.")
self.fail()
return False
return True
def check_geos_beamsection_and_shellthickness(self):
beamsec_obj = self.get_several_member("Fem::ElementGeometry1D")
shellth_obj = self.get_several_member("Fem::ElementGeometry2D")
if len(beamsec_obj) > 0 and len(shellth_obj) > 0:
self.report.error(
"Either beamsection or shellthickness objects are allowed for this solver, "
"but not both in one analysis."
)
self.fail()
return False
return True
def checkSupported(self, allSupported):
for m in self.analysis.Group:
if femutils.is_of_type(m, "Fem::Constraint"):

View File

@@ -46,8 +46,12 @@ class Check(run.Check):
def run(self):
self.pushStatus("Checking analysis...\n")
self.checkMesh()
self.checkMaterial()
self.check_mesh_exists()
self.check_material_exists()
self.check_material_single() # no multiple material
self.check_geos_beamsection_single() # no multiple beamsection
self.check_geos_shellthickness_single() # no multiple shellsection
self.check_geos_beamsection_and_shellthickness() # either beams or shells
class Prepare(run.Prepare):

View File

@@ -260,8 +260,8 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject):
"Working directory \'{}\' doesn't exist."
.format(self.working_dir)
)
from femtools.checksanalysis import check_analysismember
message += check_analysismember(
from femtools.checksanalysis import check_member_for_solver_calculix
message += check_member_for_solver_calculix(
self.analysis,
self.solver,
self.mesh,

View File

@@ -37,7 +37,7 @@ from . import femutils
from femsolver.calculix.solver import ANALYSIS_TYPES
def check_analysismember(analysis, solver, mesh, member):
def check_member_for_solver_calculix(analysis, solver, mesh, member):
message = ""