00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _MINIIFFABI_H_
00012 #define _MINIIFFABI_H_
00013 #include "MayDay.H"
00014 #include "FaceIterator.H"
00015 #include <typeinfo>
00016 #include "NamespaceHeader.H"
00017
00018 template <class T>
00019 bool MiniIFFAB<T>::s_verbose = false;
00020
00021
00022 template <class T> inline
00023 MiniIFFAB<T>::MiniIFFAB()
00024 {
00025 setDefaultValues();
00026 }
00027
00028 template <class T> inline
00029 MiniIFFAB<T>::~MiniIFFAB()
00030 {
00031 clear();
00032 }
00033
00034 template <class T> inline
00035 MiniIFFAB<T>::
00036 MiniIFFAB(const Box& a_box,
00037 const EBGraph& a_ebgraph,
00038 const int& a_direction,
00039 const int& a_nvarin)
00040 {
00041 setDefaultValues();
00042 define(a_box, a_ebgraph, a_direction, a_nvarin);
00043 }
00044
00045 template <class T> inline
00046 void
00047 MiniIFFAB<T>::
00048 define(const Box& a_box,
00049 const EBGraph& a_ebgraph,
00050 const int& a_direction,
00051 const int& a_nvarin)
00052 {
00053 clear();
00054 m_isDefined = true;
00055 CH_assert(a_nvarin > 0);
00056 CH_assert((a_direction >= 0) && (a_direction < SpaceDim));
00057
00058 m_direction = a_direction;
00059 m_ebgraph = a_ebgraph;
00060 m_nComp = a_nvarin;
00061 m_box = a_box;
00062
00063 m_faces = m_ebgraph.getMultiValuedFaces(a_direction, a_box);
00064 m_nFaces = m_faces.size();
00065
00066 m_data = new T[m_nComp*m_nFaces];
00067 }
00068
00069 template <class T> inline
00070 void
00071 MiniIFFAB<T>::
00072 setVal(const T& a_value)
00073 {
00074 CH_assert(isDefined());
00075 for (int ivec = 0; ivec < m_nFaces*m_nComp; ivec++)
00076 {
00077 m_data[ivec] = a_value;
00078 }
00079 }
00080
00081 template <class T> inline
00082 void
00083 MiniIFFAB<T>::
00084 setVal(int ivar, const T& a_value)
00085 {
00086 CH_assert(isDefined());
00087 CH_assert(ivar >= 0);
00088 CH_assert(ivar < m_nComp);
00089
00090 for (int ivec = ivar; ivec < m_nFaces*m_nComp; ivec += m_nComp)
00091 {
00092 m_data[ivec] = a_value;
00093 }
00094 }
00095
00096 template <class T> inline
00097 void
00098 MiniIFFAB<T>::
00099 copy(const Box& a_fromBox,
00100 const Interval& a_dstInterval,
00101 const Box& a_toBox,
00102 const MiniIFFAB<T>& a_src,
00103 const Interval& a_srcInterval)
00104 {
00105 CH_assert(isDefined());
00106 CH_assert(a_src.isDefined());
00107 CH_assert(a_srcInterval.size() == a_dstInterval.size());
00108 CH_assert(a_dstInterval.begin() >= 0);
00109 CH_assert(a_srcInterval.begin() >= 0);
00110 CH_assert(a_dstInterval.end() < m_nComp);
00111 CH_assert(a_srcInterval.end() < a_src.m_nComp);
00112
00113 if ((!m_box.isEmpty()) && (!a_src.m_box.isEmpty()))
00114 {
00115 CH_assert(a_fromBox == a_toBox);
00116 Box intBox = a_toBox;
00117 Box boxIntersect = m_box;
00118 boxIntersect &= a_src.m_box;
00119 boxIntersect &= intBox;
00120 int compSize = a_srcInterval.size();
00121
00122 for (int iface = 0; iface < m_faces.size(); iface++)
00123 {
00124 const FaceIndex& face = m_faces[iface];
00125 const IntVect& ivHi = face.gridIndex(Side::Hi);
00126 const IntVect& ivLo = face.gridIndex(Side::Lo);
00127 if (boxIntersect.contains(ivHi) || boxIntersect.contains(ivLo))
00128 {
00129 for (int icomp = 0; icomp < compSize; icomp++)
00130 {
00131 int isrccomp = a_srcInterval.begin() + icomp;
00132 int idstcomp = a_dstInterval.begin() + icomp;
00133 (*this)(face, idstcomp) = a_src(face, isrccomp);
00134 }
00135 }
00136 }
00137 }
00138 }
00139
00140 template <class T> inline
00141 T*
00142 MiniIFFAB<T>::
00143 getIndex(const FaceIndex& a_face, const int& a_comp) const
00144 {
00145 CH_assert(m_isDefined);
00146 CH_assert((a_comp >= 0) && (a_comp < this->m_nComp));
00147
00148 T* dataPtr = this->m_data;
00149 bool found = false;
00150 T* retval=NULL;
00151 for (int iface = 0; iface < m_faces.size(); ++iface)
00152 {
00153 if (a_face == m_faces[iface])
00154 {
00155 found = true;
00156 retval=dataPtr;
00157 }
00158 if (found) break;
00159 dataPtr++;
00160 }
00161 if (!found)
00162 {
00163 MayDay::Error("MiniIFFAB:index not found");
00164 }
00165 retval += a_comp*this->m_nFaces;
00166 return retval;
00167
00168 }
00169
00170 template <class T> inline
00171 void
00172 MiniIFFAB<T>::
00173 clear()
00174 {
00175 if (m_data != NULL)
00176 {
00177 delete[] m_data;
00178 m_data = NULL;
00179 }
00180 m_faces.resize(0);
00181 setDefaultValues();
00182 }
00183
00184 template <class T> inline
00185 T&
00186 MiniIFFAB<T>::operator() (const FaceIndex& a_ndin,
00187 const int& a_comp)
00188 {
00189 CH_assert(isDefined());
00190 CH_assert(a_ndin.direction() == m_direction);
00191
00192 T* dataPtr = getIndex(a_ndin, a_comp);
00193 return(*dataPtr);
00194 }
00195
00196 template <class T> inline
00197 const T&
00198 MiniIFFAB<T>::operator() (const FaceIndex& a_ndin,
00199 const int& a_comp) const
00200 {
00201 CH_assert(isDefined());
00202 CH_assert(a_ndin.direction() == m_direction);
00203
00204 T* dataPtr = getIndex(a_ndin, a_comp);
00205 return(*dataPtr);
00206 }
00207
00208 template <class T> inline
00209 T*
00210 MiniIFFAB<T>::dataPtr(const int& a_comp)
00211 {
00212 CH_assert(a_comp >= 0);
00213 CH_assert(a_comp <= m_nComp);
00214 return m_data + a_comp*m_nFaces;
00215 }
00216
00217 template <class T> inline
00218 const T*
00219 MiniIFFAB<T>::dataPtr(const int& a_comp) const
00220 {
00221 CH_assert(a_comp >= 0);
00222 CH_assert(a_comp <= m_nComp);
00223 return m_data + a_comp*m_nFaces;
00224 }
00225
00226 template <class T> inline
00227 void
00228 MiniIFFAB<T>::setDefaultValues()
00229 {
00230 m_isDefined = false;
00231 m_data = NULL;
00232 m_nFaces = 0;
00233 m_nComp = 0;
00234 m_direction = -1;
00235 }
00236
00237 template <class T> inline
00238 void
00239 MiniIFFAB<T>::
00240 getFaceSubset(Vector<FaceIndex>& a_subFaces, const Box& a_subBox) const
00241 {
00242 a_subFaces.resize(0);
00243 for (int iface = 0; iface < m_faces.size(); iface++)
00244 {
00245 if ((a_subBox.contains(m_faces[iface].gridIndex(Side::Lo))) ||
00246 (a_subBox.contains(m_faces[iface].gridIndex(Side::Hi))))
00247 {
00248 a_subFaces.push_back(m_faces[iface]);
00249 }
00250 }
00251 }
00252
00253 template <class T> inline
00254 int
00255 MiniIFFAB<T>::
00256 size(const Box& a_region,
00257 const Interval& a_comps) const
00258 {
00259 CH_assert(isDefined());
00260
00261 Vector<FaceIndex> faces;
00262 getFaceSubset(faces, a_region);
00263
00264
00265 int facesize = linearListSize(faces);
00266
00267
00268 int datasize = 0;
00269 for (int iface = 0; iface < faces.size(); iface++)
00270 {
00271 for (int icomp = a_comps.begin(); icomp <= a_comps.end(); icomp++)
00272 {
00273 const T& dataPt = (*this)(faces[iface], icomp);
00274 int pointsize = CH_XD::linearSize(dataPt);
00275 datasize += pointsize;
00276 }
00277 }
00278
00279 int retval = facesize + datasize;
00280
00281 if (s_verbose)
00282 {
00283 pout() << "###############" << std::endl;
00284 pout() << "MiniIFFAB size() for region " << m_ebgraph.getRegion() << std::endl;
00285 pout() << " a_comps = (" << a_comps.begin() << "," << a_comps.end() << ")," << endl;
00286 pout() << "m_box = " << m_box;
00287 pout() << "size = " << retval << std::endl;
00288 pout() << "###############" << std::endl;
00289 }
00290
00291 return retval;
00292 }
00293
00294 template <class T> inline
00295 void
00296 MiniIFFAB<T>::
00297 linearOut(void* a_buf,
00298 const Box& a_region,
00299 const Interval& a_comps) const
00300 {
00301 CH_assert(isDefined());
00302 Vector<FaceIndex> faces;
00303 getFaceSubset(faces, a_region);
00304
00305
00306 unsigned char* charbuffer = (unsigned char *) a_buf;
00307 linearListOut(charbuffer, faces);
00308 charbuffer += linearListSize(faces);
00309
00310
00311 const MiniIFFAB<T>& thisFAB = *this;
00312 for (int iface = 0; iface < faces.size(); iface++)
00313 {
00314 const FaceIndex& face = faces[iface];
00315 for (int icomp = a_comps.begin(); icomp <= a_comps.end(); icomp++)
00316 {
00317
00318 const T& dataPt = thisFAB(face, icomp);
00319 CH_XD::linearOut(charbuffer, dataPt);
00320
00321 charbuffer += CH_XD::linearSize(dataPt);
00322 }
00323 }
00324 }
00325
00326 template <class T> inline
00327 void
00328 MiniIFFAB<T>::
00329 linearIn(void* a_buf, const Box& a_region, const Interval& a_comps)
00330 {
00331 CH_assert(isDefined());
00332
00333 unsigned char* charbuffer = (unsigned char *) a_buf;
00334 Vector<FaceIndex> faces;
00335 linearListIn(faces, charbuffer);
00336 charbuffer += linearListSize(faces);
00337
00338 for (int iface = 0; iface < faces.size(); iface++)
00339 {
00340 const FaceIndex& face = faces[iface];
00341 for (int icomp = a_comps.begin(); icomp <= a_comps.end(); icomp++)
00342 {
00343
00344 T& dataPt = (*this)(face, icomp);
00345 CH_XD::linearIn(dataPt, charbuffer) ;
00346
00347 charbuffer += CH_XD::linearSize(dataPt);
00348 }
00349 }
00350 }
00351
00352
00353
00354 #include "NamespaceFooter.H"
00355 #endif