From 2a0dc9048ba8c8a2dc684c1f9fd54ac476eeab8b Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Fri, 27 Sep 2019 09:28:58 +0200 Subject: [PATCH] FEM: solver frame work unit tests, improvements --- .../Fem/femtest/app/test_solverframework.py | 119 +++++++++--------- 1 file changed, 59 insertions(+), 60 deletions(-) diff --git a/src/Mod/Fem/femtest/app/test_solverframework.py b/src/Mod/Fem/femtest/app/test_solverframework.py index 2cf5ed1466..607f5115d0 100644 --- a/src/Mod/Fem/femtest/app/test_solverframework.py +++ b/src/Mod/Fem/femtest/app/test_solverframework.py @@ -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(