Salome HOME
Copyright update 2021
[modules/smesh.git] / src / SMDS / SMDS_VolumeOfNodes.cxx
1 // Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  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, or (at your option) any later version.
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.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 //  SMESH SMDS : implementation of Salome mesh data structure
24 //
25 #ifdef _MSC_VER
26 #pragma warning(disable:4786)
27 #endif
28
29 #include "SMDS_VolumeOfNodes.hxx"
30
31 #include "SMDS_MeshNode.hxx"
32 #include "SMDS_SetIterator.hxx"
33
34 #include <boost/make_shared.hpp>
35
36 #include <utilities.h>
37
38 ///////////////////////////////////////////////////////////////////////////////
39 /// Create an hexahedron. node 1,2,3,4 and 5,6,7,8 are quadrangle and
40 /// 5,1 and 7,3 are an edges.
41 ///////////////////////////////////////////////////////////////////////////////
42 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(const SMDS_MeshNode * node1,
43                                        const SMDS_MeshNode * node2,
44                                        const SMDS_MeshNode * node3,
45                                        const SMDS_MeshNode * node4,
46                                        const SMDS_MeshNode * node5,
47                                        const SMDS_MeshNode * node6,
48                                        const SMDS_MeshNode * node7,
49                                        const SMDS_MeshNode * node8)
50 {
51   myNbNodes = 8;
52   myNodes = new const SMDS_MeshNode* [myNbNodes];
53   myNodes[0]=node1;
54   myNodes[1]=node2;
55   myNodes[2]=node3;
56   myNodes[3]=node4;
57   myNodes[4]=node5;
58   myNodes[5]=node6;
59   myNodes[6]=node7;
60   myNodes[7]=node8;
61 }
62
63 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(const SMDS_MeshNode * node1,
64                                        const SMDS_MeshNode * node2,
65                                        const SMDS_MeshNode * node3,
66                                        const SMDS_MeshNode * node4)
67 {
68   myNbNodes = 4;
69   myNodes = new const SMDS_MeshNode* [myNbNodes];
70   myNodes[0]=node1;
71   myNodes[1]=node2;
72   myNodes[2]=node3;
73   myNodes[3]=node4;
74 }
75
76 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(const SMDS_MeshNode * node1,
77                                        const SMDS_MeshNode * node2,
78                                        const SMDS_MeshNode * node3,
79                                        const SMDS_MeshNode * node4,
80                                        const SMDS_MeshNode * node5)
81 {
82   myNbNodes = 5;
83   myNodes = new const SMDS_MeshNode* [myNbNodes];
84   myNodes[0]=node1;
85   myNodes[1]=node2;
86   myNodes[2]=node3;
87   myNodes[3]=node4;
88   myNodes[4]=node5;
89 }
90
91 SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(const SMDS_MeshNode * node1,
92                                        const SMDS_MeshNode * node2,
93                                        const SMDS_MeshNode * node3,
94                                        const SMDS_MeshNode * node4,
95                                        const SMDS_MeshNode * node5,
96                                        const SMDS_MeshNode * node6)
97 {
98   myNbNodes = 6;
99   myNodes = new const SMDS_MeshNode* [myNbNodes];
100   myNodes[0]=node1;
101   myNodes[1]=node2;
102   myNodes[2]=node3;
103   myNodes[3]=node4;
104   myNodes[4]=node5;
105   myNodes[5]=node6;
106 }
107
108 bool SMDS_VolumeOfNodes::ChangeNodes(const SMDS_MeshNode* nodes[],
109                                      const int            nbNodes)
110 {
111   if (nbNodes < 4 || nbNodes > 8 || nbNodes == 7)
112     return false;
113
114   delete [] myNodes;
115   myNbNodes = nbNodes;
116   myNodes = new const SMDS_MeshNode* [myNbNodes];
117   for ( int i = 0; i < nbNodes; i++ )
118     myNodes[ i ] = nodes [ i ];
119
120   return true;
121 }
122
123 SMDS_VolumeOfNodes::~SMDS_VolumeOfNodes()
124 {
125   if (myNodes != NULL) {
126     delete [] myNodes;
127     myNodes = NULL;
128   }
129 }
130
131 void SMDS_VolumeOfNodes::Print(std::ostream & OS) const
132 {
133   OS << "volume <" << GetID() << "> : ";
134   int i;
135   for (i = 0; i < NbNodes()-1; ++i) OS << myNodes[i] << ",";
136   OS << myNodes[NbNodes()-1]<< ") " << std::endl;
137 }
138
139 int SMDS_VolumeOfNodes::NbFaces() const
140 {
141   switch(NbNodes())
142   {
143   case 4: return 4;
144   case 5: return 5;
145   case 6: return 5;
146   case 8: return 6;
147   default: MESSAGE("invalid number of nodes");
148   }
149   return 0;
150 }
151
152 int SMDS_VolumeOfNodes::NbNodes() const
153 {
154   return myNbNodes;
155 }
156
157 int SMDS_VolumeOfNodes::NbEdges() const
158 {
159   switch(NbNodes())
160   {
161   case 4: return 6;
162   case 5: return 8;
163   case 6: return 9;
164   case 8: return 12;
165   default: MESSAGE("invalid number of nodes");
166   }
167   return 0;
168 }
169
170
171 SMDSAbs_ElementType SMDS_VolumeOfNodes::GetType() const
172 {
173   return SMDSAbs_Volume;
174 }
175
176 /*!
177  * \brief Return node by its index
178  * \param ind - node index
179  * \retval const SMDS_MeshNode* - the node
180  */
181 const SMDS_MeshNode* SMDS_VolumeOfNodes::GetNode(const int ind) const
182 {
183   return myNodes[ ind ];
184 }
185
186 SMDSAbs_EntityType SMDS_VolumeOfNodes::GetEntityType() const
187 {
188   SMDSAbs_EntityType aType = SMDSEntity_Tetra;
189   switch(myNbNodes)
190   {
191   case 4: aType = SMDSEntity_Tetra;   break;
192   case 5: aType = SMDSEntity_Pyramid; break;
193   case 6: aType = SMDSEntity_Penta;   break;
194   case 8:
195   default: aType = SMDSEntity_Hexa;    break;
196   }
197   return aType;
198 }
199
200 SMDSAbs_GeometryType SMDS_VolumeOfNodes::GetGeomType() const
201 {
202   SMDSAbs_GeometryType aType = SMDSGeom_NONE;
203   switch(myNbNodes)
204   {
205   case 4: aType = SMDSGeom_TETRA;   break;
206   case 5: aType = SMDSGeom_PYRAMID; break;
207   case 6: aType = SMDSGeom_PENTA;   break;
208   case 12: aType = SMDSGeom_HEXAGONAL_PRISM; break;
209   case 8:
210   default: aType = SMDSGeom_HEXA;    break;
211   }
212   return aType;
213 }
214
215 int  SMDS_VolumeOfNodes::GetNodeIndex( const SMDS_MeshNode* node ) const
216 {
217   for ( int i = 0; i < myNbNodes; ++i )
218     if ( myNodes[i] == node )
219       return i;
220   return -1;
221 }
222
223 SMDS_ElemIteratorPtr SMDS_VolumeOfNodes::nodesIterator() const
224 {
225   return boost::make_shared< SMDS_NodeArrayElemIterator >( &myNodes[0], &myNodes[0] + NbNodes() );
226 }
227
228 SMDS_NodeIteratorPtr SMDS_VolumeOfNodes::nodeIterator() const
229 {
230   return boost::make_shared< SMDS_NodeArrayIterator >( &myNodes[0], &myNodes[0] + NbNodes() );
231 }