00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _DENSEINTVECTSET_H_
00012 #define _DENSEINTVECTSET_H_
00013
00014 #include "BitSet.H"
00015 #include "IntVect.H"
00016 #include "Box.H"
00017 #include "Vector.H"
00018 #include "ProblemDomain.H"
00019 #include "NamespaceHeader.H"
00020
00021 class ProblemDomain;
00022 class DenseIntVectSetIterator;
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 class DenseIntVectSet
00038 {
00039 public:
00040
00041 DenseIntVectSet()
00042 {}
00043
00044
00045
00046 DenseIntVectSet(const Box& a_domain, bool init = true);
00047
00048
00049
00050
00051
00052
00053 DenseIntVectSet& operator-=(const Box& box);
00054
00055
00056
00057
00058
00059 DenseIntVectSet& operator-=(const IntVect& intvect);
00060
00061
00062
00063
00064
00065 DenseIntVectSet& operator-=(const DenseIntVectSet& ivs);
00066
00067
00068
00069
00070
00071 DenseIntVectSet& operator&=(const Box& box);
00072
00073
00074
00075
00076
00077 DenseIntVectSet& operator&=(const ProblemDomain& domain);
00078
00079
00080
00081
00082
00083
00084
00085 DenseIntVectSet& operator|=(const IntVect& intvect);
00086
00087
00088
00089
00090
00091
00092
00093 DenseIntVectSet& operator|=(const Box& b);
00094
00095
00096
00097
00098
00099
00100
00101 DenseIntVectSet& operator|=(const DenseIntVectSet& b);
00102
00103
00104
00105
00106
00107 DenseIntVectSet& operator&=(const DenseIntVectSet& ivs);
00108
00109
00110
00111
00112
00113 void shift(const IntVect& iv);
00114
00115
00116
00117
00118
00119
00120 bool operator[](const IntVect& index) const;
00121
00122
00123
00124
00125 bool contains(const Box& box) const;
00126
00127
00128
00129
00130
00131 void coarsen(int iref);
00132
00133
00134
00135
00136
00137 void refine(int iref);
00138
00139
00140
00141
00142
00143 void grow(int igrow);
00144
00145
00146
00147
00148
00149 void grow(int idir, int igrow);
00150
00151
00152
00153
00154
00155 void growHi();
00156
00157
00158
00159
00160
00161 void growHi(const int a_dir);
00162
00163
00164
00165
00166
00167 void makeEmptyBits();
00168
00169
00170
00171
00172
00173
00174
00175 DenseIntVectSet chop(int dir, int chop_pnt);
00176
00177 inline const Box& box() const;
00178
00179
00180
00181
00182 void nestingRegion(int a_radius, const Box& a_domain);
00183
00184
00185
00186 void nestingRegion(int a_radius, const ProblemDomain& a_domain);
00187
00188
00189
00190
00191
00192 bool isEmpty() const;
00193
00194
00195
00196
00197
00198 bool isFull() const;
00199
00200
00201
00202
00203
00204 bool isHighEmpty() const;
00205
00206
00207
00208
00209
00210 bool isHighEmpty(const int a_dir) const;
00211
00212
00213
00214
00215
00216 int numPts() const;
00217
00218
00219 bool operator==(const DenseIntVectSet& a_lhs) const;
00220
00221
00222
00223
00224
00225 bool operator<(const DenseIntVectSet& a_ivs) const;
00226
00227
00228
00229
00230
00231 Vector<Box> createBoxes() const;
00232
00233
00234
00235
00236
00237 void compact() const ;
00238
00239 void recalcMinBox() const;
00240
00241 const Box& mBox() const
00242 {
00243 return m_minBox;
00244 }
00245
00246
00247
00248 int linearSize() const;
00249
00250 void linearIn(const void* const inBuf);
00251
00252 void linearOut(void* const a_outBuf) const;
00253
00254
00255 private:
00256
00257 void grow(const IntVect& iv);
00258
00259 DenseIntVectSet& intersect(const DenseIntVectSet& rhs);
00260 bool isHighEmpty(const int a_dirS, const int a_dirE) const;
00261
00262 Box m_domain;
00263 BitSet m_bits;
00264 friend class DenseIntVectSetIterator;
00265 Box m_minBox;
00266 };
00267
00268
00269
00270
00271
00272 class DenseIntVectSetIterator
00273 {
00274 public:
00275
00276
00277 DenseIntVectSetIterator();
00278
00279
00280 DenseIntVectSetIterator(const DenseIntVectSet& ivs);
00281
00282
00283
00284
00285 void define(const DenseIntVectSet& ivs);
00286
00287
00288 const IntVect& operator()() const;
00289
00290
00291 bool ok() const;
00292
00293
00294 void operator++();
00295
00296
00297 void begin();
00298
00299
00300 void end();
00301
00302 static DenseIntVectSet emptyDenseIntVectSet;
00303
00304 private:
00305
00306
00307 void thisIntVect(const int a_linearPos);
00308
00309
00310 void setStride();
00311
00312 BitSetTrueIterator m_iterator;
00313 const DenseIntVectSet* m_ivsPtr;
00314 IntVect m_current;
00315 IntVect m_stride;
00316 int m_prevLinearPos;
00317 };
00318
00319
00320
00321
00322
00323 inline
00324 const Box& DenseIntVectSet::box() const
00325 {
00326 return m_domain;
00327 }
00328
00329 inline
00330 DenseIntVectSet& DenseIntVectSet::operator-=(const IntVect& intvect)
00331 {
00332 if (m_domain.contains(intvect))
00333 m_bits.setFalse(m_domain.index(intvect));
00334 return *this;
00335 }
00336
00337 inline void DenseIntVectSet::shift(const IntVect& iv)
00338 {
00339 m_domain.shift(iv);
00340 m_minBox.shift(iv);
00341 }
00342
00343
00344
00345
00346 inline
00347 DenseIntVectSetIterator::DenseIntVectSetIterator()
00348 :
00349 m_ivsPtr(0),
00350
00351 m_stride(IntVect::Unit),
00352 m_prevLinearPos(-2)
00353 {
00354 }
00355
00356
00357
00358
00359 inline
00360 DenseIntVectSetIterator::DenseIntVectSetIterator(const DenseIntVectSet& ivs)
00361 :
00362 m_iterator(ivs.m_bits),
00363 m_ivsPtr(&ivs),
00364
00365 m_stride(IntVect::Unit),
00366 m_prevLinearPos(-2)
00367 {
00368 if (ok())
00369 {
00370 setStride();
00371 thisIntVect(m_iterator());
00372 }
00373 }
00374
00375 inline void
00376 DenseIntVectSetIterator::define(const DenseIntVectSet& ivs)
00377 {
00378 m_iterator.define(ivs.m_bits);
00379 m_ivsPtr = &ivs;
00380 m_prevLinearPos = -2;
00381 if (ok())
00382 {
00383 setStride();
00384 thisIntVect(m_iterator());
00385 }
00386 }
00387
00388 inline const IntVect&
00389 DenseIntVectSetIterator::operator()() const
00390 {
00391 return m_current;
00392 }
00393
00394 inline bool
00395 DenseIntVectSetIterator::ok() const
00396 {
00397 return m_iterator.ok();
00398 }
00399
00400 inline void
00401 DenseIntVectSetIterator::operator++()
00402 {
00403 CH_assert(m_ivsPtr != 0);
00404 ++m_iterator;
00405 thisIntVect(m_iterator());
00406 }
00407
00408 inline void
00409 DenseIntVectSetIterator::begin()
00410 {
00411 m_iterator.begin();
00412 m_prevLinearPos = -2;
00413 if (ok())
00414 {
00415 thisIntVect(m_iterator());
00416 }
00417 }
00418
00419 inline void
00420 DenseIntVectSetIterator::end()
00421 {
00422 m_iterator.end();
00423 }
00424
00425 inline void
00426 DenseIntVectSetIterator::setStride()
00427 {
00428 D_TERM6(
00429 m_stride[0] = 1;,
00430 m_stride[1] = std::max(1, m_stride[0]*m_ivsPtr->m_domain.size(0));,
00431 m_stride[2] = std::max(1, m_stride[1]*m_ivsPtr->m_domain.size(1));,
00432 m_stride[3] = std::max(1, m_stride[2]*m_ivsPtr->m_domain.size(2));,
00433 m_stride[4] = std::max(1, m_stride[3]*m_ivsPtr->m_domain.size(3));,
00434 m_stride[5] = std::max(1, m_stride[4]*m_ivsPtr->m_domain.size(4));)
00435 }
00436
00437 #include "NamespaceFooter.H"
00438 #endif