Salome HOME
Prise en compte de la courbure de la face à mailler
[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(algo2d, "{}_2d_facePeau".format(mailleur), ifil, nro_cas)
87     putName(hypo2d, "hypo2d_facePeau", ifil, nro_cas)
88
89     if partitionsPeauFissFond[ifil] is None: # face de peau maillage sain intacte
90
91       logging.debug("face de peau %d intacte", ifil)
92       # --- edges de bord de la face de filling
93       filling = facesDefaut[ifil]
94       edgesFilling = geompy.ExtractShapes(filling, geompy.ShapeType["EDGE"], False)
95       groupEdgesBordPeau = geompy.CreateGroup(filling, geompy.ShapeType["EDGE"])
96       geompy.UnionList(groupEdgesBordPeau, edgesFilling)
97       geomPublishInFather(initLog.always, filling, groupEdgesBordPeau, "EdgesBords", nro_cas)
98
99       logging.info("UseExisting1DElements depuis '%s'", groupEdgesBordPeau.GetName())
100       algo1d = meshFacePeau.UseExisting1DElements(geom=groupEdgesBordPeau)
101       hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
102       putName(algo1d.GetSubMesh(), "bordsLibres", ifil, nro_cas)
103       putName(algo1d, "algo1d_bordsLibres", ifil, nro_cas)
104       putName(hypo1d, "hypo1d_bordsLibres", ifil, nro_cas)
105
106     else:
107
108       logging.info("face de peau %d coupée par la fissure", ifil)
109       edgesCircPeau      = edCircPeau[ifil] # pour chaque face de peau : [subshape edge circulaire aux débouchés du pipe]
110       _                  = ptCircPeau[ifil] # pour chaque face de peau : [subshape point sur edge circulaire aux débouchés du pipe]
111       groupEdgesBordPeau = gpedgeBord[ifil] # pour chaque face de peau : groupe subshape des edges aux bords liés à la partie saine
112       bordsVifs          = gpedgeVifs[ifil] # pour chaque face de peau : groupe subshape des edges aux bords correspondant à des arêtes vives
113       edgesFissurePeau   = edFissPeau[ifil] # pour chaque face de peau : [subshape edge en peau des faces de fissure externes]
114
115       logging.info("UseExisting1DElements depuis groupEdgesBordPeau = '%s'", groupEdgesBordPeau.GetName())
116       algo1d = meshFacePeau.UseExisting1DElements(geom=groupEdgesBordPeau)
117       hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
118       putName(algo1d.GetSubMesh(), "bordsLibres", ifil, nro_cas)
119       putName(algo1d, "algo1d_bordsLibres", ifil, nro_cas)
120       putName(hypo1d, "hypo1d_bordsLibres", ifil, nro_cas)
121
122       objet = geompy.MakeCompound(edgesFissurePeau)
123       geomPublishInFather(initLog.always, facePeau, objet, "edgesFissurePeau")
124       logging.info("UseExisting1DElements depuis objet = '%s'", objet.GetName())
125       algo1d = meshFacePeau.UseExisting1DElements(geom=objet)
126       hypo1d = algo1d.SourceEdges([ grpEdgesPeauFissureExterne ],0,0)
127       putName(algo1d.GetSubMesh(), "edgePeauFiss", ifil, nro_cas)
128       putName(algo1d, "algo1d_edgePeauFiss", ifil, nro_cas)
129       putName(hypo1d, "hypo1d_edgePeauFiss", ifil, nro_cas)
130
131       if bordsVifs is not None:
132         logging.info("UseExisting1DElements depuis bordsVifs = '%s'", bordsVifs.GetName())
133         algo1d = meshFacePeau.UseExisting1DElements(geom=bordsVifs)
134         hypo1d = algo1d.SourceEdges([ grpAretesVives ],0,0)
135         putName(algo1d.GetSubMesh(), "bordsVifs", ifil, nro_cas)
136         putName(algo1d, "algo1d_bordsVifs", ifil, nro_cas)
137         putName(hypo1d, "hypo1d_bordsVifs", ifil, nro_cas)
138
139       for i_aux, edgeCirc in enumerate(edgesCircPeau):
140         texte = "i_aux = {}".format(i_aux)
141         logging.info(texte)
142         if edgeCirc is not None:
143           logging.info("UseExisting1DElements depuis edgeCirc = '%s'", edgeCirc.GetName())
144           algo1d = meshFacePeau.UseExisting1DElements(geom=edgeCirc) # addToStudy() failed ?
145           if boutFromIfil[ifil] is None:
146             hypo1d = algo1d.SourceEdges([ edgesCircPipeGroup[i_aux] ],0,0)
147           else:
148             hypo1d = algo1d.SourceEdges([ edgesCircPipeGroup[boutFromIfil[ifil]] ],0,0)
149           name = "cercle{}".format(i_aux)
150           putName(algo1d.GetSubMesh(), name, ifil, nro_cas)
151           putName(algo1d, "algo1d_" + name, ifil, nro_cas)
152           putName(hypo1d, "hypo1d_" + name, ifil, nro_cas)
153
154     is_done = meshFacePeau.Compute()
155     text = "meshFacePeau {} .Compute".format(ifil)
156     if is_done:
157       logging.info(text+" OK")
158     else:
159       text = "Erreur au calcul du maillage.\n" + text
160       logging.info(text)
161       raise Exception(text)
162
163     groupe_des_faces = meshFacePeau.CreateEmptyGroup( SMESH.FACE, "facePeau%d"%ifil )
164     _ = groupe_des_faces.AddFrom( meshFacePeau.GetMesh() )
165     meshesFacesPeau.append(meshFacePeau)
166
167   return meshesFacesPeau