00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _INDEXEDMOMENTS_H_
00012 #define _INDEXEDMOMENTS_H_
00013
00014 #include "MayDay.H"
00015 #include "IndexTM.H"
00016 #include "Vector.H"
00017 #include "SPACE.H"
00018 #include "CH_EBIS_ORDER.H"
00019
00020 #include "NamespaceHeader.H"
00021 using std::map;
00022
00023 #define CH_IM_MAX_POWER 8
00024
00025
00026
00027
00028
00029
00030 template <int Dim, int P>
00031 class IndexedMoments
00032 {
00033 public:
00034
00035 IndexedMoments();
00036
00037
00038
00039 ~IndexedMoments() {};
00040
00041
00042
00043
00044 Real& operator[](int a_i)
00045 {
00046 return m_moms[a_i];
00047 };
00048
00049
00050
00051 const Real& operator[](int a_i) const
00052 {
00053 return m_moms[a_i];
00054 };
00055
00056
00057
00058 Real& operator[](const IndexTM<int,Dim>& a_index)
00059 {
00060 return m_moms[indexOf(a_index)];
00061 };
00062
00063
00064
00065 const Real& operator[](const IndexTM<int,Dim>& a_index) const
00066 {
00067 return m_moms[indexOf(a_index)];
00068 };
00069
00070
00071 IndexedMoments<Dim, P>& operator+=(const IndexedMoments<Dim, P>& increment);
00072
00073
00074 IndexedMoments<Dim, P>& operator*=(const Real& a_factor);
00075
00076
00077
00078 static int size()
00079 {
00080 if(!s_staticsSet)
00081 {
00082 setStatics();
00083 }
00084 return s_size;
00085 }
00086
00087
00088 static size_t linearSize()
00089 {
00090 int numReals = size();
00091
00092 size_t retval = numReals*sizeof(Real);
00093
00094
00095 retval += sizeof(int);
00096
00097 return retval;
00098 }
00099
00100 void linearOut(void* const a_outbuf) const
00101 {
00102 Real* realbuf = (Real*) a_outbuf;
00103 for(int ivec = 0; ivec < size(); ivec++)
00104 {
00105 *realbuf = m_moms[ivec];
00106 ++realbuf;
00107 }
00108 int* intbuf = (int *) realbuf;
00109 *intbuf = m_isRegular;
00110 }
00111
00112 void linearIn(const void* const a_inbuf)
00113 {
00114 Real* realbuf = (Real*) a_inbuf;
00115 for(int ivec = 0; ivec < size(); ivec++)
00116 {
00117 m_moms[ivec]= *realbuf;
00118 ++realbuf;
00119 }
00120 int* intbuf = (int *) realbuf;
00121 m_isRegular = *intbuf ;
00122 }
00123
00124
00125 void setRegular(const Real a_dx);
00126
00127
00128 void setToRegular(const Real a_dx)
00129 {
00130 setRegular(a_dx);
00131 }
00132
00133
00134 static const Vector<IndexTM<int,Dim> >& getMonomialPowers()
00135 {
00136 if(!s_staticsSet)
00137 {
00138 setStatics();
00139 }
00140 return s_multiIndicies;
00141 }
00142
00143
00144 bool isRegular() const
00145 {
00146 return (m_isRegular==1);
00147 }
00148
00149
00150 IndexedMoments<Dim, P>& operator=(const map<IndexTM<int, Dim>, Real>& a_mapin);
00151
00152
00153 IndexedMoments<Dim, P>& operator=(const IndexedMoments<Dim, P>& a_input)
00154 {
00155 if(&a_input != this)
00156 {
00157 m_isRegular = a_input.m_isRegular;
00158 m_moms = a_input.m_moms;
00159 }
00160 return *this;
00161 }
00162
00163
00164
00165
00166
00167
00168
00169
00170 void shift(const IndexTM<Real, Dim>& a_distance);
00171
00172
00173 void setToZero()
00174 {
00175 for(int ivec = 0; ivec < s_size; ivec++)
00176 {
00177 m_moms[ivec] = 0.;
00178 }
00179 }
00180
00181
00182 static int indexOf(IndexTM<int,Dim> a_index);
00183
00184
00185 static IndexTM<int,Dim> getIndex(const int& a_linearIndex)
00186 {
00187 return s_multiIndicies[a_linearIndex];
00188 }
00189
00190
00191 void spout() const;
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 void setToTruncatedMultiply(const IndexedMoments<Dim, P> & a_CA,
00205 const IndexedMoments<Dim, P> & a_CB);
00206
00207
00208
00209
00210 void divideByFactorial();
00211
00212
00213 void multiplyByFactorial();
00214
00215 protected:
00216
00217
00218 Real
00219 getMoment(const IndexTM<int, Dim> & a_mono,
00220 const map<IndexTM<int, Dim>, Real>& a_mapin) const;
00221
00222
00223 static void setStatics();
00224
00225
00226 static bool s_staticsSet;
00227
00228
00229 static int s_size;
00230
00231
00232 static Vector<IndexTM<int,Dim> > s_multiIndicies;
00233
00234
00235 static void setMultiIndicies();
00236
00237
00238 static void setSize();
00239
00240 private:
00241
00242
00243 int m_isRegular;
00244
00245
00246 Vector<Real> m_moms;
00247
00248 static const int s_max_sizes[][CH_IM_MAX_POWER+1];
00249 };
00250
00251
00252
00253 template<int Dim>
00254 int getIndMomLinearIndex(const IndexTM<int,Dim>& a_index,
00255 const int & a_order)
00256 {
00257 int retval= 0;
00258 if(a_order == 1)
00259 {
00260 retval = IndexedMoments<Dim, 1>::indexOf(a_index);
00261 }
00262 else if(a_order == 2)
00263 {
00264 retval = IndexedMoments<Dim, 2>::indexOf(a_index);
00265 }
00266 else if(a_order == 3)
00267 {
00268 retval = IndexedMoments<Dim, 3>::indexOf(a_index);
00269 }
00270 else if(a_order == 4)
00271 {
00272 retval = IndexedMoments<Dim, 4>::indexOf(a_index);
00273 }
00274 else
00275 {
00276 MayDay::Error("need to add more cases to getIndMomLinearIndex");
00277 }
00278 return retval;
00279 }
00280
00281
00282 template<int Dim>
00283 const IndexTM<int,Dim>
00284 getIndMomMultiIndex(const int & a_index,
00285 const int & a_order)
00286 {
00287 IndexTM<int,Dim> retval;
00288 if(a_order == 1)
00289 {
00290 retval = IndexedMoments<Dim,1>::getIndex(a_index);
00291 }
00292 else if(a_order == 2)
00293 {
00294 retval = IndexedMoments<Dim,2>::getIndex(a_index);
00295 }
00296 else if(a_order == 3)
00297 {
00298 retval = IndexedMoments<Dim,3>::getIndex(a_index);
00299 }
00300 else if(a_order == 4)
00301 {
00302 retval = IndexedMoments<Dim,4>::getIndex(a_index);
00303 }
00304 else
00305 {
00306 MayDay::Error("need to add more cases to getIndMomMultiIndex");
00307 }
00308 return retval;
00309 }
00310
00311
00312 template<int Dim>
00313 int
00314 getIndMomSize(const int & a_order)
00315 {
00316 int retval = 0;
00317 if(a_order == 1)
00318 {
00319 retval = IndexedMoments<Dim,1>::size();
00320 }
00321 else if(a_order == 2)
00322 {
00323 retval = IndexedMoments<Dim,2>::size();
00324 }
00325 else if(a_order == 3)
00326 {
00327 retval = IndexedMoments<Dim,3>::size();
00328 }
00329 else if(a_order == 4)
00330 {
00331 retval = IndexedMoments<Dim,4>::size();
00332 }
00333 else
00334 {
00335 MayDay::Error("need to add more cases to getIndMomSize");
00336 }
00337 return retval;
00338 }
00339
00340
00341 template<int Dim>
00342 bool allEven(const IndexTM<int, Dim>& a_p)
00343 {
00344 bool retval = true;
00345 for(int idir = 0; idir < Dim; idir++)
00346 {
00347 if(a_p[idir]%2 != 0)
00348 {
00349 retval = false;
00350 break;
00351 }
00352 }
00353 return retval;
00354 }
00355
00356
00357 template<int Dim>
00358 Real
00359 POW(const Real& a_x, const IndexTM<int, Dim> a_p)
00360 {
00361 Real retval = 1;
00362 for(int idir = 0; idir < Dim; idir++)
00363 {
00364 for(int iexp = 0; iexp < a_p[idir]; iexp++)
00365 {
00366 retval *= a_x;
00367 }
00368 }
00369 return retval;
00370 }
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382 template<int Dim, int ORDER>
00383 void
00384 checkMoments(IndexedMoments<Dim, ORDER> & a_moments,
00385 Vector<IndexTM<int, Dim> > & a_bogusPowers,
00386 const Real & a_dx,
00387 const Real & a_tolerance,
00388 const bool & a_ebMoment,
00389 const bool & a_bindMoments);
00390
00391
00392
00393
00394
00395 template <int Dim>
00396 bool allPositive(const IndexTM<int, Dim>& a_index);
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421 #include "NamespaceFooter.H"
00422
00423 #include "IndexedMomentsImplem.H"
00424
00425 #endif