Salome HOME
NRI : First integration.
[modules/smesh.git] / src / SMDS / SMDS_MeshHexahedron.cxx
1 using namespace std;
2 // File:        SMDS_MeshHexahedron.cxx
3 // Created:     Wed Jan 23 17:02:34 2002
4 // Author:      Jean-Michel BOULCOURT
5 //              <jmb@coulox.paris1.matra-dtv.fr>
6
7
8 #include "SMDS_MeshHexahedron.ixx"
9 #include <Standard_ConstructionError.hxx>
10
11
12 //=======================================================================
13 //function : SMDS_MeshHexahedron
14 //purpose  : Hexaedra
15 //=======================================================================
16
17 SMDS_MeshHexahedron::SMDS_MeshHexahedron(const Standard_Integer ID,
18                                          const Standard_Integer idnode1, 
19                                          const Standard_Integer idnode2, 
20                                          const Standard_Integer idnode3,
21                                          const Standard_Integer idnode4,
22                                          const Standard_Integer idnode5,
23                                          const Standard_Integer idnode6,
24                                          const Standard_Integer idnode7,
25                                          const Standard_Integer idnode8):SMDS_MeshVolume(ID,8)
26 {
27   SetConnections(idnode1,idnode2,idnode3,idnode4,idnode5,idnode6,idnode7,idnode8);
28   ComputeKey();
29 }
30
31
32 //=======================================================================
33 //function : SetConnections
34 //purpose  : Heaxahedron
35 //=======================================================================
36 void SMDS_MeshHexahedron::SetConnections(const Standard_Integer idnode1, 
37                                          const Standard_Integer idnode2,
38                                          const Standard_Integer idnode3,
39                                          const Standard_Integer idnode4,
40                                          const Standard_Integer idnode5,
41                                          const Standard_Integer idnode6,
42                                          const Standard_Integer idnode7,
43                                          const Standard_Integer idnode8)
44 {
45   Standard_Integer idmin = (idnode1 < idnode2 ? idnode1 : idnode2);
46   idmin = (idmin < idnode3 ? idmin : idnode3);
47   idmin = (idmin < idnode4 ? idmin : idnode4);
48   idmin = (idmin < idnode5 ? idmin : idnode5);
49   idmin = (idmin < idnode6 ? idmin : idnode6);
50   idmin = (idmin < idnode7 ? idmin : idnode7);
51   idmin = (idmin < idnode8 ? idmin : idnode8);
52
53   myNodes[0] = idmin;
54   if (idmin == idnode1) { // 1 2 3 4 5 6 7 8
55     myNodes[1] = idnode2;
56     myNodes[2] = idnode3;
57     myNodes[3] = idnode4;
58     myNodes[4] = idnode5;
59     myNodes[5] = idnode6;
60     myNodes[6] = idnode7;
61     myNodes[7] = idnode8;
62   } else if (idmin == idnode2) { // 2 3 4 1 6 7 8 5
63     myNodes[1] = idnode3;
64     myNodes[2] = idnode4;
65     myNodes[3] = idnode1;
66     myNodes[4] = idnode6;
67     myNodes[5] = idnode7;
68     myNodes[6] = idnode8;
69     myNodes[7] = idnode5;
70   } else if (idmin == idnode3) { // 3 4 1 2 7 8 5 6
71     myNodes[1] = idnode4;
72     myNodes[2] = idnode1;
73     myNodes[3] = idnode2;
74     myNodes[4] = idnode7;
75     myNodes[5] = idnode8;
76     myNodes[6] = idnode5;
77     myNodes[7] = idnode6;
78   } else if (idmin == idnode4) { // 4 1 2 3 8 5 6 7
79     myNodes[1] = idnode1;
80     myNodes[2] = idnode2;
81     myNodes[3] = idnode3;
82     myNodes[4] = idnode8;
83     myNodes[5] = idnode5;
84     myNodes[6] = idnode6;
85     myNodes[7] = idnode7;
86   } else if (idmin == idnode5) { // 5 6 7 8 1 2 3 4
87     myNodes[1] = idnode6;
88     myNodes[2] = idnode7;
89     myNodes[3] = idnode8;
90     myNodes[4] = idnode1;
91     myNodes[5] = idnode2;
92     myNodes[6] = idnode3;
93     myNodes[7] = idnode4;
94   } else if (idmin == idnode6){  // 6 7 8 5 2 3 4 1
95     myNodes[1] = idnode7;
96     myNodes[2] = idnode8;
97     myNodes[3] = idnode5;
98     myNodes[4] = idnode2;
99     myNodes[5] = idnode3;
100     myNodes[6] = idnode4;
101     myNodes[7] = idnode1;
102   } else if (idmin == idnode7) {  // 7 8 5 6 3 4 1 2
103     myNodes[1] = idnode8;
104     myNodes[2] = idnode5;
105     myNodes[3] = idnode6;
106     myNodes[4] = idnode3;
107     myNodes[5] = idnode4;
108     myNodes[6] = idnode1;
109     myNodes[7] = idnode2;
110   } else {                        // 8 5 6 7 4 1 2 3
111     myNodes[1] = idnode5;
112     myNodes[2] = idnode6;
113     myNodes[3] = idnode7;
114     myNodes[4] = idnode4;
115     myNodes[5] = idnode1;
116     myNodes[6] = idnode2;
117     myNodes[7] = idnode3;
118   }
119
120 }
121
122 //=======================================================================
123 //function : NodesOfFace
124 //purpose  : returns the rank node in mynodes. Useful to extract faces from volume
125 //=======================================================================
126 Standard_Integer SMDS_MeshHexahedron::NodesOfFace(const Standard_Integer rankface, 
127                                                const Standard_Integer ranknode)
128 {
129   static Standard_Integer facenode[6][4] = {
130     {0,1,2,3},
131     {4,7,6,5},
132     {0,4,5,1},
133     {1,5,6,2},
134     {2,6,7,3},
135     {0,3,7,4}
136   };
137
138   return facenode[rankface-1][ranknode-1];
139 }
140
141 //=======================================================================
142 //function : NodesOfEdge
143 //purpose  : returns the rank node in mynodes. Useful to extract edges from volume
144 //=======================================================================
145 Standard_Integer SMDS_MeshHexahedron::NodesOfEdge(const Standard_Integer rankedge, 
146                                                   const Standard_Integer ranknode) const
147 {
148   static Standard_Integer faceedge[12][2] = {
149     {0,1},
150     {1,2},
151     {2,3},
152     {0,3},
153     {4,7},
154     {6,7},
155     {5,6},
156     {4,5},
157     {0,4},
158     {1,5},
159     {2,6},
160     {3,7}
161
162   };
163
164   return faceedge[rankedge-1][ranknode-1];
165 }
166
167 //=======================================================================
168 //function : GetFaceDefinedByNodes
169 //purpose  : 
170 //=======================================================================
171 void SMDS_MeshHexahedron::GetFaceDefinedByNodes(const Standard_Integer rank, 
172                                                 const Standard_Address idnode,
173                                                 Standard_Integer& nb) const
174 {
175   Standard_Integer *ptr;
176   nb = 4;
177   ptr = (Standard_Integer *)idnode;
178   ptr[0] = myNodes[NodesOfFace(rank,1)];
179   ptr[1] = myNodes[NodesOfFace(rank,2)];
180   ptr[2] = myNodes[NodesOfFace(rank,3)];
181   ptr[3] = myNodes[NodesOfFace(rank,4)];
182
183 }
184
185 //=======================================================================
186 //function : GetEdgeDefinedByNodes
187 //purpose  : 
188 //=======================================================================
189 void SMDS_MeshHexahedron::GetEdgeDefinedByNodes(const Standard_Integer rank, 
190                                             Standard_Integer& idnode1,
191                                             Standard_Integer& idnode2) const
192 {
193   idnode1 = myNodes[NodesOfEdge(rank,1)];
194   idnode2 = myNodes[NodesOfEdge(rank,2)];
195 }
196