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