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é
42 # --- edges de bord à respecter
44 aFilterManager = smesh.CreateFilterManager()
45 nbAdded, internalBoundary, _NoneGroup = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [ ])
47 unCritere = smesh.GetCriterion(SMESH.EDGE,SMESH.FT_FreeBorders,SMESH.FT_Undefined,0)
48 criteres.append(unCritere)
49 filtre = smesh.GetFilterFromCriteria(criteres)
50 bordsLibres = internalBoundary.MakeGroupByFilter( 'bords', filtre )
51 smesh.SetName(bordsLibres, 'bordsLibres')
55 bloc1 = smesh.Mesh(blocPartition)
57 for i in range(len(sharedFaces)):
58 algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN, geom=sharedFaces[i])
59 hypo2d = algo2d.Parameters(which=smesh.SIMPLE)
60 hypo2d.SetLocalLength(lensegEllipsoide)
61 hypo2d.LengthFromEdges()
62 hypo2d.SetAllowQuadrangles(0)
63 putName(algo2d.GetSubMesh(), "sharedFaces", i)
64 putName(algo2d, "algo2d_sharedFaces", i)
65 putName(hypo2d, "hypo2d_sharedFaces", i)
67 for i in range(len(sharedEdges)):
68 algo1d = bloc1.Segment(geom=sharedEdges[i])
69 hypo1d = algo1d.LocalLength(lensegEllipsoide)
70 putName(algo1d.GetSubMesh(), "sharedEdges", i)
71 putName(algo1d, "algo1d_sharedEdges", i)
72 putName(hypo1d, "hypo1d_sharedEdges", i)
74 declareAlgoEllipsoideFirst = False
75 if declareAlgoEllipsoideFirst:
76 algo3d = bloc1.Tetrahedron(algo=smeshBuilder.NETGEN,geom=ellipsoidep)
77 hypo3d = algo3d.MaxElementVolume(1000.0)
78 putName(algo3d.GetSubMesh(), "ellipsoide")
79 putName(algo3d, "algo3d_ellipsoide")
80 putName(hypo3d, "hypo3d_ellipsoide")
82 algo3d = bloc1.Prism(geom=tore)
83 algo2d = bloc1.Quadrangle(geom=tore)
84 algo1d = bloc1.Segment(geom=tore)
85 hypo1d = algo1d.NumberOfSegments(nbsegGen)
86 putName(algo3d.GetSubMesh(), "tore")
87 putName(algo3d, "algo3d_tore")
88 putName(algo2d, "algo2d_tore")
89 putName(algo1d, "algo1d_tore")
90 putName(hypo1d, "hypo1d_tore")
92 for i in range(len(faces)):
93 algo2d = bloc1.Quadrangle(geom=faces[i])
94 hypo2d = smesh.CreateHypothesis('QuadrangleParams')
95 hypo2d.SetTriaVertex( geompy.GetSubShapeID(blocPartition,centres[i]) )
96 hypo2d.SetQuadType( StdMeshersBuilder.QUAD_STANDARD )
97 status = bloc1.AddHypothesis(hypo2d,faces[i])
98 putName(algo2d.GetSubMesh(), "faces", i)
99 putName(algo2d, "algo2d_faces", i)
100 putName(hypo2d, "hypo2d_faces", i)
102 for i in range(len(edges)):
103 algo1d = bloc1.Segment(geom=edges[i])
105 hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[ geompy.GetSubShapeID(blocPartition,edges[i]) ])
107 hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[ ])
108 putName(algo1d.GetSubMesh(), "edges", i)
109 putName(algo1d, "algo1d_edges", i)
110 putName(hypo1d, "hypo1d_edges", i)
112 for i in range(len(circles)):
113 algo1d = bloc1.Segment(geom=circles[i])
114 hypo1d = algo1d.NumberOfSegments(nbsegCercle)
115 putName(algo1d.GetSubMesh(), "circles", i)
116 putName(algo1d, "algo1d_circles", i)
117 putName(hypo1d, "hypo1d_circles", i)
119 if len(edgeext) == 1:
120 densite = int(round(nbsegFis/2))
121 algo1d = bloc1.Segment(geom=edgeext[0])
122 hypo1d = algo1d.NumberOfSegments(nbsegFis)
123 hypo1d.SetDistrType( 2 )
124 hypo1d.SetConversionMode( 1 )
125 hypo1d.SetTableFunction( [ 0, densite, 0.4, 1, 0.6, 1, 1, densite ] )
126 putName(algo1d.GetSubMesh(), "edgeext")
127 putName(algo1d, "algo1d_edgeext")
128 putName(hypo1d, "hypo1d_edgeext")
132 for i in range(len(edgeext)):
133 props = geompy.BasicProperties(edgeext[i])
134 longEdgeExts.append(props[0])
135 longTotal += props[0]
136 for i in range(len(edgeext)):
137 local = longTotal/nbsegFis
138 nbLocal = int(round(nbsegFis*longEdgeExts[i]/longTotal))
139 densite = int(round(nbLocal/2))
140 algo1d = bloc1.Segment(geom=edgeext[i])
141 hypo1d = algo1d.NumberOfSegments(nbLocal)
142 hypo1d.SetDistrType( 2 )
143 hypo1d.SetConversionMode( 1 )
144 hypo1d.SetTableFunction( [ 0, densite, 0.8, 1, 1, 1 ] )
146 hypo1d.SetReversedEdges([ geompy.GetSubShapeID(blocPartition, edgeext[i]) ])
147 putName(algo1d.GetSubMesh(), "edgeext", i)
148 putName(algo1d, "algo1d_edgeext", i)
149 putName(hypo1d, "hypo1d_edgeext", i)
151 algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN_2D, geom=facefissoutore)
152 hypo2d = algo2d.LengthFromEdges()
153 putName(algo2d.GetSubMesh(), "facefissoutore")
154 putName(algo2d, "algo2d_facefissoutore")
155 putName(hypo2d, "hypo2d_facefissoutore")
158 maxElemArea = 0.5*dmoyen*dmoyen
159 logging.debug("dmoyen %s, maxElemArea %s", dmoyen, maxElemArea)
161 for i in range(len(facesExternes)):
162 algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN_2D, geom=facesExternes[i])
163 hypo2d = algo2d.MaxElementArea(maxElemArea)
164 if edgesBords is None:
165 algo1d = bloc1.Segment(geom=facesExternes[i])
166 hypo1d = algo1d.NumberOfSegments(1)
167 putName(algo2d.GetSubMesh(), "facesExternes", i)
168 putName(algo2d, "algo2d_facesExternes", i)
169 putName(hypo2d, "hypo2d_facesExternes", i)
170 if edgesBords is None:
171 putName(algo1d, "algo1d_facesExternes", i)
172 putName(hypo1d, "hypo1d_facesExternes", i)
174 for i in range(len(aretesInternes)):
175 algo1d = bloc1.Segment(geom=aretesInternes[i])
176 hypo1d = algo1d.NumberOfSegments(nbsegExt)
177 putName(algo1d.GetSubMesh(), "aretesInternes", i)
178 putName(algo1d, "algo1d_aretesInternes", i)
179 putName(hypo1d, "hypo1d_aretesInternes", i)
181 if edgesBords is not None:
182 algo1d = bloc1.UseExisting1DElements(geom=edgesBords)
183 hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
184 putName(algo1d.GetSubMesh(), "bordsLibres")
185 putName(algo1d, "algo1d_bordsLibres")
186 putName(hypo1d, "hypo1d_bordsLibres")
188 #isDone = bloc1.Compute()
190 if not declareAlgoEllipsoideFirst:
191 algo3d = bloc1.Tetrahedron(algo=smeshBuilder.NETGEN,geom=ellipsoidep)
192 hypo3d = algo3d.MaxElementVolume(1000.0)
193 putName(algo3d.GetSubMesh(), "ellipsoide")
194 putName(algo3d, "algo3d_ellipsoide")
195 putName(hypo3d, "hypo3d_ellipsoide")
197 isDone = bloc1.Compute()
199 nbRemoved = bloc1.RemoveOrphanNodes()
201 faceFissure1 = bloc1.GroupOnGeom(faceFissure,'FACE1',SMESH.FACE)
202 noeudsFondFissure = bloc1.GroupOnGeom(gencnt,'nfondfis',SMESH.NODE)
204 groups_faceCommuneEllipsoideBloc = []
205 for i in range(len(sharedFaces)):
206 name = "faceCommuneEllipsoideBloc_%d"%i
207 groups_faceCommuneEllipsoideBloc.append(bloc1.GroupOnGeom(sharedFaces[i], name, SMESH.FACE))
208 groups_faceExterneBloc = []
209 for i in range(len(facesExtBloc)):
210 name = "faceExterneBloc_%d"%i
211 groups_faceExterneBloc.append(bloc1.GroupOnGeom(facesExtBloc[i], name, SMESH.FACE))
214 for i in range(len(groups_faceCommuneEllipsoideBloc)):
215 name = "faceCommuneEllipsoideBloc_%d"%i
216 skinBlocMeshes.append(smesh.CopyMesh(groups_faceCommuneEllipsoideBloc[i], name, 0, 0))
217 for i in range(len(groups_faceExterneBloc)):
218 name = "faceExterneBloc_%d"%i
219 skinBlocMeshes.append(smesh.CopyMesh(groups_faceExterneBloc[i], name, 0, 0))
221 meshesBloc = [internalBoundary.GetMesh()]
222 for i in range(len(skinBlocMeshes)):
223 meshesBloc.append(skinBlocMeshes[i].GetMesh())
224 blocMesh = smesh.Concatenate(meshesBloc, 1, 1, 1e-05,False)
226 algo3d = blocMesh.Tetrahedron(algo=smeshBuilder.NETGEN)
227 hypo3d = algo3d.MaxElementVolume(1000.0)
228 putName(algo3d.GetSubMesh(), "bloc")
229 putName(algo3d, "algo3d_bloc")
230 putName(hypo3d, "hypo3d_bloc")
232 is_done = blocMesh.Compute()
234 blocComplet = smesh.Concatenate([bloc1.GetMesh(), blocMesh.GetMesh()], 1, 1, 1e-05,False)
236 return bloc1, blocComplet