FEM: solver frame work unit tests, improvements

This commit is contained in:
Bernd Hahnebach
2019-09-27 09:28:58 +02:00
parent b8287fd42b
commit 2a0dc9048b

View File

@@ -52,8 +52,10 @@ class TestSolverFrameWork(unittest.TestCase):
# more inits
self.mesh_name = "Mesh"
self.temp_dir = testtools.get_fem_test_tmp_dir()
self.test_file_dir = join(testtools.get_fem_test_home_dir(), "ccx")
self.temp_dir = testtools.get_unit_test_tmp_dir(
testtools.get_fem_test_tmp_dir(),
"FEM_solverframework"
)
def test_00print(
self
@@ -70,27 +72,25 @@ class TestSolverFrameWork(unittest.TestCase):
):
fcc_print("\n--------------- Start of FEM tests solver framework solver CalculiX ------")
# set up the static analysis example
# set up the CalculiX static analysis example
from femexamples import boxanalysis as box
box.setup_static(self.active_doc, "calculix")
analysis = self.active_doc.Analysis
solver_ccx_object = self.active_doc.SolverCalculiX
material_object = self.active_doc.MechanicalMaterial
mesh_object = self.active_doc.Mesh
solver_obj = self.active_doc.SolverCalculiX
static_base_name = "cube_static"
solverframework_analysis_dir = testtools.get_unit_test_tmp_dir(
testtools.get_fem_test_tmp_dir(),
"FEM_solverframework"
)
base_name = "cube_static"
analysis_dir = testtools.get_unit_test_tmp_dir(self.temp_dir, solver_obj.Name)
# save the file
save_fc_file = join(analysis_dir, solver_obj.Name + "_" + base_name + ".FCStd")
fcc_print("Save FreeCAD file to {}...".format(save_fc_file))
self.active_doc.saveAs(save_fc_file)
# write input file
fcc_print("Checking FEM ccx solver for solver frame work......")
fcc_print("machine_ccx")
machine_ccx = solver_ccx_object.Proxy.createMachine(
solver_ccx_object,
solverframework_analysis_dir
fcc_print("Checking FEM input file writing for CalculiX solver framework solver ...")
machine_ccx = solver_obj.Proxy.createMachine(
solver_obj,
analysis_dir
)
machine_ccx.target = femsolver.run.PREPARE
machine_ccx.start()
@@ -99,64 +99,63 @@ class TestSolverFrameWork(unittest.TestCase):
infile_given = join(
testtools.get_fem_test_home_dir(),
"ccx",
(static_base_name + ".inp")
(base_name + ".inp")
)
inpfile_totest = join(solverframework_analysis_dir, (self.mesh_name + ".inp"))
inpfile_totest = join(analysis_dir, (self.mesh_name + ".inp"))
fcc_print("Comparing {} to {}".format(infile_given, inpfile_totest))
ret = testtools.compare_inp_files(infile_given, inpfile_totest)
self.assertFalse(ret, "ccxtools write_inp_file test failed.\n{}".format(ret))
save_fc_file = solverframework_analysis_dir + static_base_name + ".FCStd"
fcc_print("Save FreeCAD file for static2 analysis to {}...".format(save_fc_file))
self.active_doc.saveAs(save_fc_file)
fcc_print("\n--------------- End of FEM tests solver framework solver CalculiX --------")
fcc_print("--------------- End of FEM tests solver framework solver CalculiX --------")
# ********************************************************************************************
def test_solver_elmer(
self
):
fcc_print("\n--------------- Start of FEM tests solver framework solver Elmer ------")
fcc_print("\n--------------- Start of FEM tests solver framework solver Elmer ---------")
# TODO set up example
# set up the Elmer static analysis example
from femexamples import boxanalysis as box
box.setup_static(self.active_doc, "elmer")
'''
# use solver frame work elmer solver
# elmer solver object
solver_elmer_object = ObjectsFem.makeSolverElmer(
self.active_doc,
"SolverElmer"
)
self.assertTrue(solver_elmer_object, "FemTest of elmer solver failed")
analysis.addObject(solver_elmer_object)
solver_elmer_eqobj = ObjectsFem.makeEquationElasticity(
self.active_doc,
solver_elmer_object
)
self.assertTrue(solver_elmer_eqobj, "FemTest of elmer elasticity equation failed")
analysis_obj = self.active_doc.Analysis
solver_obj = self.active_doc.SolverElmer
material_obj = self.active_doc.MechanicalMaterial
mesh_obj = self.active_doc.Mesh
box_object = self.active_doc.Box
base_name = "cube_static"
analysis_dir = testtools.get_unit_test_tmp_dir(self.temp_dir, solver_obj.Name)
# TODO move to elmer solver of femexample code
ObjectsFem.makeEquationElasticity(self.active_doc, solver_obj)
# set ThermalExpansionCoefficient
# current elmer seems to need it even on simple elasticity analysis
mat = material_object.Material
# FIXME elmer elasticity needs the dictionary key, otherwise it fails
# FIXME elmer elasticity needs the dictionary key "ThermalExpansionCoefficient"
# even on simple elasticity analysis, otherwise it fails
mat = material_obj.Material
mat["ThermalExpansionCoefficient"] = "0 um/m/K"
material_object.Material = mat
material_obj.Material = mat
mesh_gmsh = ObjectsFem.makeMeshGmsh(self.active_doc)
mesh_gmsh.CharacteristicLengthMin = "9 mm"
# elmer needs a GMHS mesh object
# FIXME error message on Python solver run
mesh_gmsh.FemMesh = mesh_object.FemMesh
mesh_gmsh.Part = box
analysis.addObject(mesh_gmsh)
self.active_doc.removeObject(mesh_object.Name)
mesh_gmsh = ObjectsFem.makeMeshGmsh(self.active_doc)
mesh_gmsh.CharacteristicLengthMin = "9 mm"
mesh_gmsh.FemMesh = mesh_obj.FemMesh
mesh_gmsh.Part = box_object
analysis_obj.addObject(mesh_gmsh)
self.active_doc.removeObject(mesh_obj.Name) # remove original mesh object
# save the file
save_fc_file = join(analysis_dir, solver_obj.Name + "_" + base_name + ".FCStd")
fcc_print("Save FreeCAD file to {}...".format(save_fc_file))
self.active_doc.saveAs(save_fc_file)
# solver frame work Elmer solver
# write input files
fcc_print("\nChecking FEM Elmer solver for solver frame work...")
machine_elmer = solver_elmer_object.Proxy.createMachine(
solver_elmer_object,
solverframework_analysis_dir,
fcc_print("Checking FEM input file writing for Elmer solver framework solver ...")
machine_elmer = solver_obj.Proxy.createMachine(
solver_obj,
analysis_dir,
True
)
machine_elmer.target = femsolver.run.PREPARE
@@ -165,30 +164,30 @@ class TestSolverFrameWork(unittest.TestCase):
# compare startinfo, case and gmsh input files
test_file_dir_elmer = join(testtools.get_fem_test_home_dir(), "elmer")
fcc_print(test_file_dir_elmer)
fcc_print("Test writing STARTINFO file")
startinfo_given = join(test_file_dir_elmer, "ELMERSOLVER_STARTINFO")
startinfo_totest = join(solverframework_analysis_dir, "ELMERSOLVER_STARTINFO")
startinfo_totest = join(analysis_dir, "ELMERSOLVER_STARTINFO")
fcc_print("Comparing {} to {}".format(startinfo_given, startinfo_totest))
ret = testtools.compare_files(startinfo_given, startinfo_totest)
self.assertFalse(ret, "STARTINFO write file test failed.\n{}".format(ret))
fcc_print("Test writing case file")
casefile_given = join(test_file_dir_elmer, "case.sif")
casefile_totest = join(solverframework_analysis_dir, "case.sif")
casefile_totest = join(analysis_dir, "case.sif")
fcc_print("Comparing {} to {}".format(casefile_given, casefile_totest))
ret = testtools.compare_files(casefile_given, casefile_totest)
self.assertFalse(ret, "case write file test failed.\n{}".format(ret))
fcc_print("Test writing GMSH geo file")
gmshgeofile_given = join(test_file_dir_elmer, "group_mesh.geo")
gmshgeofile_totest = join(solverframework_analysis_dir, "group_mesh.geo")
gmshgeofile_totest = join(analysis_dir, "group_mesh.geo")
fcc_print("Comparing {} to {}".format(gmshgeofile_given, gmshgeofile_totest))
ret = testtools.compare_files(gmshgeofile_given, gmshgeofile_totest)
self.assertFalse(ret, "GMSH geo write file test failed.\n{}".format(ret))
'''
fcc_print("\n--------------- End of FEM tests solver framework solver Elmer --------")
fcc_print("--------------- End of FEM tests solver framework solver Elmer -----------")
# ********************************************************************************************
def tearDown(