PlasCom2  1.0
XPACC Multi-physics simluation application
PCPPIntervalUtils.H
Go to the documentation of this file.
1 #ifndef __PCPP_EXTENT_UTILS__
2 #define __PCPP_EXTENT_UTILS__
3 
4 #include "PCPPTypes.H"
5 
6 namespace pcpp {
7  namespace util {
8 
9  int SubIntervalFromStream(std::istream &inStream,const pcpp::IndexIntervalType &inInterval,
10  pcpp::IndexIntervalType &subInterval);
11 
12  std::deque<size_t> PrimeFactors(size_t inNumber);
13 
15  std::vector<bool> partDirection,int partID,
16  int numPart,pcpp::IndexIntervalType &outInterval,
17  std::vector<int> &numPartitions);
18 
19  int Part1D(const size_t iStart,const size_t iEnd,const size_t numPart,const size_t partIndex,
20  size_t &partStart,size_t &partEnd);
21 
22 
23  // Deprecated
24  int PartitionCartesianExtent(const pcpp::IndexIntervalType &globalExtent,
25  const std::vector<int> &cartDims,
26  const std::vector<int> &cartCoords,
27  pcpp::IndexIntervalType &partExtent,
28  std::ostream &messageStream);
29 
31  const std::vector<int> &cartDims,
32  const std::vector<int> &cartCoords,
33  pcpp::IndexIntervalType &partExtent,
34  std::ostream &messageStream);
35 
36  void CollapseInterval(size_t &xSize,size_t &ySize,size_t &zSize,
37  const pcpp::IndexIntervalType &inInterval,
38  pcpp::IndexIntervalType &outInterval);
39 
40  std::vector<pcpp::IndexIntervalType> UniqueUnion(const std::vector<pcpp::IndexIntervalType> &intervalSet);
41 
52  template<typename BufferDataType>
54  int numComponents,
55  size_t sourceSize,
56  size_t targetSize,
57  const size_t *sourceIndices,
58  const size_t *targetIndices,
59  const BufferDataType *sourceBuffer,
60  BufferDataType *targetBuffer)
61  {
62  for(int iComponent = 0;iComponent < numComponents;iComponent++){
63  size_t sourceComp = iComponent*sourceSize;
64  size_t targComp = iComponent*targetSize;
65  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
66  size_t sourcePoint = sourceComp + sourceIndices[iPoint];
67  size_t targPoint = targComp + targetIndices[iPoint];
68  targetBuffer[targPoint] = sourceBuffer[sourcePoint];
69  }
70  }
71  };
72 
73 
74  template<typename BufferDataType>
75  int CopyInterval(const std::vector<size_t> &sourceSizes,
76  const pcpp::IndexIntervalType &sourceInterval,
77  const BufferDataType *sourceBuffer,
78  const std::vector<size_t> &destSizes,
79  const pcpp::IndexIntervalType &destInterval,
80  BufferDataType *destData)
81  {
82  size_t numSourcePoints = sourceInterval.NNodes();
83  size_t numDestPoints = destInterval.NNodes();
84 
85  if(numSourcePoints != numDestPoints)
86  return(1);
87 
88  pcpp::IndexIntervalType sourceBufferInterval;
89  sourceBufferInterval.InitSimple(sourceSizes);
90 
91  pcpp::IndexIntervalType destBufferInterval;
92  destBufferInterval.InitSimple(destSizes);
93 
94  std::vector<size_t> sourceIndices;
95  std::vector<size_t> destIndices;
96 
97  sourceBufferInterval.GetFlatIndices(sourceInterval,sourceIndices);
98  destBufferInterval.GetFlatIndices(destInterval,destIndices);
99 
100  for(int iPoint = 0;iPoint < numSourcePoints;iPoint++)
101  destBufferInterval[destIndices[iPoint]] =
102  sourceBufferInterval[sourceIndices[iPoint]];
103  }
104 
105  }
106 }
107 #endif
std::vector< pcpp::IndexIntervalType > UniqueUnion(const std::vector< pcpp::IndexIntervalType > &intervalSet)
int SimplePartitionInterval(const pcpp::IndexIntervalType &inInterval, std::vector< bool > partDirection, int partID, int numPart, pcpp::IndexIntervalType &outInterval, std::vector< int > &numPartitions)
Multi-dimensional interval partitioning (non-MPI)
void GetFlatIndices(const sizeextent &extent, ContainerType &indices) const
Definition: IndexUtil.H:302
void const size_t * numPoints
Definition: EulerKernels.H:10
std::deque< size_t > PrimeFactors(size_t inNumber)
size_t NNodes() const
Definition: IndexUtil.H:254
int Part1D(const size_t iStart, const size_t iEnd, const size_t numPart, const size_t partIndex, size_t &partStart, size_t &partEnd)
Extract a sub-interval of a 1-dimensional integer interval.
int SubIntervalFromStream(std::istream &inStream, const pcpp::IndexIntervalType &inInterval, pcpp::IndexIntervalType &subInterval)
int PartitionCartesianExtent(const pcpp::IndexIntervalType &globalExtent, const std::vector< int > &cartDims, const std::vector< int > &cartCoords, pcpp::IndexIntervalType &partExtent, std::ostream &messageStream)
Get local sub-interval of an n-dimensional integer interval.
int PartitionCartesianInterval(const pcpp::IndexIntervalType &globalExtent, const std::vector< int > &cartDims, const std::vector< int > &cartCoords, pcpp::IndexIntervalType &partExtent, std::ostream &messageStream)
Get local sub-interval of an n-dimensional integer interval.
int CopyInterval(const std::vector< size_t > &sourceSizes, const pcpp::IndexIntervalType &sourceInterval, const BufferDataType *sourceBuffer, const std::vector< size_t > &destSizes, const pcpp::IndexIntervalType &destInterval, BufferDataType *destData)
void CollapseInterval(size_t &xSize, size_t &ySize, size_t &zSize, const pcpp::IndexIntervalType &inInterval, pcpp::IndexIntervalType &outInterval)
void TransferBufferData(size_t numPoints, int numComponents, size_t sourceSize, size_t targetSize, const size_t *sourceIndices, const size_t *targetIndices, const BufferDataType *sourceBuffer, BufferDataType *targetBuffer)
Transfer data from a sized source buffer to a (different) sized target buffer.
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
void size_t int * numComponents
void InitSimple(const ContainerType &inSize)
Definition: IndexUtil.H:169