00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _INDEXTM_H_
00012 #define _INDEXTM_H_
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <cstddef>
00025 #include <cstdlib>
00026 #include <cstring>
00027 #include <iostream>
00028 #include "SPACE.H"
00029 #include "REAL.H"
00030 #include "Misc.H"
00031 #include "GenericArithmetic.H"
00032 #include "NamespaceHeader.H"
00033
00034 class HDF5Handle;
00035
00036 template<typename T, int N> class IndexTM;
00037 template<typename T, int N> IndexTM<T,N> min(const IndexTM<T,N>& p1,
00038 const IndexTM<T,N>& p2);
00039 template<typename T, int N> IndexTM<T,N> max(const IndexTM<T,N>& p1,
00040 const IndexTM<T,N>& p2);
00041 template<typename T, int N> IndexTM<T,N> scale(const IndexTM<T,N>& p,
00042 T s);
00043
00044
00045 template<typename T, int N> IndexTM<T,N> reflect(const IndexTM<T,N>& a,
00046 T ref_ix,
00047 int idir);
00048 template<typename T, int N> IndexTM<T,N> diagShift(const IndexTM<T,N>& p,
00049 T s);
00050 template<typename T, int N> IndexTM<T,N> coarsen(const IndexTM<T,N>& p,
00051 T s);
00052 template<typename T, int N> IndexTM<T,N> coarsen(const IndexTM<T,N>& p1,
00053 const IndexTM<T,N>& p2);
00054 template<typename T, int N> std::ostream& operator<<(std::ostream& os,
00055 const IndexTM<T,N>& iv);
00056 template<typename T, int N> std::istream& operator>>(std::istream& os,
00057 IndexTM<T,N>& iv);
00058
00060
00068 template<typename T, int N> IndexTM<T,N> BASISV_TM(int dir);
00069
00070 template<typename T, int N=CH_SPACEDIM> class IndexTM
00071 : public GenericArithmeticable< T,IndexTM<T,N> >
00072 {
00073 public:
00079
00081
00084 IndexTM() : GenericArithmeticable< T, IndexTM<T,N> >( this )
00085 {}
00086
00088
00091 ~IndexTM()
00092 {}
00093
00094
00095
00096 explicit IndexTM( T i );
00097 IndexTM( T i, T j );
00098 IndexTM( T i, T j, T k );
00099 IndexTM( T i, T j, T k, T m );
00100 IndexTM( T i, T j, T k, T m, T n );
00101 IndexTM( T i, T j, T k, T m, T n, T p );
00102
00103
00105
00109 explicit IndexTM (const T* a);
00110
00112
00115 IndexTM (const IndexTM& rhs);
00116
00117 IndexTM copy() const {return *this;}
00118
00119
00120
00122
00125 IndexTM& operator= (const IndexTM& rhs);
00126
00128
00132 inline
00133 T& operator[] (int i);
00134
00136
00139 inline
00140 T operator[] (int i) const;
00141
00143
00146 void setVal (int i,
00147 T val);
00148
00150
00153 void setAll(T val);
00154
00161
00163
00167 const T* getVect () const;
00168
00170
00173 const T* dataPtr() const;
00174
00176
00179 T* dataPtr();
00180
00187
00189
00193 bool operator== (const IndexTM& p) const;
00194
00196
00200 bool operator!= (const IndexTM& p) const;
00201
00203
00216 bool lexLT (const IndexTM& s) const;
00217
00219
00232 bool lexGT (const IndexTM& s) const;
00233
00240
00242
00245 IndexTM operator+ () const;
00246
00248
00251 IndexTM operator- () const;
00252
00254 T dotProduct( const IndexTM& a_rhs ) const;
00255
00257
00260 T sum () const;
00261
00263
00266 T product () const;
00267
00274 template<typename OP> bool operatorCompare(const IndexTM<T,N>&, const OP&) const;
00275 template<typename OP> IndexTM<T,N>& operatorOpEquals(
00276 const IndexTM<T,N>&, const OP&);
00277 template<typename OP> IndexTM<T,N>& operatorOpEquals(const T&, const OP&);
00278
00280
00283 IndexTM& reciprocal();
00284
00285
00287
00291 int minDir(bool a_doAbs) const;
00292
00294
00298 int maxDir(bool a_doAbs) const;
00299
00300
00307
00309
00313 IndexTM& min (const IndexTM& p);
00314
00316
00320 IndexTM& max (const IndexTM& p);
00321
00323
00326 IndexTM& scale (T s);
00327
00329
00334 IndexTM& reflect(T ref_ix,
00335 int idir);
00336
00338
00342 IndexTM& shift (int coord,
00343 T s);
00344
00346
00350 IndexTM& shift (const IndexTM& iv);
00351
00353
00357 IndexTM& diagShift (T s);
00358
00360
00363 IndexTM& coarsen (const IndexTM& p);
00364
00366
00369 IndexTM& coarsen (T p);
00370
00377
00379
00382 void printOn (std::ostream& os) const;
00383
00385
00388 void p() const;
00389
00391
00394 void dumpOn (std::ostream& os) const;
00395
00397
00400 friend std::ostream& operator<< <>(std::ostream& os,
00401 const IndexTM& iv);
00402
00404
00407 friend std::istream& operator>> <> (std::istream& os,
00408 IndexTM& iv);
00409
00416
00420 static const IndexTM Zero;
00421
00425 static const IndexTM Unit;
00426
00430 static int InitStatics();
00431
00432
00436 void linearIn( const void* inBuf );
00437 void linearOut( void* outBuf ) const;
00438
00441 protected:
00442 friend class HDF5Handle;
00443
00447 T vect[N];
00448 };
00449
00450
00457 template<typename T> struct IndexTraits
00458 {
00459 static bool const isInt=false;
00460 static bool const isReal=false;
00461 };
00462 template<> struct IndexTraits<int>
00463 {
00464 static bool const isInt=true;
00465 static bool const isReal=false;
00466 };
00467 template<> struct IndexTraits<Real>
00468 {
00469 static bool const isInt=false;
00470 static bool const isReal=true;
00471 };
00472
00473
00474
00475
00476
00477
00478
00479
00480 static int s_dummyForIntVectH1( IndexTM<int,1>::InitStatics() );
00481 static int s_dummyForIntVectH2( IndexTM<int,2>::InitStatics() );
00482 static int s_dummyForIntVectH3( IndexTM<int,3>::InitStatics() );
00483 static int s_dummyForIntVectH4( IndexTM<int,4>::InitStatics() );
00484 static int s_dummyForIntVectH5( IndexTM<int,5>::InitStatics() );
00485 static int s_dummyForIntVectH6( IndexTM<int,6>::InitStatics() );
00486 static int s_dummyForRealVectH1( IndexTM<Real,1>::InitStatics() );
00487 static int s_dummyForRealVectH2( IndexTM<Real,2>::InitStatics() );
00488 static int s_dummyForRealVectH3( IndexTM<Real,3>::InitStatics() );
00489 static int s_dummyForRealVectH4( IndexTM<Real,4>::InitStatics() );
00490 static int s_dummyForRealVectH5( IndexTM<Real,5>::InitStatics() );
00491 static int s_dummyForRealVectH6( IndexTM<Real,6>::InitStatics() );
00492
00493 #include "NamespaceFooter.H"
00494 #include "IndexTMI.H"
00495
00496 #endif // include guard