Salome HOME
[bos #38045][bos #38046] New SA versions of NETGEN and GMSH.
[modules/smesh.git] / test / gmsh_runner.py
diff --git a/test/gmsh_runner.py b/test/gmsh_runner.py
new file mode 100644 (file)
index 0000000..abbe92c
--- /dev/null
@@ -0,0 +1,238 @@
+#!/usr/bin/env python
+import sys
+import salome
+
+salome.salome_init()
+
+import time
+from os import path
+import tempfile
+import subprocess
+
+import GEOM, SMESH, SALOMEDS
+
+from salome.geom import geomBuilder
+from salome.smesh import smeshBuilder
+
+import math
+
+smesh = smeshBuilder.New()
+geompy = geomBuilder.New()
+
+import medcoupling as mc
+
+def create_gmsh_empty_param_file(param_file):
+    """ Create a parameter file for runner """
+    param = """0"""
+    with open(param_file, "w") as ffile:
+        ffile.write(param)
+
+def create_gmsh_param_file(param_file):
+    """ Create a parameter file for runner """
+    param = """1
+0
+0
+0
+0
+0
+0
+2
+1.0
+0.0
+1e22
+0.0
+0
+0
+0"""
+    with open(param_file, "w") as ffile:
+        ffile.write(param)
+
+
+def runTheMesher( mesh_2d, geo, emptyParam=False ):
+    nb_tetras = 0
+    nb_points = 0
+    nb_triangles = 0
+    nb_segments = 0
+    with tempfile.TemporaryDirectory() as tmp_dir:
+        mesh_file = path.join(tmp_dir, "mesh.med")
+        shape_file = path.join(tmp_dir, "shape.brep")
+        param_file = path.join(tmp_dir, "gmsh_param.txt")
+        new_elementsbinary = path.join(tmp_dir, "nodesAndElements.bin")
+        output_mesh = path.join(tmp_dir, "mesh3D.med")
+
+        print("Running in folder: ", tmp_dir)
+        if not ( emptyParam ):
+            create_gmsh_param_file(param_file)
+        else:
+            create_gmsh_empty_param_file(param_file)
+        mesh_2d.ExportMED(mesh_file, 0, 41, 1, mesh_2d, 1, [], '', -1, 1)
+        geompy.ExportBREP( geo, shape_file )
+        
+        runner = path.join("${GMSHPLUGIN_ROOT_DIR}",
+                           "bin",
+                           "salome",
+                           "GMSHPlugin_Runner")
+
+        if sys.platform == 'win32':
+            runner += ".exe"
+
+        cmd = "{runner} GMSH3D {mesh_file} {shape_file} "\
+              "{param_file} NONE {new_elementsbinary} {output_mesh}"\
+              .format(runner=runner,
+                      mesh_file=mesh_file,
+                      shape_file=shape_file,
+                      param_file=param_file,
+                      new_elementsbinary=new_elementsbinary,
+                      output_mesh=output_mesh)
+        print(cmd)
+        subprocess.check_call(cmd, shell=True)
+
+        mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", 0)
+
+        nb_tetras = mesh_read.getNumberOfCellsWithType(mc.NORM_TETRA4)
+        nb_points = mesh_read.getNumberOfNodes()
+
+        mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", -1)
+        nb_triangles = mesh_read.getNumberOfCellsWithType(mc.NORM_TRI3)
+
+        mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", -2)
+        nb_segments = mesh_read.getNumberOfCellsWithType(mc.NORM_SEG2)
+
+    return [nb_points, nb_segments, nb_triangles, nb_tetras]
+
+def test_gmsh3dDefault():
+    """ Test gmsh3d """
+    # Building geometry
+    box = geompy.MakeBoxDXDYDZ(200, 200, 200)
+
+    geompy.ExtractShapes(box, geompy.ShapeType["FACE"], True)
+    groupe_1 = geompy.CreateGroup(box, geompy.ShapeType["FACE"] )
+    geompy.UnionIDs(groupe_1, [3, 13, 23, 27, 31, 33])
+
+    [_, _, _, _, _, _, groupe_1] = geompy.GetExistingSubObjects(box, False)
+    
+    shape_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
+      
+    mesh_2d = smesh.Mesh(box, 'Maillage_1')
+
+    mesh_2d.Triangle(algo=smeshBuilder.NETGEN_1D2D)
+    isDone = mesh_2d.Compute()
+    premeshedTriangles  = mesh_2d.NbFaces()
+    premeshedTetras     = mesh_2d.NbVolumes() 
+
+    if not isDone:
+        raise Exception("Error when computing Mesh")
+
+    smesh.SetName(mesh_2d, 'Maillage_1')
+
+    [nb_points, nb_segments, nb_triangles, nb_tetras] = runTheMesher( mesh_2d, box )
+    
+
+    print("Nb Tetras:", nb_tetras)
+    print("Nb Triangles:", nb_triangles)
+    print("Nb Segments:", nb_segments)
+    print("Nb Points:", nb_points)
+    
+    assert premeshedTetras == 0      
+    assert nb_triangles == premeshedTriangles
+    assert nb_tetras == 6 # number of tetras for normalized 2D premesh (update if default 2D netgen change!)
+    assert nb_points == 8 # one node in each vertex of the cube
+    assert nb_segments > 0
+
+def test_gmsh3d():
+    """ Test gmsh3d """
+    # Building geometry
+    box = geompy.MakeBoxDXDYDZ(200, 200, 200)
+
+    geompy.ExtractShapes(box, geompy.ShapeType["FACE"], True)
+    groupe_1 = geompy.CreateGroup(box, geompy.ShapeType["FACE"] )
+    geompy.UnionIDs(groupe_1, [3, 13, 23, 27, 31, 33])
+
+    [_, _, _, _, _, _, groupe_1] = geompy.GetExistingSubObjects(box, False)
+    
+    shape_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
+
+    # Creating 2D mesh
+    netgen_2d_parameters_1 = smesh.CreateHypothesisByAverageLength(
+        'NETGEN_Parameters_2D', 'NETGENEngine', 34.641,  0 )
+    
+    mesh_2d = smesh.Mesh(box, 'Maillage_1')
+    mesh_2d.AddHypothesis(box, netgen_2d_parameters_1)
+
+    mesh_2d.Triangle(algo=smeshBuilder.NETGEN_1D2D)
+    isDone = mesh_2d.Compute()
+    premeshedTriangles  = mesh_2d.NbFaces()
+    premeshedTetras     = mesh_2d.NbVolumes() 
+
+    if not isDone:
+        raise Exception("Error when computing Mesh")
+
+    smesh.SetName(mesh_2d, 'Maillage_1')
+
+    [nb_points, nb_segments, nb_triangles, nb_tetras] = runTheMesher( mesh_2d, box )
+    
+
+    print("Nb Tetras:", nb_tetras)
+    print("Nb Triangles:", nb_triangles)
+    print("Nb Segments:", nb_segments)
+    print("Nb Points:", nb_points)
+    
+    assert premeshedTetras == 0      
+    assert nb_triangles == premeshedTriangles
+    assert nb_tetras > 6
+    assert nb_points > 8
+    assert nb_segments > 0
+    
+def test_gmsh3d_empty_parameters():
+    """ Test gmsh3d """
+    # Building geometry
+    box = geompy.MakeBoxDXDYDZ(200, 200, 200)
+
+    geompy.ExtractShapes(box, geompy.ShapeType["FACE"], True)
+    groupe_1 = geompy.CreateGroup(box, geompy.ShapeType["FACE"] )
+    geompy.UnionIDs(groupe_1, [3, 13, 23, 27, 31, 33])
+
+    [_, _, _, _, _, _, groupe_1] = geompy.GetExistingSubObjects(box, False)
+    
+    shape_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
+
+    # Creating 2D mesh
+    netgen_2d_parameters_1 = smesh.CreateHypothesisByAverageLength(
+        'NETGEN_Parameters_2D', 'NETGENEngine', 34.641,  0 )
+    
+    mesh_2d = smesh.Mesh(box, 'Maillage_1')
+    mesh_2d.AddHypothesis(box, netgen_2d_parameters_1)
+
+    mesh_2d.Triangle(algo=smeshBuilder.NETGEN_1D2D)
+    isDone = mesh_2d.Compute()
+    premeshedTriangles  = mesh_2d.NbFaces()
+    premeshedTetras     = mesh_2d.NbVolumes() 
+
+    if not isDone:
+        raise Exception("Error when computing Mesh")
+
+    smesh.SetName(mesh_2d, 'Maillage_1')
+
+    [nb_points, nb_segments, nb_triangles, nb_tetras] = runTheMesher( mesh_2d, box, True )
+    
+
+    print("Nb Tetras:", nb_tetras)
+    print("Nb Triangles:", nb_triangles)
+    print("Nb Segments:", nb_segments)
+    print("Nb Points:", nb_points)
+    
+    assert premeshedTetras == 0      
+    assert nb_triangles == premeshedTriangles
+    assert nb_tetras > 6
+    assert nb_points > 8
+    assert nb_segments > 0
+
+if __name__ == "__main__":
+    if sys.platform == "win32":
+        print("Disabled on windows")
+        sys.exit(0)
+
+    test_gmsh3dDefault()
+    test_gmsh3d()
+    test_gmsh3d_empty_parameters()
+