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