00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _IVSFAB_H_
00012 #define _IVSFAB_H_
00013
00014 #include <cmath>
00015 #include <cstdlib>
00016 #include "SPACE.H"
00017 #include "Vector.H"
00018 #include "IntVectSet.H"
00019 #include "IntVect.H"
00020 #include "BaseFab.H"
00021 #include "LayoutData.H"
00022 #include "BoxLayoutData.H"
00023 #include "NamespaceHeader.H"
00024
00025
00026
00027
00028
00029
00030 template <class T>
00031 class IVSFAB
00032 {
00033 public:
00034
00035
00036
00037
00038
00039 IVSFAB();
00040
00041
00042
00043
00044 IVSFAB(const IntVectSet& a_region,
00045 const int& a_nvarin);
00046
00047
00048 ~IVSFAB();
00049
00050
00051
00052
00053
00054 void setVal(const T& value);
00055
00056
00057 void copy(const Box& a_fromBox,
00058 const Interval& a_destInterval,
00059 const Box& a_toBox,
00060 const IVSFAB<T>& a_src,
00061 const Interval& a_srcInterval);
00062
00063
00064
00065
00066
00067
00068 static int preAllocatable()
00069 {
00070 return 2;
00071 }
00072
00073
00074 int size(const Box& R, const Interval& comps) const ;
00075
00076
00077 void linearOut(void* buf, const Box& R, const Interval& comps) const;
00078
00079
00080 void linearIn(void* buf, const Box& R, const Interval& comps);
00081
00082
00083
00084
00085
00086
00087
00088 private:
00089 void clear();
00090 public:
00091
00092
00093
00094
00095
00096
00097 bool
00098 isDefined() const;
00099
00100
00101
00102
00103
00104 int numIvs() const;
00105
00106
00107
00108
00109
00110 int nComp() const;
00111
00112
00113
00114
00115
00116 const IntVectSet& getIVS() const;
00117
00118
00119
00120
00121
00122
00123
00124
00125 T& operator() (const IntVect& a_iv,const int& varlocin);
00126 const T& operator() (const IntVect& a_iv,const int& varlocin) const;
00127
00128
00129
00130
00131
00132 const T* dataPtr(const int& a_comp) const;
00133
00134
00135
00136
00137
00138 T* dataPtr(const int& a_comp) ;
00139
00140
00141 IVSFAB(const Box& a_region, int a_nVar)
00142 {
00143 MayDay::Error("invalid constructor called ");
00144 }
00145
00146
00147
00148
00149
00150 const int* loVect() const;
00151
00152
00153
00154
00155
00156 const int* hiVect() const;
00157
00158
00159 static void setVerbose(bool a_verbose);
00160
00161
00162
00163
00164
00165 void define(const IntVectSet& a_region,
00166 const int& a_nvarin);
00167
00168 private:
00169 void
00170 setDefaultValues();
00171
00172 protected:
00173
00174 int getIndex(const IntVect& a_iv,const int& a_comp) const;
00175
00176
00177 T* m_dataPtr;
00178 int m_nComp;
00179 int m_nIvs;
00180 IntVect m_loVect;
00181 IntVect m_hiVect;
00182
00183
00184
00185
00186
00187
00188
00189 BaseFab<int> m_ivmap;
00190 IntVectSet m_ivs;
00191 bool m_isDefined;
00192
00193 static bool s_verbose;
00194 private:
00195
00196 IVSFAB<T>& operator= (const IVSFAB<T>&);
00197 IVSFAB (const IVSFAB<T>&);
00198 };
00199
00200
00201
00202
00203
00204
00205 template <class T>
00206 class IVSFABFactory
00207 : public DataFactory< IVSFAB<T> >
00208 {
00209 public:
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 virtual IVSFAB<T>* create(const Box& a_box, int a_ncomps,
00222 const DataIndex& a_dit) const
00223 {
00224
00225
00226 IntVectSet ivsInter = m_sets[a_dit];
00227 ivsInter &= a_box;
00228 return new IVSFAB<T>(ivsInter, a_ncomps);
00229 }
00230
00231
00232
00233
00234
00235 IVSFABFactory(const LayoutData<IntVectSet>& a_sets)
00236 {
00237 m_sets.define(a_sets.boxLayout());
00238 for (DataIterator dit = m_sets.dataIterator(); dit.ok(); ++dit)
00239 {
00240 m_sets[dit()] = a_sets[dit()];
00241 }
00242 }
00243
00244
00245 virtual ~IVSFABFactory()
00246 {
00247 ;
00248 }
00249
00250 private:
00251
00252
00253 LayoutData<IntVectSet> m_sets;
00254
00255
00256 IVSFABFactory(const IVSFABFactory<T>& a_inputs)
00257 {
00258 MayDay::Error("disallowed constructor");
00259 }
00260 IVSFABFactory()
00261 {
00262 MayDay::Error("disallowed constructor");
00263 }
00264 void operator=(const IVSFABFactory<T>& a_inputs)
00265 {
00266 MayDay::Error("disallowed constructor");
00267 }
00268
00269 };
00270
00271 #include "NamespaceFooter.H"
00272 #include "IVSFABI.H"
00273
00274 #endif