Salome HOME
[bos #23982] EDF 22984 - aspect ratio of hexa
[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
21 import logging
22
23 from .geomsmesh import geompy
24 from .geomsmesh import smesh
25 import SMESH
26
27 def construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad):
28   """
29   maillage effectif du pipe
30   """
31   logging.info('start')
32   meshPipe = smesh.Mesh(None, "meshPipe")
33   fondFissGroup = meshPipe.CreateEmptyGroup(SMESH.EDGE, "FONDFISS")
34   nodesFondFissGroup = meshPipe.CreateEmptyGroup(SMESH.NODE, "nfondfis")
35   faceFissGroup = meshPipe.CreateEmptyGroup(SMESH.FACE, "fisInPi")
36   edgeFaceFissGroup = meshPipe.CreateEmptyGroup(SMESH.EDGE, "edgeFaceFiss")
37   edgeCircPipe0Group = meshPipe.CreateEmptyGroup(SMESH.EDGE, "edgeCircPipe0")
38   edgeCircPipe1Group = meshPipe.CreateEmptyGroup(SMESH.EDGE, "edgeCircPipe1")
39   faceCircPipe0Group = meshPipe.CreateEmptyGroup(SMESH.FACE, "faceCircPipe0")
40   faceCircPipe1Group = meshPipe.CreateEmptyGroup(SMESH.FACE, "faceCircPipe1")
41   
42   mptsdisks  = [] # vertices maillage de tous les disques
43   mEdges     = [] # identifiants edges maillage fond de fissure
44   mEdgeFaces = [] # identifiants edges maillage edge face de fissure externe
45   mFaces     = [] # identifiants faces maillage fissure
46   mVols      = [] # identifiants volumes maillage pipe
47
48   mptdsk = None
49   for idisk in range(idisklim[0], idisklim[1]+1): # boucle sur les disques internes
50     
51     # -----------------------------------------------------------------------
52     # --- points
53     
54     gptdsk = gptsdisks[idisk]
55     if idisk > idisklim[0]:
56       oldmpts = mptdsk
57     mptdsk = [] # vertices maillage d'un disque
58     for k in range(nbsegCercle):
59       points = gptdsk[k]
60       mptids = []
61       for j, pt in enumerate(points):
62         if j == 0 and k > 0:
63           id = mptdsk[0][0]
64         else:
65           coords = geompy.PointCoordinates(pt)
66           id = meshPipe.AddNode(coords[0], coords[1], coords[2])
67         mptids.append(id)
68       mptdsk.append(mptids)
69     mptsdisks.append(mptdsk)
70     
71     # -----------------------------------------------------------------------
72     # --- groupes edges cercles debouchants
73     
74     if idisk == idisklim[0]:
75       pts = []
76       for k in range(nbsegCercle):
77         pts.append(mptdsk[k][-1])
78       edges = []
79       for k in range(len(pts)):
80         k1 = (k+1)%len(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 = []
87       for k in range(nbsegCercle):
88         pts.append(mptdsk[k][-1])
89       edges = []
90       for k in range(len(pts)):
91         k1 = (k+1)%len(pts)
92         idEdge = meshPipe.AddEdge([pts[k], pts[k1]])
93         edges.append(idEdge)
94       edgeCircPipe1Group.Add(edges)
95     
96     # -----------------------------------------------------------------------
97     # --- groupes faces  debouchantes
98     
99     if idisk == idisklim[0]:
100       faces = []
101       for j in range(nbsegRad):
102         for k in range(nbsegCercle):
103           k1 = k+1
104           if k ==  nbsegCercle-1:
105             k1 = 0
106           if j == 0:
107             idf = meshPipe.AddFace([mptdsk[k][0], mptdsk[k][1], mptdsk[k1][1]]) # triangle
108           else:
109             idf = meshPipe.AddFace([mptdsk[k][j], mptdsk[k][j+1], mptdsk[k1][j+1], mptdsk[k1][j]]) # quadrangle
110           faces.append(idf)
111       faceCircPipe0Group.Add(faces)
112
113     if idisk == idisklim[1]:
114       faces = []
115       for j in range(nbsegRad):
116         for k in range(nbsegCercle):
117           k1 = k+1
118           if k ==  nbsegCercle-1:
119             k1 = 0
120           if j == 0:
121             idf = meshPipe.AddFace([mptdsk[k][0], mptdsk[k][1], mptdsk[k1][1]]) # triangle
122           else:
123             idf = meshPipe.AddFace([mptdsk[k][j], mptdsk[k][j+1], mptdsk[k1][j+1], mptdsk[k1][j]]) # quadrangle
124           faces.append(idf)
125       faceCircPipe1Group.Add(faces)
126           
127     # -----------------------------------------------------------------------
128     # --- mailles volumiques, groupes noeuds et edges de fond de fissure, groupe de face de fissure
129     
130     if idisk == idisklim[0]:
131       mEdges.append(0)
132       mEdgeFaces.append(0)
133       mFaces.append([0])
134       mVols.append([[0]])
135       nodesFondFissGroup.Add([mptdsk[0][0]])
136     else:
137       ide = meshPipe.AddEdge([oldmpts[0][0], mptdsk[0][0]])
138       mEdges.append(ide)
139       fondFissGroup.Add([ide])
140       nodesFondFissGroup.Add([mptdsk[0][0]])
141       ide2 = meshPipe.AddEdge([oldmpts[0][-1], mptdsk[0][-1]])
142       mEdgeFaces.append(ide2)
143       edgeFaceFissGroup.Add([ide2])
144       idFaces = []
145       idVols = []
146       
147       for j in range(nbsegRad):
148         idf = meshPipe.AddFace([oldmpts[0][j], mptdsk[0][j], mptdsk[0][j+1], oldmpts[0][j+1]])
149         faceFissGroup.Add([idf])
150         idFaces.append(idf)
151         
152         idVolCercle = []
153         for k in range(nbsegCercle):
154           k1 = k+1
155           if k ==  nbsegCercle-1:
156             k1 = 0
157           if j == 0:
158             idv = meshPipe.AddVolume([mptdsk[k][j], mptdsk[k][j+1], mptdsk[k1][j+1],
159                                       oldmpts[k][j], oldmpts[k][j+1], oldmpts[k1][j+1]])
160           else:
161             idv = meshPipe.AddVolume([mptdsk[k][j], mptdsk[k][j+1], mptdsk[k1][j+1], mptdsk[k1][j],
162                                       oldmpts[k][j], oldmpts[k][j+1], oldmpts[k1][j+1], oldmpts[k1][j]])
163           idVolCercle.append(idv)
164         idVols.append(idVolCercle)  
165         
166       mFaces.append(idFaces)
167       mVols.append(idVols)
168
169   pipeFissGroup = meshPipe.CreateEmptyGroup( SMESH.VOLUME, 'PIPEFISS' )
170   nbAdd = pipeFissGroup.AddFrom( meshPipe.GetMesh() )
171
172   nb, new_mesh, new_group = meshPipe.MakeBoundaryElements(SMESH.BND_2DFROM3D, "pipeBoundaries")
173   edgesCircPipeGroup = [edgeCircPipe0Group, edgeCircPipe1Group]
174
175   meshPipeGroups = dict(fondFissGroup = fondFissGroup,
176                         nodesFondFissGroup = nodesFondFissGroup,
177                         faceFissGroup = faceFissGroup,
178                         edgeFaceFissGroup = edgeFaceFissGroup,
179                         edgeCircPipe0Group = edgeCircPipe0Group,
180                         edgeCircPipe1Group = edgeCircPipe1Group,
181                         faceCircPipe0Group = faceCircPipe0Group,
182                         faceCircPipe1Group = faceCircPipe1Group,
183                         pipeFissGroup = pipeFissGroup,
184                         edgesCircPipeGroup = edgesCircPipeGroup
185                         )
186   
187   return (meshPipe, meshPipeGroups, edgesCircPipeGroup)