From de9329a6c1dc2ef62b22a03652f9f02a99dd7a51 Mon Sep 17 00:00:00 2001 From: UR-0 Date: Sun, 7 Mar 2021 11:41:31 +0100 Subject: [PATCH] [FEM]implement Gmsh mesh property "MeshSizeFromCurvature" --- src/Mod/Fem/femmesh/gmshtools.py | 11 +++++++++-- src/Mod/Fem/femobjects/mesh_gmsh.py | 9 +++++++++ src/Mod/Fem/femtest/data/elmer/group_mesh.geo | 3 ++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/Mod/Fem/femmesh/gmshtools.py b/src/Mod/Fem/femmesh/gmshtools.py index 46f1858a85..87472180f6 100644 --- a/src/Mod/Fem/femmesh/gmshtools.py +++ b/src/Mod/Fem/femmesh/gmshtools.py @@ -708,11 +708,17 @@ class GmshTools(): geo.write("Mesh.CharacteristicLengthMin = " + str(0) + ";\n") else: geo.write("Mesh.CharacteristicLengthMin = " + str(self.clmin) + ";\n") + if hasattr(self.mesh_obj, "MeshSizeFromCurvature"): + geo.write( + "Mesh.MeshSizeFromCurvature = " + str(self.mesh_obj.MeshSizeFromCurvature) + + "; // number of elements per 2*pi radians, 0 to deactivate\n" + ) geo.write("\n") if hasattr(self.mesh_obj, "RecombineAll") and self.mesh_obj.RecombineAll is True: geo.write("// other mesh options\n") geo.write("Mesh.RecombineAll = 1;\n") geo.write("\n") + geo.write("// optimize the mesh\n") # Gmsh tetra optimizer if hasattr(self.mesh_obj, "OptimizeStd") and self.mesh_obj.OptimizeStd is True: @@ -727,15 +733,16 @@ class GmshTools(): # higher order mesh optimizing if hasattr(self.mesh_obj, "HighOrderOptimize") and self.mesh_obj.HighOrderOptimize is True: geo.write( - "Mesh.HighOrderOptimize = 1; // for more HighOrderOptimize " + "Mesh.HighOrderOptimize = 1; // for more HighOrderOptimize " "parameter check http://gmsh.info/doc/texinfo/gmsh.html\n" ) else: geo.write( - "Mesh.HighOrderOptimize = 0; // for more HighOrderOptimize " + "Mesh.HighOrderOptimize = 0; // for more HighOrderOptimize " "parameter check http://gmsh.info/doc/texinfo/gmsh.html\n" ) geo.write("\n") + geo.write("// mesh order\n") geo.write("Mesh.ElementOrder = " + self.order + ";\n") if self.order == "2": diff --git a/src/Mod/Fem/femobjects/mesh_gmsh.py b/src/Mod/Fem/femobjects/mesh_gmsh.py index 6b5ec792e3..90ba9e90ea 100644 --- a/src/Mod/Fem/femobjects/mesh_gmsh.py +++ b/src/Mod/Fem/femobjects/mesh_gmsh.py @@ -212,6 +212,15 @@ class MeshGmsh(base_fempythonobject.BaseFemPythonObject): # https://forum.freecadweb.org/viewtopic.php?t=41738 # https://forum.freecadweb.org/viewtopic.php?f=18&t=45260&start=20#p389494 + if not hasattr(obj, "MeshSizeFromCurvature"): + obj.addProperty( + "App::PropertyIntegerConstraint", + "MeshSizeFromCurvature", + "FEM Gmsh Mesh Params", + "number of elements per 2*pi radians, 0 to deactivate" + ) + obj.MeshSizeFromCurvature = (12, 0, 10000, 1) + if not hasattr(obj, "Algorithm2D"): obj.addProperty( "App::PropertyEnumeration", diff --git a/src/Mod/Fem/femtest/data/elmer/group_mesh.geo b/src/Mod/Fem/femtest/data/elmer/group_mesh.geo index 55086c2668..e28df28f6e 100644 --- a/src/Mod/Fem/femtest/data/elmer/group_mesh.geo +++ b/src/Mod/Fem/femtest/data/elmer/group_mesh.geo @@ -14,11 +14,12 @@ Physical Volume("Solid1") = {1}; // min, max Characteristic Length Mesh.CharacteristicLengthMax = 1e+22; Mesh.CharacteristicLengthMin = 8.0; +Mesh.MeshSizeFromCurvature = 12; // number of elements per 2*pi radians, 0 to deactivate // optimize the mesh Mesh.Optimize = 1; Mesh.OptimizeNetgen = 0; -Mesh.HighOrderOptimize = 0; // for more HighOrderOptimize parameter check http://gmsh.info/doc/texinfo/gmsh.html +Mesh.HighOrderOptimize = 0; // for more HighOrderOptimize parameter check http://gmsh.info/doc/texinfo/gmsh.html // mesh order Mesh.ElementOrder = 2;