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