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 "IndexTM.H"
00021 #include <cstdint>
00022 #include "SPMD.H"
00023 #include "Misc.H"
00024 #include <functional>
00025
00026 namespace BLfacade
00027 {
00028 class IntVect;
00029 }
00030
00031 #include "NamespaceHeader.H"
00032
00033
00034
00035
00036
00037 class HDF5Handle;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 class IntVect
00049 {
00050 public:
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 inline
00063 IntVect()
00064 {}
00065
00066 explicit IntVect( const Vector<int>& vi)
00067 {
00068 D_EXPR6(vect[0]=vi[0], vect[1]=vi[1], vect[2] = vi[2],
00069 vect[3]=vi[3], vect[4]=vi[4], vect[5] = vi[5]);
00070 }
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 explicit IntVect (D_DECL6(int i, int j, int k,
00086 int l, int m, int n));
00087
00088
00089
00090
00091
00092
00093 explicit IntVect (const int* a);
00094
00095
00096
00097
00098
00099
00100
00101 IntVect (const IndexTM<int, CH_SPACEDIM>& a_tm);
00102
00103 IntVect copy() const
00104 {
00105 return *this;
00106 }
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 inline
00119 int& operator[] (int i);
00120
00121
00122
00123
00124
00125 inline
00126 int operator[] (int i) const;
00127
00128
00129
00130
00131
00132 void setVal (int i,
00133 int val);
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 const int* getVect () const;
00148
00149
00150
00151
00152
00153 const int* dataPtr() const;
00154
00155
00156
00157
00158
00159 int* dataPtr();
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 bool operator== (const IntVect& p) const;
00174
00175
00176
00177
00178
00179
00180 bool operator!= (const IntVect& p) const;
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 bool operator< (const IntVect& p) const;
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 bool operator<= (const IntVect& p) const;
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 bool operator> (const IntVect& p) const;
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 bool operator>= (const IntVect& p) const;
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237 bool lexLT (const IntVect& s) const;
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253 bool lexGT (const IntVect& s) const;
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 IntVect operator+ () const;
00267
00268
00269
00270
00271
00272 IntVect operator- () const;
00273
00274
00275
00276
00277
00278 int sum () const;
00279
00280
00281
00282
00283
00284 int product () const;
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297 IntVect& operator+= (int s);
00298
00299
00300
00301
00302
00303 IntVect& operator+= (const IntVect& p);
00304
00305
00306
00307
00308
00309 IntVect operator+ (const IntVect& p) const;
00310
00311
00312
00313
00314
00315
00316 IntVect operator+ (int s) const;
00317
00318
00319
00320
00321
00322
00323 friend inline IntVect operator+ (int s,
00324 const IntVect& p);
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338 IntVect& operator-= (int s);
00339
00340
00341
00342
00343
00344 IntVect& operator-= (const IntVect& p);
00345
00346
00347
00348
00349
00350
00351 IntVect operator- (const IntVect& p) const;
00352
00353
00354
00355
00356
00357
00358 IntVect operator- (int s) const;
00359
00360
00361
00362
00363
00364 friend inline IntVect operator- (int s,
00365 const IntVect& p);
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379 IntVect& operator*= (int s);
00380
00381
00382
00383
00384
00385 IntVect& operator*= (const IntVect& p);
00386
00387
00388
00389
00390
00391 IntVect operator* (const IntVect& p) const;
00392
00393
00394
00395
00396
00397
00398 IntVect operator* (int s) const;
00399
00400
00401
00402
00403
00404
00405 friend inline IntVect operator* (int s,
00406 const IntVect& p);
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419 IntVect& operator/= (int s);
00420
00421
00422
00423
00424
00425
00426 IntVect& operator/= (const IntVect& p);
00427
00428
00429
00430
00431
00432 IntVect operator/ (const IntVect& p) const;
00433
00434
00435
00436
00437
00438
00439 IntVect operator/ (int s) const;
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453 IntVect& min (const IntVect& p);
00454
00455
00456
00457
00458
00459
00460 friend inline IntVect min (const IntVect& p1,
00461 const IntVect& p2);
00462
00463
00464
00465
00466
00467
00468 IntVect& max (const IntVect& p);
00469
00470
00471 int max() const
00472 {
00473 int retval = vect[0];
00474 for(int idir = 1; idir < SpaceDim; idir++)
00475 {
00476 retval = Max(retval, vect[idir]);
00477 }
00478 return retval;
00479 }
00480
00481
00482 int min() const
00483 {
00484 int retval = vect[0];
00485 for(int idir = 1; idir < SpaceDim; idir++)
00486 {
00487 retval = Min(retval, vect[idir]);
00488 }
00489 return retval;
00490 }
00491
00492
00493
00494
00495
00496
00497 friend inline IntVect max (const IntVect& p1,
00498 const IntVect& p2);
00499
00500
00501
00502
00503
00504 IntVect& scale (int s);
00505
00506
00507
00508
00509
00510
00511 friend inline IntVect scale (const IntVect& p,
00512 int s);
00513
00514
00515 friend const IntVect absolute(const IntVect& p);
00516
00517
00518
00519
00520
00521
00522
00523 IntVect& reflect (int ref_ix,
00524 int idir);
00525
00526
00527
00528
00529
00530
00531
00532 friend inline IntVect reflect(const IntVect& a,
00533 int ref_ix,
00534 int idir);
00535
00536
00537
00538
00539
00540
00541 IntVect& shift (int coord,
00542 int s);
00543
00544
00545
00546
00547
00548
00549 IntVect& shift (const IntVect& iv);
00550
00551
00552
00553
00554
00555
00556 IntVect& diagShift (int s);
00557
00558
00559
00560
00561
00562
00563 friend inline IntVect diagShift (const IntVect& p,
00564 int s);
00565
00566
00567
00568
00569
00570 IntVect& coarsen (const IntVect& p);
00571
00572
00573
00574
00575
00576 IntVect& coarsen (int p);
00577
00578
00579
00580
00581
00582
00583 friend inline IntVect coarsen (const IntVect& p,
00584 int s);
00585
00586
00587
00588
00589
00590
00591 friend inline IntVect coarsen (const IntVect& p1,
00592 const IntVect& p2);
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605 void printOn (std::ostream& os) const;
00606
00607
00608
00609
00610
00611 void p() const;
00612
00613
00614
00615
00616
00617 void dumpOn (std::ostream& os) const;
00618
00619
00620
00621
00622
00623 friend std::ostream& operator<< (std::ostream& os,
00624 const IntVect& iv);
00625
00626
00627
00628
00629
00630 friend std::istream& operator>> (std::istream& os,
00631 IntVect& iv);
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649 friend inline IntVect BASISV (int dir);
00650
00651
00652
00653
00654 static const IntVect Zero;
00655
00656
00657
00658
00659 static const IntVect Unit;
00660
00661
00662
00663
00664 static int InitStatics();
00665
00666
00667
00668 static size_t io_offset;
00669
00670 inline uint64_t hash(const IntVect& origin, const IntVect& blockingFactor) const;
00671
00672 protected:
00673
00674
00675
00676 friend class Box;
00677
00678 friend class HDF5Handle;
00679 friend class VolIndex;
00680 friend class FaceIndex;
00681 friend class BLfacade::IntVect;
00682
00683
00684
00685
00686 int vect[CH_SPACEDIM];
00687
00688
00689
00690
00691 static const size_t IntVectSize;
00692 static const uint32_t morton256_x[256];
00693 static const uint32_t morton256_y[256];
00694 static const uint32_t morton256_z[256];
00695
00696 };
00697 #include "NamespaceFooter.H"
00698
00699 namespace std { template <> inline bool less<CH_XD::IntVect>::operator()(const CH_XD::IntVect& a, const CH_XD::IntVect& b) const { return a.lexLT(b);}
00700 }
00701 #include "BaseNamespaceHeader.H"
00702
00703 #include "NamespaceVar.H"
00704
00705
00706 template < >
00707 int linearSize(const CH_XDIR::IntVect& a_iv);
00708
00709
00710 template < >
00711 void linearIn(CH_XDIR::IntVect& a_iv, const void* a_inBuf);
00712
00713
00714 template < >
00715 void linearOut(void* a_outBuf, const CH_XDIR::IntVect& a_iv);
00716
00717
00718 template < >
00719 int linearSize(const Vector<CH_XDIR::IntVect>& a_input);
00720 template < >
00721 void linearIn(Vector<CH_XDIR::IntVect>& a_outputT, const void* const inBuf);
00722 template < >
00723 void linearOut(void* const a_outBuf, const Vector<CH_XDIR::IntVect>& a_inputT);
00724
00725
00726 template < >
00727 int linearSize(const Vector<Vector<CH_XDIR::IntVect> >& a_input);
00728 template < >
00729 void linearIn(Vector<Vector<CH_XDIR::IntVect> >& a_outputT, const void* const inBuf);
00730 template < >
00731 void linearOut(void* const a_outBuf, const Vector<Vector<CH_XDIR::IntVect> >& a_inputT);
00732
00733 #include "BaseNamespaceFooter.H"
00734
00735 #include "NamespaceHeader.H"
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745 static int s_dummyForIntVectH = IntVect::InitStatics();
00746
00747 #ifndef WRAPPER
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762 inline
00763 IntVect::IntVect (D_DECL6(int i, int j, int k,
00764 int l, int m, int n))
00765 {
00766 D_EXPR6(vect[0] = i, vect[1] = j, vect[2] = k, vect[3] = l, vect[4] = m, vect[5] = n);
00767 }
00768
00769 inline
00770 IntVect::IntVect (const int *a)
00771 {
00772 D_EXPR6(vect[0] = a[0], vect[1] = a[1], vect[2] = a[2],
00773 vect[3] = a[3], vect[4] = a[4], vect[5] = a[5]);
00774 }
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792 inline
00793 int&
00794 IntVect::operator[] (int i)
00795 {
00796 CH_assert(i>=0 && i < SpaceDim);
00797 return vect[i];
00798 }
00799
00800 inline
00801 int
00802 IntVect::operator[] (int i) const
00803 {
00804 CH_assert(i>=0 && i < SpaceDim);
00805 return vect[i];
00806 }
00807
00808 inline
00809 void
00810 IntVect::setVal (int i,
00811 int val)
00812 {
00813 CH_assert(i >=0 && i < SpaceDim);
00814 vect[i] = val;
00815
00816 }
00817
00818 inline
00819 const int*
00820 IntVect::dataPtr() const
00821 {
00822 return vect;
00823 }
00824
00825 inline
00826 int*
00827 IntVect::dataPtr()
00828 {
00829 return vect;
00830 }
00831
00832 inline
00833 const int*
00834 IntVect::getVect () const
00835 {
00836 return vect;
00837 }
00838
00839 inline
00840 bool
00841 IntVect::operator== (const IntVect& p) const
00842 {
00843 return D_TERM6(vect[0] == p[0], && vect[1] == p[1], && vect[2] == p[2],
00844 && vect[3] == p[3], && vect[4] == p[4], && vect[5] == p[5]);
00845 }
00846
00847 inline
00848 bool
00849 IntVect::operator!= (const IntVect& p) const
00850 {
00851 return D_TERM6(vect[0] != p[0], || vect[1] != p[1], || vect[2] != p[2],
00852 || vect[3] != p[3], || vect[4] != p[4], || vect[5] != p[5]);
00853 }
00854
00855 inline
00856 bool
00857 IntVect::operator< (const IntVect& p) const
00858 {
00859 return D_TERM6(vect[0] < p[0], && vect[1] < p[1], && vect[2] < p[2],
00860 && vect[3] < p[3], && vect[4] < p[4], && vect[5] < p[5]);
00861 }
00862
00863 inline
00864 bool
00865 IntVect::operator<= (const IntVect& p) const
00866 {
00867 return D_TERM6(vect[0] <= p[0], && vect[1] <= p[1], && vect[2] <= p[2],
00868 && vect[3] <= p[3], && vect[4] <= p[4], && vect[5] <= p[5]);
00869 }
00870
00871 inline
00872 bool
00873 IntVect::operator> (const IntVect& p) const
00874 {
00875 return D_TERM6(vect[0] > p[0], && vect[1] > p[1], && vect[2] > p[2],
00876 && vect[3] > p[3], && vect[4] > p[4], && vect[5] > p[5]);
00877 }
00878
00879 inline
00880 bool
00881 IntVect::operator>= (const IntVect& p) const
00882 {
00883 return D_TERM6(vect[0] >= p[0], && vect[1] >= p[1], && vect[2] >= p[2],
00884 && vect[3] >= p[3], && vect[4] >= p[4], && vect[5] >= p[5]);
00885 }
00886
00887 inline
00888 bool
00889 IntVect::lexLT (const IntVect &s) const
00890
00891 {
00892 if (vect[0] < s[0]) return true;
00893 #if CH_SPACEDIM > 1
00894 if (vect[0] > s[0]) return false;
00895 if (vect[1] < s[1]) return true;
00896 #endif
00897 #if CH_SPACEDIM > 2
00898 if (vect[1] > s[1]) return false;
00899 if (vect[2] < s[2]) return true;
00900 #endif
00901 #if CH_SPACEDIM > 3
00902 if (vect[2] > s[2]) return false;
00903 if (vect[3] < s[3]) return true;
00904 #endif
00905 #if CH_SPACEDIM > 4
00906 if (vect[3] > s[3]) return false;
00907 if (vect[4] < s[4]) return true;
00908 #endif
00909 #if CH_SPACEDIM > 5
00910 if (vect[4] > s[4]) return false;
00911 if (vect[5] < s[5]) return true;
00912 #endif
00913
00914 return false;
00915 }
00916
00917 inline
00918 bool
00919 IntVect::lexGT (const IntVect& s) const
00920 {
00921 if (vect[0] > s[0]) return true;
00922 #if CH_SPACEDIM > 1
00923 if (vect[0] < s[0]) return false;
00924 if (vect[1] > s[1]) return true;
00925 #endif
00926 #if CH_SPACEDIM > 2
00927 if (vect[1] < s[1]) return false;
00928 if (vect[2] > s[2]) return true;
00929 #endif
00930 #if CH_SPACEDIM > 3
00931 if (vect[2] < s[2]) return false;
00932 if (vect[3] > s[3]) return true;
00933 #endif
00934 #if CH_SPACEDIM > 4
00935 if (vect[3] < s[3]) return false;
00936 if (vect[4] > s[4]) return true;
00937 #endif
00938 #if CH_SPACEDIM > 5
00939 if (vect[4] < s[4]) return false;
00940 if (vect[5] > s[5]) return true;
00941 #endif
00942
00943 return false;
00944 }
00945
00946 inline
00947 IntVect
00948 IntVect::operator+ () const
00949 {
00950 return IntVect(*this);
00951 }
00952
00953 inline
00954 IntVect
00955 IntVect::operator- () const
00956 {
00957 return IntVect(D_DECL6(-vect[0], -vect[1], -vect[2],
00958 -vect[3], -vect[4], -vect[5] ));
00959 }
00960
00961 inline
00962 int
00963 IntVect::sum () const
00964 {
00965 return D_TERM6(vect[0], + vect[1], + vect[2],
00966 + vect[3], + vect[4], + vect[5]);
00967 }
00968
00969 inline
00970 int
00971 IntVect::product () const
00972 {
00973 return D_TERM6(vect[0], * vect[1], * vect[2],
00974 * vect[3], * vect[4], * vect[5]);
00975 }
00976
00977 inline
00978 IntVect&
00979 IntVect::operator+= (int s)
00980 {
00981 D_EXPR6(vect[0] += s, vect[1] += s, vect[2] += s,
00982 vect[3] += s, vect[4] += s, vect[5] += s);
00983 return *this;
00984 }
00985
00986 inline
00987 IntVect&
00988 IntVect::operator+= (const IntVect& p)
00989 {
00990 D_EXPR6(vect[0] += p[0], vect[1] += p[1], vect[2] += p[2],
00991 vect[3] += p[3], vect[4] += p[4], vect[5] += p[5]);
00992 return *this;
00993 }
00994
00995 inline
00996 IntVect&
00997 IntVect::operator*= (int s)
00998 {
00999 D_EXPR6(vect[0] *= s, vect[1] *= s, vect[2] *= s,
01000 vect[3] *= s, vect[4] *= s, vect[5] *= s);
01001 return *this;
01002 }
01003
01004 inline
01005 IntVect&
01006 IntVect::operator*= (const IntVect &p)
01007 {
01008 D_EXPR6(vect[0] *= p[0], vect[1] *= p[1], vect[2] *= p[2],
01009 vect[3] *= p[3], vect[4] *= p[4], vect[5] *= p[5]);
01010 return *this;
01011 }
01012
01013 inline
01014 IntVect&
01015 IntVect::operator/= (int s)
01016 {
01017 D_EXPR6(vect[0] /= s, vect[1] /= s, vect[2] /= s,
01018 vect[3] /= s, vect[4] /= s, vect[5] /= s);
01019 return *this;
01020 }
01021
01022 inline
01023 IntVect&
01024 IntVect::operator/= (const IntVect& p)
01025 {
01026 D_EXPR6(vect[0] /= p[0], vect[1] /= p[1], vect[2] /= p[2],
01027 vect[3] /= p[3], vect[4] /= p[4], vect[5] /= p[5]);
01028 return *this;
01029 }
01030
01031 inline
01032 IntVect&
01033 IntVect::operator-= (int s)
01034 {
01035 D_EXPR6(vect[0] -= s, vect[1] -= s, vect[2] -= s,
01036 vect[3] -= s, vect[4] -= s, vect[5] -= s);
01037 return *this;
01038 }
01039
01040 inline
01041 IntVect&
01042 IntVect::operator-= (const IntVect& p)
01043 {
01044 D_EXPR6(vect[0] -= p[0], vect[1] -= p[1], vect[2] -= p[2],
01045 vect[3] -= p[3], vect[4] -= p[4], vect[5] -= p[5]);
01046 return *this;
01047 }
01048
01049 inline
01050 IntVect
01051 IntVect::operator+ (const IntVect& p) const
01052 {
01053 return IntVect(D_DECL6(vect[0] + p[0], vect[1] + p[1], vect[2] + p[2],
01054 vect[3] + p[3], vect[4] + p[4], vect[5] + p[5]));
01055 }
01056
01057 inline
01058 IntVect
01059 IntVect::operator+ (int s) const
01060 {
01061 return IntVect(D_DECL6(vect[0] + s, vect[1] + s, vect[2] + s,
01062 vect[3] + s, vect[4] + s, vect[5] + s));
01063 }
01064
01065 inline
01066 IntVect
01067 IntVect::operator- (const IntVect& p) const
01068 {
01069 return IntVect(D_DECL6(vect[0] - p[0], vect[1] - p[1], vect[2] - p[2],
01070 vect[3] - p[3], vect[4] - p[4], vect[5] - p[5]));
01071 }
01072
01073 inline
01074 IntVect
01075 IntVect::operator- (int s) const
01076 {
01077 return IntVect(D_DECL6(vect[0] - s, vect[1] - s, vect[2] - s,
01078 vect[3] - s, vect[4] - s, vect[5] - s));
01079 }
01080
01081 inline
01082 IntVect
01083 IntVect::operator* (const IntVect& p) const
01084 {
01085 return IntVect(D_DECL6(vect[0] * p[0], vect[1] * p[1], vect[2] * p[2],
01086 vect[3] * p[3], vect[4] * p[4], vect[5] * p[5]));
01087 }
01088
01089 inline
01090 IntVect
01091 IntVect::operator* (int s) const
01092 {
01093 return IntVect(D_DECL6(vect[0] * s, vect[1] * s, vect[2] * s,
01094 vect[3] * s, vect[4] * s, vect[5] * s));
01095 }
01096
01097 inline
01098 IntVect
01099 IntVect::operator/ (const IntVect& p) const
01100 {
01101 return IntVect(D_DECL6(vect[0] / p[0], vect[1] / p[1], vect[2] / p[2],
01102 vect[3] / p[3], vect[4] / p[4], vect[5] / p[5]));
01103 }
01104
01105 inline
01106 IntVect
01107 IntVect::operator/ (int s) const
01108 {
01109 return IntVect(D_DECL6(vect[0] / s, vect[1] / s, vect[2] / s,
01110 vect[3] / s, vect[4] / s, vect[5] / s));
01111 }
01112
01113 inline
01114 IntVect&
01115 IntVect::min (const IntVect& p)
01116 {
01117 D_EXPR6(vect[0] = Min(vect[0], p.vect[0]),
01118 vect[1] = Min(vect[1], p.vect[1]),
01119 vect[2] = Min(vect[2], p.vect[2]),
01120 vect[3] = Min(vect[3], p.vect[3]),
01121 vect[4] = Min(vect[4], p.vect[4]),
01122 vect[5] = Min(vect[5], p.vect[5]));
01123 return *this;
01124 }
01125
01126 inline
01127 IntVect&
01128 IntVect::max (const IntVect& p)
01129 {
01130 D_EXPR6(vect[0] = Max(vect[0], p.vect[0]),
01131 vect[1] = Max(vect[1], p.vect[1]),
01132 vect[2] = Max(vect[2], p.vect[2]),
01133 vect[3] = Max(vect[3], p.vect[3]),
01134 vect[4] = Max(vect[4], p.vect[4]),
01135 vect[5] = Max(vect[5], p.vect[5]));
01136 return *this;
01137 }
01138
01139 inline
01140 IntVect&
01141 IntVect::scale (int s)
01142 {
01143 D_EXPR6(vect[0] *= s, vect[1] *= s, vect[2] *= s,
01144 vect[3] *= s, vect[4] *= s, vect[5] *= s);
01145 return *this;
01146 }
01147
01148 inline
01149 IntVect&
01150 IntVect::reflect (int ref_ix,
01151 int idir)
01152 {
01153 CH_assert(idir >= 0 && idir < SpaceDim);
01154 vect[idir] = -vect[idir] + 2*ref_ix;
01155 return *this;
01156 }
01157
01158 inline
01159 IntVect&
01160 IntVect::shift (int coord,
01161 int s)
01162 {
01163 CH_assert(coord >= 0 && coord < SpaceDim);
01164 vect[coord] += s;
01165 return *this;
01166 }
01167
01168 inline
01169 IntVect&
01170 IntVect::shift (const IntVect& iv)
01171 {
01172 *this += iv;
01173 return *this;
01174 }
01175
01176 inline
01177 IntVect&
01178 IntVect::diagShift (int s)
01179 {
01180 D_EXPR6(vect[0] += s, vect[1] += s, vect[2] += s,
01181 vect[3] += s, vect[4] += s, vect[5] += s);
01182 return *this;
01183 }
01184
01185 inline
01186 IntVect
01187 operator+ (int s,
01188 const IntVect& p)
01189 {
01190 return IntVect(D_DECL6(p[0] + s, p[1] + s, p[2] + s,
01191 p[3] + s, p[4] + s, p[5] + s));
01192 }
01193
01194 inline
01195 IntVect
01196 operator- (int s,
01197 const IntVect& p)
01198 {
01199 return IntVect(D_DECL6(s - p[0], s - p[1], s - p[2],
01200 s - p[3], s - p[4], s - p[5]));
01201 }
01202
01203 inline
01204 IntVect
01205 operator* (int s,
01206 const IntVect& p)
01207 {
01208 return IntVect(D_DECL6(s * p[0], s * p[1], s * p[2],
01209 s * p[3], s * p[4], s * p[5]));
01210 }
01211
01212 inline
01213 IntVect
01214 scale (const IntVect& p,
01215 int s)
01216 {
01217 return IntVect(D_DECL6(s * p[0], s * p[1], s * p[2],
01218 s * p[3], s * p[4], s * p[5]));
01219 }
01220
01221 inline
01222 const IntVect
01223 absolute (const IntVect& p)
01224 {
01225 return IntVect(D_DECL6(abs(p[0]), abs(p[1]), abs(p[2]),
01226 abs(p[3]), abs(p[4]), abs(p[5])));
01227 }
01228
01229 inline
01230 IntVect
01231 diagShift (const IntVect &p, int s)
01232 {
01233 return IntVect(D_DECL6(p[0] + s, p[1] + s, p[2] + s,
01234 p[3] + s, p[4] + s, p[5] + s));
01235 }
01236
01237 inline
01238 IntVect
01239 min (const IntVect& p1,
01240 const IntVect& p2)
01241 {
01242 IntVect p(p1);
01243 return p.min(p2);
01244 }
01245
01246 inline
01247 IntVect
01248 max (const IntVect& p1,
01249 const IntVect& p2)
01250 {
01251 IntVect p(p1);
01252 return p.max(p2);
01253 }
01254
01255 inline
01256 IntVect
01257 BASISV (int dir)
01258 {
01259 CH_assert(dir >= 0 && dir < SpaceDim);
01260 IntVect tmp = IntVect::Zero ;
01261 tmp.vect[dir] = 1;
01262 return tmp;
01263 }
01264
01265 inline
01266 IntVect
01267 reflect (const IntVect& a,
01268 int ref_ix,
01269 int idir)
01270 {
01271 CH_assert(idir >= 0 && idir < SpaceDim);
01272 IntVect b(a);
01273 b.vect[idir] = -b.vect[idir] + 2*ref_ix;
01274 return b;
01275 }
01276
01277 inline
01278 IntVect
01279 coarsen (const IntVect& p,
01280 int s)
01281 {
01282 CH_assert(s > 0);
01283 return IntVect(
01284 D_DECL6((p.vect[0]<0) ? -abs(p.vect[0]+1)/s-1 : p.vect[0]/s ,
01285 (p.vect[1]<0) ? -abs(p.vect[1]+1)/s-1 : p.vect[1]/s ,
01286 (p.vect[2]<0) ? -abs(p.vect[2]+1)/s-1 : p.vect[2]/s ,
01287 (p.vect[3]<0) ? -abs(p.vect[3]+1)/s-1 : p.vect[3]/s ,
01288 (p.vect[4]<0) ? -abs(p.vect[4]+1)/s-1 : p.vect[4]/s ,
01289 (p.vect[5]<0) ? -abs(p.vect[5]+1)/s-1 : p.vect[5]/s ));
01290 }
01291
01292 inline
01293 IntVect
01294 coarsen (const IntVect& p1,
01295 const IntVect& p2)
01296 {
01297 CH_assert(p2 > IntVect::Zero);
01298 return IntVect(
01299 D_DECL6(
01300 (p1.vect[0]<0)?-abs(p1.vect[0]+1)/p2.vect[0]-1:p1.vect[0]/p2.vect[0],
01301 (p1.vect[1]<0)?-abs(p1.vect[1]+1)/p2.vect[1]-1:p1.vect[1]/p2.vect[1],
01302 (p1.vect[2]<0)?-abs(p1.vect[2]+1)/p2.vect[2]-1:p1.vect[2]/p2.vect[2],
01303 (p1.vect[3]<0)?-abs(p1.vect[3]+1)/p2.vect[3]-1:p1.vect[3]/p2.vect[3],
01304 (p1.vect[4]<0)?-abs(p1.vect[4]+1)/p2.vect[4]-1:p1.vect[4]/p2.vect[4],
01305 (p1.vect[5]<0)?-abs(p1.vect[5]+1)/p2.vect[5]-1:p1.vect[5]/p2.vect[5])
01306 );
01307 }
01308
01309 inline
01310 IntVect&
01311 IntVect::coarsen (int s)
01312 {
01313 CH_assert(s > 0);
01314 for (int i = 0; i < SpaceDim; ++i)
01315 vect[i] = ((vect[i]<0) ? -abs(vect[i]+1)/s-1 : vect[i]/s);
01316 return *this;
01317 }
01318
01319 inline
01320 IntVect&
01321 IntVect::coarsen (const IntVect& p)
01322 {
01323 CH_assert(p > IntVect::Zero);
01324 for (int i = 0; i <SpaceDim; ++i)
01325 {
01326 const int s = p.vect[i];
01327 vect[i] = ((vect[i]<0) ? -abs(vect[i]+1)/s-1 : vect[i]/s);
01328 }
01329 return *this;
01330 }
01331
01332 inline uint64_t IntVect::hash(const IntVect& origin, const IntVect& blockingFactor) const
01333 {
01334
01335 uint64_t answer = 0;
01336 #if CH_SPACEDIM >= 4
01337
01338 for(int idir = 0; idir < CH_SPACEDIM; idir++)
01339 {
01340 int bfact = 1;
01341 for(int jdir = 0; jdir < idir; jdir++)
01342 {
01343 bfact *= blockingFactor[jdir];
01344 }
01345 answer += origin[idir]*bfact;
01346 }
01347 #else
01348 uint32_t z=0, y=0, x;
01349 #if CH_SPACEDIM > 2
01350 z = (vect[2]-origin[2])/blockingFactor[2];
01351 #endif
01352 #if CH_SPACEDIM > 1
01353 y = (vect[1]-origin[1])/blockingFactor[1];
01354 #endif
01355 x = (vect[0]-origin[0])/blockingFactor[0];
01356 answer = morton256_z[(z >> 16) & 0xFF ] |
01357 morton256_y[(y >> 16) & 0xFF ] |
01358 morton256_x[(x >> 16) & 0xFF ];
01359 answer = answer << 48 | morton256_z[(z >> 8) & 0xFF ] |
01360 morton256_y[(y >> 8) & 0xFF ] |
01361 morton256_x[(x >> 8) & 0xFF ];
01362 answer = answer << 24 |
01363 morton256_z[(z) & 0xFF ] |
01364 morton256_y[(y) & 0xFF ] |
01365 morton256_x[(x) & 0xFF ];
01366 #endif
01367 return answer;
01368 }
01369 #endif
01370
01371 #include "NamespaceFooter.H"
01372 #endif