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 #include <cstddef>
00024 #include <cstdlib>
00025 #include <cstring>
00026 #include <iostream>
00027
00028 #include "REAL.H"
00029 #include "Misc.H"
00030 #include "GenericArithmetic.H"
00031
00032 #include "BaseNamespaceHeader.H"
00033
00034
00035
00036 template<typename T, int N> class IndexTM;
00037
00038 template<typename T, int N> IndexTM<T,N> min(const IndexTM<T,N> & a_p1,
00039 const IndexTM<T,N> & a_p2);
00040
00041 template<typename T, int N> IndexTM<T,N> max(const IndexTM<T,N> & a_p1,
00042 const IndexTM<T,N> & a_p2);
00043
00044 template<typename T, int N> IndexTM<T,N> scale(const IndexTM<T,N> & a_p,
00045 T a_s);
00046
00047
00048
00049
00050 template<typename T, int N> IndexTM<T,N> reflect(const IndexTM<T,N> & a_a,
00051 T a_refIx,
00052 int a_idir);
00053
00054 template<typename T, int N> IndexTM<T,N> diagShift(const IndexTM<T,N> & a_p,
00055 T a_s);
00056
00057 template<typename T, int N> IndexTM<T,N> coarsen(const IndexTM<T,N> & a_p,
00058 T a_s);
00059
00060 template<typename T, int N> IndexTM<T,N> coarsen(const IndexTM<T,N> & a_p1,
00061 const IndexTM<T,N> & a_p2);
00062
00063 template<typename T, int N> std::ostream& operator<<(std::ostream & a_os,
00064 const IndexTM<T,N> & a_iv);
00065
00066 template<typename T, int N> std::istream& operator>>(std::istream & a_os,
00067 IndexTM<T,N> & a_iv);
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 template<typename T, int N> IndexTM<T,N> BASISV_TM(int a_dir);
00079
00080 template<typename T, int N=CH_SPACEDIM> class IndexTM: public GenericArithmeticable< T,IndexTM<T,N> >
00081 {
00082 public:
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 IndexTM() : GenericArithmeticable< T, IndexTM<T,N> >(this)
00094 {
00095 }
00096
00097
00098
00099
00100
00101 ~IndexTM()
00102 {
00103 }
00104
00105
00106
00107 explicit
00108 IndexTM(T a_i);
00109 IndexTM(T a_i, T a_j);
00110 IndexTM(T a_i, T a_j, T a_k);
00111 IndexTM(T a_i, T a_j, T a_k, T a_l);
00112 IndexTM(T a_i, T a_j, T a_k, T a_l, T a_m);
00113 IndexTM(T a_i, T a_j, T a_k, T a_l, T a_m, T a_n);
00114
00115
00116
00117
00118
00119
00120 explicit IndexTM(const T* a_a);
00121
00122
00123
00124
00125
00126 IndexTM(const IndexTM & a_rhs);
00127
00128 IndexTM copy() const
00129 {
00130 return *this;
00131 }
00132
00133
00134
00135
00136
00137
00138
00139 IndexTM& operator=(const IndexTM & a_rhs);
00140
00141
00142
00143
00144
00145
00146 inline T& operator[](int a_i);
00147
00148
00149
00150
00151
00152 inline T operator[](int a_i) const;
00153
00154
00155
00156
00157
00158 void setVal(int a_i,
00159 T a_val);
00160
00161
00162
00163
00164
00165 void setAll(T a_val);
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 const T* getVect() const;
00180
00181
00182
00183
00184
00185 const T* dataPtr() const;
00186
00187
00188
00189
00190
00191 T* dataPtr();
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 bool operator==(const IndexTM & a_p) const;
00206
00207
00208
00209
00210
00211
00212 bool operator!=(const IndexTM & a_p) const;
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 bool lexLT(const IndexTM & a_s) const;
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244 bool operator<(const IndexTM & a_s) const
00245 {
00246 return lexLT(a_s);
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 bool componentwiseLE(const IndexTM& a_s)
00258 {
00259 bool retval = true;
00260 for (int idir = 0; idir < N; idir++)
00261 {
00262 retval = (retval && ((*this)[idir] <= a_s[idir]));
00263 }
00264 return retval;
00265 }
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280 bool lexGT(const IndexTM & a_s) const;
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293 IndexTM operator+() const;
00294
00295
00296
00297
00298
00299 IndexTM operator-() const;
00300
00301
00302 T dotProduct(const IndexTM & a_rhs) const;
00303
00304
00305
00306
00307
00308 T sum() const;
00309
00310
00311
00312
00313
00314 T product() const;
00315
00316
00317
00318
00319
00320
00321 template<typename OP> bool operatorCompare(const IndexTM<T,N> & a_p,
00322 const OP & a_op) const;
00323
00324 template<typename OP> IndexTM<T,N>& operatorOpEquals(const IndexTM<T,N> & a_p,
00325 const OP & a_op);
00326
00327 template<typename OP> IndexTM<T,N>& operatorOpEquals(const T & a_p,
00328 const OP & a_op);
00329
00330
00331
00332
00333
00334 IndexTM& reciprocal();
00335
00336
00337
00338
00339
00340
00341 int minDir(bool a_doAbs) const;
00342
00343
00344
00345
00346
00347
00348 int maxDir(bool a_doAbs) const;
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 IndexTM& min(const IndexTM & a_p);
00361
00362
00363
00364
00365
00366
00367 IndexTM& max(const IndexTM & a_p);
00368
00369
00370
00371
00372
00373 IndexTM& scale(T a_s);
00374
00375
00376
00377
00378
00379
00380
00381 IndexTM& reflect(T a_refIx,
00382 int a_idir);
00383
00384
00385
00386
00387
00388
00389 IndexTM& shift(int a_coord,
00390 T a_s);
00391
00392
00393
00394
00395
00396
00397 IndexTM& shift(const IndexTM & a_iv);
00398
00399
00400
00401
00402
00403
00404 IndexTM& diagShift(T a_s);
00405
00406
00407
00408
00409
00410 IndexTM& coarsen(const IndexTM & a_p);
00411
00412
00413
00414
00415
00416 IndexTM& coarsen(T a_p);
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429 void printOn(std::ostream & a_os) const;
00430
00431
00432
00433
00434
00435 void p() const;
00436
00437
00438
00439
00440
00441 void dumpOn(std::ostream & a_os) const;
00442
00443
00444
00445
00446
00447 friend std::ostream& operator<< <>(std::ostream & a_os,
00448 const IndexTM & a_iv);
00449
00450
00451
00452
00453
00454 friend std::istream& operator>> <> (std::istream & a_os,
00455 IndexTM & a_iv);
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467 static const IndexTM Zero;
00468
00469
00470
00471
00472 static const IndexTM Unit;
00473
00474
00475
00476
00477 static int InitStatics();
00478
00479
00480
00481
00482 void linearIn(const void* a_inBuf);
00483
00484 void linearOut(void* a_outBuf) const;
00485
00486
00487
00488
00489 T integer_factorial(int n) const
00490 {
00491 CH_assert(n >= 0);
00492 T retval;
00493 if(n== 1 || n== 0)
00494 {
00495 retval = 1;
00496 }
00497 else
00498 {
00499 retval = integer_factorial(n-1)*n;
00500 }
00501 return retval;
00502 }
00503
00504
00505 T factorial() const
00506 {
00507 int retval = 1;
00508 for(int idir = 0; idir < N; idir++)
00509 {
00510 retval *= integer_factorial(m_vect[idir]);
00511 }
00512 return retval;
00513 }
00514 protected:
00515 IndexTM(const char*);
00516
00517
00518
00519
00520
00521
00522 T m_vect[N];
00523 };
00524
00525
00526
00527
00528
00529
00530
00531 template<typename T> struct IndexTraits
00532 {
00533 static bool const m_isInt=false;
00534 static bool const m_isReal=false;
00535 };
00536 template<> struct IndexTraits<int>
00537 {
00538 static bool const m_isInt=true;
00539 static bool const m_isReal=false;
00540 };
00541 template<> struct IndexTraits<Real>
00542 {
00543 static bool const m_isInt=false;
00544 static bool const m_isReal=true;
00545 };
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569 template <typename T, int N> const IndexTM<T,N> IndexTM<T,N>::Zero("0");
00570 template <typename T, int N> const IndexTM<T,N> IndexTM<T,N>::Unit("1");
00571
00572 #include "BaseNamespaceFooter.H"
00573
00574 #include "IndexTMI.H"
00575
00576 #endif // include guard