00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef CH_BOX_H
00029 #define CH_BOX_H
00030
00031 #ifdef NODEV
00032 #undef NODEV
00033 #endif
00034
00035 #include "SPACE.H"
00036
00037 #ifndef WRAPPER
00038 #include <iostream>
00039
00040
00041
00042 #include "IntVect.H"
00043 #include "Misc.H"
00044 #include "LoHiSide.H"
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 class IndexType
00059 {
00060 public:
00062
00066 enum CellIndex { CELL = 0, NODE = 1 };
00067
00069
00073 IndexType ();
00074
00076
00080 IndexType (const IndexType& rhs);
00081
00083
00087 explicit IndexType (const IntVect& iv);
00088
00090
00094 IndexType& operator= (const IndexType& rhs);
00095
00097
00103 IndexType (D_DECL(CellIndex i, CellIndex j, CellIndex k));
00104
00106
00110 void set (int dir);
00111
00113
00117 void unset (int dir);
00118
00120
00124 bool test (int dir) const;
00125
00127
00131 void setall ();
00132
00134
00138 void clear ();
00139
00141
00145 bool any () const;
00146
00148
00152 bool ok () const;
00153
00155
00160 void flip (int i);
00161
00163
00167 bool operator== (const IndexType& t) const;
00168
00170
00174 bool operator!= (const IndexType& t) const;
00175
00177
00181 bool cellCentered () const;
00182
00184
00188 bool nodeCentered () const;
00189
00191
00195 void setType (int dir,
00196 CellIndex t);
00197
00199
00203 CellIndex ixType (int dir) const;
00204
00206
00210 int operator[] (int dir) const;
00211
00213
00218 IntVect ixType () const;
00219
00221
00228 static IndexType TheCellType ();
00229
00231
00238 static IndexType TheNodeType ();
00239
00241
00245 friend std::ostream& operator<< (std::ostream& os,
00246 const IndexType& itype);
00247
00249
00253 friend std::istream& operator>> (std::istream& is,
00254 IndexType& itype);
00255 private:
00256
00257
00258
00259 static int mask (int k);
00260
00261
00262
00263 unsigned int itype;
00264 };
00265
00266
00267
00268
00269
00270
00271 inline
00272 int
00273 IndexType::mask (int k)
00274 {
00275 return 1<<k;
00276 }
00277
00278 inline
00279 IndexType::IndexType ()
00280 : itype(0)
00281 {}
00282
00283 inline
00284 IndexType::IndexType (const IndexType& bt)
00285 : itype(bt.itype)
00286 {}
00287
00288 inline
00289 IndexType& IndexType::operator= (const IndexType& bt)
00290 {
00291 itype = bt.itype;
00292 return *this;
00293 }
00294
00295 inline
00296 IndexType::IndexType (const IntVect& iv)
00297 {
00298 itype = D_TERM((iv[0]?1:0), | ((iv[1]?1:0)<<1), | ((iv[2]?1:0)<<2));
00299 }
00300
00301 inline
00302 IndexType::IndexType (D_DECL(CellIndex i, CellIndex j, CellIndex k))
00303 {
00304 itype = D_TERM(i, | (j<<1), | (k<<2));
00305 }
00306
00307 inline
00308 void
00309 IndexType::set (int dir)
00310 {
00311 itype |= mask(dir);
00312 }
00313
00314 inline
00315 void
00316 IndexType::unset (int dir)
00317 {
00318 itype &= ~mask(dir);
00319 }
00320
00321 inline
00322 bool
00323 IndexType::test (int dir) const
00324 {
00325 return (itype & mask(dir)) != 0;
00326 }
00327
00328 inline
00329 void
00330 IndexType::setall ()
00331 {
00332 itype = (1 << SpaceDim) - 1;
00333 }
00334
00335 inline
00336 void
00337 IndexType::clear ()
00338 {
00339 itype = 0;
00340 }
00341
00342 inline
00343 bool
00344 IndexType::any () const
00345 {
00346 return itype != 0;
00347 }
00348
00349 inline
00350 bool
00351 IndexType::ok () const
00352 {
00353 return itype < (1 << SpaceDim);
00354 }
00355
00356 inline
00357 void
00358 IndexType::flip (int i)
00359 {
00360 itype ^= mask(i);
00361 }
00362
00363 inline
00364 bool
00365 IndexType::operator== (const IndexType& t) const
00366 {
00367 return t.itype == itype;
00368 }
00369
00370 inline
00371 bool
00372 IndexType::operator!= (const IndexType& t) const
00373 {
00374 return t.itype != itype;
00375 }
00376
00377 inline
00378 bool
00379 IndexType::cellCentered () const
00380 {
00381 return itype == 0;
00382 }
00383
00384 inline
00385 bool
00386 IndexType::nodeCentered () const
00387 {
00388 return itype == (1<<SpaceDim)-1;
00389 }
00390
00391 inline
00392 void
00393 IndexType::setType (int dir,
00394 CellIndex t)
00395 {
00396 t == CELL ? unset(dir) : set(dir);
00397 }
00398
00399 inline
00400 IndexType::CellIndex
00401 IndexType::ixType (int dir) const
00402 {
00403 return (CellIndex) ((itype & (1<<dir)) >> dir);
00404 }
00405
00406 inline
00407 int
00408 IndexType::operator[] (int dir) const
00409 {
00410 return test(dir);
00411 }
00412
00413 inline
00414 IntVect
00415 IndexType::ixType () const
00416 {
00417 return IntVect(D_DECL(itype&1, (itype>>1)&1, (itype>>2)&1));
00418 }
00419
00420 #endif
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442 class Box
00443 {
00444 public:
00445
00447
00449
00453 Box ();
00454
00456
00460 ~Box () {;}
00461
00462
00464
00469 Box (const IntVect& small,
00470 const IntVect& big);
00471
00473
00478 void define(const IntVect& small, const IntVect& big);
00479
00481
00486 Box (const IntVect& small,
00487 const int* vec_len);
00488
00490
00497 Box (const IntVect& small,
00498 const IntVect& big,
00499 const IntVect& typ);
00500
00502
00508 Box (const IntVect& small,
00509 const IntVect& big,
00510 const IndexType& t);
00511
00513
00517 Box (const Box& b);
00518
00519 void define(const Box& b);
00520
00521 Box copy() const {return *this;}
00522
00524
00526
00530 const IntVect& smallEnd () const;
00531
00533
00537 IntVect sideEnd(Side::LoHiSide a_side) const;
00538
00539
00541
00547 int smallEnd (int dir) const;
00548
00550
00554 const IntVect& bigEnd () const;
00555
00557
00563 int bigEnd (int dir) const;
00564
00566
00572 const int* loVect () const;
00573
00575
00581 const int* hiVect () const;
00582
00584
00590 const int* getVect () const;
00591
00593
00599 long index (const IntVect& v) const;
00600
00602
00604
00608 IndexType ixType () const;
00609
00611
00615 IntVect type () const;
00616
00618
00624 IndexType::CellIndex type (int dir) const;
00625
00627
00629
00634 const IntVect& size () const;
00635
00637
00643 int size (int dir) const;
00644
00646
00650 bool numPtsOK () const;
00651
00653
00659 long numPts () const;
00660
00662
00666 bool volumeOK () const;
00667
00669
00675 long volume () const;
00676
00678
00684 int longside (int& dir) const;
00685
00687
00691 int longside () const;
00692
00694
00700 int shortside (int& dir) const;
00701
00703
00707 int shortside () const;
00708
00709
00711
00713
00717 bool isEmpty () const;
00718
00720
00726 bool contains (const IntVect& p) const;
00727
00729
00735 bool contains (const Box& b) const;
00736
00738
00744 bool intersects (const Box& b) const;
00745
00747
00755 bool intersectsNotEmpty (const Box& b) const;
00756
00758
00763 bool sameSize (const Box& b) const;
00764
00766
00770 bool sameType (const Box &b) const;
00771
00773
00778 bool operator== (const Box& b) const;
00779
00780 bool eq(const Box& b) const;
00782
00786 bool operator!= (const Box& b) const;
00787
00788 bool neq(const Box& b) const;
00790
00795 bool cellCentered () const;
00796
00797
00799
00807 bool operator < (const Box& rhs) const;
00808
00809 bool lt(const Box& rhs) const;
00810
00811
00813
00815
00819 Box& operator= (const Box& b);
00820
00822
00828 Box& setSmall (const IntVect& sm);
00829
00831
00838 Box& setSmall (int dir,
00839 int sm_index);
00840
00842
00848 Box& setBig (const IntVect& bg);
00849
00851
00858 Box& setBig (int dir,
00859 int bg_index);
00860
00862
00867 Box& setRange (int dir,
00868 int sm_index,
00869 int n_cells = 1);
00870
00872
00874
00885 Box& convert (IndexType typ);
00886
00888
00897 Box& convert (const IntVect& typ);
00898
00900
00912 Box& convert (int dir,
00913 IndexType::CellIndex typ);
00914
00916
00923 Box& surroundingNodes ();
00924
00926
00934 Box& surroundingNodes (int dir);
00935
00936 Box& surroundingNodes_int(int dir);
00938
00947 friend Box surroundingNodes (const Box& b,
00948 int dir);
00949
00950
00952
00960 friend Box surroundingNodes (const Box& b);
00961
00963
00970 Box& enclosedCells ();
00971
00973
00981 Box& enclosedCells (int dir);
00982
00983 Box& enclosedCells_int (int dir);
00984
00986
00995 friend Box enclosedCells (const Box& b,
00996 int dir);
00997
00999
01007 friend Box enclosedCells (const Box& b);
01008
01010
01012
01019 Box& shift (int dir,
01020 int nzones);
01021
01023
01029 Box& shift (const IntVect& iv);
01030
01031 Box& shift_intvect (const IntVect& iv);
01032
01034
01046 Box& shiftHalf (int dir,
01047 int num_halfs);
01048
01050
01056 Box& shiftHalf (const IntVect& iv);
01057 Box& shiftHalf_intvect (const IntVect& iv);
01058
01060
01065 Box& operator+= (const IntVect& v);
01066
01068
01073 Box operator+ (const IntVect& v) const;
01074
01076
01081 Box& operator-= (const IntVect& v);
01082
01084
01089 Box operator- (const IntVect& v) const;
01090
01092
01094 friend Box bdryBox(const Box& b,
01095 int dir,
01096 Side::LoHiSide a_sd,
01097 int len);
01098
01099
01101
01109 friend Box bdryLo (const Box& b,
01110 int dir,
01111 int len);
01112
01114
01122 friend Box bdryHi (const Box& b,
01123 int dir,
01124 int len);
01125
01127
01150 friend Box adjCellLo (const Box& b,
01151 int dir,
01152 int len);
01153
01155
01178 friend Box adjCellHi (const Box& b,
01179 int dir,
01180 int len);
01181
01182
01184
01186
01193 Box operator& (const Box&) const;
01194
01196
01202 Box& operator&= (const Box&);
01203
01204
01206 friend Box adjCellBox (const Box& b,
01207 int dir,
01208 Side::LoHiSide a_side,
01209 int len);
01211
01216 Box& minBox (const Box& b);
01217
01219
01224 friend Box minBox (const Box& b1,
01225 const Box& b2);
01226
01228
01230
01238 Box& grow (int i);
01239
01241
01249 friend Box grow (const Box& b,
01250 int i);
01251
01253
01261 Box& grow (const IntVect& v);
01262
01264
01272 friend Box grow (const Box& b,
01273 const IntVect& v);
01274
01276
01285 Box& grow (int idir,
01286 int n_cell);
01287
01289
01298 Box& growLo (int idir,
01299 int n_cell=1);
01300
01302
01306 Box& growDir (int a_idir,
01307 const Side::LoHiSide& a_sd,
01308 int a_cell);
01309
01311
01320 Box& growHi (int idir,
01321 int n_cell=1);
01322
01324
01326
01337 Box& refine (int refinement_ratio);
01338
01340
01352 friend Box refine (const Box& b,
01353 int refinement_ratio);
01354
01356
01367 Box& refine (const IntVect& refinement_ratio);
01368
01370
01382 friend Box refine (const Box& b,
01383 const IntVect& refinement_ratio);
01384
01386
01388
01403 Box& coarsen (int refinement_ratio);
01404
01406
01421 friend Box coarsen (const Box& b,
01422 int refinement_ratio);
01423
01425
01439 Box& coarsen (const IntVect& refinement_ratio);
01440
01442
01457 friend Box coarsen (const Box& b,
01458 const IntVect& refinement_ratio);
01459
01460
01461
01462
01463
01464
01465 void next (IntVect &) const;
01466
01467
01468
01469
01470
01471
01472 void next (IntVect& p,
01473 const int* shv) const;
01474
01475
01477
01479
01492 Box chop (int dir,
01493 int chop_pnt);
01494
01496
01498
01502 friend std::ostream& operator<< (std::ostream& os,
01503 const Box& bx);
01504
01506
01510 friend std::istream& operator>> (std::istream& os,
01511 Box& bx);
01512
01513
01515
01518 void p() const;
01519
01521
01526 void dumpOn (std::ostream& strm) const;
01527
01529
01531
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550 void computeBoxLen ();
01551 void computeBoxLenNotEmpty();
01552
01553 protected:
01554 friend class HDF5Handle;
01555
01556
01557
01558 bool numPtsOK (long& N) const;
01559
01560
01561
01562 bool volumeOK (long& N) const;
01563
01564 IntVect smallend;
01565 IntVect bigend;
01566 IntVect len;
01567 IndexType btype;
01568
01569 };
01570
01571
01572 Box surroundingNodes (const Box& b,
01573 int dir);
01574 Box surroundingNodes (const Box& b);
01575 Box enclosedCells (const Box& b,
01576 int dir);
01577 Box enclosedCells (const Box& b);
01578 Box bdryBox(const Box& b,
01579 int dir,
01580 Side::LoHiSide a_sd,
01581 int len=1);
01582 Box bdryLo (const Box& b,
01583 int dir,
01584 int len=1);
01585 Box bdryHi (const Box& b,
01586 int dir,
01587 int len=1);
01588 Box adjCellLo (const Box& b,
01589 int dir,
01590 int len=1);
01591 Box adjCellHi (const Box& b,
01592 int dir,
01593 int len=1);
01594 Box minBox (const Box& b1,
01595 const Box& b2);
01596
01597
01598
01599
01600 #ifndef WRAPPER
01601
01602 inline
01603 Box::Box (const Box& b)
01604 : smallend(b.smallend),
01605 bigend(b.bigend),
01606 btype(b.btype)
01607 {
01608 D_EXPR(len[0] = b.len[0],
01609 len[1] = b.len[1],
01610 len[2] = b.len[2]);
01611 }
01612
01613 inline
01614 Box&
01615 Box::operator= (const Box& b)
01616 {
01617 smallend = b.smallend;
01618 bigend = b.bigend;
01619 btype = b.btype;
01620 D_EXPR(len[0] = b.len[0],
01621 len[1] = b.len[1],
01622 len[2] = b.len[2]);
01623 return *this;
01624 }
01625
01626 inline
01627 IntVect
01628 Box::sideEnd(Side::LoHiSide a_side) const
01629 {
01630 IntVect retval;
01631 if(a_side == Side::Lo)
01632 retval = smallEnd();
01633 else
01634 retval = bigEnd();
01635 return retval;
01636 }
01637
01638 inline
01639 const IntVect&
01640 Box::smallEnd () const
01641 {
01642 return smallend;
01643 }
01644
01645 inline
01646 int
01647 Box::smallEnd (int dir) const
01648 {
01649 return smallend[dir];
01650 }
01651
01652 inline
01653 const IntVect&
01654 Box::bigEnd () const
01655 {
01656 return bigend;
01657 }
01658
01659 inline
01660 int
01661 Box::bigEnd (int dir) const
01662 {
01663 return bigend[dir];
01664 }
01665
01666 inline
01667 IndexType
01668 Box::ixType () const
01669 {
01670 return btype;
01671 }
01672
01673 inline
01674 IntVect
01675 Box::type () const
01676 {
01677 return btype.ixType();
01678 }
01679
01680 inline
01681 IndexType::CellIndex
01682 Box::type (int dir) const
01683 {
01684 return btype.ixType(dir);
01685 }
01686
01687 inline
01688 const IntVect&
01689 Box::size () const
01690 {
01691 return len;
01692 }
01693
01694 inline
01695 int
01696 Box::size (int dir) const
01697 {
01698 return len[dir];
01699 }
01700
01701 inline
01702 const int*
01703 Box::loVect () const
01704 {
01705 return smallend.getVect();
01706 }
01707
01708 inline
01709 const int*
01710 Box::hiVect () const
01711 {
01712 return bigend.getVect();
01713 }
01714
01715 inline
01716 const int*
01717 Box::getVect () const
01718 {
01719 return smallend.getVect();
01720 }
01721
01722
01723 inline
01724 bool
01725 Box::numPtsOK () const
01726 {
01727 long ignore;
01728 return numPtsOK(ignore);
01729 }
01730
01731 inline
01732 bool
01733 Box::isEmpty () const
01734 {
01735
01736 return (!(bigend >= smallend));
01737 }
01738
01739 inline
01740 bool
01741 Box::contains (const IntVect& p) const
01742 {
01743
01744 return ( !isEmpty() && (p >= smallend && p <= bigend) );
01745 }
01746
01747 inline
01748 bool
01749 Box::sameType (const Box &b) const
01750 {
01751 return btype == b.btype;
01752 }
01753
01754 inline
01755 bool
01756 Box::contains (const Box& b) const
01757 {
01758 assert(sameType(b));
01759 return ( !isEmpty() && !b.isEmpty() &&
01760 (b.smallend >= smallend && b.bigend <= bigend) );
01761 }
01762
01763 inline
01764 bool
01765 Box::sameSize (const Box& b) const
01766 {
01767 assert(sameType(b));
01768 return D_TERM(len[0] == b.len[0],
01769 && len[1]==b.len[1],
01770 && len[2]==b.len[2]);
01771 }
01772
01773 inline
01774 bool
01775 Box::operator== (const Box& b) const
01776 {
01777 return smallend == b.smallend && bigend == b.bigend && b.btype == btype;
01778 }
01779
01780 inline
01781 bool
01782 Box::operator!= (const Box& b) const
01783 {
01784 return !operator==(b);
01785 }
01786
01787 inline
01788 bool
01789 Box::cellCentered () const
01790 {
01791 return !btype.any();
01792 }
01793
01794 inline
01795 bool
01796 Box::volumeOK () const
01797 {
01798 return numPtsOK();
01799 }
01800
01801 inline
01802 long
01803 Box::index (const IntVect& v) const
01804 {
01805 long result = v.vect[0]-smallend.vect[0];
01806 #if CH_SPACEDIM==2
01807 result += len[0]*(v.vect[1]-smallend.vect[1]);
01808 #elif CH_SPACEDIM==3
01809 result += len[0]*(v.vect[1]-smallend.vect[1]
01810 +(v.vect[2]-smallend.vect[2])*len[1]);
01811 #endif
01812 return result;
01813 }
01814
01815 inline
01816 void
01817 Box::computeBoxLen ()
01818 {
01819 if (isEmpty())
01820 {
01821 len = IntVect::Zero;
01822 }
01823 else
01824 {
01825 D_EXPR(len[0] = bigend[0]-smallend[0] + 1,
01826 len[1] = bigend[1]-smallend[1] + 1,
01827 len[2] = bigend[2]-smallend[2] + 1);
01828 }
01829 }
01830
01831 inline
01832 void
01833 Box::computeBoxLenNotEmpty()
01834 {
01835 D_EXPR(len[0] = bigend[0]-smallend[0] + 1,
01836 len[1] = bigend[1]-smallend[1] + 1,
01837 len[2] = bigend[2]-smallend[2] + 1);
01838 }
01839
01840 inline
01841 Box&
01842 Box::setSmall (const IntVect& sm)
01843 {
01844 assert (sm <= bigend);
01845
01846 smallend = sm;
01847 computeBoxLen();
01848 return *this;
01849 }
01850
01851 inline
01852 Box&
01853 Box::setSmall (int dir,
01854 int sm_index)
01855 {
01856 assert (sm_index <= bigend[dir]);
01857
01858 smallend.setVal(dir,sm_index);
01859 computeBoxLen();
01860 return *this;
01861 }
01862
01863 inline
01864 Box&
01865 Box::setBig (const IntVect& bg)
01866 {
01867 assert (bg >= smallend);
01868
01869 bigend = bg;
01870 computeBoxLen();
01871 return *this;
01872 }
01873
01874 inline
01875 Box&
01876 Box::setBig (int dir,
01877 int bg_index)
01878 {
01879 assert (bg_index >= smallend[dir]);
01880
01881 bigend.setVal(dir,bg_index);
01882 computeBoxLen();
01883 return *this;
01884 }
01885
01886 inline
01887 Box&
01888 Box::setRange (int dir,
01889 int sm_index,
01890 int n_cells)
01891 {
01892 assert (n_cells > 0);
01893
01894 smallend.setVal(dir,sm_index);
01895 bigend.setVal(dir,sm_index+n_cells-1);
01896 computeBoxLen();
01897 return *this;
01898 }
01899
01900 inline
01901 Box&
01902 Box::shift (int dir,
01903 int nzones)
01904 {
01905 if (!isEmpty())
01906 {
01907 smallend.shift(dir,nzones);
01908 bigend.shift(dir,nzones);
01909 }
01910 return *this;
01911 }
01912
01913 inline
01914 Box&
01915 Box::shift (const IntVect& iv)
01916 {
01917 if (!isEmpty())
01918 {
01919 smallend.shift(iv);
01920 bigend.shift(iv);
01921 }
01922 return *this;
01923 }
01924
01925 inline
01926 Box&
01927 Box::convert (const IntVect& typ)
01928 {
01929 assert(typ >= IntVect::TheZeroVector() && typ <= IntVect::TheUnitVector());
01930 if (!isEmpty())
01931 {
01932 IntVect shft(typ - btype.ixType());
01933 bigend += shft;
01934 }
01935 btype = IndexType(typ);
01936 computeBoxLen();
01937 return *this;
01938 }
01939
01940 inline
01941 Box&
01942 Box::surroundingNodes (int dir)
01943 {
01944 if (!(btype[dir]))
01945 {
01946 if (!isEmpty())
01947 {
01948 bigend.shift(dir,1);
01949 }
01950
01951
01952
01953 btype.set(dir);
01954 computeBoxLen();
01955 }
01956 return *this;
01957 }
01958
01959 inline
01960 Box&
01961 Box::enclosedCells (int dir)
01962 {
01963 if (btype[dir])
01964 {
01965 if (!isEmpty())
01966 {
01967 bigend.shift(dir,-1);
01968 }
01969
01970
01971
01972 btype.unset(dir);
01973 computeBoxLen();
01974 }
01975 return *this;
01976 }
01977
01978 inline
01979 Box
01980 surroundingNodes (const Box& b,
01981 int dir)
01982 {
01983 Box bx(b);
01984 return bx.surroundingNodes(dir);
01985 }
01986
01987 inline
01988 Box
01989 surroundingNodes (const Box& b)
01990 {
01991 Box bx(b);
01992 return bx.surroundingNodes();
01993 }
01994
01995 inline
01996 Box
01997 enclosedCells (const Box& b,
01998 int dir)
01999 {
02000 Box bx(b);
02001 return bx.enclosedCells(dir);
02002 }
02003
02004 inline
02005 Box
02006 enclosedCells (const Box& b)
02007 {
02008 Box bx(b);
02009 return bx.enclosedCells();
02010 }
02011
02012 inline
02013 Box&
02014 Box::operator+= (const IntVect& v)
02015 {
02016 if (!isEmpty())
02017 {
02018 smallend += v;
02019 bigend += v;
02020 }
02021 return *this;
02022 }
02023
02024 inline
02025 Box
02026 Box::operator+ (const IntVect& v) const
02027 {
02028 if (isEmpty())
02029 {
02030 return(Box().convert(btype));
02031 }
02032 else
02033 {
02034 IntVect small(smallend);
02035 small += v;
02036 IntVect big(bigend);
02037 big += v;
02038 return Box(small,big,btype);
02039 }
02040 }
02041
02042 inline
02043 Box&
02044 Box::operator-= (const IntVect& v)
02045 {
02046 if (!isEmpty())
02047 {
02048 smallend -= v;
02049 bigend -= v;
02050 }
02051 return *this;
02052 }
02053
02054 inline
02055 bool
02056 Box::operator < (const Box& rhs) const
02057 {
02058 return(!isEmpty() && (rhs.isEmpty() || smallend.lexLT(rhs.smallend)));
02059 }
02060
02061 inline
02062 Box
02063 Box::operator- (const IntVect& v) const
02064 {
02065 if (isEmpty())
02066 {
02067 return(Box().convert(btype));
02068 }
02069 else
02070 {
02071 IntVect small = smallend;
02072 small -= v;
02073 IntVect big = bigend;
02074 big -= v;
02075 return Box(small,big,btype);
02076 }
02077 }
02078
02079 inline
02080 Box&
02081 Box::grow (int i)
02082 {
02083 if (!isEmpty())
02084 {
02085 smallend.diagShift(-i);
02086 bigend.diagShift(i);
02087 if (!(bigend >= smallend)) *this = Box().convert(btype);
02088 computeBoxLen();
02089 }
02090 return *this;
02091 }
02092
02093 inline
02094 Box
02095 grow (const Box& b,
02096 int i)
02097 {
02098 if (b.isEmpty())
02099 {
02100 return (Box().convert(b.btype));
02101 }
02102 else
02103 {
02104 IntVect small = diagShift(b.smallend,-i);
02105 IntVect big = diagShift(b.bigend,i);
02106 if (!(big >= small))
02107 {
02108 return(Box().convert(b.btype));
02109 }
02110 else
02111 {
02112 return Box(small,big,b.btype);
02113 }
02114 }
02115 }
02116
02117 inline
02118 Box&
02119 Box::grow (const IntVect& v)
02120 {
02121 if (!isEmpty())
02122 {
02123 smallend -= v;
02124 bigend += v;
02125 if (!(bigend >= smallend)) *this = Box().convert(btype);
02126 computeBoxLen();
02127 }
02128 return *this;
02129 }
02130
02131 inline
02132 Box
02133 grow (const Box& b,
02134 const IntVect& v)
02135 {
02136 if (b.isEmpty())
02137 {
02138 return(Box().convert(b.btype));
02139 }
02140 else
02141 {
02142 IntVect small = b.smallend - v;
02143 IntVect big = b.bigend + v;
02144 if (!(big >= small))
02145 {
02146 return(Box().convert(b.btype));
02147 }
02148 else
02149 {
02150 return Box(small,big,b.btype);
02151 }
02152 }
02153 }
02154
02155 inline
02156 Box&
02157 Box::grow (int idir,
02158 int n_cell)
02159 {
02160 if (!isEmpty())
02161 {
02162 smallend.shift(idir, -n_cell);
02163 bigend.shift(idir, n_cell);
02164 if (!(bigend >= smallend)) *this = Box().convert(btype);
02165 computeBoxLen();
02166 }
02167 return *this;
02168 }
02169
02170 inline
02171 Box&
02172 Box::growLo (int idir,
02173 int n_cell)
02174 {
02175 if (!isEmpty())
02176 {
02177 smallend.shift(idir, -n_cell);
02178 if (!(bigend >= smallend)) *this = Box().convert(btype);
02179 computeBoxLen();
02180 }
02181 return *this;
02182 }
02183
02184 inline
02185 Box&
02186 Box::growDir (int idir,
02187 const Side::LoHiSide& a_sd,
02188 int n_cell)
02189 {
02190 if(a_sd == Side::Lo)
02191 {
02192 growLo(idir, n_cell);
02193 }
02194 else
02195 {
02196 growHi(idir, n_cell);
02197 }
02198 return *this;
02199 }
02200
02201 inline
02202 Box&
02203 Box::growHi (int idir,
02204 int n_cell)
02205 {
02206 if (!isEmpty())
02207 {
02208 bigend.shift(idir,n_cell);
02209 if (!(bigend >= smallend)) *this = Box().convert(btype);
02210 computeBoxLen();
02211 }
02212 return *this;
02213 }
02214
02215
02216 inline
02217 Box
02218 Box::operator& (const Box& rhs) const
02219 {
02220 Box lhs(*this);
02221 return lhs &= rhs;
02222 }
02223
02224 #endif
02225
02226 #endif