Salome HOME
Préparation pour MG-CADSurf
[modules/smesh.git] / src / Tools / blocFissure / gmu / meshBlocPart.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2020  EDF R&D
3 #
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.
8 #
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.
13 #
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
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 import logging
22 from .geomsmesh import geompy
23 from .geomsmesh import smesh
24 from salome.smesh import smeshBuilder
25 import SMESH
26 from salome.StdMeshers import StdMeshersBuilder
27 from .putName import putName
28
29 # -----------------------------------------------------------------------------
30 # --- maillage du bloc partitionne
31
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, \
36                 mailleur="MeshGems"):
37   """Maillage du bloc partitionnĂ©
38
39   TODO: a completer
40   """
41   logging.info('start')
42
43   # --- edges de bord Ă  respecter
44
45   aFilterManager = smesh.CreateFilterManager()
46   nbAdded, internalBoundary, _NoneGroup = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [  ])
47   criteres = list()
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')
53
54   # --- maillage bloc
55
56   bloc1 = smesh.Mesh(blocPartition)
57
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)
67
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)
74
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")
82
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")
92
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)
102
103   for i, edges_i in enumerate(edges):
104     algo1d = bloc1.Segment(geom=edges_i)
105     if reverses[i] > 0:
106       hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[ geompy.GetSubShapeID(blocPartition,edges_i) ])
107     else:
108       hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[  ])
109     putName(algo1d.GetSubMesh(), "edges", i)
110     putName(algo1d, "algo1d_edges", i)
111     putName(hypo1d, "hypo1d_edges", i)
112
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)
119
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")
130   else:
131     longTotal = 0
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 ] )
146       if reverext[i]:
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)
151
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")
157
158
159   maxElemArea = 0.5*dmoyen*dmoyen
160   logging.debug("dmoyen %s, maxElemArea %s", dmoyen, maxElemArea)
161
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)
174
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)
181
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")
188
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")
195
196   faceFissure1 = bloc1.GroupOnGeom(faceFissure,'FACE1',SMESH.FACE)
197   noeudsFondFissure = bloc1.GroupOnGeom(gencnt,'nfondfis',SMESH.NODE)
198
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))
207
208   is_done = bloc1.Compute()
209   text = "bloc1.Compute"
210   if is_done:
211     logging.info(text+" OK")
212   else:
213     text = "Erreur au calcul du maillage.\n" + text
214     logging.info(text)
215     raise Exception(text)
216
217   nbRemoved = bloc1.RemoveOrphanNodes()
218
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))
226
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)
231
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")
237
238   is_done = blocMesh.Compute()
239   text = "blocMesh.Compute"
240   if is_done:
241     logging.info(text+" OK")
242   else:
243     text = "Erreur au calcul du maillage.\n" + text
244     logging.info(text)
245     raise Exception(text)
246
247   blocComplet = smesh.Concatenate([bloc1.GetMesh(), blocMesh.GetMesh()], 1, 1, 1e-05,False)
248
249   return bloc1, blocComplet