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