00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _IVSFABI_H_
00012 #define _IVSFABI_H_
00013
00014 #include "MayDay.H"
00015 #include "IntVectSet.H"
00016 #include "parstream.H"
00017 #include "SPMD.H"
00018 #include "DebugOut.H"
00019 #include "SPMD.H"
00020 #include "NamespaceHeader.H"
00021
00022 template <class T>
00023 bool IVSFAB<T>::s_verbose = false;
00024
00025 template <class T>
00026 void
00027 IVSFAB<T>::setVerbose(bool a_verbose)
00028 {
00029 s_verbose = a_verbose;
00030 }
00031
00032 template <class T> inline
00033 const IntVectSet&
00034 IVSFAB<T>::getIVS() const
00035 {
00036 return m_ivs;
00037 }
00038
00039 template <class T> inline
00040 IVSFAB<T>::IVSFAB()
00041 {
00042 setDefaultValues();
00043 }
00044
00045 template <class T> inline
00046 IVSFAB<T>::~IVSFAB()
00047 {
00048 clear();
00049 }
00050
00051 template <class T> inline
00052 IVSFAB<T>::IVSFAB(const IntVectSet& a_ivsin,
00053 const int& a_nvarin)
00054 {
00055 setDefaultValues();
00056 define(a_ivsin, a_nvarin);
00057 }
00058
00059 template <class T> inline
00060 void
00061 IVSFAB<T>::define(const IntVectSet& a_ivsin,
00062 const int& a_nvarin)
00063 {
00064 clear();
00065 m_isDefined = true;
00066 CH_assert(a_nvarin > 0);
00067 m_ivs = a_ivsin;
00068 m_nComp = a_nvarin;
00069 m_nIvs = 0;
00070 if(!a_ivsin.isEmpty())
00071 {
00072 Box minbox = a_ivsin.minBox();
00073 m_ivmap.resize(minbox, 1);
00074 IVSIterator ivsit(a_ivsin);
00075 for(ivsit.reset(); ivsit.ok(); ++ivsit)
00076 {
00077 const IntVect& iv = ivsit();
00078 m_ivmap(iv,0) = m_nIvs;
00079 m_nIvs++;
00080 }
00081
00082 if( (m_nIvs > 0) && m_nComp > 0)
00083 {
00084 m_dataPtr = new T[m_nComp*m_nIvs];
00085 }
00086 else
00087 {
00088 m_dataPtr = NULL;
00089 }
00090 }
00091 else
00092 {
00093 m_dataPtr = NULL;
00094 }
00095 if(m_nIvs > 0)
00096 {
00097
00098 for (int dir = 0; dir < CH_SPACEDIM; ++dir)
00099 {
00100 m_loVect[dir] = 1;
00101 m_hiVect[dir] = 1;
00102 }
00103 m_hiVect[0] = m_nIvs;
00104
00105 }
00106 else
00107 {
00108 m_loVect = IntVect::Unit;
00109 m_hiVect = IntVect::Zero;
00110 m_dataPtr = NULL;
00111 }
00112
00113 }
00114
00115 template <class T> inline
00116 void
00117 IVSFAB<T>::setVal(const T& a_value)
00118 {
00119 CH_assert(isDefined());
00120 for(int ivec = 0; ivec < m_nIvs*m_nComp; ivec++)
00121 m_dataPtr[ivec] = a_value;
00122 }
00123
00124 template <class T> inline
00125 void
00126 IVSFAB<T>::copy(const Box& a_fromBox,
00127 const Interval& a_dstInterval,
00128 const Box& a_toBox,
00129 const IVSFAB<T>& a_src,
00130 const Interval& a_srcInterval)
00131 {
00132 CH_assert(a_fromBox == a_toBox);
00133 CH_assert(isDefined());
00134 CH_assert(a_src.isDefined());
00135 CH_assert(a_srcInterval.size() == a_dstInterval.size());
00136 CH_assert(a_dstInterval.begin() >= 0);
00137 CH_assert(a_srcInterval.begin() >= 0);
00138 CH_assert(a_dstInterval.end() < m_nComp);
00139 CH_assert(a_srcInterval.end() < a_src.m_nComp);
00140
00141 if((!m_ivs.isEmpty()) && (!a_src.m_ivs.isEmpty()))
00142 {
00143 Box intBox = a_fromBox;
00144 IntVectSet ivsIntersect = m_ivs;
00145 ivsIntersect &= a_src.m_ivs;
00146 ivsIntersect &= intBox;
00147 IVSFAB<T>& thisFAB = *this;
00148 int compSize = a_srcInterval.size();
00149 for(IVSIterator ivit(ivsIntersect); ivit.ok(); ++ivit)
00150 {
00151 const IntVect& iv = ivit();
00152 for(int icomp = 0; icomp < compSize; icomp++)
00153 {
00154 int isrccomp = a_srcInterval.begin() + icomp;
00155 int idstcomp = a_dstInterval.begin() + icomp;
00156 thisFAB(iv, idstcomp) = a_src(iv, isrccomp);
00157 }
00158 }
00159 }
00160 }
00161
00162 template <class T> inline
00163 int IVSFAB<T>::size(const Box& a_region,
00164 const Interval& a_comps) const
00165 {
00166 MayDay::Error();
00167 return 0;
00168 }
00169
00170 template <class T> inline
00171 void IVSFAB<T>::linearOut(void* a_buf,
00172 const Box& a_region,
00173 const Interval& a_comps) const
00174 {
00175 MayDay::Error();
00176 }
00177
00178 template <class T> inline
00179 void IVSFAB<T>::linearIn(void* a_buf, const Box& a_region, const Interval& a_comps)
00180 {
00181 MayDay::Error();
00182 }
00183
00184 template <class T> inline
00185 int
00186 IVSFAB<T>::getIndex(const IntVect& a_iv, const int& a_comp) const
00187 {
00188 CH_assert(isDefined());
00189 CH_assert(m_ivs.contains(a_iv));
00190 CH_assert((a_comp >= 0) && (a_comp < m_nComp));
00191
00192 int ioffset = m_ivmap(a_iv, 0);
00193 CH_assert(ioffset >= 0);
00194 CH_assert(ioffset < m_nIvs);
00195
00196 ioffset += m_nIvs*a_comp;
00197 return ioffset;
00198 }
00199
00200 template <class T> inline
00201 void
00202 IVSFAB<T>::clear()
00203 {
00204 m_nComp = 0;
00205 m_nIvs = 0;
00206 m_ivs.makeEmpty();
00207 m_ivmap.clear();
00208 if(m_dataPtr != NULL)
00209 {
00210 delete[] m_dataPtr;
00211 m_dataPtr = NULL;
00212 }
00213 m_isDefined = false;
00214 }
00215
00216 template <class T> inline
00217 bool
00218 IVSFAB<T>::isDefined() const
00219 {
00220 return (m_isDefined);
00221 }
00222
00223 template <class T> inline
00224 int
00225 IVSFAB<T>::numIvs() const
00226 {
00227 return m_nIvs;
00228 }
00229
00230 template <class T> inline
00231 int
00232 IVSFAB<T>::nComp() const
00233 {
00234 return m_nComp;
00235 }
00236
00237 template <class T> inline
00238 T&
00239 IVSFAB<T>::operator() (const IntVect& a_ndin,
00240 const int& a_comp)
00241 {
00242 CH_assert(isDefined());
00243 CH_assert(a_comp >= 0);
00244 CH_assert(a_comp < m_nComp);
00245 int iloc = getIndex(a_ndin, a_comp);
00246 return(m_dataPtr[iloc]);
00247 }
00248
00249 template <class T> inline
00250 const T&
00251 IVSFAB<T>::operator() (const IntVect& a_ndin,
00252 const int& a_comp) const
00253 {
00254 CH_assert(isDefined());
00255 CH_assert(a_comp >= 0);
00256 CH_assert(a_comp < m_nComp);
00257 int iloc = getIndex(a_ndin, a_comp);
00258 return(m_dataPtr[iloc]);
00259 }
00260
00261 template <class T> inline
00262 const T*
00263 IVSFAB<T>::dataPtr(const int& a_comp) const
00264 {
00265 CH_assert(isDefined());
00266 CH_assert(a_comp >= 0);
00267 CH_assert(a_comp < m_nComp);
00268 return m_dataPtr + a_comp*m_nIvs;
00269 }
00270
00271 template <class T> inline
00272 T*
00273 IVSFAB<T>::dataPtr(const int& a_comp)
00274 {
00275 CH_assert(isDefined());
00276 CH_assert(a_comp >= 0);
00277 CH_assert(a_comp < m_nComp);
00278 return m_dataPtr + a_comp*m_nIvs;
00279 }
00280
00281 template <class T> inline
00282 const int*
00283 IVSFAB<T>::loVect() const
00284 {
00285 return m_loVect.getVect();
00286 }
00287
00288 template <class T> inline
00289 const int*
00290 IVSFAB<T>::hiVect() const
00291 {
00292 return m_hiVect.getVect();
00293 }
00294
00295 template <class T> inline
00296 void
00297 IVSFAB<T>::setDefaultValues()
00298 {
00299 m_isDefined = false;
00300 m_dataPtr = NULL;
00301 m_nIvs = 0;
00302 m_nComp = 0;
00303 m_loVect = IntVect::Unit;
00304 m_hiVect = IntVect::Zero;
00305 }
00306
00307 template <class T> inline
00308 IVSFAB<T>&
00309 IVSFAB<T>::operator= (const IVSFAB<T>& a_input)
00310 {
00311 MayDay::Error("IVSFAB operator = not defined");
00312 return *this;
00313 }
00314
00315 template <class T> inline
00316 IVSFAB<T>::IVSFAB (const IVSFAB<T>& a_input)
00317 {
00318 MayDay::Error("IVSFAB copy constructor not defined");
00319 }
00320
00321 #include "NamespaceFooter.H"
00322 #endif