Salome HOME
[bos #40505][CEA] Allow assign of 3D Tetra paramam on imported 2D mesh.
[modules/smesh.git] / test / netgen_runner.py
1 #!/usr/bin/env python
2 import sys
3 import salome
4
5 salome.salome_init()
6
7 from os import path
8 import tempfile
9 import subprocess
10
11 import GEOM, SMESH, SALOMEDS
12
13 from salome.geom import geomBuilder
14 from salome.smesh import smeshBuilder
15
16 import math
17
18 smesh = smeshBuilder.New()
19 geompy = geomBuilder.New()
20
21 import medcoupling as mc
22
23 def create_param_file(param_file):
24     """ Create a parameter file for runner """
25     param = """1
26 34.64
27 0.14
28 16
29 0.15
30 1.5
31 0
32 0
33 1
34 5
35 1
36 1
37 -1
38 3
39 3
40 0.2
41 2
42 1
43 0
44 0
45 2
46 2
47 0
48
49 0
50 0
51 0"""
52     with open(param_file, "w") as ffile:
53         ffile.write(param)
54
55
56 def test_netgen3d():
57     """ Test netgen3d mesher """
58     # Building geometry
59     box = geompy.MakeBoxDXDYDZ(200, 200, 200)
60
61     geompy.ExtractShapes(box, geompy.ShapeType["FACE"], True)
62     groupe_1 = geompy.CreateGroup(box, geompy.ShapeType["FACE"] )
63     geompy.UnionIDs(groupe_1, [3, 13, 23, 27, 31, 33])
64
65     [_, _, _, _, _, _, groupe_1] = geompy.GetExistingSubObjects(box, False)
66     
67     shape_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
68     oneFace = shape_faces[0]
69
70     # Creating 2D mesh
71     netgen_2d_parameters_1 = smesh.CreateHypothesisByAverageLength(
72         'NETGEN_Parameters_2D', 'NETGENEngine', 34.641, 0)
73     
74     mesh_2d = smesh.Mesh(box, 'Maillage_1')
75     mesh_2d.AddHypothesis(box, netgen_2d_parameters_1)
76
77     mesh_2d.Triangle(algo=smeshBuilder.NETGEN_1D2D)
78     isDone = mesh_2d.Compute()
79
80     if not isDone:
81         raise Exception("Error when computing Mesh")
82
83     smesh.SetName(mesh_2d, 'Maillage_1')
84
85     with tempfile.TemporaryDirectory() as tmp_dir:
86         mesh_file = path.join(tmp_dir, "mesh.med")
87         shape_file = path.join(tmp_dir, "shape.step")
88         param_file = path.join(tmp_dir, "param.txt")
89         output_mesh = path.join(tmp_dir, "mesh3D.med")
90
91         print("Running in folder: ", tmp_dir)
92         create_param_file(param_file)
93
94         mesh_2d.ExportMED(mesh_file, 0, 41, 1, mesh_2d, 1, [], '', -1, 1)
95         geompy.ExportSTEP(box, shape_file, GEOM.LU_METER)
96
97         runner = path.join("${NETGENPLUGIN_ROOT_DIR}",
98                            "bin",
99                            "salome",
100                            "NETGENPlugin_Runner")
101
102         if sys.platform == 'win32':
103             runner += ".exe"
104
105         cmd = "{runner} NETGEN3D {mesh_file} {shape_file} "\
106               "{param_file} NONE NONE {output_mesh}"\
107               .format(runner=runner,
108                       mesh_file=mesh_file,
109                       shape_file=shape_file,
110                       param_file=param_file,
111                       output_mesh=output_mesh)
112         print(cmd)
113         subprocess.check_call(cmd, shell=True)
114
115         mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", 0)
116
117         nb_tetras = mesh_read.getNumberOfCellsWithType(mc.NORM_TETRA4)
118         nb_points = mesh_read.getNumberOfNodes()
119
120         mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", -1)
121         nb_triangles = mesh_read.getNumberOfCellsWithType(mc.NORM_TRI3)
122
123         mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", -2)
124         nb_segments = mesh_read.getNumberOfCellsWithType(mc.NORM_SEG2)
125
126         print("Nb Tetras:", nb_tetras)
127         print("Nb Triangles:", nb_triangles)
128         print("Nb Segments:", nb_segments)
129         print("Nb Points:", nb_points)
130
131         assert nb_points > 0
132         assert nb_segments > 0
133         assert nb_triangles > 0
134         assert nb_tetras > 0
135
136 if __name__ == "__main__":
137     if sys.platform == "win32":
138         print("Disabled on windows")
139         sys.exit(0)
140     test_netgen3d()