1 # -*- coding: utf-8 -*-
4 from .geomsmesh import geompy
5 from .geomsmesh import smesh
6 from salome.smesh import smeshBuilder
8 from salome.StdMeshers import StdMeshersBuilder
9 from .putName import putName
11 # -----------------------------------------------------------------------------
12 # --- maillage du bloc partitionne
14 def meshBlocPart(blocPartition, faceFissure, tore, centres, edges, diams, circles, faces,
15 gencnt, facefissoutore, edgeext, facesExternes, facesExtBloc, facesExtElli,
16 aretesInternes, internalBoundary, ellipsoidep, sharedFaces, sharedEdges, edgesBords,
17 nbsegExt, nbsegGen, nbsegRad, scaleRad, reverses, reverext, nbsegCercle, nbsegFis, dmoyen, lensegEllipsoide):
19 Maillage du bloc partitionné
24 # --- edges de bord à respecter
26 aFilterManager = smesh.CreateFilterManager()
27 nbAdded, internalBoundary, _NoneGroup = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [ ])
29 unCritere = smesh.GetCriterion(SMESH.EDGE,SMESH.FT_FreeBorders,SMESH.FT_Undefined,0)
30 criteres.append(unCritere)
31 filtre = smesh.GetFilterFromCriteria(criteres)
32 bordsLibres = internalBoundary.MakeGroupByFilter( 'bords', filtre )
33 smesh.SetName(bordsLibres, 'bordsLibres')
37 bloc1 = smesh.Mesh(blocPartition)
39 for i in range(len(sharedFaces)):
40 algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN, geom=sharedFaces[i])
41 hypo2d = algo2d.Parameters(which=smesh.SIMPLE)
42 hypo2d.SetLocalLength(lensegEllipsoide)
43 hypo2d.LengthFromEdges()
44 hypo2d.SetAllowQuadrangles(0)
45 putName(algo2d.GetSubMesh(), "sharedFaces", i)
46 putName(algo2d, "algo2d_sharedFaces", i)
47 putName(hypo2d, "hypo2d_sharedFaces", i)
49 for i in range(len(sharedEdges)):
50 algo1d = bloc1.Segment(geom=sharedEdges[i])
51 hypo1d = algo1d.LocalLength(lensegEllipsoide)
52 putName(algo1d.GetSubMesh(), "sharedEdges", i)
53 putName(algo1d, "algo1d_sharedEdges", i)
54 putName(hypo1d, "hypo1d_sharedEdges", i)
56 declareAlgoEllipsoideFirst = False
57 if declareAlgoEllipsoideFirst:
58 algo3d = bloc1.Tetrahedron(algo=smeshBuilder.NETGEN,geom=ellipsoidep)
59 hypo3d = algo3d.MaxElementVolume(1000.0)
60 putName(algo3d.GetSubMesh(), "ellipsoide")
61 putName(algo3d, "algo3d_ellipsoide")
62 putName(hypo3d, "hypo3d_ellipsoide")
64 algo3d = bloc1.Prism(geom=tore)
65 algo2d = bloc1.Quadrangle(geom=tore)
66 algo1d = bloc1.Segment(geom=tore)
67 hypo1d = algo1d.NumberOfSegments(nbsegGen)
68 putName(algo3d.GetSubMesh(), "tore")
69 putName(algo3d, "algo3d_tore")
70 putName(algo2d, "algo2d_tore")
71 putName(algo1d, "algo1d_tore")
72 putName(hypo1d, "hypo1d_tore")
74 for i in range(len(faces)):
75 algo2d = bloc1.Quadrangle(geom=faces[i])
76 hypo2d = smesh.CreateHypothesis('QuadrangleParams')
77 hypo2d.SetTriaVertex( geompy.GetSubShapeID(blocPartition,centres[i]) )
78 hypo2d.SetQuadType( StdMeshersBuilder.QUAD_STANDARD )
79 status = bloc1.AddHypothesis(hypo2d,faces[i])
80 putName(algo2d.GetSubMesh(), "faces", i)
81 putName(algo2d, "algo2d_faces", i)
82 putName(hypo2d, "hypo2d_faces", i)
84 for i in range(len(edges)):
85 algo1d = bloc1.Segment(geom=edges[i])
87 hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[ geompy.GetSubShapeID(blocPartition,edges[i]) ])
89 hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[ ])
90 putName(algo1d.GetSubMesh(), "edges", i)
91 putName(algo1d, "algo1d_edges", i)
92 putName(hypo1d, "hypo1d_edges", i)
94 for i in range(len(circles)):
95 algo1d = bloc1.Segment(geom=circles[i])
96 hypo1d = algo1d.NumberOfSegments(nbsegCercle)
97 putName(algo1d.GetSubMesh(), "circles", i)
98 putName(algo1d, "algo1d_circles", i)
99 putName(hypo1d, "hypo1d_circles", i)
101 if len(edgeext) == 1:
102 densite = int(round(nbsegFis/2))
103 algo1d = bloc1.Segment(geom=edgeext[0])
104 hypo1d = algo1d.NumberOfSegments(nbsegFis)
105 hypo1d.SetDistrType( 2 )
106 hypo1d.SetConversionMode( 1 )
107 hypo1d.SetTableFunction( [ 0, densite, 0.4, 1, 0.6, 1, 1, densite ] )
108 putName(algo1d.GetSubMesh(), "edgeext")
109 putName(algo1d, "algo1d_edgeext")
110 putName(hypo1d, "hypo1d_edgeext")
114 for i in range(len(edgeext)):
115 props = geompy.BasicProperties(edgeext[i])
116 longEdgeExts.append(props[0])
117 longTotal += props[0]
118 for i in range(len(edgeext)):
119 local = longTotal/nbsegFis
120 nbLocal = int(round(nbsegFis*longEdgeExts[i]/longTotal))
121 densite = int(round(nbLocal/2))
122 algo1d = bloc1.Segment(geom=edgeext[i])
123 hypo1d = algo1d.NumberOfSegments(nbLocal)
124 hypo1d.SetDistrType( 2 )
125 hypo1d.SetConversionMode( 1 )
126 hypo1d.SetTableFunction( [ 0, densite, 0.8, 1, 1, 1 ] )
128 hypo1d.SetReversedEdges([ geompy.GetSubShapeID(blocPartition, edgeext[i]) ])
129 putName(algo1d.GetSubMesh(), "edgeext", i)
130 putName(algo1d, "algo1d_edgeext", i)
131 putName(hypo1d, "hypo1d_edgeext", i)
133 algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN_2D, geom=facefissoutore)
134 hypo2d = algo2d.LengthFromEdges()
135 putName(algo2d.GetSubMesh(), "facefissoutore")
136 putName(algo2d, "algo2d_facefissoutore")
137 putName(hypo2d, "hypo2d_facefissoutore")
140 maxElemArea = 0.5*dmoyen*dmoyen
141 logging.debug("dmoyen %s, maxElemArea %s", dmoyen, maxElemArea)
143 for i in range(len(facesExternes)):
144 algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN_2D, geom=facesExternes[i])
145 hypo2d = algo2d.MaxElementArea(maxElemArea)
146 if edgesBords is None:
147 algo1d = bloc1.Segment(geom=facesExternes[i])
148 hypo1d = algo1d.NumberOfSegments(1)
149 putName(algo2d.GetSubMesh(), "facesExternes", i)
150 putName(algo2d, "algo2d_facesExternes", i)
151 putName(hypo2d, "hypo2d_facesExternes", i)
152 if edgesBords is None:
153 putName(algo1d, "algo1d_facesExternes", i)
154 putName(hypo1d, "hypo1d_facesExternes", i)
156 for i in range(len(aretesInternes)):
157 algo1d = bloc1.Segment(geom=aretesInternes[i])
158 hypo1d = algo1d.NumberOfSegments(nbsegExt)
159 putName(algo1d.GetSubMesh(), "aretesInternes", i)
160 putName(algo1d, "algo1d_aretesInternes", i)
161 putName(hypo1d, "hypo1d_aretesInternes", i)
163 if edgesBords is not None:
164 algo1d = bloc1.UseExisting1DElements(geom=edgesBords)
165 hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
166 putName(algo1d.GetSubMesh(), "bordsLibres")
167 putName(algo1d, "algo1d_bordsLibres")
168 putName(hypo1d, "hypo1d_bordsLibres")
170 #isDone = bloc1.Compute()
172 if not declareAlgoEllipsoideFirst:
173 algo3d = bloc1.Tetrahedron(algo=smeshBuilder.NETGEN,geom=ellipsoidep)
174 hypo3d = algo3d.MaxElementVolume(1000.0)
175 putName(algo3d.GetSubMesh(), "ellipsoide")
176 putName(algo3d, "algo3d_ellipsoide")
177 putName(hypo3d, "hypo3d_ellipsoide")
179 isDone = bloc1.Compute()
181 nbRemoved = bloc1.RemoveOrphanNodes()
183 faceFissure1 = bloc1.GroupOnGeom(faceFissure,'FACE1',SMESH.FACE)
184 noeudsFondFissure = bloc1.GroupOnGeom(gencnt,'nfondfis',SMESH.NODE)
186 groups_faceCommuneEllipsoideBloc = []
187 for i in range(len(sharedFaces)):
188 name = "faceCommuneEllipsoideBloc_%d"%i
189 groups_faceCommuneEllipsoideBloc.append(bloc1.GroupOnGeom(sharedFaces[i], name, SMESH.FACE))
190 groups_faceExterneBloc = []
191 for i in range(len(facesExtBloc)):
192 name = "faceExterneBloc_%d"%i
193 groups_faceExterneBloc.append(bloc1.GroupOnGeom(facesExtBloc[i], name, SMESH.FACE))
196 for i in range(len(groups_faceCommuneEllipsoideBloc)):
197 name = "faceCommuneEllipsoideBloc_%d"%i
198 skinBlocMeshes.append(smesh.CopyMesh(groups_faceCommuneEllipsoideBloc[i], name, 0, 0))
199 for i in range(len(groups_faceExterneBloc)):
200 name = "faceExterneBloc_%d"%i
201 skinBlocMeshes.append(smesh.CopyMesh(groups_faceExterneBloc[i], name, 0, 0))
203 meshesBloc = [internalBoundary.GetMesh()]
204 for i in range(len(skinBlocMeshes)):
205 meshesBloc.append(skinBlocMeshes[i].GetMesh())
206 blocMesh = smesh.Concatenate(meshesBloc, 1, 1, 1e-05,False)
208 algo3d = blocMesh.Tetrahedron(algo=smeshBuilder.NETGEN)
209 hypo3d = algo3d.MaxElementVolume(1000.0)
210 putName(algo3d.GetSubMesh(), "bloc")
211 putName(algo3d, "algo3d_bloc")
212 putName(hypo3d, "hypo3d_bloc")
214 is_done = blocMesh.Compute()
216 blocComplet = smesh.Concatenate([bloc1.GetMesh(), blocMesh.GetMesh()], 1, 1, 1e-05,False)
218 return bloc1, blocComplet