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 virtual int getNodes(int cellId, int* nodevec) {return 0; }
65 int getVtkCellId(int cellId)
67 return _vtkCellIds[cellId];
73 static int getCellDimension(unsigned char cellType);
75 SMDS_Downward(SMDS_UnstructuredGrid *grid, int nbDownCells);
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);
85 SMDS_UnstructuredGrid* _grid;
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
92 static std::vector<int> _cellDimension; //!< conversion table: type --> dimension
95 class SMDS_Down1D: public SMDS_Downward
97 friend class SMDS_UnstructuredGrid;
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); }
105 SMDS_Down1D(SMDS_UnstructuredGrid *grid, int nbDownCells);
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);
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
126 class SMDS_Down2D: public SMDS_Downward
128 friend class SMDS_UnstructuredGrid;
129 friend class SMDS_Down1D;
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);
136 SMDS_Down2D(SMDS_UnstructuredGrid *grid, int nbDownCells);
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);
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
157 class SMDS_Down3D: public SMDS_Downward
159 friend class SMDS_UnstructuredGrid;
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;
167 SMDS_Down3D(SMDS_UnstructuredGrid *grid, int nbDownCells);
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);
175 class SMDS_DownEdge: public SMDS_Down1D
177 friend class SMDS_UnstructuredGrid;
180 SMDS_DownEdge(SMDS_UnstructuredGrid *grid);
184 class SMDS_DownQuadEdge: public SMDS_Down1D
186 friend class SMDS_UnstructuredGrid;
189 SMDS_DownQuadEdge(SMDS_UnstructuredGrid *grid);
190 ~SMDS_DownQuadEdge();
193 class SMDS_DownTriangle: public SMDS_Down2D
195 friend class SMDS_UnstructuredGrid;
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
204 class SMDS_DownQuadTriangle: public SMDS_Down2D
206 friend class SMDS_UnstructuredGrid;
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
215 class SMDS_DownQuadrangle: public SMDS_Down2D
217 friend class SMDS_UnstructuredGrid;
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
226 class SMDS_DownQuadQuadrangle: public SMDS_Down2D
228 friend class SMDS_UnstructuredGrid;
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
237 //class SMDS_DownPolygon: public SMDS_Down2D
240 // SMDS_DownPolygon(SMDS_UnstructuredGrid *grid);
241 // ~SMDS_DownPolygon();
245 //class SMDS_DownQuadPolygon: public SMDS_Down2D
248 // SMDS_DownQuadPolygon(SMDS_UnstructuredGrid *grid);
249 // ~SMDS_DownQuadPolygon();
253 class SMDS_DownTetra: public SMDS_Down3D
255 friend class SMDS_UnstructuredGrid;
257 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
259 SMDS_DownTetra(SMDS_UnstructuredGrid *grid);
261 virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
262 virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
265 class SMDS_DownQuadTetra: public SMDS_Down3D
267 friend class SMDS_UnstructuredGrid;
269 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
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);
277 class SMDS_DownPyramid: public SMDS_Down3D
279 friend class SMDS_UnstructuredGrid;
281 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
283 SMDS_DownPyramid(SMDS_UnstructuredGrid *grid);
285 virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
286 virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
289 class SMDS_DownQuadPyramid: public SMDS_Down3D
291 friend class SMDS_UnstructuredGrid;
293 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
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);
301 class SMDS_DownPenta: public SMDS_Down3D
303 friend class SMDS_UnstructuredGrid;
305 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
307 SMDS_DownPenta(SMDS_UnstructuredGrid *grid);
309 virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
310 virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
313 class SMDS_DownQuadPenta: public SMDS_Down3D
315 friend class SMDS_UnstructuredGrid;
317 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
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);
325 class SMDS_DownHexa: public SMDS_Down3D
327 friend class SMDS_UnstructuredGrid;
329 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
331 SMDS_DownHexa(SMDS_UnstructuredGrid *grid);
333 virtual void addDownCell(int cellId, int lowCellId, unsigned char aType);
334 virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
337 class SMDS_DownQuadHexa: public SMDS_Down3D
339 friend class SMDS_UnstructuredGrid;
341 virtual void getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes);
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);
349 //class SMDS_DownPolyhedra: public SMDS_Down3D
352 // SMDS_DownPolyhedra(SMDS_UnstructuredGrid *grid);
353 // ~SMDS_DownPolyhedra();
357 //class SMDS_DownQuadPolyhedra: public SMDS_Down3D
360 // SMDS_DownQuadPolyhedra(SMDS_UnstructuredGrid *grid);
361 // ~SMDS_DownQuadPolyhedra();
365 #endif /* SMDS_DOWNWARD_HXX_ */