Salome HOME
Merge remote branch 'origin/V8_5_asterstudy'
[modules/smesh.git] / src / Tools / blocFissure / gmu / meshBlocPart.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4 from .geomsmesh import geompy
5 from .geomsmesh import smesh
6 from salome.smesh import smeshBuilder
7 import SMESH
8 from salome.StdMeshers import StdMeshersBuilder
9 from .putName import putName
10
11 # -----------------------------------------------------------------------------
12 # --- maillage du bloc partitionne
13
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):
18   """
19   Maillage du bloc partitionné
20   TODO: a completer
21   """
22   logging.info('start')
23
24   # --- edges de bord à respecter
25
26   aFilterManager = smesh.CreateFilterManager()
27   nbAdded, internalBoundary, _NoneGroup = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [  ])
28   criteres = []
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')
34
35   # --- maillage bloc
36
37   bloc1 = smesh.Mesh(blocPartition)
38
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)
48
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)
55
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")
63
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")
73
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)
83
84   for i in range(len(edges)):
85     algo1d = bloc1.Segment(geom=edges[i])
86     if reverses[i] > 0:
87       hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[ geompy.GetSubShapeID(blocPartition,edges[i]) ])
88     else:
89       hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[  ])
90     putName(algo1d.GetSubMesh(), "edges", i)
91     putName(algo1d, "algo1d_edges", i)
92     putName(hypo1d, "hypo1d_edges", i)
93
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)
100
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")
111   else:
112     longTotal = 0
113     longEdgeExts = []
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 ] )
127       if reverext[i]:
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)
132
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")
138
139
140   maxElemArea = 0.5*dmoyen*dmoyen
141   logging.debug("dmoyen %s, maxElemArea %s", dmoyen, maxElemArea)
142
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)
155
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)
162
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")
169
170   #isDone = bloc1.Compute()
171
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")
178
179   isDone = bloc1.Compute()
180
181   nbRemoved = bloc1.RemoveOrphanNodes()
182
183   faceFissure1 = bloc1.GroupOnGeom(faceFissure,'FACE1',SMESH.FACE)
184   noeudsFondFissure = bloc1.GroupOnGeom(gencnt,'nfondfis',SMESH.NODE)
185
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))
194
195   skinBlocMeshes = []
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))
202
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)
207
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")
213
214   is_done = blocMesh.Compute()
215
216   blocComplet = smesh.Concatenate([bloc1.GetMesh(), blocMesh.GetMesh()], 1, 1, 1e-05,False)
217
218   return bloc1, blocComplet