00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _BASEIVFAB_H_
00012 #define _BASEIVFAB_H_
00013
00014 #include <cmath>
00015 #include <cstdlib>
00016 #include "SPACE.H"
00017 #include "Vector.H"
00018 #include "IntVectSet.H"
00019 #include "VolIndex.H"
00020 #include "BaseIndex.H"
00021 #include "BaseFab.H"
00022 #include "EBGraph.H"
00023 #include "NamespaceHeader.H"
00024
00025
00026
00027
00028
00029
00030
00031 template <class T>
00032 class BaseIVFAB
00033 {
00034 public:
00035
00036
00037
00038
00039
00040 BaseIVFAB();
00041
00042
00043
00044
00045
00046
00047
00048
00049 BaseIVFAB(const IntVectSet& a_region,
00050 const EBGraph& a_ebgraph,
00051 const int& a_nvarin);
00052
00053
00054 int numDataTypes() const
00055 {
00056 return 1;
00057 }
00058
00059 int dataType(const BaseIndex& a_baseInd) const
00060 {
00061 return 0;
00062 }
00063
00064 T* dataPtr(int a_dataType, int a_ivar)
00065 {
00066 return dataPtr(a_ivar);
00067 }
00068
00069 const T* dataPtr(int a_dataType, int a_ivar) const
00070 {
00071 return dataPtr(a_ivar);
00072 }
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 BaseIVFAB(const Interval& a_comps,
00091 BaseIVFAB<T>& a_original);
00092
00093
00094
00095 virtual ~BaseIVFAB();
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 virtual void define(const IntVectSet& a_region,
00106 const EBGraph& a_ebgraph,
00107 const int& a_nvarin);
00108
00109
00110
00111
00112
00113 void setVal(const T& value);
00114
00115
00116
00117
00118
00119 void setVal(int ivar, const T& value);
00120
00121
00122
00123
00124
00125 void setVal(const T& a_value,
00126 const Box& a_box,
00127 int a_nstart,
00128 int a_numcomp);
00129
00130 void copy(const Box& a_fromBox,
00131 const Interval& a_destInterval,
00132 const Box& a_toBox,
00133 const BaseIVFAB<T>& a_src,
00134 const Interval& a_srcInterval);
00135
00136
00137
00138
00139
00140
00141 static int preAllocatable()
00142 {
00143 return 2;
00144 }
00145
00146
00147 int size(const Box& R, const Interval& comps) const ;
00148
00149
00150 void linearOut(void* buf, const Box& R, const Interval& comps) const;
00151
00152
00153 void linearIn(void* buf, const Box& R, const Interval& comps);
00154
00155
00156
00157
00158
00159
00160
00161 virtual void clear();
00162
00163
00164
00165
00166
00167
00168
00169 bool
00170 isDefined() const;
00171
00172
00173
00174
00175
00176 int numVoFs() const;
00177
00178
00179
00180
00181
00182 int nComp() const;
00183
00184
00185
00186
00187
00188 const IntVectSet& getIVS() const;
00189
00190
00191 const EBGraph& getEBGraph() const;
00192
00193
00194
00195
00196
00197
00198
00199
00200 T& operator() (const VolIndex& a_vof,const int& varlocin);
00201 const T& operator() (const VolIndex& a_vof,const int& varlocin) const;
00202
00203
00204
00205 BaseIVFAB(const Box& a_region, int a_nVar)
00206 {
00207 MayDay::Error("invalid constructor called for baseebcellfab");
00208 }
00209
00210
00211 static void setVerbose(bool a_verbose);
00212
00213
00214 static void setVerboseDebug(bool a_verboseDebug);
00215
00216
00217 T* dataPtr(const int& a_comp);
00218
00219
00220 const T* dataPtr(const int& a_comp) const;
00221
00222
00223
00224
00225
00226 virtual T* getIndex(const VolIndex& a_vof,const int& a_comp) const;
00227
00228
00229 long offset(const BaseIndex& a_vof, const int& a_ivar) const
00230 {
00231 const VolIndex* vof = dynamic_cast< const VolIndex* >(&a_vof);
00232 if (vof == NULL) MayDay::Error("cast failed:BaseIVFAB only takes vofs for indexing");
00233
00234 const T& conval = (*this)(*vof, a_ivar);
00235 const T* conptr = &conval;
00236 const T* srtptr = dataPtr(0);
00237 long roffset = (long)(conptr - srtptr);
00238 return roffset;
00239 }
00240 static bool s_verboseDebug;
00241
00242 private:
00243
00244
00245 protected:
00246
00247 virtual void
00248 setDefaultValues();
00249
00250
00251
00252 Vector<T> m_data;
00253
00254 int m_nComp;
00255 int m_nVoFs;
00256
00257 EBGraph m_ebgraph;
00258
00259
00260 BaseFab<T*> m_fab;
00261 IntVectSet m_ivs;
00262 bool m_isDefined;
00263
00264 static bool s_verbose;
00265 private:
00266
00267 void operator= (const BaseIVFAB<T>& a_input)
00268 {
00269 MayDay::Error("BaseIVFAB operator = not defined");
00270 }
00271 BaseIVFAB(const BaseIVFAB<T>& a_input)
00272 {
00273 MayDay::Error("invalid operator");
00274 }
00275 };
00276
00277 #include "NamespaceFooter.H"
00278
00279 #ifndef CH_EXPLICIT_TEMPLATES
00280 #include "BaseIVFABI.H"
00281 #endif
00282
00283 #endif