From 673f5d0745c121145f29657c1c240e51f75175fa Mon Sep 17 00:00:00 2001 From: marioalexis Date: Sat, 2 Mar 2024 10:25:59 -0300 Subject: [PATCH] Fem: Add partial support for hexahedral elements - fixes #12526 --- src/Mod/Fem/femmesh/gmshtools.py | 25 +++++++++++++++++++ src/Mod/Fem/femobjects/mesh_gmsh.py | 16 ++++++++++++ src/Mod/Fem/femtest/data/elmer/group_mesh.geo | 6 +++++ 3 files changed, 47 insertions(+) diff --git a/src/Mod/Fem/femmesh/gmshtools.py b/src/Mod/Fem/femmesh/gmshtools.py index b29114ada9..0bcfc6597b 100644 --- a/src/Mod/Fem/femmesh/gmshtools.py +++ b/src/Mod/Fem/femmesh/gmshtools.py @@ -151,6 +151,17 @@ class GmshTools(): else: self.HighOrderOptimize = "0" + # SubdivisionAlgorithm + algoSubdiv = self.mesh_obj.SubdivisionAlgorithm + if algoSubdiv == "All Quadrangles": + self.SubdivisionAlgorithm = "1" + elif algoSubdiv == "All Hexahedra": + self.SubdivisionAlgorithm = "2" + elif algoSubdiv == "Barycentric": + self.SubdivisionAlgorithm = "3" + else: + self.SubdivisionAlgorithm = "0" + # mesh groups if self.mesh_obj.GroupsOfNodes is True: self.group_nodes_export = True @@ -858,6 +869,20 @@ class GmshTools(): geo.write("Mesh.Algorithm3D = " + self.algorithm3D + ";\n") geo.write("\n") + geo.write("// subdivision algorithm\n") + geo.write("Mesh.SubdivisionAlgorithm = " + self.SubdivisionAlgorithm + ";\n") + geo.write("\n") + + geo.write("// incomplete second order elements\n") + if (self.SubdivisionAlgorithm == "1" + or self.SubdivisionAlgorithm == "2" + or self.mesh_obj.RecombineAll): + sec_order_inc = "1" + else: + sec_order_inc = "0" + geo.write("Mesh.SecondOrderIncomplete = " + sec_order_inc + ";\n") + geo.write("\n") + geo.write("// meshing\n") # remove duplicate vertices # see https://forum.freecad.org/viewtopic.php?f=18&t=21571&start=20#p179443 diff --git a/src/Mod/Fem/femobjects/mesh_gmsh.py b/src/Mod/Fem/femobjects/mesh_gmsh.py index 386a7ae638..0c8a9e13b0 100644 --- a/src/Mod/Fem/femobjects/mesh_gmsh.py +++ b/src/Mod/Fem/femobjects/mesh_gmsh.py @@ -73,6 +73,12 @@ class MeshGmsh(base_fempythonobject.BaseFemPythonObject): "Elastic", "Fast curving" ] + known_mesh_SubdivisionAlgorithms = [ + "None", + "All Quadrangles", + "All Hexahedra", + "Barycentric" + ] def __init__(self, obj): super(MeshGmsh, self).__init__(obj) @@ -305,3 +311,13 @@ class MeshGmsh(base_fempythonobject.BaseFemPythonObject): "For each group create not only the elements but the nodes too." ) obj.GroupsOfNodes = False + + if not hasattr(obj, "SubdivisionAlgorithm"): + obj.addProperty( + "App::PropertyEnumeration", + "SubdivisionAlgorithm", + "FEM Gmsh Mesh Params", + "Mesh subdivision algorithm" + ) + obj.SubdivisionAlgorithm = MeshGmsh.known_mesh_SubdivisionAlgorithms + obj.SubdivisionAlgorithm = "None" diff --git a/src/Mod/Fem/femtest/data/elmer/group_mesh.geo b/src/Mod/Fem/femtest/data/elmer/group_mesh.geo index c20ca320ae..809ee15158 100644 --- a/src/Mod/Fem/femtest/data/elmer/group_mesh.geo +++ b/src/Mod/Fem/femtest/data/elmer/group_mesh.geo @@ -35,6 +35,12 @@ Mesh.Algorithm = 2; // 3D mesh algorithm (1=Delaunay, 2=New Delaunay, 4=Frontal, 7=MMG3D, 9=R-tree, 10=HTX) Mesh.Algorithm3D = 1; +// subdivision algorithm +Mesh.SubdivisionAlgorithm = 0; + +// incomplete second order elements +Mesh.SecondOrderIncomplete = 0; + // meshing Geometry.Tolerance = 1e-06; // set geometrical tolerance (also used for merging nodes) Mesh 3;