Salome HOME
Merge branch merge_1_2_d
[modules/smesh.git] / src / SMDS / SMDS_MeshPyramid.cxx
1 //  SMESH SMDS : implementaion of Salome mesh data structure
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
6 //  This library is free software; you can redistribute it and/or 
7 //  modify it under the terms of the GNU Lesser General Public 
8 //  License as published by the Free Software Foundation; either 
9 //  version 2.1 of the License. 
10 // 
11 //  This library is distributed in the hope that it will be useful, 
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of 
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
14 //  Lesser General Public License for more details. 
15 // 
16 //  You should have received a copy of the GNU Lesser General Public 
17 //  License along with this library; if not, write to the Free Software 
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
19 // 
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : SMDS_MeshPyramid.cxx
25 //  Author : Jean-Michel BOULCOURT
26 //  Module : SMESH
27
28 using namespace std;
29 #include "SMDS_MeshPyramid.ixx"
30 #include <Standard_ConstructionError.hxx>
31
32
33 //=======================================================================
34 //function : SMDS_MeshPyramid
35 //purpose  : Pyramid
36 //=======================================================================
37
38 SMDS_MeshPyramid::SMDS_MeshPyramid(const Standard_Integer ID,
39                                    const Standard_Integer idnode1, 
40                                    const Standard_Integer idnode2, 
41                                    const Standard_Integer idnode3,
42                                    const Standard_Integer idnode4,
43                                    const Standard_Integer idnode5):SMDS_MeshVolume(ID,5)
44 {
45   SetConnections(idnode1,idnode2,idnode3,idnode4,idnode5);
46   ComputeKey();
47 }
48
49
50
51 //=======================================================================
52 //function : SetConnections
53 //purpose  : Pyramid
54 //=======================================================================
55 void SMDS_MeshPyramid::SetConnections(const Standard_Integer idnode1, 
56                                       const Standard_Integer idnode2,
57                                       const Standard_Integer idnode3,
58                                       const Standard_Integer idnode4,
59                                       const Standard_Integer idnode5)
60 {
61
62   Standard_Integer idmin = (idnode1 < idnode2 ? idnode1 : idnode2);
63   idmin = (idmin < idnode3 ? idmin : idnode3);
64   idmin = (idmin < idnode4 ? idmin : idnode4);
65   idmin = (idmin < idnode5 ? idmin : idnode5);
66
67   myNodes[0] = idmin;
68   if (idmin == idnode1) { // 1 2 3 4 5
69     myNodes[1] = idnode2;
70     myNodes[2] = idnode3;
71     myNodes[3] = idnode4;
72     myNodes[4] = idnode5;
73   } else if (idmin == idnode2) { // 2 3 4 5 1
74     myNodes[1] = idnode3;
75     myNodes[2] = idnode4;
76     myNodes[3] = idnode5;
77     myNodes[4] = idnode1;
78   } else if (idmin == idnode3) { // 3 4 5 1 2
79     myNodes[1] = idnode4;
80     myNodes[2] = idnode5;
81     myNodes[3] = idnode1;
82     myNodes[4] = idnode2;
83   } else if (idmin == idnode4) { // 4 5 1 2 3
84     myNodes[1] = idnode5;
85     myNodes[2] = idnode1;
86     myNodes[3] = idnode2;
87     myNodes[4] = idnode3;
88   } else {                      // 5 1 2 3 4
89     myNodes[1] = idnode1;
90     myNodes[2] = idnode2;
91     myNodes[3] = idnode3;
92     myNodes[4] = idnode4;
93   }
94
95 }
96
97 //=======================================================================
98 //function : NodesOfFace
99 //purpose  : returns the rank node in mynodes. Useful to extract faces from volume
100 //=======================================================================
101 Standard_Integer SMDS_MeshPyramid::NodesOfFace(const Standard_Integer rankface, 
102                                                const Standard_Integer ranknode)
103 {
104   static Standard_Integer facenode[5][4] = {
105     {0,1,2,3},
106     {0,4,1,-1},
107     {1,4,2,-1},
108     {2,4,3,-1},
109     {0,3,4,-1}
110   };
111
112   return facenode[rankface-1][ranknode-1];
113 }
114
115 //=======================================================================
116 //function : NodesOfEdge
117 //purpose  : returns the rank node in mynodes. Useful to extract edges from volume
118 //=======================================================================
119 Standard_Integer SMDS_MeshPyramid::NodesOfEdge(const Standard_Integer rankedge, 
120                                                const Standard_Integer ranknode) const
121 {
122   static Standard_Integer faceedge[8][2] = {
123     {0,1},
124     {1,2},
125     {2,3},
126     {0,3},
127     {0,4},
128     {1,4},
129     {2,4},
130     {3,4}
131
132   };
133
134   return faceedge[rankedge-1][ranknode-1];
135 }
136
137
138 //=======================================================================
139 //function : GetFaceDefinedByNodes
140 //purpose  : 
141 //=======================================================================
142 void SMDS_MeshPyramid::GetFaceDefinedByNodes(const Standard_Integer rank, 
143                                              const Standard_Address idnode,
144                                              Standard_Integer& nb) const
145 {
146   Standard_Integer *ptr;
147   ptr = (Standard_Integer *)idnode;
148   ptr[0] = myNodes[NodesOfFace(rank,1)];
149   ptr[1] = myNodes[NodesOfFace(rank,2)];
150   ptr[2] = myNodes[NodesOfFace(rank,3)];
151   nb = (NodesOfFace(rank,4) == -1 ? 3 : 4);
152   if (nb == 4)
153     ptr[3] = myNodes[NodesOfFace(rank,4)];
154
155 }
156
157 //=======================================================================
158 //function : GetEdgeDefinedByNodes
159 //purpose  : 
160 //=======================================================================
161 void SMDS_MeshPyramid::GetEdgeDefinedByNodes(const Standard_Integer rank, 
162                                             Standard_Integer& idnode1,
163                                             Standard_Integer& idnode2) const
164 {
165   idnode1 = myNodes[NodesOfEdge(rank,1)];
166   idnode2 = myNodes[NodesOfEdge(rank,2)];
167 }
168