1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2020 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
20 """Maillage du pipe"""
24 from .geomsmesh import geompy
25 from .geomsmesh import smesh
28 def construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad):
29 """maillage effectif du pipe"""
31 meshPipe = smesh.Mesh(None, "meshPipe")
32 fondFissGroup = meshPipe.CreateEmptyGroup(SMESH.EDGE, "FONDFISS")
33 nodesFondFissGroup = meshPipe.CreateEmptyGroup(SMESH.NODE, "nfondfis")
34 faceFissGroup = meshPipe.CreateEmptyGroup(SMESH.FACE, "fisInPi")
35 edgeFaceFissGroup = meshPipe.CreateEmptyGroup(SMESH.EDGE, "edgeFaceFiss")
36 edgeCircPipe0Group = meshPipe.CreateEmptyGroup(SMESH.EDGE, "edgeCircPipe0")
37 edgeCircPipe1Group = meshPipe.CreateEmptyGroup(SMESH.EDGE, "edgeCircPipe1")
38 faceCircPipe0Group = meshPipe.CreateEmptyGroup(SMESH.FACE, "faceCircPipe0")
39 faceCircPipe1Group = meshPipe.CreateEmptyGroup(SMESH.FACE, "faceCircPipe1")
41 mptsdisks = list() # vertices maillage de tous les disques
42 mEdges = list() # identifiants edges maillage fond de fissure
43 mEdgeFaces = list() # identifiants edges maillage edge face de fissure externe
44 mFaces = list() # identifiants faces maillage fissure
45 mVols = list() # identifiants volumes maillage pipe
48 for idisk in range(idisklim[0], idisklim[1]+1): # boucle sur les disques internes
50 # -----------------------------------------------------------------------
53 gptdsk = gptsdisks[idisk]
54 if idisk > idisklim[0]:
56 mptdsk = list() # vertices maillage d'un disque
57 for k in range(nbsegCercle):
60 for j, pt in enumerate(points):
64 coords = geompy.PointCoordinates(pt)
65 id = meshPipe.AddNode(coords[0], coords[1], coords[2])
68 mptsdisks.append(mptdsk)
70 # -----------------------------------------------------------------------
71 # --- groupes edges cercles debouchants
73 if idisk == idisklim[0]:
75 for k in range(nbsegCercle):
76 pts.append(mptdsk[k][-1])
79 for k in range(nb_pts):
81 idEdge = meshPipe.AddEdge([pts[k], pts[k1]])
83 edgeCircPipe0Group.Add(edges)
85 if idisk == idisklim[1]:
87 for k in range(nbsegCercle):
88 pts.append(mptdsk[k][-1])
91 for k in range(nb_pts):
93 idEdge = meshPipe.AddEdge([pts[k], pts[k1]])
95 edgeCircPipe1Group.Add(edges)
97 # -----------------------------------------------------------------------
98 # --- groupes faces debouchantes
100 if idisk == idisklim[0]:
102 for j in range(nbsegRad):
103 for k in range(nbsegCercle):
105 if k == nbsegCercle-1:
108 idf = meshPipe.AddFace([mptdsk[k][0], mptdsk[k][1], mptdsk[k1][1]]) # triangle
110 idf = meshPipe.AddFace([mptdsk[k][j], mptdsk[k][j+1], mptdsk[k1][j+1], mptdsk[k1][j]]) # quadrangle
112 faceCircPipe0Group.Add(faces)
114 if idisk == idisklim[1]:
116 for j in range(nbsegRad):
117 for k in range(nbsegCercle):
119 if k == nbsegCercle-1:
122 idf = meshPipe.AddFace([mptdsk[k][0], mptdsk[k][1], mptdsk[k1][1]]) # triangle
124 idf = meshPipe.AddFace([mptdsk[k][j], mptdsk[k][j+1], mptdsk[k1][j+1], mptdsk[k1][j]]) # quadrangle
126 faceCircPipe1Group.Add(faces)
128 # -----------------------------------------------------------------------
129 # --- mailles volumiques, groupes noeuds et edges de fond de fissure, groupe de face de fissure
131 if idisk == idisklim[0]:
136 nodesFondFissGroup.Add([mptdsk[0][0]])
138 ide = meshPipe.AddEdge([oldmpts[0][0], mptdsk[0][0]])
140 fondFissGroup.Add([ide])
141 nodesFondFissGroup.Add([mptdsk[0][0]])
142 ide2 = meshPipe.AddEdge([oldmpts[0][-1], mptdsk[0][-1]])
143 mEdgeFaces.append(ide2)
144 edgeFaceFissGroup.Add([ide2])
148 for j in range(nbsegRad):
149 idf = meshPipe.AddFace([oldmpts[0][j], mptdsk[0][j], mptdsk[0][j+1], oldmpts[0][j+1]])
150 faceFissGroup.Add([idf])
154 for k in range(nbsegCercle):
156 if k == nbsegCercle-1:
159 idv = meshPipe.AddVolume([mptdsk[k][j], mptdsk[k][j+1], mptdsk[k1][j+1], \
160 oldmpts[k][j], oldmpts[k][j+1], oldmpts[k1][j+1]])
162 idv = meshPipe.AddVolume([mptdsk[k][j], mptdsk[k][j+1], mptdsk[k1][j+1], mptdsk[k1][j], \
163 oldmpts[k][j], oldmpts[k][j+1], oldmpts[k1][j+1], oldmpts[k1][j]])
164 idVolCercle.append(idv)
165 idVols.append(idVolCercle)
167 mFaces.append(idFaces)
170 pipeFissGroup = meshPipe.CreateEmptyGroup( SMESH.VOLUME, 'PIPEFISS' )
171 nbAdd = pipeFissGroup.AddFrom( meshPipe.GetMesh() )
173 nb, new_mesh, new_group = meshPipe.MakeBoundaryElements(SMESH.BND_2DFROM3D, "pipeBoundaries")
174 edgesCircPipeGroup = [edgeCircPipe0Group, edgeCircPipe1Group]
176 meshPipeGroups = dict(fondFissGroup = fondFissGroup, \
177 nodesFondFissGroup = nodesFondFissGroup, \
178 faceFissGroup = faceFissGroup, \
179 edgeFaceFissGroup = edgeFaceFissGroup, \
180 edgeCircPipe0Group = edgeCircPipe0Group, \
181 edgeCircPipe1Group = edgeCircPipe1Group, \
182 faceCircPipe0Group = faceCircPipe0Group, \
183 faceCircPipe1Group = faceCircPipe1Group, \
184 pipeFissGroup = pipeFissGroup, \
185 edgesCircPipeGroup = edgesCircPipeGroup \
189 #text = "Arrêt rapide.\n"
191 #raise Exception(text)
192 return (meshPipe, meshPipeGroups, edgesCircPipeGroup)