1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2020 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 from .geomsmesh import geompy
23 from .geomsmesh import smesh
24 from salome.smesh import smeshBuilder
26 from salome.StdMeshers import StdMeshersBuilder
27 from .putName import putName
29 # -----------------------------------------------------------------------------
30 # --- maillage du bloc partitionne
32 def meshBlocPart(blocPartition, faceFissure, tore, centres, edges, diams, circles, faces, \
33 gencnt, facefissoutore, edgeext, facesExternes, facesExtBloc, facesExtElli, \
34 aretesInternes, internalBoundary, ellipsoidep, sharedFaces, sharedEdges, edgesBords, \
35 nbsegExt, nbsegGen, nbsegRad, scaleRad, reverses, reverext, nbsegCercle, nbsegFis, dmoyen, lensegEllipsoide, \
37 """Maillage du bloc partitionné
43 # --- edges de bord Ă respecter
45 aFilterManager = smesh.CreateFilterManager()
46 nbAdded, internalBoundary, _NoneGroup = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [ ])
48 unCritere = smesh.GetCriterion(SMESH.EDGE,SMESH.FT_FreeBorders,SMESH.FT_Undefined,0)
49 criteres.append(unCritere)
50 filtre = smesh.GetFilterFromCriteria(criteres)
51 bordsLibres = internalBoundary.MakeGroupByFilter( 'bords', filtre )
52 smesh.SetName(bordsLibres, 'bordsLibres')
56 bloc1 = smesh.Mesh(blocPartition)
58 for i, sharedFaces_i in enumerate(sharedFaces):
59 algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN, geom=sharedFaces_i)
60 hypo2d = algo2d.Parameters(which=smesh.SIMPLE)
61 hypo2d.SetLocalLength(lensegEllipsoide)
62 hypo2d.LengthFromEdges()
63 hypo2d.SetAllowQuadrangles(0)
64 putName(algo2d.GetSubMesh(), "sharedFaces", i)
65 putName(algo2d, "algo2d_sharedFaces", i)
66 putName(hypo2d, "hypo2d_sharedFaces", i)
68 for i, sharedEdges_i in enumerate(sharedEdges):
69 algo1d = bloc1.Segment(geom=sharedEdges_i)
70 hypo1d = algo1d.LocalLength(lensegEllipsoide)
71 putName(algo1d.GetSubMesh(), "sharedEdges", i)
72 putName(algo1d, "algo1d_sharedEdges", i)
73 putName(hypo1d, "hypo1d_sharedEdges", i)
75 declareAlgoEllipsoideFirst = False
76 if declareAlgoEllipsoideFirst:
77 algo3d = bloc1.Tetrahedron(algo=smeshBuilder.NETGEN,geom=ellipsoidep)
78 hypo3d = algo3d.MaxElementVolume(1000.0)
79 putName(algo3d.GetSubMesh(), "ellipsoide")
80 putName(algo3d, "algo3d_ellipsoide")
81 putName(hypo3d, "hypo3d_ellipsoide")
83 algo3d = bloc1.Prism(geom=tore)
84 algo2d = bloc1.Quadrangle(geom=tore)
85 algo1d = bloc1.Segment(geom=tore)
86 hypo1d = algo1d.NumberOfSegments(nbsegGen)
87 putName(algo3d.GetSubMesh(), "tore")
88 putName(algo3d, "algo3d_tore")
89 putName(algo2d, "algo2d_tore")
90 putName(algo1d, "algo1d_tore")
91 putName(hypo1d, "hypo1d_tore")
93 for i, faces_i in enumerate(faces):
94 algo2d = bloc1.Quadrangle(geom=faces_i)
95 hypo2d = smesh.CreateHypothesis('QuadrangleParams')
96 hypo2d.SetTriaVertex( geompy.GetSubShapeID(blocPartition,centres[i]) )
97 hypo2d.SetQuadType( StdMeshersBuilder.QUAD_STANDARD )
98 status = bloc1.AddHypothesis(hypo2d,faces_i)
99 putName(algo2d.GetSubMesh(), "faces", i)
100 putName(algo2d, "algo2d_faces", i)
101 putName(hypo2d, "hypo2d_faces", i)
103 for i, edges_i in enumerate(edges):
104 algo1d = bloc1.Segment(geom=edges_i)
106 hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[ geompy.GetSubShapeID(blocPartition,edges_i) ])
108 hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[ ])
109 putName(algo1d.GetSubMesh(), "edges", i)
110 putName(algo1d, "algo1d_edges", i)
111 putName(hypo1d, "hypo1d_edges", i)
113 for i, circles_i in enumerate(circles):
114 algo1d = bloc1.Segment(geom=circles_i)
115 hypo1d = algo1d.NumberOfSegments(nbsegCercle)
116 putName(algo1d.GetSubMesh(), "circles", i)
117 putName(algo1d, "algo1d_circles", i)
118 putName(hypo1d, "hypo1d_circles", i)
120 if len(edgeext) == 1:
121 densite = int(round(nbsegFis/2))
122 algo1d = bloc1.Segment(geom=edgeext[0])
123 hypo1d = algo1d.NumberOfSegments(nbsegFis)
124 hypo1d.SetDistrType( 2 )
125 hypo1d.SetConversionMode( 1 )
126 hypo1d.SetTableFunction( [ 0, densite, 0.4, 1, 0.6, 1, 1, densite ] )
127 putName(algo1d.GetSubMesh(), "edgeext")
128 putName(algo1d, "algo1d_edgeext")
129 putName(hypo1d, "hypo1d_edgeext")
132 longEdgeExts = list()
133 for i, edgeext_i in enumerate(edgeext):
134 props = geompy.BasicProperties(edgeext_i)
135 longEdgeExts.append(props[0])
136 longTotal += props[0]
137 for i, edgeext_i in enumerate(edgeext):
138 local = longTotal/nbsegFis
139 nbLocal = int(round(nbsegFis*longEdgeExts[i]/longTotal))
140 densite = int(round(nbLocal/2))
141 algo1d = bloc1.Segment(geom=edgeext_i)
142 hypo1d = algo1d.NumberOfSegments(nbLocal)
143 hypo1d.SetDistrType( 2 )
144 hypo1d.SetConversionMode( 1 )
145 hypo1d.SetTableFunction( [ 0, densite, 0.8, 1, 1, 1 ] )
147 hypo1d.SetReversedEdges([ geompy.GetSubShapeID(blocPartition, edgeext_i) ])
148 putName(algo1d.GetSubMesh(), "edgeext", i)
149 putName(algo1d, "algo1d_edgeext", i)
150 putName(hypo1d, "hypo1d_edgeext", i)
152 algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN_2D, geom=facefissoutore)
153 hypo2d = algo2d.LengthFromEdges()
154 putName(algo2d.GetSubMesh(), "facefissoutore")
155 putName(algo2d, "algo2d_facefissoutore")
156 putName(hypo2d, "hypo2d_facefissoutore")
159 maxElemArea = 0.5*dmoyen*dmoyen
160 logging.debug("dmoyen %s, maxElemArea %s", dmoyen, maxElemArea)
162 for i, facesExternes_i in enumerate(facesExternes):
163 algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN_2D, geom=facesExternes_i)
164 hypo2d = algo2d.MaxElementArea(maxElemArea)
165 if edgesBords is None:
166 algo1d = bloc1.Segment(geom=facesExternes_i)
167 hypo1d = algo1d.NumberOfSegments(1)
168 putName(algo2d.GetSubMesh(), "facesExternes", i)
169 putName(algo2d, "algo2d_facesExternes", i)
170 putName(hypo2d, "hypo2d_facesExternes", i)
171 if edgesBords is None:
172 putName(algo1d, "algo1d_facesExternes", i)
173 putName(hypo1d, "hypo1d_facesExternes", i)
175 for i, aretesInternes_i in enumerate(aretesInternes):
176 algo1d = bloc1.Segment(geom=aretesInternes_i)
177 hypo1d = algo1d.NumberOfSegments(nbsegExt)
178 putName(algo1d.GetSubMesh(), "aretesInternes", i)
179 putName(algo1d, "algo1d_aretesInternes", i)
180 putName(hypo1d, "hypo1d_aretesInternes", i)
182 if edgesBords is not None:
183 algo1d = bloc1.UseExisting1DElements(geom=edgesBords)
184 hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
185 putName(algo1d.GetSubMesh(), "bordsLibres")
186 putName(algo1d, "algo1d_bordsLibres")
187 putName(hypo1d, "hypo1d_bordsLibres")
189 if not declareAlgoEllipsoideFirst:
190 algo3d = bloc1.Tetrahedron(algo=smeshBuilder.NETGEN,geom=ellipsoidep)
191 hypo3d = algo3d.MaxElementVolume(1000.0)
192 putName(algo3d.GetSubMesh(), "ellipsoide")
193 putName(algo3d, "algo3d_ellipsoide")
194 putName(hypo3d, "hypo3d_ellipsoide")
196 faceFissure1 = bloc1.GroupOnGeom(faceFissure,'FACE1',SMESH.FACE)
197 noeudsFondFissure = bloc1.GroupOnGeom(gencnt,'nfondfis',SMESH.NODE)
199 groups_faceCommuneEllipsoideBloc = list()
200 for i, sharedFaces_i in enumerate(sharedFaces):
201 name = "faceCommuneEllipsoideBloc_%d"%i
202 groups_faceCommuneEllipsoideBloc.append(bloc1.GroupOnGeom(sharedFaces_i, name, SMESH.FACE))
203 groups_faceExterneBloc = list()
204 for i, facesExtBloc_i in enumerate(facesExtBloc):
205 name = "faceExterneBloc_%d"%i
206 groups_faceExterneBloc.append(bloc1.GroupOnGeom(facesExtBloc_i, name, SMESH.FACE))
208 is_done = bloc1.Compute()
209 text = "bloc1.Compute"
211 logging.info(text+" OK")
213 text = "Erreur au calcul du maillage.\n" + text
215 raise Exception(text)
217 nbRemoved = bloc1.RemoveOrphanNodes()
219 skinBlocMeshes = list()
220 for i, groups_faceCommuneEllipsoideBloc_i in enumerate(groups_faceCommuneEllipsoideBloc):
221 name = "faceCommuneEllipsoideBloc_%d"%i
222 skinBlocMeshes.append(smesh.CopyMesh(groups_faceCommuneEllipsoideBloc_i, name, 0, 0))
223 for i, groups_faceExterneBloc_i in enumerate(groups_faceExterneBloc):
224 name = "faceExterneBloc_%d"%i
225 skinBlocMeshes.append(smesh.CopyMesh(groups_faceExterneBloc_i, name, 0, 0))
227 meshesBloc = [internalBoundary.GetMesh()]
228 for i, skinBlocMeshes_i in enumerate(skinBlocMeshes):
229 meshesBloc.append(skinBlocMeshes_i.GetMesh())
230 blocMesh = smesh.Concatenate(meshesBloc, 1, 1, 1e-05,False)
232 algo3d = blocMesh.Tetrahedron(algo=smeshBuilder.NETGEN)
233 hypo3d = algo3d.MaxElementVolume(1000.0)
234 putName(algo3d.GetSubMesh(), "bloc")
235 putName(algo3d, "algo3d_bloc")
236 putName(hypo3d, "hypo3d_bloc")
238 is_done = blocMesh.Compute()
239 text = "blocMesh.Compute"
241 logging.info(text+" OK")
243 text = "Erreur au calcul du maillage.\n" + text
245 raise Exception(text)
247 blocComplet = smesh.Concatenate([bloc1.GetMesh(), blocMesh.GetMesh()], 1, 1, 1e-05,False)
249 return bloc1, blocComplet