Chombo + EB + MF  3.2
MiniIFFABI.H
Go to the documentation of this file.
1 #ifdef CH_LANG_CC
2 /*
3  * _______ __
4  * / ___/ / ___ __ _ / / ___
5  * / /__/ _ \/ _ \/ V \/ _ \/ _ \
6  * \___/_//_/\___/_/_/_/_.__/\___/
7  * Please refer to Copyright.txt, in Chombo's root directory.
8  */
9 #endif
10 
11 #ifndef _MINIIFFABI_H_
12 #define _MINIIFFABI_H_
13 #include "MayDay.H"
14 #include "FaceIterator.H"
15 #include <typeinfo>
16 #include "NamespaceHeader.H"
17 
18 template <class T>
19 bool MiniIFFAB<T>::s_verbose = false;
20 
21 /******************/
22 template <class T> inline
24 {
25  setDefaultValues();
26 }
27 /******************/
28 template <class T> inline
30 {
31  clear();
32 }
33 /******************/
34 template <class T> inline
36 MiniIFFAB(const Box& a_box,
37  const EBGraph& a_ebgraph,
38  const int& a_direction,
39  const int& a_nvarin)
40 {
41  setDefaultValues();
42  define(a_box, a_ebgraph, a_direction, a_nvarin);
43 }
44 /******************/
45 template <class T> inline
46 void
48 define(const Box& a_box,
49  const EBGraph& a_ebgraph,
50  const int& a_direction,
51  const int& a_nvarin)
52 {
53  clear();
54  m_isDefined = true;
55  CH_assert(a_nvarin > 0);
56  CH_assert((a_direction >= 0) && (a_direction < SpaceDim));
57 
58  m_direction = a_direction;
59  m_ebgraph = a_ebgraph;
60  m_nComp = a_nvarin;
61  m_box = a_box;
62 
63  m_faces = m_ebgraph.getMultiValuedFaces(a_direction, a_box);
64  m_nFaces = m_faces.size();
65 
66  m_data = new T[m_nComp*m_nFaces];
67 }
68 /******************/
69 template <class T> inline
71 MiniIFFAB(const IntVectSet& a_ivs,
72  const EBGraph& a_ebgraph,
73  const int& a_direction,
74  const int& a_nvarin)
75 {
76  setDefaultValues();
77  define(a_ivs, a_ebgraph, a_direction, a_nvarin);
78 }
79 /******************/
80 template <class T> inline
81 void
83 define(const IntVectSet& a_ivs,
84  const EBGraph& a_ebgraph,
85  const int& a_direction,
86  const int& a_nvarin)
87 {
88  clear();
89  m_isDefined = true;
90  CH_assert(a_nvarin > 0);
91  CH_assert((a_direction >= 0) && (a_direction < SpaceDim));
92 
93  m_direction = a_direction;
94  m_ebgraph = a_ebgraph;
95  m_nComp = a_nvarin;
96  m_box = a_ivs.minBox();
97 
98  FaceIterator faceit(a_ivs, a_ebgraph, a_direction, FaceStop::SurroundingWithBoundary);
99  m_faces = faceit.getVector();
100  m_nFaces = m_faces.size();
101 
102  m_data = new T[m_nComp*m_nFaces];
103 }
104 /******************/
105 template <class T> inline
106 void
108 setVal(const T& a_value)
109 {
110  CH_assert(isDefined());
111  for (int ivec = 0; ivec < m_nFaces*m_nComp; ivec++)
112  {
113  m_data[ivec] = a_value;
114  }
115 }
116 /******************/
117 template <class T> inline
118 void
120 setVal(int ivar, const T& a_value)
121 {
122  CH_assert(isDefined());
123  CH_assert(ivar >= 0);
124  CH_assert(ivar < m_nComp);
125 
126  for (int ivec = ivar; ivec < m_nFaces*m_nComp; ivec += m_nComp)
127  {
128  m_data[ivec] = a_value;
129  }
130 }
131 /******************/
132 template <class T> inline
133 void
135 copy(const Box& a_fromBox,
136  const Interval& a_dstInterval,
137  const Box& a_toBox,
138  const MiniIFFAB<T>& a_src,
139  const Interval& a_srcInterval)
140 {
141  CH_assert(isDefined());
142  CH_assert(a_src.isDefined());
143  CH_assert(a_srcInterval.size() == a_dstInterval.size());
144  CH_assert(a_dstInterval.begin() >= 0);
145  CH_assert(a_srcInterval.begin() >= 0);
146  CH_assert(a_dstInterval.end() < m_nComp);
147  CH_assert(a_srcInterval.end() < a_src.m_nComp);
148 
149  if ((!m_box.isEmpty()) && (!a_src.m_box.isEmpty()))
150  {
151  // DFM 10/16/26: fromBox and toBox can be different -- just need to be the same size
152  //CH_assert(a_fromBox == a_toBox);
153  CH_assert(a_fromBox.size() == a_toBox.size());
154  Box intBox = a_toBox;
155  Box boxIntersect = m_box;
156  //boxIntersect &= a_src.m_box;
157  boxIntersect &= intBox;
158  int compSize = a_srcInterval.size();
159  // DFM 10/16/26: Additional logic for non-identical src and dest boxes
160  IntVect offset = a_fromBox.smallEnd() - a_toBox.smallEnd();
161 
162  for (int iface = 0; iface < m_faces.size(); iface++)
163  {
164  const FaceIndex& destFace = m_faces[iface];
165  const IntVect& ivHi = destFace.gridIndex(Side::Hi);
166  const IntVect& ivLo = destFace.gridIndex(Side::Lo);
167  if (boxIntersect.contains(ivHi) || boxIntersect.contains(ivLo))
168  {
169  FaceIndex srcFace = destFace;
170  srcFace.shift(offset);
171  for (int icomp = 0; icomp < compSize; icomp++)
172  {
173  int isrccomp = a_srcInterval.begin() + icomp;
174  int idstcomp = a_dstInterval.begin() + icomp;
175  (*this)(destFace, idstcomp) = a_src(srcFace, isrccomp);
176  }
177  }
178  }
179  }
180 }
181 /*********/
182 template <class T> inline
183 T*
185 getIndex(const FaceIndex& a_face, const int& a_comp) const
186 {
187  CH_assert(m_isDefined);
188  CH_assert((a_comp >= 0) && (a_comp < this->m_nComp));
189 
190  T* dataPtr = this->m_data;
191  bool found = false;
192  T* retval=NULL;
193  for (int iface = 0; iface < m_faces.size(); ++iface)
194  {
195  if (a_face == m_faces[iface])
196  {
197  found = true;
198  retval=dataPtr;
199  }
200  if (found) break;
201  dataPtr++;
202  }
203  if (!found)
204  {
205  MayDay::Error("MiniIFFAB:index not found");
206  }
207  retval += a_comp*this->m_nFaces;
208  return retval;
209 
210 }
211 template <class T> inline
213  MiniIFFAB<T>& a_original)
214  :m_data(a_original.dataPtr(a_comps.begin())),
215  m_faces(a_original.m_faces),
216  m_nFaces(a_original.m_nFaces),
217  m_nComp(a_comps.size()),
218  m_direction(a_original.m_direction),
219  m_aliased(true),
220  m_isDefined(a_original.m_isDefined)
221 {
222 }
223 
224 /*********/
225 template <class T> inline
226 void
229 {
230  if ((m_data != NULL)&&(!m_aliased))
231  {
232  delete[] m_data;
233  m_data = NULL;
234  }
235  m_faces.resize(0);
237 }
238 /*************************/
239 template <class T> inline
240 T&
242  const int& a_comp)
243 {
244  CH_assert(isDefined());
245  CH_assert(a_ndin.direction() == m_direction);
246 
247  T* dataPtr = getIndex(a_ndin, a_comp);
248  return(*dataPtr);
249 }
250 /**************************/
251 template <class T> inline
252 const T&
254  const int& a_comp) const
255 {
256  CH_assert(isDefined());
257  CH_assert(a_ndin.direction() == m_direction);
258 
259  T* dataPtr = getIndex(a_ndin, a_comp);
260  return(*dataPtr);
261 }
262 /******************/
263 template <class T> inline
264 T*
265 MiniIFFAB<T>::dataPtr(const int& a_comp)
266 {
267  CH_assert(a_comp >= 0);
268  CH_assert(a_comp <= m_nComp);
269  return m_data + a_comp*m_nFaces;
270 }
271 /******************/
272 template <class T> inline
273 const T*
274 MiniIFFAB<T>::dataPtr(const int& a_comp) const
275 {
276  CH_assert(a_comp >= 0);
277  CH_assert(a_comp <= m_nComp);
278  return m_data + a_comp*m_nFaces;
279 }
280 /******************/
281 template <class T> inline
282 void
284 {
285  m_isDefined = false;
286  m_data = NULL;
287  m_nFaces = 0;
288  m_nComp = 0;
289  m_direction = -1;
290 }
291 /******************/
292 template <class T> inline
293 void
295 getFaceSubset(Vector<FaceIndex>& a_subFaces, const Box& a_subBox) const
296 {
297  a_subFaces.resize(0);
298  for (int iface = 0; iface < m_faces.size(); iface++)
299  {
300  if ((a_subBox.contains(m_faces[iface].gridIndex(Side::Lo))) ||
301  (a_subBox.contains(m_faces[iface].gridIndex(Side::Hi))))
302  {
303  a_subFaces.push_back(m_faces[iface]);
304  }
305  }
306 }
307 /*********************/
308 template <class T> inline
309 int
311 size(const Box& a_region,
312  const Interval& a_comps) const
313 {
314  CH_assert(isDefined());
315  //create set of cells in fab that are also in the input region
316  Vector<FaceIndex> faces;
317  getFaceSubset(faces, a_region);
318 
319  //account for list of faces
320  int facesize = linearListSize(faces);
321 
322  //add for each data pt
323  int datasize = 0;
324  for (int iface = 0; iface < faces.size(); iface++)
325  {
326  for (int icomp = a_comps.begin(); icomp <= a_comps.end(); icomp++)
327  {
328  const T& dataPt = (*this)(faces[iface], icomp);
329  int pointsize = CH_XD::linearSize(dataPt);
330  datasize += pointsize;
331  }
332  }
333 
334  int retval = facesize + datasize;
335 
336  if (s_verbose)
337  {
338  pout() << "###############" << std::endl;
339  pout() << "MiniIFFAB size() for region " << m_ebgraph.getRegion() << std::endl;
340  pout() << " a_comps = (" << a_comps.begin() << "," << a_comps.end() << ")," << endl;
341  pout() << "m_box = " << m_box;
342  pout() << "size = " << retval << std::endl;
343  pout() << "###############" << std::endl;
344  }
345 
346  return retval;
347 }
348 /********************/
349 template <class T> inline
350 void
352 linearOut(void* a_buf,
353  const Box& a_region,
354  const Interval& a_comps) const
355 {
356  CH_assert(isDefined());
357  Vector<FaceIndex> faces;
358  getFaceSubset(faces, a_region);
359 
360  //output the faces.
361  unsigned char* charbuffer = (unsigned char *) a_buf;
362  linearListOut(charbuffer, faces);
363  charbuffer += linearListSize(faces);
364 
365  //output the data
366  const MiniIFFAB<T>& thisFAB = *this;
367  for (int iface = 0; iface < faces.size(); iface++)
368  {
369  const FaceIndex& face = faces[iface];
370  for (int icomp = a_comps.begin(); icomp <= a_comps.end(); icomp++)
371  {
372  //output the data into the buffer
373  const T& dataPt = thisFAB(face, icomp);
374  CH_XD::linearOut(charbuffer, dataPt);
375  //increment the buffer offset
376  charbuffer += CH_XD::linearSize(dataPt);
377  }
378  }
379 }
380 /********************/
381 template <class T> inline
382 void
384 linearIn(void* a_buf, const Box& a_region, const Interval& a_comps)
385 {
386  CH_assert(isDefined());
387 
388  unsigned char* charbuffer = (unsigned char *) a_buf;
389  Vector<FaceIndex> faces;
390  linearListIn(faces, charbuffer);
391  charbuffer += linearListSize(faces);
392 
393  for (int iface = 0; iface < faces.size(); iface++)
394  {
395  const FaceIndex& face = faces[iface];
396  for (int icomp = a_comps.begin(); icomp <= a_comps.end(); icomp++)
397  {
398  //input the data
399  T& dataPt = (*this)(face, icomp);
400  CH_XD::linearIn(dataPt, charbuffer) ;
401  //increment the buffer offset
402  charbuffer += CH_XD::linearSize(dataPt);
403  }
404  }
405 }
406 /********************/
407 /******************/
408 
409 #include "NamespaceFooter.H"
410 #endif
std::ostream & pout()
Use this in place of std::cout for program output.
bool isDefined() const
Definition: MiniIFFAB.H:150
int m_nComp
Definition: MiniIFFAB.H:223
int size(const Box &R, const Interval &comps) const
Definition: MiniIFFABI.H:311
int m_nFaces
Definition: MiniIFFAB.H:222
IntVect size() const
size functions
Definition: Box.H:1819
An irregular domain on an integer lattice.
Definition: IntVectSet.H:44
#define CH_assert(cond)
Definition: CHArray.H:37
~MiniIFFAB()
Definition: MiniIFFABI.H:29
void linearOut(void *buf, const Box &R, const Interval &comps) const
Definition: MiniIFFABI.H:352
void setVal(const T &value)
Definition: MiniIFFABI.H:108
Definition: FaceIndex.H:28
void linearListOut(void *const a_outBuf, const Vector< T > &a_inputT)
Definition: SPMDI.H:258
int size() const
Definition: Interval.H:75
bool m_aliased
Definition: MiniIFFAB.H:225
int begin() const
Definition: Interval.H:99
Iterator over faces within an IntVectSet and an Ebgraph.
Definition: FaceIterator.H:67
EBGraph m_ebgraph
Definition: MiniIFFAB.H:212
Definition: FaceIterator.H:48
void shift(const IntVect &a_iv)
for stencil gymnastics
Definition: FaceIndex.H:158
bool contains(const IntVect &p) const
Definition: Box.H:1887
const IntVect & gridIndex(const Side::LoHiSide &a_sd) const
void clear()
Definition: MiniIFFABI.H:228
MiniIFFAB()
Definition: MiniIFFABI.H:23
const int & direction() const
Definition: LoHiSide.H:31
Geometric description within a box.
Definition: EBGraph.H:427
const int SpaceDim
Definition: SPACE.H:38
void setDefaultValues()
Definition: MiniIFFABI.H:283
void resize(unsigned int isize)
Definition: Vector.H:346
void linearIn(void *buf, const Box &R, const Interval &comps)
Definition: MiniIFFABI.H:384
void push_back(const T &in)
Definition: Vector.H:295
Structure for passing component ranges in code.
Definition: Interval.H:23
static bool s_verbose
Definition: MiniIFFAB.H:209
const Vector< FaceIndex > & getVector() const
T * m_data
Definition: MiniIFFAB.H:220
const IntVect & smallEnd() const
{ Accessors}
Definition: Box.H:1770
void linearOut(void *const a_outBuf, const T &inputT)
Definition: SPMDI.H:33
int m_direction
Definition: MiniIFFAB.H:224
int linearSize(const T &inputT)
Definition: SPMDI.H:21
size_t size() const
Definition: Vector.H:192
Vector< FaceIndex > m_faces
Definition: MiniIFFAB.H:221
T * dataPtr(const int &a_comp)
Definition: MiniIFFABI.H:265
static void Error(const char *const a_msg=m_nullString, int m_exitCode=CH_DEFAULT_ERROR_CODE)
Print out message to cerr and exit with the specified exit code.
void getFaceSubset(Vector< FaceIndex > &a_subFaces, const Box &a_subBox) const
Definition: MiniIFFABI.H:295
T * getIndex(const FaceIndex &a_face, const int &a_comp) const
Definition: MiniIFFABI.H:185
A Rectangular Domain on an Integer Lattice.
Definition: Box.H:469
void copy(const Box &a_intBox, const Interval &a_destInterval, const Box &a_toBox, const MiniIFFAB< T > &a_src, const Interval &a_srcInterval)
Definition: MiniIFFABI.H:135
T & operator()(const FaceIndex &a_face, const int &varlocin)
Definition: MiniIFFABI.H:241
void linearListIn(Vector< T > &a_outputT, const void *const a_inBuf)
Definition: SPMDI.H:229
Definition: MiniIFFAB.H:34
An integer Vector in SpaceDim-dimensional space.
Definition: CHArray.H:42
Definition: LoHiSide.H:30
int linearListSize(const Vector< T > &a_input)
Definition: SPMDI.H:290
bool m_isDefined
Definition: MiniIFFAB.H:226
int end() const
Definition: Interval.H:104
bool isEmpty() const
{ Comparison Functions}
Definition: Box.H:1862
void linearIn(T &a_outputT, const void *const inBuf)
Definition: SPMDI.H:27
const Box & minBox() const
Returns the minimum enclosing box of this IntVectSet.
Box m_box
Definition: MiniIFFAB.H:211
const Box & getRegion() const
Definition: EBGraph.H:829
void define(const IntVectSet &a_ivs, const EBGraph &a_ebgraph, const int &a_direction, const int &a_nvarin)
Definition: MiniIFFABI.H:83