00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _MBTOPOLOGYIJK_H
00024 #define _MBTOPOLOGYIJK_H
00025
00026 #ifdef _WIN32
00027 #pragma warning(push)
00028 #pragma warning(disable:4250)
00029 #pragma warning(disable:4251)
00030 #endif
00031
00032 #include <MeshVizXLM/mesh/topology/MiTopologyIjk.h>
00033 #include <topology/MbTopology.h>
00034 #include <MbIjkToI.h>
00035
00036 #ifndef MBMESH_DONT_USE_ASSERT
00037 #include <Inventor/STL/cassert>
00038 #endif
00039
00040
00050 template <MiMeshIjk::StorageLayout layout = MiMeshIjk::LAYOUT_KJI>
00051 class MbTopologyIjk : public MiTopologyIjk, public MbTopology, protected MbIjkToI<layout>
00052 {
00053 public:
00055 MbTopologyIjk(size_t numCellI, size_t numCellJ, size_t numCellK)
00056 : MiTopologyIjk()
00057 , MbTopology()
00058 , MbIjkToI<layout>(numCellI,numCellJ,numCellK)
00059 , m_numI(numCellI)
00060 , m_numJ(numCellJ)
00061 , m_numK(numCellK)
00062 , m_hasDeadCells(false)
00063 {
00064 #ifndef MBMESH_DONT_USE_STL
00065 m_deadCells.resize(numCellI*m_numJ*numCellK, false);
00066 #else
00067 size_t numCells = numCellI*m_numJ*numCellK;
00068 m_deadCells = new bool[numCellI*m_numJ*numCellK];
00069 for (size_t i = 0; i < numCells; ++i)
00070 m_deadCells[i] = false;
00071 #endif
00072 }
00073
00077 virtual size_t getNumCellsI() const { return m_numI; }
00078
00082 virtual size_t getNumCellsJ() const { return m_numJ; }
00083
00087 virtual size_t getNumCellsK() const { return m_numK; }
00088
00092 virtual bool hasDeadCells() const { return m_hasDeadCells;}
00093
00100 virtual bool isDead(size_t i, size_t j, size_t k) const;
00101
00105 void setDeadFlag(size_t i, size_t j, size_t k, bool isDead=true);
00106
00107 private:
00108 size_t m_numI;
00109 size_t m_numJ;
00110 size_t m_numK;
00111 bool m_hasDeadCells;
00112
00113 };
00114
00115
00116 template <MiMeshIjk::StorageLayout layout>
00117 inline bool
00118 MbTopologyIjk<layout>::isDead(size_t i, size_t j, size_t k) const
00119 {
00120 #ifndef MBMESH_DONT_USE_ASSERT
00121 assert(i<m_numI && j<m_numJ && k<m_numK);
00122 #endif
00123 return m_deadCells[this->getI(i,j,k)];
00124 }
00125
00126
00127
00128 template <MiMeshIjk::StorageLayout layout>
00129 inline void
00130 MbTopologyIjk<layout>::setDeadFlag(size_t i, size_t j, size_t k, bool isDead)
00131 {
00132 if (i<m_numI && j<m_numJ && k<m_numK)
00133 {
00134 m_deadCells[this->getI(i,j,k)] = isDead;
00135 m_hasDeadCells |= isDead;
00136 m_timeStamp = MxTimeStamp::getTimeStamp();
00137 }
00138 }
00139
00140 #ifdef _WIN32
00141 #pragma warning(pop)
00142 #endif
00143
00144 #endif
00145
00146
00147