Salome HOME
060805323d9e25a73931632b6df5222a566a6e0a
[modules/smesh.git] / src / Tools / blocFissure / gmu / construitFissureGenerale.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021  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 """procédure complète de construction d'une fissure générale"""
21
22 import logging
23
24 from . import initLog
25
26 import salome
27 from salome.smesh import smeshBuilder
28 import GEOM
29 import SMESH
30
31 from .geomsmesh import geompy
32 from .geomsmesh import geomPublishInFather
33 from .geomsmesh import smesh
34
35 from .orderEdgesFromWire import orderEdgesFromWire
36 from .restreintFaceFissure import restreintFaceFissure
37 from .partitionneFissureParPipe import partitionneFissureParPipe
38 from .construitPartitionsPeauFissure import construitPartitionsPeauFissure
39 from .compoundFromList import compoundFromList
40 from .identifieFacesEdgesFissureExterne import identifieFacesEdgesFissureExterne
41 from .calculePointsAxiauxPipe import calculePointsAxiauxPipe
42 from .elimineExtremitesPipe import elimineExtremitesPipe
43 from .construitEdgesRadialesDebouchantes import construitEdgesRadialesDebouchantes
44 from .creePointsPipePeau import creePointsPipePeau
45 from .ajustePointsEdgePipeFissure import ajustePointsEdgePipeFissure
46 from .construitMaillagePipe import construitMaillagePipe
47 from .mailleAretesEtJonction import mailleAretesEtJonction
48 from .mailleFacesFissure import mailleFacesFissure
49 from .mailleFacesPeau import mailleFacesPeau
50 from .putName import putName
51
52 from .construitFissureGenerale_a import construitFissureGenerale_a
53 from .construitFissureGenerale_b import construitFissureGenerale_b
54 from .construitFissureGenerale_c import construitFissureGenerale_c
55
56 # -----------------------------------------------------------------------------
57
58 def construitFissureGenerale(shapesFissure, shapeFissureParams, \
59                              maillageFissureParams, elementsDefaut, \
60                              mailleur="MeshGems", nro_cas=None):
61   """procédure complète fissure générale"""
62   logging.info('start')
63   logging.info("Usage du mailleur %s pour le cas n°%s", mailleur, nro_cas)
64
65   shapeDefaut       = shapesFissure[0] # faces de fissure, débordant
66
67   rayonPipe = shapeFissureParams['rayonPipe']
68   if 'lenSegPipe' in shapeFissureParams:
69     lenSegPipe = shapeFissureParams['lenSegPipe']
70   else:
71     lenSegPipe = rayonPipe
72
73   nbsegRad          = maillageFissureParams['nbsegRad']      # nombre de couches selon un rayon du pipe
74   nbsegCercle       = maillageFissureParams['nbsegCercle']   # nombre de secteur dans un cercle du pipe
75   areteFaceFissure  = maillageFissureParams['areteFaceFissure']
76   lgAretesVives     = 0
77   if 'aretesVives' in maillageFissureParams:
78     lgAretesVives   = maillageFissureParams['aretesVives']
79
80 # Point interne
81   pointInterne = construitFissureGenerale_a (geompy, shapeFissureParams)
82
83   # fillings des faces en peau
84   facesDefaut              = elementsDefaut[0]
85   #centresDefaut            = elementsDefaut[1]
86   #normalsDefaut            = elementsDefaut[2]
87   #extrusionsDefaut         = elementsDefaut[3]
88   dmoyen                   = elementsDefaut[4]
89   bordsPartages            = elementsDefaut[5]
90   #fillconts                = elementsDefaut[6]
91   #idFilToCont              = elementsDefaut[7]
92   maillageSain             = elementsDefaut[8]
93   internalBoundary         = elementsDefaut[9]
94   zoneDefaut               = elementsDefaut[10]
95   zoneDefaut_skin          = elementsDefaut[11]
96   zoneDefaut_internalFaces = elementsDefaut[12]
97   zoneDefaut_internalEdges = elementsDefaut[13]
98   #edgeFondExt              = elementsDefaut[14]
99   centreFondFiss           = elementsDefaut[15]
100   #tgtCentre                = elementsDefaut[16]
101   if lgAretesVives == 0:
102     lgAretesVives = dmoyen
103
104   # --- restriction de la face de fissure au domaine solide :
105   #     partition face fissure étendue par fillings, on garde la face interne
106
107   facesPortFissure = restreintFaceFissure(shapeDefaut, facesDefaut, pointInterne, \
108                                           nro_cas)
109
110   # --- pipe de fond de fissure, prolongé, partition face fissure par pipe
111   #     identification des edges communes pipe et face fissure
112
113   (fissPipe, edgesPipeFiss, edgesFondFiss, wirePipeFiss, wireFondFiss) = \
114                           partitionneFissureParPipe(shapesFissure, elementsDefaut, rayonPipe, \
115                                                     nro_cas)
116   edgesFondFiss, edgesIdByOrientation = orderEdgesFromWire(wireFondFiss)
117
118   for i_aux, edge in enumerate(edgesFondFiss):
119     geomPublishInFather(initLog.debug, wireFondFiss, edge, "edgeFondFiss{}".format(i_aux), nro_cas)
120
121   # --- peau et face de fissure
122   #
123   # --- partition peau défaut - face de fissure prolongée - wire de fond de fissure prolongée
124   #     il peut y avoir plusieurs faces externes, dont certaines sont découpées par la fissure
125   #     liste de faces externes : facesDefaut
126   #     liste de partitions face externe - fissure : partitionPeauFissFond (None quand pas d'intersection)
127
128   partitionsPeauFissFond = construitPartitionsPeauFissure(facesDefaut, fissPipe)
129
130   # --- arêtes vives détectées (dans quadranglesToShapeNoCorner
131   #                             et quadranglesToShapeWithCorner)
132
133   aretesVivesC = compoundFromList(bordsPartages, "areteVive")
134   aretesVivesCoupees = list()  # ensemble des arêtes vives identifiées sur les faces de peau dans l'itération sur partitionsPeauFissFond
135
136   # --- inventaire des faces de peau coupées par la fissure
137
138   ptEdgeFond, fsFissuExt, edFisExtPe, edFisExtPi, \
139     facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, ptFisExtPi, \
140     edgeRadFacePipePeau, facesPipePeau = \
141     construitFissureGenerale_b( partitionsPeauFissFond, \
142                                 edgesPipeFiss, edgesFondFiss, wireFondFiss, aretesVivesC, \
143                                 facesDefaut, centreFondFiss, rayonPipe, aretesVivesCoupees, \
144                                 nro_cas )
145
146   # --- identification des faces et edges de fissure externe pour maillage
147
148   (faceFissureExterne, edgesPipeFissureExterneC, wirePipeFissureExterne, edgesPeauFissureExterneC) = \
149       identifieFacesEdgesFissureExterne(fsFissuExt, edFisExtPe, edFisExtPi, edgesPipeFiss, \
150                                         nro_cas)
151
152   # --- préparation maillage du pipe :
153   #     - détections des points a respecter : jonction des edges/faces constituant la face de fissure externe au pipe
154   #     - points sur les edges de fond de fissure et edges pipe/face fissure,
155   #     - vecteurs tangents au fond de fissure (normal au disque maillé)
156
157   (centres, gptsdisks, raydisks) = calculePointsAxiauxPipe (edgesFondFiss, edgesIdByOrientation, facesDefaut, \
158                                                             centreFondFiss, wireFondFiss, wirePipeFiss, \
159                                                             lenSegPipe, rayonPipe, nbsegCercle, nbsegRad, \
160                                                             nro_cas)
161
162   # --- recherche des points en trop (externes au volume à remailler)
163   #     - on associe chaque extrémité du pipe à une face filling
164   #     - on part des disques aux extrémités du pipe
165   #     - pour chaque disque, on prend les vertices de géométrie,
166   #       on marque leur position relative à la face.
167   #     - on s'arrete quand tous les noeuds sont dedans
168
169   (idFillingFromBout, idisklim, idiskout) = elimineExtremitesPipe(ptEdgeFond, facesDefaut, centres, gptsdisks, nbsegCercle)
170
171   # --- construction des listes d'edges radiales sur chaque extrémité débouchante
172
173   (listEdges, idFacesDebouchantes) = construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks, \
174                                                                         facesPipePeau, edgeRadFacePipePeau, nbsegCercle)
175
176   # --- création des points du maillage du pipe sur la face de peau
177
178   (gptsdisks, idisklim) = creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout, \
179                                              ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad)
180
181   # --- ajustement precis des points sur edgesPipeFissureExterneC
182
183   gptsdisks = ajustePointsEdgePipeFissure(edgesPipeFissureExterneC, wirePipeFissureExterne, gptsdisks, idisklim)
184
185    # --- maillage effectif du pipe
186
187   (meshPipe, meshPipeGroups, edgesCircPipeGroup) =  \
188       construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad, \
189                              nro_cas)
190
191   # --- edges de bord, faces défaut à respecter
192
193   (internalBoundary, bordsLibres, grpAretesVives) =  \
194       mailleAretesEtJonction(internalBoundary, aretesVivesCoupees, lgAretesVives, \
195                              nro_cas)
196
197   # --- maillage faces de fissure
198
199   (meshFaceFiss, _, grpEdgesPeauFissureExterne, _) = \
200       mailleFacesFissure(faceFissureExterne, \
201                          edgesPipeFissureExterneC, edgesPeauFissureExterneC, \
202                          meshPipeGroups, areteFaceFissure, rayonPipe, nbsegRad, \
203                          mailleur, nro_cas)
204
205   # --- maillage faces de peau
206
207   meshesFacesPeau = mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut, \
208                                     facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, \
209                                     bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives, \
210                                     edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad, \
211                                     mailleur, nro_cas)
212
213   # --- regroupement des maillages du défaut
214
215   listMeshes = [internalBoundary.GetMesh(), meshPipe.GetMesh(), meshFaceFiss.GetMesh()]
216   for mfpeau in meshesFacesPeau:
217     listMeshes.append(mfpeau.GetMesh())
218
219   # Attention à la précision... 1.e-5 est trop exigeant. Il faudrait mettre une valeur en cohérence avec les tailles de mailles.
220   meshBoiteDefaut = smesh.Concatenate(listMeshes, 1, 1, 1.e-04)
221   putName(meshBoiteDefaut, "boiteDefaut", i_pref=nro_cas)
222
223 # Maillage complet
224   maillageComplet = construitFissureGenerale_c( maillageSain, meshBoiteDefaut, \
225                                                 zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges, \
226                                                 facesPortFissure, \
227                                                 maillageFissureParams, \
228                                                 mailleur, nro_cas )
229
230   if salome.sg.hasDesktop():
231     salome.sg.updateObjBrowser()
232
233   logging.info("maillage fissure fini")
234
235   return maillageComplet