00001 #include "orthomesh.h"
00002
00003
00004 OrthoCellAccessorWithHoles::OrthoCellAccessorWithHoles(const OrthoMesh &mesh,unsigned rawIndex)
00005 :OrthoCellAccessor(mesh,rawIndex)
00006 {
00007 _delIt = mesh._delCellLst.findLUEntry(rawIndex);
00008 _delItFcX=mesh._delFaceLst.begin();
00009 _delItFcY=_delItFcX;
00010 _delItFcZ=_delItFcX;
00011 _delItVert=mesh._delVertLst.begin();
00012 _newIndex = mesh._delCellLst.adjustI(_index,_delIt);
00013 }
00014
00015 void OrthoCellAccessorWithHoles::operator++(int)
00016 {
00017 OrthoCellAccessor &rawCell = *this;
00018 assert(rawCell.index() < _delIt->index());
00019 OrthoCellAccessor::operator++(0);
00020
00021
00022 if (rawCell.index() < _delIt->index())
00023 {
00024 _newIndex = _delIt->adjust(rawCell.index());
00025 return;
00026 }
00027 else
00028 {
00029 do {
00030 OrthoCellAccessor::operator++(0);
00031 _delIt++;
00032 } while(rawCell.index() == _delIt->index());
00033 _newIndex = _delIt->adjust(rawCell.index());
00034 }
00035 }
00036
00037
00038
00039
00040
00041
00042 unsigned OrthoCellAccessorWithHoles::vertex_index(VertexDirection3D dir)
00043 {
00044 return getMesh()._delVertLst.adjust(OrthoCellAccessor::vertex_index(dir),_delItVert);
00045 }
00046
00047
00048 unsigned OrthoCellAccessorWithHoles::neighbor_index(unsigned int dir) const
00049 {
00050 unsigned i=OrthoCellAccessor::neighbor_index(dir);
00051 if (i != OrthoMesh::invalidIndex())
00052 return _pMesh->_delCellLst.adjustI(OrthoCellAccessor::neighbor_index(dir),_delIt);
00053 else
00054 return OrthoMesh::invalidIndex();
00055 }
00056
00057
00058
00059 unsigned OrthoCellAccessorWithHoles::face_index(FaceDirection3D dir)
00060 {
00061 return _pMesh->getFaceIndexFromCell(dir,_i,_j,_k,_delItFcX,_delItFcY,_delItFcZ);
00062 }
00063
00064 unsigned OrthoCellAccessorWithHoles::face_index_up()
00065 {
00066 return _pMesh->_delFaceLst.adjust(_i + _j*_pMesh->_fzYStride + (_k +1)*_pMesh->_fzZStride + _pMesh->_fzOff,_delItFcZ);
00067 }
00068
00069 unsigned OrthoCellAccessorWithHoles::face_index_down()
00070 {
00071 return _pMesh->_delFaceLst.adjust(_i + _j*_pMesh->_fzYStride + _k*_pMesh->_fzZStride + _pMesh->_fzOff,_delItFcZ);
00072 }
00073
00074 unsigned OrthoCellAccessorWithHoles::face_index_left()
00075 {
00076 return _pMesh->_delFaceLst.adjust(_i+_j*_pMesh->_fxYStride + _k*_pMesh->_fxZStride,_delItFcX);
00077 }
00078
00079 unsigned OrthoCellAccessorWithHoles::face_index_right()
00080 {
00081 return _pMesh->_delFaceLst.adjust(_i + 1 + _j*_pMesh->_fxYStride + _k*_pMesh->_fxZStride,_delItFcX);
00082 }
00083
00084 unsigned OrthoCellAccessorWithHoles::face_index_front()
00085 {
00086 return _pMesh->_delFaceLst.adjust(_i + _j*_pMesh->_fyYStride + _k*_pMesh->_fyZStride + _pMesh->_fyOff,_delItFcY);
00087
00088 }
00089
00090 unsigned OrthoCellAccessorWithHoles::face_index_back()
00091 {
00092 return _pMesh->_delFaceLst.adjust(_i + (_j+1)*_pMesh->_fyYStride + _k*_pMesh->_fyZStride + _pMesh->_fyOff,_delItFcY);
00093 }
00094
00095
00096
00097
00098
00099 bool OrthoCellAccessorWithHoles::at_boundary()
00100 {
00101
00102 return (neighbor_index(LEFT_CELL ) == OrthoMesh::invalidIndex() ||
00103 neighbor_index(RIGHT_CELL ) == OrthoMesh::invalidIndex() ||
00104 neighbor_index(UP_CELL ) == OrthoMesh::invalidIndex() ||
00105 neighbor_index(BOTTOM_CELL) == OrthoMesh::invalidIndex() ||
00106 neighbor_index(FRONT_CELL ) == OrthoMesh::invalidIndex() ||
00107 neighbor_index(BACK_CELL ) == OrthoMesh::invalidIndex() );
00108 }
00109
00110
00111
00112
00113
00114
00115 OrthoMesh::Face_It OrthoCellAccessorWithHoles::face(FaceDirection3D dir)
00116 {
00117 OrthoFaceAccessorWithHoles faceAcc(*this,dir);
00118 return OrthoMesh::Face_It(faceAcc);
00119 }
00120
00121
00122 OrthoMesh::Cell_It OrthoCellAccessorWithHoles::neighbor(CellDirection3D dir)
00123 {
00124 OrthoCellAccessorWithHoles cell = *this;
00125 if (cell.advance(dir))
00126 return OrthoMesh::Cell_It(cell);
00127 else
00128 return _pMesh->end_cell();
00129 }
00130
00131
00132 bool OrthoCellAccessorWithHoles::advance(CellDirection3D dir)
00133 {
00134 OrthoCellAccessorWithHoles backTrack = *this;
00135 if (OrthoCellAccessor::advance(dir))
00136 {
00137
00138
00139 _newIndex=_pMesh->_delCellLst.adjustI(raw_index(),_delIt);
00140
00141
00142
00143 if (_newIndex == OrthoMesh::INVALID_INDEX)
00144 {
00145 *this=backTrack;
00146 return false;
00147 }
00148 else
00149 return true;
00150 }
00151 else
00152 {
00153 return false;
00154 }
00155 }
00156
00157
00158
00159
00160
00161
00162
00170 unsigned OrthoCellAccessorWithHoles::advance(CellDirection3D dir,unsigned stps)
00171 {
00172 unsigned i;
00173 for (i=0;i<stps;i++)
00174 {
00175 if (!this->advance(dir))
00176 {
00177 return i;
00178 }
00179 }
00180 return i;
00181 }
00182
00183
00184 unsigned OrthoCellAccessorWithHoles::index_up()
00185 {
00186 assert(this->isValid());
00187
00188 if (_k == _pMesh->_LastK)
00189 return OrthoMesh::INVALID_INDEX;
00190 else
00191 return _pMesh->_delCellLst.adjustI(_index+_pMesh->_ZStride,_delIt);
00192
00193 }
00194
00195 unsigned OrthoCellAccessorWithHoles::index_down()
00196 {
00197 assert(this->isValid());
00198 if (_k == 0)
00199 return OrthoMesh::INVALID_INDEX;
00200 else
00201 return _pMesh->_delCellLst.adjustI(_index-_pMesh->_ZStride,_delIt);
00202
00203 }
00204
00205 unsigned OrthoCellAccessorWithHoles::index_left()
00206 {
00207 assert(this->isValid());
00208 if (_i == 0)
00209 return OrthoMesh::INVALID_INDEX;
00210 else
00211 return _pMesh->_delCellLst.adjustI(_index-1,_delIt);
00212 }
00213
00214 unsigned OrthoCellAccessorWithHoles::index_right()
00215 {
00216 assert(this->isValid());
00217 if (_i == _pMesh->_LastI)
00218 return OrthoMesh::INVALID_INDEX;
00219 else
00220 return _pMesh->_delCellLst.adjustI(_index+1,_delIt);
00221
00222 }
00223
00224
00225
00226 unsigned OrthoCellAccessorWithHoles::index_front()
00227 {
00228 assert(this->isValid());
00229 if (_j == 0)
00230 return OrthoMesh::INVALID_INDEX;
00231 else
00232 return _pMesh->_delCellLst.adjustI(_index-_pMesh->_YStride,_delIt);
00233 }
00234
00235
00236
00237
00238 unsigned OrthoCellAccessorWithHoles::index_back()
00239 {
00240 assert(this->isValid());
00241 if (_j == _pMesh->_LastJ)
00242 return OrthoMesh::INVALID_INDEX;
00243 else
00244 return _pMesh->_delCellLst.adjustI(_index+_pMesh->_YStride,_delIt);
00245
00246 }