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