00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013 #ifndef _BASEEBFACEFAB_H_
00014 #define _BASEEBFACEFAB_H_
00015
00016 #include <cmath>
00017 #include <cstdlib>
00018 #include "SPACE.H"
00019 #include "Vector.H"
00020 #include "MiniIFFAB.H"
00021 #include "IntVectSet.H"
00022 #include "BaseFab.H"
00023 #include "EBISBox.H"
00024 #include "NamespaceHeader.H"
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 template <class T>
00043 class BaseEBFaceFAB
00044 {
00045 public:
00046
00047
00048 int numDataTypes() const
00049 {
00050 return 2;
00051 }
00052
00053
00054 int dataType(const BaseIndex& a_baseInd) const
00055 {
00056 const FaceIndex* vofPtr = dynamic_cast<const FaceIndex *>(&a_baseInd);
00057 if (vofPtr == NULL) MayDay::Error("Trying to index into an EBCellFAB with something that is not a FaceIndex");
00058 int retval = 0;
00059 const Vector<FaceIndex>& irrfaces =m_irrFAB.getFaces();
00060 for (int iface = 0; iface < irrfaces.size(); iface++)
00061 {
00062 if (irrfaces[iface] == *vofPtr)
00063 {
00064 retval = 1;
00065 break;
00066 }
00067 }
00068 return retval;
00069 }
00070
00071
00072 long offset(const BaseIndex& a_baseInd, const int a_ivar) const
00073 {
00074 const FaceIndex* vofPtr = dynamic_cast<const FaceIndex *>(&a_baseInd);
00075 if (vofPtr == NULL) MayDay::Error("Trying to index into an EBCellFAB with something that is not a FaceIndex");
00076 bool irreg = false;
00077 const Vector<FaceIndex>& irrfaces =m_irrFAB.getFaces();
00078 for (int iface = 0; iface < irrfaces.size(); iface++)
00079 {
00080 if (irrfaces[iface] == *vofPtr)
00081 {
00082 irreg = true;
00083 break;
00084 }
00085 }
00086 long retval = 0;
00087 if (irreg)
00088 {
00089 retval = m_irrFAB.offset(*vofPtr, a_ivar);
00090 }
00091 else
00092 {
00093 retval = m_regFAB.offset(vofPtr->gridIndex(Side::Hi), a_ivar);
00094 }
00095 return retval;
00096 }
00097
00098
00099 T* dataPtr(int a_dataType, int a_ivar)
00100 {
00101 if (a_dataType == 0)
00102 {
00103 return m_regFAB.dataPtr(a_ivar);
00104 }
00105 else if (a_dataType == 1)
00106 {
00107 return m_irrFAB.dataPtr(a_ivar);
00108 }
00109 else
00110 {
00111 MayDay::Error("bogus datatype input into dataPtr");
00112 }
00113 return NULL;
00114 }
00115
00116 const T* dataPtr(int a_dataType, int a_ivar) const
00117 {
00118 if (a_dataType == 0)
00119 {
00120 return m_regFAB.dataPtr(a_ivar);
00121 }
00122 else if (a_dataType == 1)
00123 {
00124 return m_irrFAB.dataPtr(a_ivar);
00125 }
00126 else
00127 {
00128 MayDay::Error("bogus datatype input into dataPtr");
00129 }
00130 return NULL;
00131
00132 }
00133
00134
00135 BaseEBFaceFAB();
00136
00137
00138
00139
00140
00141
00142 BaseEBFaceFAB(const EBISBox& a_ebisBox,
00143 const Box& a_region,
00144 int a_iDir, int a_nVar);
00145
00146
00147
00148
00149
00150
00151 virtual void
00152 define(const EBISBox& a_ebisBox,
00153 const Box& a_region,
00154 int a_iDir, int a_nVar);
00155
00156
00157 virtual ~BaseEBFaceFAB();
00158
00159
00160 void clear();
00161
00162
00163 void setVal(const T& value);
00164
00165
00166 void setVal(int ivar,const T& value);
00167
00168
00169 bool isDefined() const;
00170
00171
00172 int nComp() const ;
00173
00174
00175 const MiniIFFAB<T>& getMultiValuedFAB() const;
00176
00177
00178 MiniIFFAB<T>& getMultiValuedFAB() ;
00179
00180
00181 const BaseFab<T>& getSingleValuedFAB() const;
00182
00183
00184 BaseFab<T>& getSingleValuedFAB() ;
00185
00186
00187 int direction() const;
00188
00189
00190
00191
00192
00193 const Box& getRegion() const ;
00194
00195
00196
00197
00198
00199 const Box& getCellRegion() const ;
00200
00201
00202 T& operator() (const FaceIndex& a_facein, int a_nVarLoc);
00203
00204
00205 const T&
00206 operator() (const FaceIndex& a_facein, int a_nVarLoc) const;
00207
00208
00209 static bool preAllocatable()
00210 {
00211 return true;
00212 }
00213
00214
00215
00216
00217
00218
00219 void copy(const Box& RegionFrom,
00220 const Interval& destInt,
00221 const Box& RegionTo,
00222 const BaseEBFaceFAB<T>& source,
00223 const Interval& srcInt);
00224
00225 BaseEBFaceFAB<T>& copy(const BaseEBFaceFAB<T>& source);
00226
00227 int size(const Box& R, const Interval& comps) const;
00228
00229 void linearOut(void* buf, const Box& R, const Interval& comps) const;
00230
00231 void linearIn(void* buf, const Box& R, const Interval& comps);
00232
00233
00234 BaseEBFaceFAB(const Box& a_region, int a_nVar)
00235 {
00236 MayDay::Error("invalid constructor called for BaseEBFaceFAB");
00237 }
00238
00239
00240 const EBISBox& getEBISBox() const;
00241
00242
00243 void
00244 setCoveredFaceVal(const T& a_val,
00245 const int& a_comp,
00246 const bool& a_doMulti=true);
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 BaseEBFaceFAB(const Interval& a_comps,
00263 BaseEBFaceFAB<T>& a_original);
00264 protected:
00265
00266 MiniIFFAB<T> m_irrFAB;
00267
00268 BaseFab<T> m_regFAB;
00269
00270
00271 int m_nComp;
00272
00273
00274 int m_iDir;
00275
00276
00277 Box m_regionFace;
00278
00279
00280 Box m_region;
00281
00282
00283 bool m_isDefined;
00284
00285 EBISBox m_ebisBox;
00286 private:
00287 void
00288 setDefaultValues();
00289
00290 void operator= (const BaseEBFaceFAB<T>& ebcin)
00291 {
00292 MayDay::Error("BaseEBFaceFAB<T>::operator= not defined");
00293 }
00294 BaseEBFaceFAB (const BaseEBFaceFAB<T>& ebcin)
00295 {
00296 MayDay::Error("BaseEBFaceFAB<T> copy constructor not defined");
00297 }
00298 };
00299
00300 #include "NamespaceFooter.H"
00301
00302 #ifndef CH_EXPLICIT_TEMPLATES
00303 #include "BaseEBFaceFABI.H"
00304 #endif // CH_EXPLICIT_TEMPLATES
00305
00306 #endif