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