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°%s", mailleur, nro_cas)
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
52 logging.info("---------------------------- maillage faces de peau --------------")
53 logging.info("nbFacesFilling = %d", nbFacesFilling)
54 meshesFacesPeau = list()
55 for ifil in range(nbFacesFilling):
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]
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)
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 )
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)
89 if partitionsPeauFissFond[ifil] is None: # face de peau maillage sain intacte
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)
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)
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]
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)
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)
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)
139 for i_aux, edgeCirc in enumerate(edgesCircPeau):
140 texte = "i_aux = {}".format(i_aux)
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)
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)
154 is_done = meshFacePeau.Compute()
155 text = "meshFacePeau {} .Compute".format(ifil)
157 logging.info(text+" OK")
159 text = "Erreur au calcul du maillage.\n" + text
161 raise Exception(text)
163 groupe_des_faces = meshFacePeau.CreateEmptyGroup( SMESH.FACE, "facePeau%d"%ifil )
164 _ = groupe_des_faces.AddFrom( meshFacePeau.GetMesh() )
165 meshesFacesPeau.append(meshFacePeau)
167 return meshesFacesPeau