Salome HOME
Merge branch 'master' into gni/evolution
[modules/smesh.git] / src / Tools / blocFissure / gmu / construitMaillagePipe.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 """Maillage du pipe"""
21
22 import logging
23
24 from .geomsmesh import geompy
25 from .geomsmesh import smesh
26 import SMESH
27
28 def construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad):
29   """maillage effectif du pipe"""
30   logging.info('start')
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")
40
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
46
47   mptdsk = list()
48   for idisk in range(idisklim[0], idisklim[1]+1): # boucle sur les disques internes
49
50     # -----------------------------------------------------------------------
51     # --- points
52
53     gptdsk = gptsdisks[idisk]
54     if idisk > idisklim[0]:
55       oldmpts = mptdsk
56     mptdsk = list() # vertices maillage d'un disque
57     for k in range(nbsegCercle):
58       points = gptdsk[k]
59       mptids = list()
60       for j, pt in enumerate(points):
61         if j == 0 and k > 0:
62           id = mptdsk[0][0]
63         else:
64           coords = geompy.PointCoordinates(pt)
65           id = meshPipe.AddNode(coords[0], coords[1], coords[2])
66         mptids.append(id)
67       mptdsk.append(mptids)
68     mptsdisks.append(mptdsk)
69
70     # -----------------------------------------------------------------------
71     # --- groupes edges cercles debouchants
72
73     if idisk == idisklim[0]:
74       pts = list()
75       for k in range(nbsegCercle):
76         pts.append(mptdsk[k][-1])
77       edges = list()
78       nb_pts = len(pts)
79       for k in range(nb_pts):
80         k1 = (k+1)%nb_pts
81         idEdge = meshPipe.AddEdge([pts[k], pts[k1]])
82         edges.append(idEdge)
83       edgeCircPipe0Group.Add(edges)
84
85     if idisk == idisklim[1]:
86       pts = list()
87       for k in range(nbsegCercle):
88         pts.append(mptdsk[k][-1])
89       edges = list()
90       nb_pts = len(pts)
91       for k in range(nb_pts):
92         k1 = (k+1)%nb_pts
93         idEdge = meshPipe.AddEdge([pts[k], pts[k1]])
94         edges.append(idEdge)
95       edgeCircPipe1Group.Add(edges)
96
97     # -----------------------------------------------------------------------
98     # --- groupes faces  debouchantes
99
100     if idisk == idisklim[0]:
101       faces = list()
102       for j in range(nbsegRad):
103         for k in range(nbsegCercle):
104           k1 = k+1
105           if k ==  nbsegCercle-1:
106             k1 = 0
107           if j == 0:
108             idf = meshPipe.AddFace([mptdsk[k][0], mptdsk[k][1], mptdsk[k1][1]]) # triangle
109           else:
110             idf = meshPipe.AddFace([mptdsk[k][j], mptdsk[k][j+1], mptdsk[k1][j+1], mptdsk[k1][j]]) # quadrangle
111           faces.append(idf)
112       faceCircPipe0Group.Add(faces)
113
114     if idisk == idisklim[1]:
115       faces = list()
116       for j in range(nbsegRad):
117         for k in range(nbsegCercle):
118           k1 = k+1
119           if k ==  nbsegCercle-1:
120             k1 = 0
121           if j == 0:
122             idf = meshPipe.AddFace([mptdsk[k][0], mptdsk[k][1], mptdsk[k1][1]]) # triangle
123           else:
124             idf = meshPipe.AddFace([mptdsk[k][j], mptdsk[k][j+1], mptdsk[k1][j+1], mptdsk[k1][j]]) # quadrangle
125           faces.append(idf)
126       faceCircPipe1Group.Add(faces)
127
128     # -----------------------------------------------------------------------
129     # --- mailles volumiques, groupes noeuds et edges de fond de fissure, groupe de face de fissure
130
131     if idisk == idisklim[0]:
132       mEdges.append(0)
133       mEdgeFaces.append(0)
134       mFaces.append([0])
135       mVols.append([[0]])
136       nodesFondFissGroup.Add([mptdsk[0][0]])
137     else:
138       ide = meshPipe.AddEdge([oldmpts[0][0], mptdsk[0][0]])
139       mEdges.append(ide)
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])
145       idFaces = list()
146       idVols = list()
147
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])
151         idFaces.append(idf)
152
153         idVolCercle = list()
154         for k in range(nbsegCercle):
155           k1 = k+1
156           if k ==  nbsegCercle-1:
157             k1 = 0
158           if j == 0:
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]])
161           else:
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)
166
167       mFaces.append(idFaces)
168       mVols.append(idVols)
169
170   pipeFissGroup = meshPipe.CreateEmptyGroup( SMESH.VOLUME, 'PIPEFISS' )
171   nbAdd = pipeFissGroup.AddFrom( meshPipe.GetMesh() )
172
173   nb, new_mesh, new_group = meshPipe.MakeBoundaryElements(SMESH.BND_2DFROM3D, "pipeBoundaries")
174   edgesCircPipeGroup = [edgeCircPipe0Group, edgeCircPipe1Group]
175
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 \
186                         )
187
188   #if meshPipe:
189     #text = "ArrĂȘt rapide.\n"
190     #logging.info(text)
191     #raise Exception(text)
192   return (meshPipe, meshPipeGroups, edgesCircPipeGroup)