1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021 EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 """maillage faces de peau"""
26 from salome.smesh import smeshBuilder
28 from .geomsmesh import geompy
29 from .geomsmesh import geomPublishInFather
30 from .geomsmesh import smesh
34 from .putName import putName
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"""
43 logging.info("Maillage avec %s pour le cas n°%d", mailleur, nro_cas)
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
51 logging.info("---------------------------- maillage faces de peau --------------")
52 logging.info("nbFacesFilling = %d", nbFacesFilling)
53 meshesFacesPeau = list()
54 for ifil in range(nbFacesFilling):
56 if partitionsPeauFissFond[ifil] is None: # face de peau maillage sain intacte
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")
66 meshFacePeau = smesh.Mesh(facesDefaut[ifil])
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)
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]
85 meshFacePeau = smesh.Mesh(facePeau)
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)
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)
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)
107 for i_aux, edgeCirc in enumerate(edgesCircPeau):
108 texte = "i_aux = {}".format(i_aux)
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)
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)
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 )
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 )
140 putName(algo2d.GetSubMesh(), "facePeau", ifil, nro_cas)
141 putName(algo2d, "algo2d_facePeau", ifil, nro_cas)
142 putName(hypo2d, "hypo2d_facePeau", ifil, nro_cas)
144 is_done = meshFacePeau.Compute()
145 text = "meshFacePeau {} .Compute".format(ifil)
147 logging.info(text+" OK")
149 text = "Erreur au calcul du maillage.\n" + text
151 raise Exception(text)
153 GroupFaces = meshFacePeau.CreateEmptyGroup( SMESH.FACE, "facePeau%d"%ifil )
154 _ = GroupFaces.AddFrom( meshFacePeau.GetMesh() )
155 meshesFacesPeau.append(meshFacePeau)
157 return meshesFacesPeau