Salome HOME
e83e79f404f05129b9e7e58818d3566ab6081116
[modules/smesh.git] / src / Tools / blocFissure / gmu / mailleFacesPeau.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
21 """maillage faces de peau"""
22
23 import logging
24
25 import SMESH
26 from salome.smesh import smeshBuilder
27
28 from .geomsmesh import geompy
29 from .geomsmesh import geomPublishInFather
30 from .geomsmesh import smesh
31
32 from . import initLog
33
34 from .putName import putName
35
36 def mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut, \
37                     facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, \
38                     bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives, \
39                     edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad, \
40                     mailleur="MeshGems", nro_cas=None):
41   """maillage faces de peau"""
42   logging.info('start')
43   logging.info("Maillage avec %s pour le cas n°%s", mailleur, nro_cas)
44
45   nbFacesFilling = len(partitionsPeauFissFond)
46   boutFromIfil = [None for _ in range(nbFacesFilling)]
47   # repérage des extremites du pipe quand elles débouchent sur des faces différentes :
48   if ( idFillingFromBout[0] != idFillingFromBout[1] ):
49     boutFromIfil[idFillingFromBout[0]] = 0
50     boutFromIfil[idFillingFromBout[1]] = 1
51
52   logging.info("---------------------------- maillage faces de peau --------------")
53   logging.info("nbFacesFilling = %d", nbFacesFilling)
54   meshesFacesPeau = list()
55   for ifil in range(nbFacesFilling):
56
57     if partitionsPeauFissFond[ifil] is None: # face de peau maillage sain intacte
58       logging.info("face de peau %d intacte", ifil)
59       facePeau = facesDefaut[ifil]
60     else:
61       logging.info("face de peau %d coupée par la fissure", ifil)
62       # pour chaque face : la face de peau finale a mailler (percée des faces débouchantes)
63       facePeau = facesPeaux[ifil]
64     meshFacePeau = smesh.Mesh(facePeau)
65     putName(meshFacePeau.GetMesh(), "facePeau", ifil, nro_cas)
66
67     if ( mailleur == "MeshGems"):
68       algo2d = meshFacePeau.Triangle(algo=smeshBuilder.MG_CADSurf)
69       hypo2d = algo2d.Parameters()
70       hypo2d.SetPhySize( dmoyen )
71       hypo2d.SetMinSize( rayonPipe/float(nbsegRad) )
72       hypo2d.SetMaxSize( dmoyen*2. )
73       hypo2d.SetChordalError( dmoyen*0.25 )
74       hypo2d.SetVerbosity( 0 )
75     else:
76       algo2d = meshFacePeau.Triangle(algo=smeshBuilder.NETGEN_1D2D)
77       hypo2d = algo2d.Parameters()
78       hypo2d.SetMaxSize( dmoyen )
79       hypo2d.SetOptimize( 1 )
80       hypo2d.SetFineness( 2 )
81       hypo2d.SetMinSize( rayonPipe/float(nbsegRad) )
82       hypo2d.SetChordalErrorEnabled (True)
83       hypo2d.SetChordalError( dmoyen*0.25 )
84       hypo2d.SetUseSurfaceCurvature (True)
85       hypo2d.SetQuadAllowed( 0 )
86     putName(hypo2d, "{}_2d_facePeau".format(mailleur), ifil, nro_cas)
87
88     if partitionsPeauFissFond[ifil] is None: # face de peau maillage sain intacte
89
90       logging.debug("face de peau %d intacte", ifil)
91       # --- edges de bord de la face de filling
92       filling = facesDefaut[ifil]
93       edgesFilling = geompy.ExtractShapes(filling, geompy.ShapeType["EDGE"], False)
94       groupEdgesBordPeau = geompy.CreateGroup(filling, geompy.ShapeType["EDGE"])
95       geompy.UnionList(groupEdgesBordPeau, edgesFilling)
96       geomPublishInFather(initLog.always, filling, groupEdgesBordPeau, "EdgesBords", nro_cas)
97
98       logging.info("UseExisting1DElements depuis '%s'", groupEdgesBordPeau.GetName())
99       algo1d = meshFacePeau.UseExisting1DElements(geom=groupEdgesBordPeau)
100       putName(algo1d.GetSubMesh(), "bordsLibres", ifil, nro_cas)
101       hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
102       putName(hypo1d, "SourceEdges_{}".format(bordsLibres.GetName()), ifil, nro_cas)
103
104     else:
105
106       logging.info("face de peau %d coupée par la fissure", ifil)
107       edgesCircPeau      = edCircPeau[ifil] # pour chaque face de peau : [subshape edge circulaire aux débouchés du pipe]
108       _                  = ptCircPeau[ifil] # pour chaque face de peau : [subshape point sur edge circulaire aux débouchés du pipe]
109       groupEdgesBordPeau = gpedgeBord[ifil] # pour chaque face de peau : groupe subshape des edges aux bords liés à la partie saine
110       bordsVifs          = gpedgeVifs[ifil] # pour chaque face de peau : groupe subshape des edges aux bords correspondant à des arêtes vives
111       edgesFissurePeau   = edFissPeau[ifil] # pour chaque face de peau : [subshape edge en peau des faces de fissure externes]
112
113       logging.info("UseExisting1DElements depuis groupEdgesBordPeau = '%s'", groupEdgesBordPeau.GetName())
114       algo1d = meshFacePeau.UseExisting1DElements(geom=groupEdgesBordPeau)
115       putName(algo1d.GetSubMesh(), "bordsLibres", ifil, nro_cas)
116       hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
117       putName(hypo1d, "SourceEdges_{}".format(bordsLibres.GetName()), ifil, nro_cas)
118
119       objet = geompy.MakeCompound(edgesFissurePeau)
120       geomPublishInFather(initLog.always, facePeau, objet, "edgesFissurePeau")
121       logging.info("UseExisting1DElements depuis objet = '%s'", objet.GetName())
122       algo1d = meshFacePeau.UseExisting1DElements(geom=objet)
123       putName(algo1d.GetSubMesh(), "edgePeauFiss", ifil, nro_cas)
124       hypo1d = algo1d.SourceEdges([ grpEdgesPeauFissureExterne ],0,0)
125       putName(hypo1d, "SourceEdges_{}".format(grpEdgesPeauFissureExterne.GetName()), ifil, nro_cas)
126
127       if bordsVifs is not None:
128         logging.info("UseExisting1DElements depuis bordsVifs = '%s'", bordsVifs.GetName())
129         algo1d = meshFacePeau.UseExisting1DElements(geom=bordsVifs)
130         putName(algo1d.GetSubMesh(), "bordsVifs", ifil, nro_cas)
131         hypo1d = algo1d.SourceEdges([ grpAretesVives ],0,0)
132         putName(hypo1d, "SourceEdges_{}".format(grpAretesVives.GetName()), ifil, nro_cas)
133
134       for i_aux, edgeCirc in enumerate(edgesCircPeau):
135         texte = "i_aux = {}".format(i_aux)
136         logging.info(texte)
137         if edgeCirc is not None:
138           logging.info("UseExisting1DElements depuis edgeCirc = '%s'", edgeCirc.GetName())
139           algo1d = meshFacePeau.UseExisting1DElements(geom=edgeCirc) # addToStudy() failed ?
140           name = "cercle{}".format(i_aux)
141           putName(algo1d.GetSubMesh(), name, ifil, nro_cas)
142           if boutFromIfil[ifil] is None:
143             hypo1d = algo1d.SourceEdges([ edgesCircPipeGroup[i_aux] ],0,0)
144           else:
145             hypo1d = algo1d.SourceEdges([ edgesCircPipeGroup[boutFromIfil[ifil]] ],0,0)
146           putName(hypo1d, "SourceEdges_" + name, ifil, nro_cas)
147
148     is_done = meshFacePeau.Compute()
149     text = "meshFacePeau {} .Compute".format(ifil)
150     if is_done:
151       logging.info(text+" OK")
152     else:
153       text = "Erreur au calcul du maillage.\n" + text
154       logging.info(text)
155       raise Exception(text)
156
157     groupe_des_faces = meshFacePeau.CreateEmptyGroup( SMESH.FACE, "facePeau%d"%ifil )
158     _ = groupe_des_faces.AddFrom( meshFacePeau.GetMesh() )
159     meshesFacesPeau.append(meshFacePeau)
160
161   return meshesFacesPeau