00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013 #ifndef _BASEIFFAB_H_
00014 #define _BASEIFFAB_H_
00015
00016 #include <cmath>
00017 #include <cstdlib>
00018 #include "SPACE.H"
00019 #include "Vector.H"
00020 #include "IntVectSet.H"
00021 #include "FaceIndex.H"
00022 #include "BaseFab.H"
00023 #include "EBGraph.H"
00024 #include "Arena.H"
00025 #include "NamespaceHeader.H"
00026
00027
00028
00029
00030
00031
00032
00033 template <class T>
00034 class BaseIFFAB
00035 {
00036 public:
00037
00038
00039
00040
00041
00042 BaseIFFAB();
00043
00044
00045
00046
00047
00048
00049
00050
00051 BaseIFFAB(const IntVectSet& a_region,
00052 const EBGraph& a_ebgraph,
00053 const int& a_direction,
00054 const int& a_nvarin);
00055
00056
00057 ~BaseIFFAB();
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 void define(const IntVectSet& a_region,
00068 const EBGraph& a_ebgraph,
00069 const int& a_direction,
00070 const int& a_nvarin);
00071
00072
00073
00074
00075
00076 void setVal(const T& value);
00077
00078
00079
00080
00081
00082 void setVal(int ivar, const T& value);
00083
00084
00085
00086
00087
00088 void copy(const Box& a_intBox,
00089 const Interval& a_destInterval,
00090 const Box& a_toBox,
00091 const BaseIFFAB<T>& a_src,
00092 const Interval& a_srcInterval);
00093
00094
00095
00096
00097
00098
00099
00100
00101 void clear();
00102
00103
00104 BaseIFFAB(const Box& a_region, int a_nVar)
00105 {
00106 MayDay::Error("invalid constructor called for baseebcellfab");
00107 }
00108
00109
00110
00111
00112
00113
00114
00115 bool
00116 isDefined() const;
00117
00118
00119
00120
00121
00122 int numFaces() const;
00123
00124
00125
00126
00127
00128 int nComp() const;
00129
00130
00131
00132
00133
00134
00135
00136 int direction() const;
00137
00138
00139
00140
00141
00142
00143 const IntVectSet& getIVS() const;
00144
00145
00146
00147
00148
00149
00150
00151
00152 T& operator() (const FaceIndex& a_face,const int& varlocin);
00153 const T& operator()(const FaceIndex& a_face,const int& varlocin) const;
00154
00155
00156
00157 T* dataPtr(const int& a_comp);
00158
00159 T* getIndex(const FaceIndex& a_face, const int& a_comp) const;
00160
00161
00162 long offset(const FaceIndex& a_vof, const int& a_ivar) const
00163 {
00164 const T& conval = (*this)(a_vof, a_ivar);
00165 long roffset = (int)(&conval);
00166 roffset -= (int)(&m_data[0]);
00167 return roffset;
00168 }
00169
00170
00171 const T* dataPtr(const int& a_comp) const;
00172
00173 const EBGraph& getEBGraph() const;
00174
00175 static int preAllocatable()
00176 {
00177 return 1;
00178 }
00179
00180
00181 int size(const Box& R, const Interval& comps) const ;
00182
00183
00184 void linearOut(void* buf, const Box& R, const Interval& comps) const;
00185
00186
00187 void linearIn(void* buf, const Box& R, const Interval& comps);
00188
00189
00190 static void setVerbose(bool a_verbose);
00191 static bool s_verbose;
00192 private:
00193 void
00194 setDefaultValues();
00195
00196 protected:
00197
00198
00199
00200
00201 bool useThisFace(const Box& a_toBox,
00202 const FaceIndex& a_face) const;
00203
00204 void getBoxAndIVS(Box& a_intBox,
00205 IntVectSet& a_ivsIntersect,
00206 const Box& a_toBox) const;
00207
00208
00209 static Arena* s_Arena;
00210
00211
00212
00213 int getLocalVecIndex(const FaceIndex& a_face) const;
00214
00215 public:
00216 static void setSurroundingNodeSemantic(bool a_useSurr);
00217
00218 protected:
00219 static bool s_doSurroundingNodeSemantic;
00220
00221 Vector<T> m_data;
00222 int m_truesize;
00223 int m_nComp;
00224 int m_nFaces;
00225 int m_direction;
00226
00227
00228 BaseFab<T*> m_fab;
00229 IntVectSet m_ivs;
00230 EBGraph m_ebgraph;
00231 bool m_isDefined;
00232 private:
00233
00234 void operator= (const BaseIFFAB<T>&)
00235 {
00236 MayDay::Error("invalid operator");
00237 }
00238 BaseIFFAB (const BaseIFFAB<T>&)
00239 {
00240 MayDay::Error("invalid operator");
00241 }
00242 };
00243
00244 #include "NamespaceFooter.H"
00245
00246 #ifndef CH_EXPLICIT_TEMPLATES
00247 #include "BaseIFFABI.H"
00248 #endif
00249
00250 #endif