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