00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _INTVECT_H_
00012 #define _INTVECT_H_
00013
00014 #include <cstddef>
00015 #include <cstdlib>
00016 #include <cstring>
00017 #include <iostream>
00018 #include "SPACE.H"
00019 #include "Vector.H"
00020 #include "Misc.H"
00021
00022 namespace BLfacade
00023 {
00024 class IntVect;
00025 }
00026
00027 #include "NamespaceHeader.H"
00028
00029 template<typename T, int n>
00030 class IndexTM;
00031
00032 class HDF5Handle;
00033
00035
00043 class IntVect
00044 {
00045 public:
00046
00051
00053
00056 IntVect()
00057 {}
00058
00059 explicit IntVect( const Vector<int>& vi) { D_EXPR6(vect[0]=vi[0], vect[1]=vi[1], vect[2] = vi[2],
00060 vect[3]=vi[3], vect[4]=vi[4], vect[5] = vi[5]); }
00061
00063
00066 ~IntVect()
00067 {}
00068
00070
00075 IntVect (D_DECL6(int i, int j, int k,
00076 int l, int m, int n));
00077
00079
00083 explicit IntVect (const int* a);
00084
00086
00089 IntVect (const IntVect& rhs);
00090
00091 IntVect (const IndexTM<int, CH_SPACEDIM>& a_tm);
00092
00093 IntVect copy() const {return *this;}
00095
00098 IntVect& operator= (const IntVect& rhs);
00099
00101
00105 inline
00106 int& operator[] (int i);
00107
00109
00112 inline
00113 int operator[] (int i) const;
00114
00116
00119 void setVal (int i,
00120 int val);
00121
00128
00130
00134 const int* getVect () const;
00135
00137
00140 const int* dataPtr() const;
00141
00143
00146 int* dataPtr();
00147
00154
00156
00160 bool operator== (const IntVect& p) const;
00161
00163
00167 bool operator!= (const IntVect& p) const;
00168
00170
00177 bool operator< (const IntVect& p) const;
00178
00180
00187 bool operator<= (const IntVect& p) const;
00188
00190
00197 bool operator> (const IntVect& p) const;
00198
00200
00208 bool operator>= (const IntVect& p) const;
00209
00211
00224 bool lexLT (const IntVect& s) const;
00225
00227
00240 bool lexGT (const IntVect& s) const;
00241
00248
00250
00253 IntVect operator+ () const;
00254
00256
00259 IntVect operator- () const;
00260
00262
00265 int sum () const;
00266
00268
00271 int product () const;
00272
00279
00281
00284 IntVect& operator+= (int s);
00285
00287
00290 IntVect& operator+= (const IntVect& p);
00291
00293
00296 IntVect operator+ (const IntVect& p) const;
00297
00299
00303 IntVect operator+ (int s) const;
00304
00306
00310 friend inline IntVect operator+ (int s,
00311 const IntVect& p);
00312
00319
00321
00325 IntVect& operator-= (int s);
00326
00328
00331 IntVect& operator-= (const IntVect& p);
00332
00334
00338 IntVect operator- (const IntVect& p) const;
00339
00341
00345 IntVect operator- (int s) const;
00346
00348
00351 friend inline IntVect operator- (int s,
00352 const IntVect& p);
00353
00360
00362
00366 IntVect& operator*= (int s);
00367
00369
00372 IntVect& operator*= (const IntVect& p);
00373
00375
00378 IntVect operator* (const IntVect& p) const;
00379
00381
00385 IntVect operator* (int s) const;
00386
00388
00392 friend inline IntVect operator* (int s,
00393 const IntVect& p);
00394
00401
00403
00406 IntVect& operator/= (int s);
00407
00409
00413 IntVect& operator/= (const IntVect& p);
00414
00416
00419 IntVect operator/ (const IntVect& p) const;
00420
00422
00426 IntVect operator/ (int s) const;
00427
00434
00436
00440 IntVect& min (const IntVect& p);
00441
00443
00447 friend inline IntVect min (const IntVect& p1,
00448 const IntVect& p2);
00449
00451
00455 IntVect& max (const IntVect& p);
00456
00458
00462 friend inline IntVect max (const IntVect& p1,
00463 const IntVect& p2);
00464
00466
00469 IntVect& scale (int s);
00470
00472
00476 friend inline IntVect scale (const IntVect& p,
00477 int s);
00478
00480
00485 IntVect& reflect (int ref_ix,
00486 int idir);
00487
00489
00494 friend inline IntVect reflect(const IntVect& a,
00495 int ref_ix,
00496 int idir);
00497
00499
00503 IntVect& shift (int coord,
00504 int s);
00505
00507
00511 IntVect& shift (const IntVect& iv);
00512
00514
00518 IntVect& diagShift (int s);
00519
00521
00525 friend inline IntVect diagShift (const IntVect& p,
00526 int s);
00527
00529
00532 IntVect& coarsen (const IntVect& p);
00533
00535
00538 IntVect& coarsen (int p);
00539
00541
00545 friend inline IntVect coarsen (const IntVect& p,
00546 int s);
00547
00549
00553 friend inline IntVect coarsen (const IntVect& p1,
00554 const IntVect& p2);
00555
00562
00564
00567 void printOn (std::ostream& os) const;
00568
00570
00573 void p() const;
00574
00576
00579 void dumpOn (std::ostream& os) const;
00580
00582
00585 friend std::ostream& operator<< (std::ostream& os,
00586 const IntVect& iv);
00587
00589
00592 friend std::istream& operator>> (std::istream& os,
00593 IntVect& iv);
00594
00601
00603
00611 friend inline IntVect BASISV (int dir);
00612
00616 static const IntVect Zero;
00617
00621 static const IntVect Unit;
00622
00626 static int InitStatics();
00627
00630 protected:
00631
00632
00633
00634 friend class Box;
00635
00636 friend class HDF5Handle;
00637 friend class VolIndex;
00638 friend class FaceIndex;
00639 friend class BLfacade::IntVect;
00640
00644 int vect[SpaceDim];
00645
00649 static const size_t IntVectSize;
00650 };
00651
00652
00653
00654
00655
00656
00657
00658
00659 static int s_dummyForIntVectH = IntVect::InitStatics();
00660
00661
00662 #ifndef WRAPPER
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675 inline
00676 IntVect::IntVect (D_DECL6(int i, int j, int k,
00677 int l, int m, int n))
00678 {
00679 D_EXPR6(vect[0] = i, vect[1] = j, vect[2] = k, vect[3] = l, vect[4] = m, vect[5] = n);
00680 }
00681
00682 inline
00683 IntVect::IntVect (const int *a)
00684 {
00685 D_EXPR6(vect[0] = a[0], vect[1] = a[1], vect[2] = a[2],
00686 vect[3] = a[3], vect[4] = a[4], vect[5] = a[5]);
00687 }
00688
00689 inline
00690 IntVect::IntVect (const IntVect &iv)
00691 {
00692
00693 memcpy(vect, iv.vect, IntVectSize);
00694 }
00695
00696 inline
00697 IntVect&
00698 IntVect::operator= (const IntVect &iv)
00699 {
00700 D_EXPR6(vect[0]=iv.vect[0], vect[1]=iv.vect[1], vect[2]=iv.vect[2],
00701 vect[3]=iv.vect[3], vect[4]=iv.vect[4], vect[5]=iv.vect[5]);
00702 return *this;
00703 }
00704
00705 inline
00706 int&
00707 IntVect::operator[] (int i)
00708 {
00709 CH_assert(i>=0 && i < SpaceDim);
00710 return vect[i];
00711 }
00712
00713 inline
00714 int
00715 IntVect::operator[] (int i) const
00716 {
00717 CH_assert(i>=0 && i < SpaceDim);
00718 return vect[i];
00719 }
00720
00721 inline
00722 void
00723 IntVect::setVal (int i,
00724 int val)
00725 {
00726 CH_assert(i >=0 && i < SpaceDim);
00727 vect[i] = val;
00728
00729 }
00730
00731 inline
00732 const int*
00733 IntVect::dataPtr() const
00734 {
00735 return vect;
00736 }
00737
00738 inline
00739 int*
00740 IntVect::dataPtr()
00741 {
00742 return vect;
00743 }
00744
00745 inline
00746 const int*
00747 IntVect::getVect () const
00748 {
00749 return vect;
00750 }
00751
00752 inline
00753 bool
00754 IntVect::operator== (const IntVect& p) const
00755 {
00756 return D_TERM6(vect[0] == p[0], && vect[1] == p[1], && vect[2] == p[2],
00757 && vect[3] == p[3], && vect[4] == p[4], && vect[5] == p[5]);
00758 }
00759
00760 inline
00761 bool
00762 IntVect::operator!= (const IntVect& p) const
00763 {
00764 return D_TERM6(vect[0] != p[0], || vect[1] != p[1], || vect[2] != p[2],
00765 || vect[3] != p[3], || vect[4] != p[4], || vect[5] != p[5]);
00766 }
00767
00768 inline
00769 bool
00770 IntVect::operator< (const IntVect& p) const
00771 {
00772 return D_TERM6(vect[0] < p[0], && vect[1] < p[1], && vect[2] < p[2],
00773 && vect[3] < p[3], && vect[4] < p[4], && vect[5] < p[5]);
00774 }
00775
00776 inline
00777 bool
00778 IntVect::operator<= (const IntVect& p) const
00779 {
00780 return D_TERM6(vect[0] <= p[0], && vect[1] <= p[1], && vect[2] <= p[2],
00781 && vect[3] <= p[3], && vect[4] <= p[4], && vect[5] <= p[5]);
00782 }
00783
00784
00785 inline
00786 bool
00787 IntVect::operator> (const IntVect& p) const
00788 {
00789 return D_TERM6(vect[0] > p[0], && vect[1] > p[1], && vect[2] > p[2],
00790 && vect[3] > p[3], && vect[4] > p[4], && vect[5] > p[5]);
00791 }
00792
00793 inline
00794 bool
00795 IntVect::operator>= (const IntVect& p) const
00796 {
00797 return D_TERM6(vect[0] >= p[0], && vect[1] >= p[1], && vect[2] >= p[2],
00798 && vect[3] >= p[3], && vect[4] >= p[4], && vect[5] >= p[5]);
00799 }
00800
00801 inline
00802 bool
00803 IntVect::lexLT (const IntVect &s) const
00804
00805 {
00806 if (vect[0] < s[0]) return true;
00807 #if CH_SPACEDIM > 1
00808 if (vect[0] > s[0]) return false;
00809 if (vect[1] < s[1]) return true;
00810 #endif
00811 #if CH_SPACEDIM > 2
00812 if (vect[1] > s[1]) return false;
00813 if (vect[2] < s[2]) return true;
00814 #endif
00815 #if CH_SPACEDIM > 3
00816 if (vect[2] > s[2]) return false;
00817 if (vect[3] < s[3]) return true;
00818 #endif
00819 #if CH_SPACEDIM > 4
00820 if (vect[3] > s[3]) return false;
00821 if (vect[4] < s[4]) return true;
00822 #endif
00823 #if CH_SPACEDIM > 5
00824 if (vect[4] > s[4]) return false;
00825 if (vect[5] < s[5]) return true;
00826 #endif
00827
00828 return false;
00829 }
00830
00831
00832 inline
00833 bool
00834 IntVect::lexGT (const IntVect& s) const
00835 {
00836 if (vect[0] > s[0]) return true;
00837 #if CH_SPACEDIM > 1
00838 if (vect[0] < s[0]) return false;
00839 if (vect[1] > s[1]) return true;
00840 #endif
00841 #if CH_SPACEDIM > 2
00842 if (vect[1] < s[1]) return false;
00843 if (vect[2] > s[2]) return true;
00844 #endif
00845 #if CH_SPACEDIM > 3
00846 if (vect[2] < s[2]) return false;
00847 if (vect[3] > s[3]) return true;
00848 #endif
00849 #if CH_SPACEDIM > 4
00850 if (vect[3] < s[3]) return false;
00851 if (vect[4] > s[4]) return true;
00852 #endif
00853 #if CH_SPACEDIM > 5
00854 if (vect[4] < s[4]) return false;
00855 if (vect[5] > s[5]) return true;
00856 #endif
00857
00858 return false;
00859 }
00860
00861 inline
00862 IntVect
00863 IntVect::operator+ () const
00864 {
00865 return IntVect(*this);
00866 }
00867
00868 inline
00869 IntVect
00870 IntVect::operator- () const
00871 {
00872 return IntVect(D_DECL6(-vect[0], -vect[1], -vect[2],
00873 -vect[3], -vect[4], -vect[5] ));
00874 }
00875
00876 inline
00877 int
00878 IntVect::sum () const
00879 {
00880 return D_TERM6(vect[0], + vect[1], + vect[2],
00881 + vect[3], + vect[4], + vect[5]);
00882 }
00883
00884 inline
00885 int
00886 IntVect::product () const
00887 {
00888 return D_TERM6(vect[0], * vect[1], * vect[2],
00889 * vect[3], * vect[4], * vect[5]);
00890 }
00891
00892 inline
00893 IntVect&
00894 IntVect::operator+= (int s)
00895 {
00896 D_EXPR6(vect[0] += s, vect[1] += s, vect[2] += s,
00897 vect[3] += s, vect[4] += s, vect[5] += s);
00898 return *this;
00899 }
00900
00901 inline
00902 IntVect&
00903 IntVect::operator+= (const IntVect& p)
00904 {
00905 D_EXPR6(vect[0] += p[0], vect[1] += p[1], vect[2] += p[2],
00906 vect[3] += p[3], vect[4] += p[4], vect[5] += p[5]);
00907 return *this;
00908 }
00909
00910 inline
00911 IntVect&
00912 IntVect::operator*= (int s)
00913 {
00914 D_EXPR6(vect[0] *= s, vect[1] *= s, vect[2] *= s,
00915 vect[3] *= s, vect[4] *= s, vect[5] *= s);
00916 return *this;
00917 }
00918
00919 inline
00920 IntVect&
00921 IntVect::operator*= (const IntVect &p)
00922 {
00923 D_EXPR6(vect[0] *= p[0], vect[1] *= p[1], vect[2] *= p[2],
00924 vect[3] *= p[3], vect[4] *= p[4], vect[5] *= p[5]);
00925 return *this;
00926 }
00927
00928 inline
00929 IntVect&
00930 IntVect::operator/= (int s)
00931 {
00932 D_EXPR6(vect[0] /= s, vect[1] /= s, vect[2] /= s,
00933 vect[3] /= s, vect[4] /= s, vect[5] /= s);
00934 return *this;
00935 }
00936
00937 inline
00938 IntVect&
00939 IntVect::operator/= (const IntVect& p)
00940 {
00941 D_EXPR6(vect[0] /= p[0], vect[1] /= p[1], vect[2] /= p[2],
00942 vect[3] /= p[3], vect[4] /= p[4], vect[5] /= p[5]);
00943 return *this;
00944 }
00945
00946 inline
00947 IntVect&
00948 IntVect::operator-= (int s)
00949 {
00950 D_EXPR6(vect[0] -= s, vect[1] -= s, vect[2] -= s,
00951 vect[3] -= s, vect[4] -= s, vect[5] -= s);
00952 return *this;
00953 }
00954
00955 inline
00956 IntVect&
00957 IntVect::operator-= (const IntVect& p)
00958 {
00959 D_EXPR6(vect[0] -= p[0], vect[1] -= p[1], vect[2] -= p[2],
00960 vect[3] -= p[3], vect[4] -= p[4], vect[5] -= p[5]);
00961 return *this;
00962 }
00963
00964 inline
00965 IntVect
00966 IntVect::operator+ (const IntVect& p) const
00967 {
00968 return IntVect(D_DECL6(vect[0] + p[0], vect[1] + p[1], vect[2] + p[2],
00969 vect[3] + p[3], vect[4] + p[4], vect[5] + p[5]));
00970 }
00971
00972 inline
00973 IntVect
00974 IntVect::operator+ (int s) const
00975 {
00976 return IntVect(D_DECL6(vect[0] + s, vect[1] + s, vect[2] + s,
00977 vect[3] + s, vect[4] + s, vect[5] + s));
00978 }
00979
00980 inline
00981 IntVect
00982 IntVect::operator- (const IntVect& p) const
00983 {
00984 return IntVect(D_DECL6(vect[0] - p[0], vect[1] - p[1], vect[2] - p[2],
00985 vect[3] - p[3], vect[4] - p[4], vect[5] - p[5]));
00986 }
00987
00988 inline
00989 IntVect
00990 IntVect::operator- (int s) const
00991 {
00992 return IntVect(D_DECL6(vect[0] - s, vect[1] - s, vect[2] - s,
00993 vect[3] - s, vect[4] - s, vect[5] - s));
00994 }
00995
00996 inline
00997 IntVect
00998 IntVect::operator* (const IntVect& p) const
00999 {
01000 return IntVect(D_DECL6(vect[0] * p[0], vect[1] * p[1], vect[2] * p[2],
01001 vect[3] * p[3], vect[4] * p[4], vect[5] * p[5]));
01002 }
01003
01004 inline
01005 IntVect
01006 IntVect::operator* (int s) const
01007 {
01008 return IntVect(D_DECL6(vect[0] * s, vect[1] * s, vect[2] * s,
01009 vect[3] * s, vect[4] * s, vect[5] * s));
01010 }
01011
01012 inline
01013 IntVect
01014 IntVect::operator/ (const IntVect& p) const
01015 {
01016 return IntVect(D_DECL6(vect[0] / p[0], vect[1] / p[1], vect[2] / p[2],
01017 vect[3] / p[3], vect[4] / p[4], vect[5] / p[5]));
01018 }
01019
01020 inline
01021 IntVect
01022 IntVect::operator/ (int s) const
01023 {
01024 return IntVect(D_DECL6(vect[0] / s, vect[1] / s, vect[2] / s,
01025 vect[3] / s, vect[4] / s, vect[5] / s));
01026 }
01027
01028 inline
01029 IntVect&
01030 IntVect::min (const IntVect& p)
01031 {
01032 D_EXPR6(vect[0] = Min(vect[0], p.vect[0]),
01033 vect[1] = Min(vect[1], p.vect[1]),
01034 vect[2] = Min(vect[2], p.vect[2]),
01035 vect[3] = Min(vect[3], p.vect[3]),
01036 vect[4] = Min(vect[4], p.vect[4]),
01037 vect[5] = Min(vect[5], p.vect[5]));
01038 return *this;
01039 }
01040
01041 inline
01042 IntVect&
01043 IntVect::max (const IntVect& p)
01044 {
01045 D_EXPR6(vect[0] = Max(vect[0], p.vect[0]),
01046 vect[1] = Max(vect[1], p.vect[1]),
01047 vect[2] = Max(vect[2], p.vect[2]),
01048 vect[3] = Max(vect[3], p.vect[3]),
01049 vect[4] = Max(vect[4], p.vect[4]),
01050 vect[5] = Max(vect[5], p.vect[5]));
01051 return *this;
01052 }
01053
01054 inline
01055 IntVect&
01056 IntVect::scale (int s)
01057 {
01058 D_EXPR6(vect[0] *= s, vect[1] *= s, vect[2] *= s,
01059 vect[3] *= s, vect[4] *= s, vect[5] *= s);
01060 return *this;
01061 }
01062
01063 inline
01064 IntVect&
01065 IntVect::reflect (int ref_ix,
01066 int idir)
01067 {
01068 CH_assert(idir >= 0 && idir < SpaceDim);
01069 vect[idir] = -vect[idir] + 2*ref_ix;
01070 return *this;
01071 }
01072
01073 inline
01074 IntVect&
01075 IntVect::shift (int coord,
01076 int s)
01077 {
01078 CH_assert(coord >= 0 && coord < SpaceDim);
01079 vect[coord] += s;
01080 return *this;
01081 }
01082
01083 inline
01084 IntVect&
01085 IntVect::shift (const IntVect& iv)
01086 {
01087 *this += iv;
01088 return *this;
01089 }
01090
01091 inline
01092 IntVect&
01093 IntVect::diagShift (int s)
01094 {
01095 D_EXPR6(vect[0] += s, vect[1] += s, vect[2] += s,
01096 vect[3] += s, vect[4] += s, vect[5] += s);
01097 return *this;
01098 }
01099
01100 inline
01101 IntVect
01102 operator+ (int s,
01103 const IntVect& p)
01104 {
01105 return IntVect(D_DECL6(p[0] + s, p[1] + s, p[2] + s,
01106 p[3] + s, p[4] + s, p[5] + s));
01107 }
01108
01109 inline
01110 IntVect
01111 operator- (int s,
01112 const IntVect& p)
01113 {
01114 return IntVect(D_DECL6(s - p[0], s - p[1], s - p[2],
01115 s - p[3], s - p[4], s - p[5]));
01116 }
01117
01118 inline
01119 IntVect
01120 operator* (int s,
01121 const IntVect& p)
01122 {
01123 return IntVect(D_DECL6(s * p[0], s * p[1], s * p[2],
01124 s * p[3], s * p[4], s * p[5]));
01125 }
01126
01127 inline
01128 IntVect
01129 scale (const IntVect& p,
01130 int s)
01131 {
01132 return IntVect(D_DECL6(s * p[0], s * p[1], s * p[2],
01133 s * p[3], s * p[4], s * p[5]));
01134 }
01135
01136 inline
01137 IntVect
01138 diagShift (const IntVect &p, int s)
01139 {
01140 return IntVect(D_DECL6(p[0] + s, p[1] + s, p[2] + s,
01141 p[3] + s, p[4] + s, p[5] + s));
01142 }
01143
01144 inline
01145 IntVect
01146 min (const IntVect& p1,
01147 const IntVect& p2)
01148 {
01149 IntVect p(p1);
01150 return p.min(p2);
01151 }
01152
01153 inline
01154 IntVect
01155 max (const IntVect& p1,
01156 const IntVect& p2)
01157 {
01158 IntVect p(p1);
01159 return p.max(p2);
01160 }
01161
01162 inline
01163 IntVect
01164 BASISV (int dir)
01165 {
01166 CH_assert(dir >= 0 && dir < SpaceDim);
01167 IntVect tmp = IntVect::Zero ;
01168 tmp.vect[dir] = 1;
01169 return tmp;
01170 }
01171
01172 inline
01173 IntVect
01174 reflect (const IntVect& a,
01175 int ref_ix,
01176 int idir)
01177 {
01178 CH_assert(idir >= 0 && idir < SpaceDim);
01179 IntVect b(a);
01180 b.vect[idir] = -b.vect[idir] + 2*ref_ix;
01181 return b;
01182 }
01183
01184 inline
01185 IntVect
01186 coarsen (const IntVect& p,
01187 int s)
01188 {
01189 CH_assert(s > 0);
01190 return IntVect(
01191 D_DECL6((p.vect[0]<0) ? -abs(p.vect[0]+1)/s-1 : p.vect[0]/s ,
01192 (p.vect[1]<0) ? -abs(p.vect[1]+1)/s-1 : p.vect[1]/s ,
01193 (p.vect[2]<0) ? -abs(p.vect[2]+1)/s-1 : p.vect[2]/s ,
01194 (p.vect[3]<0) ? -abs(p.vect[3]+1)/s-1 : p.vect[3]/s ,
01195 (p.vect[4]<0) ? -abs(p.vect[4]+1)/s-1 : p.vect[4]/s ,
01196 (p.vect[5]<0) ? -abs(p.vect[5]+1)/s-1 : p.vect[5]/s ));
01197 }
01198
01199 inline
01200 IntVect
01201 coarsen (const IntVect& p1,
01202 const IntVect& p2)
01203 {
01204 CH_assert(p2 > IntVect::Zero);
01205 return IntVect(
01206 D_DECL6(
01207 (p1.vect[0]<0)?-abs(p1.vect[0]+1)/p2.vect[0]-1:p1.vect[0]/p2.vect[0],
01208 (p1.vect[1]<0)?-abs(p1.vect[1]+1)/p2.vect[1]-1:p1.vect[1]/p2.vect[1],
01209 (p1.vect[2]<0)?-abs(p1.vect[2]+1)/p2.vect[2]-1:p1.vect[2]/p2.vect[2],
01210 (p1.vect[3]<0)?-abs(p1.vect[3]+1)/p2.vect[3]-1:p1.vect[3]/p2.vect[3],
01211 (p1.vect[4]<0)?-abs(p1.vect[4]+1)/p2.vect[4]-1:p1.vect[4]/p2.vect[4],
01212 (p1.vect[5]<0)?-abs(p1.vect[5]+1)/p2.vect[5]-1:p1.vect[5]/p2.vect[5])
01213 );
01214 }
01215
01216 inline
01217 IntVect&
01218 IntVect::coarsen (int s)
01219 {
01220 CH_assert(s > 0);
01221 for (int i = 0; i < SpaceDim; ++i)
01222 vect[i] = ((vect[i]<0) ? -abs(vect[i]+1)/s-1 : vect[i]/s);
01223 return *this;
01224 }
01225
01226 inline
01227 IntVect&
01228 IntVect::coarsen (const IntVect& p)
01229 {
01230 CH_assert(p > IntVect::Zero);
01231 for (int i = 0; i <SpaceDim; ++i)
01232 {
01233 const int s = p.vect[i];
01234 vect[i] = ((vect[i]<0) ? -abs(vect[i]+1)/s-1 : vect[i]/s);
01235 }
01236 return *this;
01237 }
01238
01239 #endif
01240
01241 #include "NamespaceFooter.H"
01242 #endif