PlasCom2  1.0
XPACC Multi-physics simluation application
IndexUtil.H
Go to the documentation of this file.
1 #ifndef __INDEX_UTIL_H__
2 #define __INDEX_UTIL_H__
3 #include <vector>
4 #include <istream>
5 #include <ostream>
6 #include <cstdlib>
7 
8 namespace ix { namespace util {
9 
10  template<typename DataType>
11  bool IntervalOverlaps(const DataType &i1, const DataType &i2,const DataType &j1, const DataType &j2)
12  {
13  return((i1 <= j2) && (i2 >= j1));
14  }
15 
21  class sizeextent : public std::vector< std::pair<size_t,size_t> >
22  {
23  friend std::ostream &operator<<(std::ostream &outStream,const sizeextent &sizeExtent);
24  friend std::istream &operator>>(std::istream &inStream,sizeextent &sizeExtent);
25  private:
26  size_t _nd;
27  std::vector<size_t> _Np;
28  std::vector<size_t> _N;
29  public:
31  {
32  this->resize(0);
33  _nd = 0;
34  _Np.resize(0);
35  _N.resize(0);
36  }
37 
38  sizeextent(const sizeextent &inExtent)
39  {
40  if(!inExtent.empty())
41  Copy(inExtent);
42  }
43 
44  template<typename IntType>
45  explicit sizeextent(const std::vector<IntType> &inStart,
46  const std::vector<IntType> &inSize)
47  {
48  this->resize(0);
49  _nd = 0;
50  _Np.resize(0);
51  _N.resize(0);
52  int nStart = inStart.size();
53  int nSize = inSize.size();
54  if(nStart != nSize)
55  return;
56  _nd = inStart.size();
57  this->resize(_nd);
58  for(size_t i = 0;i < _nd;i++){
59  (*this)[i].first = inStart[i];
60  (*this)[i].second = inStart[i]+inSize[i]-1;
61  }
62  Sync();
63  };
64 
65  template<typename IntType>
66  explicit sizeextent(const std::vector<std::vector<IntType> > &inextent)
67  {
68  _nd = inextent.size();
69  this->resize(_nd);
70  for(size_t i = 0; i < _nd; i++){
71  typename std::vector<IntType>::const_iterator iei = inextent[i].begin();
72  while(iei != inextent[i].end()){
73  (*this)[i].first = *iei++;
74  (*this)[i].second = *iei++;
75  }
76  }
77  Sync();
78  };
79 
80  template<typename ContainerType>
81  explicit sizeextent(const ContainerType &inflatextent)
82  {
83  _nd = inflatextent.size()/2;
84  this->resize(_nd);
85  typename ContainerType::const_iterator ifIt = inflatextent.begin();
86  for(int i = 0;i < _nd;i++){
87  (*this)[i].first = *ifIt++;
88  (*this)[i].second = *ifIt++;
89  }
90  Sync();
91  };
92 
93  // Constructor for flat extent [1:2*nd]
94  template<typename T>
95  explicit sizeextent(const T *src,int nd=3){
96  _nd = nd;
97  this->resize(_nd);
98  unsigned int nindex = 0;
99  typename sizeextent::iterator bsi = this->begin();
100  while(bsi != this->end()){
101  bsi->first = src[nindex++];
102  bsi->second = src[nindex++];
103  bsi++;
104  }
105  Sync();
106  };
107 
108  // Constructor for simple extent with sizes src [1:nd]
109  template<typename T>
110  explicit sizeextent(int nd,const T *src){
111  _nd = nd;
112  this->resize(_nd);
113  unsigned int nindex = 0;
114  typename sizeextent::iterator bsi = this->begin();
115  while(bsi != this->end()){
116  bsi->first = 0;
117  bsi->second = src[nindex++]-1;
118  bsi++;
119  }
120  Sync();
121  };
122 
123  void destroy()
124 
125  {
126  this->resize(0);
127  _nd = 0;
128  _Np.resize(0);
129  _N.resize(0);
130  };
131 
132  template<typename ContainerType>
133  void Init(const ContainerType &inflatextent){
134  destroy();
135  _nd = inflatextent.size()/2;
136  this->resize(_nd);
137  size_t nd = 0;
138  typename sizeextent::iterator bsi = this->begin();
139  typename ContainerType::const_iterator ifi = inflatextent.begin();
140  while(bsi != this->end()){
141  bsi->first = *ifi++;
142  bsi->second = *ifi++;
143  bsi++;
144  }
145  Sync();
146  };
147 
148  template<typename IntType>
149  void Init(const std::vector<IntType> &inStart,
150  const std::vector<IntType> &inSize)
151  {
152  destroy();
153  _Np.resize(0);
154  _N.resize(0);
155  int nStart = inStart.size();
156  int nSize = inSize.size();
157  if(nStart != nSize)
158  return;
159  _nd = inStart.size();
160  this->resize(_nd);
161  for(size_t i = 0;i < _nd;i++){
162  (*this)[i].first = inStart[i];
163  (*this)[i].second = inStart[i]+inSize[i]-1;
164  }
165  Sync();
166  };
167 
168  template<typename ContainerType>
169  void InitSimple(const ContainerType &inSize){
170  destroy();
171  _nd = inSize.size();
172  this->resize(_nd);
173  typename sizeextent::iterator bsi = this->begin();
174  typename ContainerType::const_iterator ifi = inSize.begin();
175  while(bsi != this->end()){
176  bsi->first = 0;
177  bsi->second = *ifi++-1;
178  bsi++;
179  }
180  Sync();
181  };
182 
183 
184  template<typename T>
185  void InitSimple(int numDim,const T *inSizes){
186  destroy();
187  _nd = numDim;
188  this->resize(_nd);
189  size_t nd = 0;
190  typename sizeextent::iterator bsi = this->begin();
191  while(bsi != this->end()){
192  bsi->first = 0;
193  bsi->second = inSizes[nd++];
194  bsi++;
195  }
196  Sync();
197  };
198 
199  std::vector<size_t> Starts() const
200  {
201  std::vector<size_t> startArray;
202  sizeextent::const_iterator myIt = this->begin();
203  while(myIt != this->end())
204  startArray.push_back(myIt++->first);
205  return(startArray);
206  };
207 
208  std::vector<size_t> Ends() const
209  {
210  std::vector<size_t> startArray;
211  sizeextent::const_iterator myIt = this->begin();
212  while(myIt != this->end())
213  startArray.push_back(myIt++->second);
214  return(startArray);
215  };
216 
217  std::vector<size_t> Sizes() const
218  {
219  std::vector<size_t> startArray;
220  sizeextent::const_iterator myIt = this->begin();
221  while(myIt != this->end()){
222  startArray.push_back(myIt->second - myIt->first + 1);
223  myIt++;
224  }
225  return(startArray);
226  };
227 
228  void Copy(const sizeextent &inExtent)
229  {
230  this->resize(inExtent.size());
231  _nd = inExtent._nd;
232  _Np = inExtent._Np;
233  _N = inExtent._N;
234  sizeextent::iterator myIt = this->begin();
235  sizeextent::const_iterator inIt = inExtent.begin();
236  while(myIt != this->end())
237  *myIt++ = *inIt++;
238  };
239 
240  void Sync()
241  {
242  _nd = this->size();
243  _N.resize(_nd);
244  _Np.resize(_nd);
245  for(size_t i = 0; i < _nd; i++){
246  _N[i] = (*this)[i].second - (*this)[i].first + 1;
247  }
248  _Np[0] = 1;
249  for(size_t i = 1; i < _nd;i++){
250  _Np[i] = _N[i-1] * _Np[i-1];
251  }
252  };
253 
254  size_t NNodes() const {
255  if(this->empty())
256  return(0);
257  size_t nnodes = 1;
258  for(size_t i = 0;i < _nd;i++)
259  nnodes *= ((*this)[i].second - (*this)[i].first+1);
260  return(nnodes);
261  };
262 
263  size_t NNodes(int inDir) const {
264  if(this->empty())
265  return(0);
266  if(inDir > _nd)
267  return(0);
268  return((*this)[inDir].second - (*this)[inDir].first+1);
269  };
270 
271  size_t ND() const {return(this->size());};
272 
273  template<typename ContainerType>
274  void Flatten(ContainerType &output) const
275  {
276  output.resize(0);
277  for(size_t i = 0;i < _nd;i++){
278  output.push_back((*this)[i].first);
279  output.push_back((*this)[i].second);
280  }
281  };
282 
283  template<typename ContainerType>
284  void dir_loop(size_t nd,size_t indoff,std::vector<size_t> &NP,
285  const sizeextent &inExtent, ContainerType &indices) const
286  {
287  size_t dindex = nd - 1;
288  size_t start = inExtent[dindex].first;
289  size_t end = inExtent[dindex].second;
290  if(dindex == 0){
291  for(size_t dd = start;dd <= end;dd++)
292  indices.push_back(dd - (*this)[dindex].first+indoff);
293  } else{
294  for(size_t dd = start;dd <= end;dd++){
295  size_t ndoff = indoff + (dd - (*this)[dindex].first)*NP[dindex];
296  dir_loop(dindex,ndoff,NP,inExtent,indices);
297  }
298  }
299  };
300 
301  template<typename ContainerType>
302  void GetFlatIndices(const sizeextent &extent,ContainerType &indices) const
303  {
304  int nd = ND();
305  indices.resize(0);
306  std::vector<size_t> N(nd);
307  std::vector<size_t> NP(nd);
308  for(int nc = 0;nc < nd;nc++){
309  N[nc] = (*this)[nc].second - (*this)[nc].first + 1;
310  NP[nc] = (nc == 0 ? 1 : N[nc-1] * NP[nc-1]);
311  }
312  NP[0] = 0;
313  dir_loop(nd,0,NP,extent,indices);
314  };
315 
316  template<typename ContainerType>
317  ContainerType FlatIndices(const sizeextent &extent) const
318  {
319  ContainerType indices;
320  GetFlatIndices<ContainerType>(extent,indices);
321  return(indices);
322  };
323 
324  void Overlap(const sizeextent &inextent,sizeextent &outextent) const
325  {
326  size_t nd = ND();
327  outextent.resize(0);
328  if(inextent.empty() || this->empty())
329  return;
330  bool match = true;
331  for(size_t j = 0;j < nd && match;j++){
332  if(!((((*this)[j].first >= inextent[j].first &&
333  (*this)[j].first <= inextent[j].second) ||
334  ((*this)[j].second >= inextent[j].first &&
335  (*this)[j].second <= inextent[j].second)) ||
336  ((inextent[j].first > (*this)[j].first) &&
337  (inextent[j].second < (*this)[j].second))))
338  match = false;
339  }
340  if(match){ // then this extent has some overlap with the searched
341  outextent.resize(nd);
342  for(size_t i = 0;i < nd;i++){
343  outextent[i].first = std::max((*this)[i].first,inextent[i].first);
344  outextent[i].second = std::min((*this)[i].second,inextent[i].second);
345  }
346  outextent.Sync();
347  }
348  };
349 
350 
351  sizeextent Neighboring(const sizeextent &inextent,int nbrDim) const
352  {
353  sizeextent emptyExtent;
354  const sizeextent &self(*this);
355  if(inextent.empty() || self.empty())
356  return(emptyExtent);
357  size_t nd = ND();
358  sizeextent nbrExtent(inextent);
359  bool possible = true;
360  int numNbrDims = 0;
361  for(size_t j = 0;j < nd && possible;j++){
362  if(IntervalOverlaps(self[j].first,self[j].second,nbrExtent[j].first,nbrExtent[j].second)){
363  if(nbrExtent[j].first < self[j].first) nbrExtent[j].first = self[j].first;
364  if(nbrExtent[j].second > self[j].second) nbrExtent[j].second = self[j].second;
365  } else {
366  if((nbrExtent[j].first != (self[j].second + 1)) &&
367  (self[j].first != (nbrExtent[j].second + 1))){
368  possible = false;
369  } else {
370  numNbrDims++;
371  }
372  }
373  }
374  if(possible && (numNbrDims == nbrDim))
375  return(nbrExtent);
376  return(emptyExtent);
377  };
378 
379  sizeextent Overlap(const sizeextent &inextent) const
380  {
381  sizeextent outExtent;
382  if(inextent.empty() || this->empty())
383  return(outExtent);
384  size_t nd = ND();
385  bool match = true;
386  for(size_t j = 0;j < nd && match;j++){
387  if(!((((*this)[j].first >= inextent[j].first &&
388  (*this)[j].first <= inextent[j].second) ||
389  ((*this)[j].second >= inextent[j].first &&
390  (*this)[j].second <= inextent[j].second)) ||
391  ((inextent[j].first > (*this)[j].first) &&
392  (inextent[j].second < (*this)[j].second))))
393  match = false;
394  }
395  if(match){ // then this extent has some overlap with the searched
396  outExtent.resize(nd);
397  for(size_t i = 0;i < nd;i++){
398  outExtent[i].first = std::max((*this)[i].first,inextent[i].first);
399  outExtent[i].second = std::min((*this)[i].second,inextent[i].second);
400  }
401  outExtent.Sync();
402  }
403  return(outExtent);
404  };
405 
406  int Protrude(const sizeextent &inExtent)
407  {
408  if(inExtent.size() != this->size())
409  return(1);
410  sizeextent::const_iterator inExtIt = inExtent.begin();
411  sizeextent::iterator thisIt = this->begin();
412  while(inExtIt != inExtent.end()){
413  if(thisIt++->first < inExtIt++->first)
414  return(1);
415  }
416  inExtIt = inExtent.begin();
417  thisIt = this->begin();
418  while(inExtIt != inExtent.end()){
419  thisIt->first -= inExtIt->first;
420  thisIt->second += inExtIt->second;
421  inExtIt++;
422  thisIt++;
423  }
424  Sync();
425  return(0);
426  };
427 
428  template<typename ContainerType>
429  int ProtrudeLimit(const ContainerType &inOffset,const ContainerType &inLimits)
430  {
431  typename ContainerType::const_iterator inLimIt = inLimits.begin();
432  typename ContainerType::const_iterator inExtIt = inOffset.begin();
433  sizeextent::iterator thisIt = this->begin();
434  while(inExtIt != inOffset.end()){
435  if(*inExtIt > thisIt->first)
436  thisIt->first = 0;
437  else
438  thisIt->first -= *inExtIt;
439  inExtIt++;
440  thisIt->second = thisIt->second + *inExtIt++;
441  if(thisIt->second >= *inLimIt)
442  thisIt->second = *inLimIt-1;
443  inLimIt++;
444  thisIt++;
445  }
446  Sync();
447  return(0);
448  };
449 
450  sizeextent Protruded(const sizeextent &inExtent)
451  {
452  sizeextent returnExtent;
453  if(inExtent.size() != this->size())
454  return(returnExtent);
455  sizeextent::const_iterator inExtIt = inExtent.begin();
456  sizeextent::iterator thisIt = this->begin();
457  while(inExtIt != inExtent.end()){
458  if(thisIt++->first < inExtIt++->first)
459  return(returnExtent);
460  }
461  returnExtent.Copy(*this);
462  inExtIt = inExtent.begin();
463  thisIt = returnExtent.begin();
464  while(inExtIt != inExtent.end()){
465  thisIt->first -= inExtIt->first;
466  thisIt->second += inExtIt->second;
467  inExtIt++;
468  thisIt++;
469  }
470  returnExtent.Sync();
471  return(returnExtent);
472  };
473 
474  template<typename ContainerType>
475  int Protrude(const ContainerType &protrusionOffsets)
476  {
477  if(protrusionOffsets.size() != _nd*2)
478  return(1);
479  typename ContainerType::const_iterator offsetIt = protrusionOffsets.begin();
480  sizeextent::iterator extentIt = this->begin();
481  while(extentIt != this->end()){
482  std::pair<size_t,size_t> &curPair(*extentIt++);
483  if((*offsetIt < 0) && (-*offsetIt > curPair.first))
484  return(1);
485  offsetIt++;
486  if((*offsetIt < 0) && (-*offsetIt > curPair.second))
487  return(1);
488  offsetIt++;
489  }
490  offsetIt = protrusionOffsets.begin();
491  extentIt = this->begin();
492  while(extentIt != this->end()){
493  std::pair<size_t,size_t> &curPair(*extentIt++);
494  curPair.first += *offsetIt++;
495  curPair.second += *offsetIt++;
496  }
497  Sync();
498  return(0);
499  };
500 
501  sizeextent operator-(const sizeextent &inExtent) const
502  {
503  sizeextent returnExtent;
504  if(inExtent.size() != this->size())
505  return(returnExtent);
506  returnExtent.Copy(*this);
507  sizeextent::const_iterator inExtIt = inExtent.begin();
508  sizeextent::iterator myIt = returnExtent.begin();
509  while(myIt != returnExtent.end()){
510  std::pair<size_t,size_t> &curPair(*myIt++);
511  const std::pair<size_t,size_t> &inPair(*inExtIt++);
512  if(curPair.first < inPair.first)
513  return(*this);
514  curPair.first -= inPair.first;
515  curPair.second -= inPair.first;
516  }
517  return(returnExtent);
518  };
519 
520  sizeextent &operator+=(const sizeextent &inExtent)
521  {
522  if(inExtent.size() != this->size())
523  return(*this);
524  sizeextent::const_iterator inExtIt = inExtent.begin();
525  sizeextent::iterator myIt = this->begin();
526  while(myIt != this->end()){
527  std::pair<size_t,size_t> &curPair(*myIt++);
528  const std::pair<size_t,size_t> &inPair(*inExtIt++);
529  curPair.first += inPair.first;
530  curPair.second += inPair.first;
531  }
532  return(*this);
533  };
534 
535  sizeextent RelativeTranslation(const sizeextent &inOrigin,const sizeextent &inDestination) const
536  {
537  sizeextent returnExtent;
538 
539  if(inOrigin.size() != inDestination.size())
540  return(returnExtent);
541  if(inOrigin.size() != this->size())
542  return(returnExtent);
543 
544  returnExtent.Copy(*this);
545 
546  sizeextent::const_iterator originIt = inOrigin.begin();
547  sizeextent::const_iterator destIt = inDestination.begin();
548  sizeextent::iterator returnIt = returnExtent.begin();
549 
550  while(originIt != inOrigin.end()){
551 
552  const std::pair<size_t,size_t> &originPair(*originIt++);
553  const std::pair<size_t,size_t> &destPair(*destIt++);
554  std::pair<size_t,size_t> &returnPair(*returnIt++);
555 
556  returnPair.first -= originPair.first;
557  returnPair.second -= originPair.first;
558  returnPair.first += destPair.first;
559  returnPair.second += destPair.first;
560 
561  }
562 
563  return(returnExtent);
564 
565  };
566 
567  // on success, returnExtent = (*this*[] - inOrigin[].first + inDestination[].first)\
568  // the intent is to resolve an interval within a larger interval - useful in things like
569  // domain decomposition where the partitioned interval is located inside a larger buffer
570  int RelativeTranslation(const sizeextent &inOrigin,const sizeextent &inDestination,sizeextent &returnExtent) const
571  {
572 
573  if(inOrigin.size() != inDestination.size())
574  return(1);
575  if(inOrigin.size() != this->size())
576  return(1);
577 
578  returnExtent.Copy(*this);
579 
580  sizeextent::const_iterator originIt = inOrigin.begin();
581  sizeextent::const_iterator destIt = inDestination.begin();
582  sizeextent::iterator returnIt = returnExtent.begin();
583 
584  while(originIt != inOrigin.end()){
585 
586  const std::pair<size_t,size_t> &originPair(*originIt++);
587  const std::pair<size_t,size_t> &destPair(*destIt++);
588  std::pair<size_t,size_t> &returnPair(*returnIt++);
589 
590  returnPair.first -= originPair.first;
591  returnPair.second -= originPair.first;
592  returnPair.first += destPair.first;
593  returnPair.second += destPair.first;
594 
595  }
596 
597  return(0);
598 
599  };
600 
601  template<typename ContainerType>
602  sizeextent Protruded(const ContainerType &protrusionOffsets)
603  {
604  sizeextent returnExtent;
605  if(protrusionOffsets.size() != _nd*2)
606  return(returnExtent);
607  typename ContainerType::const_iterator offsetIt = protrusionOffsets.begin();
608  sizeextent::iterator extentIt = this->begin();
609  while(extentIt != this->end()){
610  std::pair<size_t,size_t> &curPair(*extentIt++);
611  if((*offsetIt < 0) && (-*offsetIt > curPair.first))
612  return(returnExtent);
613  offsetIt++;
614  if((*offsetIt < 0) && (-*offsetIt > curPair.second))
615  return(returnExtent);
616  offsetIt++;
617  }
618  returnExtent.Copy(*this);
619  offsetIt = protrusionOffsets.begin();
620  extentIt = returnExtent.begin();
621  while(extentIt != returnExtent.end()){
622  std::pair<size_t,size_t> &curPair(*extentIt++);
623  curPair.first += *offsetIt++;
624  curPair.second += *offsetIt++;
625  }
626  returnExtent.Sync();
627  return(returnExtent);
628  };
629 
630 
631  template<typename ContainerType>
632  int Translate(const ContainerType &translationOffsets,bool reverseOffset=false)
633  {
634  if(translationOffsets.size() != _nd)
635  return(1);
636  sizeextent::iterator thisIt = this->begin();
637  typename ContainerType::const_iterator transIt = translationOffsets.begin();
638  while(thisIt != this->end()){
639  std::pair<size_t,size_t> &curPair(*thisIt++);
640  if(*transIt < 0){
641  int transVal = std::abs(*transIt);
642  if(transVal > curPair.first || transVal > curPair.second)
643  return(1);
644  }
645  transIt++;
646  }
647  thisIt = this->begin();
648  transIt = translationOffsets.begin();
649  if(!reverseOffset){
650  while(thisIt != this->end()){
651  std::pair<size_t,size_t> &curPair(*thisIt++);
652  curPair.first += *transIt;
653  curPair.second += *transIt++;
654  }
655  } else {
656  while(thisIt != this->end()){
657  std::pair<size_t,size_t> &curPair(*thisIt++);
658  curPair.first -= *transIt;
659  curPair.second -= *transIt++;
660  }
661  }
662  Sync();
663  return(0);
664  };
665 
666  template<typename ContainerType>
667  void FindSharedNodes(std::vector<sizeextent> &extent_pool,std::vector<sizeextent> &shared_extents,
668  ContainerType &neighbors) const
669  {
670  shared_extents.resize(0);
671  size_t nindex = 0;
672  typename std::vector<sizeextent>::iterator epi = extent_pool.begin();
673  while(epi != extent_pool.end()){
674  if(*epi != *this){
675  sizeextent overlap;
676  this->Overlap(*epi,overlap);
677  if(!overlap.empty()){
678  neighbors.push_back(nindex);
679  shared_extents.push_back(overlap);
680  }
681  }
682  nindex++;
683  epi++;
684  }
685  };
686 
687  // Count number of dimensions with no overlap
688  int Skewness(const sizeextent &inExtent)
689  {
690  if(inExtent._nd != _nd)
691  return(_nd);
692  sizeextent::const_iterator extIt = inExtent.begin();
693  sizeextent::iterator myIt = begin();
694  int skewNum = 0;
695  while(extIt != inExtent.end()){
696  if((extIt->first > myIt->second) ||
697  (extIt->second < myIt->first))
698  skewNum++;
699  extIt++;
700  myIt++;
701  }
702  return(skewNum);
703  };
704 
705  template<typename ContainerType>
706  inline std::vector<size_t> Coordinates(size_t nodeIndex)
707  {
708  std::vector<size_t> retVal(_nd,0);
709  std::vector<size_t>::reverse_iterator rvIt = retVal.rbegin();
710  size_t newIndex = nodeIndex;
711  for(int i = (_nd-1);i >= 0;i--){
712  *rvIt = newIndex/_Np[i];
713  newIndex = nodeIndex - (*rvIt * _Np[i]);
714  rvIt++;
715  }
716  };
717 
718  template<typename ContainerType>
719  inline size_t NodeIndex(ContainerType &index) const
720  {
721  size_t l0 = 0;
722  typename ContainerType::reverse_iterator indIt = index.rbegin();
723  for(int i = (_nd-1);i >= 0;i--)
724  l0 += (*indIt++ - (*this)[i].first)*_Np[i];
725  return(l0);
726  };
727 
728  std::ostream &PrettyPrint(std::ostream &outStream) const;
729  };
730 
731  std::ostream &operator<<(std::ostream &outStream,const ix::util::sizeextent &sizeExtent);
732  std::istream &operator>>(std::istream &inStream,ix::util::sizeextent &sizeExtent);
733 
734  }
735 }
736 #endif
int ProtrudeLimit(const ContainerType &inOffset, const ContainerType &inLimits)
Definition: IndexUtil.H:429
sizeextent(int nd, const T *src)
Definition: IndexUtil.H:110
sizeextent operator-(const sizeextent &inExtent) const
Definition: IndexUtil.H:501
sizeextent(const sizeextent &inExtent)
Definition: IndexUtil.H:38
void GetFlatIndices(const sizeextent &extent, ContainerType &indices) const
Definition: IndexUtil.H:302
void Flatten(ContainerType &output) const
Definition: IndexUtil.H:274
size_t ND() const
Definition: IndexUtil.H:271
int Protrude(const ContainerType &protrusionOffsets)
Definition: IndexUtil.H:475
size_t NNodes(int inDir) const
Definition: IndexUtil.H:263
sizeextent(const std::vector< IntType > &inStart, const std::vector< IntType > &inSize)
Definition: IndexUtil.H:45
Defines MPI-specific parallel global and program classes.
int Skewness(const sizeextent &inExtent)
Definition: IndexUtil.H:688
ContainerType FlatIndices(const sizeextent &extent) const
Definition: IndexUtil.H:317
sizeextent & operator+=(const sizeextent &inExtent)
Definition: IndexUtil.H:520
size_t NNodes() const
Definition: IndexUtil.H:254
bool IntervalOverlaps(const DataType &i1, const DataType &i2, const DataType &j1, const DataType &j2)
Definition: IndexUtil.H:11
std::vector< size_t > Ends() const
Definition: IndexUtil.H:208
sizeextent(const T *src, int nd=3)
Definition: IndexUtil.H:95
std::vector< size_t > Starts() const
Definition: IndexUtil.H:199
int Protrude(const sizeextent &inExtent)
Definition: IndexUtil.H:406
void Copy(const sizeextent &inExtent)
Definition: IndexUtil.H:228
sizeextent RelativeTranslation(const sizeextent &inOrigin, const sizeextent &inDestination) const
Definition: IndexUtil.H:535
void dir_loop(size_t nd, size_t indoff, std::vector< size_t > &NP, const sizeextent &inExtent, ContainerType &indices) const
Definition: IndexUtil.H:284
friend std::ostream & operator<<(std::ostream &outStream, const sizeextent &sizeExtent)
Definition: IndexUtil.C:24
void Overlap(const sizeextent &inextent, sizeextent &outextent) const
Definition: IndexUtil.H:324
int RelativeTranslation(const sizeextent &inOrigin, const sizeextent &inDestination, sizeextent &returnExtent) const
Definition: IndexUtil.H:570
friend std::istream & operator>>(std::istream &inStream, sizeextent &sizeExtent)
Definition: IndexUtil.C:35
void Init(const ContainerType &inflatextent)
Definition: IndexUtil.H:133
sizeextent Overlap(const sizeextent &inextent) const
Definition: IndexUtil.H:379
std::vector< size_t > Coordinates(size_t nodeIndex)
Definition: IndexUtil.H:706
sizeextent(const std::vector< std::vector< IntType > > &inextent)
Definition: IndexUtil.H:66
std::ostream & PrettyPrint(std::ostream &outStream) const
Definition: IndexUtil.C:6
void FindSharedNodes(std::vector< sizeextent > &extent_pool, std::vector< sizeextent > &shared_extents, ContainerType &neighbors) const
Definition: IndexUtil.H:667
std::vector< size_t > _Np
Definition: IndexUtil.H:27
std::vector< size_t > Sizes() const
Definition: IndexUtil.H:217
std::vector< size_t > _N
Definition: IndexUtil.H:28
sizeextent(const ContainerType &inflatextent)
Definition: IndexUtil.H:81
void InitSimple(int numDim, const T *inSizes)
Definition: IndexUtil.H:185
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
size_t NodeIndex(ContainerType &index) const
Definition: IndexUtil.H:719
sizeextent Protruded(const sizeextent &inExtent)
Definition: IndexUtil.H:450
int Translate(const ContainerType &translationOffsets, bool reverseOffset=false)
Definition: IndexUtil.H:632
void Init(const std::vector< IntType > &inStart, const std::vector< IntType > &inSize)
Definition: IndexUtil.H:149
sizeextent Protruded(const ContainerType &protrusionOffsets)
Definition: IndexUtil.H:602
void InitSimple(const ContainerType &inSize)
Definition: IndexUtil.H:169
sizeextent Neighboring(const sizeextent &inextent, int nbrDim) const
Definition: IndexUtil.H:351