4 * Created on: Jun 3, 2010
8 #ifndef SMDS_DOWNWARD_HXX_
9 #define SMDS_DOWNWARD_HXX_
11 #include "SMDS_UnstructuredGrid.hxx"
18 int nodeIds[8]; //!< max number of nodes in a face or edge: quad quad = 8
20 unsigned char vtkType;
21 } ElemByNodesType; // TODO resize for polyhedrons
25 ElemByNodesType elems[6]; //!< max number of faces in a volume or edges in a face : hexahedron = 6
27 } ListElemByNodesType; // TODO resize for polyhedrons
32 DownIdType(int a, unsigned char b) :
33 cellId(a), cellType(b)
37 unsigned char cellType;
42 bool operator ()(const DownIdType e1, const DownIdType e2) const
44 if (e1.cellId == e2.cellId)
45 return (e1.cellType < e2.cellType);
47 return (e1.cellId < e2.cellId);
53 friend class SMDS_UnstructuredGrid;
54 friend class SMDS_Down2D;
55 friend class SMDS_Down3D;
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)
66 return _vtkCellIds[cellId];
72 static int getCellDimension(unsigned char cellType);
74 SMDS_Downward(SMDS_UnstructuredGrid *grid, int nbDownCells);
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);
84 SMDS_UnstructuredGrid* _grid;
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
91 static std::vector<int> _cellDimension; //!< conversion table: type --> dimension
94 class SMDS_Down1D: public SMDS_Downward
96 friend class SMDS_UnstructuredGrid;
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);
103 SMDS_Down1D(SMDS_UnstructuredGrid *grid, int nbDownCells);
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);
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
124 class SMDS_Down2D: public SMDS_Downward
126 friend class SMDS_UnstructuredGrid;
127 friend class SMDS_Down1D;
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);
134 SMDS_Down2D(SMDS_UnstructuredGrid *grid, int nbDownCells);
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);
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
155 class SMDS_Down3D: public SMDS_Downward
157 friend class SMDS_UnstructuredGrid;
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;
165 SMDS_Down3D(SMDS_UnstructuredGrid *grid, int nbDownCells);
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);
173 class SMDS_DownEdge: public SMDS_Down1D
175 friend class SMDS_UnstructuredGrid;
178 SMDS_DownEdge(SMDS_UnstructuredGrid *grid);
182 class SMDS_DownQuadEdge: public SMDS_Down1D
184 friend class SMDS_UnstructuredGrid;
187 SMDS_DownQuadEdge(SMDS_UnstructuredGrid *grid);
188 ~SMDS_DownQuadEdge();
191 class SMDS_DownTriangle: public SMDS_Down2D
193 friend class SMDS_UnstructuredGrid;
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
202 class SMDS_DownQuadTriangle: public SMDS_Down2D
204 friend class SMDS_UnstructuredGrid;
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
213 class SMDS_DownQuadrangle: public SMDS_Down2D
215 friend class SMDS_UnstructuredGrid;
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
224 class SMDS_DownQuadQuadrangle: public SMDS_Down2D
226 friend class SMDS_UnstructuredGrid;
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
235 //class SMDS_DownPolygon: public SMDS_Down2D
238 // SMDS_DownPolygon(SMDS_UnstructuredGrid *grid);
239 // ~SMDS_DownPolygon();
243 //class SMDS_DownQuadPolygon: public SMDS_Down2D
246 // SMDS_DownQuadPolygon(SMDS_UnstructuredGrid *grid);
247 // ~SMDS_DownQuadPolygon();
251 class SMDS_DownTetra: public SMDS_Down3D
253 friend class SMDS_UnstructuredGrid;
255 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
257 SMDS_DownTetra(SMDS_UnstructuredGrid *grid);
259 virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
260 virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
263 class SMDS_DownQuadTetra: public SMDS_Down3D
265 friend class SMDS_UnstructuredGrid;
267 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
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);
275 class SMDS_DownPyramid: public SMDS_Down3D
277 friend class SMDS_UnstructuredGrid;
279 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
281 SMDS_DownPyramid(SMDS_UnstructuredGrid *grid);
283 virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
284 virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
287 class SMDS_DownQuadPyramid: public SMDS_Down3D
289 friend class SMDS_UnstructuredGrid;
291 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
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);
299 class SMDS_DownPenta: public SMDS_Down3D
301 friend class SMDS_UnstructuredGrid;
303 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
305 SMDS_DownPenta(SMDS_UnstructuredGrid *grid);
307 virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
308 virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
311 class SMDS_DownQuadPenta: public SMDS_Down3D
313 friend class SMDS_UnstructuredGrid;
315 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
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);
323 class SMDS_DownHexa: public SMDS_Down3D
325 friend class SMDS_UnstructuredGrid;
327 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
329 SMDS_DownHexa(SMDS_UnstructuredGrid *grid);
331 virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
332 virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
335 class SMDS_DownQuadHexa: public SMDS_Down3D
337 friend class SMDS_UnstructuredGrid;
339 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
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);
347 //class SMDS_DownPolyhedra: public SMDS_Down3D
350 // SMDS_DownPolyhedra(SMDS_UnstructuredGrid *grid);
351 // ~SMDS_DownPolyhedra();
355 //class SMDS_DownQuadPolyhedra: public SMDS_Down3D
358 // SMDS_DownQuadPolyhedra(SMDS_UnstructuredGrid *grid);
359 // ~SMDS_DownQuadPolyhedra();
363 #endif /* SMDS_DOWNWARD_HXX_ */