Salome HOME
[bos #32739][CEA] 3D warp
[modules/smesh.git] / test / SMESH_controls_3D_warping.py
1 #!/usr/bin/env python
2
3 import os
4 import sys
5 import salome
6 import tempfile
7
8 salome.salome_init()
9
10
11 def getTmpFileName(ext):
12   """
13   get a tmp file name
14   """
15   tempdir = tempfile.gettempdir()
16   tmp_file = tempfile.NamedTemporaryFile(suffix=".%s"%ext , dir=tempdir, delete=False)
17   tmp_filename = tmp_file.name
18   return tmp_filename
19
20 ###
21 ### SHAPER component
22 ###
23
24 from salome.shaper import model
25
26 model.begin()
27 partSet = model.moduleDocument()
28 Part_1 = model.addPart(partSet)
29 Part_1_doc = Part_1.document()
30 Cylinder_1 = model.addCylinder(Part_1_doc, model.selection("VERTEX", "PartSet/Origin"), model.selection("EDGE", "PartSet/OZ"), 1, 7)
31 Point_2 = model.addPoint(Part_1_doc, 1, 0, 1.5)
32 Point_3 = model.addPoint(Part_1_doc, 0.5, 0, 3.5)
33 Sphere_1 = model.addSphere(Part_1_doc, model.selection("VERTEX", "Point_1"), 0.75)
34 Cylinder_2 = model.addCylinder(Part_1_doc, model.selection("VERTEX", "Point_2"), model.selection("EDGE", "PartSet/OX"), 0.6, 3)
35 Fuse_1_objects_1 = [model.selection("SOLID", "Cylinder_2_1"),
36                     model.selection("SOLID", "Cylinder_1_1"),
37                     model.selection("SOLID", "Sphere_1_1")]
38 Fuse_1 = model.addFuse(Part_1_doc, Fuse_1_objects_1, keepSubResults = True)
39 model.end()
40
41 expected_volume = 25.881416712512
42 model.testResultsVolumes(Fuse_1, [expected_volume])
43
44 ###
45 ### SHAPERSTUDY component
46 ###
47
48 model.publishToShaperStudy()
49 import SHAPERSTUDY
50 Fuse_1_1, = SHAPERSTUDY.shape(model.featureStringId(Fuse_1))
51
52 ###
53 ### SMESH component
54 ###
55
56 import  SMESH, SALOMEDS
57 from salome.smesh import smeshBuilder
58
59 smesh = smeshBuilder.New()
60 # Surface Mesh
61 # ============
62
63 Mesh_1 = smesh.Mesh(Fuse_1_1, "Mesh_1")
64 NETGEN_1D_2D = Mesh_1.Triangle(algo=smeshBuilder.NETGEN_1D2D)
65 NETGEN_2D_Parameters_1 = NETGEN_1D_2D.Parameters()
66 NETGEN_2D_Parameters_1.SetMaxSize( 0.75 )
67 NETGEN_2D_Parameters_1.SetMinSize( 0 )
68 NETGEN_2D_Parameters_1.SetSecondOrder( 0 )
69 NETGEN_2D_Parameters_1.SetOptimize( 1 )
70 NETGEN_2D_Parameters_1.SetFineness( 5 )
71 NETGEN_2D_Parameters_1.SetGrowthRate( 0.1 )
72 NETGEN_2D_Parameters_1.SetNbSegPerEdge( 2 )
73 NETGEN_2D_Parameters_1.SetNbSegPerRadius( 4 )
74
75 isDone = Mesh_1.Compute()
76
77 if not isDone:
78   raise Exception("Error when computing the surface mesh")
79
80 # MG-Hexa mesh
81 # ============
82
83 MG_Hexa = Mesh_1.Hexahedron(algo=smeshBuilder.MG_Hexa)
84 isDone = Mesh_1.Compute()
85
86 if not isDone:
87   raise Exception("Error when computing volumes with MG-Hexa")
88
89 volume = smesh.GetVolume(Mesh_1)
90 #print("volume: ", volume)
91 assert abs(volume-expected_volume)/expected_volume < 0.03
92
93 assert Mesh_1.NbTriangles() == 0
94
95 nb_hexa = Mesh_1.NbHexas()
96 assert Mesh_1.NbVolumes() == nb_hexa
97
98 # MG-Hexa mesh with layers
99 # ========================
100
101 MG_Hexa_Parameters = MG_Hexa.Parameters()
102 MG_Hexa_Parameters.SetNbLayers( 3 )
103 MG_Hexa_Parameters.SetFirstLayerSize( 0.01 )
104 MG_Hexa_Parameters.SetGrowth( 1.1 )
105 MG_Hexa_Parameters.SetFacesWithLayers( [ 10, 3 ] )
106 MG_Hexa_Parameters.SetImprintedFaces( [ 18, 20, 22 ] )
107
108 isDone = Mesh_1.Compute()
109
110 if not isDone:
111   raise Exception("Error when computing volumes with MG-Hexa and layers")
112
113 nb_hexa_with_layers = Mesh_1.NbHexas()
114 assert Mesh_1.NbVolumes() == nb_hexa_with_layers
115 assert nb_hexa < nb_hexa_with_layers
116
117 volume_with_layers = smesh.GetVolume(Mesh_1)
118 #print("volume_with_layers: ", volume_with_layers)
119 assert abs(volume_with_layers-expected_volume)/expected_volume < 0.05
120
121 gr_small_volume = Mesh_1.MakeGroup("small_volumes_layers",
122                             SMESH.VOLUME,
123                             CritType=SMESH.FT_Volume3D,
124                             Compare=SMESH.FT_LessThan,
125                             Threshold=8e-5,
126                             Tolerance=1e-07)
127
128 layers_volume = smesh.GetVolume(gr_small_volume)
129 #print("layers_volume: ", layers_volume)
130 assert layers_volume < 0.9
131
132 # check max Warp3D
133 max_warp3D = Mesh_1.GetMinMax(SMESH.FT_Warping3D)[1]
134 print("max_warp3D: ", max_warp3D)
135 # Check that some elements are warped
136 assert max_warp3D > 1
137
138 gr_warp3D = Mesh_1.MakeGroup("warp3D",
139                             SMESH.VOLUME,
140                             CritType=SMESH.FT_Warping3D,
141                             Compare=SMESH.FT_MoreThan,
142                             Threshold=1,
143                             Tolerance=1e-07)
144
145 # Check the group has some elements
146 assert gr_warp3D.Size() > 0
147
148 # create a mesh with the faces of the hexaedra thanks to medcoupling
149 umesh_3D = Mesh_1.ExportMEDCoupling()[0]
150 # create faces
151 umesh_2D,d0,d1,d2,d3=umesh_3D.buildDescendingConnectivity()
152
153 # export the 2D mesh in a tmp file
154 tmp_filename = getTmpFileName("med")
155 umesh_2D.write(tmp_filename)
156
157 # import it in SMESH
158 ([Mesh_faces], status) = smesh.CreateMeshesFromMED( tmp_filename )
159
160 gr_warp2D = Mesh_faces.MakeGroup("warp2D",
161                             SMESH.FACE,
162                             CritType=SMESH.FT_Warping,
163                             Compare=SMESH.FT_MoreThan,
164                             Threshold=1,
165                             Tolerance=1e-07)
166
167 # check max Warp3D
168 max_warp2D = Mesh_faces.GetMinMax(SMESH.FT_Warping)[1]
169 print("max_warp2D: ", max_warp2D)
170 assert max_warp2D > 1
171
172 assert abs(max_warp2D-max_warp3D)/max_warp2D < 1e-5
173
174 os.remove(tmp_filename)
175
176 if salome.sg.hasDesktop():
177   salome.sg.updateObjBrowser()