From ddaaa5edf9fb3b0bbba8160c92fabeddead131d2 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Wed, 1 Jul 2020 21:43:20 +0200 Subject: [PATCH] FEM: solver elmer unit test, small improvements --- src/Mod/Fem/femexamples/boxanalysis_static.py | 10 ++++++- src/Mod/Fem/femtest/app/test_solver_elmer.py | 30 ++++--------------- src/Mod/Fem/femtest/data/elmer/group_mesh.geo | 2 +- 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/src/Mod/Fem/femexamples/boxanalysis_static.py b/src/Mod/Fem/femexamples/boxanalysis_static.py index 5cc62b84b1..da99bcd5fa 100644 --- a/src/Mod/Fem/femexamples/boxanalysis_static.py +++ b/src/Mod/Fem/femexamples/boxanalysis_static.py @@ -69,6 +69,10 @@ def setup_base(doc=None, solvertype="ccxtools"): mat["YoungsModulus"] = "200000 MPa" mat["PoissonRatio"] = "0.30" mat["Density"] = "7900 kg/m^3" + if solvertype == "elmer": + # set ThermalExpansionCoefficient + # FIXME elmer elasticity needs the dictionary key "ThermalExpansionCoefficient" + mat["ThermalExpansionCoefficient"] = "0 um/m/K" material_object.Material = mat # mesh @@ -85,6 +89,7 @@ def setup_base(doc=None, solvertype="ccxtools"): femmesh_obj.FemMesh = fem_mesh femmesh_obj.Part = geom_obj femmesh_obj.SecondOrderLinear = False + femmesh_obj.CharacteristicLengthMin = "8.0 mm" doc.recompute() return doc @@ -108,7 +113,10 @@ def setup(doc=None, solvertype="ccxtools"): )[0] solver_object.WorkingDir = u"" elif solvertype == "elmer": - analysis.addObject(ObjectsFem.makeSolverElmer(doc, "SolverElmer")) + solver_object = analysis.addObject( + ObjectsFem.makeSolverElmer(doc, "SolverElmer") + )[0] + ObjectsFem.makeEquationElasticity(doc, solver_object) elif solvertype == "z88": analysis.addObject(ObjectsFem.makeSolverZ88(doc, "SolverZ88")) if solvertype == "calculix" or solvertype == "ccxtools": diff --git a/src/Mod/Fem/femtest/app/test_solver_elmer.py b/src/Mod/Fem/femtest/app/test_solver_elmer.py index c1fc02f57b..43ae721d07 100644 --- a/src/Mod/Fem/femtest/app/test_solver_elmer.py +++ b/src/Mod/Fem/femtest/app/test_solver_elmer.py @@ -31,7 +31,6 @@ from os.path import join import FreeCAD import femsolver.run -import ObjectsFem from . import support_utils as testtools from .support_utils import fcc_print @@ -98,34 +97,17 @@ class TestSolverElmer(unittest.TestCase): from femexamples.boxanalysis_static import setup setup(self.document, "elmer") - analysis_obj = self.document.Analysis + # for information: + # elmer needs gmsh mesho object + # FIXME error message on Python solver run + # the examples do use a gmsh mesh object thus ok + # FIXME elmer elasticity needs the dict key "ThermalExpansionCoefficient" in material + solver_obj = self.document.SolverElmer - material_obj = self.document.MechanicalMaterial - mesh_obj = self.document.Mesh - box_object = self.document.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.document, solver_obj) - - # set ThermalExpansionCoefficient - # 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_obj.Material = mat - - # elmer needs a GMHS mesh object - # FIXME error message on Python solver run - mesh_gmsh = ObjectsFem.makeMeshGmsh(self.document) - mesh_gmsh.CharacteristicLengthMin = "9 mm" - mesh_gmsh.FemMesh = mesh_obj.FemMesh - mesh_gmsh.Part = box_object - analysis_obj.addObject(mesh_gmsh) - self.document.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)) diff --git a/src/Mod/Fem/femtest/data/elmer/group_mesh.geo b/src/Mod/Fem/femtest/data/elmer/group_mesh.geo index e0558a5f98..55086c2668 100644 --- a/src/Mod/Fem/femtest/data/elmer/group_mesh.geo +++ b/src/Mod/Fem/femtest/data/elmer/group_mesh.geo @@ -13,7 +13,7 @@ Physical Volume("Solid1") = {1}; // no boundary layer settings for this mesh // min, max Characteristic Length Mesh.CharacteristicLengthMax = 1e+22; -Mesh.CharacteristicLengthMin = 9.0; +Mesh.CharacteristicLengthMin = 8.0; // optimize the mesh Mesh.Optimize = 1;