Salome HOME
173f463f423a54ceb49d825b77ba70fe38bb92ca
[modules/smesh.git] / src / SMDS / SMDS_Downward.hxx
1 /*
2  * SMDS_Downward.hxx
3  *
4  *  Created on: Jun 3, 2010
5  *      Author: prascle
6  */
7
8 #ifndef SMDS_DOWNWARD_HXX_
9 #define SMDS_DOWNWARD_HXX_
10
11 #include "SMDS_UnstructuredGrid.hxx"
12
13 #include <vector>
14 #include <set>
15
16 typedef struct
17 {
18   int nodeIds[8]; //!< max number of nodes in a face or edge: quad quad = 8
19   int nbNodes;
20   unsigned char vtkType;
21 } ElemByNodesType; // TODO resize for polyhedrons
22
23 typedef struct
24 {
25   ElemByNodesType elems[6]; //!< max number of faces in a volume or edges in a face : hexahedron = 6
26   int nbElems;
27 } ListElemByNodesType; // TODO resize for polyhedrons
28
29 class DownIdType
30 {
31 public:
32   DownIdType(int a, unsigned char b) :
33     cellId(a), cellType(b)
34   {
35   }
36   int cellId;
37   unsigned char cellType;
38 };
39
40 struct DownIdCompare
41 {
42   bool operator ()(const DownIdType e1, const DownIdType e2) const
43   {
44     if (e1.cellId == e2.cellId)
45       return (e1.cellType < e2.cellType);
46     else
47       return (e1.cellId < e2.cellId);
48   }
49 };
50
51 class SMDS_Downward
52 {
53   friend class SMDS_UnstructuredGrid;
54   friend class SMDS_Down2D;
55   friend class SMDS_Down3D;
56 public:
57   virtual int getNumberOfDownCells(int cellId);
58   virtual const int* getDownCells(int cellId);
59   virtual const unsigned char* getDownTypes(int cellId);
60   virtual int getNumberOfUpCells(int cellId) = 0;
61   virtual const int* getUpCells(int cellId) = 0;
62   virtual const unsigned char* getUpTypes(int cellId) = 0;
63   virtual void getNodeIds(int cellId, std::set<int>& nodeSet) = 0;
64   int getVtkCellId(int cellId)
65   {
66     return _vtkCellIds[cellId];
67   }
68   int getMaxId()
69   {
70     return _maxId;
71   }
72   static int getCellDimension(unsigned char cellType);
73 protected:
74   SMDS_Downward(SMDS_UnstructuredGrid *grid, int nbDownCells);
75   ~SMDS_Downward();
76   int addCell(int vtkId = -1);
77   virtual void initCell(int cellId);
78   virtual void allocate(int nbElems) = 0;
79   virtual void compactStorage() = 0;
80   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
81   virtual void addUpCell(int cellId, int upCellId, unsigned char aType); //!< Id's are downward connectivity id's
82   virtual int getNodeSet(int cellId, int* nodeSet);
83
84   SMDS_UnstructuredGrid* _grid;
85   int _maxId;
86   int _nbDownCells; //!< the same number for all cells of a derived class
87   std::vector<int> _cellIds; //!< growing size: all the down cell id's, size = _maxId * _nbDownCells
88   std::vector<int> _vtkCellIds; //!< growing size: size = _maxId, either vtkId or -1
89   std::vector<unsigned char> _cellTypes; //!< fixed size: the same vector for all cells of a derived class
90
91   static std::vector<int> _cellDimension; //!< conversion table: type --> dimension
92 };
93
94 class SMDS_Down1D: public SMDS_Downward
95 {
96   friend class SMDS_UnstructuredGrid;
97 public:
98   virtual int getNumberOfUpCells(int cellId);
99   virtual const int* getUpCells(int cellId);
100   virtual const unsigned char* getUpTypes(int cellId);
101   virtual void getNodeIds(int cellId, std::set<int>& nodeSet);
102 protected:
103   SMDS_Down1D(SMDS_UnstructuredGrid *grid, int nbDownCells);
104   ~SMDS_Down1D();
105   virtual void initCell(int cellId);
106   virtual void allocate(int nbElems);
107   virtual void compactStorage();
108   virtual void addUpCell(int cellId, int upCellId, unsigned char aType); //!< Id's are downward connectivity id's
109   virtual int getNodeSet(int cellId, int* nodeSet);
110   void setNodes(int cellId, int vtkId);
111   void setNodes(int cellId, const int* nodeIds);
112   int computeVtkCells(int cellId, std::vector<int>& vtkIds);
113   int computeVtkCells(int* pts, std::vector<int>& vtkIds);
114   int computeFaces(int cellId, int* vtkIds, int nbcells, int* downFaces, unsigned char* downTypes);
115   int computeFaces(int* pts, int* vtkIds, int nbcells, int* downFaces, unsigned char* downTypes);
116
117   std::vector<std::vector<int> > _upCellIdsVector; //!< the number of faces sharing an edge is not known
118   std::vector<std::vector<unsigned char> > _upCellTypesVector; //!< the number of faces sharing an edge is not known
119   std::vector<int> _upCellIds; //!< compacted storage after connectivity calculation
120   std::vector<unsigned char> _upCellTypes; //!< compacted storage after connectivity calculation
121   std::vector<int> _upCellIndex; //!< compacted storage after connectivity calculation
122 };
123
124 class SMDS_Down2D: public SMDS_Downward
125 {
126   friend class SMDS_UnstructuredGrid;
127   friend class SMDS_Down1D;
128 public:
129   virtual int getNumberOfUpCells(int cellId);
130   virtual const int* getUpCells(int cellId);
131   virtual const unsigned char* getUpTypes(int cellId);
132   virtual void getNodeIds(int cellId, std::set<int>& nodeSet);
133 protected:
134   SMDS_Down2D(SMDS_UnstructuredGrid *grid, int nbDownCells);
135   ~SMDS_Down2D();
136   virtual void allocate(int nbElems);
137   virtual void compactStorage();
138   virtual void addUpCell(int cellId, int upCellId, unsigned char aType);
139   virtual void computeEdgesWithNodes(int cellId, ListElemByNodesType& facesWithNodes) = 0;
140   virtual int getNodeSet(int cellId, int* nodeSet);
141   int computeVolumeIds(int cellId, int* ids);
142   int computeVolumeIds(ElemByNodesType& faceByNodes, int* ids);
143   int computeVolumeIdsFromNodesFace(int* nodes, int nbNodes, int* ids);
144   void setTempNodes(int cellId, int vtkId);
145   void setTempNodes(int cellId, ElemByNodesType& faceByNodes);
146   bool isInFace(int cellId, int *pts, int npts);
147   int FindEdgeByNodes(int cellId, ElemByNodesType& edgeByNodes);
148
149   std::vector<int> _upCellIds; //!< 2 volumes max. per face
150   std::vector<unsigned char> _upCellTypes; //!< 2 volume types per face
151   std::vector<int> _tempNodes; //!< temporary storage of nodes, until downward connectivity completion
152   int _nbNodes; //!< number of nodes in a face
153 };
154
155 class SMDS_Down3D: public SMDS_Downward
156 {
157   friend class SMDS_UnstructuredGrid;
158 public:
159   virtual int getNumberOfUpCells(int cellId);
160   virtual const int* getUpCells(int cellId);
161   virtual const unsigned char* getUpTypes(int cellId);
162   virtual void getNodeIds(int cellId, std::set<int>& nodeSet);
163   virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes) = 0;
164 protected:
165   SMDS_Down3D(SMDS_UnstructuredGrid *grid, int nbDownCells);
166   ~SMDS_Down3D();
167   virtual void allocate(int nbElems);
168   virtual void compactStorage();
169   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes) = 0;
170   int FindFaceByNodes(int cellId, ElemByNodesType& faceByNodes);
171 };
172
173 class SMDS_DownEdge: public SMDS_Down1D
174 {
175   friend class SMDS_UnstructuredGrid;
176 public:
177 protected:
178   SMDS_DownEdge(SMDS_UnstructuredGrid *grid);
179   ~SMDS_DownEdge();
180 };
181
182 class SMDS_DownQuadEdge: public SMDS_Down1D
183 {
184   friend class SMDS_UnstructuredGrid;
185 public:
186 protected:
187   SMDS_DownQuadEdge(SMDS_UnstructuredGrid *grid);
188   ~SMDS_DownQuadEdge();
189 };
190
191 class SMDS_DownTriangle: public SMDS_Down2D
192 {
193   friend class SMDS_UnstructuredGrid;
194 public:
195 protected:
196   SMDS_DownTriangle(SMDS_UnstructuredGrid *grid);
197   ~SMDS_DownTriangle();
198   virtual void computeEdgesWithNodes(int cellId, ListElemByNodesType& edgesWithNodes);
199   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
200 };
201
202 class SMDS_DownQuadTriangle: public SMDS_Down2D
203 {
204   friend class SMDS_UnstructuredGrid;
205 public:
206 protected:
207   SMDS_DownQuadTriangle(SMDS_UnstructuredGrid *grid);
208   ~SMDS_DownQuadTriangle();
209   virtual void computeEdgesWithNodes(int cellId, ListElemByNodesType& edgesWithNodes);
210   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
211 };
212
213 class SMDS_DownQuadrangle: public SMDS_Down2D
214 {
215   friend class SMDS_UnstructuredGrid;
216 public:
217 protected:
218   SMDS_DownQuadrangle(SMDS_UnstructuredGrid *grid);
219   ~SMDS_DownQuadrangle();
220   virtual void computeEdgesWithNodes(int cellId, ListElemByNodesType& edgesWithNodes);
221   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
222 };
223
224 class SMDS_DownQuadQuadrangle: public SMDS_Down2D
225 {
226   friend class SMDS_UnstructuredGrid;
227 public:
228 protected:
229   SMDS_DownQuadQuadrangle(SMDS_UnstructuredGrid *grid);
230   ~SMDS_DownQuadQuadrangle();
231   virtual void computeEdgesWithNodes(int cellId, ListElemByNodesType& edgesWithNodes);
232   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
233 };
234
235 //class SMDS_DownPolygon: public SMDS_Down2D
236 //{
237 //public:
238 //  SMDS_DownPolygon(SMDS_UnstructuredGrid *grid);
239 //  ~SMDS_DownPolygon();
240 //protected:
241 //};
242
243 //class SMDS_DownQuadPolygon: public SMDS_Down2D
244 //{
245 //public:
246 //  SMDS_DownQuadPolygon(SMDS_UnstructuredGrid *grid);
247 //  ~SMDS_DownQuadPolygon();
248 //protected:
249 //};
250
251 class SMDS_DownTetra: public SMDS_Down3D
252 {
253   friend class SMDS_UnstructuredGrid;
254 public:
255   virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
256 protected:
257   SMDS_DownTetra(SMDS_UnstructuredGrid *grid);
258   ~SMDS_DownTetra();
259   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
260   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
261 };
262
263 class SMDS_DownQuadTetra: public SMDS_Down3D
264 {
265   friend class SMDS_UnstructuredGrid;
266 public:
267   virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
268 protected:
269   SMDS_DownQuadTetra(SMDS_UnstructuredGrid *grid);
270   ~SMDS_DownQuadTetra();
271   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
272   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
273 };
274
275 class SMDS_DownPyramid: public SMDS_Down3D
276 {
277   friend class SMDS_UnstructuredGrid;
278 public:
279   virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
280 protected:
281   SMDS_DownPyramid(SMDS_UnstructuredGrid *grid);
282   ~SMDS_DownPyramid();
283   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
284   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
285 };
286
287 class SMDS_DownQuadPyramid: public SMDS_Down3D
288 {
289   friend class SMDS_UnstructuredGrid;
290 public:
291   virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
292 protected:
293   SMDS_DownQuadPyramid(SMDS_UnstructuredGrid *grid);
294   ~SMDS_DownQuadPyramid();
295   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
296   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
297 };
298
299 class SMDS_DownPenta: public SMDS_Down3D
300 {
301   friend class SMDS_UnstructuredGrid;
302 public:
303   virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
304 protected:
305   SMDS_DownPenta(SMDS_UnstructuredGrid *grid);
306   ~SMDS_DownPenta();
307   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
308   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
309 };
310
311 class SMDS_DownQuadPenta: public SMDS_Down3D
312 {
313   friend class SMDS_UnstructuredGrid;
314 public:
315   virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
316 protected:
317   SMDS_DownQuadPenta(SMDS_UnstructuredGrid *grid);
318   ~SMDS_DownQuadPenta();
319   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
320   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
321 };
322
323 class SMDS_DownHexa: public SMDS_Down3D
324 {
325   friend class SMDS_UnstructuredGrid;
326 public:
327   virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
328 protected:
329   SMDS_DownHexa(SMDS_UnstructuredGrid *grid);
330   ~SMDS_DownHexa();
331   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
332   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
333 };
334
335 class SMDS_DownQuadHexa: public SMDS_Down3D
336 {
337   friend class SMDS_UnstructuredGrid;
338 public:
339   virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
340 protected:
341   SMDS_DownQuadHexa(SMDS_UnstructuredGrid *grid);
342   ~SMDS_DownQuadHexa();
343   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
344   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
345 };
346
347 //class SMDS_DownPolyhedra: public SMDS_Down3D
348 //{
349 //public:
350 //  SMDS_DownPolyhedra(SMDS_UnstructuredGrid *grid);
351 //  ~SMDS_DownPolyhedra();
352 //protected:
353 //};
354
355 //class SMDS_DownQuadPolyhedra: public SMDS_Down3D
356 //{
357 //public:
358 //  SMDS_DownQuadPolyhedra(SMDS_UnstructuredGrid *grid);
359 //  ~SMDS_DownQuadPolyhedra();
360 //protected:
361 //};
362
363 #endif /* SMDS_DOWNWARD_HXX_ */