00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MESH_HPP
00021 #define MESH_HPP
00022
00023 #include <Vector.hpp>
00024
00025 #include <ReferenceCounting.hpp>
00026
00027 #include <VerticesSet.hpp>
00028 #include <VerticesCorrespondance.hpp>
00029
00030 #include <EdgesSet.hpp>
00031
00032 #include <Cell.hpp>
00033 #include <Edge.hpp>
00034
00035 #include <string>
00036
00037 template <typename MeshType>
00038 class MeshExtractor;
00039
00040 class Mesh
00041 {
00042 public:
00043 typedef enum {
00044 cartesianHexahedraMesh,
00045 hexahedraMesh,
00046 octreeMesh,
00047 tetrahedraMesh,
00048 trianglesMesh,
00049 spectralMesh,
00050 surfaceMeshTriangles,
00051 surfaceMeshQuadrangles,
00052 } Type;
00053
00055 typedef enum {
00056 volume,
00057 surface,
00058 plane
00059 } Family;
00060
00061 private:
00063 template <typename MeshType>
00064 friend class MeshExtractor;
00065
00066 size_t static __getNextMeshId()
00067 {
00068 static size_t nextId = 0;
00069 return nextId++;
00070 }
00071
00072 const Type __type;
00073 const Family __family;
00074 const size_t __meshId;
00075 protected:
00076
00077 template <typename MeshType,
00078 typename CellType = typename MeshType::CellType>
00079 class T_iterator
00080 {
00081 protected:
00082 MeshType* __mesh;
00083 CellType* __iterator;
00084 size_t __number;
00085
00086 public:
00087 typedef enum {
00088 Begin,
00089 End
00090 } Position;
00091
00092 const size_t& number() const
00093 {
00094 return __number;
00095 }
00096
00097 inline CellType& operator*()
00098 {
00099 return *__iterator;
00100 }
00101
00102 inline CellType* pointer() const
00103 {
00104 return __iterator;
00105 }
00106
00107 inline bool end() const
00108 {
00109 return (__number >= __mesh->numberOfCells());
00110 }
00111
00112 inline bool operator<(const T_iterator<MeshType, CellType>& i) const
00113 {
00114 return (__number < i.__number);
00115 }
00116
00117 virtual T_iterator<MeshType, CellType>&
00118 operator=(const T_iterator<MeshType, CellType>& i)
00119 {
00120 __mesh = i.__mesh;
00121 __iterator = i.__iterator;
00122 __number = i.__number;
00123
00124 return *this;
00125 }
00126
00127 virtual T_iterator<MeshType, CellType>&
00128 operator=(CellType* iterator)
00129 {
00130 __iterator = iterator;
00131 __number = static_cast<size_t>(__iterator-&(__mesh->cell(0)));
00132
00133 return *this;
00134 }
00135
00136 inline T_iterator<MeshType, CellType> operator++(int)
00137 {
00138 T_iterator<MeshType, CellType> i = *this;
00139 ++(*this);
00140 return i;
00141 }
00142
00143 inline T_iterator<MeshType, CellType> operator++()
00144 {
00145 for(;;) {
00146 ++__number;
00147 if (this->end()) {
00148 break;
00149 }
00150 ++__iterator;
00151 if (not(__iterator->isFictitious())) {
00152 break;
00153 }
00154 }
00155 return *this;
00156 }
00157
00158 T_iterator(MeshType& m,
00159 T_iterator::Position position = T_iterator::Begin)
00160 : __mesh(&m),
00161 __iterator(0),
00162 __number(0)
00163 {
00164 if ((m.numberOfCells() == 0)
00165 or (position == T_iterator<MeshType, CellType>::End)) {
00166 __number = __mesh->numberOfCells();
00167 } else {
00168 __iterator = & m.cell(0);
00169 if (__iterator->isFictitious()) {
00170 ++(*this);
00171 }
00172 }
00173 }
00174
00175 T_iterator(MeshType& m,
00176 const size_t& cellNumber)
00177 : __mesh(&m),
00178 __iterator(0),
00179 __number(cellNumber)
00180 {
00181 if (cellNumber < m.numberOfCells()) {
00182 __iterator = & m.cell(cellNumber);
00183 }
00184 }
00185
00186 T_iterator(const T_iterator<MeshType, CellType>& i)
00187 : __mesh(i.__mesh),
00188 __iterator(i.__iterator),
00189 __number(i.__number)
00190 {
00191 ;
00192 }
00193
00194 virtual ~T_iterator()
00195 {
00196 ;
00197 }
00198 };
00199
00200 ReferenceCounting<VerticesSet>
00201 __verticesSet;
00203 ReferenceCounting<VerticesCorrespondance>
00204 __verticesCorrespondance;
00207 ReferenceCounting<EdgesSet>
00208 __edgesSet;
00217 Mesh(const Mesh& mesh)
00218 : __type(mesh.__type),
00219 __family(mesh.__family),
00220 __meshId(mesh.__meshId),
00221 __verticesSet(mesh.__verticesSet)
00222 {
00223 ;
00224 }
00225
00226 public:
00227
00228 virtual bool hasBorderMesh() const = 0;
00229
00230 virtual ConstReferenceCounting<Mesh> borderBaseMesh() const = 0;
00231
00232
00238 virtual bool isPeriodic() const
00239 {
00240 return __verticesSet->numberOfVertices() != __verticesCorrespondance->numberOfCorrespondances();
00241 }
00242
00248 virtual std::string typeName() const = 0;
00249
00259 virtual bool inside(const real_t& x,
00260 const real_t& y,
00261 const real_t& z) const =0;
00262
00270 virtual bool inside(const TinyVector<3, real_t>& p) const = 0;
00271
00277 const Mesh::Type& type() const
00278 {
00279 return __type;
00280 }
00281
00287 const Mesh::Family& family() const
00288 {
00289 return __family;
00290 }
00291
00297 const size_t& id() const
00298 {
00299 return __meshId;
00300 }
00301
00311 inline size_t vertexNumber(const Vertex& v) const
00312 {
00313 return __verticesSet->number(v);
00314 }
00315
00321 bool hasEdges() const
00322 {
00323 return __edgesSet != 0;
00324 }
00325
00330 virtual void buildFaces() = 0;
00331
00336 virtual bool hasFaces() const = 0;
00337
00342 virtual void buildEdges() = 0;
00343
00353 inline size_t edgeNumber(const Edge& e) const
00354 {
00355 ASSERT(__edgesSet != 0);
00356 return __edgesSet->number(e);
00357 }
00358
00364 inline const size_t& numberOfVertices() const
00365 {
00366 return __verticesSet->numberOfVertices();
00367 }
00368
00375 inline void setNumberOfVertices(const size_t& size)
00376 {
00377 if (__verticesSet == 0) {
00378 __verticesSet = new VerticesSet(size);
00379 __verticesCorrespondance = new VerticesCorrespondance(size);
00380 } else {
00381 __verticesSet->setNumberOfVertices(size);
00382 __verticesCorrespondance = new VerticesCorrespondance(size);
00383 }
00384 }
00385
00391 virtual const size_t& numberOfCells() const = 0;
00392
00398 inline size_t numberOfEdges() const
00399 {
00400 ASSERT(__edgesSet != 0);
00401 return __edgesSet->numberOfEdges();
00402 }
00403
00409 inline ReferenceCounting<VerticesSet> verticesSet()
00410 {
00411 return __verticesSet;
00412 }
00413
00419 inline ConstReferenceCounting<VerticesSet> verticesSet() const
00420 {
00421 return __verticesSet;
00422 }
00423
00429 inline ReferenceCounting<VerticesCorrespondance> verticesCorrespondance()
00430 {
00431 return __verticesCorrespondance;
00432 }
00433
00439 inline ConstReferenceCounting<VerticesCorrespondance> verticesCorrespondance() const
00440 {
00441 return __verticesCorrespondance;
00442 }
00443
00451 inline const Vertex& vertex(const size_t& i) const
00452 {
00453 return (*__verticesSet)[i];
00454 }
00455
00463 inline Vertex& vertex(const size_t& i)
00464 {
00465 return (*__verticesSet)[i];
00466 }
00467
00476 inline const size_t& correspondance(const size_t& i) const
00477 {
00478 return (*__verticesCorrespondance)[i];
00479 }
00480
00488 inline const Edge&
00489 edge(const size_t& i) const
00490 {
00491 return (*__edgesSet)[i];
00492 }
00493
00501 inline Edge& edge(const size_t& i)
00502 {
00503 return (*__edgesSet)[i];
00504 }
00505
00513 Mesh(const Mesh::Type& type,
00514 const Mesh::Family& family,
00515 const size_t& numberOfVertices)
00516 : __type(type),
00517 __family(family),
00518 __meshId(Mesh::__getNextMeshId()),
00519 __verticesSet(new VerticesSet(numberOfVertices)),
00520 __verticesCorrespondance(new VerticesCorrespondance(numberOfVertices)),
00521 __edgesSet(0)
00522 {
00523 ;
00524 }
00525
00534 Mesh(const Mesh::Type& type,
00535 const Mesh::Family& family,
00536 ReferenceCounting<VerticesSet> vertices,
00537 ReferenceCounting<VerticesCorrespondance> correspondance)
00538 : __type(type),
00539 __family(family),
00540 __meshId(Mesh::__getNextMeshId()),
00541 __verticesSet(vertices),
00542 __verticesCorrespondance(correspondance),
00543 __edgesSet(0)
00544 {
00545 ;
00546 }
00547
00552 virtual ~Mesh()
00553 {
00554 ;
00555 }
00556 };
00557
00558 #endif // MESH_HPP
00559