00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013 #ifndef _BASEEBFACEFABI_H_
00014 #define _BASEEBFACEFABI_H_
00015
00016 #include "BoxIterator.H"
00017 #include "NamespaceHeader.H"
00018
00019
00020
00021 template <class T>
00022 void
00023 BaseEBFaceFAB<T>::setCoveredFaceVal(const T& a_val,
00024 const int& a_comp,
00025 const bool& a_doMulti)
00026 {
00027 CH_assert(a_comp >= 0);
00028 CH_assert(a_comp < m_nComp);
00029
00030 if (m_ebisBox.isAllRegular())
00031 {
00032 return;
00033 }
00034 else if (m_ebisBox.isAllCovered())
00035 {
00036 m_regFAB.setVal(a_val, a_comp);
00037 }
00038 else
00039 {
00040 for (BoxIterator bit(m_region); bit.ok(); ++bit)
00041 {
00042 const IntVect& ivCell = bit();
00043 for (SideIterator sit; sit.ok(); ++sit)
00044 {
00045 const Vector< FaceIndex >& faces = m_ebisBox.getAllFaces(ivCell,m_iDir,sit());
00046 if ( (faces.size()==0) || (faces.size()>1) )
00047 {
00048 const int& hilo = sign(sit());
00049 IntVect ivFace = ivCell;
00050 if (hilo == 1)
00051 {
00052 ivFace[m_iDir] += 1;
00053 }
00054 m_regFAB(ivFace,a_comp) = a_val;
00055 }
00056 }
00057 }
00058 }
00059 }
00060
00061
00062 template <class T>
00063 int
00064 BaseEBFaceFAB<T>::size(const Box& R, const Interval& comps) const
00065 {
00066
00067 Box RFace = surroundingNodes(R, m_iDir);
00068 int retval = m_regFAB.size(RFace, comps);
00069 retval += m_irrFAB.size(R, comps);
00070 return retval;
00071 }
00072
00073
00074 template <class T>
00075 void
00076 BaseEBFaceFAB<T>::linearOut(void* buf, const Box& R, const Interval& comps)
00077 const
00078 {
00079 Box RFace = surroundingNodes(R, m_iDir);
00080 unsigned char* buffer = (unsigned char*)buf;
00081 m_regFAB.linearOut(buffer, RFace, comps);
00082 buffer+= m_regFAB.size(RFace, comps);
00083 m_irrFAB.linearOut(buffer, R, comps);
00084 }
00085
00086 template <class T>
00087 void
00088 BaseEBFaceFAB<T>::linearIn(void* buf, const Box& R, const Interval& comps)
00089 {
00090 Box RFace = surroundingNodes(R, m_iDir);
00091 unsigned char* buffer = (unsigned char*)buf;
00092 m_regFAB.linearIn(buffer, RFace, comps);
00093 buffer+= m_regFAB.size(RFace, comps);
00094 m_irrFAB.linearIn(buffer, R, comps);
00095 }
00096
00097
00098 template <class T> inline
00099 const EBISBox&
00100 BaseEBFaceFAB<T>::getEBISBox() const
00101 {
00102 return m_ebisBox;
00103 }
00104
00105 template <class T>
00106 BaseEBFaceFAB<T>&
00107 BaseEBFaceFAB<T>::copy(const BaseEBFaceFAB<T>& a_src)
00108 {
00109 CH_assert(isDefined());
00110 CH_assert(a_src.isDefined());
00111 CH_assert(m_nComp <= a_src.m_nComp);
00112 CH_assert(m_region.sameType(a_src.m_region));
00113
00114 Interval comps(0,m_nComp-1);
00115
00116 Box overlap(m_region);
00117 overlap &= a_src.m_region;
00118
00119 this->copy(overlap,comps,overlap,a_src,comps);
00120
00121 return *this;
00122 }
00123
00124
00125 template <class T>
00126 inline void
00127 BaseEBFaceFAB<T>::copy(const Box& a_regionFrom,
00128 const Interval& a_dstInt,
00129 const Box& a_regionTo,
00130 const BaseEBFaceFAB<T>& a_src,
00131 const Interval& a_srcInt)
00132 {
00133
00134 CH_assert(isDefined());
00135 CH_assert(a_dstInt.size()==a_srcInt.size());
00136 CH_assert(a_regionTo.cellCentered());
00137 CH_assert(a_src.m_iDir ==m_iDir);
00138 CH_assert(a_dstInt.begin()>=0);
00139 CH_assert(a_srcInt.begin()>=0);
00140 CH_assert(a_srcInt.end()< a_src.m_nComp);
00141 CH_assert(a_dstInt.end()< m_nComp);
00142 CH_assert(a_src.m_region.contains(a_regionFrom));
00143 CH_assert(m_region.contains(a_regionTo));
00144 Box RFromCell = a_regionFrom;
00145 Box RFromFace = surroundingNodes(RFromCell, m_iDir);
00146 Box RToCell = a_regionTo;
00147 Box RToFace = surroundingNodes(RToCell, m_iDir);
00148
00149 CH_assert(m_regionFace.contains(RToFace));
00150 CH_assert(a_src.m_regionFace.contains(RFromFace));
00151
00152
00153 m_regFAB.copy(RFromFace, a_dstInt, RToFace, a_src.m_regFAB, a_srcInt);
00154
00155
00156 m_irrFAB.copy(RFromCell, a_dstInt, RToCell, a_src.m_irrFAB, a_srcInt);
00157 }
00158
00159
00160 template <class T> inline
00161 BaseEBFaceFAB<T>::BaseEBFaceFAB()
00162 {
00163 setDefaultValues();
00164 }
00165
00166
00167
00168 template <class T> inline
00169 BaseEBFaceFAB<T>::BaseEBFaceFAB(const EBISBox& a_ebisBox,
00170 const Box& a_region,
00171 int a_iDir, int a_nComp)
00172 {
00173 setDefaultValues();
00174 define(a_ebisBox, a_region, a_iDir, a_nComp);
00175 }
00176
00177
00178
00179 template <class T> inline
00180 void
00181 BaseEBFaceFAB<T>::define(const EBISBox& a_ebisBox,
00182 const Box& a_region,
00183 int a_iDir, int a_nComp)
00184 {
00185 clear();
00186 m_isDefined = true;
00187 CH_assert(a_region.cellCentered());
00188 CH_assert(!a_region.isEmpty());
00189 CH_assert(a_nComp > 0);
00190 CH_assert((a_iDir >= 0) && (a_iDir < SpaceDim));
00191
00192 m_ebisBox = a_ebisBox;
00193 m_region = a_region;
00194 m_region &= a_ebisBox.getDomain().domainBox();
00195 CH_assert(!m_region.isEmpty());
00196
00197 CH_assert(a_ebisBox.getRegion().contains(m_region));
00198
00199 m_nComp = a_nComp;
00200 m_iDir = a_iDir;
00201 m_regionFace= surroundingNodes(m_region, a_iDir);
00202 Box grownRegion = m_region;
00203 grownRegion.grow(a_iDir, 1);
00204 grownRegion &= a_ebisBox.getDomain().domainBox();
00205
00206 CH_assert(a_ebisBox.getRegion().contains(grownRegion));
00207
00208 m_regFAB.resize(m_regionFace, m_nComp);
00209
00210 m_irrFAB.define(a_region, m_ebisBox.getEBGraph(), m_iDir, m_nComp);
00211 }
00212
00213
00214
00215 template <class T> inline
00216 BaseEBFaceFAB<T>::~BaseEBFaceFAB()
00217 {
00218 clear();
00219 }
00220
00221
00222
00223 template <class T> inline
00224 void
00225 BaseEBFaceFAB<T>::clear()
00226 {
00227 m_irrFAB.clear();
00228 m_regFAB.clear();
00229 m_isDefined = false;
00230 }
00231
00232
00233
00234 template <class T> inline
00235 void
00236 BaseEBFaceFAB<T>::setVal(const T& value)
00237 {
00238 m_irrFAB.setVal(value);
00239 m_regFAB.setVal(value);
00240 }
00241
00242
00243 template <class T> inline
00244 void
00245 BaseEBFaceFAB<T>::setVal(int ivar, const T& value)
00246 {
00247 m_irrFAB.setVal(ivar, value);
00248 m_regFAB.setVal(value, m_regFAB.box(), ivar, 1);
00249 }
00250
00251
00252
00253 template <class T> inline
00254 bool
00255 BaseEBFaceFAB<T>::isDefined() const
00256 {
00257 return (m_isDefined);
00258 }
00259
00260
00261
00262 template <class T> inline
00263 int
00264 BaseEBFaceFAB<T>::nComp() const
00265 {
00266 CH_assert(isDefined());
00267 return m_nComp;
00268 }
00269
00270
00271
00272 template <class T> inline
00273 const MiniIFFAB<T>&
00274 BaseEBFaceFAB<T>::getMultiValuedFAB() const
00275 {
00276 CH_assert(isDefined());
00277 return m_irrFAB;
00278 }
00279
00280
00281
00282 template <class T> inline
00283 MiniIFFAB<T>&
00284 BaseEBFaceFAB<T>::getMultiValuedFAB()
00285 {
00286 CH_assert(isDefined());
00287 return m_irrFAB;
00288 }
00289
00290
00291
00292 template <class T> inline
00293 const BaseFab<T>&
00294 BaseEBFaceFAB<T>::getSingleValuedFAB() const
00295 {
00296 CH_assert(isDefined());
00297 return m_regFAB;
00298 }
00299
00300
00301
00302 template <class T> inline
00303 BaseFab<T>&
00304 BaseEBFaceFAB<T>::getSingleValuedFAB()
00305 {
00306 CH_assert(isDefined());
00307 return m_regFAB;
00308 }
00309
00310
00311
00312 template <class T> inline
00313 int
00314 BaseEBFaceFAB<T>::direction() const
00315 {
00316 CH_assert(isDefined());
00317 return m_iDir;
00318 }
00319
00320
00321
00322 template <class T> inline
00323 const Box&
00324 BaseEBFaceFAB<T>::getRegion() const
00325 {
00326 CH_assert(isDefined());
00327 return m_regionFace;
00328 }
00329
00330
00331 template <class T> inline
00332 const Box&
00333 BaseEBFaceFAB<T>::getCellRegion() const
00334 {
00335 CH_assert(isDefined());
00336 return m_region;
00337 }
00338
00339
00340
00341 template <class T> inline
00342 T&
00343 BaseEBFaceFAB<T>::operator()(const FaceIndex& a_facein, int a_nCompLoc)
00344 {
00345 CH_assert(isDefined());
00346 CH_assert((a_nCompLoc >= 0)&&(a_nCompLoc < m_nComp));
00347 const IntVect& ivhi = a_facein.gridIndex(Side::Hi);
00348 CH_assert(m_regionFace.contains(ivhi));
00349
00350 const Vector<FaceIndex>& multiFaces = m_irrFAB.getFaces();
00351 T* returnval;
00352
00353 bool isFaceHere = false;
00354 for (int iface = 0; iface< multiFaces.size(); iface++)
00355 {
00356 const FaceIndex& face = multiFaces[iface];
00357 if (face == a_facein)
00358 {
00359 isFaceHere = true;
00360 }
00361 }
00362 if (isFaceHere)
00363 {
00364 returnval = &m_irrFAB(a_facein, a_nCompLoc);
00365 }
00366 else
00367 {
00368 returnval = &m_regFAB(ivhi, a_nCompLoc);
00369 }
00370 return *returnval;
00371 }
00372
00373
00374
00375 template <class T> inline
00376 const T&
00377 BaseEBFaceFAB<T>::operator() (const FaceIndex& a_facein, int a_nCompLoc) const
00378 {
00379 CH_assert(isDefined());
00380 CH_assert((a_nCompLoc >= 0)&&(a_nCompLoc < m_nComp));
00381 const IntVect& ivhi = a_facein.gridIndex(Side::Hi);
00382 CH_assert(m_regionFace.contains(ivhi));
00383
00384 const Vector<FaceIndex>& multiFaces = m_irrFAB.getFaces();
00385 const T* returnval;
00386
00387 bool isFaceHere = false;
00388 for (int iface = 0; iface< multiFaces.size(); iface++)
00389 {
00390 const FaceIndex& face = multiFaces[iface];
00391 if (face == a_facein)
00392 {
00393 isFaceHere = true;
00394 }
00395 }
00396 if (isFaceHere)
00397 {
00398 returnval = &m_irrFAB(a_facein, a_nCompLoc);
00399 }
00400 else
00401 {
00402 returnval = &m_regFAB(ivhi, a_nCompLoc);
00403 }
00404 return *returnval;
00405 }
00406
00407
00408
00409 template <class T> inline
00410 void
00411 BaseEBFaceFAB<T>::setDefaultValues()
00412 {
00413 m_isDefined = false;
00414 m_nComp = -1;
00415 m_iDir = -1;
00416 }
00417
00418 #include "NamespaceFooter.H"
00419 #endif