1 # -*- coding: utf-8 -*-
7 theStudy = salome.myStudy
14 from salome.geom import geomBuilder
19 geompy = geomBuilder.New(theStudy)
21 O = geompy.MakeVertex(0, 0, 0)
22 OX = geompy.MakeVectorDXDYDZ(1, 0, 0)
23 OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
24 OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)
25 Cylinder_1 = geompy.MakeCylinderRH(0.5, 5)
26 Cylinder_2 = geompy.MakeCylinderRH(0.3, 3)
27 Rotation_1 = geompy.MakeRotation(Cylinder_2, OY, -90*math.pi/180.0)
28 Translation_1 = geompy.MakeTranslation(Rotation_1, 0, 0, 1.5)
29 piquage = geompy.MakeFuseList([Cylinder_1, Translation_1], True, True)
30 [Outlet] = geompy.SubShapes(piquage, [15])
31 [Inlet_z,Inlet_x] = geompy.SubShapes(piquage, [13, 22])
32 [corner] = geompy.SubShapes(piquage, [14])
33 geomObj_1 = geompy.MakeVertex(0, 0, 0)
34 geomObj_2 = geompy.MakeVectorDXDYDZ(1, 0, 0)
35 geomObj_3 = geompy.MakeVectorDXDYDZ(0, 1, 0)
36 geomObj_4 = geompy.MakeVectorDXDYDZ(0, 0, 1)
37 Wall = geompy.CreateGroup(piquage, geompy.ShapeType["FACE"])
38 geompy.UnionIDs(Wall, [3, 17])
39 geompy.addToStudy( O, 'O' )
40 geompy.addToStudy( OX, 'OX' )
41 geompy.addToStudy( OY, 'OY' )
42 geompy.addToStudy( OZ, 'OZ' )
43 geompy.addToStudy( Cylinder_1, 'Cylinder_1' )
44 geompy.addToStudy( Cylinder_2, 'Cylinder_2' )
45 geompy.addToStudy( Rotation_1, 'Rotation_1' )
46 geompy.addToStudy( Translation_1, 'Translation_1' )
47 geompy.addToStudy( piquage, 'piquage' )
48 geompy.addToStudyInFather( piquage, Inlet_x, 'Inlet_x' )
49 geompy.addToStudyInFather( piquage, Outlet, 'Outlet' )
50 geompy.addToStudyInFather( piquage, Wall, 'Wall' )
51 geompy.addToStudyInFather( piquage, Inlet_z, 'Inlet_z' )
52 geompy.addToStudyInFather( piquage, corner, 'corner' )
54 geom_groups = [Inlet_x, Inlet_z, Outlet, Wall]
61 import SMESH, SALOMEDS
62 from salome.smesh import smeshBuilder
64 from salome.StdMeshers import StdMeshersBuilder
65 from salome.HYBRIDPlugin import HYBRIDPluginBuilder
67 smesh = smeshBuilder.New(theStudy)
70 # Viscous layers without imprinting
71 # =================================
73 Mesh_1 = smesh.Mesh(piquage, "Mesh_without_imprinting")
74 NETGEN_2D = Mesh_1.Triangle(algo=smeshBuilder.NETGEN_1D2D)
75 NETGEN_2D_Parameters = NETGEN_2D.Parameters()
77 NETGEN_2D_Parameters.SetMinSize( 0.01 )
78 NETGEN_2D_Parameters.SetLocalSizeOnShape(corner, 0.01)
79 NETGEN_2D_Parameters.SetFineness( 5 )
80 NETGEN_2D_Parameters.SetGrowthRate( 0.1 )
81 NETGEN_2D_Parameters.SetNbSegPerEdge( 2 )
82 NETGEN_2D_Parameters.SetNbSegPerRadius( 3 )
84 MG_Hybrid = Mesh_1.Tetrahedron(algo=smeshBuilder.HYBRID)
85 MG_Hybrid_Parameters_1 = MG_Hybrid.Parameters()
86 MG_Hybrid_Parameters_1.SetLayersOnAllWrap( 0 )
87 MG_Hybrid_Parameters_1.SetElementGeneration( HYBRIDPluginBuilder.Generation_Tetra_Dominant )
88 MG_Hybrid_Parameters_1.SetHeightFirstLayer( 0.01 )
89 MG_Hybrid_Parameters_1.SetBoundaryLayersProgression( 1.1 )
90 MG_Hybrid_Parameters_1.SetNbOfBoundaryLayers( 3 )
91 MG_Hybrid_Parameters_1.SetFacesWithLayers( [ 3, 17 ] )
94 isDone = Mesh_1.Compute()
97 raise Exception("Error when computing Mesh_without_imprinting")
101 for geom_group in geom_groups:
102 name = geom_group.GetName()
103 gr = Mesh_1.Group(geom_group)
104 d_groups_1[name] = gr
105 d_geom_groups[name] = geom_group
107 assert Mesh_1.NbQuadrangles() == 0
109 shape_volume = geompy.BasicProperties(piquage)[2]
111 # Compare whole mesh volume
112 volume_error_1 = abs(shape_volume-Mesh_1.GetVolume())/shape_volume
114 assert volume_error_1 < 0.02
116 # Viscous layers with imprinting
117 # ==============================
119 Mesh_2 = smesh.Mesh(piquage, "Mesh_with_imprinting")
121 NETGEN_2D_1_1 = Mesh_2.Triangle(algo=smeshBuilder.NETGEN_1D2D)
122 status = Mesh_2.AddHypothesis(NETGEN_2D_Parameters)
124 MG_Hybrid_2 = Mesh_2.Tetrahedron(algo=smeshBuilder.HYBRID)
125 MG_Hybrid_Parameters_2 = MG_Hybrid_2.Parameters()
126 MG_Hybrid_Parameters_2.SetLayersOnAllWrap( 0 )
127 MG_Hybrid_Parameters_2.SetElementGeneration( HYBRIDPluginBuilder.Generation_Tetra_Dominant )
128 MG_Hybrid_Parameters_2.SetHeightFirstLayer( 0.01 )
129 MG_Hybrid_Parameters_2.SetBoundaryLayersProgression( 1.1 )
130 MG_Hybrid_Parameters_2.SetNbOfBoundaryLayers( 3 )
131 MG_Hybrid_Parameters_2.SetFacesWithLayers( [ 3, 17 ] )
132 MG_Hybrid_Parameters_2.SetFacesWithImprinting( [ 22, 15, 13 ] )
134 isDone = Mesh_2.Compute()
137 raise Exception("Error when computing Mesh_with_imprinting")
139 assert Mesh_2.NbQuadrangles() > 0
143 for geom_group in geom_groups:
144 name = geom_group.GetName()
145 gr = Mesh_2.Group(geom_group)
146 d_groups_2[name] = gr
148 faces_imprinted = ["Inlet_x", "Inlet_z", "Outlet"]
150 # Check viscous layers with imprinting
151 for name in faces_imprinted:
152 geom_area = geompy.BasicProperties(d_geom_groups[name])[1]
153 gr_1 = d_groups_1[name]
154 gr_2 = d_groups_2[name]
155 #assert gr_1.Size() > 0
156 assert gr_2.Size() > 0
157 # Nb of quadrangles is in 7th index of mesh info
158 assert gr_2.GetMeshInfo()[7] > 0
160 # Compare mesh group and geom group
161 area_error_1 = abs(geom_area-smesh.GetArea(gr_2))/geom_area
162 assert area_error_1 < 0.025
163 # Compare mesh group with imprinting and mesh group without imprinting
164 area_error_2 = abs(smesh.GetArea(gr_1)-smesh.GetArea(gr_2))/smesh.GetArea(gr_1)
165 assert area_error_2 < 1e-10
167 # Compare whole mesh volume
168 mesh_2_volume = Mesh_2.GetVolume()
169 volume_error_2 = abs(shape_volume-mesh_2_volume)/shape_volume
171 assert volume_error_2 < 0.02
173 # Viscous layers with imprinting set by groups
174 # ============================================
176 Mesh_3 = smesh.Mesh(piquage, "Mesh_with_imprinting_set_by_groups")
178 NETGEN_2D_1_1 = Mesh_3.Triangle(algo=smeshBuilder.NETGEN_1D2D)
179 status = Mesh_3.AddHypothesis(NETGEN_2D_Parameters)
181 MG_Hybrid_3 = Mesh_3.Tetrahedron(algo=smeshBuilder.HYBRID)
182 MG_Hybrid_Parameters_3 = MG_Hybrid_3.Parameters()
183 MG_Hybrid_Parameters_3.SetLayersOnAllWrap( 0 )
184 MG_Hybrid_Parameters_3.SetElementGeneration( HYBRIDPluginBuilder.Generation_Tetra_Dominant )
185 MG_Hybrid_Parameters_3.SetHeightFirstLayer( 0.01 )
186 MG_Hybrid_Parameters_3.SetBoundaryLayersProgression( 1.1 )
187 MG_Hybrid_Parameters_3.SetNbOfBoundaryLayers( 3 )
188 MG_Hybrid_3.SetFacesWithLayers( Wall )
189 MG_Hybrid_3.SetFacesWithImprinting( [ Inlet_x, Inlet_z, Outlet ] )
191 isDone = Mesh_3.Compute()
194 raise Exception("Error when computing Mesh_with_imprinting_set_by_groups")
198 for geom_group in geom_groups:
199 name = geom_group.GetName()
200 gr = Mesh_3.Group(geom_group)
201 d_groups_3[name] = gr
203 # Compare whole mesh volume
204 mesh_3_volume = Mesh_3.GetVolume()
205 volume_error_3 = abs(mesh_2_volume-mesh_3_volume)/mesh_2_volume
207 assert abs(mesh_3_volume-mesh_2_volume)/mesh_2_volume < 1e-10
209 # Check viscous layers with imprinting
210 for name in faces_imprinted:
211 gr_2 = d_groups_2[name]
212 gr_3 = d_groups_3[name]
213 assert gr_3.Size() > 0
214 # Nb of quadrangles is in 7th index of mesh info
215 assert gr_2.GetMeshInfo()[7] == gr_3.GetMeshInfo()[7]
217 # Compare mesh group with imprinting set by ids and mesh group with imprinting set by geom group
218 area_error_3 = abs(smesh.GetArea(gr_2)-smesh.GetArea(gr_3))/smesh.GetArea(gr_2)
219 assert area_error_3 < 1e-10
221 if salome.sg.hasDesktop():
222 salome.sg.updateObjBrowser(1)